aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2024-10-25 21:18:32 +0000
committerKyle Evans <kevans@FreeBSD.org>2024-10-25 21:18:40 +0000
commit4b01a7fa76ce5abd0ade631ac5566804ba657090 (patch)
treee8f70230e9b0f6443843d21ba9d0ad369ed49932
parentd8cd2d0833e0e8d6f41fcf481ea27a21358b21d2 (diff)
downloadsrc-4b01a7fa76ce5abd0ade631ac5566804ba657090.tar.gz
src-4b01a7fa76ce5abd0ade631ac5566804ba657090.zip
Revert "intrng: change multi-interrupt root support type to enum"
This reverts commit 536c8d948e8563141356fd41fb8bfe65be289385. The change seemed fine on the surface, but converting to an enum has raised some concerns due to the asm <-> C interface. Back it out and let someone else deal with it later if they'd like to. Further context about the concerns can be found in D47279.
-rw-r--r--sys/arm/arm/genassym.c4
-rw-r--r--sys/arm/arm/gic.c2
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2836.c2
-rw-r--r--sys/arm/include/intr.h6
-rw-r--r--sys/arm64/arm64/genassym.c2
-rw-r--r--sys/arm64/arm64/gic_v3.c4
-rw-r--r--sys/arm64/arm64/gicv3_its.c2
-rw-r--r--sys/arm64/include/intr.h10
-rw-r--r--sys/kern/pic_if.m4
-rw-r--r--sys/kern/subr_intr.c43
-rw-r--r--sys/riscv/include/intr.h6
-rw-r--r--sys/riscv/riscv/intc.c2
-rw-r--r--sys/sys/intr.h10
13 files changed, 46 insertions, 51 deletions
diff --git a/sys/arm/arm/genassym.c b/sys/arm/arm/genassym.c
index 2cf1861b1178..9d6232739022 100644
--- a/sys/arm/arm/genassym.c
+++ b/sys/arm/arm/genassym.c
@@ -28,14 +28,15 @@
*/
#include <sys/param.h>
+#include <sys/bus.h>
#include <sys/cpuset.h>
#include <sys/systm.h>
#include <sys/assym.h>
+#include <sys/intr.h>
#include <sys/pcpu.h>
#include <sys/proc.h>
#include <sys/mbuf.h>
#include <sys/vmmeter.h>
-#include <sys/bus.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
#include <vm/pmap.h>
@@ -48,7 +49,6 @@
#include <machine/proc.h>
#include <machine/cpufunc.h>
#include <machine/cpuinfo.h>
-#include <machine/intr.h>
#include <machine/sysarch.h>
#include <machine/vmparam.h> /* For KERNVIRTADDR */
diff --git a/sys/arm/arm/gic.c b/sys/arm/arm/gic.c
index ffce86e62128..b1b7aacd63ab 100644
--- a/sys/arm/arm/gic.c
+++ b/sys/arm/arm/gic.c
@@ -200,7 +200,7 @@ gic_cpu_mask(struct arm_gic_softc *sc)
#ifdef SMP
static void
-arm_gic_init_secondary(device_t dev, enum root_type root_type)
+arm_gic_init_secondary(device_t dev, uint32_t rootnum)
{
struct arm_gic_softc *sc = device_get_softc(dev);
u_int irq, cpu;
diff --git a/sys/arm/broadcom/bcm2835/bcm2836.c b/sys/arm/broadcom/bcm2835/bcm2836.c
index fd34ff8818ad..7ed9dedaa77e 100644
--- a/sys/arm/broadcom/bcm2835/bcm2836.c
+++ b/sys/arm/broadcom/bcm2835/bcm2836.c
@@ -538,7 +538,7 @@ bcm_lintc_init_pmu_on_ap(struct bcm_lintc_softc *sc, u_int cpu)
}
static void
-bcm_lintc_init_secondary(device_t dev, enum root_type root_type)
+bcm_lintc_init_secondary(device_t dev, uint32_t rootnum)
{
u_int cpu;
struct bcm_lintc_softc *sc;
diff --git a/sys/arm/include/intr.h b/sys/arm/include/intr.h
index 32297f656392..e64edd47dad2 100644
--- a/sys/arm/include/intr.h
+++ b/sys/arm/include/intr.h
@@ -43,12 +43,6 @@
#include <dev/ofw/openfirm.h>
#endif
-enum root_type {
- INTR_ROOT_IRQ = 0,
-
- INTR_ROOT_COUNT /* MUST BE LAST */
-};
-
#ifndef NIRQ
#define NIRQ 1024 /* XXX - It should be an option. */
#endif
diff --git a/sys/arm64/arm64/genassym.c b/sys/arm64/arm64/genassym.c
index 8612d2eda309..3ca712ca3de3 100644
--- a/sys/arm64/arm64/genassym.c
+++ b/sys/arm64/arm64/genassym.c
@@ -29,12 +29,12 @@
#include <sys/param.h>
#include <sys/assym.h>
#include <sys/bus.h>
+#include <sys/intr.h>
#include <sys/pcpu.h>
#include <sys/proc.h>
#include <machine/efi.h>
#include <machine/frame.h>
-#include <machine/intr.h>
#include <machine/machdep.h>
#include <machine/pcb.h>
diff --git a/sys/arm64/arm64/gic_v3.c b/sys/arm64/arm64/gic_v3.c
index 750f734a7757..964a129111e2 100644
--- a/sys/arm64/arm64/gic_v3.c
+++ b/sys/arm64/arm64/gic_v3.c
@@ -1093,7 +1093,7 @@ gic_v3_bind_intr(device_t dev, struct intr_irqsrc *isrc)
#ifdef SMP
static void
-gic_v3_init_secondary(device_t dev, enum root_type root_type)
+gic_v3_init_secondary(device_t dev, uint32_t rootnum)
{
struct gic_v3_setup_periph_args pargs;
device_t child;
@@ -1140,7 +1140,7 @@ gic_v3_init_secondary(device_t dev, enum root_type root_type)
for (i = 0; i < sc->gic_nchildren; i++) {
child = sc->gic_children[i];
- PIC_INIT_SECONDARY(child, root_type);
+ PIC_INIT_SECONDARY(child, rootnum);
}
}
diff --git a/sys/arm64/arm64/gicv3_its.c b/sys/arm64/arm64/gicv3_its.c
index 31e23fc01224..5ecd9b8c0e94 100644
--- a/sys/arm64/arm64/gicv3_its.c
+++ b/sys/arm64/arm64/gicv3_its.c
@@ -1293,7 +1293,7 @@ gicv3_its_setup_intr(device_t dev, struct intr_irqsrc *isrc,
#ifdef SMP
static void
-gicv3_its_init_secondary(device_t dev, enum root_type root_type)
+gicv3_its_init_secondary(device_t dev, uint32_t rootnum)
{
struct gicv3_its_softc *sc;
diff --git a/sys/arm64/include/intr.h b/sys/arm64/include/intr.h
index c3fe5edc8a6c..38cba6ae8b0d 100644
--- a/sys/arm64/include/intr.h
+++ b/sys/arm64/include/intr.h
@@ -31,13 +31,6 @@
#include <dev/ofw/openfirm.h>
#endif
-enum root_type {
- INTR_ROOT_IRQ = 0,
- INTR_ROOT_FIQ = 1,
-
- INTR_ROOT_COUNT /* MUST BE LAST */
-};
-
#ifndef NIRQ
#define NIRQ 16384 /* XXX - It should be an option. */
#endif
@@ -53,4 +46,7 @@ arm_irq_memory_barrier(uintptr_t irq)
#define ACPI_GPIO_XREF 3
#endif
+#define INTR_ROOT_FIQ 1
+#define INTR_ROOT_NUM 2
+
#endif /* _MACHINE_INTR_H */
diff --git a/sys/kern/pic_if.m b/sys/kern/pic_if.m
index 2d938520b106..f78e787594c5 100644
--- a/sys/kern/pic_if.m
+++ b/sys/kern/pic_if.m
@@ -74,7 +74,7 @@ CODE {
}
static void
- null_pic_init_secondary(device_t dev, enum root_type root_type)
+ null_pic_init_secondary(device_t dev, uint32_t rootnum)
{
}
@@ -157,7 +157,7 @@ METHOD void pre_ithread {
METHOD void init_secondary {
device_t dev;
- enum root_type root_type;
+ uint32_t rootnum;
} DEFAULT null_pic_init_secondary;
METHOD void ipi_send {
diff --git a/sys/kern/subr_intr.c b/sys/kern/subr_intr.c
index e88018e58729..b8d85bf20f28 100644
--- a/sys/kern/subr_intr.c
+++ b/sys/kern/subr_intr.c
@@ -89,6 +89,15 @@
#define INTRNAME_LEN (2*MAXCOMLEN + 1)
+/*
+ * Archs may define multiple roots with INTR_ROOT_NUM to support different kinds
+ * of interrupts (e.g. arm64 FIQs which use a different exception vector than
+ * IRQs).
+ */
+#if !defined(INTR_ROOT_NUM)
+#define INTR_ROOT_NUM 1
+#endif
+
#ifdef DEBUG
#define debugf(fmt, args...) do { printf("%s(): ", __func__); \
printf(fmt,##args); } while (0)
@@ -106,7 +115,7 @@ struct intr_irq_root {
void *arg;
};
-static struct intr_irq_root intr_irq_roots[INTR_ROOT_COUNT];
+static struct intr_irq_root intr_irq_roots[INTR_ROOT_NUM];
struct intr_pic_child {
SLIST_ENTRY(intr_pic_child) pc_next;
@@ -328,16 +337,16 @@ isrc_release_counters(struct intr_irqsrc *isrc)
* from the assembler, where CPU interrupt is served.
*/
void
-intr_irq_handler(struct trapframe *tf, u_register_t root_type)
+intr_irq_handler(struct trapframe *tf, uint32_t rootnum)
{
struct trapframe * oldframe;
struct thread * td;
struct intr_irq_root *root;
- KASSERT((uintmax_t)root_type < INTR_ROOT_COUNT,
- ("%s: invalid interrupt root %ju", __func__, (uintmax_t)root_type));
+ KASSERT(rootnum < INTR_ROOT_NUM,
+ ("%s: invalid interrupt root %d", __func__, rootnum));
- root = &intr_irq_roots[root_type];
+ root = &intr_irq_roots[rootnum];
KASSERT(root->filter != NULL, ("%s: no filter", __func__));
kasan_mark(tf, sizeof(*tf), sizeof(*tf), 0);
@@ -486,11 +495,11 @@ isrc_free_irq(struct intr_irqsrc *isrc)
}
device_t
-intr_irq_root_device(enum root_type root_type)
+intr_irq_root_device(uint32_t rootnum)
{
- KASSERT((uintmax_t)root_type < INTR_ROOT_COUNT,
- ("%s: invalid interrupt root %ju", __func__, (uintmax_t)root_type));
- return (intr_irq_roots[root_type].dev);
+ KASSERT(rootnum < INTR_ROOT_NUM,
+ ("%s: invalid interrupt root %d", __func__, rootnum));
+ return (intr_irq_roots[rootnum].dev);
}
/*
@@ -891,7 +900,7 @@ intr_pic_deregister(device_t dev, intptr_t xref)
*/
int
intr_pic_claim_root(device_t dev, intptr_t xref, intr_irq_filter_t *filter,
- void *arg, enum root_type root_type)
+ void *arg, uint32_t rootnum)
{
struct intr_pic *pic;
struct intr_irq_root *root;
@@ -916,9 +925,9 @@ intr_pic_claim_root(device_t dev, intptr_t xref, intr_irq_filter_t *filter,
* Note that we further suppose that there is not threaded interrupt
* routine (handler) on the root. See intr_irq_handler().
*/
- KASSERT((uintmax_t)root_type < INTR_ROOT_COUNT,
- ("%s: invalid interrupt root %ju", __func__, (uintmax_t)root_type));
- root = &intr_irq_roots[root_type];
+ KASSERT(rootnum < INTR_ROOT_NUM,
+ ("%s: invalid interrupt root %d", __func__, rootnum));
+ root = &intr_irq_roots[rootnum];
if (root->dev != NULL) {
device_printf(dev, "another root already set\n");
return (EBUSY);
@@ -1571,16 +1580,16 @@ void
intr_pic_init_secondary(void)
{
device_t dev;
- enum root_type root_type;
+ uint32_t rootnum;
/*
* QQQ: Only root PICs are aware of other CPUs ???
*/
//mtx_lock(&isrc_table_lock);
- for (root_type = 0; root_type < INTR_ROOT_COUNT; root_type++) {
- dev = intr_irq_roots[root_type].dev;
+ for (rootnum = 0; rootnum < INTR_ROOT_NUM; rootnum++) {
+ dev = intr_irq_roots[rootnum].dev;
if (dev != NULL) {
- PIC_INIT_SECONDARY(dev, root_type);
+ PIC_INIT_SECONDARY(dev, rootnum);
}
}
//mtx_unlock(&isrc_table_lock);
diff --git a/sys/riscv/include/intr.h b/sys/riscv/include/intr.h
index 100f1ba40ff3..657781efb620 100644
--- a/sys/riscv/include/intr.h
+++ b/sys/riscv/include/intr.h
@@ -35,12 +35,6 @@
#ifndef _MACHINE_INTR_MACHDEP_H_
#define _MACHINE_INTR_MACHDEP_H_
-enum root_type {
- INTR_ROOT_IRQ = 0,
-
- INTR_ROOT_COUNT /* MUST BE LAST */
-};
-
#ifndef NIRQ
#define NIRQ 1024
#endif
diff --git a/sys/riscv/riscv/intc.c b/sys/riscv/riscv/intc.c
index fcfc0c826fb9..248175e8bea3 100644
--- a/sys/riscv/riscv/intc.c
+++ b/sys/riscv/riscv/intc.c
@@ -241,7 +241,7 @@ intc_setup_intr(device_t dev, struct intr_irqsrc *isrc,
#ifdef SMP
static void
-intc_init_secondary(device_t dev, enum root_type root_type)
+intc_init_secondary(device_t dev, uint32_t rootnum)
{
struct intc_softc *sc;
struct intr_irqsrc *isrc;
diff --git a/sys/sys/intr.h b/sys/sys/intr.h
index f612fc2744f1..f11e96777927 100644
--- a/sys/sys/intr.h
+++ b/sys/sys/intr.h
@@ -39,6 +39,8 @@
#define INTR_IRQ_INVALID 0xFFFFFFFF
+#define INTR_ROOT_IRQ 0
+
enum intr_map_data_type {
INTR_MAP_DATA_ACPI = 0,
INTR_MAP_DATA_FDT,
@@ -113,12 +115,12 @@ u_int intr_irq_next_cpu(u_int current_cpu, cpuset_t *cpumask);
struct intr_pic *intr_pic_register(device_t, intptr_t);
int intr_pic_deregister(device_t, intptr_t);
int intr_pic_claim_root(device_t, intptr_t, intr_irq_filter_t *, void *,
- enum root_type);
+ uint32_t);
int intr_pic_add_handler(device_t, struct intr_pic *,
intr_child_irq_filter_t *, void *, uintptr_t, uintptr_t);
bool intr_is_per_cpu(struct resource *);
-device_t intr_irq_root_device(enum root_type);
+device_t intr_irq_root_device(uint32_t);
/* Intr interface for BUS. */
@@ -166,7 +168,7 @@ void intr_ipi_send(cpuset_t cpus, u_int ipi);
void intr_ipi_dispatch(u_int ipi);
#endif
-/* Main interrupt handler called from asm on many archs. */
-void intr_irq_handler(struct trapframe *tf, u_register_t root_type);
+/* Main interrupt handler called from asm on most archs except riscv. */
+void intr_irq_handler(struct trapframe *tf, uint32_t rootnum);
#endif /* _SYS_INTR_H */