git: c85855a72db9 - main - bus: Activate INTRNG interrupts in common code
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 29 Oct 2024 10:34:43 UTC
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);
}