From: Isaku Yamahata Date: Fri, 10 Oct 2008 02:58:03 +0000 (+0900) Subject: [IA64] introduce iosapci ID. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14092 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=005afacdb74dfac8487f524e59231a828eae3060;p=xen.git [IA64] introduce iosapci ID. introduce iosapci ID, which is used to index DMA engine covering this iosapic. Signed-off-by; Anthony Xu --- diff --git a/xen/arch/ia64/linux-xen/acpi.c b/xen/arch/ia64/linux-xen/acpi.c index c686ffa88a..97ad0bbcc5 100644 --- a/xen/arch/ia64/linux-xen/acpi.c +++ b/xen/arch/ia64/linux-xen/acpi.c @@ -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; diff --git a/xen/arch/ia64/linux-xen/iosapic.c b/xen/arch/ia64/linux-xen/iosapic.c index 409ac8995c..b6065f7410 100644 --- a/xen/arch/ia64/linux-xen/iosapic.c +++ b/xen/arch/ia64/linux-xen/iosapic.c @@ -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 diff --git a/xen/include/asm-ia64/linux-xen/asm/iosapic.h b/xen/include/asm-ia64/linux-xen/asm/iosapic.h index 90fb63de91..1beb6162ba 100644 --- a/xen/include/asm-ia64/linux-xen/asm/iosapic.h +++ b/xen/include/asm-ia64/linux-xen/asm/iosapic.h @@ -53,6 +53,34 @@ #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