1 /*
2 * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for
6 * any purpose with or without fee is hereby granted, provided that the
7 * above copyright notice and this permission notice appear in all
8 * copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 */
19
20 /**
21 * DOC: qdf_atomic.h
22 * This file provides OS abstraction for atomic APIs.
23 */
24
25 #ifndef _QDF_ATOMIC_H
26 #define _QDF_ATOMIC_H
27
28 #include <i_qdf_atomic.h>
29
30 /**
31 * typedef qdf_atomic_t - atomic type of variable
32 *
33 * Use this when you want a simple resource counter etc. which is atomic
34 * across multiple CPU's. These maybe slower than usual counters on some
35 * platforms/OS'es, so use them with caution.
36 */
37 typedef __qdf_atomic_t qdf_atomic_t;
38
39 /**
40 * qdf_atomic_init() - initialize an atomic type variable
41 * @v: A pointer to an opaque atomic variable
42 *
43 * Return: None
44 */
qdf_atomic_init(qdf_atomic_t * v)45 static inline QDF_STATUS qdf_atomic_init(qdf_atomic_t *v)
46 {
47 return __qdf_atomic_init(v);
48 }
49
50 /**
51 * qdf_atomic_read() - read the value of an atomic variable
52 * @v: A pointer to an opaque atomic variable
53 *
54 * Return: The current value of the variable
55 */
qdf_atomic_read(qdf_atomic_t * v)56 static inline int32_t qdf_atomic_read(qdf_atomic_t *v)
57 {
58 return __qdf_atomic_read(v);
59 }
60
61 /**
62 * qdf_atomic_inc() - increment the value of an atomic variable
63 * @v: A pointer to an opaque atomic variable
64 *
65 * Return: None
66 */
qdf_atomic_inc(qdf_atomic_t * v)67 static inline void qdf_atomic_inc(qdf_atomic_t *v)
68 {
69 __qdf_atomic_inc(v);
70 }
71
72 /**
73 * qdf_atomic_dec() - decrement the value of an atomic variable
74 * @v: A pointer to an opaque atomic variable
75 *
76 * Return: None
77 */
qdf_atomic_dec(qdf_atomic_t * v)78 static inline void qdf_atomic_dec(qdf_atomic_t *v)
79 {
80 __qdf_atomic_dec(v);
81 }
82
83 /**
84 * qdf_atomic_add() - add a value to the value of an atomic variable
85 * @i: The amount by which to increase the atomic counter
86 * @v: A pointer to an opaque atomic variable
87 *
88 * Return: None
89 */
qdf_atomic_add(int i,qdf_atomic_t * v)90 static inline void qdf_atomic_add(int i, qdf_atomic_t *v)
91 {
92 __qdf_atomic_add(i, v);
93 }
94
95 /**
96 * qdf_atomic_sub() - Subtract a value from an atomic variable
97 * @i: the amount by which to decrease the atomic counter
98 * @v: a pointer to an opaque atomic variable
99 *
100 * Return: none
101 */
qdf_atomic_sub(int i,qdf_atomic_t * v)102 static inline void qdf_atomic_sub(int i, qdf_atomic_t *v)
103 {
104 __qdf_atomic_sub(i, v);
105 }
106
107 /**
108 * qdf_atomic_dec_and_test() - decrement an atomic variable and check if the
109 * new value is zero
110 * @v: A pointer to an opaque atomic variable
111 *
112 * Return:
113 * true (non-zero) if the new value is zero,
114 * false (0) if the new value is non-zero
115 */
qdf_atomic_dec_and_test(qdf_atomic_t * v)116 static inline int32_t qdf_atomic_dec_and_test(qdf_atomic_t *v)
117 {
118 return __qdf_atomic_dec_and_test(v);
119 }
120
121 /**
122 * qdf_atomic_set() - set a value to the value of an atomic variable
123 * @v: A pointer to an opaque atomic variable
124 * @i: required value to set
125 *
126 * Atomically sets the value of v to i
127 * Return: None
128 */
qdf_atomic_set(qdf_atomic_t * v,int i)129 static inline void qdf_atomic_set(qdf_atomic_t *v, int i)
130 {
131 __qdf_atomic_set(v, i);
132 }
133
134 /**
135 * qdf_atomic_inc_return() - return the incremented value of an atomic variable
136 * @v: A pointer to an opaque atomic variable
137 *
138 * Return: The current value of the variable
139 */
qdf_atomic_inc_return(qdf_atomic_t * v)140 static inline int32_t qdf_atomic_inc_return(qdf_atomic_t *v)
141 {
142 return __qdf_atomic_inc_return(v);
143 }
144
145 /**
146 * qdf_atomic_dec_return() - return the decremented value of an atomic
147 * variable
148 * @v: A pointer to an opaque atomic variable
149 *
150 * Return: The current value of the variable
151 */
qdf_atomic_dec_return(qdf_atomic_t * v)152 static inline int32_t qdf_atomic_dec_return(qdf_atomic_t *v)
153 {
154 return __qdf_atomic_dec_return(v);
155 }
156
157 /**
158 * qdf_atomic_dec_if_positive() - Decrement an atomic variable if its
159 * value is positive
160 * @v: A pointer to an opaque atomic variable
161 *
162 * Return: The old value of the variable minus 1
163 */
qdf_atomic_dec_if_positive(qdf_atomic_t * v)164 static inline int32_t qdf_atomic_dec_if_positive(qdf_atomic_t *v)
165 {
166 return __qdf_atomic_dec_if_positive(v);
167 }
168
169 /**
170 * qdf_atomic_inc_not_zero() - increment if not zero
171 * @v: A pointer to an opaque atomic variable
172 *
173 * Return: Returns non-zero on successful increment and zero otherwise
174 */
qdf_atomic_inc_not_zero(qdf_atomic_t * v)175 static inline int32_t qdf_atomic_inc_not_zero(qdf_atomic_t *v)
176 {
177 return __qdf_atomic_inc_not_zero(v);
178 }
179
180 /**
181 * qdf_atomic_set_bit - Atomically set a bit in memory
182 * @nr: bit to set
183 * @addr: the address to start counting from
184 *
185 * Return: none
186 */
qdf_atomic_set_bit(int nr,volatile unsigned long * addr)187 static inline void qdf_atomic_set_bit(int nr, volatile unsigned long *addr)
188 {
189 __qdf_atomic_set_bit(nr, addr);
190 }
191
192 /**
193 * qdf_atomic_clear_bit - Atomically clear a bit in memory
194 * @nr: bit to clear
195 * @addr: the address to start counting from
196 *
197 * Return: none
198 */
qdf_atomic_clear_bit(int nr,volatile unsigned long * addr)199 static inline void qdf_atomic_clear_bit(int nr, volatile unsigned long *addr)
200 {
201 __qdf_atomic_clear_bit(nr, addr);
202 }
203
204 /**
205 * qdf_atomic_change_bit - Atomically toggle a bit in memory
206 * from addr
207 * @nr: bit to change
208 * @addr: the address to start counting from
209 *
210 * Return: none
211 */
qdf_atomic_change_bit(int nr,volatile unsigned long * addr)212 static inline void qdf_atomic_change_bit(int nr, volatile unsigned long *addr)
213 {
214 __qdf_atomic_change_bit(nr, addr);
215 }
216
217 /**
218 * qdf_atomic_test_and_set_bit - Atomically set a bit and return its old value
219 * @nr: Bit to set
220 * @addr: the address to start counting from
221 *
222 * Return: return nr bit old value
223 */
qdf_atomic_test_and_set_bit(int nr,volatile unsigned long * addr)224 static inline int qdf_atomic_test_and_set_bit(int nr,
225 volatile unsigned long *addr)
226 {
227 return __qdf_atomic_test_and_set_bit(nr, addr);
228 }
229
230 /**
231 * qdf_atomic_test_and_clear_bit - Atomically clear a bit and return its old
232 * value
233 * @nr: bit to clear
234 * @addr: the address to start counting from
235 *
236 * Return: return nr bit old value
237 */
qdf_atomic_test_and_clear_bit(int nr,volatile unsigned long * addr)238 static inline int qdf_atomic_test_and_clear_bit(int nr,
239 volatile unsigned long *addr)
240 {
241 return __qdf_atomic_test_and_clear_bit(nr, addr);
242 }
243
244 /**
245 * qdf_atomic_test_and_change_bit - Atomically toggle a bit and return its old
246 * value
247 * @nr: bit to change
248 * @addr: the address to start counting from
249 *
250 * Return: return nr bit old value
251 */
qdf_atomic_test_and_change_bit(int nr,volatile unsigned long * addr)252 static inline int qdf_atomic_test_and_change_bit(int nr,
253 volatile unsigned long *addr)
254 {
255 return __qdf_atomic_test_and_change_bit(nr, addr);
256 }
257
258 /**
259 * qdf_atomic_test_bit - Atomically get the nr-th bit value starting from addr
260 * @nr: bit to get
261 * @addr: the address to start counting from
262 *
263 * Return: return nr bit value
264 */
qdf_atomic_test_bit(int nr,volatile unsigned long * addr)265 static inline int qdf_atomic_test_bit(int nr, volatile unsigned long *addr)
266 {
267 return __qdf_atomic_test_bit(nr, addr);
268 }
269
270 #endif
271