diff options
author | Alan <alan@linux.intel.com> | 2014-05-19 09:03:14 -0400 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2014-05-23 12:47:21 -0400 |
commit | 14c8530dbc1b7cd5020c44b391e34bdb731fd098 (patch) | |
tree | 2ca7d75ce49993efafad9d6d744ef8a7b674c81f | |
parent | e4c729664339e4be352d4c7434a5c6184285148d (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.c | 15 |
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) |