pci_get_legacy_ide_irq()
Subsystems (3)
RFC 1/1 pci_get_legacy_ide_irq()
Hi !
As discussed earlier, this is a proposed patch that adds the function to include/asm-generic/pci.h and ppc64's own pci.h. I also only call it from the amd7xxx.c driver for now, I want to let Bart decide if we should add a call to it from every driver that don't see an irq when we sort-of know what we are doing, or if we could just call it from the generic pci-ide code when the controller is in legacy mode ... maybe after a probe pass ? (thoug archs like ppc don't do irq probe).
The patch also uses NO_IRQ which is currently not defined on a lot of archs. This is ok as I'm currently collecting definitions for it and will send a patch adding those before this patch gets submited.
This patch adds a pci_get_legacy_ide_irq() function to include/asm-generic/pci.h that returns the interrupt to use for a PCI IDE controller that is set to "legacy mode". It also adds a ppc64 specific implementation that allows the platform code to provide it's own number. Finally, it adds a call to this routine to the amd7xxx driver (instead of hard coding the numbers) when no interrupt was found.
I decided to fix individual drivers rather
drivers/ide/pci/amd74xx.c +2 -2
@@ -416,8 +416,8 @@ {int i; -if (!hwif->irq) - hwif->irq = hwif->channel ?15 :14 ; +if (hwif->irq ==NO_IRQ ) + hwif->irq =pci_get_legacy_ide_irq (hwif->pci_dev, hwif->channel); hwif->autodma =0 ;
include/asm-ppc64/pci.h +10 -1
@@ -13,6 +13,7 @@#include <linux/slab.h> #include <linux/string.h> #include <linux/dma-mapping.h> +#include <asm/machdep.h> #include <asm/scatterlist.h> #include <asm/io.h> #include <asm/prom.h>
@@ -20,6 +21,8 @@#define PCIBIOS_MIN_IO 0x1000#define PCIBIOS_MIN_MEM 0x10000000 +struct pci_dev ; +#ifdef CONFIG_PPC_ISERIES #define pcibios_scan_all_fns (a, b) 0#else
@@ -36,7 +39,13 @@/* We don't do dynamic PCI IRQ allocation */ } -struct pci_dev ; +#define HAVE_ARCH_PCI_GET_LEGACY_IDE_IRQ +static inline int pci_get_legacy_ide_irq (struct pci_dev *dev,int channel) +{ +if (ppc_md.pci_get_legacy_ide_irq) +return ppc_md.pci_get_legacy_ide_irq (dev, channel); +return channel ?15 :14 ; +}#define HAVE_ARCH_PCI_MWI 1static inline int pcibios_prep_mwi (struct pci_dev *dev)
include/asm-generic/pci.h +7 -0
@@ -24,4 +24,11 @@#define pcibios_scan_all_fns (a, b) 0 +#ifndef HAVE_ARCH_PCI_GET_LEGACY_IDE_IRQ +static inline int pci_get_legacy_ide_irq (struct pci_dev *dev,int channel) +{ +return channel ?15 :14 ; +} +#endif /* HAVE_ARCH_PCI_GET_LEGACY_IDE_IRQ */ +#endif
include/asm-ppc64/machdep.h +3 -0
@@ -117,6 +117,9 @@/* Check availability of legacy devices like i8042 */ int (*check_legacy_ioport)(unsigned int baseport); +/* Get legacy PCI/IDE interrupt mapping */ +int (*pci_get_legacy_ide_irq)(struct pci_dev *dev,int channel); + };extern struct machdep_calls ppc_md;
Hi!
Quoted 9 lines · Benjamin Herrenschmidt
Hi !
As discussed earlier, this is a proposed patch that adds the function to
include/asm-generic/pci.hand ppc64's ownpci.h. I also only call it from theamd7xxx.cdriver for now, I want to let Bart decide if we should add a call to it from every driver that don't see an irq when we sort-of know what we are doing, or if we could just call it from the generic pci-ide code when the controller is in legacy mode ... maybe after a probe pass ? (thoug archs like ppc don't do irq probe).
IMHO just stick it in a drivers for now,
we can think about generic place later
Quoted 3 lines
The patch also uses
NO_IRQwhich is currently not defined on a lot of archs. This is ok as I'm currently collecting definitions for it and will send a patch adding those before this patch gets submited.
fine
Quoted 15 lines
This patch adds a
pci_get_legacy_ide_irq()function toinclude/asm-generic/pci.hthat returns the interrupt to use for a PCI IDE controller that is set to "legacy mode". It also adds a ppc64 specific implementation that allows the platform code to provide it's own number. Finally, it adds a call to this routine to the amd7xxx driver (instead of hard coding the numbers) when no interrupt was found.
I decided to fix individual drivers ratherSigned-off-by Benjamin Herrenschmidt <[email protected]>Index:
linux-maple/drivers/ide/pci/amd74xx.c
===================================================================
drivers/ide/pci/amd74xx.c 2004-10-19 17:04:20.243498048 +1000 line 420
Quoted 7 lines
drivers/ide/pci/amd74xx.c 2004-10-19 17:04:20.243498048 +1000 renamed from drivers/ide/pci/amd74xx.c 2004-10-19 13:38:08.000000000 +1000 +2
-2@@ -416,8 +416,8 @@ { int i; - if (!hwif->irq) - hwif->irq = hwif->channel ? 15 : 14; + if (hwif->irq == NO_IRQ) + hwif->irq = pci_get_legacy_ide_irq(hwif->pci_dev, hwif->channel);
This won't be ever executed unless
* you teach IDE driver about NO_IRQ
or
* NO_IRQ is 0
Bartlomiej
Quoted 4 lines · Bartlomiej Zolnierkiewicz
This won't be ever executed unless
* you teach IDE driver aboutNO_IRQ
or
*NO_IRQis 0
Right. I need to fix IDE driver for NO_IRQ too, good point.
Ben.