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:
parent
13b40a1a06
commit
237889bf0a
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue