linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH v4 1/2] PCI/PM: refactor pci_pm_suspend_noirq()
       [not found] <20220325195053.769373-1-rajvi.jingar@intel.com>
@ 2022-04-14 17:53 ` Rafael J. Wysocki
  2022-04-20 16:30   ` Bjorn Helgaas
       [not found] ` <20220325195053.769373-2-rajvi.jingar@intel.com>
  1 sibling, 1 reply; 10+ messages in thread
From: Rafael J. Wysocki @ 2022-04-14 17:53 UTC (permalink / raw)
  To: Rajvi Jingar, bhelgaas; +Cc: david.e.box, linux-pci, linux-kernel, linux-pm

On 3/25/2022 8:50 PM, Rajvi Jingar wrote:
> The state of the device is saved during pci_pm_suspend_noirq(), if it
> has not already been saved, regardless of the skip_bus_pm flag value. So
> skip_bus_pm check is removed before saving the device state.
>
> Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
> Suggested-by: David E. Box <david.e.box@linux.intel.com>

Sorry for the delay here.

Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>


> ---
>   v1 -> v2: add comments to the changes
>   v2 -> v3: move changelog after "---" marker
>   v3 -> v4: add "---" marker after changelog
> ---
>   drivers/pci/pci-driver.c | 18 ++++++------------
>   1 file changed, 6 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
> index 4ceeb75fc899..8b55a90126a2 100644
> --- a/drivers/pci/pci-driver.c
> +++ b/drivers/pci/pci-driver.c
> @@ -845,20 +845,14 @@ static int pci_pm_suspend_noirq(struct device *dev)
>   		}
>   	}
>   
> -	if (pci_dev->skip_bus_pm) {
> +	if (!pci_dev->state_saved) {
> +		pci_save_state(pci_dev);
>   		/*
> -		 * Either the device is a bridge with a child in D0 below it, or
> -		 * the function is running for the second time in a row without
> -		 * going through full resume, which is possible only during
> -		 * suspend-to-idle in a spurious wakeup case.  The device should
> -		 * be in D0 at this point, but if it is a bridge, it may be
> -		 * necessary to save its state.
> +		 * If the device is a bridge with a child in D0 below it, it needs to
> +		 * stay in D0, so check skip_bus_pm to avoid putting it into a
> +		 * low-power state in that case.
>   		 */
> -		if (!pci_dev->state_saved)
> -			pci_save_state(pci_dev);
> -	} else if (!pci_dev->state_saved) {
> -		pci_save_state(pci_dev);
> -		if (pci_power_manageable(pci_dev))
> +		if (!pci_dev->skip_bus_pm && pci_power_manageable(pci_dev))
>   			pci_prepare_to_sleep(pci_dev);
>   	}
>   



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v4 2/2] PCI/PM: Fix pci_pm_suspend_noirq() to disable PTM
       [not found] ` <20220325195053.769373-2-rajvi.jingar@intel.com>
@ 2022-04-14 17:54   ` Rafael J. Wysocki
  2022-04-22 22:24     ` Bjorn Helgaas
  0 siblings, 1 reply; 10+ messages in thread
From: Rafael J. Wysocki @ 2022-04-14 17:54 UTC (permalink / raw)
  To: Rajvi Jingar, bhelgaas; +Cc: david.e.box, linux-pci, linux-kernel, linux-pm

On 3/25/2022 8:50 PM, Rajvi Jingar wrote:
> For the PCIe devices (like nvme) that do not go into D3 state still need to
> disable PTM on PCIe root ports to allow the port to enter a lower-power PM
> state and the SoC to reach a lower-power idle state as a whole. Move the
> pci_disable_ptm() out of pci_prepare_to_sleep() as this code path is not
> followed for devices that do not go into D3. This patch fixes the issue
> seen on Dell XPS 9300 with Ice Lake CPU and Dell Precision 5530 with Coffee
> Lake CPU platforms to get improved residency in low power idle states.
>
> Fixes: a697f072f5da ("PCI: Disable PTM during suspend to save power")
> Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
> Suggested-by: David E. Box <david.e.box@linux.intel.com>

Sorry for the delay here.

Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>


> ---
>   v1 -> v2: add Fixes tag in commit message
>   v2 -> v3: move changelog after "---" marker
>   v3 -> v4: add "---" marker after changelog
> ---
>   drivers/pci/pci-driver.c | 10 ++++++++++
>   drivers/pci/pci.c        | 10 ----------
>   2 files changed, 10 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
> index 8b55a90126a2..ab733374a260 100644
> --- a/drivers/pci/pci-driver.c
> +++ b/drivers/pci/pci-driver.c
> @@ -847,6 +847,16 @@ static int pci_pm_suspend_noirq(struct device *dev)
>   
>   	if (!pci_dev->state_saved) {
>   		pci_save_state(pci_dev);
> +		/*
> +		 * There are systems (for example, Intel mobile chips since Coffee
> +		 * Lake) where the power drawn while suspended can be significantly
> +		 * reduced by disabling PTM on PCIe root ports as this allows the
> +		 * port to enter a lower-power PM state and the SoC to reach a
> +		 * lower-power idle state as a whole.
> +		 */
> +		if (pci_pcie_type(pci_dev) == PCI_EXP_TYPE_ROOT_PORT)
> +			pci_disable_ptm(pci_dev);
> +
>   		/*
>   		 * If the device is a bridge with a child in D0 below it, it needs to
>   		 * stay in D0, so check skip_bus_pm to avoid putting it into a
> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> index 9ecce435fb3f..f8768672c064 100644
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -2660,16 +2660,6 @@ int pci_prepare_to_sleep(struct pci_dev *dev)
>   	if (target_state == PCI_POWER_ERROR)
>   		return -EIO;
>   
> -	/*
> -	 * There are systems (for example, Intel mobile chips since Coffee
> -	 * Lake) where the power drawn while suspended can be significantly
> -	 * reduced by disabling PTM on PCIe root ports as this allows the
> -	 * port to enter a lower-power PM state and the SoC to reach a
> -	 * lower-power idle state as a whole.
> -	 */
> -	if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT)
> -		pci_disable_ptm(dev);
> -
>   	pci_enable_wake(dev, target_state, wakeup);
>   
>   	error = pci_set_power_state(dev, target_state);



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v4 1/2] PCI/PM: refactor pci_pm_suspend_noirq()
  2022-04-14 17:53 ` [PATCH v4 1/2] PCI/PM: refactor pci_pm_suspend_noirq() Rafael J. Wysocki
@ 2022-04-20 16:30   ` Bjorn Helgaas
  0 siblings, 0 replies; 10+ messages in thread
