提交 837c4ef1 编写于 作者: Y Yinghai Lu 提交者: Jesse Barnes

PCI: clear bridge resource range if BIOS assigned bad one

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
  d65245c3 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: NYannick <yannick.roehlly@free.fr>
Acked-by: NBjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: NYinghai Lu <yinghai@kernel.org>
Signed-off-by: NJesse Barnes <jbarnes@virtuousgeek.org>
上级 a7ef7d1f
...@@ -1277,6 +1277,7 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus) ...@@ -1277,6 +1277,7 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus)
printk(KERN_WARNING "PCI: Cannot allocate resource region " printk(KERN_WARNING "PCI: Cannot allocate resource region "
"%d of PCI bridge %d, will remap\n", i, bus->number); "%d of PCI bridge %d, will remap\n", i, bus->number);
clear_resource: clear_resource:
res->start = res->end = 0;
res->flags = 0; res->flags = 0;
} }
......
...@@ -117,6 +117,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list) ...@@ -117,6 +117,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list)
* Invalidate the resource to prevent * Invalidate the resource to prevent
* child resource allocations in this * child resource allocations in this
* range. */ * range. */
r->start = r->end = 0;
r->flags = 0; r->flags = 0;
} }
} }
......
...@@ -1309,6 +1309,7 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus) ...@@ -1309,6 +1309,7 @@ void pcibios_allocate_bus_resources(struct pci_bus *bus)
printk(KERN_WARNING "PCI: Cannot allocate resource region " printk(KERN_WARNING "PCI: Cannot allocate resource region "
"%d of PCI bridge %d, will remap\n", i, bus->number); "%d of PCI bridge %d, will remap\n", i, bus->number);
clear_resource: clear_resource:
res->start = res->end = 0;
res->flags = 0; res->flags = 0;
} }
......
...@@ -96,6 +96,7 @@ EXPORT_SYMBOL(pcibios_align_resource); ...@@ -96,6 +96,7 @@ EXPORT_SYMBOL(pcibios_align_resource);
* the fact the PCI specs explicitly allow address decoders to be * the fact the PCI specs explicitly allow address decoders to be
* shared between expansion ROMs and other resource regions, it's * shared between expansion ROMs and other resource regions, it's
* at least dangerous) * at least dangerous)
* - bad resource sizes or overlaps with other regions
* *
* Our solution: * Our solution:
* (1) Allocate resources for all buses behind PCI-to-PCI bridges. * (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) ...@@ -136,6 +137,7 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list)
* child resource allocations in this * child resource allocations in this
* range. * range.
*/ */
r->start = r->end = 0;
r->flags = 0; r->flags = 0;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册