1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
32 33 34 35
36 package ti.sysbios.family.arm.tms570;
37
38 import xdc.runtime.Diags;
39 import xdc.runtime.Error;
40 import xdc.runtime.Log;
41 import xdc.rov.ViewInfo;
42
43 /*!
44 * ======== Hwi ========
45 * Hardware Interrupt Support Module.
46 *
47 * This Hwi module provides TMS570 (VIM) specific implementations of the
48 * APIs defined in {@link ti.sysbios.interfaces.IHwi IHwi}.
49 *
50 * Additional ARM device-specific APIs are also provided.
51 *
52 * @a(NOTE)
53 * In this Hwi module implementation, the instance config parameter value
54 * {@link #MaskingOption_LOWER} is equivalent to {@link #MaskingOption_SELF}.
55 * Statically configuring a Hwi object's {@link #Params.maskSetting} to
56 * {@link #MaskingOption_LOWER} will result in the generation of a benign
57 * build warning. Dynamic usages of {@link #MaskingOption_LOWER} will be
58 * silently converted to {@link #MaskingOption_SELF}.
59 *
60 * @p(html)
61 * <h3> Calling Context </h3>
62 * <table border="1" cellpadding="3">
63 * <colgroup span="1"></colgroup> <colgroup span="5" align="center"></colgroup>
64 *
65 * <tr><th> Function </th><th> Hwi </th><th> Swi </th><th> Task </th><th> Main </th><th> Startup </th></tr>
66 * <!-- -->
67 * <tr><td> {@link #clearInterrupt} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td></tr>
68 * <tr><td> {@link #create} </td><td> N </td><td> N </td><td> Y </td><td> Y </td><td> N </td></tr>
69 * <tr><td> {@link #disable} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td></tr>
70 * <tr><td> {@link #disableREQMASKSET0} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> N </td></tr>
71 * <tr><td> {@link #disableREQMASKSET1} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> N </td></tr>
72 * <tr><td> {@link #disableFIQ} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td></tr>
73 * <tr><td> {@link #disableInterrupt} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> N </td></tr>
74 * <tr><td> {@link #disableIRQ} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td></tr>
75 * <tr><td> {@link #enable} </td><td> Y </td><td> Y </td><td> Y </td><td> N </td><td> N </td></tr>
76 * <tr><td> {@link #enableREQMASKSET0} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> N </td></tr>
77 * <tr><td> {@link #enableREQMASKSET1} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> N </td></tr>
78 * <tr><td> {@link #enableFIQ} </td><td> Y </td><td> Y </td><td> Y </td><td> N </td><td> N </td></tr>
79 * <tr><td> {@link #enableInterrupt} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> N </td></tr>
80 * <tr><td> {@link #enableIRQ} </td><td> Y </td><td> Y </td><td> Y </td><td> N </td><td> N </td></tr>
81 * <tr><td> {@link #getHandle} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> N </td></tr>
82 * <tr><td> {@link #Params_init} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td></tr>
83 * <tr><td> {@link #restore} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td></tr>
84 * <tr><td> {@link #restoreREQMASKSET0} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> N </td></tr>
85 * <tr><td> {@link #restoreREQMASKSET1} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> N </td></tr>
86 * <tr><td> {@link #restoreFIQ} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td></tr>
87 * <tr><td> {@link #restoreInterrupt} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td></tr>
88 * <tr><td> {@link #restoreIRQ} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td></tr>
89 * <tr><td> {@link #setPriority} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> N </td></tr>
90 * <tr><td> {@link #construct} </td><td> N </td><td> N </td><td> Y </td><td> Y </td><td> N </td></tr>
91 * <tr><td> {@link #delete} </td><td> N </td><td> N </td><td> Y </td><td> Y </td><td> N </td></tr>
92 * <tr><td> {@link #destruct} </td><td> N </td><td> N </td><td> Y </td><td> Y </td><td> N </td></tr>
93 * <tr><td> {@link #getHookContext} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> N </td></tr>
94 * <tr><td> {@link #reconfig} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> N </td></tr>
95 * <tr><td> {@link #setFunc} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> N </td></tr>
96 * <tr><td> {@link #setHookContext} </td><td> Y </td><td> Y </td><td> Y </td><td> Y </td><td> N </td></tr>
97 * <tr><td colspan="6"> Definitions: <br />
98 * <ul>
99 * <li> <b>Hwi</b>: API is callable from a Hwi thread. </li>
100 * <li> <b>Swi</b>: API is callable from a Swi thread. </li>
101 * <li> <b>Task</b>: API is callable from a Task thread. </li>
102 * <li> <b>Main</b>: API is callable during any of these phases: </li>
103 * <ul>
104 * <li> In your module startup after this module is started (e.g. Hwi_Module_startupDone() returns TRUE). </li>
105 * <li> During xdc.runtime.Startup.lastFxns. </li>
106 * <li> During main().</li>
107 * <li> During BIOS.startupFxns.</li>
108 * </ul>
109 * <li> <b>Startup</b>: API is callable during any of these phases:</li>
110 * <ul>
111 * <li> During xdc.runtime.Startup.firstFxns.</li>
112 * <li> In your module startup before this module is started (e.g. Hwi_Module_startupDone() returns FALSE).</li>
113 * </ul>
114 * </ul>
115 * </td></tr>
116 *
117 *
118 * </table>
119 * @p
120 */
121
122 @Template("./Hwi.xdt")
123 @ModuleStartup
124
125 module Hwi inherits ti.sysbios.interfaces.IHwi
126 {
127
128
129
130 /*! The TMS570 ARM Interrupt Controller supports 64 interrupts. */
131 const Int NUM_INTERRUPTS = 64;
132
133
134
135 /*! Hwi vector function type definition. */
136 typedef Void (*VectorFuncPtr)(void);
137
138 /*! @_nodoc Hwi plug function type definition. */
139 typedef Void (*PlugFuncPtr)(void);
140
141 /*! Interrupt type. IRQ or FIQ */
142 enum Type {
143 Type_IRQ, /*! IRQ interrupt. */
144 Type_FIQ /*! FIQ interrupt. */
145 };
146
147 /*!
148 * ARM Interrupt Controller.
149 */
150 struct VIM {
151 UInt32 PARFLG; /*! 0xFDEC VIM RAM Parity Flag Register */
152 UInt32 PARCTL; /*! 0xFDF0 VIM RAM Parity Control Register */
153 UInt32 ADDERR; /*! 0xFDF4 Address Parity Error Register */
154 UInt32 FBPARERR; /*! 0xFDF8 Fallback Parity Error Register */
155 UInt32 RESFC; /*! 0xFDFC reserved */
156
157 UInt32 IRQINDEX; /*! 0x0000 current IRQ id */
158 UInt32 FIQINDEX; /*! 0x0004 current FIQ id */
159 UInt32 RES08[2]; /*! 0x0008 reserved */
160
161 UInt32 FIRQPR[4]; /*! 0x0010-0x001C FIQ/IRQ Program Control Registers */
162 UInt32 INTREQ[4]; /*! 0x0020-0x002C Pending Interrupt Request Registers */
163
164 UInt32 REQENASET[4]; /*! 0x0030-0x003C Interrupt (Enable) Mask Set Registers */
165 UInt32 REQENACLR[4]; /*! 0x0040-0x004C Interrupt (Enable) Mask Clear Registers */
166
167 UInt32 WAKEENASET[4]; /*! 0x0050-0x005C Wake Mask Set Registers */
168 UInt32 WAKEENACLR[4]; /*! 0x0060-0x006C Wake Mask Clear Registers */
169
170 UInt32 IRQVECREG; /*! 0x0070 IRQ vector */
171 UInt32 FIQVECREG; /*! 0x0074 FIQ vector */
172
173 UInt32 CAPEVT; /*! 0x0078 Capture Event Register */
174 UInt32 RES7C[1]; /*! 0x007C reserved */
175
176 UInt8 CHANMAP[128]; /*! 0x0080-0x00FF Channel Map (Priority) Registers */
177 };
178
179 /*!
180 * Physical Vectored Interrupt Manager (VIM) Device.
181 * Short name is "Hwi_vim"
182 * Long name is "ti_sysbios_family_arm_tms570_Hwi_vim"
183 */
184 extern volatile VIM vim;
185
186 /*! @_nodoc */
187 metaonly struct BasicView {
188 Ptr halHwiHandle;
189 String label;
190 Int intNum;
191 Int priority;
192 String fxn;
193 UArg arg;
194 Ptr irp;
195 String status;
196 };
197
198 /*! @_nodoc */
199 metaonly struct ModuleView {
200 String options[4];
201 SizeT hwiStackPeak;
202 SizeT hwiStackSize;
203 Ptr hwiStackBase;
204 };
205
206 /*! @_nodoc */
207 @Facet
208 metaonly config ViewInfo.Instance rovViewInfo =
209 ViewInfo.create({
210 viewMap: [
211 ['Basic', {type: ViewInfo.INSTANCE, viewInitFxn: 'viewInitBasic', structName: 'BasicView'}],
212 ['Module', {type: ViewInfo.MODULE, viewInitFxn: 'viewInitModule', structName: 'ModuleView'}]
213 ]
214 });
215
216
217
218 /*! Reset Handler. Default is c_int00 */
219 metaonly config VectorFuncPtr resetFunc;
220
221 /*! Undefined instruction exception handler. Default is self loop */
222 metaonly config VectorFuncPtr undefinedInstFunc;
223
224 /*! SWI Handler. Default is internal SWI handler */
225 metaonly config VectorFuncPtr swiFunc;
226
227 /*! Prefetch abort exception handler. Default is self loop */
228 metaonly config VectorFuncPtr prefetchAbortFunc;
229
230 /*! Data abort exception handler. Default is self loop */
231 metaonly config VectorFuncPtr dataAbortFunc;
232
233 /*! Reserved exception handler. Default is self loop */
234 metaonly config VectorFuncPtr reservedFunc;
235
236 /*! IRQ interrupt handler. Default is internal IRQ dispatcher */
237 metaonly config VectorFuncPtr irqFunc;
238
239 /*! FIQ interrupt handler. Default is internal FIQ dispatcher */
240 metaonly config VectorFuncPtr fiqFunc;
241
242 /*!
243 * FIQ stack pointer. Default = null.
244 * (Indicates that stack is to be created using
245 * staticPlace()
246 */
247 config Ptr fiqStack = null;
248
249 /*!
250 * FIQ stack size in MAUs.
251 * Default is 1024 bytes.
252 */
253 metaonly config SizeT fiqStackSize = 1024;
254
255 /*!
256 * Memory section used for FIQ stack
257 * Default is null.
258 */
259 metaonly config String fiqStackSection = null;
260
261 /*!
262 * Error raised when Hwi is already defined
263 */
264 config Error.Id E_alreadyDefined = {
265 msg: "E_alreadyDefined: Hwi already defined: intr# %d"
266 };
267
268 /*!
269 * Issued just prior to Hwi function invocation (with interrupts disabled)
270 */
271 config Log.Event LM_begin = {
272 mask: Diags.USER1 | Diags.USER2,
273 msg: "LM_begin: hwi: 0x%x, func: 0x%x, preThread: %d, intNum: %d, irp: 0x%x"
274 };
275
276 /*!
277 * Issued just after return from Hwi function (with interrupts disabled)
278 */
279 config Log.Event LD_end = {
280 mask: Diags.USER2,
281 msg: "LD_end: hwi: 0x%x"
282 };
283
284
285
286
287 /*!
288 * ======== disable ========
289 */
290 @Macro
291 override UInt disable();
292
293 /*!
294 * ======== enable ========
295 */
296 @Macro
297 override UInt enable();
298
299 /*!
300 * ======== restore ========
301 */
302 @Macro
303 override Void restore(UInt key);
304
305 /*!
306 * ======== inUseMeta ========
307 * @_nodoc
308 * Check for Hwi already in use.
309 * For internal SYS/BIOS use only.
310 * Should be called prior to any internal Hwi.create().
311 *
312 * @param(intNum) interrupt number
313 */
314 metaonly Bool inUseMeta(UInt intNum);
315
316 /*!
317 * ======== getHandle ========
318 * Returns pointer to Hwi instance object.
319 *
320 * @param(intNum) interrupt number
321 */
322 @DirectCall
323 Object *getHandle(UInt intNum);
324
325 /*!
326 * ======== enableFIQ ========
327 * Enable FIQ interrupts.
328 *
329 * @b(returns) previous FIQ interrupt enable/disable state
330 */
331 @DirectCall
332 UInt enableFIQ();
333
334 /*!
335 * ======== disableFIQ ========
336 * Disable FIQ interrupts.
337 *
338 * @b(returns) previous FIQ interrupt enable/disable state
339 */
340 @DirectCall
341 UInt disableFIQ();
342
343 /*!
344 * ======== restoreFIQ ========
345 * Restore FIQ interrupts.
346 *
347 * @param(key) enable/disable state to restore
348 */
349 @DirectCall
350 Void restoreFIQ(UInt key);
351
352 /*!
353 * ======== enableIRQ ========
354 * Enable IRQ interrupts.
355 *
356 * @param(key) enable/disable state to restore
357 */
358 @DirectCall
359 UInt enableIRQ();
360
361 /*!
362 * ======== disableIRQ ========
363 * Disable IRQ interrupts.
364 *
365 * @b(returns) previous IRQ interrupt enable/disable state
366 */
367 @DirectCall
368 UInt disableIRQ();
369
370 /*!
371 * ======== restoreIRQ ========
372 * Restore IRQ interrupts.
373 *
374 * @param(key) enable/disable state to restore
375 */
376 @DirectCall
377 Void restoreIRQ(UInt key);
378
379 /*!
380 * ======== setPriority ========
381 * Set an interrupt's relative priority.
382 *
383 * @param(intNum) ID of interrupt
384 * @param(priority) priority (0-63)
385 */
386 @DirectCall
387 Void setPriority(UInt intNum, UInt priority);
388
389 /*!
390 * ======== setType ========
391 * Set an interrupt's type (FIQ/IRQ).
392 *
393 * Not an instance function so that it can be used
394 * with non-dispatched interrupts.
395 *
396 * @param(intNum) ID of interrupt
397 * @param(type) type = FIQ/IRQ
398 */
399 @DirectCall
400 Void setType(UInt intNum, Type type);
401
402 instance:
403
404 /*! disableMask0. default is derived from MaskingOption_SELF maskSetting. */
405 config Bits32 disableMask0 = 0;
406
407 /*! disableMask1. default is derived from MaskingOption_SELF maskSetting. */
408 config Bits32 disableMask1 = 0;
409
410 /*! restoreMask0. default is derived from MaskingOption_SELF maskSetting. */
411 config Bits32 restoreMask0 = 0;
412
413 /*! restoreMask1. default is derived from MaskingOption_SELF maskSetting. */
414 config Bits32 restoreMask1 = 0;
415
416 /*! wakeEnable. default is true. */
417 config Bool wakeEnable = true;
418
419 /*! Interrupt type (IRQ/FIQ. Default is IRQ. */
420 config Type type = Type_IRQ;
421
422 /*!
423 * ======== reconfig ========
424 * Reconfigure a dispatched interrupt.
425 */
426 @DirectCall
427 Void reconfig(FuncPtr fxn, const Params *params);
428
429 internal:
430
431 432 433 434 435 436
437 config UInt (*swiDisable)();
438 config Void (*swiRestoreHwi)(UInt);
439 config UInt (*taskDisable)();
440 config Void (*taskRestoreHwi)(UInt);
441
442
443 Void init();
444
445
446 Void dispatchIRQ();
447
448
449 Void dispatchIRQC(Irp irp);
450
451
452 Void dispatchFIQC();
453
454 /*!
455 * ======== plug ========
456 * Plug an interrupt vector with an ISR address.
457 *
458 * @param(intNum) interrupt number
459 * @param(fxn) pointer to ISR function
460 */
461 Void plug(UInt intNum, PlugFuncPtr fxn);
462
463 /*!
464 * const array to hold all HookSet objects.
465 */
466 config HookSet hooks[length] = [];
467
468 /*! Meta World Only Hwi Configuration Object. */
469 metaonly struct InterruptObj {
470 Bool used;
471 Bool useDispatcher;
472 FuncPtr fxn;
473 };
474
475 /*!
476 * Meta-only array of interrupt objects.
477 * This meta-only array of Hwi config objects is initialized
478 * in Hwi.xs:module$meta$init().
479 */
480 metaonly config InterruptObj interrupt[NUM_INTERRUPTS];
481
482 struct Instance_State {
483 Type type;
484 UInt priority;
485 Bits32 disableMask0;
486 Bits32 disableMask1;
487 Bits32 restoreMask0;
488 Bits32 restoreMask1;
489 UArg arg;
490 FuncPtr fxn;
491 Int intNum;
492 Irp irp;
493 Ptr hookEnv[];
494 };
495
496 struct Module_State {
497 VIM *vim;
498 Bits32 req0Mask;
499 Bits32 req1Mask;
500 UInt irp;
501 Char *taskSP;
502
503
504
505 Char *isrStack;
506 Ptr isrStackBase;
507 Ptr isrStackSize;
508 Char fiqStack[];
509 SizeT fiqStackSize;
510 UInt *vimRam;
511 Handle dispatchTable[NUM_INTERRUPTS];
512
513 };
514 }
515
516 517 518 519
520