diff options
author | Zhao Yakui <yakui.zhao@intel.com> | 2008-12-17 03:55:18 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2009-01-09 01:41:58 -0500 |
commit | 237889bf0a62f1399fb2ba0c2a259e6a96597131 (patch) | |
tree | 248d6bf6e4e60c8760b9a2b6ba2e788b70e24c76 | |
parent | 13b40a1a065824d2d4e55c8b48ea9f3f9d162929 (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.txt | 1 | ||||
-rw-r--r-- | arch/ia64/kernel/acpi.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/acpi/boot.c | 6 | ||||
-rw-r--r-- | drivers/acpi/tables/tbutils.c | 3 | ||||
-rw-r--r-- | include/acpi/acpixf.h | 1 |
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); | |||
65 | void (*pm_power_off) (void); | 65 | void (*pm_power_off) (void); |
66 | EXPORT_SYMBOL(pm_power_off); | 66 | EXPORT_SYMBOL(pm_power_off); |
67 | 67 | ||
68 | u32 acpi_rsdt_forced; | ||
68 | unsigned int acpi_cpei_override; | 69 | unsigned int acpi_cpei_override; |
69 | unsigned int acpi_cpei_phys_cpuid; | 70 | unsigned 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 | ||
49 | static int __initdata acpi_force = 0; | 49 | static int __initdata acpi_force = 0; |
50 | 50 | u32 acpi_rsdt_forced; | |
51 | #ifdef CONFIG_ACPI | 51 | #ifdef CONFIG_ACPI |
52 | int acpi_disabled = 0; | 52 | int 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 | ||
51 | extern u32 acpi_rsdt_forced; | ||
51 | /* | 52 | /* |
52 | * Global interfaces | 53 | * Global interfaces |
53 | */ | 54 | */ |