[SPARC64]: Generic sun4v_build_irq().
authorDavid S. Miller <davem@sunset.davemloft.net>
Tue, 14 Feb 2006 02:16:10 +0000 (18:16 -0800)
committerDavid S. Miller <davem@sunset.davemloft.net>
Mon, 20 Mar 2006 09:12:40 +0000 (01:12 -0800)
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc64/kernel/irq.c
arch/sparc64/kernel/pci_sun4v.c
include/asm-sparc64/irq.h

index 51f6505..bcc889a 100644 (file)
@@ -303,6 +303,38 @@ out:
        return __irq(bucket);
 }
 
+unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino, int pil, unsigned char flags)
+{
+       struct ino_bucket *bucket;
+       unsigned long sysino;
+
+       sysino = sun4v_devino_to_sysino(devhandle, devino);
+
+       printk(KERN_INFO "sun4v_irq: Mapping ( devh[%08x] devino[%08x] ) "
+              "--> sysino[%016lx]\n", devhandle, devino, sysino);
+
+       bucket = &ivector_table[sysino];
+
+       /* Catch accidental accesses to these things.  IMAP/ICLR handling
+        * is done by hypervisor calls on sun4v platforms, not by direct
+        * register accesses.
+        */
+       bucket->imap = ~0UL;
+       bucket->iclr = ~0UL;
+
+       bucket->pil = pil;
+       bucket->flags = flags;
+
+       bucket->irq_info = kmalloc(sizeof(struct irq_desc), GFP_ATOMIC);
+       if (!bucket->irq_info) {
+               prom_printf("IRQ: Error, kmalloc(irq_desc) failed.\n");
+               prom_halt();
+       }
+       memset(bucket->irq_info, 0, sizeof(struct irq_desc));
+
+       return __irq(bucket);
+}
+
 static void atomic_bucket_insert(struct ino_bucket *bucket)
 {
        unsigned long pstate;
index 5174346..b8846b2 100644 (file)
@@ -644,18 +644,11 @@ static void pci_sun4v_scan_bus(struct pci_controller_info *p)
 
 static unsigned int pci_sun4v_irq_build(struct pci_pbm_info *pbm,
                                        struct pci_dev *pdev,
-                                       unsigned int ino)
+                                       unsigned int devino)
 {
-       struct ino_bucket *bucket;
-       unsigned long sysino;
        u32 devhandle = pbm->devhandle;
        int pil;
 
-       sysino = sun4v_devino_to_sysino(devhandle, ino);
-
-       printk(KERN_INFO "pci_irq_buld: Mapping ( devh[%08x] ino[%08x] ) "
-              "--> sysino[%016lx]\n", devhandle, ino, sysino);
-
        pil = 4;
        if (pdev) {
                switch ((pdev->class >> 16) & 0xff) {
@@ -685,26 +678,7 @@ static unsigned int pci_sun4v_irq_build(struct pci_pbm_info *pbm,
        }
        BUG_ON(PIL_RESERVED(pil));
 
-       bucket = &ivector_table[sysino];
-
-       /* Catch accidental accesses to these things.  IMAP/ICLR handling
-        * is done by hypervisor calls on sun4v platforms, not by direct
-        * register accesses.
-        */
-       bucket->imap = ~0UL;
-       bucket->iclr = ~0UL;
-
-       bucket->pil = pil;
-       bucket->flags = IBF_PCI;
-
-       bucket->irq_info = kmalloc(sizeof(struct irq_desc), GFP_ATOMIC);
-       if (!bucket->irq_info) {
-               prom_printf("IRQ: Error, kmalloc(irq_desc) failed.\n");
-               prom_halt();
-       }
-       memset(bucket->irq_info, 0, sizeof(struct irq_desc));
-
-       return __irq(bucket);
+       return sun4v_build_irq(devhandle, devino, pil, IBF_PCI);
 }
 
 static void pci_sun4v_base_address_update(struct pci_dev *pdev, int resource)
index 8b70edc..529a9df 100644 (file)
@@ -111,6 +111,7 @@ extern void disable_irq(unsigned int);
 #define disable_irq_nosync disable_irq
 extern void enable_irq(unsigned int);
 extern unsigned int build_irq(int pil, int inofixup, unsigned long iclr, unsigned long imap);
+extern unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino, int pil, unsigned char flags);
 extern unsigned int sbus_build_irq(void *sbus, unsigned int ino);
 
 static __inline__ void set_softint(unsigned long bits)