svn commit: r209724 - in head/sys/powerpc: mpc85xx powermac powerpc
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Tue Jul 6 15:27:06 UTC 2010
Author: nwhitehorn
Date: Tue Jul 6 15:27:05 2010
New Revision: 209724
URL: http://svn.freebsd.org/changeset/base/209724
Log:
Move the EOI logic when starting ithreads into intr_machdep instead of
relying on it as a side effect of PIC_MASK() in the PIC drivers, and add
an inmplementation of assign_cpu() for the kernel interrupt layer.
Modified:
head/sys/powerpc/mpc85xx/atpic.c
head/sys/powerpc/powermac/hrowpic.c
head/sys/powerpc/powerpc/intr_machdep.c
head/sys/powerpc/powerpc/openpic.c
Modified: head/sys/powerpc/mpc85xx/atpic.c
==============================================================================
--- head/sys/powerpc/mpc85xx/atpic.c Tue Jul 6 12:13:15 2010 (r209723)
+++ head/sys/powerpc/mpc85xx/atpic.c Tue Jul 6 15:27:05 2010 (r209724)
@@ -308,12 +308,10 @@ atpic_mask(device_t dev, u_int irq)
if (irq > 7) {
sc->sc_mask[ATPIC_SLAVE] |= 1 << (irq - 8);
atpic_write(sc, ATPIC_SLAVE, 1, sc->sc_mask[ATPIC_SLAVE]);
- atpic_write(sc, ATPIC_SLAVE, 0, OCW2_EOI);
} else {
sc->sc_mask[ATPIC_MASTER] |= 1 << irq;
atpic_write(sc, ATPIC_MASTER, 1, sc->sc_mask[ATPIC_MASTER]);
}
- atpic_write(sc, ATPIC_MASTER, 0, OCW2_EOI);
}
static void
Modified: head/sys/powerpc/powermac/hrowpic.c
==============================================================================
--- head/sys/powerpc/powermac/hrowpic.c Tue Jul 6 12:13:15 2010 (r209723)
+++ head/sys/powerpc/powermac/hrowpic.c Tue Jul 6 15:27:05 2010 (r209724)
@@ -269,12 +269,9 @@ static void
hrowpic_mask(device_t dev, u_int irq)
{
struct hrowpic_softc *sc;
- int bank;
sc = device_get_softc(dev);
hrowpic_toggle_irq(sc, irq, 0);
- bank = (irq >= 32) ? HPIC_SECONDARY : HPIC_PRIMARY ;
- hrowpic_write_reg(sc, HPIC_CLEAR, bank, 1U << (irq & 0x1f));
}
static void
Modified: head/sys/powerpc/powerpc/intr_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/intr_machdep.c Tue Jul 6 12:13:15 2010 (r209723)
+++ head/sys/powerpc/powerpc/intr_machdep.c Tue Jul 6 15:27:05 2010 (r209724)
@@ -239,21 +239,42 @@ powerpc_intr_eoi(void *arg)
}
static void
-powerpc_intr_mask(void *arg)
+powerpc_intr_pre_ithread(void *arg)
{
struct powerpc_intr *i = arg;
PIC_MASK(i->pic, i->intline);
+ PIC_EOI(i->pic, i->intline);
}
static void
-powerpc_intr_unmask(void *arg)
+powerpc_intr_post_ithread(void *arg)
{
struct powerpc_intr *i = arg;
PIC_UNMASK(i->pic, i->intline);
}
+static int
+powerpc_assign_intr_cpu(void *arg, u_char cpu)
+{
+#ifdef SMP
+ struct powerpc_intr *i = arg;
+
+ if (cpu == NOCPU)
+ i->cpu = all_cpus;
+ else
+ i->cpu = 1 << cpu;
+
+ if (!cold && i->pic != NULL && i->pic == root_pic)
+ PIC_BIND(i->pic, i->intline, i->cpu);
+
+ return (0);
+#else
+ return (EOPNOTSUPP);
+#endif
+}
+
void
powerpc_register_pic(device_t dev, u_int ipi)
{
@@ -360,8 +381,8 @@ powerpc_setup_intr(const char *name, u_i
if (i->event == NULL) {
error = intr_event_create(&i->event, (void *)i, 0, irq,
- powerpc_intr_mask, powerpc_intr_unmask, powerpc_intr_eoi,
- NULL, "irq%u:", irq);
+ powerpc_intr_pre_ithread, powerpc_intr_post_ithread,
+ powerpc_intr_eoi, powerpc_assign_intr_cpu, "irq%u:", irq);
if (error)
return (error);
@@ -410,14 +431,6 @@ powerpc_bind_intr(u_int irq, u_char cpu)
if (i == NULL)
return (ENOMEM);
- if (cpu == NOCPU)
- i->cpu = all_cpus;
- else
- i->cpu = 1 << cpu;
-
- if (!cold && i->pic != NULL && i->pic == root_pic)
- PIC_BIND(i->pic, i->intline, i->cpu);
-
return (intr_event_bind(i->event, cpu));
}
#endif
Modified: head/sys/powerpc/powerpc/openpic.c
==============================================================================
--- head/sys/powerpc/powerpc/openpic.c Tue Jul 6 12:13:15 2010 (r209723)
+++ head/sys/powerpc/powerpc/openpic.c Tue Jul 6 15:27:05 2010 (r209724)
@@ -351,7 +351,6 @@ openpic_mask(device_t dev, u_int irq)
x |= OPENPIC_IMASK;
openpic_write(sc, OPENPIC_IPI_VECTOR(0), x);
}
- openpic_write(sc, OPENPIC_PCPU_EOI(PCPU_GET(cpuid)), 0);
}
void
More information about the svn-src-head
mailing list