Thread (21 messages) flat view 21 messages, 5 authors, 2007-02-05

Re: [PATCH] [7/9] pasemi: Configure DMA controller interrupts

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2007-02-04 23:53:57

On Thu, 2007-02-01 at 22:54 -0600, Olof Johansson wrote:
plain text document attachment (pasemi-dma-irqs)
The DMA controller on PWRficient is somewhat special -- has a PCI header
so it looks like it's on the root PCI (-Express) root bus, but it uses
more than the default number of interrupts (and they are hardwired).

We need to wire up all interrupts for the DMA controller. The generic
IRQ code will only map the primary interrupt from the PCI header (128),
so add 129->211 by hand.
Or you can have them in the device-tree ... the generic code only maps
PCI IRQ index 0 but nothing prevents your fixup code to map the other
ones.

However, I do wonder what is the point of creating a mapping and nor
storing the resulting virq anywhere ? When are those IRQs actually
used ?

That is the place where the mapping should happen... There is no
guarantee that the resulting virq from irq_create_mapping() will be the
same as the HW irq you passed in (it will in -most- cases with the
current code, but it's a bug to rely on that behaviour). Thus you should
store the result of irq_create_mapping() and use that. I see no
advantage in "pre-mapping" things that way.

Ben.
 
quoted hunk ↗ jump to hunk
Signed-off-by: Olof Johansson <redacted>

Index: merge/arch/powerpc/platforms/pasemi/pci.c
===================================================================
--- merge.orig/arch/powerpc/platforms/pasemi/pci.c
+++ merge/arch/powerpc/platforms/pasemi/pci.c
@@ -163,6 +163,19 @@ static void __init pas_fixup_phb_resourc
 }
 

+void __devinit pas_pci_irq_fixup(struct pci_dev *dev)
+{
+	/* DMA is special, 84 interrupts (128 -> 211), all but 128
+	 * need to be mapped by hand here.
+	 */
+	if (dev->vendor == 0x1959 && dev->device == 0xa007) {
+		int i;
+		for (i = 129; i < 212; i++)
+			irq_create_mapping(NULL, i);
+	}
+}
+
+
 void __init pas_pci_init(void)
 {
 	struct device_node *np, *root;
Index: merge/arch/powerpc/platforms/pasemi/setup.c
===================================================================
--- merge.orig/arch/powerpc/platforms/pasemi/setup.c
+++ merge/arch/powerpc/platforms/pasemi/setup.c
@@ -242,4 +242,5 @@ define_machine(pas) {
 	.check_legacy_ioport    = pas_check_legacy_ioport,
 	.progress		= pas_progress,
 	.machine_check_exception = pas_machine_check_handler,
+	.pci_irq_fixup		= pas_pci_irq_fixup,
 };
Index: merge/arch/powerpc/platforms/pasemi/pasemi.h
===================================================================
--- merge.orig/arch/powerpc/platforms/pasemi/pasemi.h
+++ merge/arch/powerpc/platforms/pasemi/pasemi.h
@@ -3,6 +3,7 @@
 
 extern unsigned long pas_get_boot_time(void);
 extern void pas_pci_init(void);
+extern void __devinit pas_pci_irq_fixup(struct pci_dev *dev);
 
 extern void __init pasemi_idle_init(void);
 

--
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help