• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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