Commit 2475e282 authored by Mikael Pettersson's avatar Mikael Pettersson Committed by Paul Mackerras

[PATCH] local APIC blacklist rules updates

This patch removes the x86 local APIC blacklist rules for the
Microstar 6163 and Intel AL440LX mainboards. These boards do
work with local APIC enabled. Heavily tested. Please apply.

Long story: When I worked on the initial UP_APIC code, these
two mainboard (MS-6163 and AL440LX) were the only ones that
caused hangs when the local APIC was enabled. At the time,
I attributed these hangs to broken BIOSen and implemented DMI
scan blacklist rules to prevent enabling the local APIC on them.

However, the last year I've observed hangs on other mainboards
that initially were believed to be safe for local APIC. The
hangs turned out to be caused by APM's DISPLAY_BLANK option:
When this option is enabled, APM will invoke BIOS and graphics
card BIOS code without disabling the local APIC first. In many
cases, a local APIC timer interrupt while APM is trying to blank
the console will hang the system.

APM also has two other options that can hang the system: CPU_IDLE
and building APM as a module, both of which causes it to do BIOS
calls without disabling the local APIC first. On all my systems,
the only reliable configuration is to keep APM's DISPLAY_BLANK and
CPU_IDLE disabled, and to build APM non-modular.
parent d0646d34
......@@ -311,43 +311,6 @@ static int __init local_apic_kills_bios(struct dmi_blacklist *d)
return 0;
}
/*
* The Microstar 6163-2 (a.k.a Pro) mainboard will hang shortly after
* resumes, and also at what appears to be asynchronous APM events,
* if the local APIC is enabled.
*/
static int __init apm_kills_local_apic(struct dmi_blacklist *d)
{
#ifdef CONFIG_X86_LOCAL_APIC
extern int dont_enable_local_apic;
if (apm_info.bios.version && !dont_enable_local_apic) {
dont_enable_local_apic = 1;
printk(KERN_WARNING "%s with broken BIOS detected. "
"Refusing to enable the local APIC.\n",
d->ident);
}
#endif
return 0;
}
/*
* The Intel AL440LX mainboard will hang randomly if the local APIC
* timer is running and the APM BIOS hasn't been disabled.
*/
static int __init apm_kills_local_apic_timer(struct dmi_blacklist *d)
{
#ifdef CONFIG_X86_LOCAL_APIC
extern int dont_use_local_apic_timer;
if (apm_info.bios.version && !dont_use_local_apic_timer) {
dont_use_local_apic_timer = 1;
printk(KERN_WARNING "%s with broken BIOS detected. "
"The local APIC timer will not be used.\n",
d->ident);
}
#endif
return 0;
}
/*
* Don't access SMBus on IBM systems which get corrupted eeproms
*/
......@@ -743,16 +706,6 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
NO_MATCH, NO_MATCH
} },
{ apm_kills_local_apic, "Microstar 6163", {
MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
MATCH(DMI_BOARD_NAME, "MS-6163"),
NO_MATCH, NO_MATCH } },
{ apm_kills_local_apic_timer, "Intel AL440LX", {
MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
MATCH(DMI_BOARD_NAME, "AL440LX"),
NO_MATCH, NO_MATCH } },
/* Problem Intel 440GX bioses */
{ broken_pirq, "SABR1 Bios", { /* Bad $PIR */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment