[IA64] introduce iosapci ID.
authorIsaku Yamahata <yamahata@valinux.co.jp>
Fri, 10 Oct 2008 02:58:03 +0000 (11:58 +0900)
committerIsaku Yamahata <yamahata@valinux.co.jp>
Fri, 10 Oct 2008 02:58:03 +0000 (11:58 +0900)
introduce iosapci ID, which is used to index DMA engine covering this iosapic.

Signed-off-by; Anthony Xu <anthony.xu@intel.com>

xen/arch/ia64/linux-xen/acpi.c
xen/arch/ia64/linux-xen/iosapic.c
xen/include/asm-ia64/linux-xen/asm/iosapic.h

index c686ffa88a5c6772bb684741c172e0a4a23d8c87..97ad0bbcc57c3b27cd8c5280a96780abafd53ddd 100644 (file)
@@ -294,7 +294,12 @@ acpi_parse_iosapic(struct acpi_subtable_header * header, const unsigned long end
        if (BAD_MADT_ENTRY(iosapic, end))
                return -EINVAL;
 
+#ifndef XEN
        return iosapic_init(iosapic->address, iosapic->global_irq_base);
+#else
+       return iosapic_init(iosapic->address, iosapic->global_irq_base,
+                           iosapic->id);
+#endif
 }
 
 static unsigned int __initdata acpi_madt_rev;
index 409ac8995c2d0480122f6337bd563f1a28dc5124..b6065f741084d91e09c35261a6b779adeadcda49 100644 (file)
@@ -128,6 +128,7 @@ static struct iosapic_intr_info {
        unsigned char   trigger : 1;    /* trigger mode (see iosapic.h) */
 } iosapic_intr_info[IA64_NUM_VECTORS];
 
+#ifndef XEN
 static struct iosapic {
        char __iomem    *addr;          /* base address of IOSAPIC */
        unsigned int    gsi_base;       /* first GSI assigned to this IOSAPIC */
@@ -137,6 +138,9 @@ static struct iosapic {
        unsigned short  node;           /* numa node association via pxm */
 #endif
 } iosapic_lists[NR_IOSAPICS];
+#else
+struct iosapic iosapic_lists[NR_IOSAPICS];
+#endif
 
 static unsigned char pcat_compat __devinitdata;        /* 8259 compatibility flag */
 
@@ -1035,7 +1039,11 @@ iosapic_check_gsi_range (unsigned int gsi_base, unsigned int ver)
 }
 
 int __devinit
+#ifndef XEN
 iosapic_init (unsigned long phys_addr, unsigned int gsi_base)
+#else  
+iosapic_init (unsigned long phys_addr, unsigned int gsi_base, unsigned int id)
+#endif
 {
        int num_rte, err, index;
        unsigned int isa_irq, ver;
@@ -1064,6 +1072,9 @@ iosapic_init (unsigned long phys_addr, unsigned int gsi_base)
                iosapic_lists[index].addr = addr;
                iosapic_lists[index].gsi_base = gsi_base;
                iosapic_lists[index].num_rte = num_rte;
+#ifdef XEN
+               iosapic_lists[index].id = id;
+#endif
 #ifdef CONFIG_NUMA
                iosapic_lists[index].node = MAX_NUMNODES;
 #endif
index 90fb63de912d2023b725167d77657cf80b5b7945..1beb6162ba6e11eff71e71defbf8dce488ba80f5 100644 (file)
 
 #define NR_IOSAPICS                    256
 
+#ifdef XEN
+struct iosapic {
+       char __iomem    *addr;      /* base address of IOSAPIC */
+       unsigned int    gsi_base;   /* first GSI assigned to this IOSAPIC */
+       unsigned short  num_rte;    /* number of RTE in this IOSAPIC */
+       int     rtes_inuse; /* # of RTEs in use on this IOSAPIC */
+       unsigned int    id;                     /*  APIC ID */
+#ifdef CONFIG_NUMA
+       unsigned short  node;       /* numa node association via pxm */
+#endif
+};
+
+extern struct iosapic iosapic_lists[NR_IOSAPICS];
+
+static inline int find_iosapic_by_addr(unsigned long addr)
+{
+       int i;
+
+       for (i = 0; i < NR_IOSAPICS; i++) {
+               if ((unsigned long)iosapic_lists[i].addr == addr)
+                       return i;
+       }
+
+       return -1;
+}
+#endif
+
+
 static inline unsigned int iosapic_read(char __iomem *iosapic, unsigned int reg)
 {
        writel(reg, iosapic + IOSAPIC_REG_SELECT);
@@ -71,8 +99,13 @@ static inline void iosapic_eoi(char __iomem *iosapic, u32 vector)
 }
 
 extern void __init iosapic_system_init (int pcat_compat);
+#ifndef        XEN
 extern int __devinit iosapic_init (unsigned long address,
                                    unsigned int gsi_base);
+#else
+extern int __devinit iosapic_init (unsigned long address,
+                                  unsigned int gsi_base, unsigned int id);
+#endif
 #ifdef CONFIG_HOTPLUG
 extern int iosapic_remove (unsigned int gsi_base);
 #else