[PATCH] nvme: Favor D3cold for suspend if NVMe device supports it

Kai-Heng Feng kai.heng.feng at canonical.com
Fri Apr 16 10:10:55 BST 2021


On AMD platforms that use s2idle, NVMe timeouts on s2idle resume,
because their SMU FW may cut off NVMe power during sleep.

Unlike Intel platforms where the power resources are generally
controlled by root port, the power resources is controlled by NVMe
device itself on recent AMD platforms:
...
    Scope (\_SB.PCI0.GP24.NVME)
    {
        Name (_PR0, Package (0x01)  // _PR0: Power Resources for D0
        {
            P0NV
        })
        Name (_PR2, Package (0x01)  // _PR2: Power Resources for D2
        {
            P0NV
        })
        Name (_PR3, Package (0x01)  // _PR3: Power Resources for D3hot
        {
            P0NV
        })
        Method (_PS0, 0, NotSerialized)  // _PS0: Power State 0
        {
        }

        Method (_PS3, 0, NotSerialized)  // _PS3: Power State 3
        {
        }
    }
...
And it's a great indication that the NVMe should use D3cold for sleep
instead of staying at D0.

So use NVME_QUIRK_SIMPLE_SUSPEND if the ACPI counterpart of NVMe device
supports D3cold.

Tested on HP EliteBook 840 G7/G8.

BugLink: https://gitlab.freedesktop.org/drm/amd/-/issues/1230
References: https://lore.kernel.org/linux-nvme/1618458725-17164-1-git-send-email-Prike.Liang@amd.com/
Cc: Alex Deucher <alexander.deucher at amd.com>
Cc: Prike Liang <Prike.Liang at amd.com>
Cc: Shyam Sundar S K <Shyam-sundar.S-k at amd.com>
Signed-off-by: Kai-Heng Feng <kai.heng.feng at canonical.com>
---
 drivers/nvme/host/pci.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 7249ae74f71f..cc190324a919 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -2840,6 +2840,13 @@ static bool nvme_acpi_storage_d3(struct pci_dev *dev)
 	acpi_status status;
 	u8 val;
 
+	/*
+	 * If the device itself supports D3cold, use that instead of D0 ASPM +
+	 * NVMe APST.
+	 */
+	if (pci_pr3_present(dev))
+		return true;
+
 	/*
 	 * Look for _DSD property specifying that the storage device on the port
 	 * must use D3 to support deep platform power savings during
-- 
2.30.2




More information about the Linux-nvme mailing list