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