aboutsummaryrefslogtreecommitdiff
path: root/sys/powerpc
diff options
context:
space:
mode:
authorJustin Hibbits <jhibbits@FreeBSD.org>2026-04-30 00:13:11 +0000
committerJustin Hibbits <jhibbits@FreeBSD.org>2026-04-30 00:13:48 +0000
commit605f53705d6dc57ed391353cecf3ce84a4283740 (patch)
tree8cb4e9d64ec8410773600c367ac642c8e8306a27 /sys/powerpc
parent40bcad56f1b8b3a0eed9af68de5535a784c004d9 (diff)
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/include/openpicreg.h2
-rw-r--r--sys/powerpc/include/openpicvar.h3
-rw-r--r--sys/powerpc/powerpc/openpic.c10
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);
}