aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)