Skip to content

Commit 62d5287

Browse files
committed
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 <[email protected]> Acked-by: Bjorn Helgaas <[email protected]> Reviewed-by: Mika Westerberg <[email protected]>
1 parent b7dd629 commit 62d5287

File tree

2 files changed

+5
-0
lines changed

2 files changed

+5
-0
lines changed

drivers/acpi/pci_root.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,8 @@ struct pci_bus *acpi_pci_root_create(struct acpi_pci_root *root,
927927
host_bridge->preserve_config = 1;
928928
ACPI_FREE(obj);
929929

930+
acpi_dev_power_up_children_with_adr(device);
931+
930932
pci_scan_child_bus(bus);
931933
pci_set_host_bridge_release(host_bridge, acpi_pci_root_release_info,
932934
info);

drivers/pci/pci-acpi.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1374,6 +1374,9 @@ void pci_acpi_setup(struct device *dev, struct acpi_device *adev)
13741374

13751375
acpi_pci_wakeup(pci_dev, false);
13761376
acpi_device_power_add_dependent(adev, dev);
1377+
1378+
if (pci_is_bridge(pci_dev))
1379+
acpi_dev_power_up_children_with_adr(adev);
13771380
}
13781381

13791382
void pci_acpi_cleanup(struct device *dev, struct acpi_device *adev)

0 commit comments

Comments
 (0)