diff options
| author | Justin Hibbits <jhibbits@FreeBSD.org> | 2026-04-30 00:13:11 +0000 |
|---|---|---|
| committer | Justin Hibbits <jhibbits@FreeBSD.org> | 2026-04-30 00:13:48 +0000 |
| commit | 605f53705d6dc57ed391353cecf3ce84a4283740 (patch) | |
| tree | 8cb4e9d64ec8410773600c367ac642c8e8306a27 /sys/powerpc | |
| parent | 40bcad56f1b8b3a0eed9af68de5535a784c004d9 (diff) | |
Diffstat (limited to 'sys/powerpc')
| -rw-r--r-- | sys/powerpc/include/openpicreg.h | 2 | ||||
| -rw-r--r-- | sys/powerpc/include/openpicvar.h | 3 | ||||
| -rw-r--r-- | sys/powerpc/powerpc/openpic.c | 10 |
3 files changed, 11 insertions, 4 deletions
diff --git a/sys/powerpc/include/openpicreg.h b/sys/powerpc/include/openpicreg.h index 16f0295469e2..03c259d115b5 100644 --- a/sys/powerpc/include/openpicreg.h +++ b/sys/powerpc/include/openpicreg.h @@ -112,7 +112,7 @@ #define OPENPIC_ACTIVITY 0x40000000 #define OPENPIC_PRIORITY_MASK 0x000f0000 #define OPENPIC_PRIORITY_SHIFT 16 -#define OPENPIC_VECTOR_MASK 0x000000ff +#define OPENPIC_VECTOR_MASK 0x0000ffff /* interrupt destination cpu */ #ifndef OPENPIC_IDEST diff --git a/sys/powerpc/include/openpicvar.h b/sys/powerpc/include/openpicvar.h index 12f01cb80406..4f086f809f08 100644 --- a/sys/powerpc/include/openpicvar.h +++ b/sys/powerpc/include/openpicvar.h @@ -32,7 +32,7 @@ #define OPENPIC_DEVSTR "OpenPIC Interrupt Controller" -#define OPENPIC_IRQMAX 256 /* h/w allows more */ +#define OPENPIC_IRQMAX 512 /* h/w allows more */ #define OPENPIC_QUIRK_SINGLE_BIND 1 /* Bind interrupts to only 1 CPU */ #define OPENPIC_QUIRK_HIDDEN_IRQS 2 /* May have IRQs beyond FRR[NIRQ] */ @@ -59,6 +59,7 @@ struct openpic_softc { u_int sc_nirq; int sc_psim; u_int sc_quirks; + uint32_t sc_vec_mask; /* Saved states. */ uint32_t sc_saved_config; diff --git a/sys/powerpc/powerpc/openpic.c b/sys/powerpc/powerpc/openpic.c index bdd59407e3d4..3cb4c544a91a 100644 --- a/sys/powerpc/powerpc/openpic.c +++ b/sys/powerpc/powerpc/openpic.c @@ -151,6 +151,12 @@ openpic_common_attach(device_t dev, uint32_t node) OPENPIC_FEATURE_LAST_CPU_SHIFT) + 1; sc->sc_nirq = ((x & OPENPIC_FEATURE_LAST_IRQ_MASK) >> OPENPIC_FEATURE_LAST_IRQ_SHIFT) + 1; + /* + * Generate the vector mask used for IACK. + * Some PICs may not support the full 11 bit vector width, so clamp the + * mask to only the next-power-of-2 from the max IRQ. + */ + sc->sc_vec_mask = (1 << fls(sc->sc_nirq)) - 1; /* * PSIM seems to report 1 too many IRQs and CPUs @@ -294,8 +300,8 @@ openpic_dispatch(device_t dev, struct trapframe *tf) while (1) { vector = openpic_read(sc, OPENPIC_PCPU_IACK(cpuid)); - vector &= OPENPIC_VECTOR_MASK; - if (vector == 255) + vector &= sc->sc_vec_mask; + if (vector == sc->sc_vec_mask) break; powerpc_dispatch_intr(vector, tf); } |
