ACPICA: clear fields reserved before FADT r3
authorBob Moore <robert.moore@intel.com>
Sun, 29 Apr 2007 00:53:50 +0000 (20:53 -0400)
committerLen Brown <len.brown@intel.com>
Sun, 29 Apr 2007 00:55:06 +0000 (20:55 -0400)
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>
drivers/acpi/tables/tbfadt.c

index 807c7116e94b8eaa19471ce66ab4196e0ef66c06..1db833eb2417c5988890dc8ce4b62bed764e0d45 100644 (file)
@@ -347,6 +347,18 @@ static void acpi_tb_convert_fadt(void)
                acpi_gbl_xpm1b_enable.space_id = acpi_gbl_FADT.xpm1a_event_block.space_id;
 
        }
+
+       /*
+        * For ACPI 1.0 FADTs, ensure that reserved fields (which should be zero)
+        * are indeed zero. This will workaround BIOSs that inadvertently placed
+        * values in these fields.
+        */
+       if (acpi_gbl_FADT.header.revision < 3) {
+               acpi_gbl_FADT.preferred_profile = 0;
+               acpi_gbl_FADT.pstate_control = 0;
+               acpi_gbl_FADT.cst_control = 0;
+               acpi_gbl_FADT.boot_flags = 0;
+       }
 }
 
 /******************************************************************************