aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan <alan@linux.intel.com>2014-05-19 09:03:14 -0400
committerBjorn Helgaas <bhelgaas@google.com>2014-05-23 12:47:21 -0400
commit14c8530dbc1b7cd5020c44b391e34bdb731fd098 (patch)
tree2ca7d75ce49993efafad9d6d744ef8a7b674c81f
parente4c729664339e4be352d4c7434a5c6184285148d (diff)
PCI: Support BAR sizes up to 8GB
This is needed for some of the Xeon Phi type systems. [bhelgaas: added Nikhil, use ARRAY_SIZE() to connect with decl, folded in Kevin's "order < 0" fix to ARRAY_SIZE() usage] Signed-off-by: Nikhil P Rao <nikhil.rao@intel.com> Signed-off-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Kevin Hilman <khilman@linaro.org> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
-rw-r--r--drivers/pci/setup-bus.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 138bdd6393be..9b3498c9b739 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -921,7 +921,7 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
921{ 921{
922 struct pci_dev *dev; 922 struct pci_dev *dev;
923 resource_size_t min_align, align, size, size0, size1; 923 resource_size_t min_align, align, size, size0, size1;
924 resource_size_t aligns[12]; /* Alignments from 1Mb to 2Gb */ 924 resource_size_t aligns[14]; /* Alignments from 1Mb to 8Gb */
925 int order, max_order; 925 int order, max_order;
926 struct resource *b_res = find_free_bus_resource(bus, type); 926 struct resource *b_res = find_free_bus_resource(bus, type);
927 unsigned int mem64_mask = 0; 927 unsigned int mem64_mask = 0;
@@ -957,10 +957,17 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
957 continue; 957 continue;
958 } 958 }
959#endif 959#endif
960 /* For bridges size != alignment */ 960 /*
961 * aligns[0] is for 1MB (since bridge memory
962 * windows are always at least 1MB aligned), so
963 * keep "order" from being negative for smaller
964 * resources.
965 */
961 align = pci_resource_alignment(dev, r); 966 align = pci_resource_alignment(dev, r);
962 order = __ffs(align) - 20; 967 order = __ffs(align) - 20;
963 if (order > 11) { 968 if (order < 0)
969 order = 0;
970 if (order >= ARRAY_SIZE(aligns)) {
964 dev_warn(&dev->dev, "disabling BAR %d: %pR " 971 dev_warn(&dev->dev, "disabling BAR %d: %pR "
965 "(bad alignment %#llx)\n", i, r, 972 "(bad alignment %#llx)\n", i, r,
966 (unsigned long long) align); 973 (unsigned long long) align);
@@ -968,8 +975,6 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
968 continue; 975 continue;
969 } 976 }
970 size += r_size; 977 size += r_size;
971 if (order < 0)
972 order = 0;
973 /* Exclude ranges with size > align from 978 /* Exclude ranges with size > align from
974 calculation of the alignment. */ 979 calculation of the alignment. */
975 if (r_size == align) 980 if (r_size == align)