1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2019 Marvell International Ltd.
5 #ifndef __OTX2_TIM_WORKER_H__
6 #define __OTX2_TIM_WORKER_H__
8 #include "otx2_tim_evdev.h"
11 tim_bkt_fetch_rem(uint64_t w1)
13 return (w1 >> TIM_BUCKET_W1_S_CHUNK_REMAINDER) &
14 TIM_BUCKET_W1_M_CHUNK_REMAINDER;
18 tim_bkt_get_rem(struct otx2_tim_bkt *bktp)
20 return __atomic_load_n(&bktp->chunk_remainder, __ATOMIC_ACQUIRE);
24 tim_bkt_set_rem(struct otx2_tim_bkt *bktp, uint16_t v)
26 __atomic_store_n(&bktp->chunk_remainder, v, __ATOMIC_RELAXED);
30 tim_bkt_sub_rem(struct otx2_tim_bkt *bktp, uint16_t v)
32 __atomic_fetch_sub(&bktp->chunk_remainder, v, __ATOMIC_RELAXED);
36 tim_bkt_get_hbt(uint64_t w1)
38 return (w1 >> TIM_BUCKET_W1_S_HBT) & TIM_BUCKET_W1_M_HBT;
42 tim_bkt_get_bsk(uint64_t w1)
44 return (w1 >> TIM_BUCKET_W1_S_BSK) & TIM_BUCKET_W1_M_BSK;
47 static inline uint64_t
48 tim_bkt_clr_bsk(struct otx2_tim_bkt *bktp)
50 /* Clear everything except lock. */
51 const uint64_t v = TIM_BUCKET_W1_M_LOCK << TIM_BUCKET_W1_S_LOCK;
53 return __atomic_fetch_and(&bktp->w1, v, __ATOMIC_ACQ_REL);
56 static inline uint64_t
57 tim_bkt_fetch_sema_lock(struct otx2_tim_bkt *bktp)
59 return __atomic_fetch_add(&bktp->w1, TIM_BUCKET_SEMA_WLOCK,
63 static inline uint64_t
64 tim_bkt_fetch_sema(struct otx2_tim_bkt *bktp)
66 return __atomic_fetch_add(&bktp->w1, TIM_BUCKET_SEMA, __ATOMIC_RELAXED);
69 static inline uint64_t
70 tim_bkt_inc_lock(struct otx2_tim_bkt *bktp)
72 const uint64_t v = 1ull << TIM_BUCKET_W1_S_LOCK;
74 return __atomic_fetch_add(&bktp->w1, v, __ATOMIC_ACQUIRE);
78 tim_bkt_dec_lock(struct otx2_tim_bkt *bktp)
80 __atomic_add_fetch(&bktp->lock, 0xff, __ATOMIC_RELEASE);
83 static inline uint32_t
84 tim_bkt_get_nent(uint64_t w1)
86 return (w1 >> TIM_BUCKET_W1_S_NUM_ENTRIES) &
87 TIM_BUCKET_W1_M_NUM_ENTRIES;
91 tim_bkt_inc_nent(struct otx2_tim_bkt *bktp)
93 __atomic_add_fetch(&bktp->nb_entry, 1, __ATOMIC_RELAXED);
97 tim_bkt_add_nent(struct otx2_tim_bkt *bktp, uint32_t v)
99 __atomic_add_fetch(&bktp->nb_entry, v, __ATOMIC_RELAXED);
102 static inline uint64_t
103 tim_bkt_clr_nent(struct otx2_tim_bkt *bktp)
105 const uint64_t v = ~(TIM_BUCKET_W1_M_NUM_ENTRIES <<
106 TIM_BUCKET_W1_S_NUM_ENTRIES);
108 return __atomic_and_fetch(&bktp->w1, v, __ATOMIC_ACQ_REL);
111 #endif /* __OTX2_TIM_WORKER_H__ */