bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH libacpica] Allow read/write to pci config


From: Samuel Thibault
Subject: Re: [PATCH libacpica] Allow read/write to pci config
Date: Sun, 25 Jun 2023 17:27:45 +0200
User-agent: NeoMutt/20170609 (1.8.3)

Damien Zammit, le dim. 25 juin 2023 01:36:34 +0000, a ecrit:
> @@ -405,16 +408,16 @@ Add acgnu.h and acgnuex.h
>  +acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg,
>  +             u64 *value, u32 width)
>  +{
> -+  acpi_os_printf("ACPI: Tried to read pci config\n");
> -+  return 1;
> ++  pci_device_cfg_read(lookup_pci_dev(pci_id), (void *)value, reg, width, 
> NULL);

Please check whether lookup_pci_dev returned NULL.

There is no need to cast into (void *)

>  +static inline acpi_status
>  +acpi_os_write_pci_configuration(struct acpi_pci_id * pci_id, u32 reg,
>  +        u64 value, u32 width)
>  +{
> -+  acpi_os_printf("ACPI: Tried to write pci config\n");
> -+  return 1;
> ++  pci_device_cfg_write(lookup_pci_dev(pci_id), (const void *)&value, reg, 
> width, NULL);

This is assuming little-endian. We need to copy value into a variable of
the proper size and write from that.

> diff --git a/debian/patches/acpi-init-files.diff 
> b/debian/patches/acpi-init-files.diff
> index b83eafd..2fead2b 100644
> --- a/debian/patches/acpi-init-files.diff
> +++ b/debian/patches/acpi-init-files.diff
> ++#define NUMDEVS 32
> ++static struct pci_device *pci_devices[NUMDEVS];

Please use a dynamic allocation, we'll get bitten hard by that sooner or
later.

> @@ -40,6 +48,43 @@
>  +  struct slots *next;
>  +};
>  +
> ++static void
> ++pci_init(void)
> ++{
> ++  int i = 0;
> ++  struct pci_device_iterator *dev_iter;
> ++  struct pci_device *pci_dev;
> ++
> ++  pci_system_init ();
> ++
> ++  dev_iter = pci_slot_match_iterator_create (NULL);
> ++  while (((pci_dev = pci_device_next (dev_iter)) != NULL)
> ++      && (i < NUMDEVS))

You can use two loops to count first how many devices there are.

> ++    {
> ++      pci_device_probe(pci_dev);
> ++      pci_devices[i++] = pci_dev;
> ++    }
> ++  numdevs = i;
> ++}
> ++
> ++struct pci_device *
> ++lookup_pci_dev(struct acpi_pci_id *pci_id)
> ++{
> ++  int i;
> ++
> ++  for (i = 0; i < numdevs; i++)
> ++    {
> ++      if ((pci_devices[i]->bus == pci_id->bus)
> ++       && (pci_devices[i]->dev == pci_id->device)
> ++       && (pci_devices[i]->func == pci_id->function))

Please also compare pci_devices[i]->domain with pci_id->segment.

> -+  if (ioperm(0, 0x10000, 1))
> ++  /* Avoid giving ioperm to the PCI cfg registers
> ++   * since GNU/Hurd controls these

You mean pci-arbiter? Please say so, otherwise "GNU/Hurd" is really too
imprecise.

Samuel



reply via email to

[Prev in Thread] Current Thread [Next in Thread]