1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * Description: spinlock
15 *
16 * Create: 2021-12-16
17 */
18
19 #include <los_task.h>
20 #include <los_memory.h>
21 #include "los_spinlock.h"
22 #include "soc_osal.h"
23 #include "osal_errno.h"
24 #include "osal_inner.h"
25
osal_spin_lock_init(osal_spinlock * lock)26 int osal_spin_lock_init(osal_spinlock *lock)
27 {
28 SPIN_LOCK_S *p = NULL;
29 SPIN_LOCK_INIT(tmp_lock);
30 if (lock == NULL || lock->lock != NULL) {
31 osal_log("ERROR: parameter invalid, %p!\r\n", __builtin_return_address(0));
32 return OSAL_FAILURE;
33 }
34 p = (SPIN_LOCK_S *)LOS_MemAlloc((void *)m_aucSysMem0, sizeof(SPIN_LOCK_S));
35 if (p == NULL) {
36 osal_log("LOS_MemAlloc failed!\n");
37 return OSAL_FAILURE;
38 }
39
40 errno_t ret = memcpy_s(p, sizeof(SPIN_LOCK_S), &tmp_lock, sizeof(tmp_lock));
41 if (ret != EOK) {
42 LOS_MemFree((void *)m_aucSysMem0, (void *)p);
43 return OSAL_FAILURE;
44 }
45 lock->lock = p;
46 return OSAL_SUCCESS;
47 }
48
osal_spin_lock(osal_spinlock * lock)49 void osal_spin_lock(osal_spinlock *lock)
50 {
51 if (lock == NULL || lock->lock == NULL) {
52 osal_log("parameter invalid!\n");
53 return;
54 }
55
56 SPIN_LOCK_S *p = (SPIN_LOCK_S *)(lock->lock);
57 LOS_SpinLock(p);
58 }
59
osal_spin_trylock(osal_spinlock * lock)60 int osal_spin_trylock(osal_spinlock *lock)
61 {
62 int ret;
63 SPIN_LOCK_S *p = NULL;
64 if (lock == NULL || lock->lock == NULL) {
65 osal_log("parameter invalid!\n");
66 return FALSE;
67 }
68 p = (SPIN_LOCK_S *)(lock->lock);
69
70 ret = LOS_SpinTrylock(p);
71 if (ret != LOS_OK) {
72 return FALSE;
73 }
74 return TRUE;
75 }
76
osal_spin_unlock(osal_spinlock * lock)77 void osal_spin_unlock(osal_spinlock *lock)
78 {
79 if (lock == NULL || lock->lock == NULL) {
80 osal_log("parameter invalid!\n");
81 return;
82 }
83
84 SPIN_LOCK_S *p = (SPIN_LOCK_S *)(lock->lock);
85 LOS_SpinUnlock(p);
86 }
87
osal_spin_lock_bh(osal_spinlock * lock)88 void osal_spin_lock_bh(osal_spinlock *lock)
89 {
90 (void)lock;
91 LOS_TaskLock();
92 }
93
osal_spin_unlock_bh(osal_spinlock * lock)94 void osal_spin_unlock_bh(osal_spinlock *lock)
95 {
96 (void)lock;
97 LOS_TaskUnlock();
98 }
99
osal_spin_lock_irqsave(osal_spinlock * lock,unsigned long * flags)100 void osal_spin_lock_irqsave(osal_spinlock *lock, unsigned long *flags)
101 {
102 if (lock == NULL || lock->lock == NULL || flags == NULL) {
103 osal_log("parameter invalid!\n");
104 return;
105 }
106
107 SPIN_LOCK_S *p = (SPIN_LOCK_S *)(lock->lock);
108 uint32_t f;
109 LOS_SpinLockSave(p, &f);
110
111 *flags = (unsigned long)f;
112 }
113
osal_spin_unlock_irqrestore(osal_spinlock * lock,unsigned long * flags)114 void osal_spin_unlock_irqrestore(osal_spinlock *lock, unsigned long *flags)
115 {
116 if (lock == NULL || lock->lock == NULL || flags == NULL) {
117 osal_log("parameter invalid!\n");
118 return;
119 }
120
121 SPIN_LOCK_S *p = (SPIN_LOCK_S *)NULL;
122
123 p = (SPIN_LOCK_S *)(lock->lock);
124 LOS_SpinUnlockRestore(p, *flags);
125 }
126
osal_spin_lock_destroy(osal_spinlock * lock)127 void osal_spin_lock_destroy(osal_spinlock *lock)
128 {
129 if (lock == NULL || lock->lock == NULL) {
130 osal_log("parameter invalid!\n");
131 return;
132 }
133
134 SPIN_LOCK_S *p = (SPIN_LOCK_S *)(lock->lock);
135 LOS_MemFree((void *)m_aucSysMem0, (void *)p);
136 lock->lock = NULL;
137 }
138