Thread (3 messages) 3 messages, 3 authors, 2021-07-29

Re: [PATCH v2] PCI: PM: Add special case handling for PCIe device wakeup

From: Mika Westerberg <mika.westerberg@linux.intel.com>
Date: 2021-07-29 13:24:35
Also in: linux-acpi, linux-pci, lkml

Hi Rafael,

On Wed, Jul 28, 2021 at 07:25:04PM +0200, Rafael J. Wysocki wrote:
From: Rafael J. Wysocki <redacted>

Some PCIe devices only support PME (Power Management Event) from
D3cold.  One example is the ASMedia xHCI controller:

 11:00.0 USB controller: ASMedia Technology Inc. ASM1042A USB 3.0 Host Controller (prog-if 30 [XHCI])
   ...
   Capabilities: [78] Power Management version 3
       Flags: PMEClk- DSI- D1- D2- AuxCurrent=55mA PME(D0-,D1-,D2-,D3hot-,D3cold+)
       Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-

In those cases, if the device is expected to generate wakeup events
from its final power state, pci_target_state() returns D0, which
prevents the PCIe hierarchy above the device from entering any
low-power states too, but the device cannot signal PME from D0
either.  However, if the device were allowed to go into D3hot, its
parent PCIe port and its ancestors would also be able to go into D3
and if any of them goes into D3cold, the device would end up in
D3cold too (as per the PCI PM spec v1.2, Table 6-1), in which case
it would be able to signal PME.

This means that the system could be put into a lower-power
configuration while meeting the requirement to enable the device to
generate PME from the final state (which is not the case if the
device stays in D0 along with the entire hierarchy above it).

In order to avoid missing that opportunity, extend pci_pme_capable()
to return 'true' in the special case when the target state is D3hot
and the device can only signal PME from D3cold and update
pci_target_state() to return the current target state if
pci_pme_capable() returns 'true' for it.

This change can be regarded as a pci_target_state() fix, because that
function should ignore its 'wakeup' argument if signaling PME from
any power states shallower than the current candidate one (including
D0) is not supported.

Link: https://lore.kernel.org/linux-pm/20210617123653.58640-1-mika.westerberg@linux.intel.com (local)
Fixes: 666ff6f83e1d ("PCI/PM: Avoid using device_may_wakeup() for runtime PM")
Reported-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reported-by: Utkarsh H Patel <redacted>
Reported-by: Koba Ko <redacted>
Signed-off-by: Rafael J. Wysocki <redacted>
Tried this now and it fixes the issue! Also checked with another device
that actually supports PME from other states than D3cold and it also
works (as expected).

Feel free to add my,

Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com>

Thanks!
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help