diff options
author | nwhitehorn <nwhitehorn@FreeBSD.org> | 2012-01-15 18:26:43 +0000 |
---|---|---|
committer | nwhitehorn <nwhitehorn@FreeBSD.org> | 2012-01-15 18:26:43 +0000 |
commit | 4371f8aebb7e829b24e1c2298abd87259f35148d (patch) | |
tree | 0a77bdf5810e51a65b5c6e0f833ebfe5b9da4aa7 | |
parent | 262107130996e0ed96134f31a40f5b371b0af705 (diff) | |
download | FreeBSD-src-4371f8aebb7e829b24e1c2298abd87259f35148d.zip FreeBSD-src-4371f8aebb7e829b24e1c2298abd87259f35148d.tar.gz |
Pick a constant high IRQ value for the PS3 IPI, which lets PS3 devices be
usefully loaded and unloaded as modules.
Submitted by: geoffrey dot levand at mail dot ru
MFC after: 2 weeks
-rw-r--r-- | sys/powerpc/ps3/ps3pic.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/sys/powerpc/ps3/ps3pic.c b/sys/powerpc/ps3/ps3pic.c index c9b5c0e..9b40f6c 100644 --- a/sys/powerpc/ps3/ps3pic.c +++ b/sys/powerpc/ps3/ps3pic.c @@ -62,6 +62,7 @@ struct ps3pic_softc { volatile uint64_t *mask_thread1; uint64_t sc_ipi_outlet[2]; + uint64_t sc_ipi_virq; int sc_vector[64]; }; @@ -131,22 +132,23 @@ ps3pic_attach(device_t dev) thread = 32 - fls(mfctrl()); lv1_configure_irq_state_bitmap(ppe, thread, vtophys(sc->bitmap_thread0)); + + sc->sc_ipi_virq = 63; + #ifdef SMP lv1_configure_irq_state_bitmap(ppe, !thread, vtophys(sc->bitmap_thread1)); /* Map both IPIs to the same VIRQ to avoid changes in intr_machdep */ lv1_construct_event_receive_port(&sc->sc_ipi_outlet[0]); - lv1_connect_irq_plug_ext(ppe, thread, sc->sc_ipi_outlet[0], + lv1_connect_irq_plug_ext(ppe, thread, sc->sc_ipi_virq, sc->sc_ipi_outlet[0], 0); lv1_construct_event_receive_port(&sc->sc_ipi_outlet[1]); - lv1_connect_irq_plug_ext(ppe, !thread, sc->sc_ipi_outlet[0], + lv1_connect_irq_plug_ext(ppe, !thread, sc->sc_ipi_virq, sc->sc_ipi_outlet[1], 0); -#else - sc->sc_ipi_outlet[0] = sc->sc_ipi_outlet[1] = 63; #endif - powerpc_register_pic(dev, 0, sc->sc_ipi_outlet[0], 1, FALSE); + powerpc_register_pic(dev, 0, sc->sc_ipi_virq, 1, FALSE); return (0); } @@ -218,7 +220,7 @@ ps3pic_mask(device_t dev, u_int irq) sc = device_get_softc(dev); /* Do not mask IPIs! */ - if (irq == sc->sc_ipi_outlet[0]) + if (irq == sc->sc_ipi_virq) return; atomic_clear_64(&sc->mask_thread0[0], 1UL << (63 - irq)); |