[PATCH] SMP parsing rewrite, phase 1

Andy Grover
2003-01-21T03:12:20Z

Hi all,

The below patch against 2.5.59 is also available from
ftp://ftp.kernel.org/pub/linux/kernel/people/grover/ ,
or bk pull http://linux-acpi.bkbits.net/linux-smp-init .

Before I spent any more time carving up mpparse.c, I just wanted to have
the chance for feedback from others.

This patch begins to draw a distinction between the structure of the MPS
table's items, and the kernel's internal data structures. Previously, it
made sense to just use MPS format throughout, but with the introduction of
a second method to enumerate CPUs, IOAPICs etc. on x86 (i.e. ACPI), this
really is no longer ideal. A clean, minimal interface for ACPI and MPS to
report discovered resources will cut down on cross-module dependencies,
shared global arrays, and will probably even reduce the kernel image
somewhat.

See below for more detail, but to sum up, I:
1) Renamed MPS-specific structs starting with "mpc_" to "mps_", to reflect
their actual purpose.
2) Do the same thing for variables.
3) Created arch/i386/kernel/smpenum.c, for the enum-method-neutral APIs.
To begin with, I have only implemented the new interface to replace
MP_processor_info - the others will be done in a similar manner.
4) An unrelated ACPI init changeset sneaked in, sorry :)

It's been tested on my machine in ACPI and MPS mode - obviously some more
testing coverage would be nice.

Comments?

Thanks -- Regards -- Andy

The following files are affected:

arch/i386/kernel/Makefile | 2
arch/i386/kernel/acpi.c | 9
arch/i386/kernel/apic.c | 12
arch/i386/kernel/mpparse.c | 274 +++------------
arch/i386/kernel/setup.c | 20 -
arch/i386/kernel/smpboot.c | 4
arch/i386/kernel/smpenum.c | 124 +++++-
drivers/acpi/tables.c | 3
include/asm-i386/io_apic.h | 4
include/asm-i386/mach-default/mach_apic.h | 11
include/asm-i386/mach-default/mach_mpparse.h | 8
include/asm-i386/mach-numaq/mach_apic.h | 4
include/asm-i386/mach-numaq/mach_mpparse.h | 8
include/asm-i386/mach-summit/mach_apic.h | 4
include/asm-i386/mach-summit/mach_mpparse.h | 8
include/asm-i386/mpspec.h | 20 -
include/asm-i386/smp.h | 1
include/asm-i386/smpenum.h | 220 +++++++++++-
include/linux/acpi.h | 4
19 files changed, 440 insertions(+), 300 deletions(-)

through these ChangeSets:

<agrover-qb8aLOKklSjp4P8CbLYnNQ@public.gmane.org> (03/01/15 1.914.1.28)
[smpenum] Fixes for numaq and summit

<agrover-qb8aLOKklSjp4P8CbLYnNQ@public.gmane.org> (03/01/15 1.879.92.5)
[smpenum] Replace MP_processor_info with a non-MPS-specific equivalent

Remove now-obsolete MP_processor_info function from mpparse.c
Rename mps_read_mpc -> mps_parse_table
Remove unneeded includes in smpenum.c
Bring over more variables from mpparse.c
Implement smp_processor_register(). This function takes the place of
MP_processor_info, but does not use MPS data structures.
Change mpc_apic_id's printk to account for the removal of
nonessential items from struct mpc_config_processor.
Add include of smpenum.h in smp.h
Remove nonessential fields from mpc_config_processor

<agrover-qb8aLOKklSjp4P8CbLYnNQ@public.gmane.org> (03/01/14 1.879.92.4)
[smpenum] structs beginning with "mpc_" are actually MPS-specific.
Rename
structs to "mps_" to facilitate the creation of different "mpc_" struct
definitions.

Create smpenum.[ch], where all the enumeration-method-neutral code will
go, and start moving some arrays there, for now.

<agrover-qb8aLOKklSjp4P8CbLYnNQ@public.gmane.org> (03/01/14 1.879.92.3)
[mpparse] more smp -> mps renames

<agrover-qb8aLOKklSjp4P8CbLYnNQ@public.gmane.org> (03/01/14 1.879.92.2)
[mpparse] Rename smp* things in mpparse.c that are actually
MPS-specific (not SMP-specific) to mps*, including get_mps_config and
found_mps_config.

<agrover-qb8aLOKklSjp4P8CbLYnNQ@public.gmane.org> (03/01/14 1.838.62.2)
[mpparse] "smp" should only be used in non-ACPI or non-MPS-specific
code. so, start to make that distinction clear

<agrover-qb8aLOKklSjp4P8CbLYnNQ@public.gmane.org> (02/12/17 1.838.62.1)
ACPI: Boot functions don't use cmdline, so don't pass it

diff -Naur -X /root/bin/dontdiff a/arch/i386/kernel/acpi.c b/arch/i386/kernel/acpi.c
--- a/arch/i386/kernel/acpi.c 2003-01-20 11:04:44.000000000 -0800
+++ b/arch/i386/kernel/acpi.c 2003-01-20 11:12:00.000000000 -0800
@@ -34,7 +34,7 @@
#include <linux/bootmem.h>
#include <linux/irq.h>
#include <linux/acpi.h>
-#include <asm/mpspec.h>
+#include <asm/smp.h>
#include <asm/io.h>
#include <asm/apic.h>
#include <asm/apicdef.h>
@@ -303,8 +303,7 @@

