Module Name: src Committed By: yamt Date: Sat Nov 19 09:29:26 UTC 2022
Modified Files: src/sys/arch/arm/broadcom: bcm2835_intr.c Log Message: bcm2835_intr.c: fix !MULTIPROCESSOR Tested on Raspberry PI 3 model A+. To generate a diff of this commit: cvs rdiff -u -r1.43 -r1.44 src/sys/arch/arm/broadcom/bcm2835_intr.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/broadcom/bcm2835_intr.c diff -u src/sys/arch/arm/broadcom/bcm2835_intr.c:1.43 src/sys/arch/arm/broadcom/bcm2835_intr.c:1.44 --- src/sys/arch/arm/broadcom/bcm2835_intr.c:1.43 Sat Jun 25 12:41:55 2022 +++ src/sys/arch/arm/broadcom/bcm2835_intr.c Sat Nov 19 09:29:26 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm2835_intr.c,v 1.43 2022/06/25 12:41:55 jmcneill Exp $ */ +/* $NetBSD: bcm2835_intr.c,v 1.44 2022/11/19 09:29:26 yamt Exp $ */ /*- * Copyright (c) 2012, 2015, 2019 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bcm2835_intr.c,v 1.43 2022/06/25 12:41:55 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcm2835_intr.c,v 1.44 2022/11/19 09:29:26 yamt Exp $"); #define _INTR_PRIVATE @@ -99,7 +99,12 @@ static int bcm2835_icu_match(device_t, static void bcm2835_icu_attach(device_t, device_t, void *); static int bcm2835_int_base; -static int bcm2836mp_int_base[BCM2836_NCPUS]; +#if defined(MULTIPROCESSOR) +#define _BCM2836_NCPUS BCM2836_NCPUS +#else +#define _BCM2836_NCPUS 1 +#endif +static int bcm2836mp_int_base[_BCM2836_NCPUS]; #define BCM2835_INT_BASE bcm2835_int_base #define BCM2836_INT_BASECPUN(n) bcm2836mp_int_base[(n)] @@ -180,8 +185,8 @@ static struct pic_ops bcm2836mp_picops = #endif }; -static struct pic_softc bcm2836mp_pic[BCM2836_NCPUS] = { - [0 ... BCM2836_NCPUS - 1] = { +static struct pic_softc bcm2836mp_pic[_BCM2836_NCPUS] = { + [0 ... _BCM2836_NCPUS - 1] = { .pic_ops = &bcm2836mp_picops, .pic_maxsources = BCM2836_NIRQPERCPU, .pic_name = "bcm2836 pic", @@ -208,7 +213,7 @@ struct bcm2836mp_interrupt { int bi_flags; int (*bi_func)(void *); void *bi_arg; - void *bi_ihs[BCM2836_NCPUS]; + void *bi_ihs[_BCM2836_NCPUS]; }; static TAILQ_HEAD(, bcm2836mp_interrupt) bcm2836mp_interrupts = @@ -360,7 +365,6 @@ bcm2835_icu_attach(device_t parent, devi ifuncs = &bcm2836mpicu_fdt_funcs; -#if defined(MULTIPROCESSOR) /* * Register all PICs here in order to avoid pic_add() from * cpu_hatch(). This is the only approved method. @@ -371,8 +375,8 @@ bcm2835_icu_attach(device_t parent, devi const cpuid_t cpuid = ci->ci_core_id; struct pic_softc * const pic = &bcm2836mp_pic[cpuid]; - KASSERT(cpuid < BCM2836_NCPUS); - + KASSERT(cpuid < _BCM2836_NCPUS); +#if defined(MULTIPROCESSOR) pic->pic_cpus = ci->ci_kcpuset; /* * Append "#n" to avoid duplication of .pic_name[] @@ -381,12 +385,13 @@ bcm2835_icu_attach(device_t parent, devi char suffix[sizeof("#00000")]; snprintf(suffix, sizeof(suffix), "#%lu", cpuid); strlcat(pic->pic_name, suffix, sizeof(pic->pic_name)); - +#endif bcm2836mp_int_base[cpuid] = pic_add(pic, PIC_IRQBASE_ALLOC); +#if defined(MULTIPROCESSOR) bcm2836mp_intr_init(ci); - } #endif + } } else { if (bcml1icu_sc == NULL) arm_fdt_irq_set_handler(bcm2835_irq_handler); @@ -414,7 +419,7 @@ bcm2835_irq_handler(void *frame) const uint32_t oldipl_mask = __BIT(oldipl); int ipl_mask = 0; - KASSERT(cpuid < BCM2836_NCPUS); + KASSERT(cpuid < _BCM2836_NCPUS); ci->ci_data.cpu_nintr++; @@ -692,7 +697,7 @@ bcm2836mp_pic_unblock_irqs(struct pic_so const bus_space_handle_t ioh = bcml1icu_sc->sc_ioh; const cpuid_t cpuid = pic - &bcm2836mp_pic[0]; - KASSERT(cpuid < BCM2836_NCPUS); + KASSERT(cpuid < _BCM2836_NCPUS); KASSERT(irqbase == 0); if (irq_mask & BCM2836MP_TIMER_IRQS) { @@ -739,7 +744,7 @@ bcm2836mp_pic_block_irqs(struct pic_soft const bus_space_handle_t ioh = bcml1icu_sc->sc_ioh; const cpuid_t cpuid = pic - &bcm2836mp_pic[0]; - KASSERT(cpuid < BCM2836_NCPUS); + KASSERT(cpuid < _BCM2836_NCPUS); KASSERT(irqbase == 0); if (irq_mask & BCM2836MP_TIMER_IRQS) { @@ -777,7 +782,7 @@ bcm2836mp_pic_find_pending_irqs(struct p uint32_t lpending; int ipl = 0; - KASSERT(cpuid < BCM2836_NCPUS); + KASSERT(cpuid < _BCM2836_NCPUS); KASSERT(pic == &bcm2836mp_pic[cpuid]); bcm2835_barrier(); @@ -816,7 +821,7 @@ static void bcm2836mp_cpu_init(struct pi { const cpuid_t cpuid = ci->ci_core_id; - KASSERT(cpuid < BCM2836_NCPUS); + KASSERT(cpuid < _BCM2836_NCPUS); /* Enable IRQ and not FIQ */ bus_space_write_4(bcml1icu_sc->sc_iot, bcml1icu_sc->sc_ioh, @@ -831,7 +836,7 @@ bcm2836mp_send_ipi(struct pic_softc *pic KASSERT(pic->pic_cpus != NULL); const cpuid_t cpuid = pic - &bcm2836mp_pic[0]; - KASSERT(cpuid < BCM2836_NCPUS); + KASSERT(cpuid < _BCM2836_NCPUS); bus_space_write_4(bcml1icu_sc->sc_iot, bcml1icu_sc->sc_ioh, BCM2836_LOCAL_MAILBOX0_SETN(cpuid), __BIT(ipi)); @@ -844,7 +849,7 @@ bcm2836mp_ipi_handler(void *priv) const cpuid_t cpuid = ci->ci_core_id; uint32_t ipimask, bit; - KASSERT(cpuid < BCM2836_NCPUS); + KASSERT(cpuid < _BCM2836_NCPUS); ipimask = bus_space_read_4(bcml1icu_sc->sc_iot, bcml1icu_sc->sc_ioh, BCM2836_LOCAL_MAILBOX0_CLRN(cpuid)); @@ -893,7 +898,7 @@ bcm2836mp_intr_init(struct cpu_info *ci) { const cpuid_t cpuid = ci->ci_core_id; - KASSERT(cpuid < BCM2836_NCPUS); + KASSERT(cpuid < _BCM2836_NCPUS); intr_establish(BCM2836_INT_MAILBOX0_CPUN(cpuid), IPL_HIGH, IST_LEVEL | IST_MPSAFE, bcm2836mp_ipi_handler, ci); @@ -919,8 +924,8 @@ bcm2836mp_icu_fdt_establish(device_t dev if (irq == -1) return NULL; - void *ihs[BCM2836_NCPUS]; - for (cpuid_t cpuid = 0; cpuid < BCM2836_NCPUS; cpuid++) { + void *ihs[_BCM2836_NCPUS]; + for (cpuid_t cpuid = 0; cpuid < _BCM2836_NCPUS; cpuid++) { const int cpuirq = BCM2836_INT_BASECPUN(cpuid) + irq; ihs[cpuid] = intr_establish_xname(cpuirq, ipl, IST_LEVEL | iflags, func, arg, xname);