blob: d5db32256123acbd983e02ab9a937de322cf5862 [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
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
104extern "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 */
111void kal_atomic_set_int(kal_atomic_int32 *var, int value);
112int kal_atomic_read_int(kal_atomic_int32 *var);
113void kal_atomic_update(kal_atomic_int32 *var, kal_int32 add_value,
114 kal_int32 and_mask);
115int kal_atomic_update_return(kal_atomic_int32 *var, kal_int32 add_value,
116 kal_int32 and_mask);
117void kal_atomic_toggle_bitmask_int(kal_atomic_int32 *var, kal_uint32 mask);
118int kal_atomic_toggle_bitmask_return_int(kal_atomic_int32 *var, kal_uint32 mask);
119int kal_atomic_swap_int(kal_atomic_int32 *var, kal_int32 new_value);
120int kal_atomic_cas(kal_atomic_int32 *var, kal_int32 compare_value,
121 kal_int32 new_value);
122int kal_atomic_ici(kal_atomic_int32 *idx_var, kal_int32 buff_size);
123int kal_atomic_dci(kal_atomic_int32 *idx_var, kal_int32 buff_size);
124int kal_atomic_sig(kal_atomic_int32 *var, kal_int32 compare_value);
125int 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 */