---
 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



Reply via email to