diff options
Diffstat (limited to 'arch/blackfin/mach-common/interrupt.S')
-rw-r--r-- | arch/blackfin/mach-common/interrupt.S | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/blackfin/mach-common/interrupt.S b/arch/blackfin/mach-common/interrupt.S index 29fbf67f47fa..c754ff74bd5d 100644 --- a/arch/blackfin/mach-common/interrupt.S +++ b/arch/blackfin/mach-common/interrupt.S | |||
@@ -261,6 +261,31 @@ ENTRY(_evt_system_call) | |||
261 | ENDPROC(_evt_system_call) | 261 | ENDPROC(_evt_system_call) |
262 | 262 | ||
263 | #ifdef CONFIG_IPIPE | 263 | #ifdef CONFIG_IPIPE |
264 | /* | ||
265 | * __ipipe_call_irqtail: lowers the current priority level to EVT15 | ||
266 | * before running a user-defined routine, then raises the priority | ||
267 | * level to EVT14 to prepare the caller for a normal interrupt | ||
268 | * return through RTI. | ||
269 | * | ||
270 | * We currently use this facility in two occasions: | ||
271 | * | ||
272 | * - to branch to __ipipe_irq_tail_hook as requested by a high | ||
273 | * priority domain after the pipeline delivered an interrupt, | ||
274 | * e.g. such as Xenomai, in order to start its rescheduling | ||
275 | * procedure, since we may not switch tasks when IRQ levels are | ||
276 | * nested on the Blackfin, so we have to fake an interrupt return | ||
277 | * so that we may reschedule immediately. | ||
278 | * | ||
279 | * - to branch to sync_root_irqs, in order to play any interrupt | ||
280 | * pending for the root domain (i.e. the Linux kernel). This lowers | ||
281 | * the core priority level enough so that Linux IRQ handlers may | ||
282 | * never delay interrupts handled by high priority domains; we defer | ||
283 | * those handlers until this point instead. This is a substitute | ||
284 | * to using a threaded interrupt model for the Linux kernel. | ||
285 | * | ||
286 | * r0: address of user-defined routine | ||
287 | * context: caller must have preempted EVT15, hw interrupts must be off. | ||
288 | */ | ||
264 | ENTRY(___ipipe_call_irqtail) | 289 | ENTRY(___ipipe_call_irqtail) |
265 | p0 = r0; | 290 | p0 = r0; |
266 | r0.l = 1f; | 291 | r0.l = 1f; |