Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 29 Oct 2024 10:34:43 GMT
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: c85855a72db9 - main - bus: Activate INTRNG interrupts in common code
Message-ID:  <202410291034.49TAYhBH001703@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by andrew:

URL: https://cgit.FreeBSD.org/src/commit/?id=c85855a72db9f9d7b4326b676241e1dffabf0fae

commit c85855a72db9f9d7b4326b676241e1dffabf0fae
Author:     Andrew Turner <andrew@FreeBSD.org>
AuthorDate: 2024-10-29 10:19:45 +0000
Commit:     Andrew Turner <andrew@FreeBSD.org>
CommitDate: 2024-10-29 10:31:37 +0000

    bus: Activate INTRNG interrupts in common code
    
    We need to call into INTRNG to activate all interrupts on platforms that
    use it.  Currently, interrupts are only activated in the nexus drivers for
    INTRNG platforms, but this does not handle other bus devices such as
    gpiobus that manage their own IRQ space.
    
    Reported by:    cperciva
    Reviewed by:    cperciva, jhb
    Sponsored by:   Arm Ltd
    Differential Revision:  https://reviews.freebsd.org/D47282
---
 sys/kern/subr_bus.c | 47 ++++++++++++++++++++++++++++++++++-------------
 1 file changed, 34 insertions(+), 13 deletions(-)

diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
index eeba75ac574a..681971df4307 100644
--- a/sys/kern/subr_bus.c
+++ b/sys/kern/subr_bus.c
@@ -53,6 +53,9 @@
 #include <sys/systm.h>
 #include <sys/bus.h>
 #include <sys/cpuset.h>
+#ifdef INTRNG
+#include <sys/intr.h>
+#endif
 
 #include <net/vnet.h>
 
@@ -4364,17 +4367,26 @@ bus_generic_rman_activate_resource(device_t dev, device_t child,
 	if (error != 0)
 		return (error);
 
-	if ((rman_get_flags(r) & RF_UNMAPPED) == 0 &&
-	    (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT)) {
-		error = BUS_MAP_RESOURCE(dev, child, r, NULL, &map);
-		if (error != 0) {
-			rman_deactivate_resource(r);
-			return (error);
-		}
+	switch (rman_get_type(r)) {
+	case SYS_RES_IOPORT:
+	case SYS_RES_MEMORY:
+		if ((rman_get_flags(r) & RF_UNMAPPED) == 0) {
+			error = BUS_MAP_RESOURCE(dev, child, r, NULL, &map);
+			if (error != 0)
+				break;
 
-		rman_set_mapping(r, &map);
+			rman_set_mapping(r, &map);
+		}
+		break;
+#ifdef INTRNG
+	case SYS_RES_IRQ:
+		error = intr_activate_irq(child, r);
+		break;
+#endif
 	}
-	return (0);
+	if (error != 0)
+		rman_deactivate_resource(r);
+	return (error);
 }
 
 /**
@@ -4404,10 +4416,19 @@ bus_generic_rman_deactivate_resource(device_t dev, device_t child,
 	if (error != 0)
 		return (error);
 
-	if ((rman_get_flags(r) & RF_UNMAPPED) == 0 &&
-	    (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT)) {
-		rman_get_mapping(r, &map);
-		BUS_UNMAP_RESOURCE(dev, child, r, &map);
+	switch (type) {
+	case SYS_RES_IOPORT:
+	case SYS_RES_MEMORY:
+		if ((rman_get_flags(r) & RF_UNMAPPED) == 0) {
+			rman_get_mapping(r, &map);
+			BUS_UNMAP_RESOURCE(dev, child, r, &map);
+		}
+		break;
+#ifdef INTRNG
+	case SYS_RES_IRQ:
+		intr_deactivate_irq(child, r);
+		break;
+#endif
 	}
 	return (0);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202410291034.49TAYhBH001703>