• Bjorn Helgaas's avatar
    PCI: Probe for device reset support during enumeration · 5b0764ca
    Bjorn Helgaas authored
    Previously we called pci_probe_reset_function() in this path:
    
      pci_sysfs_init                              # late_initcall
        for_each_pci_dev(dev)
          pci_create_sysfs_dev_files(dev)
            pci_create_capabilities_sysfs(dev)
              pci_probe_reset_function
                pci_dev_specific_reset
                pcie_has_flr
                  pcie_capability_read_dword
    
    pci_sysfs_init() is a late_initcall, and a driver may have already claimed
    one of these devices and enabled runtime power management for it, so the
    device could already be in D3 by the time we get to pci_sysfs_init().
    
    The device itself should respond to the config read even while it's in
    D3hot, but if an upstream bridge is also in D3hot, the read won't even
    reach the device because the bridge won't forward it downstream to the
    device.  If the bridge is a PCIe port, it should complete the read as an
    Unsupported Request, which may be reported to the CPU as an exception or as
    invalid data.
    
    Avoid this case by probing for reset support from pci_init_capabilities(),
    before a driver can claim the device.  The device may be in D3hot, but any
    bridges leading to it should be in D0, so the device's config space should
    be fully accessible at that point.
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    Reviewed-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    5b0764ca
pci-sysfs.c 44.5 KB