int __init
-acpi_boot_init (
- char *cmdline)
+acpi_boot_init (void)
{
int result = 0;

@@ -317,7 +316,7 @@
/*
* Initialize the ACPI boot-time table parser.
*/
- result = acpi_table_init(cmdline);
+ result = acpi_table_init();
if (result)
return result;

@@ -435,7 +434,7 @@

#ifdef CONFIG_X86_LOCAL_APIC
if (acpi_lapic && acpi_ioapic) {
- smp_found_config = 1;
+ mps_found_config = 1;
clustered_apic_check();
}
#endif
diff -Naur -X /root/bin/dontdiff a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c
--- a/arch/i386/kernel/apic.c 2003-01-20 11:05:11.000000000 -0800
+++ b/arch/i386/kernel/apic.c 2003-01-20 11:12:56.000000000 -0800
@@ -258,7 +258,7 @@
* Don't do the setup now if we have a SMP BIOS as the
* through-I/O-APIC virtual wire mode might be active.
*/
- if (smp_found_config || !cpu_has_apic)
+ if (mps_found_config || !cpu_has_apic)
return;

value = apic_read(APIC_LVR);
@@ -677,7 +677,7 @@
* zeroes page to simulate the local APIC and another
* one for the IO-APIC.
*/
- if (!smp_found_config && detect_init_APIC()) {
+ if (!mps_found_config && detect_init_APIC()) {
apic_phys = (unsigned long) alloc_bootmem_pages(PAGE_SIZE);
apic_phys = __pa(apic_phys);
} else
@@ -699,12 +699,12 @@
int i;

for (i = 0; i < nr_ioapics; i++) {
- if (smp_found_config) {
+ if (mps_found_config) {
ioapic_phys = mp_ioapics[i].mpc_apicaddr;
if (!ioapic_phys) {
printk(KERN_ERR "WARNING: bogus zero IO-APIC address found in MPTABLE, disabling IO/APIC support!\n");

- smp_found_config = 0;
+ mps_found_config = 0;
skip_ioapic_setup = 1;
goto fake_ioapic_page;
}
@@ -1122,7 +1122,7 @@
*/
int __init APIC_init_uniprocessor (void)
{
- if (!smp_found_config && !cpu_has_apic)
+ if (!mps_found_config && !cpu_has_apic)
return -1;

/*
@@ -1148,7 +1148,7 @@
if (nmi_watchdog == NMI_LOCAL_APIC)
check_nmi_watchdog();
#ifdef CONFIG_X86_IO_APIC
- if (smp_found_config)
+ if (mps_found_config)
if (!skip_ioapic_setup && nr_ioapics)
setup_IO_APIC();
#endif
diff -Naur -X /root/bin/dontdiff a/arch/i386/kernel/Makefile b/arch/i386/kernel/Makefile
--- a/arch/i386/kernel/Makefile 2003-01-20 11:02:41.000000000 -0800
+++ b/arch/i386/kernel/Makefile 2003-01-20 11:10:25.000000000 -0800
@@ -20,7 +20,7 @@
obj-$(CONFIG_APM) += apm.o
obj-$(CONFIG_ACPI) += acpi.o
obj-$(CONFIG_ACPI_SLEEP) += acpi_wakeup.o
-obj-$(CONFIG_X86_SMP) += smp.o smpboot.o
+obj-$(CONFIG_X86_SMP) += smp.o smpboot.o smpenum.o
obj-$(CONFIG_X86_TRAMPOLINE) += trampoline.o
obj-$(CONFIG_X86_MPPARSE) += mpparse.o
obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o
diff -Naur -X /root/bin/dontdiff a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c
--- a/arch/i386/kernel/mpparse.c 2003-01-20 11:03:00.000000000 -0800
+++ b/arch/i386/kernel/mpparse.c 2003-01-20 11:10:29.000000000 -0800
@@ -28,6 +28,7 @@
#include <asm/acpi.h>
#include <asm/mtrr.h>
#include <asm/mpspec.h>
+#include <asm/smpenum.h>
#include <asm/pgalloc.h>
#include <asm/io_apic.h>

@@ -35,13 +36,12 @@
#include <mach_mpparse.h>

/* Have we found an MP table */
-int smp_found_config;
+int mps_found_config;

/*
* Various Linux-internal data structures created from the
* MP-table.
*/
-int apic_version [MAX_APICS];
int mp_bus_id_to_type [MAX_MP_BUSSES];
int mp_bus_id_to_node [MAX_MP_BUSSES];
int mp_bus_id_to_local [MAX_MP_BUSSES];
@@ -49,36 +49,12 @@
int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
int mp_current_pci_id;

-/* I/O APIC entries */
-struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS];
-
-/* # of MP IRQ source entries */
-struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
-
/* MP IRQ source entries */
int mp_irq_entries;

int nr_ioapics;

int pic_mode;
-unsigned long mp_lapic_addr;
-
-/* Processor that is doing the boot up */
-unsigned int boot_cpu_physical_apicid = -1U;
-unsigned int boot_cpu_logical_apicid = -1U;
-/* Internal processor count */
-static unsigned int __initdata num_processors;
-
-/* Bitmask of physically existing CPUs */
-unsigned long phys_cpu_present_map;
-
-int x86_summit = 0;
-u8 bios_cpu_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
-
-/*
- * Intel MP BIOS table parsing routines:
- */
-

/*
* Checksum an MP configuration block.
@@ -94,116 +70,24 @@
return sum & 0xFF;
}

-/*
- * Have to match translation table entries to main table entries by counter
- * hence the mpc_record variable .... can't see a less disgusting way of
- * doing this ....
- */
-
-static int mpc_record;
-static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __initdata;
-
-void __init MP_processor_info (struct mpc_config_processor *m)
-{
- int ver, apicid;
-
- if (!(m->mpc_cpuflag & CPU_ENABLED))
- return;
-
- apicid = mpc_apic_id(m, translation_table[mpc_record]->trans_quad);
-
- if (m->mpc_featureflag&(1<<0))
- Dprintk(" Floating point unit present.\n");
- if (m->mpc_featureflag&(1<<7))
- Dprintk(" Machine Exception supported.\n");
- if (m->mpc_featureflag&(1<<8))
- Dprintk(" 64 bit compare & exchange supported.\n");
- if (m->mpc_featureflag&(1<<9))
- Dprintk(" Internal APIC present.\n");
- if (m->mpc_featureflag&(1<<11))
- Dprintk(" SEP present.\n");
- if (m->mpc_featureflag&(1<<12))
- Dprintk(" MTRR present.\n");
- if (m->mpc_featureflag&(1<<13))
- Dprintk(" PGE present.\n");
- if (m->mpc_featureflag&(1<<14))
- Dprintk(" MCA present.\n");
- if (m->mpc_featureflag&(1<<15))
- Dprintk(" CMOV present.\n");
- if (m->mpc_featureflag&(1<<16))
- Dprintk(" PAT present.\n");
- if (m->mpc_featureflag&(1<<17))
- Dprintk(" PSE present.\n");
- if (m->mpc_featureflag&(1<<18))
- Dprintk(" PSN present.\n");
- if (m->mpc_featureflag&(1<<19))
- Dprintk(" Cache Line Flush Instruction present.\n");
- /* 20 Reserved */
- if (m->mpc_featureflag&(1<<21))
- Dprintk(" Debug Trace and EMON Store present.\n");
- if (m->mpc_featureflag&(1<<22))
- Dprintk(" ACPI Thermal Throttle Registers present.\n");
- if (m->mpc_featureflag&(1<<23))
- Dprintk(" MMX present.\n");
- if (m->mpc_featureflag&(1<<24))
- Dprintk(" FXSR present.\n");
- if (m->mpc_featureflag&(1<<25))
- Dprintk(" XMM present.\n");
- if (m->mpc_featureflag&(1<<26))
- Dprintk(" Willamette New Instructions present.\n");
- if (m->mpc_featureflag&(1<<27))
- Dprintk(" Self Snoop present.\n");
- if (m->mpc_featureflag&(1<<28))
- Dprintk(" HT present.\n");
- if (m->mpc_featureflag&(1<<29))
- Dprintk(" Thermal Monitor present.\n");
- /* 30, 31 Reserved */
-
-
- if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
- Dprintk(" Bootup CPU\n");
- boot_cpu_physical_apicid = m->mpc_apicid;
- boot_cpu_logical_apicid = apicid;
- }
-
- num_processors++;
-
- if (m->mpc_apicid > MAX_APICS) {
- printk("Processor #%d INVALID. (Max ID: %d).\n",
- m->mpc_apicid, MAX_APICS);
- --num_processors;
- return;
- }
- ver = m->mpc_apicver;
-
- phys_cpu_present_map |= apicid_to_cpu_present(apicid);
-
- /*
- * Validate version
- */
- if (ver == 0x0) {
- printk("BIOS bug, APIC version is 0 for CPU#%d! fixing up to 0x10. (tell your hw vendor)\n", m->mpc_apicid);
- ver = 0x10;
- }
- apic_version[m->mpc_apicid] = ver;
- bios_cpu_apicid[num_processors - 1] = m->mpc_apicid;
-}
+extern int mps_record;
+extern struct mps_config_translation *translation_table[MAX_MPC_ENTRY];

-static void __init MP_bus_info (struct mpc_config_bus *m)
+static void __init MP_bus_info (struct mps_config_bus *m)
{
char str[7];

memcpy(str, m->mpc_bustype, 6);
str[6] = 0;

- mpc_oem_bus_info(m, str, translation_table[mpc_record]);
+ mpc_oem_bus_info(m, str, translation_table[mps_record]);

if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA)-1) == 0) {
mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA;
} else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA)-1) == 0) {
mp_bus_id_to_type[m->mpc_busid] = MP_BUS_EISA;
} else if (strncmp(str, BUSTYPE_PCI, sizeof(BUSTYPE_PCI)-1) == 0) {
- mpc_oem_pci_bus(m, translation_table[mpc_record]);
+ mpc_oem_pci_bus(m, translation_table[mps_record]);
mp_bus_id_to_type[m->mpc_busid] = MP_BUS_PCI;
mp_bus_id_to_pci_bus[m->mpc_busid] = mp_current_pci_id;
mp_current_pci_id++;
@@ -214,7 +98,7 @@
}
}

