Re: [POWERPC] Don't get PCI IRQ from OF for devices with no IRQ
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2006-10-08 20:53:44
On Sat, 2006-10-07 at 19:59 +0000, Linux Kernel Mailing List wrote:
commit 41550c5128150175197257b6ceab2cd50dea7b51 tree 9406c5680e5e7fd49804fe95104453b272533f28 parent c998de146061db17787c1a31a3db1989f1341fdf author Benjamin Herrenschmidt [off-list ref] 1160030441 +1000 committer Paul Mackerras [off-list ref] 1160133041 +1000 [POWERPC] Don't get PCI IRQ from OF for devices with no IRQ
Hi Linus ! Please revert this one for now. It seems to break G5s :( Looks like PCI cells inside Apple IO ASICs don't have a PCI_INTERRUPT_LINE set. I need to figure out a better fix. Cheers, Ben.
quoted hunk
This patch adds checking of the PCI_INTERRUPT_PIN register before using standard OF parsing to retreive PCI interrupts. The reason is that some PCI devices may have no PCI interrupt, though they may have interrupts attached via other means. In this case, we shall not use irq->pdev, but device-specific code can later retreive those interrupts instead. Without that patch, Maple and derivatives don't get the right interrupt for the second IDE channel as the linux IDE code fallsback to the PCI irq instead of trying to use the legacy ones for the on-board controller (which has no PCI_INTERRUPT_PIN). Having no PCI IRQ assign to it (as it doesn't request any) fixes it. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <redacted> arch/powerpc/kernel/prom_parse.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)diff --git a/arch/powerpc/kernel/prom_parse.c b/arch/powerpc/kernel/prom_parse.c index 603dff3..17fcb48 100644 --- a/arch/powerpc/kernel/prom_parse.c +++ b/arch/powerpc/kernel/prom_parse.c@@ -914,6 +914,17 @@ int of_irq_map_pci(struct pci_dev *pdev, u8 pin; int rc; + /* We need to first check if the PCI device has a PCI interrupt at all + * since we have cases where the device-node might expose non-PCI + * interrupts, but the device has no PCI interrupt to it + */ + rc = pci_read_config_byte(pdev, PCI_INTERRUPT_PIN, &pin); + if (rc != 0) + return rc; + /* No pin, exit */ + if (pin == 0) + return -ENODEV; + /* Check if we have a device node, if yes, fallback to standard OF * parsing */@@ -925,12 +936,6 @@ int of_irq_map_pci(struct pci_dev *pdev, * interrupt spec. we assume #interrupt-cells is 1, which is standard * for PCI. If you do different, then don't use that routine. */ - rc = pci_read_config_byte(pdev, PCI_INTERRUPT_PIN, &pin); - if (rc != 0) - return rc; - /* No pin, exit */ - if (pin == 0) - return -ENODEV; /* Now we walk up the PCI tree */ lspec = pin; -To unsubscribe from this list: send the line "unsubscribe git-commits-head" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html