summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2023-01-18 07:36:18 +0000
committerDamien Zammit <damien@zamaudio.com>2023-06-24 00:00:13 +1000
commitea7cb944b438bff08607d11a2bbfa7d0e3aff350 (patch)
tree32d34bcdb43c2485040d06ce4069b29382b75293
parent471ebf0a2643abee4a508d154214747149be1edc (diff)
pci-userspace: Add acpi lookup of irqs with fallback
Message-Id: <20230118073559.149163-1-damien@zamaudio.com>
-rw-r--r--debian/changelog8
-rw-r--r--debian/patches/acpi.diff78
-rw-r--r--debian/patches/series1
3 files changed, 87 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog
index e572e279..d158eaea 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+rumpkernel (0~20211031-3) UNRELEASED; urgency=medium
+
+ [ Damien Zammit ]
+ * debian/patches/acpi.diff: pci-userspace: Add acpi lookup of irqs with
+ fallback.
+
+ -- Samuel Thibault <sthibault@debian.org> Thu, 19 Jan 2023 00:53:29 +0100
+
rumpkernel (0~20211031-2) unreleased; urgency=medium
[ Samuel Thibault ]
diff --git a/debian/patches/acpi.diff b/debian/patches/acpi.diff
new file mode 100644
index 00000000..8015a6e6
--- /dev/null
+++ b/debian/patches/acpi.diff
@@ -0,0 +1,78 @@
+--- a/pci-userspace/src-gnu/Makefile.inc
++++ b/pci-userspace/src-gnu/Makefile.inc
+@@ -3,7 +3,7 @@
+ PCIDIR:= ${.PARSEDIR}
+ .PATH: ${PCIDIR}
+
+-RUMPCOMP_USER_SRCS= pci_user-gnu.c mach_debugUser.c
++RUMPCOMP_USER_SRCS= pci_user-gnu.c mach_debugUser.c acpiUser.c
+ RUMPCOMP_USER_CPPFLAGS+=-I${PCIDIR} -I${DESTDIR}/usr/include
+ RUMPCOMP_CPPFLAGS+= -I${PCIDIR} -I${DESTDIR}/usr/include
+ CPPFLAGS+= -I${PCIDIR}
+@@ -16,3 +16,11 @@
+ -user mach_debugUser.c \
+ -server /dev/null \
+ -header mach_debug_U.h
++
++acpiUser.c:
++ echo '#include <hurd/acpi.defs>' \
++ | ${CC} -E -x c - -o - \
++ | mig -cc cat - /dev/null -subrprefix __ \
++ -user acpiUser.c \
++ -server /dev/null \
++ -header acpi_U.h
+--- a/pci-userspace/src-gnu/pci_user-gnu.c
++++ b/pci-userspace/src-gnu/pci_user-gnu.c
+@@ -67,6 +67,7 @@
+ #include <device/device.h>
+ #include <mach/gnumach.h>
+ #include "mach_debug_U.h"
++#include "acpi_U.h"
+ #include <mach/vm_param.h>
+ #include <mach.h>
+
+@@ -90,6 +91,7 @@
+ static mach_port_t master_host;
+ static mach_port_t master_device;
+ static device_t irq_dev;
++static device_t acpi_dev;
+
+ #define PCI_CFG1_START 0xcf8
+ #define PCI_CFG1_END 0xcff
+@@ -130,6 +132,12 @@
+ if (device_open (master_device, D_READ, "irq", &irq_dev))
+ err(2, "device_open irq");
+
++ /* Optional */
++ if (device_open (master_device, D_READ, "acpi", &acpi_dev)) {
++ MACH_PRINT("device_open acpi failed... continue\n");
++ acpi_dev = MACH_PORT_NULL;
++ }
++
+ pci_system_init ();
+ struct pci_device_iterator *dev_iter;
+ struct pci_device *pci_dev;
+@@ -363,6 +371,7 @@
+ rumpcomp_pci_irq_map(unsigned bus, unsigned dev, unsigned fun,
+ int intrline, unsigned cookie)
+ {
++ int ret;
+ struct irq *irq;
+ irq = malloc(sizeof(*irq));
+ if (irq == NULL)
+@@ -374,6 +383,15 @@
+ irq->fun = fun;
+ irq->intrline = intrline;
+
++ /* We can do better by reading irq from acpi device, but with fallback */
++ if (acpi_dev != MACH_PORT_NULL) {
++ ret = acpi_get_pci_irq (acpi_dev, bus, dev, fun, &irq->intrline);
++ if (ret) {
++ MACH_PRINT("acpi_get_pci_irq failed, continue with intrline\n");
++ irq->intrline = intrline;
++ }
++ }
++
+ pthread_mutex_lock(&genericmtx);
+ LIST_INSERT_HEAD(&irqs, irq, entries);
+ pthread_mutex_unlock(&genericmtx);
diff --git a/debian/patches/series b/debian/patches/series
index 5654d354..adbc5acb 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -14,3 +14,4 @@ pci-userspace-rump.diff
rumpuser-evcnt.diff
ps-comm.diff
idtype_t.diff
+acpi.diff