From: Bjorn Helgaas @ 2022-04-20 16:30 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Rajvi Jingar, bhelgaas, david.e.box, linux-pci, linux-kernel, linux-pm

On Thu, Apr 14, 2022 at 07:53:25PM +0200, Rafael J. Wysocki wrote:
> On 3/25/2022 8:50 PM, Rajvi Jingar wrote:
> > The state of the device is saved during pci_pm_suspend_noirq(), if it
> > has not already been saved, regardless of the skip_bus_pm flag value. So
> > skip_bus_pm check is removed before saving the device state.
> > 
> > Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
> > Suggested-by: David E. Box <david.e.box@linux.intel.com>
> 
> Sorry for the delay here.
> 
> Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

Rajvi, can you post these again?  It looks like they didn't make it to
the linux-pci mailing list, and I can't find them in the lore archives:

  https://lore.kernel.org/all/?q=f%3Arajvi.jingar

Maybe some formatting issue that vger didn't like?  Some possible
issues here:

  http://vger.kernel.org/majordomo-info.html

They should appear on the list so others can comment and so the lore
URL can be included in the commit when applying.

Please incorporate Rafael's reviewed-by when you repost.

> > ---
> >   v1 -> v2: add comments to the changes
> >   v2 -> v3: move changelog after "---" marker
> >   v3 -> v4: add "---" marker after changelog
> > ---
> >   drivers/pci/pci-driver.c | 18 ++++++------------
> >   1 file changed, 6 insertions(+), 12 deletions(-)
> > 
> > diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
> > index 4ceeb75fc899..8b55a90126a2 100644
> > --- a/drivers/pci/pci-driver.c
> > +++ b/drivers/pci/pci-driver.c
> > @@ -845,20 +845,14 @@ static int pci_pm_suspend_noirq(struct device *dev)
> >   		}
> >   	}
> > -	if (pci_dev->skip_bus_pm) {
> > +	if (!pci_dev->state_saved) {
> > +		pci_save_state(pci_dev);
> >   		/*
> > -		 * Either the device is a bridge with a child in D0 below it, or
> > -		 * the function is running for the second time in a row without
> > -		 * going through full resume, which is possible only during
> > -		 * suspend-to-idle in a spurious wakeup case.  The device should
> > -		 * be in D0 at this point, but if it is a bridge, it may be
> > -		 * necessary to save its state.
> > +		 * If the device is a bridge with a child in D0 below it, it needs to
> > +		 * stay in D0, so check skip_bus_pm to avoid putting it into a
> > +		 * low-power state in that case.
> >   		 */
> > -		if (!pci_dev->state_saved)
> > -			pci_save_state(pci_dev);
> > -	} else if (!pci_dev->state_saved) {
> > -		pci_save_state(pci_dev);
> > -		if (pci_power_manageable(pci_dev))
> > +		if (!pci_dev->skip_bus_pm && pci_power_manageable(pci_dev))
> >   			pci_prepare_to_sleep(pci_dev);
> >   	}
> 
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v4 2/2] PCI/PM: Fix pci_pm_suspend_noirq() to disable PTM
  2022-04-14 17:54   ` [PATCH v4 2/2] PCI/PM: Fix pci_pm_suspend_noirq() to disable PTM Rafael J. Wysocki
@ 2022-04-22 22:24     ` Bjorn Helgaas
  2022-04-23  0:43       ` Jingar, Rajvi
  0 siblings, 1 reply; 10+ messages in thread
From: Bjorn Helgaas @ 2022-04-22 22:24 UTC (permalink / raw)
  To: Rajvi Jingar
  Cc: bhelgaas, david.e.box, linux-pci, linux-kernel, linux-pm,
	Rafael J. Wysocki, Kai-Heng Feng, mika.westerberg, koba.ko,
	baolu.lu, sathyanarayanan.kuppuswamy, Russell Currey,
	Oliver O'Halloran, linuxppc-dev

[+cc other folks interested in PTM from https://lore.kernel.org/r/20220408153159.106741-1-kai.heng.feng@canonical.com]

On Thu, Apr 14, 2022 at 07:54:02PM +0200, Rafael J. Wysocki wrote:
> On 3/25/2022 8:50 PM, Rajvi Jingar wrote:
> > For the PCIe devices (like nvme) that do not go into D3 state still need to
> > disable PTM on PCIe root ports to allow the port to enter a lower-power PM
> > state and the SoC to reach a lower-power idle state as a whole. Move the
> > pci_disable_ptm() out of pci_prepare_to_sleep() as this code path is not
> > followed for devices that do not go into D3. This patch fixes the issue
> > seen on Dell XPS 9300 with Ice Lake CPU and Dell Precision 5530 with Coffee
> > Lake CPU platforms to get improved residency in low power idle states.
> > 
> > Fixes: a697f072f5da ("PCI: Disable PTM during suspend to save power")
> > Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
> > Suggested-by: David E. Box <david.e.box@linux.intel.com>

> > ---
> >   v1 -> v2: add Fixes tag in commit message
> >   v2 -> v3: move changelog after "---" marker
> >   v3 -> v4: add "---" marker after changelog
> > ---
> >   drivers/pci/pci-driver.c | 10 ++++++++++
> >   drivers/pci/pci.c        | 10 ----------
> >   2 files changed, 10 insertions(+), 10 deletions(-)
> > 
> > diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
> > index 8b55a90126a2..ab733374a260 100644
> > --- a/drivers/pci/pci-driver.c
> > +++ b/drivers/pci/pci-driver.c
> > @@ -847,6 +847,16 @@ static int pci_pm_suspend_noirq(struct device *dev)
> >   	if (!pci_dev->state_saved) {
> >   		pci_save_state(pci_dev);
> > +		/*
> > +		 * There are systems (for example, Intel mobile chips since Coffee
> > +		 * Lake) where the power drawn while suspended can be significantly
> > +		 * reduced by disabling PTM on PCIe root ports as this allows the
> > +		 * port to enter a lower-power PM state and the SoC to reach a
> > +		 * lower-power idle state as a whole.
> > +		 */
> > +		if (pci_pcie_type(pci_dev) == PCI_EXP_TYPE_ROOT_PORT)
> > +			pci_disable_ptm(pci_dev);

Why is disabling PTM dependent on pci_dev->state_saved?  The point of
this is to change the behavior of the device, and it seems like we
want to do that regardless of whether the driver has used
pci_save_state().

Bjorn

^ permalink raw reply	[flat|nested] 10+ messages in thread

* RE: [PATCH v4 2/2] PCI/PM: Fix pci_pm_suspend_noirq() to disable PTM
  2022-04-22 22:24     ` Bjorn Helgaas
