From: David S. Miller Date: Wed, 13 Aug 2014 06:27:01 +0000 (-0700) Subject: sparc64: Skip bogus PCI bridge ranges. X-Git-Tag: v3.17-rc1~15^2~2 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=4afba24e5fc2626a3c604ec990539572f6662ff9;p=~emulex%2Finfiniband.git sparc64: Skip bogus PCI bridge ranges. It seems that when a PCI Express bridge is not in use and has no devices behind it, the ranges property is bogus. Specifically the size property is of the form [0xffffffff:...], and if you add this size to the resource start address the 64-bit calculation will overflow. Just check specifically for this size value signature and skip them. Signed-off-by: David S. Miller --- diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c index da24fb6deb0..cc4c31e5185 100644 --- a/arch/sparc/kernel/pci.c +++ b/arch/sparc/kernel/pci.c @@ -489,6 +489,17 @@ static void of_scan_pci_bridge(struct pci_pbm_info *pbm, size = GET_64BIT(ranges, 6); if (flags == 0 || size == 0) continue; + + /* On PCI-Express systems, PCI bridges that have no devices downstream + * have a bogus size value where the first 32-bit cell is 0xffffffff. + * This results in a bogus range where start + size overflows. + * + * Just skip these otherwise the kernel will complain when the resource + * tries to be claimed. + */ + if (size >> 32 == 0xffffffff) + continue; + if (flags & IORESOURCE_IO) { res = bus->resource[0]; if (res->flags) {