aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhao Yakui <yakui.zhao@intel.com>2008-12-17 03:55:18 -0500
committerLen Brown <len.brown@intel.com>2009-01-09 01:41:58 -0500
commit237889bf0a62f1399fb2ba0c2a259e6a96597131 (patch)
tree248d6bf6e4e60c8760b9a2b6ba2e788b70e24c76
parent13b40a1a065824d2d4e55c8b48ea9f3f9d162929 (diff)
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>
-rw-r--r--Documentation/kernel-parameters.txt1
-rw-r--r--arch/ia64/kernel/acpi.c1
-rw-r--r--arch/x86/kernel/acpi/boot.c6
-rw-r--r--drivers/acpi/tables/tbutils.c3
-rw-r--r--include/acpi/acpixf.h1
5 files changed, 10 insertions, 2 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index c9115c1b672c..136f02842de9 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -139,6 +139,7 @@ and is between 256 and 4096 characters. It is defined in the file
139 ht -- run only enough ACPI to enable Hyper Threading 139 ht -- run only enough ACPI to enable Hyper Threading
140 strict -- Be less tolerant of platforms that are not 140 strict -- Be less tolerant of platforms that are not
141 strictly ACPI specification compliant. 141 strictly ACPI specification compliant.
142 rsdt -- prefer RSDT over (default) XSDT
142 143
143 See also Documentation/power/pm.txt, pci=noacpi 144 See also Documentation/power/pm.txt, pci=noacpi
144 145
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c
index bd7acc71e8a9..c19b686db9b8 100644
--- a/arch/ia64/kernel/acpi.c
+++ b/arch/ia64/kernel/acpi.c
@@ -65,6 +65,7 @@ EXPORT_SYMBOL(pm_idle);
65void (*pm_power_off) (void); 65void (*pm_power_off) (void);
66EXPORT_SYMBOL(pm_power_off); 66EXPORT_SYMBOL(pm_power_off);
67 67
68u32 acpi_rsdt_forced;
68unsigned int acpi_cpei_override; 69unsigned int acpi_cpei_override;
69unsigned int acpi_cpei_phys_cpuid; 70unsigned int acpi_cpei_phys_cpuid;
70 71
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 4c51a2f8fd31..db1a90a76b3e 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -47,7 +47,7 @@
47#endif 47#endif
48 48
49static int __initdata acpi_force = 0; 49static int __initdata acpi_force = 0;
50 50u32 acpi_rsdt_forced;
51#ifdef CONFIG_ACPI 51#ifdef CONFIG_ACPI
52int acpi_disabled = 0; 52int acpi_disabled = 0;
53#else 53#else
@@ -1783,6 +1783,10 @@ static int __init parse_acpi(char *arg)
1783 disable_acpi(); 1783 disable_acpi();
1784 acpi_ht = 1; 1784 acpi_ht = 1;
1785 } 1785 }
1786 /* acpi=rsdt use RSDT instead of XSDT */
1787 else if (strcmp(arg, "rsdt") == 0) {
1788 acpi_rsdt_forced = 1;
1789 }
1786 /* "acpi=noirq" disables ACPI interrupt routing */ 1790 /* "acpi=noirq" disables ACPI interrupt routing */
1787 else if (strcmp(arg, "noirq") == 0) { 1791 else if (strcmp(arg, "noirq") == 0) {
1788 acpi_noirq_set(); 1792 acpi_noirq_set();
diff --git a/drivers/acpi/tables/tbutils.c b/drivers/acpi/tables/tbutils.c
index 0cc92ef5236f..da9f240186e8 100644
--- a/drivers/acpi/tables/tbutils.c
+++ b/drivers/acpi/tables/tbutils.c
@@ -420,7 +420,8 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags)
420 420
421 /* Differentiate between RSDT and XSDT root tables */ 421 /* Differentiate between RSDT and XSDT root tables */
422 422
423 if (rsdp->revision > 1 && rsdp->xsdt_physical_address) { 423 if (rsdp->revision > 1 && rsdp->xsdt_physical_address
424 && !acpi_rsdt_forced) {
424 /* 425 /*
425 * Root table is an XSDT (64-bit physical addresses). We must use the 426 * Root table is an XSDT (64-bit physical addresses). We must use the
426 * XSDT if the revision is > 1 and the XSDT pointer is present, as per 427 * XSDT if the revision is > 1 and the XSDT pointer is present, as per
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h
index 33bc0e3b1954..05d2614e0078 100644
--- a/include/acpi/acpixf.h
+++ b/include/acpi/acpixf.h
@@ -48,6 +48,7 @@
48#include "actypes.h" 48#include "actypes.h"
49#include "actbl.h" 49#include "actbl.h"
50 50
51extern u32 acpi_rsdt_forced;
51/* 52/*
52 * Global interfaces 53 * Global interfaces
53 */ 54 */