ACPI : Use RSDT instead of XSDT by adding boot option of "acpi=rsdt"
authorZhao Yakui <yakui.zhao@intel.com>
Wed, 17 Dec 2008 08:55:18 +0000 (16:55 +0800)
committerLen Brown <len.brown@intel.com>
Fri, 9 Jan 2009 06:41:58 +0000 (01:41 -0500)
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>
Documentation/kernel-parameters.txt
arch/ia64/kernel/acpi.c
arch/x86/kernel/acpi/boot.c
drivers/acpi/tables/tbutils.c
include/acpi/acpixf.h

index c9115c1..136f028 100644 (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
                        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
 
index bd7acc7..c19b686 100644 (file)
@@ -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;
 
index 4c51a2f..db1a90a 100644 (file)
@@ -47,7 +47,7 @@
 #endif
 
 static int __initdata acpi_force = 0;
-
+u32 acpi_rsdt_forced;
 #ifdef CONFIG_ACPI
 int acpi_disabled = 0;
 #else
@@ -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();
index 0cc92ef..da9f240 100644 (file)
@@ -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
index 33bc0e3..05d2614 100644 (file)
@@ -48,6 +48,7 @@
 #include "actypes.h"
 #include "actbl.h"
 
+extern u32 acpi_rsdt_forced;
 /*
  * Global interfaces
  */