[PATCH][2.5][RFC] Using xAPIC apic address space on !Summit

From: Zwane Mwaikambo (zwane@holomorphy.com)
Date: Thu Dec 12 2002 - 20:44:03 EST


Hi,
        I've got an 32x SMP system which has an xAPIC but utilises flat
addressing. This patch is to rename what was formerly x86_summit to
x86_xapic (just to avoid confusion) and then select mask depending on
that.

Untested/uncompiled patch

Index: linux-2.5.51/include/asm-i386/apic.h
===================================================================
RCS file: /build/cvsroot/linux-2.5.51/include/asm-i386/apic.h,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 apic.h
--- linux-2.5.51/include/asm-i386/apic.h 10 Dec 2002 12:47:44 -0000 1.1.1.1
+++ linux-2.5.51/include/asm-i386/apic.h 12 Dec 2002 17:10:51 -0000
@@ -90,6 +90,7 @@
 extern int check_nmi_watchdog (void);
 extern void enable_NMI_through_LVT0 (void * dummy);

+extern int x86_xapic;
 extern unsigned int nmi_watchdog;
 #define NMI_NONE 0
 #define NMI_IO_APIC 1
Index: linux-2.5.51/include/asm-i386/apicdef.h
===================================================================
RCS file: /build/cvsroot/linux-2.5.51/include/asm-i386/apicdef.h,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 apicdef.h
--- linux-2.5.51/include/asm-i386/apicdef.h 10 Dec 2002 12:47:44 -0000 1.1.1.1
+++ linux-2.5.51/include/asm-i386/apicdef.h 12 Dec 2002 03:22:59 -0000
@@ -9,10 +9,11 @@
  */

 #define APIC_DEFAULT_PHYS_BASE 0xfee00000
-
+extern int x86_xapic;
+#define APIC_BROADCAST_ID (x86_xapic ? 0xFF : 0x0F)
 #define APIC_ID 0x20
-#define APIC_ID_MASK (0x0F<<24)
-#define GET_APIC_ID(x) (((x)>>24)&0x0F)
+#define APIC_ID_MASK (APIC_BROADCAST_ID<<24)
+#define GET_APIC_ID(x) (((x)>>24)&APIC_BROADCAST_ID)
 #define APIC_LVR 0x30
 #define APIC_LVR_MASK 0xFF00FF
 #define GET_APIC_VERSION(x) ((x)&0xFF)
Index: linux-2.5.51/arch/i386/kernel/apic.c
===================================================================
RCS file: /build/cvsroot/linux-2.5.51/arch/i386/kernel/apic.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 apic.c
--- linux-2.5.51/arch/i386/kernel/apic.c 10 Dec 2002 12:46:46 -0000 1.1.1.1
+++ linux-2.5.51/arch/i386/kernel/apic.c 12 Dec 2002 17:08:26 -0000
@@ -33,6 +33,8 @@
 #include <asm/arch_hooks.h>
 #include "mach_apic.h"

+int x86_xapic;
+
 void __init apic_intr_init(void)
 {
 #ifdef CONFIG_SMP
Index: linux-2.5.51/arch/i386/kernel/io_apic.c
===================================================================
RCS file: /build/cvsroot/linux-2.5.51/arch/i386/kernel/io_apic.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 io_apic.c
--- linux-2.5.51/arch/i386/kernel/io_apic.c 10 Dec 2002 12:46:46 -0000 1.1.1.1
+++ linux-2.5.51/arch/i386/kernel/io_apic.c 12 Dec 2002 16:08:04 -0000
@@ -1147,7 +1147,7 @@

         if (clustered_apic_mode)
                 /* We don't have a good way to do this yet - hack */
- phys_id_present_map = (u_long) 0xf;
+ phys_id_present_map = (u_long) APIC_BROADCAST_ID;
         /*
          * Set the IOAPIC ID to the value stored in the MPC table.
          */
@@ -1177,10 +1177,10 @@
                                         mp_ioapics[apic].mpc_apicid)) {
                         printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n",
                                 apic, mp_ioapics[apic].mpc_apicid);
- for (i = 0; i < 0xf; i++)
+ for (i = 0; i < APIC_BROADCAST_ID; i++)
                                 if (!(phys_id_present_map & (1 << i)))
                                         break;
- if (i >= 0xf)
+ if (i >= APIC_BROADCAST_ID)
                                 panic("Max APIC ID exceeded!\n");
                         printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
                                 i);
Index: linux-2.5.51/arch/i386/kernel/mpparse.c
===================================================================
RCS file: /build/cvsroot/linux-2.5.51/arch/i386/kernel/mpparse.c,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 mpparse.c
--- linux-2.5.51/arch/i386/kernel/mpparse.c 10 Dec 2002 12:46:46 -0000 1.1.1.1
+++ linux-2.5.51/arch/i386/kernel/mpparse.c 12 Dec 2002 17:07:39 -0000
@@ -67,10 +67,9 @@
 /* Internal processor count */
 static unsigned int __initdata num_processors;