-static void __init MP_ioapic_info (struct mpc_config_ioapic *m)
+static void __init MP_ioapic_info (struct mps_config_ioapic *m)
{
if (!(m->mpc_flags & MPC_APIC_USABLE))
return;
@@ -235,7 +119,7 @@
nr_ioapics++;
}

-static void __init MP_intsrc_info (struct mpc_config_intsrc *m)
+static void __init MP_intsrc_info (struct mps_config_intsrc *m)
{
mp_irqs [mp_irq_entries] = *m;
Dprintk("Int: type %d, pol %d, trig %d, bus %d,"
@@ -247,7 +131,7 @@
panic("Max # of irq sources exceeded!!\n");
}

-static void __init MP_lintsrc_info (struct mpc_config_lintsrc *m)
+static void __init MP_lintsrc_info (struct mps_config_lintsrc *m)
{
Dprintk("Lint: type %d, pol %d, trig %d, bus %d,"
" IRQ %02x, APIC ID %x, APIC LINT %02x\n",
@@ -270,14 +154,14 @@
}

#ifdef CONFIG_X86_NUMAQ
-static void __init MP_translation_info (struct mpc_config_translation *m)
+static void __init MP_translation_info (struct mps_config_translation *m)
{
- printk("Translation: record %d, type %d, quad %d, global %d, local %d\n", mpc_record, m->trans_type, m->trans_quad, m->trans_global, m->trans_local);
+ printk("Translation: record %d, type %d, quad %d, global %d, local %d\n", mps_record, m->trans_type, m->trans_quad, m->trans_global, m->trans_local);

- if (mpc_record >= MAX_MPC_ENTRY)
+ if (mps_record >= MAX_MPC_ENTRY)
printk("MAX_MPC_ENTRY exceeded!\n");
else
- translation_table[mpc_record] = m; /* stash this for later */
+ translation_table[mps_record] = m; /* stash this for later */
if (m->trans_quad+1 > numnodes)
numnodes = m->trans_quad+1;
}
@@ -286,13 +170,13 @@
* Read/parse the MPC oem tables
*/

-static void __init smp_read_mpc_oem(struct mp_config_oemtable *oemtable, \
+static void __init mps_read_mpc_oem(struct mp_config_oemtable *oemtable, \
unsigned short oemsize)
{
int count = sizeof (*oemtable); /* the header size */
unsigned char *oemptr = ((unsigned char *)oemtable)+count;

- mpc_record = 0;
+ mps_record = 0;
printk("Found an OEM MPC table at %8p - parsing it ... \n", oemtable);
if (memcmp(oemtable->oem_signature,MPC_OEM_SIGNATURE,4))
{
@@ -312,12 +196,12 @@
switch (*oemptr) {
case MP_TRANSLATION:
{
- struct mpc_config_translation *m=
- (struct mpc_config_translation *)oemptr;
+ struct mps_config_translation *m=
+ (struct mps_config_translation *)oemptr;
MP_translation_info(m);
oemptr += sizeof(*m);
count += sizeof(*m);
- ++mpc_record;
+ ++mps_record;
break;
}
default:
@@ -334,12 +218,13 @@
* Read/parse the MPC
*/

-static int __init smp_read_mpc(struct mp_config_table *mpc)
+static int __init mps_parse_table(struct mp_config_table *mpc)
{
char str[16];
char oem[10];
int count=sizeof(*mpc);
unsigned char *mpt=((unsigned char *)mpc)+count;
+ int found_processor = 0;

if (memcmp(mpc->mpc_signature,MPC_SIGNATURE,4)) {
panic("SMP mptable: bad signature [%c%c%c%c]!\n",
@@ -384,24 +269,28 @@
/*
* Now process the configuration blocks.
*/
- mpc_record = 0;
+ mps_record = 0;
while (count < mpc->mpc_length) {
switch(*mpt) {
case MP_PROCESSOR:
{
- struct mpc_config_processor *m=
- (struct mpc_config_processor *)mpt;
- /* ACPI may have already provided this data */
- if (!acpi_lapic)
- MP_processor_info(m);
+ struct mps_config_processor *m=
+ (struct mps_config_processor *)mpt;
+ struct mpc_config_processor cpu;
+
+ cpu.mpc_apicid = m->mpc_apicid;
+ cpu.mpc_apicver = m->mpc_apicver;
+ smp_processor_register(&cpu);
+ found_processor++;
+
mpt += sizeof(*m);
count += sizeof(*m);
break;
}
case MP_BUS:
{
- struct mpc_config_bus *m=
- (struct mpc_config_bus *)mpt;
+ struct mps_config_bus *m=
+ (struct mps_config_bus *)mpt;
MP_bus_info(m);
mpt += sizeof(*m);
count += sizeof(*m);
@@ -409,8 +298,8 @@
}
case MP_IOAPIC:
{
- struct mpc_config_ioapic *m=
- (struct mpc_config_ioapic *)mpt;
+ struct mps_config_ioapic *m=
+ (struct mps_config_ioapic *)mpt;
MP_ioapic_info(m);
mpt+=sizeof(*m);
count+=sizeof(*m);
@@ -418,8 +307,8 @@
}
case MP_INTSRC:
{
- struct mpc_config_intsrc *m=
- (struct mpc_config_intsrc *)mpt;
+ struct mps_config_intsrc *m=
+ (struct mps_config_intsrc *)mpt;

MP_intsrc_info(m);
mpt+=sizeof(*m);
@@ -428,8 +317,8 @@
}
case MP_LINTSRC:
{
- struct mpc_config_lintsrc *m=
- (struct mpc_config_lintsrc *)mpt;
+ struct mps_config_lintsrc *m=
+ (struct mps_config_lintsrc *)mpt;
MP_lintsrc_info(m);
mpt+=sizeof(*m);
count+=sizeof(*m);
@@ -441,12 +330,12 @@
break;
}
}
- ++mpc_record;
+ ++mps_record;
}
clustered_apic_check();
- if (!num_processors)
+ if (!found_processor)
printk(KERN_ERR "SMP mptable: no processors registered!\n");
- return num_processors;
+ return found_processor;
}

static int __init ELCR_trigger(unsigned int irq)
@@ -459,7 +348,7 @@

static void __init construct_default_ioirq_mptable(int mpc_default_type)
{
- struct mpc_config_intsrc intsrc;
+ struct mps_config_intsrc intsrc;
int i;
int ELCR_fallback = 0;

@@ -526,9 +415,9 @@
static inline void __init construct_default_ISA_mptable(int mpc_default_type)
{
struct mpc_config_processor processor;
- struct mpc_config_bus bus;
- struct mpc_config_ioapic ioapic;
- struct mpc_config_lintsrc lintsrc;
+ struct mps_config_bus bus;
+ struct mps_config_ioapic ioapic;
+ struct mps_config_lintsrc lintsrc;
int linttypes[2] = { mp_ExtINT, mp_NMI };
int i;

@@ -540,19 +429,12 @@
/*
* 2 CPUs, numbered 0 & 1.
*/
- processor.mpc_type = MP_PROCESSOR;
/* Either an integrated APIC or a discrete 82489DX. */
processor.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
- processor.mpc_cpuflag = CPU_ENABLED;
- processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) |
- (boot_cpu_data.x86_model << 4) |
- boot_cpu_data.x86_mask;
- processor.mpc_featureflag = boot_cpu_data.x86_capability[0];
- processor.mpc_reserved[0] = 0;
- processor.mpc_reserved[1] = 0;
for (i = 0; i < 2; i++) {
processor.mpc_apicid = i;
- MP_processor_info(&processor);
+ processor.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
+ smp_processor_register(&processor);
}

bus.mpc_type = MP_BUS;
@@ -611,7 +493,7 @@
/*
* Scan the memory blocks for an SMP configuration block.
*/
-void __init get_smp_config (void)
+void __init get_mps_config (void)
{
struct intel_mp_floating *mpf = mpf_found;

@@ -651,8 +533,8 @@
* Read the physical hardware table. Anything here will
* override the defaults.
*/
- if (!smp_read_mpc((void *)mpf->mpf_physptr)) {
- smp_found_config = 0;
+ if (!mps_parse_table((void *)mpf->mpf_physptr)) {
+ mps_found_config = 0;
printk(KERN_ERR "BIOS bug, MP table errors detected!...\n");
printk(KERN_ERR "... disabling SMP support. (tell your hw vendor)\n");
return;
@@ -663,7 +545,7 @@
* ISA defaults and hope it will work.
*/
if (!mp_irq_entries) {
- struct mpc_config_bus bus;
+ struct mps_config_bus bus;

printk("BIOS bug, no explicit IRQ entries, using default mptable. (tell your hw vendor)\n");

@@ -678,13 +560,12 @@
} else
BUG();

- printk("Processors: %d\n", num_processors);
/*
* Only use the first configuration found.
*/
}

-static int __init smp_scan_config (unsigned long base, unsigned long length)
+static int __init mps_scan_config (unsigned long base, unsigned long length)
{
unsigned long *bp = phys_to_virt(base);
struct intel_mp_floating *mpf;
@@ -701,7 +582,7 @@
((mpf->mpf_specification == 1)
|| (mpf->mpf_specification == 4)) ) {

- smp_found_config = 1;
+ mps_found_config = 1;
printk("found SMP MP-table at %08lx\n",
virt_to_phys(mpf));
reserve_bootmem(virt_to_phys(mpf), PAGE_SIZE);
@@ -716,7 +597,7 @@
return 0;
}

-void __init find_smp_config (void)
+void __init find_mps_config (void)
{
unsigned int address;

@@ -728,9 +609,9 @@
* 2) Scan the top 1K of base RAM
* 3) Scan the 64K of bios
*/
- if (smp_scan_config(0x0,0x400) ||
- smp_scan_config(639*0x400,0x400) ||
- smp_scan_config(0xF0000,0x10000))
+ if (mps_scan_config(0x0,0x400) ||
+ mps_scan_config(639*0x400,0x400) ||
+ mps_scan_config(0xF0000,0x10000))
return;
/*
* If it is an SMP machine we should know now, unless the
@@ -751,8 +632,8 @@

address = *(unsigned short *)phys_to_virt(0x40E);
address <<= 4;
- smp_scan_config(address, 0x400);
- if (smp_found_config)
+ mps_scan_config(address, 0x400);
+ if (mps_found_config)
printk(KERN_WARNING "WARNING: MP table in the EBDA can be UNSAFE, contact linux-smp-u79uwXL29TY76Z2rM5mHXA@public.gmane.org if you experience SMP problems!\n");
}

@@ -782,7 +663,6 @@
u8 enabled)
{
struct mpc_config_processor processor;
- int boot_cpu = 0;

if (id >= MAX_APICS) {
printk(KERN_WARNING "Processor #%d invalid (max %d)\n",
@@ -790,21 +670,9 @@
return;
}

- if (id == boot_cpu_physical_apicid)
- boot_cpu = 1;
-
- processor.mpc_type = MP_PROCESSOR;
processor.mpc_apicid = id;
processor.mpc_apicver = 0x10; /* TBD: lapic version */
- processor.mpc_cpuflag = (enabled ? CPU_ENABLED : 0);
- processor.mpc_cpuflag |= (boot_cpu ? CPU_BOOTPROCESSOR : 0);
- processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) |
- (boot_cpu_data.x86_model << 4) | boot_cpu_data.x86_mask;
- processor.mpc_featureflag = boot_cpu_data.x86_capability[0];
- processor.mpc_reserved[0] = 0;
- processor.mpc_reserved[1] = 0;
-
- MP_processor_info(&processor);
+ smp_processor_register(&processor);
}

#ifdef CONFIG_X86_IO_APIC
@@ -891,7 +759,7 @@
u8 trigger,
u32 global_irq)
{
- struct mpc_config_intsrc intsrc;
+ struct mps_config_intsrc intsrc;
int i = 0;
int found = 0;
int ioapic = -1;
@@ -950,7 +818,7 @@

void __init mp_config_acpi_legacy_irqs (void)
{
- struct mpc_config_intsrc intsrc;
+ struct mps_config_intsrc intsrc;
int i = 0;
int ioapic = -1;

diff -Naur -X /root/bin/dontdiff a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c
--- a/arch/i386/kernel/setup.c 2003-01-20 11:03:39.000000000 -0800
+++ b/arch/i386/kernel/setup.c 2003-01-20 11:10:36.000000000 -0800
@@ -762,12 +762,6 @@
*/
acpi_reserve_bootmem();
#endif
-#ifdef CONFIG_X86_FIND_SMP_CONFIG
- /*
- * Find and reserve possible boot-time SMP configuration:
- */
- find_smp_config();
-#endif

#ifdef CONFIG_BLK_DEV_INITRD
if (LOADER_TYPE && INITRD_START) {
@@ -895,16 +889,24 @@
smp_alloc_memory(); /* AP processor realmode stacks in low memory*/
#endif
paging_init();
+
+#ifdef CONFIG_X86_FIND_SMP_CONFIG
+ /*
+ * Find and reserve possible boot-time SMP configuration:
+ */
+ find_mps_config();
+#endif
#ifdef CONFIG_ACPI_BOOT
/*
* Parse the ACPI tables for possible boot-time SMP configuration.
*/
if (!acpi_disabled)
- acpi_boot_init(*cmdline_p);
+ acpi_boot_init();
#endif
+
#ifdef CONFIG_X86_LOCAL_APIC
- if (smp_found_config)
- get_smp_config();
+ if (mps_found_config)
+ get_mps_config();
#endif

register_memory(max_low_pfn);
diff -Naur -X /root/bin/dontdiff a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c
--- a/arch/i386/kernel/smpboot.c 2003-01-20 11:03:39.000000000 -0800
+++ b/arch/i386/kernel/smpboot.c 2003-01-20 11:10:36.000000000 -0800
@@ -976,7 +976,7 @@
* If we couldnt find an SMP configuration at boot time,
* get out of here now!
*/
- if (!smp_found_config) {
+ if (!mps_found_config) {
printk(KERN_NOTICE "SMP motherboard not detected.\n");
smpboot_clear_io_apic_irqs();
phys_cpu_present_map = 1;
@@ -1015,7 +1015,7 @@
* If SMP should be disabled, then really disable it!
*/
if (!max_cpus) {
- smp_found_config = 0;
+ mps_found_config = 0;
printk(KERN_INFO "SMP mode deactivated, forcing use of dummy APIC emulation.\n");
smpboot_clear_io_apic_irqs();
phys_cpu_present_map = 1;
diff -Naur -X /root/bin/dontdiff a/arch/i386/kernel/smpenum.c b/arch/i386/kernel/smpenum.c
--- a/arch/i386/kernel/smpenum.c 1969-12-31 16:00:00.000000000 -0800
+++ b/arch/i386/kernel/smpenum.c 2003-01-20 11:11:52.000000000 -0800
@@ -0,0 +1,92 @@
+/*
+ * Generic SMP enumeration code
+ *
+ * (c) 2003 Andrew Grover <andrew.grover-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
+ *
+ */
+
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <asm/io.h>
+#include <asm/smp.h>
+#include <asm/mpspec.h>
+
+#include <mach_apic.h>
+#include <mach_mpparse.h>
+
+/* ---------- EXPORTED VARS ---------- */
+/*
+ * Various Linux-internal data structures created from the
+ * MP-table.
+ */
+int apic_version [MAX_APICS];
+
+/* Processor that is doing the boot up */
+unsigned int boot_cpu_physical_apicid = -1U;
+
+/* Bitmask of physically existing CPUs */
+unsigned long phys_cpu_present_map;
+
+/* I/O APIC entries */
+struct mps_config_ioapic mp_ioapics[MAX_IO_APICS];
+
+/* # of MP IRQ source entries */
+struct mps_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
+
+unsigned long mp_lapic_addr;
+
+/* ---------- STATIC VARS ---------- */
+
+static u8 raw_phys_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
+
+/*
+ * Have to match translation table entries to main table entries by counter
+ * hence the mps_record variable .... can't see a less disgusting way of
+ * doing this ....
+ */
+/* N.B. This is here temporarily until we can come up with a good way to put it in
+ a numa-only .c file - ASG */
+
+int mps_record;
+struct mps_config_translation *translation_table[MAX_MPC_ENTRY] __initdata;
+
+/* -- CODE -- */
+
+void __init smp_processor_register (struct mpc_config_processor *m)
+{
+ int ver, apicid;
+ static unsigned int num_processors;
+
+ apicid = mpc_apic_id(m, translation_table[mps_record]->trans_quad);
+
+ /* I don't think this is needed, because apic.c sets
+ boot_cpu_physical_apicid by reading it */
+ /*if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
+ Dprintk(" Bootup CPU\n");
+ boot_cpu_physical_apicid = m->mpc_apicid;
+ }*/
+
+ num_processors++;
+
+ if (m->mpc_apicid > MAX_APICS) {
+ printk("Processor #%d INVALID. (Max ID: %d).\n",
+ m->mpc_apicid, MAX_APICS);
+ --num_processors;
+ return;
+ }
+ ver = m->mpc_apicver;
+
+ phys_cpu_present_map |= apicid_to_cpu_present(apicid);
+
+ /*
+ * Validate version
+ */
+ if (ver == 0x0) {
+ printk("BIOS bug, APIC version is 0 for CPU#%d! fixing up to 0x10. (tell your hw vendor)\n", m->mpc_apicid);
+ ver = 0x10;
+ }
+ apic_version[m->mpc_apicid] = ver;
+ raw_phys_apicid[num_processors - 1] = m->mpc_apicid;
+ Dprintk("Processor %d found, apicid %d\n", num_processors, apicid);
+}
+
diff -Naur -X /root/bin/dontdiff a/drivers/acpi/tables.c b/drivers/acpi/tables.c
--- a/drivers/acpi/tables.c 2003-01-20 11:03:13.000000000 -0800
+++ b/drivers/acpi/tables.c 2003-01-20 11:10:32.000000000 -0800
@@ -509,8 +509,7 @@

int __init
-acpi_table_init (
- char *cmdline)
+acpi_table_init (void)
{
struct acpi_table_rsdp *rsdp = NULL;
unsigned long rsdp_phys = 0;
diff -Naur -X /root/bin/dontdiff a/include/asm-i386/io_apic.h b/include/asm-i386/io_apic.h
--- a/include/asm-i386/io_apic.h 2003-01-20 11:04:09.000000000 -0800
+++ b/include/asm-i386/io_apic.h 2003-01-20 11:10:42.000000000 -0800
@@ -95,13 +95,13 @@
*/

/* I/O APIC entries */
-extern struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS];
+extern struct mps_config_ioapic mp_ioapics[MAX_IO_APICS];

/* # of MP IRQ source entries */
extern int mp_irq_entries;

/* MP IRQ source entries */
-extern struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
+extern struct mps_config_intsrc mp_irqs[MAX_IRQ_SOURCES];

/* non-0 if default (table-less) MP configuration */
extern int mpc_default_type;
diff -Naur -X /root/bin/dontdiff a/include/asm-i386/mach-default/mach_apic.h b/include/asm-i386/mach-default/mach_apic.h
--- a/include/asm-i386/mach-default/mach_apic.h 2003-01-20 11:05:11.000000000 -0800
+++ b/include/asm-i386/mach-default/mach_apic.h 2003-01-20 11:12:56.000000000 -0800
@@ -81,11 +81,8 @@

static inline int mpc_apic_id(struct mpc_config_processor *m, int quad)
{
- printk("Processor #%d %ld:%ld APIC version %d\n",
- m->mpc_apicid,
- (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
- (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
- m->mpc_apicver);
+ printk("Processor #%d APIC version %d\n",
+ m->mpc_apicid, m->mpc_apicver);
return (m->mpc_apicid);
}

diff -Naur -X /root/bin/dontdiff a/include/asm-i386/mach-default/mach_mpparse.h b/include/asm-i386/mach-default/mach_mpparse.h
--- a/include/asm-i386/mach-default/mach_mpparse.h 2003-01-20 11:04:42.000000000 -0800
+++ b/include/asm-i386/mach-default/mach_mpparse.h 2003-01-20 11:11:56.000000000 -0800
@@ -1,14 +1,14 @@
#ifndef __ASM_MACH_MPPARSE_H
#define __ASM_MACH_MPPARSE_H

-static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
- struct mpc_config_translation *translation)
+static inline void mpc_oem_bus_info(struct mps_config_bus *m, char *name,
+ struct mps_config_translation *translation)
{
Dprintk("Bus #%d is %s\n", m->mpc_busid, name);
}

-static inline void mpc_oem_pci_bus(struct mpc_config_bus *m,
- struct mpc_config_translation *translation)
+static inline void mpc_oem_pci_bus(struct mps_config_bus *m,
+ struct mps_config_translation *translation)
{
}

diff -Naur -X /root/bin/dontdiff a/include/asm-i386/mach-numaq/mach_apic.h b/include/asm-i386/mach-numaq/mach_apic.h
--- a/include/asm-i386/mach-numaq/mach_apic.h 2003-01-20 11:03:27.000000000 -0800
+++ b/include/asm-i386/mach-numaq/mach_apic.h 2003-01-20 11:10:34.000000000 -0800
@@ -77,10 +77,8 @@
{
int logical_apicid = generate_logical_apicid(quad, m->mpc_apicid);

- printk("Processor #%d %ld:%ld APIC version %d (quad %d, apic %d)\n",
+ printk("Processor #%d APIC version %d (quad %d, apic %d)\n",
m->mpc_apicid,
- (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
- (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
m->mpc_apicver, quad, logical_apicid);
return logical_apicid;
}
diff -Naur -X /root/bin/dontdiff a/include/asm-i386/mach-numaq/mach_mpparse.h b/include/asm-i386/mach-numaq/mach_mpparse.h
--- a/include/asm-i386/mach-numaq/mach_mpparse.h 2003-01-20 11:03:03.000000000 -0800
+++ b/include/asm-i386/mach-numaq/mach_mpparse.h 2003-01-20 11:10:30.000000000 -0800
@@ -4,8 +4,8 @@
static void __init smp_read_mpc_oem(struct mp_config_oemtable *oemtable,
unsigned short oemsize);

-static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
- struct mpc_config_translation *translation)
+static inline void mpc_oem_bus_info(struct mps_config_bus *m, char *name,
+ struct mps_config_translation *translation)
{
int quad = translation->trans_quad;
int local = translation->trans_local;
@@ -15,8 +15,8 @@
printk("Bus #%d is %s (node %d)\n", m->mpc_busid, name, quad);
}

-static inline void mpc_oem_pci_bus(struct mpc_config_bus *m,
- struct mpc_config_translation *translation)
+static inline void mpc_oem_pci_bus(struct mps_config_bus *m,
+ struct mps_config_translation *translation)
{
int quad = translation->trans_quad;
int local = translation->trans_local;
diff -Naur -X /root/bin/dontdiff a/include/asm-i386/mach-summit/mach_apic.h b/include/asm-i386/mach-summit/mach_apic.h
--- a/include/asm-i386/mach-summit/mach_apic.h 2003-01-20 11:04:07.000000000 -0800
+++ b/include/asm-i386/mach-summit/mach_apic.h 2003-01-20 11:10:41.000000000 -0800
@@ -92,10 +92,8 @@

static inline int mpc_apic_id(struct mpc_config_processor *m, int quad)
{
- printk("Processor #%d %ld:%ld APIC version %d\n",
+ printk("Processor #%d APIC version %d\n",
m->mpc_apicid,
- (m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
- (m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
m->mpc_apicver);
return (m->mpc_apicid);
}
diff -Naur -X /root/bin/dontdiff a/include/asm-i386/mach-summit/mach_mpparse.h b/include/asm-i386/mach-summit/mach_mpparse.h
--- a/include/asm-i386/mach-summit/mach_mpparse.h 2003-01-20 11:03:28.000000000 -0800
+++ b/include/asm-i386/mach-summit/mach_mpparse.h 2003-01-20 11:10:34.000000000 -0800
@@ -1,14 +1,14 @@
#ifndef __ASM_MACH_MPPARSE_H
#define __ASM_MACH_MPPARSE_H

-static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name,
- struct mpc_config_translation *translation)
+static inline void mpc_oem_bus_info(struct mps_config_bus *m, char *name,
+ struct mps_config_translation *translation)
{
Dprintk("Bus #%d is %s\n", m->mpc_busid, name);
}

-static inline void mpc_oem_pci_bus(struct mpc_config_bus *m,
- struct mpc_config_translation *translation)
+static inline void mpc_oem_pci_bus(struct mps_config_bus *m,
+ struct mps_config_translation *translation)
{
}

diff -Naur -X /root/bin/dontdiff a/include/asm-i386/mpspec.h b/include/asm-i386/mpspec.h
--- a/include/asm-i386/mpspec.h 2003-01-20 11:02:04.000000000 -0800
+++ b/include/asm-i386/mpspec.h 2003-01-20 11:10:17.000000000 -0800
@@ -63,7 +63,7 @@
#define MP_LINTSRC 4
#define MP_TRANSLATION 192 /* Used by IBM NUMA-Q to describe node locality */

-struct mpc_config_processor
+struct mps_config_processor
{
unsigned char mpc_type;
unsigned char mpc_apicid; /* Local APIC number */
@@ -79,7 +79,7 @@
unsigned long mpc_reserved[2];
};

-struct mpc_config_bus
+struct mps_config_bus
{
unsigned char mpc_type;
unsigned char mpc_busid;
@@ -107,7 +107,7 @@
#define BUSTYPE_XPRESS "XPRESS"
#define BUSTYPE_NEC98 "NEC98"

-struct mpc_config_ioapic
+struct mps_config_ioapic
{
unsigned char mpc_type;
unsigned char mpc_apicid;
@@ -117,7 +117,7 @@
unsigned long mpc_apicaddr;
};

-struct mpc_config_intsrc
+struct mps_config_intsrc
{
unsigned char mpc_type;
unsigned char mpc_irqtype;
@@ -140,7 +140,7 @@
#define MP_IRQDIR_LOW 3

-struct mpc_config_lintsrc
+struct mps_config_lintsrc
{
unsigned char mpc_type;
unsigned char mpc_irqtype;
@@ -162,7 +162,7 @@
char mpc_oem[8];
};

-struct mpc_config_translation
+struct mps_config_translation
{
unsigned char mpc_type;
unsigned char trans_len;
@@ -207,14 +207,14 @@

extern unsigned int boot_cpu_physical_apicid;
extern unsigned long phys_cpu_present_map;
-extern int smp_found_config;
-extern void find_smp_config (void);
-extern void get_smp_config (void);
+extern int mps_found_config;
+extern void find_mps_config (void);
+extern void get_mps_config (void);
extern int nr_ioapics;
extern int apic_version [MAX_APICS];
extern int mp_bus_id_to_type [MAX_MP_BUSSES];
extern int mp_irq_entries;
-extern struct mpc_config_intsrc mp_irqs [MAX_IRQ_SOURCES];
+extern struct mps_config_intsrc mp_irqs [MAX_IRQ_SOURCES];
extern int mpc_default_type;
extern int mp_bus_id_to_pci_bus [MAX_MP_BUSSES];
extern int mp_current_pci_id;
diff -Naur -X /root/bin/dontdiff a/include/asm-i386/smpenum.h b/include/asm-i386/smpenum.h
--- a/include/asm-i386/smpenum.h 1969-12-31 16:00:00.000000000 -0800
+++ b/include/asm-i386/smpenum.h 2003-01-20 11:10:40.000000000 -0800
@@ -0,0 +1,182 @@
+#ifndef __ASM_SMPENUM_H
+#define __ASM_SMPENUM_H
+
+/*
+ * Generic structures for modular SMP init
+ */
+
+/* Followed by entries */
+
+#define MP_PROCESSOR 0
+#define MP_BUS 1
+#define MP_IOAPIC 2
+#define MP_INTSRC 3
+#define MP_LINTSRC 4
+#define MP_TRANSLATION 192 /* Used by IBM NUMA-Q to describe node locality */
+
+struct mpc_config_processor
+{
+ unsigned char mpc_apicid; /* Local APIC number */
+ unsigned char mpc_apicver; /* Local APIC version */
+};
+
+void smp_processor_register(struct mpc_config_processor *m);
+
+struct mpc_config_bus
+{
+ unsigned char mpc_type;
+ unsigned char mpc_busid;
+ unsigned char mpc_bustype[6] __attribute((packed));
+};
+
+#if 0
+
+/* List of Bus Type string values, Intel MP Spec. */
+#define BUSTYPE_EISA "EISA"
+#define BUSTYPE_ISA "ISA"
+#define BUSTYPE_INTERN "INTERN" /* Internal BUS */
+#define BUSTYPE_MCA "MCA"
+#define BUSTYPE_VL "VL" /* Local bus */
+#define BUSTYPE_PCI "PCI"
+#define BUSTYPE_PCMCIA "PCMCIA"
+#define BUSTYPE_CBUS "CBUS"
+#define BUSTYPE_CBUSII "CBUSII"
+#define BUSTYPE_FUTURE "FUTURE"
+#define BUSTYPE_MBI "MBI"
+#define BUSTYPE_MBII "MBII"
+#define BUSTYPE_MPI "MPI"
+#define BUSTYPE_MPSA "MPSA"
+#define BUSTYPE_NUBUS "NUBUS"
+#define BUSTYPE_TC "TC"
+#define BUSTYPE_VME "VME"
+#define BUSTYPE_XPRESS "XPRESS"
+#define BUSTYPE_NEC98 "NEC98"
+
+struct mpc_config_ioapic
+{
+ unsigned char mpc_type;
+ unsigned char mpc_apicid;
+ unsigned char mpc_apicver;
+ unsigned char mpc_flags;
+#define MPC_APIC_USABLE 0x01
+ unsigned long mpc_apicaddr;
+};
+
+struct mpc_config_intsrc
+{
+ unsigned char mpc_type;
+ unsigned char mpc_irqtype;
+ unsigned short mpc_irqflag;
+ unsigned char mpc_srcbus;
+ unsigned char mpc_srcbusirq;
+ unsigned char mpc_dstapic;
+ unsigned char mpc_dstirq;
+};
+
+enum mp_irq_source_types {
+ mp_INT = 0,
+ mp_NMI = 1,
+ mp_SMI = 2,
+ mp_ExtINT = 3
+};
+
+#define MP_IRQDIR_DEFAULT 0
+#define MP_IRQDIR_HIGH 1
+#define MP_IRQDIR_LOW 3
+
+
+struct mpc_config_lintsrc
+{
+ unsigned char mpc_type;
+ unsigned char mpc_irqtype;
+ unsigned short mpc_irqflag;
+ unsigned char mpc_srcbusid;
+ unsigned char mpc_srcbusirq;
+ unsigned char mpc_destapic;
+#define MP_APIC_ALL 0xFF
+ unsigned char mpc_destapiclint;
+};
+
+struct mp_config_oemtable
+{
+ char oem_signature[4];
+#define MPC_OEM_SIGNATURE "_OEM"
+ unsigned short oem_length; /* Size of table */
+ char oem_rev; /* 0x01 */
+ char oem_checksum;
+ char mpc_oem[8];
+};
+
+struct mpc_config_translation
+{
+ unsigned char mpc_type;
+ unsigned char trans_len;
+ unsigned char trans_type;
+ unsigned char trans_quad;
+ unsigned char trans_global;
+ unsigned char trans_local;
+ unsigned short trans_reserved;
+};
+
+/*
+ * Default configurations
+ *
+ * 1 2 CPU ISA 82489DX
+ * 2 2 CPU EISA 82489DX neither IRQ 0 timer nor IRQ 13 DMA chaining
+ * 3 2 CPU EISA 82489DX
+ * 4 2 CPU MCA 82489DX
+ * 5 2 CPU ISA+PCI
+ * 6 2 CPU EISA+PCI
+ * 7 2 CPU MCA+PCI
+ */
+
+#ifdef CONFIG_X86_NUMAQ
+#define MAX_IRQ_SOURCES 512
+#else /* !CONFIG_X86_NUMAQ */
+#define MAX_IRQ_SOURCES 256
+#endif /* CONFIG_X86_NUMAQ */
+
+#define MAX_MP_BUSSES 32
+enum mp_bustype {
+ MP_BUS_ISA = 1,
+ MP_BUS_EISA,
+ MP_BUS_PCI,
+ MP_BUS_MCA,
+ MP_BUS_NEC98
+};
+extern int mp_bus_id_to_type [MAX_MP_BUSSES];
+extern int mp_bus_id_to_node [MAX_MP_BUSSES];
+extern int mp_bus_id_to_local [MAX_MP_BUSSES];
+extern int quad_local_to_mp_bus_id [NR_CPUS/4][4];
+extern int mp_bus_id_to_pci_bus [MAX_MP_BUSSES];
+
+extern unsigned int boot_cpu_physical_apicid;
+extern unsigned long phys_cpu_present_map;
+extern int mps_found_config;
+extern void find_mps_config (void);
+extern void get_mps_config (void);
+extern int nr_ioapics;
+extern int apic_version [MAX_APICS];
+extern int mp_bus_id_to_type [MAX_MP_BUSSES];
+extern int mp_irq_entries;
+extern struct mpc_config_intsrc mp_irqs [MAX_IRQ_SOURCES];
+extern int mpc_default_type;
+extern int mp_bus_id_to_pci_bus [MAX_MP_BUSSES];
+extern int mp_current_pci_id;
+extern unsigned long mp_lapic_addr;
+extern int pic_mode;
+extern int using_apic_timer;
+
+#ifdef CONFIG_ACPI_BOOT
+extern void mp_register_lapic (u8 id, u8 enabled);
+extern void mp_register_lapic_address (u64 address);
+extern void mp_register_ioapic (u8 id, u32 address, u32 irq_base);
+extern void mp_override_legacy_irq (u8 bus_irq, u8 polarity, u8 trigger, u32 global_irq);
+extern void mp_config_acpi_legacy_irqs (void);
+extern void mp_config_ioapic_for_sci(int irq);
+extern void mp_parse_prt (void);
+#endif /*CONFIG_ACPI_BOOT*/
+
+#endif
+
+#endif /* if 0 */
diff -Naur -X /root/bin/dontdiff a/include/asm-i386/smp.h b/include/asm-i386/smp.h
--- a/include/asm-i386/smp.h 2003-01-20 11:03:56.000000000 -0800
+++ b/include/asm-i386/smp.h 2003-01-20 11:10:39.000000000 -0800
@@ -15,6 +15,7 @@
#include <asm/fixmap.h>
#include <asm/bitops.h>
#include <asm/mpspec.h>
+#include <asm/smpenum.h>
#ifdef CONFIG_X86_IO_APIC
#include <asm/io_apic.h>
#endif
diff -Naur -X /root/bin/dontdiff a/include/linux/acpi.h b/include/linux/acpi.h
--- a/include/linux/acpi.h 2003-01-20 11:02:04.000000000 -0800
+++ b/include/linux/acpi.h 2003-01-20 11:10:17.000000000 -0800
@@ -351,10 +351,10 @@

char * __acpi_map_table (unsigned long phys_addr, unsigned long size);
unsigned long acpi_find_rsdp (void);
-int acpi_boot_init (char *cmdline);
+int acpi_boot_init (void);
int acpi_numa_init (void);

-int acpi_table_init (char *cmdline);
+int acpi_table_init (void);
int acpi_table_parse (enum acpi_table_id id, acpi_table_handler handler);
int acpi_get_table_header_early (enum acpi_table_id id, struct acpi_table_header **header);
int acpi_table_parse_madt (enum acpi_madt_entry_id id, acpi_madt_entry_handler handler);