linux-stable/drivers/pci/hotplug
Lukas Wunner 68db9bc814 PCI: pciehp: Add runtime PM support for PCIe hotplug ports
Linux 4.8 added support for runtime suspending PCIe ports to D3hot with
commit 006d44e49a ("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=53811

Signed-off-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
CC: Mika Westerberg <mika.westerberg@linux.intel.com>
2016-11-17 19:00:29 -06:00
..
acpi_pcihp.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
acpiphp.h PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
acpiphp_core.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
acpiphp_glue.c ACPI / hotplug / PCI: Make device_is_managed_by_native_pciehp() public 2016-11-17 18:47:58 -06:00
acpiphp_ibm.c PCI: acpiphp_ibm: Avoid uninitialized variable reference 2016-04-15 10:17:03 -05:00
cpci_hotplug.h PCI: hotplug: Make core explicitly non-modular 2016-08-24 17:20:14 -05:00
cpci_hotplug_core.c PCI: hotplug: Make core explicitly non-modular 2016-08-24 17:20:14 -05:00
cpci_hotplug_pci.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
cpcihp_generic.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
cpcihp_zt5550.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
cpcihp_zt5550.h PCI: Fix whitespace, capitalization, and spelling errors 2013-11-14 11:28:18 -07:00
cpqphp.h PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
cpqphp_core.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
cpqphp_ctrl.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
cpqphp_nvram.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
cpqphp_nvram.h
cpqphp_pci.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
cpqphp_sysfs.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
ibmphp.h PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
ibmphp_core.c Merge branch 'pci/trivial' into next 2016-01-20 11:48:25 -06:00
ibmphp_ebda.c Merge branch 'pci/trivial' into next 2016-01-20 11:48:25 -06:00
ibmphp_hpc.c Merge branch 'pci/trivial' into next 2016-01-20 11:48:25 -06:00
ibmphp_pci.c Merge branch 'pci/trivial' into next 2016-01-20 11:48:25 -06:00
ibmphp_res.c Merge branch 'pci/trivial' into next 2016-01-20 11:48:25 -06:00
Kconfig PCI/hotplug: PowerPC PowerNV PCI hotplug driver 2016-06-21 15:30:58 +10:00
Makefile PCI/hotplug: PowerPC PowerNV PCI hotplug driver 2016-06-21 15:30:58 +10:00
pci_hotplug_core.c PCI: hotplug: Make core explicitly non-modular 2016-08-24 17:20:14 -05:00
pciehp.h PCI: pciehp: Allow exclusive userspace control of indicators 2016-09-22 18:20:11 -05:00
pciehp_core.c Merge branch 'pci/hotplug' into next 2016-10-03 09:43:19 -05:00
pciehp_ctrl.c PCI: pciehp: Add runtime PM support for PCIe hotplug ports 2016-11-17 19:00:29 -06:00
pciehp_hpc.c PCI: pciehp: Allow exclusive userspace control of indicators 2016-09-22 18:20:11 -05:00
pciehp_pci.c PCI: pciehp: Remove pci_configure_slot() usage 2014-09-12 20:09:47 -06:00
pcihp_skeleton.c Merge branch 'pci/trivial' into next 2016-01-20 11:48:25 -06:00
pnv_php.c drivers/pci/hotplug: Use of_property_read_u32() in powernv driver 2016-10-04 16:22:47 +11:00
rpadlpar.h
rpadlpar_core.c powerpc/pci: Rename pcibios_find_pci_bus() 2016-05-11 21:54:24 +10:00
rpadlpar_sysfs.c
rpaphp.h PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
rpaphp_core.c powerpc/pci: Rename pcibios_{add, remove}_pci_devices() 2016-05-11 21:54:23 +10:00
rpaphp_pci.c powerpc/pci: Rename pcibios_find_pci_bus() 2016-05-11 21:54:24 +10:00
rpaphp_slot.c PCI: rpaphp: Fix slot registration for multiple slots under a PHB 2016-07-20 11:54:55 +10:00
s390_pci_hpc.c s390/pci: remove pdev pointer from arch data 2016-02-23 08:56:16 +01:00
sgi_hotplug.c PCI: Fix all whitespace issues 2016-01-08 10:35:24 -06:00
shpchp.h PCI: shpchp: Constify hpc_ops structure 2016-01-08 12:10:00 -06:00
shpchp_core.c Merge branch 'pci/trivial' into next 2016-01-20 11:48:25 -06:00
shpchp_ctrl.c PCI: Remove assignment from "if" conditions 2014-09-24 07:50:53 -06:00
shpchp_hpc.c PCI: shpchp: Constify hpc_ops structure 2016-01-08 12:10:00 -06:00
shpchp_pci.c PCI: shpchp: Remove pci_configure_slot() usage 2014-09-12 20:09:49 -06:00
shpchp_sysfs.c PCI: Use to_pci_dev() instead of open-coding it 2016-01-08 12:05:39 -06:00