A PCI device may be probed through standard PCI config space probing but
still be represented in a device tree. However U-Boot would not
previously set the of_offset field of the struct udevice for such PCI
devices. Fix this by searching for a DT node based upon its "reg"
property after binding a PCI device that wasn't already seen in the DT.

Signed-off-by: Paul Burton <paul.bur...@imgtec.com>

---

 drivers/pci/pci-uclass.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c
index 3b00e6a..415c632 100644
--- a/drivers/pci/pci-uclass.c
+++ b/drivers/pci/pci-uclass.c
@@ -670,6 +670,33 @@ error:
        return ret;
 }
 
+static int find_pci_of_offset(struct udevice *bus, struct udevice *dev,
+                             pci_dev_t bdf)
+{
+       struct fdt_pci_addr addr;
+       int offset, err;
+
+       if (bus->of_offset == -1)
+               return -ENOENT;
+
+       fdt_for_each_subnode(gd->fdt_blob, offset, bus->of_offset) {
+               err = fdtdec_get_pci_addr(gd->fdt_blob, offset,
+                                         FDT_PCI_SPACE_CONFIG, "reg", &addr);
+               if (err == -ENOENT)
+                       continue;
+               if (err)
+                       return err;
+
+               if (bdf != (addr.phys_hi & 0xffff00))
+                       continue;
+
+               dev->of_offset = offset;
+               return 0;
+       }
+
+       return -ENOENT;
+}
+
 int pci_bind_bus_devices(struct udevice *bus)
 {
        ulong vendor, device;
@@ -731,6 +758,11 @@ int pci_bind_bus_devices(struct udevice *bus)
                        }
                        ret = pci_find_and_bind_driver(bus, &find_id, bdf,
                                                       &dev);
+                       if (!ret) {
+                               ret = find_pci_of_offset(bus, dev, bdf);
+                               if (ret == -ENOENT)
+                                       ret = 0;
+                       }
                }
                if (ret == -EPERM)
                        continue;
-- 
2.10.0

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to