diff options
author | Julian Anastasov <ja@ssi.bg> | 2012-02-23 15:40:43 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2012-03-21 00:47:11 -0400 |
commit | 3e80acd1af40fcd91a200b0416a7616b20c5d647 (patch) | |
tree | 18e99ac0992083ce5fd150243fb713941204ea4d /drivers/acpi/acpica | |
parent | c16fa4f2ad19908a47c63d8fa436a1178438c7e7 (diff) |
ACPICA: Fix regression in FADT revision checks
commit 64b3db22c04586997ab4be46dd5a5b99f8a2d390 (2.6.39),
"Remove use of unreliable FADT revision field" causes regression
for old P4 systems because now cst_control and other fields are
not reset to 0.
The effect is that acpi_processor_power_init will notice
cst_control != 0 and a write to CST_CNT register is performed
that should not happen. As result, the system oopses after the
"No _CST, giving up" message, sometimes in acpi_ns_internalize_name,
sometimes in acpi_ns_get_type, usually at random places. May be
during migration to CPU 1 in acpi_processor_get_throttling.
Every one of these settings help to avoid this problem:
- acpi=off
- processor.nocst=1
- maxcpus=1
The fix is to update acpi_gbl_FADT.header.length after
the original value is used to check for old revisions.
https://bugzilla.kernel.org/show_bug.cgi?id=42700
https://bugzilla.redhat.com/show_bug.cgi?id=727865
Signed-off-by: Julian Anastasov <ja@ssi.bg>
Acked-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/acpica')
-rw-r--r-- | drivers/acpi/acpica/tbfadt.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/acpi/acpica/tbfadt.c b/drivers/acpi/acpica/tbfadt.c index c5d870406f41..4c9c760db4a4 100644 --- a/drivers/acpi/acpica/tbfadt.c +++ b/drivers/acpi/acpica/tbfadt.c | |||
@@ -363,10 +363,6 @@ static void acpi_tb_convert_fadt(void) | |||
363 | u32 address32; | 363 | u32 address32; |
364 | u32 i; | 364 | u32 i; |
365 | 365 | ||
366 | /* Update the local FADT table header length */ | ||
367 | |||
368 | acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt); | ||
369 | |||
370 | /* | 366 | /* |
371 | * Expand the 32-bit FACS and DSDT addresses to 64-bit as necessary. | 367 | * Expand the 32-bit FACS and DSDT addresses to 64-bit as necessary. |
372 | * Later code will always use the X 64-bit field. Also, check for an | 368 | * Later code will always use the X 64-bit field. Also, check for an |
@@ -408,6 +404,10 @@ static void acpi_tb_convert_fadt(void) | |||
408 | acpi_gbl_FADT.boot_flags = 0; | 404 | acpi_gbl_FADT.boot_flags = 0; |
409 | } | 405 | } |
410 | 406 | ||
407 | /* Update the local FADT table header length */ | ||
408 | |||
409 | acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt); | ||
410 | |||
411 | /* | 411 | /* |
412 | * Expand the ACPI 1.0 32-bit addresses to the ACPI 2.0 64-bit "X" | 412 | * Expand the ACPI 1.0 32-bit addresses to the ACPI 2.0 64-bit "X" |
413 | * generic address structures as necessary. Later code will always use | 413 | * generic address structures as necessary. Later code will always use |