From: Benjamin Herrenschmidt The iMac G5 has some issues with Apple chips not having a valid PCI_INTERRUPT_PIN. This patch fixes IRQ routing on PowerMac platforms so that it only relies on the Open Firmware informations which are correct. Signed-off-by: Benjamin Herrenschmidt Signed-off-by: J. Mayer Signed-off-by: Andrew Morton --- 25-akpm/arch/ppc64/kernel/pmac_pci.c | 22 +++++++++++++++++++++- 1 files changed, 21 insertions(+), 1 deletion(-) diff -puN arch/ppc64/kernel/pmac_pci.c~ppc64-fix-some-pci-interrupt-routing-issues-on-imac-g5 arch/ppc64/kernel/pmac_pci.c --- 25/arch/ppc64/kernel/pmac_pci.c~ppc64-fix-some-pci-interrupt-routing-issues-on-imac-g5 2005-03-11 12:32:11.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/pmac_pci.c 2005-03-11 12:32:11.000000000 -0800 @@ -656,13 +656,32 @@ static int __init add_bridge(struct devi return 0; } +/* + * We use our own read_irq_line here because PCI_INTERRUPT_PIN is + * crap on some of Apple ASICs. We unconditionally use the Open Firmware + * interrupt number as this is always right. + */ +static int pmac_pci_read_irq_line(struct pci_dev *pci_dev) +{ + struct device_node *node; + + node = pci_device_to_OF_node(pci_dev); + if (node == NULL) + return -1; + if (node->n_intrs == 0) + return -1; + pci_dev->irq = node->intrs[0].line; + pci_write_config_byte(pci_dev, PCI_INTERRUPT_LINE, pci_dev->irq); + + return 0; +} void __init pmac_pcibios_fixup(void) { struct pci_dev *dev = NULL; for_each_pci_dev(dev) - pci_read_irq_line(dev); + pmac_pci_read_irq_line(dev); } static void __init pmac_fixup_phb_resources(void) @@ -771,3 +790,4 @@ static void fixup_k2_sata(struct pci_dev } } DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SERVERWORKS, 0x0240, fixup_k2_sata); + _