xref: /rockchip-linux_mpp/osal/mpp_lock.c (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 #define MODULE_TAG "mpp_lock"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include "mpp_env.h"
9*437bfbebSnyanmisaka #include "mpp_log.h"
10*437bfbebSnyanmisaka #include "mpp_lock.h"
11*437bfbebSnyanmisaka #include "mpp_time.h"
12*437bfbebSnyanmisaka 
13*437bfbebSnyanmisaka #define LOCK_IDLE   0
14*437bfbebSnyanmisaka #define LOCK_BUSY   1
15*437bfbebSnyanmisaka 
mpp_spinlock_init(spinlock_t * lock)16*437bfbebSnyanmisaka void mpp_spinlock_init(spinlock_t *lock)
17*437bfbebSnyanmisaka {
18*437bfbebSnyanmisaka     MPP_SYNC_CLR(&lock->lock);
19*437bfbebSnyanmisaka     lock->count = 0;
20*437bfbebSnyanmisaka     lock->time = 0;
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka     mpp_env_get_u32("mpp_lock_debug", &lock->debug, 0);
23*437bfbebSnyanmisaka }
24*437bfbebSnyanmisaka 
mpp_spinlock_lock(spinlock_t * lock)25*437bfbebSnyanmisaka void mpp_spinlock_lock(spinlock_t *lock)
26*437bfbebSnyanmisaka {
27*437bfbebSnyanmisaka     RK_S64 time = 0;
28*437bfbebSnyanmisaka 
29*437bfbebSnyanmisaka     if (lock->debug)
30*437bfbebSnyanmisaka         time = mpp_time();
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka     while (!MPP_BOOL_CAS(&lock->lock, LOCK_IDLE, LOCK_BUSY)) {
33*437bfbebSnyanmisaka         asm("NOP");
34*437bfbebSnyanmisaka         asm("NOP");
35*437bfbebSnyanmisaka     }
36*437bfbebSnyanmisaka 
37*437bfbebSnyanmisaka     if (lock->debug && time) {
38*437bfbebSnyanmisaka         lock->time += mpp_time() - time;
39*437bfbebSnyanmisaka         lock->count++;
40*437bfbebSnyanmisaka     }
41*437bfbebSnyanmisaka }
42*437bfbebSnyanmisaka 
mpp_spinlock_deinit(spinlock_t * lock,const char * name)43*437bfbebSnyanmisaka void mpp_spinlock_deinit(spinlock_t *lock, const char *name)
44*437bfbebSnyanmisaka {
45*437bfbebSnyanmisaka     if (lock->debug && lock->count) {
46*437bfbebSnyanmisaka         mpp_log("lock %s lock %lld times take time %lld avg %d", name,
47*437bfbebSnyanmisaka                 lock->count, lock->time, (RK_S32)(lock->time / lock->count));
48*437bfbebSnyanmisaka     }
49*437bfbebSnyanmisaka }
50*437bfbebSnyanmisaka 
mpp_spinlock_unlock(spinlock_t * lock)51*437bfbebSnyanmisaka void mpp_spinlock_unlock(spinlock_t *lock)
52*437bfbebSnyanmisaka {
53*437bfbebSnyanmisaka     MPP_SYNC_CLR(&lock->lock);
54*437bfbebSnyanmisaka }
55*437bfbebSnyanmisaka 
mpp_spinlock_trylock(spinlock_t * lock)56*437bfbebSnyanmisaka bool mpp_spinlock_trylock(spinlock_t *lock)
57*437bfbebSnyanmisaka {
58*437bfbebSnyanmisaka     RK_S64 time = 0;
59*437bfbebSnyanmisaka     bool ret;
60*437bfbebSnyanmisaka 
61*437bfbebSnyanmisaka     if (lock->debug)
62*437bfbebSnyanmisaka         time = mpp_time();
63*437bfbebSnyanmisaka 
64*437bfbebSnyanmisaka     ret = MPP_BOOL_CAS(&lock->lock, LOCK_IDLE, LOCK_BUSY);
65*437bfbebSnyanmisaka 
66*437bfbebSnyanmisaka     if (ret && lock->debug && time) {
67*437bfbebSnyanmisaka         lock->time += mpp_time() - time;
68*437bfbebSnyanmisaka         lock->count++;
69*437bfbebSnyanmisaka     }
70*437bfbebSnyanmisaka 
71*437bfbebSnyanmisaka     return ret;
72*437bfbebSnyanmisaka }
73