aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Fedin <p.fedin@samsung.com>2015-10-08 03:24:25 -0400
committerRob Herring <robh@kernel.org>2015-10-13 14:30:37 -0400
commit4af971064977b00a437c1ed8ead8876db4e3b58a (patch)
treeea89acfd1b304e923a78ddd668faecfeddd41f1e
parentae1add247bf8c22facacbd818142f1f66e735802 (diff)
PCI: of: Add 64-bit address recognition without LPAE support
If non-LPAE kernel is booted up on a machine with 64-bit PCI resources, PCI controller probe fails with: PCI host bridge /pcie@10000000 ranges: IO 0x3eff0000..0x3effffff -> 0x00000000 MEM 0x10000000..0x3efeffff -> 0x10000000 MEM 0x8000000000..0xffffffffff -> 0x8000000000 pci-host-generic 3f000000.pcie: resource collision: [mem 0x00000000-0xffffffff] conflicts with /pl011@9000000 [mem 0x09000000-0x09000fff] pci-host-generic: probe of 3f000000.pcie failed with error -16 This happens because res->start assignment in of_pci_range_to_resource() truncates the upper part of the address, because res->start is of phys_addr_t type, which is 32-bit on non-LPAE kernels. This patch adds explicit recognition of 64-bit resources, preventing from potential problems when e. g. 0x8000001234 would be converted to 0x00001234. Signed-off-by: Pavel Fedin <p.fedin@samsung.com> Signed-off-by: Rob Herring <robh@kernel.org>
-rw-r--r--drivers/of/address.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/of/address.c b/drivers/of/address.c
index 384574c3987c..cd53fe4a0c86 100644
--- a/drivers/of/address.c
+++ b/drivers/of/address.c
@@ -330,6 +330,12 @@ int of_pci_range_to_resource(struct of_pci_range *range,
330 } 330 }
331 res->start = port; 331 res->start = port;
332 } else { 332 } else {
333 if ((sizeof(resource_size_t) < 8) &&
334 upper_32_bits(range->cpu_addr)) {
335 err = -EINVAL;
336 goto invalid_range;
337 }
338
333 res->start = range->cpu_addr; 339 res->start = range->cpu_addr;
334 } 340 }
335 res->end = res->start + range->size - 1; 341 res->end = res->start + range->size - 1;