2003-07-10 00:57:55

by john stultz

[permalink] [raw]
Subject: [PATCH] linux-2.4.22-pre4_x440-acpi-fix_A0

Marcelo, Andrew, All,

Due to the new ACPI code, when booting in full ACPI mode, we do not go
through the mps tables, thus we do not execute the summit detection code
required for booting an x440.

This patch insures that when booting in full ACPI mode we check to see
if we're running on a summit based system and enable clustered apic
mode. Without this patch the x440s hang while booting in full ACPI mode.

Thanks to James Cleverdon for the original version of this patch.

Please apply,

thanks
-john


diff -Nru a/arch/i386/kernel/acpi.c b/arch/i386/kernel/acpi.c
--- a/arch/i386/kernel/acpi.c Wed Jul 9 16:39:20 2003
+++ b/arch/i386/kernel/acpi.c Wed Jul 9 16:39:20 2003
@@ -129,6 +129,8 @@
printk(KERN_INFO PREFIX "Local APIC address 0x%08x\n",
madt->lapic_address);

+ acpi_madt_oem_check(madt->header.oem_id, madt->header.oem_table_id);
+
return 0;
}

diff -Nru a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c
--- a/arch/i386/kernel/io_apic.c Wed Jul 9 16:39:20 2003
+++ b/arch/i386/kernel/io_apic.c Wed Jul 9 16:39:20 2003
@@ -1732,6 +1732,13 @@
apic_id = reg_00.ID;
}

+ /* XAPICs do not need unique IDs */
+ if (clustered_apic_mode == CLUSTERED_APIC_XAPIC){
+ printk(KERN_INFO "IOAPIC[%d]: Assigned apic_id %d\n",
+ ioapic, apic_id);
+ return apic_id;
+ }
+
/*
* Every APIC in a system must have a unique ID or we get lots of nice
* 'stuck on smp_invalidate_needed IPI wait' messages.
diff -Nru a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c
--- a/arch/i386/kernel/mpparse.c Wed Jul 9 16:39:20 2003
+++ b/arch/i386/kernel/mpparse.c Wed Jul 9 16:39:20 2003
@@ -1252,6 +1252,23 @@
io_apic_set_pci_routing(ioapic, ioapic_pin, irq);
}

+/* Hook from generic ACPI tables.c */
+void __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
+{
+ if (!strncmp(oem_id, "IBM", 3) &&
+ (!strncmp(oem_table_id, "SERVIGIL", 8) ||
+ !strncmp(oem_table_id, "EXA", 3) ||
+ !strncmp(oem_table_id, "RUTHLESS", 8))){
+ clustered_apic_mode = CLUSTERED_APIC_XAPIC;
+ apic_broadcast_id = APIC_BROADCAST_ID_XAPIC;
+ int_dest_addr_mode = APIC_DEST_PHYSICAL;
+ int_delivery_mode = dest_Fixed;
+ esr_disable = 1;
+ /*Start cyclone clock*/
+ cyclone_setup(0);
+ }
+}
+
#ifdef CONFIG_ACPI_PCI

void __init mp_parse_prt (void)
diff -Nru a/include/asm-i386/acpi.h b/include/asm-i386/acpi.h
--- a/include/asm-i386/acpi.h Wed Jul 9 16:39:20 2003
+++ b/include/asm-i386/acpi.h Wed Jul 9 16:39:20 2003
@@ -165,6 +165,9 @@
/* early initialization routine */
extern void acpi_reserve_bootmem(void);

+/* Check for special HW using OEM name lists */
+extern void acpi_madt_oem_check(char *oem_id, char *oem_table_id);
+
#endif /*CONFIG_ACPI_SLEEP*/






2003-07-10 03:10:33

by Marcelo Tosatti

[permalink] [raw]
Subject: Re: [PATCH] linux-2.4.22-pre4_x440-acpi-fix_A0



On Wed, 9 Jul 2003, john stultz wrote:

> Marcelo, Andrew, All,
>
> Due to the new ACPI code, when booting in full ACPI mode, we do not go
> through the mps tables, thus we do not execute the summit detection code
> required for booting an x440.
>
> This patch insures that when booting in full ACPI mode we check to see
> if we're running on a summit based system and enable clustered apic
> mode. Without this patch the x440s hang while booting in full ACPI mode.
>
> Thanks to James Cleverdon for the original version of this patch.
>
> Please apply,


I just applied it John, it will be in bk soon.

But cant that be done in a cleaner way?

The acpi_madt_oem_check() call and implementation are the cleaner way of
doing this?

2003-07-10 20:35:31

by john stultz

[permalink] [raw]
Subject: Re: [PATCH] linux-2.4.22-pre4_x440-acpi-fix_A0

On Wed, 2003-07-09 at 20:22, Marcelo Tosatti wrote:
> On Wed, 9 Jul 2003, john stultz wrote:
> > Due to the new ACPI code, when booting in full ACPI mode, we do not go
> > through the mps tables, thus we do not execute the summit detection code
> > required for booting an x440.
> >
> > This patch insures that when booting in full ACPI mode we check to see
> > if we're running on a summit based system and enable clustered apic
> > mode. Without this patch the x440s hang while booting in full ACPI mode.
>
> I just applied it John, it will be in bk soon.

