|
@@ -261,6 +261,31 @@ ENTRY(_evt_system_call)
|
|
|
ENDPROC(_evt_system_call)
|
|
|
|
|
|
#ifdef CONFIG_IPIPE
|
|
|
+/*
|
|
|
+ * __ipipe_call_irqtail: lowers the current priority level to EVT15
|
|
|
+ * before running a user-defined routine, then raises the priority
|
|
|
+ * level to EVT14 to prepare the caller for a normal interrupt
|
|
|
+ * return through RTI.
|
|
|
+ *
|
|
|
+ * We currently use this facility in two occasions:
|
|
|
+ *
|
|
|
+ * - to branch to __ipipe_irq_tail_hook as requested by a high
|
|
|
+ * priority domain after the pipeline delivered an interrupt,
|
|
|
+ * e.g. such as Xenomai, in order to start its rescheduling
|
|
|
+ * procedure, since we may not switch tasks when IRQ levels are
|
|
|
+ * nested on the Blackfin, so we have to fake an interrupt return
|
|
|
+ * so that we may reschedule immediately.
|
|
|
+ *
|
|
|
+ * - to branch to sync_root_irqs, in order to play any interrupt
|
|
|
+ * pending for the root domain (i.e. the Linux kernel). This lowers
|
|
|
+ * the core priority level enough so that Linux IRQ handlers may
|
|
|
+ * never delay interrupts handled by high priority domains; we defer
|
|
|
+ * those handlers until this point instead. This is a substitute
|
|
|
+ * to using a threaded interrupt model for the Linux kernel.
|
|
|
+ *
|
|
|
+ * r0: address of user-defined routine
|
|
|
+ * context: caller must have preempted EVT15, hw interrupts must be off.
|
|
|
+ */
|
|
|
ENTRY(___ipipe_call_irqtail)
|
|
|
p0 = r0;
|
|
|
r0.l = 1f;
|