[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 libacpica] Allow read/write to pci config
From: |
Samuel Thibault |
Subject: |
Re: [PATCH v2 libacpica] Allow read/write to pci config |
Date: |
Sat, 1 Jul 2023 15:28:31 +0200 |
User-agent: |
NeoMutt/20170609 (1.8.3) |
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.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: [PATCH v2 libacpica] Allow read/write to pci config,
Samuel Thibault <=