WS63 SDK 文档 7021f4f@fbb_ws63
ws63 和 ws63e 解决方案的 SDK 文档
载入中...
搜索中...
未找到
oal_schedule.h
浏览该文件的文档.
1/*
2 * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2022. All rights reserved.
3 * Create: 2022-4-27
4 */
5
6#ifndef OAL_LINUX_SCHEDULE_H
7#define OAL_LINUX_SCHEDULE_H
8
9#include <asm/atomic.h>
10#include <asm/param.h>
11#include <linux/version.h>
12#include <linux/interrupt.h>
13#include <linux/wait.h>
14#include <linux/proc_fs.h>
15#include <linux/sched.h>
16#include <linux/module.h>
17#include <linux/ktime.h>
18#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0))
19#include <linux/stacktrace.h>
20#endif
21#include "linux/time.h"
22#include "linux/timex.h"
23#include "linux/rtc.h"
24
25#include "oal_time.h"
26#include "oal_spinlock.h"
27#include "oal_schedule_hcm.h"
28
29#ifdef __cplusplus
30#if __cplusplus
31extern "C" {
32#endif
33#endif
34
35typedef struct _oal_wakelock_stru_ {
36#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37))
37 struct wakeup_source wakelock; /* wakelock锁 */
38 osal_spinlock lock; /* wakelock锁操作spinlock锁 */
40#endif
41
42 osal_ulong lock_count; /* 持有wakelock锁的次数 */
43 osal_ulong locked_addr; /* the locked address */
44 osal_u32 debug; /* debug flag */
46
47typedef atomic_t oal_atomic;
48
49
50/* 函数指针,用来指向需要自旋锁保护的的函数 */
52
53typedef rwlock_t oal_rwlock_stru;
54typedef struct timer_list oal_timer_list_stru;
55
56
57typedef struct tasklet_struct oal_tasklet_stru;
59
60/* tasklet声明 */
61#define OAL_DECLARE_TASK DECLARE_TASKLET
62
80#define OAL_WAIT_EVENT_INTERRUPTIBLE_TIMEOUT(_st_wq, _condition, _timeout) \
81 wait_event_interruptible_timeout(_st_wq, _condition, _timeout)
82
83#define OAL_INIT_COMPLETION(_my_completion) init_completion(_my_completion)
84
85#define OAL_COMPLETE(_my_completion) complete(_my_completion)
86
87#define oal_in_interrupt() in_interrupt()
88
90
91#define oal_module_license(_license_name) MODULE_LICENSE(_license_name)
92
93#define OAL_S_IRUGO S_IRUGO
94
95#define oal_module_init(_module_name) module_init(_module_name)
96#define oal_module_exit(_module_name) module_exit(_module_name)
97#define oal_module_symbol(_symbol) EXPORT_SYMBOL(_symbol)
98
99#define oal_smp_call_function_single(core, task, info, wait) smp_call_function_single(core, task, info, wait)
100#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 44))
101#define OAL_IS_ERR_OR_NULL(ptr) (!(ptr) || IS_ERR(ptr))
102#else
103static inline bool __must_check OAL_IS_ERR_OR_NULL(__force const void *ptr)
104{
105 return !ptr || IS_ERR(ptr);
106}
107#endif
108
109
110typedef struct proc_dir_entry oal_proc_dir_entry_stru;
111
112typedef struct mutex oal_mutex_stru;
113
114typedef struct completion oal_completion;
115
116/*****************************************************************************
117 功能描述 : 读写锁初始化,把读写锁设置为1(未锁状态)。
118 输入参数 : lock: 读写锁结构体地址
119*****************************************************************************/
121{
122 rwlock_init(lock);
123}
124
125/*****************************************************************************
126 功能描述 : 获得指定的读锁
127 输入参数 : lock: 读写锁结构体地址
128*****************************************************************************/
133
134/*****************************************************************************
135 功能描述 : 释放指定的读锁
136 输入参数 : lock: 读写锁结构体地址
137*****************************************************************************/
142
143/*****************************************************************************
144 功能描述 : 获得指定的写锁
145 输入参数 : lock: 读写锁结构体地址
146*****************************************************************************/
151
152/*****************************************************************************
153 功能描述 : 释放指定的写锁
154 输入参数 : lock: 读写锁结构体地址
155*****************************************************************************/
160
161
162/*****************************************************************************
163 功能描述 : 任务初始化。初始化完成后,任务处于挂起状态。
164 输入参数 : task: 任务结构体指针
165 func: 任务处理函数入口地址
166 p_args: 需进行处理的函数的入参地址
167*****************************************************************************/
169{
170 tasklet_init(task, p_func, args);
171}
172
173/*****************************************************************************
174 功能描述 : 退出task运行
175 输入参数 : task: 任务结构体指针
176*****************************************************************************/
178{
179 return tasklet_kill(task);
180}
181
182/*****************************************************************************
183 功能描述 : 任务调度,令任务处于准备就绪状态;当任务执行完后,又回到挂起状
184 态。
185 输入参数 : task: 任务结构体指针
186*****************************************************************************/
188{
189 tasklet_schedule(task);
190}
191
192/*****************************************************************************
193 功能描述 : 检测tasklet是否等待执行
194 输入参数 : task: 任务结构体指针
195*****************************************************************************/
197{
198 return test_bit(TASKLET_STATE_SCHED, (unsigned long const volatile *)&task->state);
199}
200
201/*****************************************************************************
202 功能描述 : 创建proc_entry结构体
203 输入参数 : pc_name: 创建的proc_entry的名字
204 mode: 创建模式
205 parent: 母proc_entry结构体,继承属性
206*****************************************************************************/
209{
210#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,9,11))
211 return NULL;
212#else
213 return create_proc_entry(pc_name, mode, parent);
214#endif
215}
216
217/*****************************************************************************
218 功能描述 : 创建proc_entry结构体
219 输入参数 : pc_name: 创建的proc_entry的名字
220 parent: 母proc_entry结构体,继承属性
221*****************************************************************************/
223{
224 return remove_proc_entry(pc_name, parent);
225}
226
227
228/*****************************************************************************
229 功能描述 : 同步:等待超时检查
230*****************************************************************************/
232{
233 return (osal_u32)wait_for_completion_timeout(completion, timeout);
234}
235
236/*****************************************************************************
237 功能描述 : 同步:等待超时检查
238*****************************************************************************/
240 osal_ulong timeout)
241{
242 return (osal_slong)wait_for_completion_interruptible_timeout(completion, timeout);
243}
244
245#if defined(_PRE_OS_VERSION_LINUX) && defined(_PRE_OS_VERSION) && (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
246osal_s32 oal_print_all_wakelock_buff(char* buf, osal_s32 buf_len);
247osal_s32 oal_set_wakelock_debuglevel(char* name, osal_u32 level);
248#endif
249
251{
252#if defined(LINUX_VERSION_CODE) && defined(KERNEL_VERSION)
253#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0))
254 memset_s((osal_void*)wakelock, sizeof(oal_wakelock_stru), 0, sizeof(oal_wakelock_stru));
255
256 wakeup_source_init(&wakelock->wakelock, name ? name : "wake_lock_null");
257 osal_spin_lock_init(&wakelock->lock);
258 wakelock->lock_count = 0;
259 wakelock->locked_addr = 0;
260 /* add to local list */
261 osal_list_add_tail(&wakelock->list, oal_get_wakelock_head());
262#endif
263#endif
264}
265
267{
268#if defined(LINUX_VERSION_CODE) && defined(KERNEL_VERSION)
269#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0))
270 osal_list_del(&wakelock->list);
271 osal_spin_lock_destroy(&wakelock->lock);
272 wakeup_source_trash(&wakelock->wakelock);
273#endif
274#endif
275}
276
278{
279#if defined(LINUX_VERSION_CODE) && defined(KERNEL_VERSION)
280#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0))
281 osal_ulong flags;
282
283 osal_spin_lock_irqsave(&wakelock->lock, &flags);
284 if (!wakelock->lock_count) {
285 __pm_stay_awake(&wakelock->wakelock);
286 wakelock->locked_addr = (osal_ulong)_RET_IP_;
287 }
288 wakelock->lock_count++;
289 if (OAL_UNLIKELY(wakelock->debug)) {
290 printk(KERN_DEBUG"wakelock[%s] lockcnt:%lu <==%pf\n", wakelock->wakelock.name, wakelock->lock_count,
291 (osal_void *)_RET_IP_);
292 }
293 osal_spin_unlock_irqrestore(&wakelock->lock, &flags);
294#endif
295#endif
296}
297
299{
300#if defined(LINUX_VERSION_CODE) && defined(KERNEL_VERSION)
301#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0))
302 osal_ulong flags;
303
304 osal_spin_lock_irqsave(&wakelock->lock, &flags);
305 if (wakelock->lock_count) {
306 wakelock->lock_count--;
307 if (!wakelock->lock_count) {
308 __pm_relax(&wakelock->wakelock);
309 wakelock->locked_addr = (osal_ulong)0x0;
310 }
311
312 if (OAL_UNLIKELY(wakelock->debug)) {
313 printk(KERN_DEBUG"wakeunlock[%s] lockcnt:%lu <==%pf\n", wakelock->wakelock.name, wakelock->lock_count,
314 (osal_void *)_RET_IP_);
315 }
316 }
317 osal_spin_unlock_irqrestore(&wakelock->lock, &flags);
318#endif
319#endif
320}
321
322#ifdef __cplusplus
323 #if __cplusplus
324 }
325 #endif
326#endif
327
328#endif /* end of oal_schedule.h */
#define NULL
Definition common_def.h:21
#define OAL_INLINE
Definition driver_soc_common.h:47
int osal_spin_lock_init(osal_spinlock *lock)
Initialize a spin lock.
Definition osal_spinlock.c:15
void osal_spin_lock_irqsave(osal_spinlock *lock, unsigned long *flags)
acquire the spin_lock.
Definition osal_spinlock.c:89
void osal_spin_lock_destroy(osal_spinlock *lock)
Destroy the spin_lock.
Definition osal_spinlock.c:116
void osal_spin_unlock_irqrestore(osal_spinlock *lock, unsigned long *flags)
release the spin_lock.
Definition osal_spinlock.c:103
rwlock_t oal_rwlock_stru
Definition oal_schedule.h:53
OAL_STATIC OAL_INLINE void oal_remove_proc_entry(const osal_s8 *pc_name, oal_proc_dir_entry_stru *parent)
Definition oal_schedule.h:222
OAL_STATIC OAL_INLINE osal_void oal_task_init(oal_tasklet_stru *task, oal_defer_func p_func, osal_ulong args)
Definition oal_schedule.h:168
osal_void(* oal_defer_func)(osal_ulong)
Definition oal_schedule.h:58
#define OAL_IS_ERR_OR_NULL(ptr)
Definition oal_schedule.h:101
struct tasklet_struct oal_tasklet_stru
Definition oal_schedule.h:57
osal_u32(* oal_irqlocked_func)(osal_void *)
Definition oal_schedule.h:51
struct timer_list oal_timer_list_stru
Definition oal_schedule.h:54
OAL_STATIC OAL_INLINE osal_void oal_task_sched(oal_tasklet_stru *task)
Definition oal_schedule.h:187
struct proc_dir_entry oal_proc_dir_entry_stru
Definition oal_schedule.h:110
atomic_t oal_atomic
Definition oal_schedule.h:47
OAL_STATIC OAL_INLINE osal_slong oal_wait_for_completion_interruptible_timeout(oal_completion *completion, osal_ulong timeout)
Definition oal_schedule.h:239
OAL_STATIC OAL_INLINE osal_u32 oal_wait_for_completion_timeout(oal_completion *completion, osal_u32 timeout)
Definition oal_schedule.h:231
OAL_STATIC OAL_INLINE oal_proc_dir_entry_stru * oal_create_proc_entry(const osal_s8 *pc_name, osal_u16 mode, oal_proc_dir_entry_stru *parent)
Definition oal_schedule.h:207
struct mutex oal_mutex_stru
Definition oal_schedule.h:112
struct completion oal_completion
Definition oal_schedule.h:114
OAL_STATIC OAL_INLINE osal_ulong oal_task_is_scheduled(oal_tasklet_stru *task)
Definition oal_schedule.h:196
OAL_STATIC OAL_INLINE osal_void oal_task_kill(oal_tasklet_stru *task)
Definition oal_schedule.h:177
OAL_STATIC OAL_INLINE osal_void oal_rw_lock_write_unlock(oal_rwlock_stru *lock)
Definition oal_schedule.h:154
OAL_STATIC OAL_INLINE void oal_wake_lock(oal_wakelock_stru *wakelock)
Definition oal_schedule.h:191
osal_u32(* oal_module_func_t)(osal_void)
Definition oal_schedule.h:32
OAL_STATIC OAL_INLINE osal_void oal_wake_lock_exit(oal_wakelock_stru *wakelock)
Definition oal_schedule.h:180
OAL_STATIC OAL_INLINE osal_void oal_rw_lock_write_lock(oal_rwlock_stru *lock)
Definition oal_schedule.h:131
struct _oal_wakelock_stru_ oal_wakelock_stru
struct _oal_rwlock_stru oal_rwlock_stru
OAL_STATIC OAL_INLINE osal_void oal_wake_lock_init(oal_wakelock_stru *wakelock, char *name)
Definition oal_schedule.h:163
OAL_STATIC OAL_INLINE osal_void oal_rw_lock_init(oal_rwlock_stru *lock)
Definition oal_schedule.h:62
OAL_STATIC OAL_INLINE osal_void oal_rw_lock_read_unlock(oal_rwlock_stru *lock)
Definition oal_schedule.h:108
OAL_STATIC OAL_INLINE void oal_wake_unlock(oal_wakelock_stru *wakelock)
Definition oal_schedule.h:212
OAL_STATIC OAL_INLINE osal_void oal_rw_lock_read_lock(oal_rwlock_stru *lock)
Definition oal_schedule.h:85
#define OAL_UNLIKELY(_expr)
Definition oal_plat_type.h:43
struct osal_list_head * oal_get_wakelock_head(void)
int osal_s32
Definition osal_types.h:19
long osal_slong
Definition osal_types.h:21
signed char osal_s8
Definition osal_types.h:17
void osal_void
Definition osal_types.h:29
unsigned int osal_u32
Definition osal_types.h:13
unsigned short osal_u16
Definition osal_types.h:12
unsigned long osal_ulong
Definition osal_types.h:15
errno_t memset_s(void *dest, size_t destMax, int c, size_t count)
#define OAL_STATIC
Definition soc_wifi_service_api.c:30
Definition oal_schedule.h:35
osal_u32 debug
Definition oal_schedule.h:44
struct wakeup_source wakelock
Definition oal_schedule.h:37
osal_ulong lock_count
Definition oal_schedule.h:42
struct osal_list_head list
Definition oal_schedule.h:39
osal_ulong locked_addr
Definition oal_schedule.h:43
osal_spinlock lock
Definition oal_schedule.h:38
Definition osal_list.h:39
Definition osal_spinlock.h:18