@ 2022-04-23  0:43       ` Jingar, Rajvi
  2022-04-23 15:01         ` Bjorn Helgaas
  0 siblings, 1 reply; 10+ messages in thread
From: Jingar, Rajvi @ 2022-04-23  0:43 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: bhelgaas, david.e.box, linux-pci, linux-kernel, linux-pm,
	Wysocki, Rafael J, Kai-Heng Feng, mika.westerberg, koba.ko,
	baolu.lu, sathyanarayanan.kuppuswamy, Russell Currey,
	Oliver O'Halloran, linuxppc-dev


> -----Original Message-----
> From: Bjorn Helgaas <helgaas@kernel.org>
> Sent: Friday, April 22, 2022 3:25 PM
> To: Jingar, Rajvi <rajvi.jingar@intel.com>
> Cc: bhelgaas@google.com; david.e.box@linux.intel.com; linux-
> pci@vger.kernel.org; linux-kernel@vger.kernel.org; linux-pm@vger.kernel.org;
> Wysocki, Rafael J <rafael.j.wysocki@intel.com>; Kai-Heng Feng
> <kai.heng.feng@canonical.com>; mika.westerberg@linux.intel.com;
> koba.ko@canonical.com; baolu.lu@linux.intel.com;
> sathyanarayanan.kuppuswamy@linux.intel.com; Russell Currey
> <ruscur@russell.cc>; Oliver O'Halloran <oohall@gmail.com>; linuxppc-
> dev@lists.ozlabs.org
> Subject: Re: [PATCH v4 2/2] PCI/PM: Fix pci_pm_suspend_noirq() to disable PTM
> 
> [+cc other folks interested in PTM from
> https://lore.kernel.org/r/20220408153159.106741-1-
> kai.heng.feng@canonical.com]
> 
> On Thu, Apr 14, 2022 at 07:54:02PM +0200, Rafael J. Wysocki wrote:
> > On 3/25/2022 8:50 PM, Rajvi Jingar wrote:
> > > For the PCIe devices (like nvme) that do not go into D3 state still need to
> > > disable PTM on PCIe root ports to allow the port to enter a lower-power PM
> > > state and the SoC to reach a lower-power idle state as a whole. Move the
> > > pci_disable_ptm() out of pci_prepare_to_sleep() as this code path is not
> > > followed for devices that do not go into D3. This patch fixes the issue
> > > seen on Dell XPS 9300 with Ice Lake CPU and Dell Precision 5530 with Coffee
> > > Lake CPU platforms to get improved residency in low power idle states.
> > >
> > > Fixes: a697f072f5da ("PCI: Disable PTM during suspend to save power")
> > > Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
> > > Suggested-by: David E. Box <david.e.box@linux.intel.com>
> 
> > > ---
> > >   v1 -> v2: add Fixes tag in commit message
> > >   v2 -> v3: move changelog after "---" marker
> > >   v3 -> v4: add "---" marker after changelog
> > > ---
> > >   drivers/pci/pci-driver.c | 10 ++++++++++
> > >   drivers/pci/pci.c        | 10 ----------
> > >   2 files changed, 10 insertions(+), 10 deletions(-)
> > >
> > > diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
> > > index 8b55a90126a2..ab733374a260 100644
> > > --- a/drivers/pci/pci-driver.c
> > > +++ b/drivers/pci/pci-driver.c
> > > @@ -847,6 +847,16 @@ static int pci_pm_suspend_noirq(struct device *dev)
> > >   	if (!pci_dev->state_saved) {
> > >   		pci_save_state(pci_dev);
> > > +		/*
> > > +		 * There are systems (for example, Intel mobile chips since
> Coffee
> > > +		 * Lake) where the power drawn while suspended can be
> significantly
> > > +		 * reduced by disabling PTM on PCIe root ports as this allows the
> > > +		 * port to enter a lower-power PM state and the SoC to reach a
> > > +		 * lower-power idle state as a whole.
> > > +		 */
> > > +		if (pci_pcie_type(pci_dev) == PCI_EXP_TYPE_ROOT_PORT)
> > > +			pci_disable_ptm(pci_dev);
> 
> Why is disabling PTM dependent on pci_dev->state_saved?  The point of
> this is to change the behavior of the device, and it seems like we
> want to do that regardless of whether the driver has used
> pci_save_state().
> 

Because we use the saved state to restore PTM on the root port. 
And it's under this condition that the root port state gets saved.

> Bjorn

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v4 2/2] PCI/PM: Fix pci_pm_suspend_noirq() to disable PTM
  2022-04-23  0:43       ` Jingar, Rajvi
@ 2022-04-23 15:01         ` Bjorn Helgaas
  2022-04-25 18:32           ` David E. Box
  0 siblings, 1 reply; 10+ messages in thread
From: Bjorn Helgaas @ 2022-04-23 15:01 UTC (permalink / raw)
  To: Jingar, Rajvi
  Cc: bhelgaas, david.e.box, linux-pci, linux-kernel, linux-pm,
	Wysocki, Rafael J, Kai-Heng Feng, mika.westerberg, koba.ko,
	baolu.lu, sathyanarayanan.kuppuswamy, Russell Currey,
	Oliver O'Halloran, linuxppc-dev

On Sat, Apr 23, 2022 at 12:43:14AM +0000, Jingar, Rajvi wrote:
> > -----Original Message-----
> > From: Bjorn Helgaas <helgaas@kernel.org>
> > On Thu, Apr 14, 2022 at 07:54:02PM +0200, Rafael J. Wysocki wrote:
> > > On 3/25/2022 8:50 PM, Rajvi Jingar wrote:
> > > > For the PCIe devices (like nvme) that do not go into D3 state still need to
> > > > disable PTM on PCIe root ports to allow the port to enter a lower-power PM
> > > > state and the SoC to reach a lower-power idle state as a whole. Move the
> > > > pci_disable_ptm() out of pci_prepare_to_sleep() as this code path is not
> > > > followed for devices that do not go into D3. This patch fixes the issue
> > > > seen on Dell XPS 9300 with Ice Lake CPU and Dell Precision 5530 with Coffee
> > > > Lake CPU platforms to get improved residency in low power idle states.
> > > >
> > > > Fixes: a697f072f5da ("PCI: Disable PTM during suspend to save power")
> > > > Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
> > > > Suggested-by: David E. Box <david.e.box@linux.intel.com>
> > > > ---
> > > >   drivers/pci/pci-driver.c | 10 ++++++++++
> > > >   drivers/pci/pci.c        | 10 ----------
> > > >   2 files changed, 10 insertions(+), 10 deletions(-)
> > > >
> > > > diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
> > > > index 8b55a90126a2..ab733374a260 100644
> > > > --- a/drivers/pci/pci-driver.c
> > > > +++ b/drivers/pci/pci-driver.c
> > > > @@ -847,6 +847,16 @@ static int pci_pm_suspend_noirq(struct device *dev)
> > > >   	if (!pci_dev->state_saved) {
> > > >   		pci_save_state(pci_dev);
> > > > +		/*
> > > > +		 * There are systems (for example, Intel mobile chips since
> > Coffee
> > > > +		 * Lake) where the power drawn while suspended can be
> > significantly
> > > > +		 * reduced by disabling PTM on PCIe root ports as this allows the
> > > > +		 * port to enter a lower-power PM state and the SoC to reach a
> > > > +		 * lower-power idle state as a whole.
> > > > +		 */
> > > > +		if (pci_pcie_type(pci_dev) == PCI_EXP_TYPE_ROOT_PORT)
> > > > +			pci_disable_ptm(pci_dev);
> > 
> > Why is disabling PTM dependent on pci_dev->state_saved?  The point of
> > this is to change the behavior of the device, and it seems like we
> > want to do that regardless of whether the driver has used
> > pci_save_state().
> 
> Because we use the saved state to restore PTM on the root port. 
> And it's under this condition that the root port state gets saved.

Yes, I understand that pci_restore_ptm_state() depends on a previous
call to pci_save_ptm_state().

The point I'm trying to make is that pci_disable_ptm() changes the
state of the device, and that state change should not depend on
whether the driver has used pci_save_state().

When we're putting a device into a low-power state, I think we want to
disable PTM *always*, no matter what the driver did.  And I think we
want to do it for all devices, not just Root Ports.

Bjorn

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v4 2/2] PCI/PM: Fix pci_pm_suspend_noirq() to disable PTM
  2022-04-23 15:01         ` Bjorn Helgaas
