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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 = {