-/* Bitmask of physically existing CPUs */
+/* Bitmask of physically present CPUs and IOAPICs */
 unsigned long phys_cpu_present_map;

-int summit_x86 = 0;
 u8 raw_phys_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };

 /*
@@ -394,7 +393,7 @@
         str[12]=0;
         printk("Product ID: %s ",str);

- summit_check(oem, str);
+ smp_hardware_check(oem, str);

         printk("APIC at: 0x%lX\n",mpc->mpc_lapic);

Index: linux-2.5.51/arch/i386/mach-generic/mach_apic.h
===================================================================
RCS file: /build/cvsroot/linux-2.5.51/arch/i386/mach-generic/mach_apic.h,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 mach_apic.h
--- linux-2.5.51/arch/i386/mach-generic/mach_apic.h 10 Dec 2002 12:46:46 -0000 1.1.1.1
+++ linux-2.5.51/arch/i386/mach-generic/mach_apic.h 12 Dec 2002 03:49:07 -0000
@@ -17,11 +17,15 @@
  #define TARGET_CPUS 0x01
 #endif

-#define APIC_BROADCAST_ID 0x0F
 #define check_apicid_used(bitmap, apicid) (bitmap & (1 << apicid))

-static inline void summit_check(char *oem, char *productid)
+static inline void smp_hardware_check(char *oem, char *productid)
 {
+ unsigned long ver, reg = apic_read(APIC_LVR);
+
+ ver = GET_APIC_VERSION(reg);
+ if (ver == 0x14)
+ x86_xapic = 1;
 }

 static inline void clustered_apic_check(void)
Index: linux-2.5.51/arch/i386/mach-summit/mach_apic.h
===================================================================
RCS file: /build/cvsroot/linux-2.5.51/arch/i386/mach-summit/mach_apic.h,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 mach_apic.h
--- linux-2.5.51/arch/i386/mach-summit/mach_apic.h 10 Dec 2002 12:46:46 -0000 1.1.1.1
+++ linux-2.5.51/arch/i386/mach-summit/mach_apic.h 12 Dec 2002 03:49:20 -0000
@@ -1,8 +1,6 @@
 #ifndef __ASM_MACH_APIC_H
 #define __ASM_MACH_APIC_H

-extern int x86_summit;
-
 #define XAPIC_DEST_CPUS_MASK 0x0Fu
 #define XAPIC_DEST_CLUSTER_MASK 0xF0u

@@ -13,34 +11,33 @@
 {
         unsigned long id;

- if (x86_summit)
+ if (x86_xapic)
                 id = xapic_phys_to_log_apicid(hard_smp_processor_id());
         else
                 id = 1UL << smp_processor_id();
         return ((old & ~APIC_LDR_MASK) | SET_APIC_LOGICAL_ID(id));
 }

-#define APIC_DFR_VALUE (x86_summit ? APIC_DFR_CLUSTER : APIC_DFR_FLAT)
-#define TARGET_CPUS (x86_summit ? XAPIC_DEST_CPUS_MASK : cpu_online_map)
+#define APIC_DFR_VALUE (x86_xapic ? APIC_DFR_CLUSTER : APIC_DFR_FLAT)
+#define TARGET_CPUS (x86_xapic ? XAPIC_DEST_CPUS_MASK : cpu_online_map)

-#define APIC_BROADCAST_ID (x86_summit ? 0xFF : 0x0F)
 #define check_apicid_used(bitmap, apicid) (0)

-static inline void summit_check(char *oem, char *productid)
+static inline void smp_hardware_check(char *oem, char *productid)
 {
         if (!strncmp(oem, "IBM ENSW", 8) && !strncmp(str, "VIGIL SMP", 9))
- x86_summit = 1;
+ x86_xapic = 1;
 }

 static inline void clustered_apic_check(void)
 {
         printk("Enabling APIC mode: %s. Using %d I/O APICs\n",
- (x86_summit ? "Summit" : "Flat"), nr_ioapics);
+ (x86_xapic ? "Summit" : "Flat"), nr_ioapics);
 }

 static inline int cpu_present_to_apicid(int mps_cpu)
 {
- if (x86_summit)
+ if (x86_xapic)
                 return (int) raw_phys_apicid[mps_cpu];
         else
                 return mps_cpu;
@@ -48,7 +45,7 @@

 static inline unsigned long apicid_to_phys_cpu_present(int apicid)
 {
- if (x86_summit)
+ if (x86_xapic)
                 return (1ul << (((apicid >> 4) << 2) | (apicid & 0x3)));
         else
                 return (1ul << apicid);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Dec 15 2002 - 22:00:27 EST