• Lukas Wunner's avatar
    PCI: pciehp: Resume to D0 on enable/disable · 83503074
    Lukas Wunner authored
    pciehp's IRQ thread ensures accessibility of the port by runtime resuming
    its parent to D0.  However when the slot is enabled/disabled, the port
    itself needs to be in D0 because its secondary bus is accessed in:
    
        pciehp_check_link_status(),
        pciehp_configure_device() (both called from board_added())
    and
        pciehp_unconfigure_device() (called from remove_board()).
    
    Thus, acquire a runtime PM ref on enable/disablement of the slot.
    
    Yinghai Lu additionally discovered that some SkyLake servers feature a
    Power Controller for their PCIe hotplug ports (PCIe r3.1, sec 6.7.1.8)
    which requires the port to be in D0 when invoking
    
        pciehp_power_on_slot() (likewise called from board_added()).
    
    If slot power is turned on while in D3hot, link training later fails:
    https://lkml.kernel.org/r/20170205073454.GA253@wunner.de
    
    The spec is silent about such a requirement, but it seems prudent to
    assume that any hotplug port with a Power Controller may need this.
    
    The present commit holds a runtime PM ref whenever slot power is turned
    on and off, but it doesn't keep the port in D0 as long as slot power is
    on.  If vendors determine that's necessary, they need to amend pciehp to
    acquire a runtime PM ref in pciehp_power_on_slot() and release one in
    pciehp_power_off_slot().
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Cc: Mika Westerberg <mika.westerberg@linux.intel.com>
    Cc: Ashok Raj <ashok.raj@intel.com>
    Cc: Keith Busch <keith.busch@intel.com>
    Cc: Yinghai Lu <yinghai@kernel.org>
    83503074
pciehp_ctrl.c 10.2 KB