pci: Print a warning if the bus is accessed before probing
authorSimon Glass <sjg@chromium.org>
Mon, 30 Dec 2019 04:19:14 +0000 (21:19 -0700)
committerSimon Glass <sjg@chromium.org>
Tue, 7 Jan 2020 23:02:38 +0000 (16:02 -0700)
It is not possible to access a device on a PCI bus that has not yet been
probed, since the bus number is not known. Add a warning to catch this
error.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/pci/pci-uclass.c

index 7308f612b67bcfc0760adaa148ef43b0b873f2b2..5be2dfd0bf64b19d633477d2bcbdeda6bc334fb0 100644 (file)
@@ -48,6 +48,19 @@ pci_dev_t dm_pci_get_bdf(struct udevice *dev)
        struct pci_child_platdata *pplat = dev_get_parent_platdata(dev);
        struct udevice *bus = dev->parent;
 
+       /*
+        * This error indicates that @dev is a device on an unprobed PCI bus.
+        * The bus likely has bus=seq == -1, so the PCI_ADD_BUS() macro below
+        * will produce a bad BDF>
+        *
+        * A common cause of this problem is that this function is called in the
+        * ofdata_to_platdata() method of @dev. Accessing the PCI bus in that
+        * method is not allowed, since it has not yet been probed. To fix this,
+        * move that access to the probe() method of @dev instead.
+        */
+       if (!device_active(bus))
+               log_err("PCI: Device '%s' on unprobed bus '%s'\n", dev->name,
+                       bus->name);
        return PCI_ADD_BUS(bus->seq, pplat->devfn);
 }