]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
pci: pci-uclass: Add support for Enhanced Allocation in Bridges
authorSuneel Garapati <sgarapati@marvell.com>
Sat, 19 Oct 2019 22:52:32 +0000 (15:52 -0700)
committerStefan Roese <sr@denx.de>
Tue, 25 Aug 2020 06:01:16 +0000 (08:01 +0200)
If Enhanced Allocation capability is present in bridges, use it
to read the fixed sub-ordinate bus number.

Signed-off-by: Suneel Garapati <sgarapati@marvell.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Cc: Bin Meng <bmeng.cn@gmail.com>
drivers/pci/pci-uclass.c

index 19ea3ae9c1e83c07ad89d7f60632157f61a4a446..fa6115a105e0f01d4499392c4588cc8ef3a214df 100644 (file)
@@ -620,10 +620,19 @@ int dm_pci_hose_probe_bus(struct udevice *bus)
 {
        int sub_bus;
        int ret;
+       int ea_pos;
+       u8 reg;
 
        debug("%s\n", __func__);
 
-       sub_bus = pci_get_bus_max() + 1;
+       ea_pos = dm_pci_find_capability(bus, PCI_CAP_ID_EA);
+       if (ea_pos) {
+               dm_pci_read_config8(bus, ea_pos + sizeof(u32) + sizeof(u8),
+                                   &reg);
+               sub_bus = reg;
+       } else {
+               sub_bus = pci_get_bus_max() + 1;
+       }
        debug("%s: bus = %d/%s\n", __func__, sub_bus, bus->name);
        dm_pciauto_prescan_setup_bridge(bus, sub_bus);
 
@@ -633,12 +642,15 @@ int dm_pci_hose_probe_bus(struct udevice *bus)
                      ret);
                return ret;
        }
-       if (sub_bus != bus->seq) {
-               printf("%s: Internal error, bus '%s' got seq %d, expected %d\n",
-                      __func__, bus->name, bus->seq, sub_bus);
-               return -EPIPE;
+
+       if (!ea_pos) {
+               if (sub_bus != bus->seq) {
+                       debug("%s: Internal error, bus '%s' got seq %d, expected %d\n",
+                             __func__, bus->name, bus->seq, sub_bus);
+                       return -EPIPE;
+               }
+               sub_bus = pci_get_bus_max();
        }
-       sub_bus = pci_get_bus_max();
        dm_pciauto_postscan_setup_bridge(bus, sub_bus);
 
        return sub_bus;