[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Here is a patch to enable Xen to run on a Unisys ES7000 x86_64 system.
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 9038a369268d0552ce659cdea3f38409bbaffffc # Parent 6e11af443eb1cc3ff5533d531ab48c9964ad2dee Here is a patch to enable Xen to run on a Unisys ES7000 x86_64 system. Signed-off-by: Aravindh Puthiyaparambil <aravindh.puthiyaparambil@xxxxxxxxxx> diff -r 6e11af443eb1 -r 9038a369268d xen/include/asm-x86/mach-summit/mach_apic.h --- a/xen/include/asm-x86/mach-summit/mach_apic.h Thu Jul 21 14:15:35 2005 +++ b/xen/include/asm-x86/mach-summit/mach_apic.h Thu Jul 21 15:50:11 2005 @@ -6,8 +6,6 @@ #define esr_disable (1) #define NO_BALANCE_IRQ (0) - -#define NO_IOAPIC_CHECK (1) /* Don't check I/O APIC ID for xAPIC */ /* In clustered mode, the high nibble of APIC ID is a cluster number. * The low nibble is a 4-bit bitmap. */ diff -r 6e11af443eb1 -r 9038a369268d xen/include/asm-x86/genapic.h --- a/xen/include/asm-x86/genapic.h Thu Jul 21 14:15:35 2005 +++ b/xen/include/asm-x86/genapic.h Thu Jul 21 15:50:11 2005 @@ -30,7 +30,6 @@ unsigned long (*check_apicid_used)(physid_mask_t bitmap, int apicid); unsigned long (*check_apicid_present)(int apicid); int no_balance_irq; - int no_ioapic_check; void (*init_apic_ldr)(void); physid_mask_t (*ioapic_phys_id_map)(physid_mask_t map); @@ -78,7 +77,6 @@ .int_delivery_mode = INT_DELIVERY_MODE, \ .int_dest_mode = INT_DEST_MODE, \ .no_balance_irq = NO_BALANCE_IRQ, \ - .no_ioapic_check = NO_IOAPIC_CHECK, \ .ESR_DISABLE = esr_disable, \ .apic_destination_logical = APIC_DEST_LOGICAL, \ APICFUNC(apic_id_registered), \ diff -r 6e11af443eb1 -r 9038a369268d xen/include/asm-x86/apicdef.h --- a/xen/include/asm-x86/apicdef.h Thu Jul 21 14:15:35 2005 +++ b/xen/include/asm-x86/apicdef.h Thu Jul 21 15:50:11 2005 @@ -108,10 +108,11 @@ #define APIC_BASE (fix_to_virt(FIX_APIC_BASE)) -#ifdef CONFIG_NUMA - #define MAX_IO_APICS 32 +/* These limits are dictated by ES7000 hardware. */ +#ifdef __i386__ + #define MAX_IO_APICS 65 #else - #define MAX_IO_APICS 8 + #define MAX_IO_APICS 129 #endif /* diff -r 6e11af443eb1 -r 9038a369268d xen/include/asm-x86/mach-bigsmp/mach_apic.h --- a/xen/include/asm-x86/mach-bigsmp/mach_apic.h Thu Jul 21 14:15:35 2005 +++ b/xen/include/asm-x86/mach-bigsmp/mach_apic.h Thu Jul 21 15:50:11 2005 @@ -13,8 +13,6 @@ #define NO_BALANCE_IRQ (1) #define esr_disable (1) - -#define NO_IOAPIC_CHECK (0) static inline int apic_id_registered(void) { diff -r 6e11af443eb1 -r 9038a369268d xen/include/asm-x86/mach-es7000/mach_apic.h --- a/xen/include/asm-x86/mach-es7000/mach_apic.h Thu Jul 21 14:15:35 2005 +++ b/xen/include/asm-x86/mach-es7000/mach_apic.h Thu Jul 21 15:50:11 2005 @@ -37,8 +37,6 @@ #define APIC_DEST_LOGICAL 0x0 #define WAKE_SECONDARY_VIA_INIT #endif - -#define NO_IOAPIC_CHECK (1) static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid) { diff -r 6e11af443eb1 -r 9038a369268d xen/arch/x86/genapic/es7000plat.c --- a/xen/arch/x86/genapic/es7000plat.c Thu Jul 21 14:15:35 2005 +++ b/xen/arch/x86/genapic/es7000plat.c Thu Jul 21 15:50:11 2005 @@ -136,7 +136,19 @@ es7000_plat = 0; } else { printk("\nEnabling ES7000 specific features...\n"); - es7000_plat = 1; + /* + * Determine the generation of the ES7000 currently running. + * + * es7000_plat = 0 if the machine is NOT a Unisys ES7000 box + * es7000_plat = 1 if the machine is a 5xx ES7000 box + * es7000_plat = 2 if the machine is a x86_64 ES7000 box + * + */ + if (!(boot_cpu_data.x86 <= 15 && boot_cpu_data.x86_model <= 2)) + es7000_plat = 2; + else + es7000_plat = 1; + ioapic_renumber_irq = es7000_rename_gsi; } return es7000_plat; @@ -286,7 +298,7 @@ void __init es7000_sw_apic() { - if (es7000_plat) { + if (es7000_plat == 1) { int mip_status; struct mip_reg es7000_mip_reg; diff -r 6e11af443eb1 -r 9038a369268d xen/include/asm-x86/mach-generic/mach_apic.h --- a/xen/include/asm-x86/mach-generic/mach_apic.h Thu Jul 21 14:15:35 2005 +++ b/xen/include/asm-x86/mach-generic/mach_apic.h Thu Jul 21 15:50:11 2005 @@ -5,7 +5,6 @@ #define esr_disable (genapic->ESR_DISABLE) #define NO_BALANCE_IRQ (genapic->no_balance_irq) -#define NO_IOAPIC_CHECK (genapic->no_ioapic_check) #define INT_DELIVERY_MODE (genapic->int_delivery_mode) #define INT_DEST_MODE (genapic->int_dest_mode) #undef APIC_DEST_LOGICAL diff -r 6e11af443eb1 -r 9038a369268d xen/arch/x86/mpparse.c --- a/xen/arch/x86/mpparse.c Thu Jul 21 14:15:35 2005 +++ b/xen/arch/x86/mpparse.c Thu Jul 21 15:50:11 2005 @@ -913,7 +913,10 @@ mp_ioapics[idx].mpc_apicaddr = address; set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); - mp_ioapics[idx].mpc_apicid = io_apic_get_unique_id(idx, id); + if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && (boot_cpu_data.x86 < 15)) + mp_ioapics[idx].mpc_apicid = io_apic_get_unique_id(idx, id); + else + mp_ioapics[idx].mpc_apicid = id; mp_ioapics[idx].mpc_apicver = io_apic_get_version(idx); /* @@ -995,9 +998,9 @@ Dprintk("Bus #%d is ISA\n", MP_ISA_BUS); /* - * ES7000 has no legacy identity mappings - */ - if (es7000_plat) + * Older generations of ES7000 have no legacy identity mappings + */ + if (es7000_plat == 1) return; /* @@ -1053,11 +1056,20 @@ } } +#define MAX_GSI_NUM 4096 + int mp_register_gsi (u32 gsi, int edge_level, int active_high_low) { int ioapic = -1; int ioapic_pin = 0; int idx, bit = 0; + static int pci_irq = 16; + /* + * Mapping between Global System Interrups, which + * represent all possible interrupts, and IRQs + * assigned to actual devices. + */ + static int gsi_to_irq[MAX_GSI_NUM]; #ifdef CONFIG_ACPI_BUS /* Don't set up the ACPI SCI because it's already set up */ @@ -1092,10 +1104,25 @@ if ((1<<bit) & mp_ioapic_routing[ioapic].pin_programmed[idx]) { Dprintk(KERN_DEBUG "Pin %d-%d already programmed\n", mp_ioapic_routing[ioapic].apic_id, ioapic_pin); - return gsi; + return gsi_to_irq[gsi]; } mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit); + + if (edge_level) { + /* + * For PCI devices assign IRQs in order, avoiding gaps + * due to unused I/O APIC pins. + */ + int irq = gsi; + if (gsi < MAX_GSI_NUM) { + gsi = pci_irq++; + gsi_to_irq[irq] = gsi; + } else { + printk(KERN_ERR "GSI %u is too high\n", gsi); + return gsi; + } + } io_apic_set_pci_routing(ioapic, ioapic_pin, gsi, edge_level == ACPI_EDGE_SENSITIVE ? 0 : 1, diff -r 6e11af443eb1 -r 9038a369268d xen/include/asm-x86/mach-default/mach_apic.h --- a/xen/include/asm-x86/mach-default/mach_apic.h Thu Jul 21 14:15:35 2005 +++ b/xen/include/asm-x86/mach-default/mach_apic.h Thu Jul 21 15:50:11 2005 @@ -18,8 +18,6 @@ #define NO_BALANCE_IRQ (0) #define esr_disable (0) - -#define NO_IOAPIC_CHECK (0) #define INT_DELIVERY_MODE dest_LowestPrio #define INT_DEST_MODE 1 /* logical delivery broadcast to all procs */ diff -r 6e11af443eb1 -r 9038a369268d xen/arch/x86/io_apic.c --- a/xen/arch/x86/io_apic.c Thu Jul 21 14:15:35 2005 +++ b/xen/arch/x86/io_apic.c Thu Jul 21 15:50:11 2005 @@ -956,6 +956,13 @@ unsigned long flags; /* + * Don't check I/O APIC IDs for xAPIC systems. They have + * no meaning without the serial APIC bus. + */ + if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && boot_cpu_data.x86 < 15)) + return; + + /* * This is broken; anything with a real cpu count has to * circumvent this idiocy regardless. */ @@ -981,10 +988,6 @@ mp_ioapics[apic].mpc_apicid = reg_00.bits.ID; } - /* Don't check I/O APIC IDs for some xAPIC systems. They have - * no meaning without the serial APIC bus. */ - if (NO_IOAPIC_CHECK) - continue; /* * Sanity check, is the ID really free? Every APIC in a * system must have a unique ID or we get lots of nice _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |