===================================================================
@@ -299,9 +299,17 @@ static void assign_requested_resources_s
bool is_ioport_res_without_bus_support =
(!(bus_res_type_mask & IORESOURCE_IO)) &&
(res->flags & IORESOURCE_IO);
+ /*
+ * if the failed res is mmio, but bus does
+ * not have io port support, don't add it
+ */
+ bool is_mmio_nonpref_res_without_bus_support =
+ (!(bus_res_type_mask & IORESOURCE_MEM)) &&
+ ((res->flags & (IORESOURCE_MEM | IORESOURCE_PREFETCH)) == IORESOURCE_MEM);
if (!is_rom_res_not_enabled &&
- !is_ioport_res_without_bus_support)
+ !is_ioport_res_without_bus_support &&
+ !is_mmio_nonpref_res_without_bus_support)
add_to_list(fail_head,
dev_res->dev, res,
0 /* dont care */,
@@ -1416,12 +1424,24 @@ static unsigned long pci_bus_res_type_ma
int i;
struct resource *r;
unsigned long mask = 0;
- unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM |
- IORESOURCE_PREFETCH;
- pci_bus_for_each_resource(bus, r, i)
- if (r)
- mask |= r->flags & type_mask;
+ pci_bus_for_each_resource(bus, r, i) {
+ if (!r)
+ continue;
+
+ if (r->flags & IORESOURCE_IO) {
+ mask |= IORESOURCE_IO;
+ continue;
+ }
+ if (r->flags & IORESOURCE_PREFETCH) {
+ mask |= IORESOURCE_PREFETCH;
+ continue;
+ }
+ if ((r->flags & (IORESOURCE_MEM | IORESOURCE_PREFETCH)) == IORESOURCE_MEM) {
+ mask |= IORESOURCE_MEM; /* nonpref only */
+ continue;
+ }
+ }
return mask;
}
For x86 8 sockets or 32 sockets system that will have one root bus per socket, They may have some root buses do not have mmio non-pref range. We should not fall into retry in this case, as root bus does not mmio non-pref range. We check if the root bus has mmio-nonpref range, and set bus_res_type_mask, and pass it to assign_resources and don't add mmio-nonpref res to failed list for root bus that does not have mmio-nonpref range. So even BIOS set wrong value to pci devices and bridges will still get cleared. Signed-off-by: Yinghai Lu <yinghai@kernel.org> --- drivers/pci/setup-bus.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html