xref: /rockchip-linux_mpp/osal/inc/mpp_lock.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2021 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #ifndef __MPP_LOCK_H__
7*437bfbebSnyanmisaka #define __MPP_LOCK_H__
8*437bfbebSnyanmisaka 
9*437bfbebSnyanmisaka #include <stdbool.h>
10*437bfbebSnyanmisaka 
11*437bfbebSnyanmisaka #include "rk_type.h"
12*437bfbebSnyanmisaka 
13*437bfbebSnyanmisaka #define MPP_FETCH_ADD           __sync_fetch_and_add
14*437bfbebSnyanmisaka #define MPP_FETCH_SUB           __sync_fetch_and_sub
15*437bfbebSnyanmisaka #define MPP_FETCH_OR            __sync_fetch_and_or
16*437bfbebSnyanmisaka #define MPP_FETCH_AND           __sync_fetch_and_and
17*437bfbebSnyanmisaka #define MPP_FETCH_XOR           __sync_fetch_and_xor
18*437bfbebSnyanmisaka #define MPP_FETCH_NAND          __sync_fetch_and_nand
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #define MPP_ADD_FETCH           __sync_add_and_fetch
21*437bfbebSnyanmisaka #define MPP_SUB_FETCH           __sync_sub_and_fetch
22*437bfbebSnyanmisaka #define MPP_OR_FETCH            __sync_or_and_fetch
23*437bfbebSnyanmisaka #define MPP_AND_FETCH           __sync_and_and_fetch
24*437bfbebSnyanmisaka #define MPP_XOR_FETCH           __sync_xor_and_fetch
25*437bfbebSnyanmisaka #define MPP_NAND_FETCH          __sync_nand_and_fetch
26*437bfbebSnyanmisaka 
27*437bfbebSnyanmisaka #define MPP_BOOL_CAS            __sync_bool_compare_and_swap
28*437bfbebSnyanmisaka #define MPP_VAL_CAS             __sync_val_compare_and_swap
29*437bfbebSnyanmisaka 
30*437bfbebSnyanmisaka #define MPP_SYNC                __sync_synchronize
31*437bfbebSnyanmisaka #define MPP_SYNC_TEST_SET       __sync_lock_test_and_set
32*437bfbebSnyanmisaka #define MPP_SYNC_CLR            __sync_lock_release
33*437bfbebSnyanmisaka 
34*437bfbebSnyanmisaka #ifdef __cplusplus
35*437bfbebSnyanmisaka extern "C" {
36*437bfbebSnyanmisaka #endif
37*437bfbebSnyanmisaka 
38*437bfbebSnyanmisaka typedef struct {
39*437bfbebSnyanmisaka     RK_U32  lock;
40*437bfbebSnyanmisaka     RK_U32  debug;
41*437bfbebSnyanmisaka     RK_S64  count;
42*437bfbebSnyanmisaka     RK_S64  time;
43*437bfbebSnyanmisaka } spinlock_t;
44*437bfbebSnyanmisaka 
45*437bfbebSnyanmisaka void mpp_spinlock_init(spinlock_t *lock);
46*437bfbebSnyanmisaka void mpp_spinlock_deinit(spinlock_t *lock, const char *name);
47*437bfbebSnyanmisaka void mpp_spinlock_lock(spinlock_t *lock);
48*437bfbebSnyanmisaka void mpp_spinlock_unlock(spinlock_t *lock);
49*437bfbebSnyanmisaka bool mpp_spinlock_trylock(spinlock_t *lock);
50*437bfbebSnyanmisaka 
51*437bfbebSnyanmisaka #ifdef __cplusplus
52*437bfbebSnyanmisaka }
53*437bfbebSnyanmisaka #endif
54*437bfbebSnyanmisaka 
55*437bfbebSnyanmisaka #endif /*__MPP_LOCK_H__*/
56