public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Handle disabled local apic better
@ 2004-03-23 20:35 Andi Kleen
       [not found] ` <20040323213551.4789bbae.ak-l3A5Bk7waGM@public.gmane.org>
  0 siblings, 1 reply; 7+ messages in thread
From: Andi Kleen @ 2004-03-23 20:35 UTC (permalink / raw)
  To: len.brown-ral2JQCrhuEAvxtiuMwx3w
  Cc: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f



When a kernel is compiled with local and io apic code, but the local APIC
is disabled before ACPI starts ACPI gets confused.  The situation
can occur in a mainline kernel too, e.g. when a dmi_scan entry disables
the local apic early.

The problem is that the ACPI code will do all the setup assuming there
is a IO-APIC because the IO-APIC is not disabled, but the machine really runs in 
PIC mode. This usually leads to lost network (devices get an unreachable interrupt) 
or IDE hangs or other problems.

This patch adds checks for local apic enabled to all paths that need it
(basically everybody who has a #ifdef CONFIG_X86_LOCAL_APIC needs this
check instead)

It just handles the case there the up apic is disabled before ACPI boot,
it can actually be disabled later too (e.g. when the APIC initialisation
fails). This is probably still broken.

Also removes an bogus error message - this path can trigger just with
software disabled APIC.

-Andi

diff -u linux/arch/i386/kernel/acpi/boot.c-o linux/arch/i386/kernel/acpi/boot.c
--- linux/arch/i386/kernel/acpi/boot.c-o	2004-03-23 17:32:22.000000000 +0100
+++ linux/arch/i386/kernel/acpi/boot.c	2004-03-23 17:34:23.000000000 +0100
@@ -685,6 +685,13 @@
 #ifdef CONFIG_X86_LOCAL_APIC
 	int count, error;
 
+	/* it's still wrong when the apic is disabled later */
+	extern int enable_local_apic;
+	if (enable_local_apic < 0) { 
+		printk(KERN_INFO "ACPI: local apic disabled\n");
+		return;
+	}
+
 	count = acpi_table_parse(ACPI_APIC, acpi_parse_madt);
 	if (count == 1) {
 
diff -u linux/arch/i386/kernel/apic.c-o linux/arch/i386/kernel/apic.c
--- linux/arch/i386/kernel/apic.c-o	2004-03-23 17:32:22.000000000 +0100
+++ linux/arch/i386/kernel/apic.c	2004-03-23 18:01:21.000000000 +0100
@@ -41,6 +41,8 @@
 
 #include "io_ports.h"
 
+extern int enable_local_apic;
+
 static void apic_pm_activate(void);
 
 void __init apic_intr_init(void)
@@ -190,6 +192,9 @@
 {
 	unsigned long value;
 
+	if (enable_local_apic < 0) 
+		return;
+
 	clear_local_APIC();
 
 	/*
@@ -1172,8 +1193,6 @@
 	 * Complain if the BIOS pretends there is one.
 	 */
 	if (!cpu_has_apic && APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid])) {
-		printk(KERN_ERR "BIOS bug, local APIC #%d not detected!...\n",
-			boot_cpu_physical_apicid);
 		return -1;
 	}
 
diff -u linux/arch/i386/kernel/setup.c-o linux/arch/i386/kernel/setup.c
--- linux/arch/i386/kernel/setup.c-o	2004-03-23 17:32:00.000000000 +0100
+++ linux/arch/i386/kernel/setup.c	2004-03-23 18:01:14.000000000 +0100
@@ -50,6 +50,10 @@
 #include "setup_arch_pre.h"
 #include "mach_resources.h"
 
+#ifdef CONFIG_X86_LOCAL_APIC
+extern int enable_local_apic;
+#endif
+
 /* This value is set up by the early boot code to point to the value
    immediately after the boot time page tables.  It contains a *physical*
    address, and must not be in the .bss segment! */
@@ -917,6 +925,7 @@
 	acpi_reserve_bootmem();
 #endif
 #ifdef CONFIG_X86_FIND_SMP_CONFIG
+	if (enable_local_apic >= 0) 
 	/*
 	 * Find and reserve possible boot-time SMP configuration:
 	 */
@@ -1232,7 +1241,7 @@
 	acpi_boot_init();
 
 #ifdef CONFIG_X86_LOCAL_APIC
-	if (smp_found_config)
+	if (smp_found_config && enable_local_apic >= 0)
 		get_smp_config();
 #endif
 
diff -u linux/arch/x86_64/kernel/apic.c-o linux/arch/x86_64/kernel/apic.c
--- linux/arch/x86_64/kernel/apic.c-o	2004-03-23 17:32:01.000000000 +0100
+++ linux/arch/x86_64/kernel/apic.c	2004-03-23 18:41:58.000000000 +0100
@@ -970,6 +970,7 @@
 }
 
 int disable_apic; 
+int enable_local_apic = 1;
 
 /*
  * This initializes the IO-APIC and APIC hardware if this is
@@ -1009,12 +1010,14 @@
 
 static __init int setup_disableapic(char *str) 
 { 
+	enable_local_apic = -1;
 	disable_apic = 1;
 	return 0;
 } 
 
 static __init int setup_nolapic(char *str) 
 { 
+	enable_local_apic = -1;
 	disable_apic = 1;
 	return 0;
 } 


-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2004-03-24 20:48 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-03-23 20:35 [PATCH] Handle disabled local apic better Andi Kleen
     [not found] ` <20040323213551.4789bbae.ak-l3A5Bk7waGM@public.gmane.org>
2004-03-24  7:12   ` Len Brown
     [not found]     ` <1080112373.18504.67.camel-D2Zvc0uNKG8@public.gmane.org>
2004-03-24  4:27       ` Andi Kleen
     [not found]         ` <20040324052724.56e57709.ak-l3A5Bk7waGM@public.gmane.org>
2004-03-24 19:13           ` Len Brown
     [not found]             ` <1080155600.18509.263.camel-D2Zvc0uNKG8@public.gmane.org>
2004-03-24 19:28               ` Andi Kleen
     [not found]                 ` <20040324192800.GD20849-B4tOwbsTzaBolqkO4TVVkw@public.gmane.org>
2004-03-24 20:48                   ` Len Brown
2004-03-24  8:03       ` Karol Kozimor

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox