Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp5725ybt; Tue, 7 Jul 2020 14:25:34 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyYeUBfQPVGkq3xYByQ2xQ/k42Y6crtWJCSmaeFgUxap0Ti5uWJ412IIsP5DDYFbyF12MHP X-Received: by 2002:aa7:c31a:: with SMTP id l26mr60908282edq.61.1594157134077; Tue, 07 Jul 2020 14:25:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594157134; cv=none; d=google.com; s=arc-20160816; b=E7xkwHvmsLtPt9VL9A5mfVF8v8UeJi2GUHul44A8TEj7buMPL0cEAHNuKRLTCWvFXU LWqo14Wn6KyHdCTqpCnciMx+11LSjwCYpSn9gVl90OrsKszm/BUmT/5mD5ojCKZ7ECfP waShCXIvf/0Zbw9qo2O74u0XPtMhs//8O8W9UHakbgvQXwhFpG75T/hqleyjQl1cwdzj WIWMX8a8FvRqzRc+EUl/rqDxLV2UX34moKHws5m1rDy1FntfS1G/MMCVt2obDP0GWV/9 aBc2sQ2utYO6JuOS0XWn0t1qgE0VDbHTjQ0ZF15ql5xfugHLGRDOrQI94opx27Lp6Dox Ad/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:organization:references:in-reply-to:date:cc:to:reply-to :from:subject:message-id:ironport-sdr:ironport-sdr; bh=O2RG0qZSkFuvSQvS2Faa6JsgrmwoML/lRt1DT/krrHg=; b=ziVNolOmRpCwCZmxAFOeiTsnBWbfDqiLP/U+tz+jXa6+aZpz1geg52CpUdbqu2s/Gi +mnIVAIS/9nGl9vnq0P+T8xzeXIjs9YJflRTPZUjayG8VsSsc9VWxlAZQYtJjv4eOJiy 1RhJsr+611NQayglUggMTBiGucc7VA4UNHHiDy1brhDZyqLzjCtkJlWFuO/pabRt8D7J yYuVVCKAkt1dumIlnREmxuHxO0c4AC5Z+5PWBoci1L5eSRF+aKdtUG7w0aHJak2OlPqf lWUvbdtRaY4hK5SkzgdOzsIbMac0xkXebQcn0HlJtbdfuTu1YdcxR896lufYPZIsV8QA YViw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h22si16393854ejf.599.2020.07.07.14.25.11; Tue, 07 Jul 2020 14:25:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728723AbgGGVYe (ORCPT + 99 others); Tue, 7 Jul 2020 17:24:34 -0400 Received: from mga03.intel.com ([134.134.136.65]:25844 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726273AbgGGVYd (ORCPT ); Tue, 7 Jul 2020 17:24:33 -0400 IronPort-SDR: iDD+kPed5ojICKj0nHWqbLxBvtsS/pZqzHF+kp9i2l0/o8HlNYv7bZ+Rb5R3ZZzwaiAw/vvgNu bC+amjnFA9iQ== X-IronPort-AV: E=McAfee;i="6000,8403,9675"; a="147705274" X-IronPort-AV: E=Sophos;i="5.75,325,1589266800"; d="scan'208";a="147705274" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Jul 2020 14:24:32 -0700 IronPort-SDR: Qkmn4wSntn37RbEtWnsNsY6QDV+ZNtUJJ3Wg94H9QgCsFTy1T0uotSF9/siKuUkKAK2apt4DUF sb3LTU32mAdQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,325,1589266800"; d="scan'208";a="483202700" Received: from linux.intel.com ([10.54.29.200]) by fmsmga006.fm.intel.com with ESMTP; 07 Jul 2020 14:24:31 -0700 Received: from debox1-desk1.jf.intel.com (debox1-desk1.jf.intel.com [10.7.201.137]) by linux.intel.com (Postfix) with ESMTP id DAF5E5807C8; Tue, 7 Jul 2020 14:24:31 -0700 (PDT) Message-ID: <1c75a6ba5d0b84dd868e350674f8565fa9154147.camel@linux.intel.com> Subject: Re: [PATCH v4] drivers/nvme: Add support for ACPI StorageD3Enable property From: "David E. Box" Reply-To: david.e.box@linux.intel.com To: "Rafael J. Wysocki" Cc: shyjumon.n@intel.com, Dan Williams , "Rafael J. Wysocki" , Len Brown , Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg , ACPI Devel Maling List , Linux Kernel Mailing List , linux-nvme Date: Tue, 07 Jul 2020 14:24:31 -0700 In-Reply-To: References: <20200612204820.20111-1-david.e.box@linux.intel.com> <20200702225011.10932-1-david.e.box@linux.intel.com> Organization: David E. Box Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.34.4 (3.34.4-1.fc31) MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 2020-07-06 at 16:57 +0200, Rafael J. Wysocki wrote: > On Fri, Jul 3, 2020 at 12:49 AM David E. Box > wrote: > > This patch implements a solution for a BIOS hack used on some > > currently > > shipping Intel systems to change driver power management policy for > > PCIe > > NVMe drives. Some newer Intel platforms, like some Comet Lake > > systems, > > require that PCIe devices use D3 when doing suspend-to-idle in > > order to > > allow the platform to realize maximum power savings. This is > > particularly > > needed to support ATX power supply shutdown on desktop systems. In > > order to > > ensure this happens for root ports with storage devices, Microsoft > > apparently created this ACPI _DSD property as a way to influence > > their > > driver policy. To my knowledge this property has not been discussed > > with > > the NVME specification body. > > > > Though the solution is not ideal, it addresses a problem that also > > affects > > Linux since the NVMe driver's default policy of using NVMe APST > > during > > suspend-to-idle prevents the PCI root port from going to D3 and > > leads to > > higher power consumption for these platforms. The power consumption > > difference may be negligible on laptop systems, but many watts on > > desktop > > systems when the ATX power supply is blocked from powering down. > > > > The patch creates a new nvme_acpi_storage_d3 function to check for > > the > > StorageD3Enable property during probe and enables D3 as a quirk if > > set. It > > also provides a 'noacpi' module parameter to allow skipping the > > quirk if > > needed. > > > > Tested on: > > PM961 NVMe SED Samsung 512GB > > INTEL SSDPEKKF512G8 > > > > Link: > > https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/power-management-for-storage-hardware-devices-intro > > Signed-off-by: David E. Box > > --- > > Changes from V3: > > - Use pcie_find_root_port() instead of > > pci_find_pcie_root_port(), > > changed in 5.8. > > - Remove "Cc:" emails that ended up at top of V3 commit > > message. > > - Fix changelog numbering. > > > > Changes from V2: > > - Remove check for "not yet bound" ACPI companion device > > since > > this will not be a concern at driver probe time per > > Rafael. > > - Move storage_d3 function out of PCI core and into NVMe > > driver > > since there's nothing the PCI core can do with this code > > as > > noted by Bjorn. > > > > Changes from V1: > > - Export the pci_acpi_storage_d3 function for use by > > drivers as > > needed instead of modifying the pci header. > > - Add missing put on acpi device handle. > > - Add 'noacpi' module parameter to allow undoing this > > change. > > - Add info message that this is a platform quirk. > > > > drivers/acpi/property.c | 3 +++ > > drivers/nvme/host/pci.c | 55 > > +++++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 58 insertions(+) > > > > diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c > > index e601c4511a8b..c2e2ae774a19 100644 > > --- a/drivers/acpi/property.c > > +++ b/drivers/acpi/property.c > > @@ -45,6 +45,9 @@ static const guid_t prp_guids[] = { > > /* Thunderbolt GUID for WAKE_SUPPORTED: 6c501103-c189-4296- > > ba72-9bf5a26ebe5d */ > > GUID_INIT(0x6c501103, 0xc189, 0x4296, > > 0xba, 0x72, 0x9b, 0xf5, 0xa2, 0x6e, 0xbe, 0x5d), > > + /* Storage device needs D3 GUID: 5025030f-842f-4ab4-a561- > > 99a5189762d0 */ > > + GUID_INIT(0x5025030f, 0x842f, 0x4ab4, > > + 0xa5, 0x61, 0x99, 0xa5, 0x18, 0x97, 0x62, 0xd0), > > }; > > > > /* ACPI _DSD data subnodes GUID: dbb8e3e6-5886-4ba6-8795- > > 1319f52a966b */ > > diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c > > index e2bacd369a88..a3d3a82b0437 100644 > > --- a/drivers/nvme/host/pci.c > > +++ b/drivers/nvme/host/pci.c > > @@ -4,6 +4,7 @@ > > * Copyright (c) 2011-2014, Intel Corporation. > > */ > > > > +#include > > #include > > #include > > #include > > @@ -94,6 +95,10 @@ static unsigned int poll_queues; > > module_param_cb(poll_queues, &io_queue_count_ops, &poll_queues, > > 0644); > > MODULE_PARM_DESC(poll_queues, "Number of queues to use for polled > > IO."); > > > > +static bool noacpi; > > +module_param(noacpi, bool, 0444); > > +MODULE_PARM_DESC(noacpi, "disable acpi bios quirks"); > > + > > struct nvme_dev; > > struct nvme_queue; > > > > @@ -2757,6 +2762,46 @@ static unsigned long > > check_vendor_combination_bug(struct pci_dev *pdev) > > return 0; > > } > > > > +static bool nvme_acpi_storage_d3(struct pci_dev *dev) > > +{ > > + const struct fwnode_handle *fwnode; > > + struct acpi_device *adev; > > + struct pci_dev *root; > > + acpi_handle handle; > > + acpi_status status; > > + bool ret = false; > > + u8 val; > > + > > + /* > > + * Look for _DSD property specifying that the storage > > device on > > + * the port 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; > > + > > + status = acpi_get_handle(adev->handle, "PXSX", &handle); > > + if (ACPI_FAILURE(status)) > > + return false; > > + > > + adev = acpi_bus_get_acpi_device(handle); > > This function needs to be exported to modules for nvme to be able to > use it when modular. Missed that they weren't exported when I moved from pci-acpi to nvme as it worked with my config. But looking again I see there's already an acpi_bus_get_device() that's exported and should work here. Unfortunately, it would be the only function that's not stubbed out so per Cristoph's later comment, this will need a CONFIG_ACPI wrapper. David