[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.