@ 2022-04-25 18:32           ` David E. Box
  2022-04-25 18:39             ` Rafael J. Wysocki
  2022-04-26 16:50             ` Bjorn Helgaas
  0 siblings, 2 replies; 10+ messages in thread
From: David E. Box @ 2022-04-25 18:32 UTC (permalink / raw)
  To: Bjorn Helgaas, Jingar, Rajvi
  Cc: bhelgaas, linux-pci, linux-kernel, linux-pm, Wysocki, Rafael J,
	Kai-Heng Feng, mika.westerberg, koba.ko, baolu.lu,
	sathyanarayanan.kuppuswamy, Russell Currey,
	Oliver O'Halloran, linuxppc-dev

On Sat, 2022-04-23 at 10:01 -0500, Bjorn Helgaas wrote:
> On Sat, Apr 23, 2022 at 12:43:14AM +0000, Jingar, Rajvi wrote:
> > > -----Original Message-----
> > > From: Bjorn Helgaas <helgaas@kernel.org>
> > > On Thu, Apr 14, 2022 at 07:54:02PM +0200, Rafael J. Wysocki wrote:
> > > > On 3/25/2022 8:50 PM, Rajvi Jingar wrote:
> > > > > For the PCIe devices (like nvme) that do not go into D3 state still
> > > > > need to
> > > > > disable PTM on PCIe root ports to allow the port to enter a lower-
> > > > > power PM
> > > > > state and the SoC to reach a lower-power idle state as a whole. Move
> > > > > the
> > > > > pci_disable_ptm() out of pci_prepare_to_sleep() as this code path is
> > > > > not
> > > > > followed for devices that do not go into D3. This patch fixes the
> > > > > issue
> > > > > seen on Dell XPS 9300 with Ice Lake CPU and Dell Precision 5530 with
> > > > > Coffee
> > > > > Lake CPU platforms to get improved residency in low power idle states.
> > > > > 
> > > > > Fixes: a697f072f5da ("PCI: Disable PTM during suspend to save power")
> > > > > Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
> > > > > Suggested-by: David E. Box <david.e.box@linux.intel.com>
> > > > > ---
> > > > >   drivers/pci/pci-driver.c | 10 ++++++++++
> > > > >   drivers/pci/pci.c        | 10 ----------
> > > > >   2 files changed, 10 insertions(+), 10 deletions(-)
> > > > > 
> > > > > diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
> > > > > index 8b55a90126a2..ab733374a260 100644
> > > > > --- a/drivers/pci/pci-driver.c
> > > > > +++ b/drivers/pci/pci-driver.c
> > > > > @@ -847,6 +847,16 @@ static int pci_pm_suspend_noirq(struct device
> > > > > *dev)
> > > > >   	if (!pci_dev->state_saved) {
> > > > >   		pci_save_state(pci_dev);
> > > > > +		/*
> > > > > +		 * There are systems (for example, Intel mobile chips
> > > > > since
> > > Coffee
> > > > > +		 * Lake) where the power drawn while suspended can be
> > > significantly
> > > > > +		 * reduced by disabling PTM on PCIe root ports as this
> > > > > allows the
> > > > > +		 * port to enter a lower-power PM state and the SoC to
> > > > > reach a
> > > > > +		 * lower-power idle state as a whole.
> > > > > +		 */
> > > > > +		if (pci_pcie_type(pci_dev) == PCI_EXP_TYPE_ROOT_PORT)
> > > > > +			pci_disable_ptm(pci_dev);
> > > 
> > > Why is disabling PTM dependent on pci_dev->state_saved?  The point of
> > > this is to change the behavior of the device, and it seems like we
> > > want to do that regardless of whether the driver has used
> > > pci_save_state().
> > 
> > Because we use the saved state to restore PTM on the root port. 
> > And it's under this condition that the root port state gets saved.
> 
> Yes, I understand that pci_restore_ptm_state() depends on a previous
> call to pci_save_ptm_state().
> 
> The point I'm trying to make is that pci_disable_ptm() changes the
> state of the device, and that state change should not depend on
> whether the driver has used pci_save_state().

We do it here because D3 depends on whether the device state was saved by the
driver.

	if (!pci_dev->state_saved) {
        	pci_save_state(pci_dev);

		/* disable PTM here */

		if (pci_power_manageable(pci_dev))
			pci_prepare_to_sleep(pci_dev);
	}


If we disable PTM before the check, we will have saved "PTM disabled" as the
restore state. And we can't do it after the check as the device will be in D3.

As to disabling PTM on all devices, I see no problem with this, but the
reasoning is different. We disabled the root port PTM for power savings.


David

> 
> When we're putting a device into a low-power state, I think we want to
> disable PTM *always*, no matter what the driver did.  And I think we
> want to do it for all devices, not just Root Ports.
> 
> Bjorn


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v4 2/2] PCI/PM: Fix pci_pm_suspend_noirq() to disable PTM
  2022-04-25 18:32           ` David E. Box
@ 2022-04-25 18:39             ` Rafael J. Wysocki
  2022-04-26 16:50             ` Bjorn Helgaas
  1 sibling, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2022-04-25 18:39 UTC (permalink / raw)
  To: David Box, Bjorn Helgaas
  Cc: Jingar, Rajvi, bhelgaas, linux-pci, linux-kernel, linux-pm,
	Wysocki, Rafael J, Kai-Heng Feng, mika.westerberg, koba.ko,
	baolu.lu, sathyanarayanan.kuppuswamy, Russell Currey,
	Oliver O'Halloran, linuxppc-dev

On Mon, Apr 25, 2022 at 8:33 PM David E. Box
<david.e.box@linux.intel.com> wrote:
>
> On Sat, 2022-04-23 at 10:01 -0500, Bjorn Helgaas wrote:
> > On Sat, Apr 23, 2022 at 12:43:14AM +0000, Jingar, Rajvi wrote:
> > > > -----Original Message-----
> > > > From: Bjorn Helgaas <helgaas@kernel.org>
> > > > On Thu, Apr 14, 2022 at 07:54:02PM +0200, Rafael J. Wysocki wrote:
> > > > > On 3/25/2022 8:50 PM, Rajvi Jingar wrote:
> > > > > > For the PCIe devices (like nvme) that do not go into D3 state still
> > > > > > need to
> > > > > > disable PTM on PCIe root ports to allow the port to enter a lower-
> > > > > > power PM
> > > > > > state and the SoC to reach a lower-power idle state as a whole. Move
> > > > > > the
> > > > > > pci_disable_ptm() out of pci_prepare_to_sleep() as this code path is
> > > > > > not
> > > > > > followed for devices that do not go into D3. This patch fixes the
> > > > > > issue
> > > > > > seen on Dell XPS 9300 with Ice Lake CPU and Dell Precision 5530 with
> > > > > > Coffee
> > > > > > Lake CPU platforms to get improved residency in low power idle states.
> > > > > >
> > > > > > Fixes: a697f072f5da ("PCI: Disable PTM during suspend to save power")
> > > > > > Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
> > > > > > Suggested-by: David E. Box <david.e.box@linux.intel.com>
> > > > > > ---
> > > > > >   drivers/pci/pci-driver.c | 10 ++++++++++
> > > > > >   drivers/pci/pci.c        | 10 ----------
> > > > > >   2 files changed, 10 insertions(+), 10 deletions(-)
> > > > > >
> > > > > > diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
> > > > > > index 8b55a90126a2..ab733374a260 100644
> > > > > > --- a/drivers/pci/pci-driver.c
> > > > > > +++ b/drivers/pci/pci-driver.c
> > > > > > @@ -847,6 +847,16 @@ static int pci_pm_suspend_noirq(struct device
> > > > > > *dev)
> > > > > >       if (!pci_dev->state_saved) {
> > > > > >               pci_save_state(pci_dev);
> > > > > > +             /*
> > > > > > +              * There are systems (for example, Intel mobile chips
> > > > > > since
> > > > Coffee
> > > > > > +              * Lake) where the power drawn while suspended can be
> > > > significantly
> > > > > > +              * reduced by disabling PTM on PCIe root ports as this
> > > > > > allows the
> > > > > > +              * port to enter a lower-power PM state and the SoC to
> > > > > > reach a
> > > > > > +              * lower-power idle state as a whole.
> > > > > > +              */
> > > > > > +             if (pci_pcie_type(pci_dev) == PCI_EXP_TYPE_ROOT_PORT)
> > > > > > +                     pci_disable_ptm(pci_dev);
> > > >
> > > > Why is disabling PTM dependent on pci_dev->state_saved?  The point of
> > > > this is to change the behavior of the device, and it seems like we
> > > > want to do that regardless of whether the driver has used
> > > > pci_save_state().
> > >
> > > Because we use the saved state to restore PTM on the root port.
> > > And it's under this condition that the root port state gets saved.
> >
> > Yes, I understand that pci_restore_ptm_state() depends on a previous
> > call to pci_save_ptm_state().
> >
> > The point I'm trying to make is that pci_disable_ptm() changes the
> > state of the device, and that state change should not depend on
> > whether the driver has used pci_save_state().
>
> We do it here because D3 depends on whether the device state was saved by the
> driver.
>
>         if (!pci_dev->state_saved) {
>                 pci_save_state(pci_dev);
>
>                 /* disable PTM here */
>
>                 if (pci_power_manageable(pci_dev))
>                         pci_prepare_to_sleep(pci_dev);
>         }
>
>
> If we disable PTM before the check, we will have saved "PTM disabled" as the
> restore state. And we can't do it after the check as the device will be in D3.
>
> As to disabling PTM on all devices, I see no problem with this, but the
> reasoning is different. We disabled the root port PTM for power savings.

Right.  As per the comment explaining why it is disabled.

> >
> > When we're putting a device into a low-power state, I think we want to
> > disable PTM *always*, no matter what the driver did.  And I think we
> > want to do it for all devices, not just Root Ports.
> >
> > Bjorn
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v4 2/2] PCI/PM: Fix pci_pm_suspend_noirq() to disable PTM
  2022-04-25 18:32           ` David E. Box
  2022-04-25 18:39             ` Rafael J. Wysocki
