Module Name: src Committed By: jmcneill Date: Sat Jun 25 12:41:56 UTC 2022
Modified Files: src/sys/arch/aarch64/include: cpu.h src/sys/arch/arm/broadcom: bcm2835_intr.c src/sys/arch/arm/cortex: gic.c gicv3.c src/sys/arch/arm/imx: imx23_icoll.c src/sys/arch/arm/include: cpu.h src/sys/arch/arm/marvell: armadaxp.c src/sys/arch/arm/pic: pic.c src/sys/arch/arm/sunxi: sunxi_intc.c Log Message: pic: Update ci_cpl in pic_set_priority callback. Not all ICs need interrupts disabled to update the priority. DAIF accesses are not cheap, so push the update of ci_cpl from pic_set_priority to the IC's pic_set_priority callback, and let the IC driver determine whether or not it needs interrupts disabled. To generate a diff of this commit: cvs rdiff -u -r1.45 -r1.46 src/sys/arch/aarch64/include/cpu.h cvs rdiff -u -r1.42 -r1.43 src/sys/arch/arm/broadcom/bcm2835_intr.c cvs rdiff -u -r1.53 -r1.54 src/sys/arch/arm/cortex/gic.c cvs rdiff -u -r1.50 -r1.51 src/sys/arch/arm/cortex/gicv3.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/imx/imx23_icoll.c cvs rdiff -u -r1.122 -r1.123 src/sys/arch/arm/include/cpu.h cvs rdiff -u -r1.25 -r1.26 src/sys/arch/arm/marvell/armadaxp.c cvs rdiff -u -r1.79 -r1.80 src/sys/arch/arm/pic/pic.c cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/sunxi/sunxi_intc.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/aarch64/include/cpu.h diff -u src/sys/arch/aarch64/include/cpu.h:1.45 src/sys/arch/aarch64/include/cpu.h:1.46 --- src/sys/arch/aarch64/include/cpu.h:1.45 Tue Nov 2 11:26:03 2021 +++ src/sys/arch/aarch64/include/cpu.h Sat Jun 25 12:41:56 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.45 2021/11/02 11:26:03 ryo Exp $ */ +/* $NetBSD: cpu.h,v 1.46 2022/06/25 12:41:56 jmcneill Exp $ */ /*- * Copyright (c) 2014, 2020 The NetBSD Foundation, Inc. @@ -128,7 +128,7 @@ struct cpu_info { int ci_mtx_count; int ci_cpl; /* current processor level (spl) */ - int ci_hwpl; /* current hardware priority */ + volatile int ci_hwpl; /* current hardware priority */ volatile u_int ci_softints; volatile u_int ci_intr_depth; volatile uint32_t ci_blocked_pics; Index: src/sys/arch/arm/broadcom/bcm2835_intr.c diff -u src/sys/arch/arm/broadcom/bcm2835_intr.c:1.42 src/sys/arch/arm/broadcom/bcm2835_intr.c:1.43 --- src/sys/arch/arm/broadcom/bcm2835_intr.c:1.42 Sun Oct 31 16:23:47 2021 +++ src/sys/arch/arm/broadcom/bcm2835_intr.c Sat Jun 25 12:41:55 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm2835_intr.c,v 1.42 2021/10/31 16:23:47 skrll Exp $ */ +/* $NetBSD: bcm2835_intr.c,v 1.43 2022/06/25 12:41:55 jmcneill 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.42 2021/10/31 16:23:47 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcm2835_intr.c,v 1.43 2022/06/25 12:41:55 jmcneill Exp $"); #define _INTR_PRIVATE @@ -150,6 +150,7 @@ static int bcm2836mp_int_base[BCM2836_NC static void bcm2835_set_priority(struct pic_softc *pic, int ipl) { + curcpu()->ci_cpl = ipl; } static struct pic_ops bcm2835_picops = { Index: src/sys/arch/arm/cortex/gic.c diff -u src/sys/arch/arm/cortex/gic.c:1.53 src/sys/arch/arm/cortex/gic.c:1.54 --- src/sys/arch/arm/cortex/gic.c:1.53 Thu Mar 3 06:26:28 2022 +++ src/sys/arch/arm/cortex/gic.c Sat Jun 25 12:41:55 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: gic.c,v 1.53 2022/03/03 06:26:28 riastradh Exp $ */ +/* $NetBSD: gic.c,v 1.54 2022/06/25 12:41:55 jmcneill Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -35,7 +35,7 @@ #define _INTR_PRIVATE #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gic.c,v 1.53 2022/03/03 06:26:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gic.c,v 1.54 2022/06/25 12:41:55 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -229,11 +229,14 @@ armgic_set_priority(struct pic_softc *pi struct armgic_softc * const sc = PICTOSOFTC(pic); struct cpu_info * const ci = curcpu(); - if (ipl < ci->ci_hwpl) { + while (ipl < ci->ci_hwpl) { /* Lowering priority mask */ ci->ci_hwpl = ipl; + __insn_barrier(); gicc_write(sc, GICC_PMR, armgic_ipl_to_priority(ipl)); } + __insn_barrier(); + ci->ci_cpl = ipl; } #ifdef MULTIPROCESSOR Index: src/sys/arch/arm/cortex/gicv3.c diff -u src/sys/arch/arm/cortex/gicv3.c:1.50 src/sys/arch/arm/cortex/gicv3.c:1.51 --- src/sys/arch/arm/cortex/gicv3.c:1.50 Mon Mar 28 19:59:35 2022 +++ src/sys/arch/arm/cortex/gicv3.c Sat Jun 25 12:41:55 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: gicv3.c,v 1.50 2022/03/28 19:59:35 riastradh Exp $ */ +/* $NetBSD: gicv3.c,v 1.51 2022/06/25 12:41:55 jmcneill Exp $ */ /*- * Copyright (c) 2018 Jared McNeill <jmcne...@invisible.ca> @@ -32,7 +32,7 @@ #define _INTR_PRIVATE #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gicv3.c,v 1.50 2022/03/28 19:59:35 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gicv3.c,v 1.51 2022/06/25 12:41:55 jmcneill Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -237,11 +237,14 @@ gicv3_set_priority(struct pic_softc *pic struct gicv3_softc * const sc = PICTOSOFTC(pic); struct cpu_info * const ci = curcpu(); - if (ipl < ci->ci_hwpl) { + while (ipl < ci->ci_hwpl) { /* Lowering priority mask */ ci->ci_hwpl = ipl; + __insn_barrier(); icc_pmr_write(IPL_TO_PMR(sc, ipl)); } + __insn_barrier(); + ci->ci_cpl = ipl; } static void Index: src/sys/arch/arm/imx/imx23_icoll.c diff -u src/sys/arch/arm/imx/imx23_icoll.c:1.3 src/sys/arch/arm/imx/imx23_icoll.c:1.4 --- src/sys/arch/arm/imx/imx23_icoll.c:1.3 Tue Feb 25 08:39:39 2014 +++ src/sys/arch/arm/imx/imx23_icoll.c Sat Jun 25 12:41:56 2022 @@ -1,4 +1,4 @@ -/* $Id: imx23_icoll.c,v 1.3 2014/02/25 08:39:39 martin Exp $ */ +/* $Id: imx23_icoll.c,v 1.4 2022/06/25 12:41:56 jmcneill Exp $ */ /* * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -251,6 +251,8 @@ icoll_set_priority(struct pic_softc *pic struct intrsource *is; int i; + register_t psw = DISABLE_INTERRUPT_SAVE(); + for (i = 0; i < pic->pic_maxsources; i++) { is = pic->pic_sources[i]; if (is == NULL) @@ -260,6 +262,12 @@ icoll_set_priority(struct pic_softc *pic else ICOLL_CLR_IRQ(sc, pic->pic_irqbase + is->is_irq); } + + curcpu()->ci_cpl = newipl; + + if ((psw & I32_bit) == 0) { + ENABLE_INTERRUPT(); + } } /* Index: src/sys/arch/arm/include/cpu.h diff -u src/sys/arch/arm/include/cpu.h:1.122 src/sys/arch/arm/include/cpu.h:1.123 --- src/sys/arch/arm/include/cpu.h:1.122 Sat Dec 18 16:41:37 2021 +++ src/sys/arch/arm/include/cpu.h Sat Jun 25 12:41:56 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.122 2021/12/18 16:41:37 riastradh Exp $ */ +/* $NetBSD: cpu.h,v 1.123 2022/06/25 12:41:56 jmcneill Exp $ */ /* * Copyright (c) 1994-1996 Mark Brinicombe. @@ -218,7 +218,7 @@ struct cpu_info { ci_softc; /* platform softc */ int ci_cpl; /* current processor level (spl) */ - int ci_hwpl; /* current hardware priority */ + volatile int ci_hwpl; /* current hardware priority */ int ci_kfpu_spl; volatile u_int ci_intr_depth; /* */ Index: src/sys/arch/arm/marvell/armadaxp.c diff -u src/sys/arch/arm/marvell/armadaxp.c:1.25 src/sys/arch/arm/marvell/armadaxp.c:1.26 --- src/sys/arch/arm/marvell/armadaxp.c:1.25 Tue May 31 11:22:33 2022 +++ src/sys/arch/arm/marvell/armadaxp.c Sat Jun 25 12:41:56 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: armadaxp.c,v 1.25 2022/05/31 11:22:33 andvar Exp $ */ +/* $NetBSD: armadaxp.c,v 1.26 2022/06/25 12:41:56 jmcneill Exp $ */ /******************************************************************************* Copyright (C) Marvell International Ltd. and its affiliates @@ -37,7 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBI *******************************************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: armadaxp.c,v 1.25 2022/05/31 11:22:33 andvar Exp $"); +__KERNEL_RCSID(0, "$NetBSD: armadaxp.c,v 1.26 2022/06/25 12:41:56 jmcneill Exp $"); #define _INTR_PRIVATE @@ -656,10 +656,18 @@ armadaxp_pic_set_priority(struct pic_sof { int ctp; + register_t psw = DISABLE_INTERRUPT_SAVE(); + ctp = MPIC_CPU_READ(ARMADAXP_MLMB_MPIC_CTP); ctp &= ~(0xf << MPIC_CTP_SHIFT); ctp |= (ipl << MPIC_CTP_SHIFT); MPIC_CPU_WRITE(ARMADAXP_MLMB_MPIC_CTP, ctp); + + curcpu()->ci_cpl = ipl; + + if ((psw & I32_bit) == 0) { + ENABLE_INTERRUPT(); + } } static void Index: src/sys/arch/arm/pic/pic.c diff -u src/sys/arch/arm/pic/pic.c:1.79 src/sys/arch/arm/pic/pic.c:1.80 --- src/sys/arch/arm/pic/pic.c:1.79 Sun Jan 2 11:17:39 2022 +++ src/sys/arch/arm/pic/pic.c Sat Jun 25 12:41:56 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: pic.c,v 1.79 2022/01/02 11:17:39 riastradh Exp $ */ +/* $NetBSD: pic.c,v 1.80 2022/06/25 12:41:56 jmcneill Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ #include "opt_multiprocessor.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.79 2022/01/02 11:17:39 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.80 2022/06/25 12:41:56 jmcneill Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -98,13 +98,12 @@ static int pic_init(void); void pic_set_priority(struct cpu_info *ci, int newipl) { - register_t psw = DISABLE_INTERRUPT_SAVE(); - if (pic_list[0] != NULL) - (pic_list[0]->pic_ops->pic_set_priority)(pic_list[0], newipl); - ci->ci_cpl = newipl; - if ((psw & I32_bit) == 0) { - ENABLE_INTERRUPT(); + if (__predict_false(pic_list[0] == NULL)) { + ci->ci_cpl = newipl; + return; } + + pic_list[0]->pic_ops->pic_set_priority(pic_list[0], newipl); } #endif Index: src/sys/arch/arm/sunxi/sunxi_intc.c diff -u src/sys/arch/arm/sunxi/sunxi_intc.c:1.7 src/sys/arch/arm/sunxi/sunxi_intc.c:1.8 --- src/sys/arch/arm/sunxi/sunxi_intc.c:1.7 Wed Jan 27 03:10:20 2021 +++ src/sys/arch/arm/sunxi/sunxi_intc.c Sat Jun 25 12:41:56 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: sunxi_intc.c,v 1.7 2021/01/27 03:10:20 thorpej Exp $ */ +/* $NetBSD: sunxi_intc.c,v 1.8 2022/06/25 12:41:56 jmcneill Exp $ */ /*- * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca> @@ -29,7 +29,7 @@ #define _INTR_PRIVATE #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sunxi_intc.c,v 1.7 2021/01/27 03:10:20 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sunxi_intc.c,v 1.8 2022/06/25 12:41:56 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -121,6 +121,7 @@ sunxi_intc_establish_irq(struct pic_soft static void sunxi_intc_set_priority(struct pic_softc *pic, int ipl) { + curcpu()->ci_cpl = ipl; } static const struct pic_ops sunxi_intc_picops = {