PCI: clear bridge resource range if BIOS assigned bad one
authorYinghai Lu <yinghai.lu@oracle.com>
Thu, 3 Jun 2010 20:43:03 +0000 (13:43 -0700)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Fri, 11 Jun 2010 20:24:51 +0000 (13:24 -0700)
Yannick found that video does not work with 2.6.34.  The cause of this
bug was that the BIOS had assigned the wrong range to the PCI bridge
above the video device.  Before 2.6.34 the kernel would have shrunk
the size of the bridge window, but since
  d65245c PCI: don't shrink bridge resources
the kernel will avoid shrinking BIOS ranges.

So zero out the old range if we fail to claim it at boot time; this will
cause us to allocate a new range at startup, restoring the 2.6.34
behavior.

Fixes regression https://bugzilla.kernel.org/show_bug.cgi?id=16009.

Reported-by: Yannick <yannick.roehlly@free.fr>
Acked-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
arch/microblaze/pci/pci-common.c
arch/mn10300/unit-asb2305/pci-asb2305.c
arch/powerpc/kernel/pci-common.c
arch/x86/pci/i386.c

index 9cb782b8e036f763b09d61054652897da5c9141b..23be25fec4d67bf7e48d612b50e1da9f766371ae 100644 (file)
@@ -1277,6 +1277,7 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus)
                printk(KERN_WARNING "PCI: Cannot allocate resource region "
                       "%d of PCI bridge %d, will remap\n", i, bus->number);
 clear_resource:
+               res->start = res->end = 0;
                res->flags = 0;
        }
 
index d6119b879a9812f9f1e50749b06d764c38ebfb5c..45b40ac6c4647b3bb0751a1352e21e2e0a66ae3e 100644 (file)
@@ -117,6 +117,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list)
                                         * Invalidate the resource to prevent
                                         * child resource allocations in this
                                         * range. */
+                                       r->start = r->end = 0;
                                        r->flags = 0;
                                }
                        }
index 6646005dffb102b8b57172442aa8a71c5ed85a82..5b38f6ae2b299695139c25a21cff0b73f8857808 100644 (file)
@@ -1309,6 +1309,7 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus)
                printk(KERN_WARNING "PCI: Cannot allocate resource region "
                       "%d of PCI bridge %d, will remap\n", i, bus->number);
 clear_resource:
+               res->start = res->end = 0;
                res->flags = 0;
        }
 
index 97da2ba9344b4ca7fa1f08d7cd015fe77a332ea6..6fdb3ec30c3197e15fc54e18c91291f5eb403450 100644 (file)
@@ -96,6 +96,7 @@ EXPORT_SYMBOL(pcibios_align_resource);
  *       the fact the PCI specs explicitly allow address decoders to be
  *       shared between expansion ROMs and other resource regions, it's
  *       at least dangerous)
+ *     - bad resource sizes or overlaps with other regions
  *
  *  Our solution:
  *     (1) Allocate resources for all buses behind PCI-to-PCI bridges.
@@ -136,6 +137,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list)
                                         * child resource allocations in this
                                         * range.
                                         */
+                                       r->start = r->end = 0;
                                        r->flags = 0;
                                }
                        }