PCI: generic: Allocate config space windows after limiting bus number range
authorLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Thu, 23 Oct 2014 15:23:06 +0000 (16:23 +0100)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 5 Nov 2014 23:49:24 +0000 (16:49 -0700)
The number of config space windows allocated for the host bridge depends on
how many bus numbers are below the bridge.  Instead of first allocating the
windows and then limiting the bus resource, this patch reshuffles the code
so that if any limitation is applied to the bus resource, it is taken into
account in the windows allocation.

[bhelgaas: changelog]
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Will Deacon <will.deacon@arm.com>
drivers/pci/host/pci-host-generic.c

index 3d2076f599118c5141d517c8513f1bba1f31fbe2..1e1a80fc6faae125f3b29e8bf0578040736d0b9e 100644 (file)
@@ -276,17 +276,17 @@ static int gen_pci_parse_map_cfg_windows(struct gen_pci *pci)
                return err;
        }
 
-       pci->cfg.win = devm_kcalloc(dev, resource_size(&pci->cfg.bus_range),
-                                   sizeof(*pci->cfg.win), GFP_KERNEL);
-       if (!pci->cfg.win)
-               return -ENOMEM;
-
        /* Limit the bus-range to fit within reg */
        bus_max = pci->cfg.bus_range.start +
                  (resource_size(&pci->cfg.res) >> pci->cfg.ops->bus_shift) - 1;
        pci->cfg.bus_range.end = min_t(resource_size_t, pci->cfg.bus_range.end,
                                       bus_max);
 
+       pci->cfg.win = devm_kcalloc(dev, resource_size(&pci->cfg.bus_range),
+                                   sizeof(*pci->cfg.win), GFP_KERNEL);
+       if (!pci->cfg.win)
+               return -ENOMEM;
+
        /* Map our Configuration Space windows */
        if (!devm_request_mem_region(dev, pci->cfg.res.start,
                                     resource_size(&pci->cfg.res),