@ 2022-04-26 16:50             ` Bjorn Helgaas
  2022-04-27  4:22               ` David E. Box
  1 sibling, 1 reply; 10+ messages in thread
From: Bjorn Helgaas @ 2022-04-26 16:50 UTC (permalink / raw)
  To: David E. Box
  Cc: Jingar, Rajvi, bhelgaas, linux-pci, linux-kernel, linux-pm,
	Wysocki, Rafael J, Kai-Heng Feng, mika.westerberg, koba.ko,
	baolu.lu, sathyanarayanan.kuppuswamy, Russell Currey,
	Oliver O'Halloran, linuxppc-dev

On Mon, Apr 25, 2022 at 11:32:54AM -0700, David E. Box wrote:
> On Sat, 2022-04-23 at 10:01 -0500, Bjorn Helgaas wrote:
> > On Sat, Apr 23, 2022 at 12:43:14AM +0000, Jingar, Rajvi wrote:
> > > > -----Original Message-----
> > > > From: Bjorn Helgaas <helgaas@kernel.org>
> > > > On Thu, Apr 14, 2022 at 07:54:02PM +0200, Rafael J. Wysocki wrote:
> > > > > On 3/25/2022 8:50 PM, Rajvi Jingar wrote:
> > > > > > For the PCIe devices (like nvme) that do not go into D3 state still
> > > > > > need to
> > > > > > disable PTM on PCIe root ports to allow the port to enter a lower-
> > > > > > power PM
> > > > > > state and the SoC to reach a lower-power idle state as a whole. Move
> > > > > > the
> > > > > > pci_disable_ptm() out of pci_prepare_to_sleep() as this code path is
> > > > > > not
> > > > > > followed for devices that do not go into D3. This patch fixes the
> > > > > > issue
> > > > > > seen on Dell XPS 9300 with Ice Lake CPU and Dell Precision 5530 with
> > > > > > Coffee
> > > > > > Lake CPU platforms to get improved residency in low power idle states.
> > > > > > 
> > > > > > Fixes: a697f072f5da ("PCI: Disable PTM during suspend to save power")
> > > > > > Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
> > > > > > Suggested-by: David E. Box <david.e.box@linux.intel.com>
> > > > > > ---
> > > > > >   drivers/pci/pci-driver.c | 10 ++++++++++
> > > > > >   drivers/pci/pci.c        | 10 ----------
> > > > > >   2 files changed, 10 insertions(+), 10 deletions(-)
> > > > > > 
> > > > > > diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
> > > > > > index 8b55a90126a2..ab733374a260 100644
> > > > > > --- a/drivers/pci/pci-driver.c
> > > > > > +++ b/drivers/pci/pci-driver.c
> > > > > > @@ -847,6 +847,16 @@ static int pci_pm_suspend_noirq(struct device
> > > > > > *dev)
> > > > > >   	if (!pci_dev->state_saved) {
> > > > > >   		pci_save_state(pci_dev);
> > > > > > +		/*
> > > > > > +		 * There are systems (for example, Intel mobile chips
> > > > > > since
> > > > Coffee
> > > > > > +		 * Lake) where the power drawn while suspended can be
> > > > significantly
> > > > > > +		 * reduced by disabling PTM on PCIe root ports as this
> > > > > > allows the
> > > > > > +		 * port to enter a lower-power PM state and the SoC to
> > > > > > reach a
> > > > > > +		 * lower-power idle state as a whole.
> > > > > > +		 */
> > > > > > +		if (pci_pcie_type(pci_dev) == PCI_EXP_TYPE_ROOT_PORT)
> > > > > > +			pci_disable_ptm(pci_dev);
> > > > 
> > > > Why is disabling PTM dependent on pci_dev->state_saved?  The
> > > > point of this is to change the behavior of the device, and it
> > > > seems like we want to do that regardless of whether the driver
> > > > has used pci_save_state().
> > > 
> > > Because we use the saved state to restore PTM on the root port.
> > > And it's under this condition that the root port state gets
> > > saved.
> > 
> > Yes, I understand that pci_restore_ptm_state() depends on a
> > previous call to pci_save_ptm_state().
> > 
> > The point I'm trying to make is that pci_disable_ptm() changes the
> > state of the device, and that state change should not depend on
> > whether the driver has used pci_save_state().
> 
> We do it here because D3 depends on whether the device state was
> saved by the driver.
> 
> 	if (!pci_dev->state_saved) {
>         	pci_save_state(pci_dev);
> 
> 		/* disable PTM here */
> 
> 		if (pci_power_manageable(pci_dev))
> 			pci_prepare_to_sleep(pci_dev);
> 	}
> 
> 
> If we disable PTM before the check, we will have saved "PTM
> disabled" as the restore state. And we can't do it after the check
> as the device will be in D3.

Are you suggesting that PTM should be left enabled if the driver
called pci_save_state(), but disabled otherwise?  I don't see the
rationale for that.

I don't understand all the paths through pci_pm_suspend_noirq() (e.g.,
skip_bus_pm), but for this one, I think we could do something like
this:

  driver_saved = pci_dev->state_saved;
  if (!driver_saved)
    pci_save_state(pci_dev);

  pci_disable_ptm(pci_dev);

  if (!driver_saved) {
    if (pci_power_manageable(pci_dev))
      pci_prepare_to_sleep(pci_dev);
  }

