summaryrefslogtreecommitdiffstats
path: root/sys/powerpc
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2008-04-05 19:58:30 +0000
committerjhb <jhb@FreeBSD.org>2008-04-05 19:58:30 +0000
commit79918c45a6cb0f1be2a1f4a98b4db650b3e3ec66 (patch)
tree3473dbfbaef8cf04d0d7e8cc250d98a1d866650b /sys/powerpc
parentbcf7984652af778a74311520173661bcd19d3326 (diff)
downloadFreeBSD-src-79918c45a6cb0f1be2a1f4a98b4db650b3e3ec66.zip
FreeBSD-src-79918c45a6cb0f1be2a1f4a98b4db650b3e3ec66.tar.gz
Add a MI intr_event_handle() routine for the non-INTR_FILTER case. This
allows all the INTR_FILTER #ifdef's to be removed from the MD interrupt code. - Rename the intr_event 'eoi', 'disable', and 'enable' hooks to 'post_filter', 'pre_ithread', and 'post_ithread' to be less x86-centric. Also, add a comment describe what the MI code expects them to do. - On amd64, i386, and powerpc this is effectively a NOP. - On arm, don't bother masking the interrupt unless the ithread is scheduled in the non-INTR_FILTER case to match what INTR_FILTER did. Also, don't bother unmasking the interrupt in the post_filter case if we never masked it. The INTR_FILTER case had been doing this by having arm_unmask_irq for the post_filter (formerly 'eoi') hook. - On ia64, stray interrupts are now masked for the non-INTR_FILTER case. They were already masked in the INTR_FILTER case. - On sparc64, use the a NULL pre_ithread hook and use intr_enable_eoi() for both the 'post_filter' and 'post_ithread' hooks to match what the non-INTR_FILTER code did. - On sun4v, retire the ithread wrapper hack by using an appropriate 'post_ithread' hook instead (it's what 'post_ithread'/'enable' was designed to do even in 5.x). Glanced at by: piso Reviewed by: marius Requested by: marius [1], [5] Tested on: amd64, i386, arm, sparc64
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/powerpc/intr_machdep.c46
1 files changed, 1 insertions, 45 deletions
diff --git a/sys/powerpc/powerpc/intr_machdep.c b/sys/powerpc/powerpc/intr_machdep.c
index 990ba51..5f1a651 100644
--- a/sys/powerpc/powerpc/intr_machdep.c
+++ b/sys/powerpc/powerpc/intr_machdep.c
@@ -277,10 +277,6 @@ powerpc_dispatch_intr(u_int vector, struct trapframe *tf)
{
struct powerpc_intr *i;
struct intr_event *ie;
-#ifndef INTR_FILTER
- struct intr_handler *ih;
- int error, sched, ret;
-#endif
i = powerpc_intrs[vector];
if (i == NULL)
@@ -291,55 +287,15 @@ powerpc_dispatch_intr(u_int vector, struct trapframe *tf)
ie = i->event;
KASSERT(ie != NULL, ("%s: interrupt without an event", __func__));
-#ifdef INTR_FILTER
if (intr_event_handle(ie, tf) != 0) {
- PIC_MASK(pic, i->irq);
- log(LOG_ERR, "stray irq%u\n", i->irq);
- }
-#else
- if (TAILQ_EMPTY(&ie->ie_handlers))
goto stray;
-
- /*
- * Execute all fast interrupt handlers directly without Giant. Note
- * that this means that any fast interrupt handler must be MP safe.
- */
- ret = 0;
- sched = 0;
- critical_enter();
- TAILQ_FOREACH(ih, &ie->ie_handlers, ih_next) {
- if (ih->ih_filter == NULL) {
- sched = 1;
- continue;
- }
- CTR4(KTR_INTR, "%s: exec %p(%p) for %s", __func__,
- ih->ih_filter, ih->ih_argument, ih->ih_name);
- ret = ih->ih_filter(ih->ih_argument);
- /*
- * Wrapper handler special case: see
- * i386/intr_machdep.c::intr_execute_handlers()
- */
- if (!sched) {
- if (ret == FILTER_SCHEDULE_THREAD)
- sched = 1;
- }
}
-
- if (sched) {
- PIC_MASK(pic, i->irq);
- error = intr_event_schedule_thread(ie);
- KASSERT(error == 0, ("%s: impossible stray interrupt",
- __func__));
- } else
- PIC_EOI(pic, i->irq);
- critical_exit();
-#endif
return;
stray:
stray_count++;
if (stray_count <= MAX_STRAY_LOG) {
- printf("stray irq %d\n", i->irq);
+ printf("stray irq %d\n", i ? i->irq : -1);
if (stray_count >= MAX_STRAY_LOG) {
printf("got %d stray interrupts, not logging anymore\n",
MAX_STRAY_LOG);
OpenPOWER on IntegriCloud