• Mika Westerberg's avatar
    PCI / ACPI: Add _PR0 dependent devices · 53b22f90
    Mika Westerberg authored
    If otherwise unrelated PCI devices share ACPI power resources turning
    them on causes the devices to enter D0uninitialized power state which may
    cause problems.
    
    For example in Intel Ice Lake two root ports (RP0 and RP1), Thunderbolt
    controller (NHI) and xHCI controller all share power resources as can be
    ween in the topology below where power resources are marked with []:
    
      Host bridge
        |
        +- RP0 ---\
        +- RP1 ---|--+--> [TBT]
        +- NHI --/   |
        |            |
        |            v
        +- xHCI --> [D3C]
    
    In a situation where all devices sharing the power resources are in
    D3cold (the power resources are turned off) and for example the
    Thunderbolt controller is runtime resumed resulting that the power
    resources are turned on. This means that the other devices sharing them
    (RP0, RP1 and xHCI) are transitioned into D0uninitialized state. If they
    were configured to trigger wake (PME) on a certain event that
    configuration gets lost after reset so we would need to re-initialize
    them to get the wakeup working as expected again. To do so we would need
    to runtime resume all of them to make sure their registers get restored
    properly before we can runtime suspend them again.
    
    Since we just added concept of "_PR0 dependent device" we can solve this
    by calling the relevant add/remove functions when the PCI device is bind
    to its ACPI representation. If it has power resources the PCI device
    will be added as dependent device to them and runtime resumed whenever
    they are physically turned on. This should make sure PCI core can
    reconfigure wakes after the device is transitioned into D0uninitialized.
    Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    53b22f90
pci-acpi.c 26 KB