1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2021 Marvell.
5 #ifndef __CNXK_TIM_WORKER_H__
6 #define __CNXK_TIM_WORKER_H__
8 #include "cnxk_tim_evdev.h"
11 cnxk_tim_bkt_fetch_lock(uint64_t w1)
13 return (w1 >> TIM_BUCKET_W1_S_LOCK) & TIM_BUCKET_W1_M_LOCK;
17 cnxk_tim_bkt_fetch_rem(uint64_t w1)
19 return (w1 >> TIM_BUCKET_W1_S_CHUNK_REMAINDER) &
20 TIM_BUCKET_W1_M_CHUNK_REMAINDER;
24 cnxk_tim_bkt_get_rem(struct cnxk_tim_bkt *bktp)
26 return __atomic_load_n(&bktp->chunk_remainder, __ATOMIC_ACQUIRE);
30 cnxk_tim_bkt_set_rem(struct cnxk_tim_bkt *bktp, uint16_t v)
32 __atomic_store_n(&bktp->chunk_remainder, v, __ATOMIC_RELAXED);
36 cnxk_tim_bkt_sub_rem(struct cnxk_tim_bkt *bktp, uint16_t v)
38 __atomic_fetch_sub(&bktp->chunk_remainder, v, __ATOMIC_RELAXED);
42 cnxk_tim_bkt_get_hbt(uint64_t w1)
44 return (w1 >> TIM_BUCKET_W1_S_HBT) & TIM_BUCKET_W1_M_HBT;
48 cnxk_tim_bkt_get_bsk(uint64_t w1)
50 return (w1 >> TIM_BUCKET_W1_S_BSK) & TIM_BUCKET_W1_M_BSK;
53 static inline uint64_t
54 cnxk_tim_bkt_clr_bsk(struct cnxk_tim_bkt *bktp)
56 /* Clear everything except lock. */
57 const uint64_t v = TIM_BUCKET_W1_M_LOCK << TIM_BUCKET_W1_S_LOCK;
59 return __atomic_fetch_and(&bktp->w1, v, __ATOMIC_ACQ_REL);
62 static inline uint64_t
63 cnxk_tim_bkt_fetch_sema_lock(struct cnxk_tim_bkt *bktp)
65 return __atomic_fetch_add(&bktp->w1, TIM_BUCKET_SEMA_WLOCK,
69 static inline uint64_t
70 cnxk_tim_bkt_fetch_sema(struct cnxk_tim_bkt *bktp)
72 return __atomic_fetch_add(&bktp->w1, TIM_BUCKET_SEMA, __ATOMIC_RELAXED);
75 static inline uint64_t
76 cnxk_tim_bkt_inc_lock(struct cnxk_tim_bkt *bktp)
78 const uint64_t v = 1ull << TIM_BUCKET_W1_S_LOCK;
80 return __atomic_fetch_add(&bktp->w1, v, __ATOMIC_ACQUIRE);
84 cnxk_tim_bkt_dec_lock(struct cnxk_tim_bkt *bktp)
86 __atomic_fetch_sub(&bktp->lock, 1, __ATOMIC_RELEASE);
90 cnxk_tim_bkt_dec_lock_relaxed(struct cnxk_tim_bkt *bktp)
92 __atomic_fetch_sub(&bktp->lock, 1, __ATOMIC_RELAXED);
95 static inline uint32_t
96 cnxk_tim_bkt_get_nent(uint64_t w1)
98 return (w1 >> TIM_BUCKET_W1_S_NUM_ENTRIES) &
99 TIM_BUCKET_W1_M_NUM_ENTRIES;
103 cnxk_tim_bkt_inc_nent(struct cnxk_tim_bkt *bktp)
105 __atomic_add_fetch(&bktp->nb_entry, 1, __ATOMIC_RELAXED);
109 cnxk_tim_bkt_add_nent(struct cnxk_tim_bkt *bktp, uint32_t v)
111 __atomic_add_fetch(&bktp->nb_entry, v, __ATOMIC_RELAXED);
114 static inline uint64_t
115 cnxk_tim_bkt_clr_nent(struct cnxk_tim_bkt *bktp)
118 ~(TIM_BUCKET_W1_M_NUM_ENTRIES << TIM_BUCKET_W1_S_NUM_ENTRIES);
120 return __atomic_and_fetch(&bktp->w1, v, __ATOMIC_ACQ_REL);
123 #endif /* __CNXK_TIM_WORKER_H__ */