Or I guess one could argue that a driver calling pci_save_state() is
implicitly taking responsibility for all PCI-related suspend work, and
it should be disabling PTM itself.  But that doesn't really seem
maintainable.

> As to disabling PTM on all devices, I see no problem with this, but the
> reasoning is different. We disabled the root port PTM for power savings.

The power saving is good.  I'm trying to make the argument that we
need to disable PTM on all devices for correctness.

If we disable PTM on the root port, are we guaranteed that it will
never receive a PTM Request from a downstream device?  Per PCIe r6.0,
sec 6.21.3, such a request would cause an Unsupported Request error.

I sort of expect that if we're putting a root port in a low-power
state, all downstream devices are already in the same or a lower-power
state (but I don't understand PM well enough to be confident).

And I don't really *expect* devices in a low-power state to generate
PTM Requests, but I haven't seen anything in the spec that prohibits
it.

This leads me to believe that if we disable PTM in a root port, we
must first disable PTM in any downstream devices.  Otherwise, the root
port may log UR errors if the downstream device issues a PTM Request.

> > When we're putting a device into a low-power state, I think we want to
> > disable PTM *always*, no matter what the driver did.  And I think we
> > want to do it for all devices, not just Root Ports.
> > 
> > Bjorn
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v4 2/2] PCI/PM: Fix pci_pm_suspend_noirq() to disable PTM
  2022-04-26 16:50             ` Bjorn Helgaas
@ 2022-04-27  4:22               ` David E. Box
  0 siblings, 0 replies; 10+ messages in thread
From: David E. Box @ 2022-04-27  4:22 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: Jingar, Rajvi, bhelgaas, linux-pci, linux-kernel, linux-pm,
	Wysocki, Rafael J, Kai-Heng Feng, mika.westerberg, koba.ko,
	baolu.lu, sathyanarayanan.kuppuswamy, Russell Currey,
	Oliver O'Halloran, linuxppc-dev

