• Lukas Wunner's avatar
    PCI: pciehp: Deduplicate presence check on probe & resume · 4e6a1335
    Lukas Wunner authored
    On driver probe and on resume from system sleep, pciehp checks the
    Presence Detect State bit in the Slot Status register to bring up an
    occupied slot or bring down an unoccupied slot.  Both code paths are
    identical, so deduplicate them per Mika's request.
    
    On probe, an additional check is performed to disable power of an
    unoccupied slot.  This can e.g. happen if power was enabled by BIOS.
    It cannot happen once pciehp has taken control, hence is not necessary
    on resume:  The Slot Control register is set to the same value that it
    had on suspend by pci_restore_state(), so if the slot was occupied,
    power is enabled and if it wasn't, power is disabled.  Should occupancy
    have changed during the system sleep transition, power is adjusted by
    bringing up or down the slot per the paragraph above.
    
    To allow for deduplication of the presence check, move the power check
    to pcie_init().  This seems safer anyway, because right now it is
    performed while interrupts are already enabled, and although I can't
    think of a scenario where pciehp_power_off_slot() and the IRQ thread
    collide, it does feel brittle.
    
    However this means that pcie_init() may now write to the Slot Control
    register before the IRQ is requested.  If both the CCIE and HPIE bits
    happen to be set, pcie_wait_cmd() will wait for an interrupt (instead
    of polling the Command Completed bit) and eventually emit a timeout
    message.  Additionally, if a level-triggered INTx interrupt is used,
    the user may see a spurious interrupt splat.  Avoid by disabling
    interrupts before disabling power.  (Normally the HPIE and CCIE bits
    should be clear on probe, but conceivably they may already have been
    set e.g. by BIOS.)
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    4e6a1335
pciehp_core.c 9.31 KB