1 /*
2 * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved.
3 *
4 * UniProton is licensed under Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 * http://license.coscl.org.cn/MulanPSL2
8 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
9 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
10 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
11 * See the Mulan PSL v2 for more details.
12 * Create: 2009-12-22
13 * Description: 中断模块内部头文件
14 */
15 #ifndef PRT_IRQ_INTERNAL_H
16 #define PRT_IRQ_INTERNAL_H
17
18 #include "prt_irq_external.h"
19 #include "prt_hook_external.h"
20 #include "prt_mem_external.h"
21 #include "prt_sys_external.h"
22 #include "prt_task_external.h"
23
24 /*
25 * 模块内宏定义
26 */
27
28 #define OS_HWI_MODE_ATTR(irqNum) (&g_hwiModeForm[(irqNum)])
29 #define OS_HWI_MODE_GET(irqNum) (g_hwiModeForm[(irqNum)].mode)
30 #if defined(OS_OPTION_HWI_COMBINE)
31 #define OS_HWI_MODE_INV(irqNum) \
32 ((OS_HWI_MODE_GET(irqNum) != OS_HWI_MODE_ENGROSS) && (OS_HWI_MODE_GET(irqNum) != OS_HWI_MODE_COMBINE))
33 #else
34 #define OS_HWI_MODE_INV(irqNum) (OS_HWI_MODE_GET(irqNum) != OS_HWI_MODE_ENGROSS)
35 #endif
36
37 #define OS_HWI_MODE_UNSET 0
38 #define OS_HWI_MAX_COMBINE_NODE 8
39
40 #define OS_HWI_IRQ_LOCK(intSave) \
41 do { \
42 (intSave) = PRT_HwiLock(); \
43 } while (0)
44
45 #define OS_HWI_IRQ_UNLOCK(intSave) \
46 do { \
47 PRT_HwiRestore(intSave); \
48 } while (0)
49
50 #define OS_HWI_SPINLOCK_INIT()
51
52 /*
53 * 模块内数据结构定义
54 */
55 struct TagHwiHandleForm {
56 union {
57 HwiProcFunc hook; // 非私有中断时为正常hook
58 struct TagHwiHandleForm *form; // 私有中断时为指向私有form数组的指针
59 };
60
61 #if defined(OS_OPTION_HWI_ATTRIBUTE)
62 HwiArg param;
63 #endif
64 };
65
66 struct TagHwiModeForm {
67 HwiMode mode;
68 HwiPrior prior;
69 };
70
71 #if defined(OS_OPTION_HWI_COMBINE)
72 struct TagHwiCombineNode {
73 HwiProcFunc cmbHook;
74 HwiArg cmbParam;
75 struct TagHwiCombineNode *next;
76 };
77 #endif
78
79 /*
80 * 模块内全局变量声明
81 */
82 #if defined(OS_OPTION_HWI_MAX_NUM_CONFIG)
83 extern struct TagHwiHandleForm *g_hwiForm;
84 extern struct TagHwiModeForm *g_hwiModeForm;
85 #else
86 extern struct TagHwiHandleForm g_hwiForm[OS_HWI_FORMARRAY_NUM];
87 extern struct TagHwiModeForm g_hwiModeForm[OS_HWI_MAX_NUM];
88 #endif
89
OsHwiHandleFormGet(U32 irqNum)90 OS_SEC_ALW_INLINE INLINE struct TagHwiHandleForm *OsHwiHandleFormGet(U32 irqNum)
91 {
92 return &g_hwiForm[irqNum];
93 }
94
OsHwiFuncSet(U32 irqNum,HwiProcFunc hook)95 OS_SEC_ALW_INLINE INLINE void OsHwiFuncSet(U32 irqNum, HwiProcFunc hook)
96 {
97 struct TagHwiHandleForm *form = OsHwiHandleFormGet(irqNum);
98
99 form->hook = hook;
100 }
101
OsHwiParaSet(U32 irqNum,HwiArg arg)102 OS_SEC_ALW_INLINE INLINE void OsHwiParaSet(U32 irqNum, HwiArg arg)
103 {
104 #if defined(OS_OPTION_HWI_ATTRIBUTE)
105 struct TagHwiHandleForm *form = OsHwiHandleFormGet(irqNum);
106
107 form->param = arg;
108 #endif
109 (void)irqNum;
110 (void)arg;
111 }
112
OsHwiFuncGet(U32 irqNum)113 OS_SEC_ALW_INLINE INLINE HwiProcFunc OsHwiFuncGet(U32 irqNum)
114 {
115 struct TagHwiHandleForm *form = OsHwiHandleFormGet(irqNum);
116
117 return form->hook;
118 }
119
OsHwiParaGet(U32 irqNum)120 OS_SEC_ALW_INLINE INLINE HwiArg OsHwiParaGet(U32 irqNum)
121 {
122 #if defined(OS_OPTION_HWI_ATTRIBUTE)
123 struct TagHwiHandleForm *form = OsHwiHandleFormGet(irqNum);
124
125 return form->param;
126 #else
127 return irqNum;
128 #endif
129 }
130
OsHwiHandleActive(U32 irqNum)131 OS_SEC_ALW_INLINE INLINE void OsHwiHandleActive(U32 irqNum)
132 {
133 HwiArg arg;
134 struct TagHwiHandleForm *form = NULL;
135
136 form = OsHwiHandleFormGet(irqNum);
137
138 #if defined(OS_OPTION_HWI_ATTRIBUTE)
139 arg = form->param;
140 #else
141 arg = irqNum;
142 #endif
143
144 form->hook(arg);
145 }
146
147 #if defined(OS_OPTION_HWI_ATTRIBUTE)
OsHwiAttrClear(U32 irqNum)148 OS_SEC_ALW_INLINE INLINE U32 OsHwiAttrClear(U32 irqNum)
149 {
150 struct TagHwiModeForm *form = NULL;
151
152 if (OS_HWI_MODE_INV(irqNum)) {
153 return OS_ERRNO_HWI_DELETED;
154 }
155
156 /* 清除该中断号的工作模式 */
157 form = OS_HWI_MODE_ATTR(irqNum);
158 form->mode = OS_HWI_MODE_UNSET;
159
160 return OS_OK;
161 }
162 #endif
163
OsHwiAttrSet(U32 irqNum,HwiPrior hwiPrio,HwiMode mode)164 OS_SEC_ALW_INLINE INLINE void OsHwiAttrSet(U32 irqNum, HwiPrior hwiPrio, HwiMode mode)
165 {
166 #if defined(OS_OPTION_HWI_ATTRIBUTE)
167 struct TagHwiModeForm *form = OS_HWI_MODE_ATTR(irqNum);
168
169 form->mode = mode;
170 form->prior = hwiPrio;
171 #else
172 (void)irqNum;
173 (void)hwiPrio;
174 (void)mode;
175 #endif
176 }
177
178 #if defined(OS_OPTION_HWI_COMBINE)
179 extern struct TagHwiCombineNode g_hwiCombineNode[OS_HWI_MAX_COMBINE_NODE];
180 extern struct TagHwiCombineNode *g_freeHwiComHead;
181 #endif
182
183 /*
184 * 模块内内联函数定义
185 */
186 #if defined(OS_OPTION_HWI_COMBINE)
OsHwiModeCheck(HwiMode mode)187 OS_SEC_ALW_INLINE INLINE bool OsHwiModeCheck(HwiMode mode)
188 {
189 if ((mode != OS_HWI_ATTR(OS_HWI_MODE_COMBINE, OS_HWI_TYPE_NORMAL)) &&
190 (mode != OS_HWI_ATTR(OS_HWI_MODE_ENGROSS, OS_HWI_TYPE_NORMAL))) {
191 return TRUE;
192 }
193
194 return FALSE;
195 }
196 #else
OsHwiModeCheck(HwiMode mode)197 OS_SEC_ALW_INLINE INLINE bool OsHwiModeCheck(HwiMode mode)
198 {
199 if ((mode != OS_HWI_ATTR(OS_HWI_MODE_ENGROSS, OS_HWI_TYPE_NORMAL))) {
200 return TRUE;
201 }
202
203 return FALSE;
204 }
205 #endif
206
OsHwiPrioCheck(HwiPrior hwiPrio)207 OS_SEC_ALW_INLINE INLINE bool OsHwiPrioCheck(HwiPrior hwiPrio)
208 {
209 #if defined(OS_OPTION_HWI_PRIORITY)
210 return (bool)OS_HWI_PRIO_CHECK(hwiPrio);
211 #else
212 (void)hwiPrio;
213 return FALSE;
214 #endif
215 }
216
217 /* 如果不一致返回TRUE */
OsHwiPrioConflictCheck(U32 irqNum,HwiPrior hwiPrio)218 OS_SEC_ALW_INLINE INLINE bool OsHwiPrioConflictCheck(U32 irqNum, HwiPrior hwiPrio)
219 {
220 /* blong融合接口支持动态配置优先级 */
221 #if defined(OS_OPTION_HWI_PRIORITY)
222 return (hwiPrio != OsHwiPriorityGet(OS_IRQ2HWI(irqNum)));
223 #else
224 (void)irqNum;
225 (void)hwiPrio;
226 return FALSE;
227 #endif
228 }
229
OsHwiNeedPrivateIsr(U32 irqNum)230 OS_SEC_ALW_INLINE INLINE bool OsHwiNeedPrivateIsr(U32 irqNum)
231 {
232 (void)irqNum;
233 return FALSE;
234 }
235
236 /* 检查是否可以注册中断服务程序,TRUE表示允许 */
OsHwiIsCanCreated(U32 irqNum)237 OS_SEC_ALW_INLINE INLINE bool OsHwiIsCanCreated(U32 irqNum)
238 {
239 if (OsHwiFuncGet(irqNum) != OsHwiDefaultHandler) {
240 return FALSE;
241 }
242
243 return TRUE;
244 }
245
246 #endif /* PRT_IRQ_INTERNAL_H */
247