Skip to content

Commit

Permalink
ACPI : Use RSDT instead of XSDT by adding boot option of "acpi=rsdt"
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
yakuizhao authored and lenb committed Jan 9, 2009
1 parent 13b40a1 commit 237889b
Show file tree
Hide file tree
Showing 5 changed files with 10 additions and 2 deletions.
1 change: 1 addition & 0 deletions Documentation/kernel-parameters.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
strict -- Be less tolerant of platforms that are not
strictly ACPI specification compliant.
rsdt -- prefer RSDT over (default) XSDT

See also Documentation/power/pm.txt, pci=noacpi

Expand Down
1 change: 1 addition & 0 deletions arch/ia64/kernel/acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ EXPORT_SYMBOL(pm_idle);
void (*pm_power_off) (void);
EXPORT_SYMBOL(pm_power_off);

u32 acpi_rsdt_forced;
unsigned int acpi_cpei_override;
unsigned int acpi_cpei_phys_cpuid;

Expand Down
6 changes: 5 additions & 1 deletion arch/x86/kernel/acpi/boot.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
#endif

static int __initdata acpi_force = 0;

u32 acpi_rsdt_forced;
#ifdef CONFIG_ACPI
int acpi_disabled = 0;
#else
Expand Down Expand Up @@ -1783,6 +1783,10 @@ static int __init parse_acpi(char *arg)
disable_acpi();
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 */
else if (strcmp(arg, "noirq") == 0) {
acpi_noirq_set();
Expand Down
3 changes: 2 additions & 1 deletion drivers/acpi/tables/tbutils.c
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,8 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags)

/* 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
* XSDT if the revision is > 1 and the XSDT pointer is present, as per
Expand Down
1 change: 1 addition & 0 deletions include/acpi/acpixf.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
#include "actypes.h"
#include "actbl.h"

extern u32 acpi_rsdt_forced;
/*
* Global interfaces
*/
Expand Down

0 comments on commit 237889b

Please sign in to comment.