diff --git a/sys/arm/arm/gic.c b/sys/arm/arm/gic.c index b1b7aacd63ab..ffce86e62128 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, uint32_t rootnum) +arm_gic_init_secondary(device_t dev, enum root_type root_type) { 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 7ed9dedaa77e..fd34ff8818ad 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, uint32_t rootnum) +bcm_lintc_init_secondary(device_t dev, enum root_type root_type) { u_int cpu; struct bcm_lintc_softc *sc; diff --git a/sys/arm/include/intr.h b/sys/arm/include/intr.h index d0d0ff9fc32a..e74be3ac548e 100644 --- a/sys/arm/include/intr.h +++ b/sys/arm/include/intr.h @@ -43,6 +43,12 @@ #include #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/gic_v3.c b/sys/arm64/arm64/gic_v3.c index 964a129111e2..750f734a7757 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, uint32_t rootnum) +gic_v3_init_secondary(device_t dev, enum root_type root_type) { struct gic_v3_setup_periph_args pargs; device_t child; @@ -1140,7 +1140,7 @@ gic_v3_init_secondary(device_t dev, uint32_t rootnum) for (i = 0; i < sc->gic_nchildren; i++) { child = sc->gic_children[i]; - PIC_INIT_SECONDARY(child, rootnum); + PIC_INIT_SECONDARY(child, root_type); } } diff --git a/sys/arm64/arm64/gicv3_its.c b/sys/arm64/arm64/gicv3_its.c index 5ecd9b8c0e94..31e23fc01224 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, uint32_t rootnum) +gicv3_its_init_secondary(device_t dev, enum root_type root_type) { struct gicv3_its_softc *sc; diff --git a/sys/arm64/include/intr.h b/sys/arm64/include/intr.h index 99b4d15ccc1c..008c377b7a16 100644 --- a/sys/arm64/include/intr.h +++ b/sys/arm64/include/intr.h @@ -31,6 +31,13 @@ #include #endif +enum root_type { + INTR_ROOT_IRQ = 0, + INTR_ROOT_FIQ = 1, + + INTR_ROOT_COUNT /* MUST BE LAST */ +}; + #include #ifndef NIRQ @@ -48,7 +55,4 @@ 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 f78e787594c5..2d938520b106 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, uint32_t rootnum) + null_pic_init_secondary(device_t dev, enum root_type root_type) { } @@ -157,7 +157,7 @@ METHOD void pre_ithread { METHOD void init_secondary { device_t dev; - uint32_t rootnum; + enum root_type root_type; } DEFAULT null_pic_init_secondary; METHOD void ipi_send { diff --git a/sys/kern/subr_intr.c b/sys/kern/subr_intr.c index a6052f28b04c..6b4ebd16675c 100644 --- a/sys/kern/subr_intr.c +++ b/sys/kern/subr_intr.c @@ -89,15 +89,6 @@ #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) @@ -115,7 +106,7 @@ struct intr_irq_root { void *arg; }; -static struct intr_irq_root intr_irq_roots[INTR_ROOT_NUM]; +static struct intr_irq_root intr_irq_roots[INTR_ROOT_COUNT]; struct intr_pic_child { SLIST_ENTRY(intr_pic_child) pc_next; @@ -337,16 +328,16 @@ isrc_release_counters(struct intr_irqsrc *isrc) * from the assembler, where CPU interrupt is served. */ void -intr_irq_handler(struct trapframe *tf, uint32_t rootnum) +intr_irq_handler(struct trapframe *tf, u_register_t root_type) { struct trapframe * oldframe; struct thread * td; struct intr_irq_root *root; - KASSERT(rootnum < INTR_ROOT_NUM, - ("%s: invalid interrupt root %d", __func__, rootnum)); + KASSERT((uintmax_t)root_type < INTR_ROOT_COUNT, + ("%s: invalid interrupt root %ju", __func__, (uintmax_t)root_type)); - root = &intr_irq_roots[rootnum]; + root = &intr_irq_roots[root_type]; KASSERT(root->filter != NULL, ("%s: no filter", __func__)); kasan_mark(tf, sizeof(*tf), sizeof(*tf), 0); @@ -495,11 +486,11 @@ isrc_free_irq(struct intr_irqsrc *isrc) } device_t -intr_irq_root_device(uint32_t rootnum) +intr_irq_root_device(enum root_type root_type) { - KASSERT(rootnum < INTR_ROOT_NUM, - ("%s: invalid interrupt root %d", __func__, rootnum)); - return (intr_irq_roots[rootnum].dev); + 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); } /* @@ -900,7 +891,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, uint32_t rootnum) + void *arg, enum root_type root_type) { struct intr_pic *pic; struct intr_irq_root *root; @@ -925,9 +916,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(rootnum < INTR_ROOT_NUM, - ("%s: invalid interrupt root %d", __func__, rootnum)); - root = &intr_irq_roots[rootnum]; + KASSERT((uintmax_t)root_type < INTR_ROOT_COUNT, + ("%s: invalid interrupt root %ju", __func__, (uintmax_t)root_type)); + root = &intr_irq_roots[root_type]; if (root->dev != NULL) { device_printf(dev, "another root already set\n"); return (EBUSY); @@ -1580,16 +1571,16 @@ void intr_pic_init_secondary(void) { device_t dev; - uint32_t rootnum; + enum root_type root_type; /* * QQQ: Only root PICs are aware of other CPUs ??? */ //mtx_lock(&isrc_table_lock); - for (rootnum = 0; rootnum < INTR_ROOT_NUM; rootnum++) { - dev = intr_irq_roots[rootnum].dev; + for (root_type = 0; root_type < INTR_ROOT_COUNT; root_type++) { + dev = intr_irq_roots[root_type].dev; if (dev != NULL) { - PIC_INIT_SECONDARY(dev, rootnum); + PIC_INIT_SECONDARY(dev, root_type); } } //mtx_unlock(&isrc_table_lock); diff --git a/sys/riscv/include/intr.h b/sys/riscv/include/intr.h index ad811dcbc449..8cbb07c6be24 100644 --- a/sys/riscv/include/intr.h +++ b/sys/riscv/include/intr.h @@ -35,6 +35,12 @@ #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 248175e8bea3..fcfc0c826fb9 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, uint32_t rootnum) +intc_init_secondary(device_t dev, enum root_type root_type) { struct intc_softc *sc; struct intr_irqsrc *isrc; diff --git a/sys/sys/intr.h b/sys/sys/intr.h index c1e440a9fa93..0208844e90c8 100644 --- a/sys/sys/intr.h +++ b/sys/sys/intr.h @@ -37,8 +37,6 @@ #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 +111,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 *, - uint32_t); + enum root_type); 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(uint32_t); +device_t intr_irq_root_device(enum root_type); /* Intr interface for BUS. */ @@ -166,7 +164,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 most archs except riscv. */ -void intr_irq_handler(struct trapframe *tf, uint32_t rootnum); +/* Main interrupt handler called from asm on many archs. */ +void intr_irq_handler(struct trapframe *tf, u_register_t root_type); #endif /* _SYS_INTR_H */