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