rjw | 6c1fd8f | 2022-11-30 14:33:01 +0800 | [diff] [blame^] | 1 | /***************************************************************************** |
| 2 | * Copyright Statement: |
| 3 | * -------------------- |
| 4 | * This software is protected by Copyright and the information contained |
| 5 | * herein is confidential. The software may not be copied and the information |
| 6 | * contained herein may not be used or disclosed except with the written |
| 7 | * permission of MediaTek Inc. (C) 2005 |
| 8 | * |
| 9 | * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES |
| 10 | * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") |
| 11 | * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON |
| 12 | * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, |
| 13 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF |
| 14 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. |
| 15 | * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE |
| 16 | * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR |
| 17 | * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH |
| 18 | * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO |
| 19 | * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S |
| 20 | * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. |
| 21 | * |
| 22 | * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE |
| 23 | * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, |
| 24 | * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, |
| 25 | * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO |
| 26 | * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. |
| 27 | * |
| 28 | * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE |
| 29 | * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF |
| 30 | * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND |
| 31 | * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER |
| 32 | * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). |
| 33 | * |
| 34 | *****************************************************************************/ |
| 35 | |
| 36 | /***************************************************************************** |
| 37 | * |
| 38 | * Filename: |
| 39 | * --------- |
| 40 | * kal_atomic_api.h |
| 41 | * |
| 42 | * Project: |
| 43 | * -------- |
| 44 | * Maui_Software |
| 45 | * |
| 46 | * Description: |
| 47 | * ------------ |
| 48 | * This file provides KAL public API prototypes |
| 49 | * |
| 50 | * Author: |
| 51 | * ------- |
| 52 | * ------- |
| 53 | * |
| 54 | *============================================================================ |
| 55 | * HISTORY |
| 56 | * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! |
| 57 | *------------------------------------------------------------------------------ |
| 58 | * removed! |
| 59 | * removed! |
| 60 | * removed! |
| 61 | * |
| 62 | * removed! |
| 63 | * removed! |
| 64 | * removed! |
| 65 | * |
| 66 | * removed! |
| 67 | * removed! |
| 68 | * removed! |
| 69 | * |
| 70 | * removed! |
| 71 | * removed! |
| 72 | * removed! |
| 73 | * removed! |
| 74 | * |
| 75 | * |
| 76 | ****************************************************************************/ |
| 77 | |
| 78 | #ifndef _KAL_ATOMIC_API_H |
| 79 | #define _KAL_ATOMIC_API_H |
| 80 | |
| 81 | |
| 82 | /*************************************************************************** |
| 83 | * |
| 84 | * |
| 85 | * NOTE! |
| 86 | * Must use cacheable variables for atomic operations. |
| 87 | * |
| 88 | * |
| 89 | **************************************************************************/ |
| 90 | |
| 91 | |
| 92 | /******************************************************************************* |
| 93 | * Common Header File Include |
| 94 | *******************************************************************************/ |
| 95 | #ifndef GEN_FOR_PC |
| 96 | #include <stdio.h> |
| 97 | #include <string.h> |
| 98 | #endif |
| 99 | |
| 100 | #include "kal_general_types.h" |
| 101 | #include "kal_public_defs.h" |
| 102 | |
| 103 | #ifdef __cplusplus |
| 104 | extern "C" { |
| 105 | #endif |
| 106 | |
| 107 | /* DOM-NOT_FOR_SDK-BEGIN */ |
| 108 | |
| 109 | /* These are atomic primitives that are used to implemented atomic macro api below. |
| 110 | These are not intended for normal use */ |
| 111 | void kal_atomic_set_int(kal_atomic_int32 *var, int value); |
| 112 | int kal_atomic_read_int(kal_atomic_int32 *var); |
| 113 | void kal_atomic_update(kal_atomic_int32 *var, kal_int32 add_value, |
| 114 | kal_int32 and_mask); |
| 115 | int kal_atomic_update_return(kal_atomic_int32 *var, kal_int32 add_value, |
| 116 | kal_int32 and_mask); |
| 117 | void kal_atomic_toggle_bitmask_int(kal_atomic_int32 *var, kal_uint32 mask); |
| 118 | int kal_atomic_toggle_bitmask_return_int(kal_atomic_int32 *var, kal_uint32 mask); |
| 119 | int kal_atomic_swap_int(kal_atomic_int32 *var, kal_int32 new_value); |
| 120 | int kal_atomic_cas(kal_atomic_int32 *var, kal_int32 compare_value, |
| 121 | kal_int32 new_value); |
| 122 | int kal_atomic_ici(kal_atomic_int32 *idx_var, kal_int32 buff_size); |
| 123 | int kal_atomic_dci(kal_atomic_int32 *idx_var, kal_int32 buff_size); |
| 124 | int kal_atomic_sig(kal_atomic_int32 *var, kal_int32 compare_value); |
| 125 | int kal_atomic_sil(kal_atomic_int32 *var, kal_int32 compare_value); |
| 126 | |
| 127 | |
| 128 | /******************************************************************************* |
| 129 | * <GROUP Synchronous> |
| 130 | * |
| 131 | * FUNCTION |
| 132 | * kal_atomic_init |
| 133 | * DESCRIPTION |
| 134 | * Set value to variable. Meant to be used only during init. |
| 135 | * PARAMETERS |
| 136 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 137 | * value : [IN] value to be set |
| 138 | * RETURNS |
| 139 | * - |
| 140 | * NOTE |
| 141 | * This function will not perform a memory barrier. |
| 142 | ******************************************************************************/ |
| 143 | #define kal_atomic_init(var_ptr, value) \ |
| 144 | do { \ |
| 145 | *(var_ptr) = (value); \ |
| 146 | } while (0) |
| 147 | /******************************************************************************* |
| 148 | * <GROUP Synchronous> |
| 149 | * |
| 150 | * FUNCTION |
| 151 | * kal_atomic_set |
| 152 | * DESCRIPTION |
| 153 | * Set value to a variable atomically. |
| 154 | * PARAMETERS |
| 155 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 156 | * value : [IN] value to be set |
| 157 | * RETURNS |
| 158 | * - |
| 159 | * NOTE |
| 160 | * This function will perform a memory barrier after setting the value. |
| 161 | ******************************************************************************/ |
| 162 | #define kal_atomic_set(var_ptr, value) \ |
| 163 | kal_atomic_set_int((kal_atomic_int32 *)(var_ptr), (value)) |
| 164 | /******************************************************************************* |
| 165 | * <GROUP Synchronous> |
| 166 | * |
| 167 | * FUNCTION |
| 168 | * kal_atomic_read |
| 169 | * DESCRIPTION |
| 170 | * Read variable value atomically. |
| 171 | * PARAMETERS |
| 172 | * var_ptr : [IN] pointer to source (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 173 | * RETURNS |
| 174 | * Success: [OUT] value at var_ptr |
| 175 | * NOTE |
| 176 | * This function will perform a memory barrier before read. |
| 177 | ******************************************************************************/ |
| 178 | #define kal_atomic_read(var_ptr) kal_atomic_read_int((kal_atomic_int32 *)(var_ptr)) |
| 179 | /******************************************************************************* |
| 180 | * <GROUP Synchronous> |
| 181 | * |
| 182 | * FUNCTION |
| 183 | * kal_atomic_add |
| 184 | * DESCRIPTION |
| 185 | * Add value to a variable atomically. |
| 186 | * PARAMETERS |
| 187 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 188 | * value : [IN] value to be added |
| 189 | * RETURNS |
| 190 | * - |
| 191 | * NOTE |
| 192 | * This function will not perform a memory barrier. |
| 193 | ******************************************************************************/ |
| 194 | #define kal_atomic_add(var_ptr, value) \ |
| 195 | kal_atomic_update((kal_atomic_int32 *)(var_ptr), (value), ~0) |
| 196 | /******************************************************************************* |
| 197 | * <GROUP Synchronous> |
| 198 | * |
| 199 | * FUNCTION |
| 200 | * kal_atomic_add_return |
| 201 | * DESCRIPTION |
| 202 | * Add value to a variable atomically. Return the new value. |
| 203 | * PARAMETERS |
| 204 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 205 | * value : [IN] value to be added |
| 206 | * RETURNS |
| 207 | * Success: [OUT] new value at var_ptr |
| 208 | * NOTE |
| 209 | * This function will perform a memory barrier before and after the add operation. |
| 210 | ******************************************************************************/ |
| 211 | #define kal_atomic_add_return(var_ptr, value) \ |
| 212 | (kal_atomic_update_return((kal_atomic_int32 *)(var_ptr), (value), ~0) + (value)) |
| 213 | /******************************************************************************* |
| 214 | * <GROUP Synchronous> |
| 215 | * |
| 216 | * FUNCTION |
| 217 | * kal_atomic_sub |
| 218 | * DESCRIPTION |
| 219 | * Subtract value from a variable atomically. |
| 220 | * PARAMETERS |
| 221 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 222 | * value : [IN] value to be subtracted |
| 223 | * RETURNS |
| 224 | * - |
| 225 | * NOTE |
| 226 | * This function will not perform a memory barrier. |
| 227 | ******************************************************************************/ |
| 228 | #define kal_atomic_sub(var_ptr, value) \ |
| 229 | kal_atomic_update((kal_atomic_int32 *)(var_ptr), -(value), ~0) |
| 230 | /******************************************************************************* |
| 231 | * <GROUP Synchronous> |
| 232 | * |
| 233 | * FUNCTION |
| 234 | * kal_atomic_sub_return |
| 235 | * DESCRIPTION |
| 236 | * Subtract value from a variable atomically. |
| 237 | * PARAMETERS |
| 238 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 239 | * value : [IN] value to be subtracted |
| 240 | * RETURNS |
| 241 | * Success: [OUT] new value at var_ptr |
| 242 | * NOTE |
| 243 | * This function will perform a memory barrier before and after the substract operation. |
| 244 | ******************************************************************************/ |
| 245 | #define kal_atomic_sub_return(var_ptr, value) \ |
| 246 | (kal_atomic_update_return((kal_atomic_int32 *)(var_ptr), -(value), ~0) - (value)) |
| 247 | /******************************************************************************* |
| 248 | * <GROUP Synchronous> |
| 249 | * |
| 250 | * FUNCTION |
| 251 | * kal_atomic_inc |
| 252 | * DESCRIPTION |
| 253 | * Increment variable atomically. |
| 254 | * PARAMETERS |
| 255 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 256 | * RETURNS |
| 257 | * - |
| 258 | * NOTE |
| 259 | * This function will not perform a memory barrier. |
| 260 | ******************************************************************************/ |
| 261 | #define kal_atomic_inc(var_ptr) kal_atomic_add((var_ptr), 1) |
| 262 | /******************************************************************************* |
| 263 | * <GROUP Synchronous> |
| 264 | * |
| 265 | * FUNCTION |
| 266 | * kal_atomic_inc_return |
| 267 | * DESCRIPTION |
| 268 | * Increment value atomically. Return the new value. |
| 269 | * PARAMETERS |
| 270 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 271 | * RETURNS |
| 272 | * Success: [OUT] new value at var_ptr |
| 273 | * NOTE |
| 274 | * This function will perform a memory barrier before and after the increment operation. |
| 275 | ******************************************************************************/ |
| 276 | #define kal_atomic_inc_return(var_ptr) kal_atomic_add_return((var_ptr), 1) |
| 277 | /******************************************************************************* |
| 278 | * <GROUP Synchronous> |
| 279 | * |
| 280 | * FUNCTION |
| 281 | * kal_atomic_dec |
| 282 | * DESCRIPTION |
| 283 | * Decrement variable atomically. |
| 284 | * PARAMETERS |
| 285 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 286 | * RETURNS |
| 287 | * - |
| 288 | * NOTE |
| 289 | * This function will not perform a memory barrier. |
| 290 | ******************************************************************************/ |
| 291 | #define kal_atomic_dec(var_ptr) kal_atomic_sub((var_ptr), 1) |
| 292 | /******************************************************************************* |
| 293 | * <GROUP Synchronous> |
| 294 | * |
| 295 | * FUNCTION |
| 296 | * kal_atomic_dec_return |
| 297 | * DESCRIPTION |
| 298 | * Decrement value atomically. Return the new value. |
| 299 | * PARAMETERS |
| 300 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 301 | * RETURNS |
| 302 | * Success: [OUT] new value at var_ptr |
| 303 | * NOTE |
| 304 | * This function will perform a memory barrier before and after the decrement operation. |
| 305 | ******************************************************************************/ |
| 306 | #define kal_atomic_dec_return(var_ptr) kal_atomic_sub_return((var_ptr), 1) |
| 307 | /******************************************************************************* |
| 308 | * <GROUP Synchronous> |
| 309 | * |
| 310 | * FUNCTION |
| 311 | * kal_atomic_add_compare |
| 312 | * DESCRIPTION |
| 313 | * Add value to a variable atomically and compare if result is equal to new_value. |
| 314 | * PARAMETERS |
| 315 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 316 | * value : [IN] value to be added |
| 317 | * new_value : [IN] value to be compared with |
| 318 | * RETURNS |
| 319 | * Success: [OUT] KAL_TRUE if new value at var_ptr is equal to new_value, otherwise KAL_FALSE |
| 320 | * NOTE |
| 321 | * This function will perform a memory barrier before and after the add operation. |
| 322 | ******************************************************************************/ |
| 323 | #define kal_atomic_add_compare(var_ptr, value, new_value) \ |
| 324 | (kal_atomic_add_return((var_ptr), (value)) == (new_value)) |
| 325 | /******************************************************************************* |
| 326 | * <GROUP Synchronous> |
| 327 | * |
| 328 | * FUNCTION |
| 329 | * kal_atomic_inc_compare |
| 330 | * DESCRIPTION |
| 331 | * Increment variable value atomically and compare if result is equal to new_value. |
| 332 | * PARAMETERS |
| 333 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 334 | * new_value : [IN] value to be compared with |
| 335 | * RETURNS |
| 336 | * Success: [OUT] KAL_TRUE if new value at var_ptr is equal to new_value, otherwise KAL_FALSE |
| 337 | * NOTE |
| 338 | * This function will perform a memory barrier before and after the increment operation. |
| 339 | ******************************************************************************/ |
| 340 | #define kal_atomic_inc_compare(var_ptr, new_value) \ |
| 341 | (kal_atomic_add_return((var_ptr), 1) == (new_value)) |
| 342 | /******************************************************************************* |
| 343 | * <GROUP Synchronous> |
| 344 | * |
| 345 | * FUNCTION |
| 346 | * kal_atomic_sub_compare |
| 347 | * DESCRIPTION |
| 348 | * Subtract value from a variable atomically and compare if result is equal to new_value. |
| 349 | * PARAMETERS |
| 350 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 351 | * value : [IN] value to be subtracted |
| 352 | * new_value : [IN] value to be compared with |
| 353 | * RETURNS |
| 354 | * Success: [OUT] KAL_TRUE if new value at var_ptr is equal to new_value, otherwise KAL_FALSE |
| 355 | * NOTE |
| 356 | * This function will perform a memory barrier before and after the substract operation. |
| 357 | ******************************************************************************/ |
| 358 | #define kal_atomic_sub_compare(var_ptr, value, new_value) \ |
| 359 | (kal_atomic_sub_return((var_ptr), (value)) == (new_value)) |
| 360 | /******************************************************************************* |
| 361 | * <GROUP Synchronous> |
| 362 | * |
| 363 | * FUNCTION |
| 364 | * kal_atomic_dec_compare |
| 365 | * DESCRIPTION |
| 366 | * Decrement value from a variable atomically and compare if result is equal to new_value. |
| 367 | * PARAMETERS |
| 368 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 369 | * new_value : [IN] value to be compared with |
| 370 | * RETURNS |
| 371 | * Success: [OUT] KAL_TRUE if new value at var_ptr is equal to new_value, otherwise KAL_FALSE |
| 372 | * NOTE |
| 373 | * This function will perform a memory barrier before and after the decrement operation. |
| 374 | ******************************************************************************/ |
| 375 | #define kal_atomic_dec_compare(var_ptr, new_value) \ |
| 376 | (kal_atomic_sub_return((var_ptr), 1) == (new_value)) |
| 377 | /******************************************************************************* |
| 378 | * <GROUP Synchronous> |
| 379 | * |
| 380 | * FUNCTION |
| 381 | * kal_atomic_set_bitmask |
| 382 | * DESCRIPTION |
| 383 | * Set a mask of bits in a variable atomically. |
| 384 | * PARAMETERS |
| 385 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 386 | * mask : [IN] bit mask to be set |
| 387 | * RETURNS |
| 388 | * - |
| 389 | * NOTE |
| 390 | * This function will not perform a memory barrier. |
| 391 | ******************************************************************************/ |
| 392 | #define kal_atomic_set_bitmask(var_ptr, mask) \ |
| 393 | kal_atomic_update((kal_atomic_int32 *)(var_ptr), (mask), ~(mask)) |
| 394 | /******************************************************************************* |
| 395 | * <GROUP Synchronous> |
| 396 | * |
| 397 | * FUNCTION |
| 398 | * kal_atomic_set_bitmask_return |
| 399 | * DESCRIPTION |
| 400 | * Set a mask of bits in a variable atomically and return the old variable value. |
| 401 | * PARAMETERS |
| 402 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 403 | * mask : [IN] bit mask to be set |
| 404 | * RETURNS |
| 405 | * Success: [OUT] old value at var_ptr |
| 406 | * NOTE |
| 407 | * This function will perform a memory barrier before and after the bit mask set. |
| 408 | ******************************************************************************/ |
| 409 | #define kal_atomic_set_bitmask_return(var_ptr, mask) \ |
| 410 | kal_atomic_update_return((kal_atomic_int32 *)(var_ptr), (mask), ~(mask)) |
| 411 | /******************************************************************************* |
| 412 | * <GROUP Synchronous> |
| 413 | * |
| 414 | * FUNCTION |
| 415 | * kal_atomic_set_bit |
| 416 | * DESCRIPTION |
| 417 | * Set a bit in a variable atomically. |
| 418 | * PARAMETERS |
| 419 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 420 | * bit_nbr : [IN] bit number to be set |
| 421 | * RETURNS |
| 422 | * - |
| 423 | * NOTE |
| 424 | * This function will not perform a memory barrier. |
| 425 | ******************************************************************************/ |
| 426 | #define kal_atomic_set_bit(var_ptr, bit_nbr) \ |
| 427 | kal_atomic_set_bitmask((var_ptr), (1 << (bit_nbr))) |
| 428 | /******************************************************************************* |
| 429 | * <GROUP Synchronous> |
| 430 | * |
| 431 | * FUNCTION |
| 432 | * kal_atomic_set_bit_return |
| 433 | * DESCRIPTION |
| 434 | * Set bit in a variable atomically and return the old value of bit |
| 435 | * PARAMETERS |
| 436 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 437 | * bit_nbr : [IN] bit number to be set |
| 438 | * RETURNS |
| 439 | * Success: [OUT] old value of bit |
| 440 | * NOTE |
| 441 | * This function will perform a memory barrier before and after the bit set operation. |
| 442 | ******************************************************************************/ |
| 443 | #define kal_atomic_set_bit_return(var_ptr, bit_nbr) \ |
| 444 | ((kal_atomic_set_bitmask_return((var_ptr), (1 << (bit_nbr))) & \ |
| 445 | (1 << (bit_nbr))) != 0) |
| 446 | /******************************************************************************* |
| 447 | * <GROUP Synchronous> |
| 448 | * |
| 449 | * FUNCTION |
| 450 | * kal_atomic_clear_bitmask |
| 451 | * DESCRIPTION |
| 452 | * Clear mask of bits in a variable atomically. |
| 453 | * PARAMETERS |
| 454 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 455 | * mask : [IN] bit mask to be cleared |
| 456 | * RETURNS |
| 457 | * - |
| 458 | * NOTE |
| 459 | * This function will not perform a memory barrier. |
| 460 | ******************************************************************************/ |
| 461 | #define kal_atomic_clear_bitmask(var_ptr, mask) \ |
| 462 | kal_atomic_update((kal_atomic_int32 *)(var_ptr), 0, ~(mask)) |
| 463 | /******************************************************************************* |
| 464 | * <GROUP Synchronous> |
| 465 | * |
| 466 | * FUNCTION |
| 467 | * kal_atomic_clear_bitmask_return |
| 468 | * DESCRIPTION |
| 469 | * Clear mask of bits in a variable atomically and return the old variable value. |
| 470 | * PARAMETERS |
| 471 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 472 | * mask : [IN] bit mask to be cleared |
| 473 | * RETURNS |
| 474 | * Success: [OUT] old value at var_ptr |
| 475 | * NOTE |
| 476 | * This function will perform a memory barrier before and after the bit mask clear operation. |
| 477 | ******************************************************************************/ |
| 478 | #define kal_atomic_clear_bitmask_return(var_ptr, mask) \ |
| 479 | kal_atomic_update_return((kal_atomic_int32 *)(var_ptr), 0, ~(mask)) |
| 480 | /******************************************************************************* |
| 481 | * <GROUP Synchronous> |
| 482 | * |
| 483 | * FUNCTION |
| 484 | * kal_atomic_clear_bit |
| 485 | * DESCRIPTION |
| 486 | * Clear a bit in a variable atomically. |
| 487 | * PARAMETERS |
| 488 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 489 | * bit_nbr : [IN] bit number to be cleared |
| 490 | * RETURNS |
| 491 | * - |
| 492 | * NOTE |
| 493 | * This function will not perform a memory barrier. |
| 494 | ******************************************************************************/ |
| 495 | #define kal_atomic_clear_bit(var_ptr, bit_nbr) \ |
| 496 | kal_atomic_clear_bitmask((var_ptr), (1 << (bit_nbr))) |
| 497 | /******************************************************************************* |
| 498 | * <GROUP Synchronous> |
| 499 | * |
| 500 | * FUNCTION |
| 501 | * kal_atomic_clear_bit_return |
| 502 | * DESCRIPTION |
| 503 | * Clear a bit in a variable atomically and return the old value of bit |
| 504 | * PARAMETERS |
| 505 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 506 | * mask : [IN] bit number to be cleared |
| 507 | * RETURNS |
| 508 | * Success: [OUT] old value of bit |
| 509 | * NOTE |
| 510 | * This function will perform a memory barrier before and after the bit clear operation. |
| 511 | ******************************************************************************/ |
| 512 | #define kal_atomic_clear_bit_return(var_ptr, bit_nbr) \ |
| 513 | ((kal_atomic_clear_bitmask_return((var_ptr), (1 << (bit_nbr))) & \ |
| 514 | (1 << (bit_nbr))) != 0) |
| 515 | /******************************************************************************* |
| 516 | * <GROUP Synchronous> |
| 517 | * |
| 518 | * FUNCTION |
| 519 | * kal_atomic_toggle_bitmask |
| 520 | * DESCRIPTION |
| 521 | * Toggle mask of bits in a variable atomically. |
| 522 | * PARAMETERS |
| 523 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 524 | * mask : [IN] bit mask to be toggled |
| 525 | * RETURNS |
| 526 | * - |
| 527 | * NOTE |
| 528 | * This function will not perform a memory barrier. |
| 529 | ******************************************************************************/ |
| 530 | #define kal_atomic_toggle_bitmask(var_ptr, mask) \ |
| 531 | kal_atomic_toggle_bitmask_int((kal_atomic_int32 *)(var_ptr), (mask)) |
| 532 | /******************************************************************************* |
| 533 | * <GROUP Synchronous> |
| 534 | * |
| 535 | * FUNCTION |
| 536 | * kal_atomic_toggle_bitmask_return |
| 537 | * DESCRIPTION |
| 538 | * Toggle mask of bits in a variable atomically and return the old value of bit |
| 539 | * PARAMETERS |
| 540 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 541 | * mask : [IN] bit mask to be toggled |
| 542 | * RETURNS |
| 543 | * Success: [OUT] old value of bit |
| 544 | * NOTE |
| 545 | * This function will perform a memory barrier before and after the bit mask toggle operation. |
| 546 | ******************************************************************************/ |
| 547 | #define kal_atomic_toggle_bitmask_return(var_ptr, bitmask) \ |
| 548 | kal_atomic_toggle_bitmask_return_int((kal_atomic_int32 *)(var_ptr), (bitmask)) |
| 549 | /******************************************************************************* |
| 550 | * <GROUP Synchronous> |
| 551 | * |
| 552 | * FUNCTION |
| 553 | * kal_atomic_toggle_bit |
| 554 | * DESCRIPTION |
| 555 | * Toggle bit in a variable atomically. |
| 556 | * PARAMETERS |
| 557 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 558 | * mask : [IN] bit number to be toggled |
| 559 | * RETURNS |
| 560 | * - |
| 561 | * NOTE |
| 562 | * This function will not perform a memory barrier. |
| 563 | ******************************************************************************/ |
| 564 | #define kal_atomic_toggle_bit(var_ptr, bit_nbr) \ |
| 565 | kal_atomic_toggle_bitmask((var_ptr), (1 << (bit_nbr))) |
| 566 | /******************************************************************************* |
| 567 | * <GROUP Synchronous> |
| 568 | * |
| 569 | * FUNCTION |
| 570 | * kal_atomic_toggle_bit_return |
| 571 | * DESCRIPTION |
| 572 | * Toggle bit in a variable atomically and return the old value of bit |
| 573 | * PARAMETERS |
| 574 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 575 | * mask : [IN] bit number to be toggled |
| 576 | * RETURNS |
| 577 | * Success: [OUT] old value of bit |
| 578 | * NOTE |
| 579 | * This function will perform a memory barrier before and after the bit toggle operation. |
| 580 | ******************************************************************************/ |
| 581 | #define kal_atomic_toggle_bit_return(var_ptr, bit_nbr) \ |
| 582 | ((kal_atomic_toggle_bitmask_return((var_ptr), (1 << (bit_nbr))) & \ |
| 583 | (1 << (bit_nbr))) != 0) |
| 584 | /******************************************************************************* |
| 585 | * <GROUP Synchronous> |
| 586 | * |
| 587 | * FUNCTION |
| 588 | * kal_atomic_clear_set_bitmask |
| 589 | * DESCRIPTION |
| 590 | * Clear a bit mask and then set another bit mask in a variable atomically. |
| 591 | * PARAMETERS |
| 592 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 593 | * clear_mask : [IN] bit mask to be cleared |
| 594 | * set_mask : [IN] bit mask to be set |
| 595 | * RETURNS |
| 596 | * - |
| 597 | * NOTE |
| 598 | * This function will not perform a memory barrier. |
| 599 | ******************************************************************************/ |
| 600 | #define kal_atomic_clear_set_bitmask(var_ptr, clear_mask, set_mask) \ |
| 601 | kal_atomic_update((kal_atomic_int32 *)(var_ptr), (set_mask), \ |
| 602 | ~((clear_mask) | (set_mask))) |
| 603 | /******************************************************************************* |
| 604 | * <GROUP Synchronous> |
| 605 | * |
| 606 | * FUNCTION |
| 607 | * kal_atomic_clear_set_bitmask_return |
| 608 | * DESCRIPTION |
| 609 | * Clear a bit mask and then set another bit mask in a variable atomically. |
| 610 | * Return the old variable value. |
| 611 | * PARAMETERS |
| 612 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 613 | * clear_mask : [IN] bit mask to be cleared |
| 614 | * set_mask : [IN] bit mask to be set |
| 615 | * RETURNS |
| 616 | * Success: [OUT] old value at var_ptr |
| 617 | * NOTE |
| 618 | * This function will perform a memory barrier before and after the bitmask set and clear operation. |
| 619 | ******************************************************************************/ |
| 620 | #define kal_atomic_clear_set_bitmask_return(var_ptr, clear_mask, set_mask) \ |
| 621 | kal_atomic_update_return((kal_atomic_int32 *)(var_ptr), (set_mask), \ |
| 622 | ~((clear_mask) | (set_mask))) |
| 623 | /******************************************************************************* |
| 624 | * <GROUP Synchronous> |
| 625 | * |
| 626 | * FUNCTION |
| 627 | * kal_atomic_clear_set_bit |
| 628 | * DESCRIPTION |
| 629 | * Clear a bit and then set another bit in a variable atomically. |
| 630 | * PARAMETERS |
| 631 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 632 | * clear_bit_nbr : [IN] bit number to be cleared |
| 633 | * set_bit_nbr : [IN] bit number to be set |
| 634 | * RETURNS |
| 635 | * - |
| 636 | * NOTE |
| 637 | * This function will not perform a memory barrier. |
| 638 | ******************************************************************************/ |
| 639 | #define kal_atomic_clear_set_bit(var_ptr, clear_bit_nbr, set_bit_nbr) \ |
| 640 | kal_atomic_clear_set_bitmask((var_ptr), (1 << (clear_bit_nbr)), \ |
| 641 | (1 << (set_bit_nbr))) |
| 642 | /******************************************************************************* |
| 643 | * <GROUP Synchronous> |
| 644 | * |
| 645 | * FUNCTION |
| 646 | * kal_atomic_and_bitmask |
| 647 | * DESCRIPTION |
| 648 | * Apply a bitwise AND operation with a given bit mask to a variable atomically. |
| 649 | * PARAMETERS |
| 650 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 651 | * mask : [IN] bit mask to be ANDed |
| 652 | * RETURNS |
| 653 | * - |
| 654 | * NOTE |
| 655 | * This function will not perform a memory barrier. |
| 656 | ******************************************************************************/ |
| 657 | #define kal_atomic_and_bitmask(var_ptr, mask) \ |
| 658 | kal_atomic_update((kal_atomic_int32 *)(var_ptr), 0, (mask)) |
| 659 | /******************************************************************************* |
| 660 | * <GROUP Synchronous> |
| 661 | * |
| 662 | * FUNCTION |
| 663 | * kal_atomic_and_bitmask_return |
| 664 | * DESCRIPTION |
| 665 | * Apply a bitwise AND operation with a given bit mask to a variable atomically. |
| 666 | * Return the old variable value. |
| 667 | * PARAMETERS |
| 668 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 669 | * mask : [IN] bit mask to be ANDed |
| 670 | * RETURNS |
| 671 | * Success: [OUT] old value at var_ptr |
| 672 | * NOTE |
| 673 | * This function will perform a memory barrier before and after the AND operation. |
| 674 | ******************************************************************************/ |
| 675 | #define kal_atomic_and_bitmask_return(var_ptr, mask) \ |
| 676 | kal_atomic_update_return((kal_atomic_int32 *)(var_ptr), 0, (mask)) |
| 677 | /******************************************************************************* |
| 678 | * <GROUP Synchronous> |
| 679 | * |
| 680 | * FUNCTION |
| 681 | * kal_atomic_swap_return |
| 682 | * DESCRIPTION |
| 683 | * Swap a new value atomically with the value in given variable. Return the old variable value. |
| 684 | * PARAMETERS |
| 685 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 686 | * new_value : [IN] new value to be swapped |
| 687 | * RETURNS |
| 688 | * Success: [OUT] old value at var_ptr |
| 689 | * NOTE |
| 690 | * This function will perform a memory barrier before and after the swap operation. |
| 691 | ******************************************************************************/ |
| 692 | #define kal_atomic_swap_return(var_ptr, new_value) \ |
| 693 | kal_atomic_swap_int((kal_atomic_int32 *)(var_ptr), (new_value)) |
| 694 | /******************************************************************************* |
| 695 | * <GROUP Synchronous> |
| 696 | * |
| 697 | * FUNCTION |
| 698 | * kal_atomic_compare_and_swap_return |
| 699 | * DESCRIPTION |
| 700 | * Swap a new value atomically with the value in given variable, if the current variable value |
| 701 | * is equal to compare_value. Return the old variable value. |
| 702 | * PARAMETERS |
| 703 | * var_ptr : [IN] pointer to destination (kal_atomic_int32 or kal_atomic_uint32 variable) |
| 704 | * value : [IN] value to be compared with |
| 705 | * new_value : [IN] value to be swapped |
| 706 | * RETURNS |
| 707 | * Success: [OUT] old value at var_ptr |
| 708 | * NOTE |
| 709 | * This function will perform a memory barrier before and after the compare and swap operation. |
| 710 | ******************************************************************************/ |
| 711 | #define kal_atomic_compare_and_swap_return(var_ptr, value, new_value) \ |
| 712 | kal_atomic_cas((kal_atomic_int32 *)(var_ptr), (value), (new_value)) |
| 713 | /******************************************************************************* |
| 714 | * <GROUP Synchronous> |
| 715 | * |
| 716 | * FUNCTION |
| 717 | * kal_atomic_inc_circular_index |
| 718 | * DESCRIPTION |
| 719 | * Increments index value by one and wraps to 0 if index reaches buffer size. |
| 720 | * Return current value of index |
| 721 | * PARAMETERS |
| 722 | * idx_ptr : [IN] pointer to index variable |
| 723 | * buf_size : [IN] size of buffer (wraparound point) |
| 724 | * RETURNS |
| 725 | * Success: [OUT] current value of index (before inc) |
| 726 | * NOTE |
| 727 | * Does not have memory barrier |
| 728 | ******************************************************************************/ |
| 729 | #define kal_atomic_inc_circular_index(idx_ptr, buff_size) \ |
| 730 | kal_atomic_ici((kal_atomic_int32 *)(idx_ptr), (buff_size)) |
| 731 | /******************************************************************************* |
| 732 | * <GROUP Synchronous> |
| 733 | * |
| 734 | * FUNCTION |
| 735 | * kal_atomic_dec_circular_index |
| 736 | * DESCRIPTION |
| 737 | * Decrements index value by one and wraps to max vaule (buffer size - 1) if index reaches -1. |
| 738 | * Return current value of index |
| 739 | * PARAMETERS |
| 740 | * idx_ptr : [IN] pointer to index variable |
| 741 | * buf_size : [IN] size of buffer (wraparound point) |
| 742 | * RETURNS |
| 743 | * Success: [OUT] current value of index (before inc) |
| 744 | * NOTE |
| 745 | * Does not have memory barrier |
| 746 | ******************************************************************************/ |
| 747 | #define kal_atomic_dec_circular_index(idx_ptr, buff_size) \ |
| 748 | kal_atomic_dci((kal_atomic_int32 *)(idx_ptr), (buff_size)) |
| 749 | /******************************************************************************* |
| 750 | * <GROUP Synchronous> |
| 751 | * |
| 752 | * FUNCTION |
| 753 | * kal_atomic_set_if_greater |
| 754 | * DESCRIPTION |
| 755 | * Set new value atomically in to variable if new value is greater than old value. |
| 756 | * Return value set to variable |
| 757 | * PARAMETERS |
| 758 | * var_ptr : [IN] pointer to destination(kal_atomic_int32 or kal_atomic_uint32 variable) |
| 759 | * value : [IN] value to be compared |
| 760 | * RETURNS |
| 761 | * Success: [OUT] final value of variable |
| 762 | * NOTE |
| 763 | * Does not have memory barrier |
| 764 | ******************************************************************************/ |
| 765 | #define kal_atomic_set_if_greater(var_ptr, value) \ |
| 766 | kal_atomic_sig((kal_atomic_int32 *)(var_ptr), (value)) |
| 767 | /******************************************************************************* |
| 768 | * <GROUP Synchronous> |
| 769 | * |
| 770 | * FUNCTION |
| 771 | * kal_atomic_set_if_less |
| 772 | * DESCRIPTION |
| 773 | * Set new value atomically in to variable if new value is less than old value. |
| 774 | * Return value set to variable |
| 775 | * PARAMETERS |
| 776 | * var_ptr : [IN] pointer to destination(kal_atomic_int32 or kal_atomic_uint32 variable) |
| 777 | * value : [IN] value to be compared |
| 778 | * RETURNS |
| 779 | * Success: [OUT] final value of variable |
| 780 | * NOTE |
| 781 | * Does not have memory barrier |
| 782 | ******************************************************************************/ |
| 783 | #define kal_atomic_set_if_less(var_ptr, value) \ |
| 784 | kal_atomic_sil((kal_atomic_int32 *)(var_ptr), (value)) |
| 785 | |
| 786 | /* DOM-NOT_FOR_SDK-BEGIN */ |
| 787 | |
| 788 | #ifdef __cplusplus |
| 789 | } |
| 790 | #endif |
| 791 | |
| 792 | #endif /* _KAL_ATOMIC_API_H */ |