Thanks so much.

> But cant that be done in a cleaner way?
>
> The acpi_madt_oem_check() call and implementation are the cleaner way of
> doing this?

Well,when booting using the acpi tables, we need an equivalent hook to
detect_clustered_apic(), which is used when booting off the mps table.

Basically I just kept the acpi_madt_oem_check() name and implementation
from the 2.5 tree, but I'd be fine with doing it differently if someone
can suggest an idea.

thanks
-john

2003-07-10 21:59:12

by john stultz

[permalink] [raw]
Subject: [PATCH] linux-2.4.22-pre4_x440-acpi-fix_A1

On Wed, 2003-07-09 at 20:22, Marcelo Tosatti wrote:
> I just applied it John, it will be in bk soon.
>
> But cant that be done in a cleaner way?

Think I've sorted a slightly cleaner way, and bonus points for making it
compile with CONFIG_ACPI & !CONFIG_X86_CLUSTERED_APIC (gah! sorry about
that).

This patch moves the summit detection being done in
acpi_madt_oem_check() to detect_clustered_apic(). Also fixes the compile
failure when compiling with CONFIG_ACPI and without
CONFIG_X86_CLUSTERED_APIC.


Applies on top of 2.4.22-bkcurrent.

Thanks
-john


diff -Nru a/arch/i386/kernel/acpi.c b/arch/i386/kernel/acpi.c
--- a/arch/i386/kernel/acpi.c Thu Jul 10 14:44:25 2003
+++ b/arch/i386/kernel/acpi.c Thu Jul 10 14:44:25 2003
@@ -44,6 +44,7 @@
#include <asm/io_apic.h>
#include <asm/acpi.h>
#include <asm/save_state.h>
+#include <asm/smpboot.h>


#define PREFIX "ACPI: "
@@ -129,7 +130,7 @@
printk(KERN_INFO PREFIX "Local APIC address 0x%08x\n",
madt->lapic_address);

- acpi_madt_oem_check(madt->header.oem_id, madt->header.oem_table_id);
+ detect_clustered_apic(madt->header.oem_id, madt->header.oem_table_id);

return 0;
}
diff -Nru a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c
--- a/arch/i386/kernel/mpparse.c Thu Jul 10 14:44:25 2003
+++ b/arch/i386/kernel/mpparse.c Thu Jul 10 14:44:25 2003
@@ -1252,22 +1252,6 @@
io_apic_set_pci_routing(ioapic, ioapic_pin, irq);
}

-/* Hook from generic ACPI tables.c */
-void __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
-{
- if (!strncmp(oem_id, "IBM", 3) &&
- (!strncmp(oem_table_id, "SERVIGIL", 8) ||
- !strncmp(oem_table_id, "EXA", 3) ||
- !strncmp(oem_table_id, "RUTHLESS", 8))){
- clustered_apic_mode = CLUSTERED_APIC_XAPIC;
- apic_broadcast_id = APIC_BROADCAST_ID_XAPIC;
- int_dest_addr_mode = APIC_DEST_PHYSICAL;
- int_delivery_mode = dest_Fixed;
- esr_disable = 1;
- /*Start cyclone clock*/
- cyclone_setup(0);
- }
-}

#ifdef CONFIG_ACPI_PCI

diff -Nru a/include/asm-i386/acpi.h b/include/asm-i386/acpi.h
--- a/include/asm-i386/acpi.h Thu Jul 10 14:44:25 2003
+++ b/include/asm-i386/acpi.h Thu Jul 10 14:44:25 2003
@@ -165,9 +165,6 @@
/* early initialization routine */
extern void acpi_reserve_bootmem(void);

-/* Check for special HW using OEM name lists */
-extern void acpi_madt_oem_check(char *oem_id, char *oem_table_id);
-
#endif /*CONFIG_ACPI_SLEEP*/


diff -Nru a/include/asm-i386/smpboot.h b/include/asm-i386/smpboot.h
--- a/include/asm-i386/smpboot.h Thu Jul 10 14:44:25 2003
+++ b/include/asm-i386/smpboot.h Thu Jul 10 14:44:25 2003
@@ -29,8 +29,19 @@
esr_disable = 1;
/*Start cyclone clock*/
cyclone_setup(0);
- }
- else if (!strncmp(oem, "IBM NUMA", 8)){
+ /* check for ACPI tables */
+ } else if (!strncmp(oem, "IBM", 3) &&
+ (!strncmp(prod, "SERVIGIL", 8) ||
+ !strncmp(prod, "EXA", 3) ||
+ !strncmp(prod, "RUTHLESS", 8))){
+ clustered_apic_mode = CLUSTERED_APIC_XAPIC;
+ apic_broadcast_id = APIC_BROADCAST_ID_XAPIC;
+ int_dest_addr_mode = APIC_DEST_PHYSICAL;
+ int_delivery_mode = dest_Fixed;
+ esr_disable = 1;
+ /*Start cyclone clock*/
+ cyclone_setup(0);
+ } else if (!strncmp(oem, "IBM NUMA", 8)){
clustered_apic_mode = CLUSTERED_APIC_NUMAQ;
apic_broadcast_id = APIC_BROADCAST_ID_APIC;
int_dest_addr_mode = APIC_DEST_LOGICAL;