Re: 2.6.7-rc3-mm1

William Lee Irwin III
2004-06-10T02:52:45Z

[-- Attachment #1: Type: text/plain, Size: 490 bytes --]

Andrew Morton wrote:
>>ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.7-rc3/2.6.7-rc3-mm1/
>>

On Wed, Jun 09, 2004 at 07:10:24PM -0700, Phil Brunner wrote:
> Could not compile with CONFIG_X86_IO_APIC=y. Function call to
> (undefined) mp_register_gsi in arch/i386/kernel/acpi/boot.c is the problem.
> Code in arch/i386/kernel/mpparse.c may be the appropriate function
> definition (?).

Please apply the following 3 patches applied in order and run with them:

-- wli

[-- Attachment #2: 01-physical_broadcast_fixes.patch --]
[-- Type: text/plain, Size: 3484 bytes --]

Index: mm1-2.6.7-rc3/arch/i386/kernel/mpparse.c
===================================================================
--- mm1-2.6.7-rc3.orig/arch/i386/kernel/mpparse.c 2004-06-09 07:11:51.335601000 -0700
+++ mm1-2.6.7-rc3/arch/i386/kernel/mpparse.c 2004-06-09 07:42:04.221000000 -0700
@@ -107,7 +107,7 @@
#ifdef CONFIG_X86_NUMAQ
static int MP_valid_apicid(int apicid, int version)
{
- return hweight_long(i & 0xf) == 1 && (i >> 4) != 0xf;
+ return hweight_long(apicid & 0xf) == 1 && (apicid >> 4) != 0xf;
}
#else
static int MP_valid_apicid(int apicid, int version)
@@ -207,7 +207,7 @@
num_processors++;
ver = m->mpc_apicver;

- if (MP_valid_apicid(m->mpc_apicid, ver))
+ if (MP_valid_apicid(apicid, ver))
MP_mark_version_physids(ver);
else {
printk(KERN_WARNING "Processor #%d INVALID. (Max ID: %d).\n",
@@ -871,7 +871,7 @@
MP_processor_info(&processor);
}

-#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_ACPI_INTERPRETER)
+#if defined(CONFIG_X86_IO_APIC) && (defined(CONFIG_ACPI_INTERPRETER) || defined(CONFIG_ACPI_BOOT))

#define MP_ISA_BUS 0
#define MP_MAX_IOAPIC_PIN 127
@@ -1103,5 +1103,5 @@
active_high_low == ACPI_ACTIVE_HIGH ? 0 : 1);
}

-#endif /*CONFIG_X86_IO_APIC && CONFIG_ACPI_INTERPRETER*/
+#endif /*CONFIG_X86_IO_APIC && (CONFIG_ACPI_INTERPRETER || CONFIG_ACPI_BOOT)*/
#endif /*CONFIG_ACPI_BOOT*/
Index: mm1-2.6.7-rc3/arch/i386/kernel/io_apic.c
===================================================================
--- mm1-2.6.7-rc3.orig/arch/i386/kernel/io_apic.c 2004-06-09 07:11:51.323603000 -0700
+++ mm1-2.6.7-rc3/arch/i386/kernel/io_apic.c 2004-06-09 07:30:06.936044000 -0700
@@ -722,7 +722,7 @@

__setup("pirq=", ioapic_pirq_setup);

-static int get_physical_broadcast(void)
+int get_physical_broadcast(void)
{
unsigned int lvr, version;
lvr = apic_read(APIC_LVR);
Index: mm1-2.6.7-rc3/include/asm-i386/mach-default/mach_apic.h
===================================================================
--- mm1-2.6.7-rc3.orig/include/asm-i386/mach-default/mach_apic.h 2004-06-09 07:11:51.513574000 -0700
+++ mm1-2.6.7-rc3/include/asm-i386/mach-default/mach_apic.h 2004-06-09 07:42:51.696783000 -0700
@@ -79,7 +79,10 @@

static inline int cpu_present_to_apicid(int mps_cpu)
{
- return mps_cpu;
+ if (mps_cpu < get_physical_broadcast())
+ return mps_cpu;
+ else
+ return BAD_APICID;
}

static inline physid_mask_t apicid_to_cpu_present(int phys_apicid)
Index: mm1-2.6.7-rc3/include/asm-i386/mach-visws/mach_apic.h
===================================================================
--- mm1-2.6.7-rc3.orig/include/asm-i386/mach-visws/mach_apic.h 2004-06-09 07:11:51.635555000 -0700
+++ mm1-2.6.7-rc3/include/asm-i386/mach-visws/mach_apic.h 2004-06-09 07:29:30.131639000 -0700
@@ -60,7 +60,10 @@

static inline int cpu_present_to_apicid(int mps_cpu)
{
- return mps_cpu;
+ if (mps_cpu < get_physical_broadcast())
+ return mps_cpu;
+ else
+ return BAD_APICID;
}

static inline physid_mask_t apicid_to_cpu_present(int apicid)
Index: mm1-2.6.7-rc3/include/asm-i386/apic.h
===================================================================
--- mm1-2.6.7-rc3.orig/include/asm-i386/apic.h 2004-06-07 12:15:12.000000000 -0700
+++ mm1-2.6.7-rc3/include/asm-i386/apic.h 2004-06-09 07:29:54.104995000 -0700
@@ -41,6 +41,8 @@
do { } while ( apic_read( APIC_ICR ) & APIC_ICR_BUSY );
}

+int get_physical_broadcast(void);
+
#ifdef CONFIG_X86_GOOD_APIC
# define FORCE_READ_AROUND_WRITE 0
# define apic_read_around(x)

[-- Attachment #3: 02-remove_mp_mark_version_physids.patch --]
[-- Type: text/plain, Size: 1451 bytes --]

Index: mm1-2.6.7-rc3/arch/i386/kernel/mpparse.c
===================================================================
--- mm1-2.6.7-rc3.orig/arch/i386/kernel/mpparse.c 2004-06-09 07:42:04.221000000 -0700
+++ mm1-2.6.7-rc3/arch/i386/kernel/mpparse.c 2004-06-09 07:54:51.703325000 -0700
@@ -119,16 +119,6 @@
}
#endif

-static void MP_mark_version_physids(int version)
-{
- int i;
-
- for (i = 0; i < MAX_APICS; ++i) {
- if (!MP_valid_apicid(i, version))
- physid_set(i, phys_cpu_present_map);
- }
-}
-
void __init MP_processor_info (struct mpc_config_processor *m)
{
int ver, apicid;
@@ -207,9 +197,7 @@
num_processors++;
ver = m->mpc_apicver;

- if (MP_valid_apicid(apicid, ver))
- MP_mark_version_physids(ver);
- else {
+ if (!MP_valid_apicid(apicid, ver)) {
printk(KERN_WARNING "Processor #%d INVALID. (Max ID: %d).\n",
m->mpc_apicid, MAX_APICS);
--num_processors;
Index: mm1-2.6.7-rc3/arch/i386/mach-visws/mpparse.c
===================================================================
--- mm1-2.6.7-rc3.orig/arch/i386/mach-visws/mpparse.c 2004-06-09 07:11:51.380594000 -0700
+++ mm1-2.6.7-rc3/arch/i386/mach-visws/mpparse.c 2004-06-09 07:57:04.521134000 -0700
@@ -75,14 +75,6 @@
m->mpc_apicid);
ver = 0x10;
}
- if (ver >= 0x14)
- physid_set(0xff, phys_cpu_present_map);
- else {
- int i;
-
- for (i = 0xf; i < MAX_APICS; ++i)
- physid_set(i, phys_cpu_present_map);
- }
apic_version[m->mpc_apicid] = ver;
}

[-- Attachment #4: 03-mach_default_compile.patch --]
[-- Type: text/plain, Size: 1650 bytes --]

Index: mm1-2.6.7-rc3/include/asm-i386/mach-default/mach_apic.h
===================================================================
--- mm1-2.6.7-rc3.orig/include/asm-i386/mach-default/mach_apic.h 2004-06-09 08:08:00.000000000 -0700
+++ mm1-2.6.7-rc3/include/asm-i386/mach-default/mach_apic.h 2004-06-09 08:10:17.000000000 -0700
@@ -2,6 +2,7 @@
#define __ASM_MACH_APIC_H

#include <mach_apicdef.h>
+#include <asm/smp.h>

#define APIC_DFR_VALUE (APIC_DFR_FLAT)

Index: mm1-2.6.7-rc3/arch/i386/kernel/io_apic.c
===================================================================
--- mm1-2.6.7-rc3.orig/arch/i386/kernel/io_apic.c 2004-06-09 08:08:00.000000000 -0700
+++ mm1-2.6.7-rc3/arch/i386/kernel/io_apic.c 2004-06-09 08:13:05.000000000 -0700
@@ -722,17 +722,6 @@

__setup("pirq=", ioapic_pirq_setup);

-int get_physical_broadcast(void)
-{
- unsigned int lvr, version;
- lvr = apic_read(APIC_LVR);
- version = GET_APIC_VERSION(lvr);
- if (version >= 0x14)
- return 0xff;
- else
- return 0xf;
-}
-
/*
* Find the IRQ entry number of a certain pin.
*/
Index: mm1-2.6.7-rc3/arch/i386/kernel/apic.c
===================================================================
--- mm1-2.6.7-rc3.orig/arch/i386/kernel/apic.c 2004-06-09 08:06:44.000000000 -0700
+++ mm1-2.6.7-rc3/arch/i386/kernel/apic.c 2004-06-09 08:13:27.000000000 -0700
@@ -80,6 +80,17 @@
apic_write_around(APIC_LVT0, v);
}

+int get_physical_broadcast(void)
+{
+ unsigned int lvr, version;
+ lvr = apic_read(APIC_LVR);
+ version = GET_APIC_VERSION(lvr);
+ if (version >= 0x14)
+ return 0xff;
+ else
+ return 0xf;
+}
+
int get_maxlvt(void)
{
unsigned int v, ver, maxlvt;