--- debian/patches/acgnu.diff | 34 ++++++++++++++++++++++++++--- debian/patches/acpi-init-files.diff | 8 ++++++- debian/patches/add-makefile.diff | 2 +- 3 files changed, 39 insertions(+), 5 deletions(-)
diff --git a/debian/patches/acgnu.diff b/debian/patches/acgnu.diff index e7f396f..df82abc 100644 --- a/debian/patches/acgnu.diff +++ b/debian/patches/acgnu.diff @@ -163,7 +163,7 @@ Add acgnu.h and acgnuex.h +#endif /* __ACGNU_H__ */ --- /dev/null +++ b/include/acpi/platform/acgnuex.h -@@ -0,0 +1,314 @@ +@@ -0,0 +1,342 @@ +// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 + +#ifndef __ACGNUEX_H__ @@ -235,8 +235,14 @@ Add acgnu.h and acgnuex.h +#include <limits.h> +#include <hurd.h> +#include <pciaccess.h> ++#include <hurd/irqhelp.h> + +#define ACPI_MAX_TABLES 128 ++#define ACPI_MAX_GSIS 64 ++ ++static struct handler { ++ struct irq *irqhelp; ++} handlers[ACPI_MAX_GSIS] = {0}; + +static inline acpi_status +acpi_os_enter_sleep(u8 sleep_state, u32 pm1a, u32 pm1b) @@ -393,14 +399,36 @@ Add acgnu.h and acgnuex.h +acpi_os_install_interrupt_handler(u32 gsi, acpi_osd_handler handler, + void *context) +{ -+ acpi_os_printf("TODO: add interrupt handler for acpi\n"); ++ assert(gsi < ACPI_MAX_GSIS); ++ pthread_t irq_loop; ++ int err; ++ ++ if (handlers[gsi].irqhelp) ++ irqhelp_remove_interrupt_handler (handlers[gsi].irqhelp); ++ handlers[gsi].irqhelp = irqhelp_install_interrupt_handler (gsi, -1, -1, -1, (void *)(void (*))handler, context); ++ ++ err = pthread_create (&irq_loop, NULL, irqhelp_server_loop, NULL); ++ if (err) ++ { ++ acpi_os_printf ("ACPI: Cannot create pthread for interrupt handler gsi=%d\n", gsi); ++ irqhelp_remove_interrupt_handler (handlers[gsi].irqhelp); ++ handlers[gsi].irqhelp = NULL; ++ return 1; ++ } ++ pthread_detach (irq_loop); + return 0; +} + +static inline acpi_status +acpi_os_remove_interrupt_handler(u32 gsi, acpi_osd_handler handler) +{ -+ acpi_os_printf("TODO: remove interrupt handler for acpi\n"); ++ int err = irqhelp_remove_interrupt_handler (handlers[gsi].irqhelp); ++ if (err) ++ { ++ acpi_os_printf ("ACPI: Cannot deregister interrupt handler gsi=%d\n", gsi); ++ return 1; ++ } ++ handlers[gsi].irqhelp = NULL; + return 0; +} + diff --git a/debian/patches/acpi-init-files.diff b/debian/patches/acpi-init-files.diff index e277749..a0f8d61 100644 --- a/debian/patches/acpi-init-files.diff +++ b/debian/patches/acpi-init-files.diff @@ -1,6 +1,6 @@ --- /dev/null +++ b/acpi_init.c -@@ -0,0 +1,592 @@ +@@ -0,0 +1,598 @@ +// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 +#include <acpi/acpi.h> + @@ -25,6 +25,7 @@ +#include <device/device.h> +#include <hurd.h> +#include <pciaccess.h> ++#include <hurd/irqhelp.h> + +#define ACPI_MAX_TABLES 128 + @@ -310,6 +311,11 @@ + return AE_ERROR; + } + ++ if (irqhelp_init()) ++ { ++ acpi_os_printf("acpi irqhelp_init: failed\n"); ++ // FIXME: When libirqhelp is fixed: return AE_ERROR; ++ } + return AE_OK; +} + diff --git a/debian/patches/add-makefile.diff b/debian/patches/add-makefile.diff index a78d8d0..f9d969f 100644 --- a/debian/patches/add-makefile.diff +++ b/debian/patches/add-makefile.diff @@ -37,7 +37,7 @@ +PREFIX ?= /usr/local +libdir ?= $(PREFIX)/lib + -+LDLIBS = -lpciaccess ++LDLIBS = -lpciaccess -lirqhelp -lpthread + +SRCS = global_state.c \ + acpi_init.c \ -- 2.45.2