Module Name:    src
Committed By:   skrll
Date:           Mon Dec 25 13:21:30 UTC 2023

Modified Files:
        src/sys/arch/riscv/fdt: intc_fdt.c
        src/sys/arch/riscv/include: cpu.h

Log Message:
Count interrupts across harts and their local interrupt controllers
correctly.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/riscv/fdt/intc_fdt.c
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/riscv/include/cpu.h

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/riscv/fdt/intc_fdt.c
diff -u src/sys/arch/riscv/fdt/intc_fdt.c:1.2 src/sys/arch/riscv/fdt/intc_fdt.c:1.3
--- src/sys/arch/riscv/fdt/intc_fdt.c:1.2	Mon Jun 12 19:04:13 2023
+++ src/sys/arch/riscv/fdt/intc_fdt.c	Mon Dec 25 13:21:30 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: intc_fdt.c,v 1.2 2023/06/12 19:04:13 skrll Exp $	*/
+/*	$NetBSD: intc_fdt.c,v 1.3 2023/12/25 13:21:30 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2023 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
 #include "opt_multiprocessor.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intc_fdt.c,v 1.2 2023/06/12 19:04:13 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intc_fdt.c,v 1.3 2023/12/25 13:21:30 skrll Exp $");
 
 #include <sys/param.h>
 
@@ -90,13 +90,36 @@ struct intc_fdt_softc {
 
 	struct intc_irq		*sc_irq[IRQ_NSOURCES];
 
-	struct evcnt		*sc_evs[IRQ_NSOURCES];
+	struct evcnt		 sc_evs[IRQ_NSOURCES];
 
 	struct cpu_info 	*sc_ci;
 	cpuid_t			 sc_hartid;
 };
 
-static struct intc_fdt_softc *intc_sc;
+static const char * const intc_sources[IRQ_NSOURCES] = {
+	/* Software interrupts */
+	"(reserved)",
+	"Supervisor software",
+	"Virtual Supervisor software",
+	"Machine software",
+
+	/* Timer interrupts */
+	"(reserved)",
+	"Supervisor timer",
+	"Virtual Supervisor timer",
+	"Machine timer",
+
+	/* External interrupts */
+	"(reserved)",
+	"Supervisor external",
+	"Virtual Supervisor external",
+	"Machine external",
+
+	"(reserved)",
+	"Supervisor guest external.",
+	"(reserved)",
+	"(reserved)"
+};
 
 
 static void *
@@ -118,6 +141,9 @@ intc_intr_establish(struct intc_fdt_soft
 		irq->intr_source = source;
 		TAILQ_INIT(&irq->intr_handlers);
 		sc->sc_irq[source] = irq;
+
+		evcnt_attach_dynamic(&sc->sc_evs[source], EVCNT_TYPE_INTR, NULL,
+		    device_xname(sc->sc_dev), intc_sources[source]);
 	} else {
 		if (irq->intr_arg == NULL || arg == NULL) {
 			device_printf(dev,
@@ -185,31 +211,6 @@ intc_fdt_disestablish(device_t dev, void
 
 }
 
-static const char * const intc_sources[IRQ_NSOURCES] = {
-	/* Software interrupts */
-	"(reserved)",
-	"Supervisor software",
-	"Virtual Supervisor software",
-	"Machine software",
-
-	/* Timer interrupts */
-	"(reserved)",
-	"Supervisor timer",
-	"Virtual Supervisor timer",
-	"Machine timer",
-
-	/* External interrupts */
-	"(reserved)",
-	"Supervisor external",
-	"Virtual Supervisor external",
-	"Machine external",
-
-	"(reserved)",
-	"Supervisor guest external.",
-	"(reserved)",
-	"(reserved)"
-};
-
 static bool
 intc_fdt_intrstr(device_t dev, u_int *specifier, char *buf, size_t buflen)
 {
@@ -246,7 +247,7 @@ intc_intr_handler(struct trapframe *tf, 
 
 	KASSERT(CAUSE_INTERRUPT_P(cause));
 
-	struct intc_fdt_softc * const sc = intc_sc;
+	struct intc_fdt_softc * const sc = ci->ci_intcsoftc;
 
 	ci->ci_intr_depth++;
 	ci->ci_data.cpu_nintr++;
@@ -259,6 +260,8 @@ intc_intr_handler(struct trapframe *tf, 
 
 		int source = ffs(pending) - 1;
 		struct intc_irq *irq = sc->sc_irq[source];
+		sc->sc_evs[source].ev_count++;
+
 		KASSERTMSG(irq != NULL, "source %d\n", source);
 
 		if (irq) {
@@ -326,13 +329,13 @@ intc_attach(device_t parent, device_t se
 	aprint_normal(": local interrupt controller\n");
 
 	struct intc_fdt_softc * const sc = device_private(self);
-	intc_sc = sc;
 
 	riscv_intr_set_handler(intc_intr_handler);
 
 	sc->sc_dev = self;
 	sc->sc_ci = ci;
 	sc->sc_hartid = ci->ci_cpuid;
+	ci->ci_intcsoftc = sc;
 
 	intc_intr_establish(sc, IRQ_SUPERVISOR_TIMER, IPL_SCHED, IST_MPSAFE,
 	    riscv_timer_intr, NULL, "clock");

Index: src/sys/arch/riscv/include/cpu.h
diff -u src/sys/arch/riscv/include/cpu.h:1.14 src/sys/arch/riscv/include/cpu.h:1.15
--- src/sys/arch/riscv/include/cpu.h:1.14	Sun Sep  3 08:48:20 2023
+++ src/sys/arch/riscv/include/cpu.h	Mon Dec 25 13:21:30 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.14 2023/09/03 08:48:20 skrll Exp $ */
+/* $NetBSD: cpu.h,v 1.15 2023/12/25 13:21:30 skrll Exp $ */
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -92,6 +92,7 @@ struct cpu_info {
 #define	CPUF_RUNNING	__BIT(2)		/* CPU is running */
 #define	CPUF_PAUSED	__BIT(3)		/* CPU is paused */
 
+	void *ci_intcsoftc;
 	volatile u_long ci_request_ipis;
 						/* bitmask of IPIs requested */
 	u_long ci_active_ipis;			/* bitmask of IPIs being serviced */

Reply via email to