aboutsummaryrefslogtreecommitdiffstats
path: root/arch/blackfin/mach-common/interrupt.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/blackfin/mach-common/interrupt.S')
-rw-r--r--arch/blackfin/mach-common/interrupt.S25
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)
261ENDPROC(_evt_system_call) 261ENDPROC(_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 */
264ENTRY(___ipipe_call_irqtail) 289ENTRY(___ipipe_call_irqtail)
265 p0 = r0; 290 p0 = r0;
266 r0.l = 1f; 291 r0.l = 1f;