aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/probe.c
diff options
context:
space:
mode:
authorBjorn Helgaas <bhelgaas@google.com>2014-08-27 16:29:47 -0400
committerBjorn Helgaas <bhelgaas@google.com>2014-09-12 22:09:46 -0400
commit6cd33649fa83d97ba7b66f1d871a360e867c5220 (patch)
tree03759f14b6b7e90c7b6179a007a3f2f304d9ac95 /drivers/pci/probe.c
parent589fcc2307423d9c3856a4e2e72e1b57b6826f41 (diff)
PCI: Add pci_configure_device() during enumeration
Some platforms can tell the OS how to configure PCI devices, e.g., how to set cache line size, error reporting enables, etc. ACPI defines _HPP and _HPX methods for this purpose. This configuration was previously done by some of the hotplug drivers using pci_configure_slot(). But not all hotplug drivers did this, and per the spec (ACPI rev 5.0, sec 6.2.7), we can also do it for "devices not configured by the BIOS at system boot." Move this configuration into the PCI core by adding pci_configure_device() and calling it from pci_device_add(), so we do this for all devices as we enumerate them. This is based on pci_configure_slot(), which is used by hotplug drivers. I omitted: - pcie_bus_configure_settings() because it configures MPS and MRRS, which requires global knowledge of the fabric and must be done later, and - configuration of subordinate devices; that will happen when we call pci_device_add() for those devices. Because pci_configure_slot() was only done by hotplug drivers, this initial version of pci_configure_device() only configures hot-added devices, ignoring anything added during boot. Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Yinghai Lu <yinghai@kernel.org>
Diffstat (limited to 'drivers/pci/probe.c')
-rw-r--r--drivers/pci/probe.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 6a198fc65999..e9482867555b 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1386,6 +1386,29 @@ void pci_configure_slot(struct pci_dev *dev)
1386} 1386}
1387EXPORT_SYMBOL_GPL(pci_configure_slot); 1387EXPORT_SYMBOL_GPL(pci_configure_slot);
1388 1388
1389static void pci_configure_device(struct pci_dev *dev)
1390{
1391 struct hotplug_params hpp;
1392 int ret;
1393
1394 if (system_state == SYSTEM_BOOTING)
1395 return;
1396
1397 if (!(dev->hdr_type == PCI_HEADER_TYPE_NORMAL ||
1398 (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE &&
1399 (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI)))
1400 return;
1401
1402 memset(&hpp, 0, sizeof(hpp));
1403 ret = pci_get_hp_params(dev, &hpp);
1404 if (ret)
1405 return;
1406
1407 program_hpp_type2(dev, hpp.t2);
1408 program_hpp_type1(dev, hpp.t1);
1409 program_hpp_type0(dev, hpp.t0);
1410}
1411
1389static void pci_release_capabilities(struct pci_dev *dev) 1412static void pci_release_capabilities(struct pci_dev *dev)
1390{ 1413{
1391 pci_vpd_release(dev); 1414 pci_vpd_release(dev);
@@ -1523,6 +1546,8 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
1523{ 1546{
1524 int ret; 1547 int ret;
1525 1548
1549 pci_configure_device(dev);
1550
1526 device_initialize(&dev->dev); 1551 device_initialize(&dev->dev);
1527 dev->dev.release = pci_release_dev; 1552 dev->dev.release = pci_release_dev;
1528 1553