ACPICA: Emit warning if two FACS or DSDT tables found in the FADT
authorBob Moore <robert.moore@intel.com>
Wed, 12 Nov 2008 07:23:20 +0000 (15:23 +0800)
committerLen Brown <len.brown@intel.com>
Tue, 30 Dec 2008 03:38:37 +0000 (22:38 -0500)
Checks if there are two valid but different addresses for the
FACS and DSDT within the FADT (mismatch between the 32-bit and
64-bit fields.)

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/tables/tbfadt.c

index d2e60a8fa9a58341dc2501c23f71d17ac96fffc3..14661a861c5881100e2914318d4395a7e5c98b8d 100644 (file)
@@ -286,14 +286,27 @@ static void acpi_tb_convert_fadt(void)
 
        acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt);
 
-       /* Expand the 32-bit FACS and DSDT addresses to 64-bit as necessary */
-
+       /*
+        * Expand the 32-bit FACS and DSDT addresses to 64-bit as necessary.
+        * Later code will always use the X 64-bit field. Also, check for an
+        * address mismatch between the 32-bit and 64-bit address fields
+        * (FIRMWARE_CTRL/X_FIRMWARE_CTRL, DSDT/X_DSDT) which would indicate
+        * the presence of two FACS or two DSDT tables.
+        */
        if (!acpi_gbl_FADT.Xfacs) {
                acpi_gbl_FADT.Xfacs = (u64) acpi_gbl_FADT.facs;
+       } else if (acpi_gbl_FADT.facs &&
+                  (acpi_gbl_FADT.Xfacs != (u64) acpi_gbl_FADT.facs)) {
+               ACPI_WARNING((AE_INFO,
+                   "32/64 FACS address mismatch in FADT - two FACS tables!"));
        }
 
        if (!acpi_gbl_FADT.Xdsdt) {
                acpi_gbl_FADT.Xdsdt = (u64) acpi_gbl_FADT.dsdt;
+       } else if (acpi_gbl_FADT.dsdt &&
+                  (acpi_gbl_FADT.Xdsdt != (u64) acpi_gbl_FADT.dsdt)) {
+               ACPI_WARNING((AE_INFO,
+                   "32/64 DSDT address mismatch in FADT - two DSDT tables!"));
        }
 
        /*