Commit e21e0243 authored by Mario Limonciello's avatar Mario Limonciello Committed by Christoph Hellwig

nvme-pci: look for StorageD3Enable on companion ACPI device instead

The documentation around the StorageD3Enable property hints that it
should be made on the PCI device.  This is where newer AMD systems set
the property and it's required for S0i3 support.

So rather than look for nodes of the root port only present on Intel
systems, switch to the companion ACPI device for all systems.
David Box from Intel indicated this should work on Intel as well.

Link: https://lore.kernel.org/linux-nvme/YK6gmAWqaRmvpJXb@google.com/T/#m900552229fa455867ee29c33b854845fce80ba70
Link: https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/power-management-for-storage-hardware-devices-intro
Fixes: df4f9bc4 ("nvme-pci: add support for ACPI StorageD3Enable property")
Suggested-by: default avatarLiang Prike <Prike.Liang@amd.com>
Acked-by: default avatarRaul E Rangel <rrangel@chromium.org>
Signed-off-by: default avatarMario Limonciello <mario.limonciello@amd.com>
Reviewed-by: default avatarDavid E. Box <david.e.box@linux.intel.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent ebd8a93a
...@@ -2831,10 +2831,7 @@ static unsigned long check_vendor_combination_bug(struct pci_dev *pdev) ...@@ -2831,10 +2831,7 @@ static unsigned long check_vendor_combination_bug(struct pci_dev *pdev)
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
static bool nvme_acpi_storage_d3(struct pci_dev *dev) static bool nvme_acpi_storage_d3(struct pci_dev *dev)
{ {
struct acpi_device *adev; struct acpi_device *adev = ACPI_COMPANION(&dev->dev);
struct pci_dev *root;
acpi_handle handle;
acpi_status status;
u8 val; u8 val;
/* /*
...@@ -2842,28 +2839,9 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev) ...@@ -2842,28 +2839,9 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev)
* must use D3 to support deep platform power savings during * must use D3 to support deep platform power savings during
* suspend-to-idle. * suspend-to-idle.
*/ */
root = pcie_find_root_port(dev);
if (!root)
return false;
adev = ACPI_COMPANION(&root->dev);
if (!adev) if (!adev)
return false; return false;
/*
* The property is defined in the PXSX device for South complex ports
* and in the PEGP device for North complex ports.
*/
status = acpi_get_handle(adev->handle, "PXSX", &handle);
if (ACPI_FAILURE(status)) {
status = acpi_get_handle(adev->handle, "PEGP", &handle);
if (ACPI_FAILURE(status))
return false;
}
if (acpi_bus_get_device(handle, &adev))
return false;
if (fwnode_property_read_u8(acpi_fwnode_handle(adev), "StorageD3Enable", if (fwnode_property_read_u8(acpi_fwnode_handle(adev), "StorageD3Enable",
&val)) &val))
return false; return false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment