linux/drivers/pci
Bjorn Helgaas 5b0764cac9 PCI: Probe for device reset support during enumeration
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: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2018-02-16 10:55:38 -06:00
..
cadence PCI: cadence: Add EndPoint Controller driver for Cadence PCIe controller 2018-01-31 11:13:27 +00:00
dwc Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
endpoint Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
host pci-v4.16-changes 2018-02-06 09:59:40 -08:00
hotplug More ACPI updates for v4.16-rc1 2018-02-09 09:44:25 -08:00
pcie pci-v4.16-changes 2018-02-06 09:59:40 -08:00
switch vfs: do bulk POLL* -> EPOLL* replacement 2018-02-11 14:34:03 -08:00
access.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
ats.c PCI: Add SPDX GPL-2.0 when no license was specified 2018-01-26 11:45:16 -06:00
bus.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
ecam.c PCI: Add SPDX GPL-2.0 to replace GPL v2 boilerplate 2018-01-28 15:48:29 -06:00
host-bridge.c PCI: Add SPDX GPL-2.0 when no license was specified 2018-01-26 11:45:16 -06:00
iov.c pci-v4.16-changes 2018-02-06 09:59:40 -08:00
irq.c PCI: Add wrappers for dev_printk() 2018-01-18 12:55:24 -06:00
Kconfig Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
Makefile PCI: cadence: Add EndPoint Controller driver for Cadence PCIe controller 2018-01-31 11:13:27 +00:00
mmap.c PCI: Add SPDX GPL-2.0 to replace GPL v2 boilerplate 2018-01-28 15:48:29 -06:00
msi.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
of.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
pci-acpi.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
pci-driver.c pci-v4.16-changes 2018-02-06 09:59:40 -08:00
pci-label.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
pci-mid.c PCI: Add SPDX GPL-2.0 to replace GPL v2 boilerplate 2018-01-28 15:48:29 -06:00
pci-stub.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
pci-sysfs.c PCI: Probe for device reset support during enumeration 2018-02-16 10:55:38 -06:00
pci.c pci-v4.16-changes 2018-02-06 09:59:40 -08:00
pci.h Merge branch 'pci/trivial' into next 2018-01-31 10:13:07 -06:00
probe.c PCI: Probe for device reset support during enumeration 2018-02-16 10:55:38 -06:00
proc.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
quirks.c Merge branch 'pci/virtualization' into next 2018-01-31 10:13:09 -06:00
remove.c PCI: Add SPDX GPL-2.0 when no license was specified 2018-01-26 11:45:16 -06:00
rom.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
search.c PCI: Add SPDX GPL-2.0 when no license was specified 2018-01-26 11:45:16 -06:00
setup-bus.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
setup-irq.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
setup-res.c PCI: Add wrappers for dev_printk() 2018-01-18 12:55:24 -06:00
slot.c PCI: Add SPDX GPL-2.0 when no license was specified 2018-01-26 11:45:16 -06:00
syscall.c PCI: Deprecate pci_get_bus_and_slot() 2018-01-17 08:16:46 -06:00
vc.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
vpd.c PCI: Add SPDX GPL-2.0 when no license was specified 2018-01-26 11:45:16 -06:00
xen-pcifront.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00