Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PCI: ACPI: PM: Power up devices in D3cold before scanning them

The initial configuration of ACPI power resources on some systems
implies that some PCI devices on them are initially in D3cold.

In some cases, especially for PCIe Root Ports, this is a "logical"
D3cold, meaning that the configuration space of the device is
accessible, but some of its functionality may be missing, but it
very well may be real D3cold, in which case the device will not
be accessible at all. However, the PCI bus type driver will need
to access its configuration space in order to enumerate it.

To prevent possible device enumeration failures that may ensue as
a result of ACPI power resources being initially in the "off"
state, power up all children of the host bridge ACPI device object
that hold valid _ADR objects (which indicates that they will be
enumerated by the PCI bus type driver) and do that to all children
of the ACPI device objects corresponding to PCI bridges (including
PCIe ports).

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>

+5
+2
drivers/acpi/pci_root.c
··· 927 927 host_bridge->preserve_config = 1; 928 928 ACPI_FREE(obj); 929 929 930 + acpi_dev_power_up_children_with_adr(device); 931 + 930 932 pci_scan_child_bus(bus); 931 933 pci_set_host_bridge_release(host_bridge, acpi_pci_root_release_info, 932 934 info);
+3
drivers/pci/pci-acpi.c
··· 1374 1374 1375 1375 acpi_pci_wakeup(pci_dev, false); 1376 1376 acpi_device_power_add_dependent(adev, dev); 1377 + 1378 + if (pci_is_bridge(pci_dev)) 1379 + acpi_dev_power_up_children_with_adr(adev); 1377 1380 } 1378 1381 1379 1382 void pci_acpi_cleanup(struct device *dev, struct acpi_device *adev)