lkml.org 
[lkml]   [2002]   [Dec]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH][2.5][RFC] Using xAPIC apic address space on !Summit
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/
\
 
 \ /
  Last update: 2005-03-22 13:31    [W:0.053 / U:0.616 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site