Applied, thanks! Upload pending, and I'll try to find the time to build new installation media & preinstalled image.
Samuel Damien Zammit, le mer. 15 oct. 2025 02:21:39 +0000, a ecrit: > Now the acpi server can know which interrupt controller is in use, > particularly useful on x86 ISA where there are two different ones. > > Requires new device/irq_status.h gnumach header. > > Also-by: Michael Kelly <[email protected]> > --- > debian/patches/acpi-init-files.diff | 96 ++++++++++++++++++++++++++++- > 1 file changed, 95 insertions(+), 1 deletion(-) > > diff --git a/debian/patches/acpi-init-files.diff > b/debian/patches/acpi-init-files.diff > index 3f95537..8f2080b 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,736 @@ > +@@ -0,0 +1,830 @@ > +// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 > +#include <acpi/acpi.h> > + > @@ -23,6 +23,7 @@ > +#include <limits.h> > + > +#include <device/device.h> > ++#include <device/irq_status.h> > +#include <hurd.h> > +#include <pciaccess.h> > +#include <hurd/irqhelp.h> > @@ -36,6 +37,7 @@ > +#define PCI_IRQ_START 16 > + > +#define PCI_INTERRUPT_PIN 0x3d > ++#define BAD_PIC_MODE(m) ((m) < ACPI_PICMODE_PIC || (m) > ACPI_PICMODE_SAPIC) > + > +extern acpi_status acpi_hw_legacy_sleep(u8 sleep_state); > + > @@ -44,6 +46,7 @@ > + > +static struct pci_device **pci_devices; > +static int numdevs = -1; > ++static int pic_mode = -1; > + > +struct slots { > + uint8_t bus; > @@ -539,6 +542,10 @@ > + if (ACPI_FAILURE(err)) > + return -EIO; > + > ++ /* If pic_mode is undetermined, ACPI cannot determine pci irq */ > ++ if (BAD_PIC_MODE(pic_mode)) > ++ return -EIO; > ++ > + pci_pin = acpi_pci_get_device_pin(bus, dev, func); > + /* Fail if the device pin used is unknown (0) */ > + if (pci_pin <= 0) > @@ -701,6 +708,90 @@ > + return -EIO; > +} > + > ++/* Fetch the active interrupt mode from GNU mach */ > ++static error_t > ++acpi_required_pic_mode (void) > ++{ > ++ mach_port_t devices = MACH_PORT_NULL, irq; > ++ mach_msg_type_number_t cnt = 0; > ++ > ++ error_t err = get_privileged_ports(NULL, &devices); > ++ if (err) > ++ return err; > ++ > ++ if (devices == MACH_PORT_NULL) > ++ return ENODEV; > ++ > ++ err = device_open(devices, D_READ, "irq", &irq); > ++ mach_port_deallocate (mach_task_self (), devices); > ++ if (!err) > ++ { > ++ /* Determine if the IRQGETPICMODE feature is available in the > ++ running kernel by specifying a NULL array for 'status'. If > ++ the feature is available then MIG_ARRAY_TOO_LARGE is returned > ++ as the returned status cannot fit in the result. > ++ */ > ++ if (device_get_status(irq, IRQGETPICMODE, NULL, &cnt) > ++ != MIG_ARRAY_TOO_LARGE) > ++ err = ENOSYS; > ++ else > ++ { > ++ cnt = 1; > ++ err = device_get_status(irq, IRQGETPICMODE, &pic_mode, &cnt); > ++ } > ++ > ++ device_close(irq); > ++ } > ++ > ++ return err; > ++} > ++ > ++static error_t > ++acpi_set_pic_mode (void) > ++{ > ++ struct acpi_object_list arg; > ++ union acpi_object obj; > ++ > ++ if (BAD_PIC_MODE(pic_mode)) > ++ return EINVAL; > ++ > ++ obj.type = ACPI_TYPE_INTEGER; > ++ obj.integer.value = pic_mode; > ++ > ++ arg.count = 1; > ++ arg.pointer = &obj; > ++ > ++ acpi_handle handle = ACPI_ROOT_OBJECT; > ++ acpi_status rv = acpi_evaluate_object(handle, "\\_PIC", &arg, NULL); > ++ > ++ /* A failure of AE_NOT_FOUND means the \_PIC method is not supported. > ++ The default for the system in this case is ACPI_PICMODE_PIC, so > ++ it is only a concern if an attempt is made to set a different mode. > ++ */ > ++ return (ACPI_FAILURE(rv) > ++ && (rv != AE_NOT_FOUND || (pic_mode != ACPI_PICMODE_PIC)) > ++ ? EIO > ++ : 0); > ++} > ++ > ++static error_t > ++acpi_configure_pic_mode (void) > ++{ > ++ error_t err = acpi_required_pic_mode (); > ++ > ++ if (err) > ++ { > ++ acpi_os_printf("Cannot determine PIC mode: %s\n", strerror(err)); > ++ return err; > ++ } > ++ > ++ err = acpi_set_pic_mode (); > ++ if (err) > ++ acpi_os_printf("Failed to set ACPI PIC mode: %s\n", strerror(err)); > ++ > ++ return err; > ++} > ++ > +void acpi_init(void) > +{ > + acpi_status err; > @@ -724,6 +815,9 @@ > + if (ACPI_FAILURE (err)) > + goto die; > + > ++ /* Ignore return value for old gnumach without irq status */ > ++ acpi_configure_pic_mode(); > ++ > + err = acpi_enable_subsystem (ACPI_FULL_INITIALIZATION); > + if (ACPI_FAILURE (err)) > + goto die; > -- > 2.45.2 > > > -- Samuel <m> argh, pi est plus grand que 2. Ca casse tout -+- #ens-mim -+-
