]> git.sur5r.net Git - u-boot/commitdiff
dm: pci: Support decoding ranges with duplicate entries
authorSimon Glass <sjg@chromium.org>
Fri, 20 Nov 2015 03:26:58 +0000 (20:26 -0700)
committerSimon Glass <sjg@chromium.org>
Tue, 1 Dec 2015 13:26:36 +0000 (06:26 -0700)
At present we add a new resource entry for every range entry. But some range
entries refer to configuration regions. To make this work, avoid adding two
regions of the same type. The later ranges will overwrite the earlier
(configuration) ones.

There does not seem to be a way to distinguish the configuration ranges
other than by ordering (as per the device tree binding).

We could perhaps instead just store one region of each type in a simple
array. Once we are sure that we don't need to support multiple regions, we
could change this. It would be easier to do it when all drivers are
converted to use driver model for PCI.

Signed-off-by: Simon Glass <sjg@chromium.org>
Tested-by: Stephen Warren <swarren@nvidia.com>
drivers/pci/pci-uclass.c

index 6d860c4733b45e5aad2356ebbf8e1c6efe511c35..7b488795be0fd7a11df6c485592bdc9338692530 100644 (file)
@@ -704,6 +704,7 @@ static int decode_regions(struct pci_controller *hose, const void *blob,
                int space_code;
                u32 flags;
                int type;
+               int pos;
 
                if (len < cells_per_record)
                        break;
@@ -726,9 +727,15 @@ static int decode_regions(struct pci_controller *hose, const void *blob,
                } else {
                        continue;
                }
-               debug(" - type=%d\n", type);
-               pci_set_region(hose->regions + hose->region_count++, pci_addr,
-                              addr, size, type);
+               pos = -1;
+               for (i = 0; i < hose->region_count; i++) {
+                       if (hose->regions[i].flags == type)
+                               pos = i;
+               }
+               if (pos == -1)
+                       pos = hose->region_count++;
+               debug(" - type=%d, pos=%d\n", type, pos);
+               pci_set_region(hose->regions + pos, pci_addr, addr, size, type);
        }
 
        /* Add a region for our local memory */