diff mbox series

[1/1,SRU,B,OEM-B] SAUCE: pci/nvme: prevent WDC PC SN720 NVMe from entering D3 and being disabled

Message ID 20181129074425.1963-2-acelan.kao@canonical.com
State New
Headers show
Series PC SN720 NVMe WDC 256GB consumes more power in S2Idle than during long idle | expand

Commit Message

AceLan Kao Nov. 29, 2018, 7:44 a.m. UTC
BugLink: https://bugs.launchpad.net/bugs/1805775

It leads to the power consumption increases 3.41W during s2idle, while it
consumes much less idle if forbidding put WDC NVMe to D3 and before
entering S2Idle.

Windows doesn't put NVMe to D3 in Modern Standby, and uses its own APST
feature to do the power management. To leverage its APST feature during
s2idle, we can't disable nvme device while suspending, too.

So, here is what we do to the driver:
- Prevent nvme from entering D3,
- Prevent nvme from being disabled when suspending.

Signed-off-by: AceLan Kao <acelan.kao@canonical.com>
---
 drivers/nvme/host/pci.c | 2 ++
 drivers/pci/quirks.c    | 1 +
 2 files changed, 3 insertions(+)

Comments

AceLan Kao Nov. 29, 2018, 8:05 a.m. UTC | #1
Can't apply on bionic and oem kernel, will resend it later.
diff mbox series

Patch

diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 5cf91d071b1a..6b71875bac65 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -2719,6 +2719,8 @@  static const struct pci_device_id nvme_id_table[] = {
 		.driver_data = NVME_QUIRK_LIGHTNVM, },
 	{ PCI_VDEVICE(SK_HYNIX, 0x1527),	/* Sk Hynix */
 		.driver_data = NVME_QUIRK_NO_DISABLE, },
+	{ PCI_DEVICE(0x15b7, 0x5002),	/* Sandisk */
+		.driver_data = NVME_QUIRK_NO_DISABLE, },
 	{ PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_EXPRESS, 0xffffff) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2001) },
 	{ PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2003) },
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 858f2c5952e7..657d951e1bda 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -1189,6 +1189,7 @@  DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_VIA, PCI_ANY_ID,
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SK_HYNIX, 0x1527, quirk_no_ata_d3);
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0xf1a6, quirk_no_ata_d3);
 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SAMSUNG, 0xa808, quirk_no_ata_d3);
+DECLARE_PCI_FIXUP_EARLY(0x15b7, 0x5002, quirk_no_ata_d3);
 
 /* This was originally an Alpha specific thing, but it really fits here.
  * The i82375 PCI/EISA bridge appears as non-classified. Fix that.