powerpc: Fix device-tree matching for Apple U4 bridge
Apple Quad G5 has some oddity in it's device-tree which causes the new generic matching code to fail to relate nodes for PCI-E devices below U4 with their respective struct pci_dev. This breaks graphics on those machines among others. This fixes it using a quirk which copies the node pointer from the host bridge for the root complex, which makes the generic code work for the children afterward. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
b0f84374b6
commit
16fa42affd
|
@ -561,6 +561,20 @@ static struct pci_ops u4_pcie_pci_ops =
|
||||||
.write = u4_pcie_write_config,
|
.write = u4_pcie_write_config,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void __devinit pmac_pci_fixup_u4_of_node(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
/* Apple's device-tree "hides" the root complex virtual P2P bridge
|
||||||
|
* on U4. However, Linux sees it, causing the PCI <-> OF matching
|
||||||
|
* code to fail to properly match devices below it. This works around
|
||||||
|
* it by setting the node of the bridge to point to the PHB node,
|
||||||
|
* which is not entirely correct but fixes the matching code and
|
||||||
|
* doesn't break anything else. It's also the simplest possible fix.
|
||||||
|
*/
|
||||||
|
if (dev->dev.of_node == NULL)
|
||||||
|
dev->dev.of_node = pcibios_get_phb_of_node(dev->bus);
|
||||||
|
}
|
||||||
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_APPLE, 0x5b, pmac_pci_fixup_u4_of_node);
|
||||||
|
|
||||||
#endif /* CONFIG_PPC64 */
|
#endif /* CONFIG_PPC64 */
|
||||||
|
|
||||||
#ifdef CONFIG_PPC32
|
#ifdef CONFIG_PPC32
|
||||||
|
|
Loading…
Reference in New Issue