diff options
author | Bob Moore <robert.moore@intel.com> | 2007-04-28 20:53:50 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2007-04-28 20:55:06 -0400 |
commit | 79fff270026dc46634563a29b99e4034028ee919 (patch) | |
tree | ddc0f97ebc7c756cecbd824b4d0b7162f1e7cb6f | |
parent | de46c33745f5e2ad594c72f2cf5f490861b16ce1 (diff) |
ACPICA: clear fields reserved before FADT r3
Linux-2.6.21 stopped booting on a P4/HT because Linux
wrote the FADT.CST_CNT value to the SMI_CMD.
Apparently this stumbled over some SMM instability,
such as confusing SMM when invoking it from cpu1.
Linux did this because even though the r2 FADT reserves
the CST_CNT field, this BIOS set that field and Linux
used it.
Turns out that up through 2.6.20 we explicitly cleared
cst_control for r2 FADTs. So here we go back to doing that,
plus also clear some additional fields that are reserved
until FADT r3.
http://bugzilla.kernel.org/show_bug.cgi?id=8346
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
-rw-r--r-- | drivers/acpi/tables/tbfadt.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/acpi/tables/tbfadt.c b/drivers/acpi/tables/tbfadt.c index 807c7116e94b..1db833eb2417 100644 --- a/drivers/acpi/tables/tbfadt.c +++ b/drivers/acpi/tables/tbfadt.c | |||
@@ -347,6 +347,18 @@ static void acpi_tb_convert_fadt(void) | |||
347 | acpi_gbl_xpm1b_enable.space_id = acpi_gbl_FADT.xpm1a_event_block.space_id; | 347 | acpi_gbl_xpm1b_enable.space_id = acpi_gbl_FADT.xpm1a_event_block.space_id; |
348 | 348 | ||
349 | } | 349 | } |
350 | |||
351 | /* | ||
352 | * For ACPI 1.0 FADTs, ensure that reserved fields (which should be zero) | ||
353 | * are indeed zero. This will workaround BIOSs that inadvertently placed | ||
354 | * values in these fields. | ||
355 | */ | ||
356 | if (acpi_gbl_FADT.header.revision < 3) { | ||
357 | acpi_gbl_FADT.preferred_profile = 0; | ||
358 | acpi_gbl_FADT.pstate_control = 0; | ||
359 | acpi_gbl_FADT.cst_control = 0; | ||
360 | acpi_gbl_FADT.boot_flags = 0; | ||
361 | } | ||
350 | } | 362 | } |
351 | 363 | ||
352 | /****************************************************************************** | 364 | /****************************************************************************** |