git: 4b01a7fa76ce - main - Revert "intrng: change multi-interrupt root support type to enum"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 25 Oct 2024 21:18:57 UTC
The branch main has been updated by kevans: URL: https://cgit.FreeBSD.org/src/commit/?id=4b01a7fa76ce5abd0ade631ac5566804ba657090 commit 4b01a7fa76ce5abd0ade631ac5566804ba657090 Author: Kyle Evans <kevans@FreeBSD.org> AuthorDate: 2024-10-25 21:18:32 +0000 Commit: Kyle Evans <kevans@FreeBSD.org> CommitDate: 2024-10-25 21:18:40 +0000 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. --- sys/arm/arm/genassym.c | 4 ++-- sys/arm/arm/gic.c | 2 +- sys/arm/broadcom/bcm2835/bcm2836.c | 2 +- sys/arm/include/intr.h | 6 ------ sys/arm64/arm64/genassym.c | 2 +- sys/arm64/arm64/gic_v3.c | 4 ++-- sys/arm64/arm64/gicv3_its.c | 2 +- sys/arm64/include/intr.h | 10 +++------ sys/kern/pic_if.m | 4 ++-- sys/kern/subr_intr.c | 43 +++++++++++++++++++++++--------------- sys/riscv/include/intr.h | 6 ------ sys/riscv/riscv/intc.c | 2 +- sys/sys/intr.h | 10 +++++---- 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 */