[PATCH -v2] x86, pci: Handle fallout pci devices with peer root bus

From: Yinghai Lu
Date: Mon Jun 14 2010 - 13:49:58 EST



Graham bisected
| commit 3e3da00c01d050307e753fb7b3e84aefc16da0d0
| x86/pci: AMD one chain system to use pci read out res

cause the SND_HDA_INTEL doesn't work anymore.

https://bugzilla.kernel.org/show_bug.cgi?id=16007

It turns out that his system with via chipset only have one hypertransport
chain, but does have one extra orphan device 80:01.0

PCI: Probing PCI hardware (bus 00)
PCI: Discovered primary peer bus 80 [IRQ]

node 0 link 0: io port [1000, ffffff]
TOM: 0000000080000000 aka 2048M
node 0 link 0: mmio [e0000000, efffffff]
node 0 link 0: mmio [a0000, bffff]
node 0 link 0: mmio [80000000, ffffffff]
bus: [00, ff] on node 0 link 0

Try to make peer root buses to share same mmio/io resources if those peer root
buses fall into the same bus range.

Also need to update insert_resource to avoid insert same resource two times.

We need this patch for 2.6.34 stable.

Reported-by: Graham Ramsey <ramsey.graham@xxxxxxxxxxxx>
Bisected-by: Graham Ramsey <ramsey.graham@xxxxxxxxxxxx>
Tested-by: Graham Ramsey <ramsey.graham@xxxxxxxxxxxx>
Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx>
Cc: stable@xxxxxxxxxx

---
arch/x86/pci/bus_numa.c | 3 ++-
kernel/resource.c | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)

Index: linux-2.6/arch/x86/pci/bus_numa.c
===================================================================
--- linux-2.6.orig/arch/x86/pci/bus_numa.c
+++ linux-2.6/arch/x86/pci/bus_numa.c
@@ -22,7 +22,8 @@ void x86_pci_root_bus_res_quirks(struct
return;

for (i = 0; i < pci_root_num; i++) {
- if (pci_root_info[i].bus_min == b->number)
+ if (pci_root_info[i].bus_min <= b->number &&
+ pci_root_info[i].bus_max >= b->number)
break;
}

Index: linux-2.6/kernel/resource.c
===================================================================
--- linux-2.6.orig/kernel/resource.c
+++ linux-2.6/kernel/resource.c
@@ -451,7 +451,7 @@ static struct resource * __insert_resour
if (!first)
return first;

- if (first == parent)
+ if (first == parent || first == new)
return first;

if ((first->start > new->start) || (first->end < new->end))
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/