On Tue, 2022-04-26 at 11:50 -0500, Bjorn Helgaas wrote:
> On Mon, Apr 25, 2022 at 11:32:54AM -0700, David E. Box wrote:
> > On Sat, 2022-04-23 at 10:01 -0500, Bjorn Helgaas wrote:
> > > On Sat, Apr 23, 2022 at 12:43:14AM +0000, Jingar, Rajvi wrote:
> > > > > -----Original Message-----
> > > > > From: Bjorn Helgaas <helgaas@kernel.org>
> > > > > On Thu, Apr 14, 2022 at 07:54:02PM +0200, Rafael J. Wysocki wrote:
> > > > > > On 3/25/2022 8:50 PM, Rajvi Jingar wrote:
> > > > > > > For the PCIe devices (like nvme) that do not go into D3 state
> > > > > > > still
> > > > > > > need to
> > > > > > > disable PTM on PCIe root ports to allow the port to enter a lower-
> > > > > > > power PM
> > > > > > > state and the SoC to reach a lower-power idle state as a whole.
> > > > > > > Move
> > > > > > > the
> > > > > > > pci_disable_ptm() out of pci_prepare_to_sleep() as this code path
> > > > > > > is
> > > > > > > not
> > > > > > > followed for devices that do not go into D3. This patch fixes the
> > > > > > > issue
> > > > > > > seen on Dell XPS 9300 with Ice Lake CPU and Dell Precision 5530
> > > > > > > with
> > > > > > > Coffee
> > > > > > > Lake CPU platforms to get improved residency in low power idle
> > > > > > > states.
> > > > > > > 
> > > > > > > Fixes: a697f072f5da ("PCI: Disable PTM during suspend to save
> > > > > > > power")
> > > > > > > Signed-off-by: Rajvi Jingar <rajvi.jingar@intel.com>
> > > > > > > Suggested-by: David E. Box <david.e.box@linux.intel.com>
> > > > > > > ---
> > > > > > >   drivers/pci/pci-driver.c | 10 ++++++++++
> > > > > > >   drivers/pci/pci.c        | 10 ----------
> > > > > > >   2 files changed, 10 insertions(+), 10 deletions(-)
> > > > > > > 
> > > > > > > diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
> > > > > > > index 8b55a90126a2..ab733374a260 100644
> > > > > > > --- a/drivers/pci/pci-driver.c
> > > > > > > +++ b/drivers/pci/pci-driver.c
> > > > > > > @@ -847,6 +847,16 @@ static int pci_pm_suspend_noirq(struct device
> > > > > > > *dev)
> > > > > > >   	if (!pci_dev->state_saved) {
> > > > > > >   		pci_save_state(pci_dev);
> > > > > > > +		/*
> > > > > > > +		 * There are systems (for example, Intel mobile chips
> > > > > > > since
> > > > > Coffee
> > > > > > > +		 * Lake) where the power drawn while suspended can be
> > > > > significantly
> > > > > > > +		 * reduced by disabling PTM on PCIe root ports as this
> > > > > > > allows the
> > > > > > > +		 * port to enter a lower-power PM state and the SoC to
> > > > > > > reach a
> > > > > > > +		 * lower-power idle state as a whole.
> > > > > > > +		 */
> > > > > > > +		if (pci_pcie_type(pci_dev) == PCI_EXP_TYPE_ROOT_PORT)
> > > > > > > +			pci_disable_ptm(pci_dev);
> > > > > 
> > > > > Why is disabling PTM dependent on pci_dev->state_saved?  The
> > > > > point of this is to change the behavior of the device, and it
> > > > > seems like we want to do that regardless of whether the driver
> > > > > has used pci_save_state().
> > > > 
> > > > Because we use the saved state to restore PTM on the root port.
> > > > And it's under this condition that the root port state gets
> > > > saved.
> > > 
> > > Yes, I understand that pci_restore_ptm_state() depends on a
> > > previous call to pci_save_ptm_state().
> > > 
> > > The point I'm trying to make is that pci_disable_ptm() changes the
> > > state of the device, and that state change should not depend on
> > > whether the driver has used pci_save_state().
> > 
> > We do it here because D3 depends on whether the device state was
> > saved by the driver.
> > 
> > 	if (!pci_dev->state_saved) {
> >         	pci_save_state(pci_dev);
> > 
> > 		/* disable PTM here */
> > 
> > 		if (pci_power_manageable(pci_dev))
> > 			pci_prepare_to_sleep(pci_dev);
> > 	}
> > 
> > 
> > If we disable PTM before the check, we will have saved "PTM
> > disabled" as the restore state. And we can't do it after the check
> > as the device will be in D3.
> 
> Are you suggesting that PTM should be left enabled if the driver
> called pci_save_state(), but disabled otherwise?  I don't see the
> rationale for that.

No. I was saying that because pci_power_manageable() depends on the state not
being saved, we depended on it too ...

> 
> I don't understand all the paths through pci_pm_suspend_noirq() (e.g.,
> skip_bus_pm), but for this one, I think we could do something like
> this:
> 
>   driver_saved = pci_dev->state_saved;
>   if (!driver_saved)
>     pci_save_state(pci_dev);
> 
>   pci_disable_ptm(pci_dev);
> 
>   if (!driver_saved) {
>     if (pci_power_manageable(pci_dev))
>       pci_prepare_to_sleep(pci_dev);
>   }

... but this solution gets us away from dependency. We'll make this change.

> 
> Or I guess one could argue that a driver calling pci_save_state() is
> implicitly taking responsibility for all PCI-related suspend work, and
> it should be disabling PTM itself.  But that doesn't really seem
> maintainable.
> 
> > As to disabling PTM on all devices, I see no problem with this, but the
> > reasoning is different. We disabled the root port PTM for power savings.
> 
> The power saving is good.  I'm trying to make the argument that we
> need to disable PTM on all devices for correctness.
> 
> If we disable PTM on the root port, are we guaranteed that it will
> never receive a PTM Request from a downstream device?  Per PCIe r6.0,
> sec 6.21.3, such a request would cause an Unsupported Request error.
> 
> I sort of expect that if we're putting a root port in a low-power
> state, all downstream devices are already in the same or a lower-power
> state (but I don't understand PM well enough to be confident).
> 
> And I don't really *expect* devices in a low-power state to generate
> PTM Requests, but I haven't seen anything in the spec that prohibits
> it.
> 
> This leads me to believe that if we disable PTM in a root port, we
> must first disable PTM in any downstream devices.  Otherwise, the root
> port may log UR errors if the downstream device issues a PTM Request.

I don't know that Kai-Heng's case is due to this, but it's a fair reading of the
spec that downstream devices should be disabled first. We'll change the patch to
disable PTM on all devices. Thanks.

David

> 
> > > When we're putting a device into a low-power state, I think we want to
> > > disable PTM *always*, no matter what the driver did.  And I think we
> > > want to do it for all devices, not just Root Ports.
> > > 
> > > Bjorn


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2022-04-27  4:22 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20220325195053.769373-1-rajvi.jingar@intel.com>
2022-04-14 17:53 ` [PATCH v4 1/2] PCI/PM: refactor pci_pm_suspend_noirq() Rafael J. Wysocki
2022-04-20 16:30   ` Bjorn Helgaas
     [not found] ` <20220325195053.769373-2-rajvi.jingar@intel.com>
2022-04-14 17:54   ` [PATCH v4 2/2] PCI/PM: Fix pci_pm_suspend_noirq() to disable PTM Rafael J. Wysocki
2022-04-22 22:24     ` Bjorn Helgaas
2022-04-23  0:43       ` Jingar, Rajvi
2022-04-23 15:01         ` Bjorn Helgaas
2022-04-25 18:32           ` David E. Box
2022-04-25 18:39             ` Rafael J. Wysocki
2022-04-26 16:50             ` Bjorn Helgaas
2022-04-27  4:22               ` David E. Box

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).