• Lukas Wunner's avatar
    PCI: pciehp: Add runtime PM support for PCIe hotplug ports · 68db9bc8
    Lukas Wunner authored
    Linux 4.8 added support for runtime suspending PCIe ports to D3hot with
    commit 006d44e4 ("PCI: Add runtime PM support for PCIe ports"), but
    excluded hotplug ports.  Those are now afforded runtime PM by the present
    commit.
    
    Hotplug ports require a few extra considerations:
    
    - The configuration space of the port remains accessible in D3hot, so all
      the functions to read or modify the Slot Status and Slot Control
      registers need not be modified.  Even turning on slot power doesn't seem
      to require the port to be in D0, at least the PCIe spec doesn't say so
      and I confirmed that by testing with a Thunderbolt controller.
    
    - However D0 is required to access devices on the secondary bus.  This
      happens in pciehp_check_link_status() and pciehp_configure_device() (both
      called from board_added()) and in pciehp_unconfigure_device() (called
      from remove_board()), so acquire a runtime PM ref for their invocation.
    
    - The hotplug port stays active as long as it has active children.  If all
      hotplugged devices below the port runtime suspend, the port is allowed to
      runtime suspend as well.  Plug and unplug detection continues to work in
      D3hot.
    
    - Hotplug interrupts are delivered in-band, so while the hotplug port
      itself is allowed to go to D3hot, its parent ports must stay in D0 for
      interrupts to come through.  Add a corresponding restriction to
      pci_dev_check_d3cold().
    
    - Runtime PM may only be allowed if the hotplug port is handled natively by
      the OS.  On ACPI systems, the port may alternatively be handled by the
      firmware and things break if the OS puts the port into D3 behind the
      firmware's back:  E.g. Thunderbolt hotplug ports on non-Macs are handled
      by Intel's firmware in System Management Mode and the firmware is known
      to access devices on the port's secondary bus without checking first if
      the port is in D0: https://bugzilla.kernel.org/show_bug.cgi?id=53811Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    CC: Mika Westerberg <mika.westerberg@linux.intel.com>
    68db9bc8
pciehp_ctrl.c 13 KB