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: i_qdf_atomic.h 22 * This file provides OS dependent atomic APIs. 23 */ 24 25 #ifndef I_QDF_ATOMIC_H 26 #define I_QDF_ATOMIC_H 27 28 #include <qdf_status.h> /* QDF_STATUS */ 29 #include <linux/atomic.h> 30 #include <linux/bitops.h> 31 32 typedef atomic_t __qdf_atomic_t; 33 34 /** 35 * __qdf_atomic_init() - initialize an atomic type variable 36 * @v: A pointer to an opaque atomic variable 37 * 38 * Return: QDF_STATUS 39 */ __qdf_atomic_init(__qdf_atomic_t * v)40 static inline QDF_STATUS __qdf_atomic_init(__qdf_atomic_t *v) 41 { 42 atomic_set(v, 0); 43 return QDF_STATUS_SUCCESS; 44 } 45 46 /** 47 * __qdf_atomic_read() - read the value of an atomic variable 48 * @v: A pointer to an opaque atomic variable 49 * 50 * Return: The current value of the variable 51 */ __qdf_atomic_read(__qdf_atomic_t * v)52 static inline int32_t __qdf_atomic_read(__qdf_atomic_t *v) 53 { 54 return atomic_read(v); 55 } 56 57 /** 58 * __qdf_atomic_inc() - increment the value of an atomic variable 59 * @v: A pointer to an opaque atomic variable 60 * 61 * Return: None 62 */ __qdf_atomic_inc(__qdf_atomic_t * v)63 static inline void __qdf_atomic_inc(__qdf_atomic_t *v) 64 { 65 atomic_inc(v); 66 } 67 68 /** 69 * __qdf_atomic_dec() - decrement the value of an atomic variable 70 * @v: A pointer to an opaque atomic variable 71 * 72 * Return: None 73 */ __qdf_atomic_dec(__qdf_atomic_t * v)74 static inline void __qdf_atomic_dec(__qdf_atomic_t *v) 75 { 76 atomic_dec(v); 77 } 78 79 /** 80 * __qdf_atomic_add() - add a value to the value of an atomic variable 81 * @i: The amount by which to increase the atomic counter 82 * @v: A pointer to an opaque atomic variable 83 * 84 * Return: None 85 */ __qdf_atomic_add(int i,__qdf_atomic_t * v)86 static inline void __qdf_atomic_add(int i, __qdf_atomic_t *v) 87 { 88 atomic_add(i, v); 89 } 90 91 /** 92 * __qdf_atomic_sub() - Subtract a value from an atomic variable 93 * @i: the amount by which to decrease the atomic counter 94 * @v: a pointer to an opaque atomic variable 95 * 96 * Return: none 97 */ __qdf_atomic_sub(int i,__qdf_atomic_t * v)98 static inline void __qdf_atomic_sub(int i, __qdf_atomic_t *v) 99 { 100 atomic_sub(i, v); 101 } 102 103 /** 104 * __qdf_atomic_dec_and_test() - decrement an atomic variable and check if the 105 * new value is zero 106 * @v: A pointer to an opaque atomic variable 107 * 108 * Return: 109 * true (non-zero) if the new value is zero, 110 * false (0) if the new value is non-zero 111 */ __qdf_atomic_dec_and_test(__qdf_atomic_t * v)112 static inline int32_t __qdf_atomic_dec_and_test(__qdf_atomic_t *v) 113 { 114 return atomic_dec_and_test(v); 115 } 116 117 /** 118 * __qdf_atomic_set() - set a value to the value of an atomic variable 119 * @v: A pointer to an opaque atomic variable 120 * @i: value to assign 121 * 122 * Return: None 123 */ __qdf_atomic_set(__qdf_atomic_t * v,int i)124 static inline void __qdf_atomic_set(__qdf_atomic_t *v, int i) 125 { 126 atomic_set(v, i); 127 } 128 129 /** 130 * __qdf_atomic_inc_return() - return the incremented value of an atomic variable 131 * @v: A pointer to an opaque atomic variable 132 * 133 * Return: The current value of the variable 134 */ __qdf_atomic_inc_return(__qdf_atomic_t * v)135 static inline int32_t __qdf_atomic_inc_return(__qdf_atomic_t *v) 136 { 137 return atomic_inc_return(v); 138 } 139 140 /** 141 * __qdf_atomic_dec_return() - return the decremented value of an atomic 142 * variable 143 * @v: A pointer to an opaque atomic variable 144 * 145 * Return: The current value of the variable 146 */ __qdf_atomic_dec_return(__qdf_atomic_t * v)147 static inline int32_t __qdf_atomic_dec_return(__qdf_atomic_t *v) 148 { 149 return atomic_dec_return(v); 150 } 151 152 /** 153 * __qdf_atomic_dec_if_positive() - Decrement an atomic variable if its 154 * value is positive 155 * @v: A pointer to an opaque atomic variable 156 * 157 * Return: The old value of the variable minus 1 158 */ __qdf_atomic_dec_if_positive(__qdf_atomic_t * v)159 static inline int32_t __qdf_atomic_dec_if_positive(__qdf_atomic_t *v) 160 { 161 return atomic_dec_if_positive(v); 162 } 163 164 /** 165 * __qdf_atomic_inc_not_zero() - increment if not zero 166 * @v: A pointer to an opaque atomic variable 167 * 168 * Return: Returns non-zero on successful increment and zero otherwise 169 */ __qdf_atomic_inc_not_zero(__qdf_atomic_t * v)170 static inline int32_t __qdf_atomic_inc_not_zero(__qdf_atomic_t *v) 171 { 172 return atomic_inc_not_zero(v); 173 } 174 175 /** 176 * __qdf_atomic_set_bit - Atomically set a bit in memory 177 * @nr: bit to set 178 * @addr: the address to start counting from 179 * 180 * Return: none 181 */ __qdf_atomic_set_bit(int nr,volatile unsigned long * addr)182 static inline void __qdf_atomic_set_bit(int nr, volatile unsigned long *addr) 183 { 184 set_bit(nr, addr); 185 } 186 187 /** 188 * __qdf_atomic_clear_bit - Atomically clear a bit in memory 189 * @nr: bit to clear 190 * @addr: the address to start counting from 191 * 192 * Return: none 193 */ __qdf_atomic_clear_bit(int nr,volatile unsigned long * addr)194 static inline void __qdf_atomic_clear_bit(int nr, volatile unsigned long *addr) 195 { 196 clear_bit(nr, addr); 197 } 198 199 /** 200 * __qdf_atomic_change_bit - Atomically toggle a bit in memory 201 * from addr 202 * @nr: bit to change 203 * @addr: the address to start counting from 204 * 205 * Return: none 206 */ __qdf_atomic_change_bit(int nr,volatile unsigned long * addr)207 static inline void __qdf_atomic_change_bit(int nr, volatile unsigned long *addr) 208 { 209 change_bit(nr, addr); 210 } 211 212 /** 213 * __qdf_atomic_test_and_set_bit - Atomically set a bit and return its old value 214 * @nr: Bit to set 215 * @addr: the address to start counting from 216 * 217 * Return: return nr bit old value 218 */ __qdf_atomic_test_and_set_bit(int nr,volatile unsigned long * addr)219 static inline int __qdf_atomic_test_and_set_bit(int nr, 220 volatile unsigned long *addr) 221 { 222 return test_and_set_bit(nr, addr); 223 } 224 225 /** 226 * __qdf_atomic_test_and_clear_bit - Atomically clear a bit and return its old 227 * value 228 * @nr: bit to clear 229 * @addr: the address to start counting from 230 * 231 * Return: return nr bit old value 232 */ __qdf_atomic_test_and_clear_bit(int nr,volatile unsigned long * addr)233 static inline int __qdf_atomic_test_and_clear_bit(int nr, 234 volatile unsigned long *addr) 235 { 236 return test_and_clear_bit(nr, addr); 237 } 238 239 /** 240 * __qdf_atomic_test_and_change_bit - Atomically toggle a bit and return its old 241 * value 242 * @nr: bit to change 243 * @addr: the address to start counting from 244 * 245 * Return: return nr bit old value 246 */ __qdf_atomic_test_and_change_bit(int nr,volatile unsigned long * addr)247 static inline int __qdf_atomic_test_and_change_bit(int nr, 248 volatile unsigned long *addr) 249 { 250 return test_and_change_bit(nr, addr); 251 } 252 253 /** 254 * __qdf_atomic_test_bit - Atomically get the nr-th bit value starting from addr 255 * @nr: bit to get 256 * @addr: the address to start counting from 257 * 258 * Return: return nr bit value 259 */ __qdf_atomic_test_bit(int nr,volatile unsigned long * addr)260 static inline int __qdf_atomic_test_bit(int nr, volatile unsigned long *addr) 261 { 262 return test_bit(nr, addr); 263 } 264 265 #endif 266