| From f7f45fddd4314e20f74d17505c4dbf7e228f1f71 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 28 May 2021 11:02:34 -0500 |
| Subject: nvme-pci: look for StorageD3Enable on companion ACPI device instead |
| |
| From: Mario Limonciello <mario.limonciello@amd.com> |
| |
| [ Upstream commit e21e0243e7b0f1c2a21d21f4d115f7b37175772a ] |
| |
| 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: df4f9bc4fb9c ("nvme-pci: add support for ACPI StorageD3Enable property") |
| Suggested-by: Liang Prike <Prike.Liang@amd.com> |
| Acked-by: Raul E Rangel <rrangel@chromium.org> |
| Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> |
| Reviewed-by: David E. Box <david.e.box@linux.intel.com> |
| Signed-off-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/nvme/host/pci.c | 24 +----------------------- |
| 1 file changed, 1 insertion(+), 23 deletions(-) |
| |
| diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c |
| index 56263214ea06..3f05df98697d 100644 |
| --- a/drivers/nvme/host/pci.c |
| +++ b/drivers/nvme/host/pci.c |
| @@ -2836,10 +2836,7 @@ static unsigned long check_vendor_combination_bug(struct pci_dev *pdev) |
| #ifdef CONFIG_ACPI |
| static bool nvme_acpi_storage_d3(struct pci_dev *dev) |
| { |
| - struct acpi_device *adev; |
| - struct pci_dev *root; |
| - acpi_handle handle; |
| - acpi_status status; |
| + struct acpi_device *adev = ACPI_COMPANION(&dev->dev); |
| u8 val; |
| |
| /* |
| @@ -2847,28 +2844,9 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev) |
| * must use D3 to support deep platform power savings during |
| * suspend-to-idle. |
| */ |
| - root = pcie_find_root_port(dev); |
| - if (!root) |
| - return false; |
| |
| - adev = ACPI_COMPANION(&root->dev); |
| if (!adev) |
| 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", |
| &val)) |
| return false; |
| -- |
| 2.30.2 |
| |