Applied, thanks! Damien Zammit, le jeu. 29 juin 2023 10:56:53 +0000, a ecrit: > --- > debian/patches/acgnu.diff | 72 ++++++++++++++++++++--- > debian/patches/acpi-init-files.diff | 88 ++++++++++++++++++++++++++++- > debian/patches/add-makefile.diff | 4 +- > 3 files changed, 153 insertions(+), 11 deletions(-) > > diff --git a/debian/patches/acgnu.diff b/debian/patches/acgnu.diff > index fc59992..e7f396f 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,256 @@ > +@@ -0,0 +1,314 @@ > +// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 > + > +#ifndef __ACGNUEX_H__ > @@ -181,6 +181,8 @@ Add acgnu.h and acgnuex.h > +acpi_status ACPI_INIT_FUNCTION acpi_os_initialize(void); > +acpi_status acpi_os_terminate(void); > +void acpi_os_printf(const char *format, ...); > ++struct pci_device; > ++struct pci_device *lookup_pci_dev(struct acpi_pci_id *pci_id); > + > +static inline void *acpi_os_allocate(acpi_size size) > +{ > @@ -232,6 +234,7 @@ Add acgnu.h and acgnuex.h > +#include <stdarg.h> > +#include <limits.h> > +#include <hurd.h> > ++#include <pciaccess.h> > + > +#define ACPI_MAX_TABLES 128 > + > @@ -403,18 +406,73 @@ Add acgnu.h and acgnuex.h > + > +static inline acpi_status > +acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg, > -+ u64 *value, u32 width) > ++ u64 *value, u32 bit_width) > +{ > -+ acpi_os_printf("ACPI: Tried to read pci config\n"); > -+ return 1; > ++ int i, err = 0; > ++ uint8_t buf[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; > ++ struct pci_device *dev; > ++ u64 temp = 0; > ++ u32 bytes = bit_width / 8; > ++ pciaddr_t bytes_read = 0; > ++ > ++ if (bytes > 8) > ++ { > ++ acpi_os_printf("acpi: Can't read more than 8 pci bytes\n"); > ++ return 1; > ++ } > ++ > ++ dev = lookup_pci_dev(pci_id); > ++ if (!dev) > ++ return 1; > ++ > ++ pci_device_cfg_read(dev, buf, reg, bytes, &bytes_read); > ++ if (bytes_read < bytes) > ++ { > ++ acpi_os_printf("acpi: pci short read\n"); > ++ err = 1; > ++ } > ++ > ++ /* Read buffer from LE */ > ++ for (i = 0; i < bytes; i++) > ++ temp |= buf[i] << (8 * i); > ++ > ++ *value = temp; > ++ > ++ return err; > +} > + > +static inline acpi_status > +acpi_os_write_pci_configuration(struct acpi_pci_id * pci_id, u32 reg, > -+ u64 value, u32 width) > ++ u64 value, u32 bit_width) > +{ > -+ acpi_os_printf("ACPI: Tried to write pci config\n"); > -+ return 1; > ++ int i, err = 0; > ++ uint8_t buf[8] = {0}; > ++ struct pci_device *dev; > ++ u32 bytes = bit_width / 8; > ++ pciaddr_t bytes_written = 0; > ++ > ++ if (bytes > 8) > ++ { > ++ acpi_os_printf("acpi: Can't write more than 8 pci bytes\n"); > ++ return 1; > ++ } > ++ > ++ dev = lookup_pci_dev(pci_id); > ++ if (!dev) > ++ return 1; > ++ > ++ /* Encode value as LE buffer */ > ++ for (i = 0; i < bytes; i++) > ++ buf[i] = (value >> (8 * i)) & 0xff; > ++ > ++ pci_device_cfg_write(dev, buf, reg, bytes, &bytes_written); > ++ if (bytes_written < bytes) > ++ { > ++ acpi_os_printf("acpi: pci short write\n"); > ++ err = 1; > ++ } > ++ > ++ return err; > +} > + > +#endif /* __KERNEL__ */ > diff --git a/debian/patches/acpi-init-files.diff > b/debian/patches/acpi-init-files.diff > index b83eafd..e277749 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,510 @@ > +@@ -0,0 +1,592 @@ > +// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 > +#include <acpi/acpi.h> > + > @@ -24,14 +24,21 @@ > + > +#include <device/device.h> > +#include <hurd.h> > ++#include <pciaccess.h> > + > +#define ACPI_MAX_TABLES 128 > + > ++#define PCI_CFG1_START 0xcf8 > ++#define PCI_CFG1_END 0xcff > ++ > +extern acpi_status acpi_hw_legacy_sleep(u8 sleep_state); > + > +// Lets keep the ACPI tables in this module > +static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES]; > + > ++static struct pci_device **pci_devices; > ++static int numdevs = -1; > ++ > +struct slots { > + uint8_t bus; > + uint16_t dev; > @@ -40,6 +47,61 @@ > + struct slots *next; > +}; > + > ++static int > ++pci_init(void) > ++{ > ++ int i; > ++ struct pci_device_iterator *dev_iter; > ++ struct pci_device *pci_dev; > ++ struct pci_device **tmp; > ++ > ++ pci_system_init (); > ++ > ++ numdevs = 0; > ++ dev_iter = pci_slot_match_iterator_create (NULL); > ++ while ((pci_dev = pci_device_next (dev_iter)) != NULL) > ++ numdevs++; > ++ > ++ pci_devices = malloc (sizeof(struct pci_device *)); > ++ if (pci_devices == NULL) > ++ return errno; > ++ tmp = pci_devices; > ++ > ++ i = 0; > ++ dev_iter = pci_slot_match_iterator_create (NULL); > ++ while ((pci_dev = pci_device_next (dev_iter)) != NULL) > ++ { > ++ if ((tmp = realloc(pci_devices, (i + 1) * sizeof(*tmp))) == NULL) > ++ { > ++ free(pci_devices); > ++ return errno; > ++ } > ++ pci_devices = tmp; > ++ pci_device_probe(pci_dev); > ++ pci_devices[i++] = pci_dev; > ++ } > ++ return 0; > ++} > ++ > ++struct pci_device * > ++lookup_pci_dev(struct acpi_pci_id *pci_id) > ++{ > ++ int i; > ++ > ++ for (i = 0; i < numdevs; i++) > ++ { > ++ if ((pci_devices[i]->domain == pci_id->segment) > ++ && (pci_devices[i]->bus == pci_id->bus) > ++ && (pci_devices[i]->dev == pci_id->device) > ++ && (pci_devices[i]->func == pci_id->function)) > ++ { > ++ return pci_devices[i]; > ++ } > ++ } > ++ acpi_os_printf("Can't find pci dev %04x:%d:%02x.%d\n", pci_id->segment, > pci_id->bus, pci_id->device, pci_id->function); > ++ return NULL; > ++} > ++ > +void > +acpi_ds_dump_method_stack(acpi_status status, ...) > +// struct acpi_walk_state *walk_state, union acpi_parse_object *op) > @@ -224,17 +286,37 @@ > +acpi_status > +acpi_os_initialize(void) > +{ > -+ if (ioperm(0, 0x10000, 1)) > ++ /* Avoid giving ioperm to the PCI cfg registers > ++ * since pci-arbiter controls these > ++ */ > ++ > ++ /* 0-0xcf7 */ > ++ if (ioperm(0, PCI_CFG1_START, 1)) > + { > -+ acpi_os_printf("EPERM on ioperm\n"); > ++ acpi_os_printf("acpi: EPERM on ioperm 1\n"); > + return AE_ERROR; > + } > ++ > ++ /* 0xd00-0xffff */ > ++ if (ioperm(PCI_CFG1_END+1, 0x10000 - (PCI_CFG1_END+1), 1)) > ++ { > ++ acpi_os_printf("acpi: EPERM on ioperm 2\n"); > ++ return AE_ERROR; > ++ } > ++ > ++ if (pci_init()) > ++ { > ++ acpi_os_printf("acpi pci_init: Error realloc\n"); > ++ return AE_ERROR; > ++ } > ++ > + return AE_OK; > +} > + > +acpi_status > +acpi_os_terminate(void) > +{ > ++ free(pci_devices); > + acpi_os_printf("Bye!\n"); > + return AE_OK; > +} > diff --git a/debian/patches/add-makefile.diff > b/debian/patches/add-makefile.diff > index da2edc3..a78d8d0 100644 > --- a/debian/patches/add-makefile.diff > +++ b/debian/patches/add-makefile.diff > @@ -1,6 +1,6 @@ > --- /dev/null > +++ b/Makefile > -@@ -0,0 +1,216 @@ > +@@ -0,0 +1,218 @@ > +# Copyright (C) 2022 Free Software Foundation, Inc. > +# > +# This is free software; you can redistribute it and/or modify > @@ -37,6 +37,8 @@ > +PREFIX ?= /usr/local > +libdir ?= $(PREFIX)/lib > + > ++LDLIBS = -lpciaccess > ++ > +SRCS = global_state.c \ > + acpi_init.c \ > + $(BASE)/dsargs.c \ > -- > 2.40.1 > > >
-- Samuel --- Pour une évaluation indépendante, transparente et rigoureuse ! Je soutiens la Commission d'Évaluation de l'Inria.