• Rafael J. Wysocki's avatar
    PCI / PM: Extend PME polling to all PCI devices · 379021d5
    Rafael J. Wysocki authored
    The land of PCI power management is a land of sorrow and ugliness,
    especially in the area of signaling events by devices.  There are
    devices that set their PME Status bits, but don't really bother
    to send a PME message or assert PME#.  There are hardware vendors
    who don't connect PME# lines to the system core logic (they know
    who they are).  There are PCI Express Root Ports that don't bother
    to trigger interrupts when they receive PME messages from the devices
    below.  There are ACPI BIOSes that forget to provide _PRW methods for
    devices capable of signaling wakeup.  Finally, there are BIOSes that
    do provide _PRW methods for such devices, but then don't bother to
    call Notify() for those devices from the corresponding _Lxx/_Exx
    GPE-handling methods.  In all of these cases the kernel doesn't have
    a chance to receive a proper notification that it should wake up a
    device, so devices stay in low-power states forever.  Worse yet, in
    some cases they continuously send PME Messages that are silently
    ignored, because the kernel simply doesn't know that it should clear
    the device's PME Status bit.
    
    This problem was first observed for "parallel" (non-Express) PCI
    devices on add-on cards and Matthew Garrett addressed it by adding
    code that polls PME Status bits of such devices, if they are enabled
    to signal PME, to the kernel.  Recently, however, it has turned out
    that PCI Express devices are also affected by this issue and that it
    is not limited to add-on devices, so it seems necessary to extend
    the PME polling to all PCI devices, including PCI Express and planar
    ones.  Still, it would be wasteful to poll the PME Status bits of
    devices that are known to receive proper PME notifications, so make
    the kernel (1) poll the PME Status bits of all PCI and PCIe devices
    enabled to signal PME and (2) disable the PME Status polling for
    devices for which correct PME notifications are received.
    Tested-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
    Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
    Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
    379021d5
pci.c 92.6 KB