ACPI : Use RSDT instead of XSDT by adding boot option of "acpi=rsdt"

On some boxes there exist both RSDT and XSDT table. But unfortunately
sometimes there exists the following error when XSDT table is used:
   a. 32/64X address mismatch
   b. The 32/64X FACS address mismatch

   In such case the boot option of "acpi=rsdt" is provided so that
RSDT is tried instead of XSDT table when the system can't work well.

http://bugzilla.kernel.org/show_bug.cgi?id=8246

Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
cc:Thomas Renninger <trenn@suse.de>
Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
Zhao Yakui 2008-12-17 16:55:18 +08:00 committed by Len Brown
parent 13b40a1a06
commit 237889bf0a
5 changed files with 10 additions and 2 deletions

View File

@ -139,6 +139,7 @@ and is between 256 and 4096 characters. It is defined in the file
ht -- run only enough ACPI to enable Hyper Threading ht -- run only enough ACPI to enable Hyper Threading
strict -- Be less tolerant of platforms that are not strict -- Be less tolerant of platforms that are not
strictly ACPI specification compliant. strictly ACPI specification compliant.
rsdt -- prefer RSDT over (default) XSDT
See also Documentation/power/pm.txt, pci=noacpi See also Documentation/power/pm.txt, pci=noacpi

View File

@ -65,6 +65,7 @@ EXPORT_SYMBOL(pm_idle);
void (*pm_power_off) (void); void (*pm_power_off) (void);
EXPORT_SYMBOL(pm_power_off); EXPORT_SYMBOL(pm_power_off);
u32 acpi_rsdt_forced;
unsigned int acpi_cpei_override; unsigned int acpi_cpei_override;
unsigned int acpi_cpei_phys_cpuid; unsigned int acpi_cpei_phys_cpuid;

View File

@ -47,7 +47,7 @@
#endif #endif
static int __initdata acpi_force = 0; static int __initdata acpi_force = 0;
u32 acpi_rsdt_forced;
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
int acpi_disabled = 0; int acpi_disabled = 0;
#else #else
@ -1783,6 +1783,10 @@ static int __init parse_acpi(char *arg)
disable_acpi(); disable_acpi();
acpi_ht = 1; acpi_ht = 1;
} }
/* acpi=rsdt use RSDT instead of XSDT */
else if (strcmp(arg, "rsdt") == 0) {
acpi_rsdt_forced = 1;
}
/* "acpi=noirq" disables ACPI interrupt routing */ /* "acpi=noirq" disables ACPI interrupt routing */
else if (strcmp(arg, "noirq") == 0) { else if (strcmp(arg, "noirq") == 0) {
acpi_noirq_set(); acpi_noirq_set();

View File

@ -420,7 +420,8 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags)
/* Differentiate between RSDT and XSDT root tables */ /* Differentiate between RSDT and XSDT root tables */
if (rsdp->revision > 1 && rsdp->xsdt_physical_address) { if (rsdp->revision > 1 && rsdp->xsdt_physical_address
&& !acpi_rsdt_forced) {
/* /*
* Root table is an XSDT (64-bit physical addresses). We must use the * Root table is an XSDT (64-bit physical addresses). We must use the
* XSDT if the revision is > 1 and the XSDT pointer is present, as per * XSDT if the revision is > 1 and the XSDT pointer is present, as per

View File

@ -48,6 +48,7 @@
#include "actypes.h" #include "actypes.h"
#include "actbl.h" #include "actbl.h"
extern u32 acpi_rsdt_forced;
/* /*
* Global interfaces * Global interfaces
*/ */