ACPICA: New common routine for creating and verifying a local FADT.
authorBob Moore <robert.moore@intel.com>
Fri, 2 Feb 2007 16:48:20 +0000 (19:48 +0300)
committerLen Brown <len.brown@intel.com>
Sat, 3 Feb 2007 02:14:25 +0000 (21:14 -0500)
Signed-off-by: Alexey Starikovskiy <alexey.y.starikovskiy@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/tables/tbfadt.c
include/acpi/actables.h

index 8816bab0fe0e73912f409e5c3e0e46883466a987..31a4a00d2fd361d57b6b5cf390ffa05166b4ba39 100644 (file)
@@ -52,6 +52,10 @@ static void inline
 acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
                             u8 bit_width, u64 address);
 
+static void acpi_tb_convert_fadt(void);
+
+static void acpi_tb_validate_fadt(void);
+
 /* Table for conversion of FADT to common internal format and FADT validation */
 
 typedef struct acpi_fadt_info {
@@ -178,13 +182,47 @@ void acpi_tb_parse_fadt(acpi_native_uint table_index, u8 flags)
         */
        (void)acpi_tb_verify_checksum(table, length);
 
+       /* Obtain a local copy of the FADT in common ACPI 2.0+ format */
+
+       acpi_tb_create_local_fadt(table, length);
+
+       /* All done with the real FADT, unmap it */
+
+       acpi_os_unmap_memory(table, length);
+
+       /* Obtain the DSDT and FACS tables via their addresses within the FADT */
+
+       acpi_tb_install_table((acpi_physical_address) acpi_gbl_FADT.Xdsdt,
+                             flags, ACPI_SIG_DSDT, ACPI_TABLE_INDEX_DSDT);
+
+       acpi_tb_install_table((acpi_physical_address) acpi_gbl_FADT.Xfacs,
+                             flags, ACPI_SIG_FACS, ACPI_TABLE_INDEX_FACS);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_tb_create_local_fadt
+ *
+ * PARAMETERS:  Table               - Pointer to BIOS FADT
+ *              Length              - Length of the table
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Get a local copy of the FADT and convert it to a common format.
+ *              Performs validation on some important FADT fields.
+ *
+ ******************************************************************************/
+
+void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length)
+{
+
        /*
-        * If the FADT is larger than what we know about, we have a problem.
+        * Check if the FADT is larger than what we know about (ACPI 2.0 version).
         * Truncate the table, but make some noise.
         */
        if (length > sizeof(struct acpi_table_fadt)) {
                ACPI_WARNING((AE_INFO,
-                             "FADT (revision %u) is too large, truncating length 0x%X to 0x%X",
+                             "FADT (revision %u) is longer than ACPI 2.0 version, truncating length 0x%X to 0x%X",
                              table->revision, length,
                              sizeof(struct acpi_table_fadt)));
        }
@@ -192,27 +230,16 @@ void acpi_tb_parse_fadt(acpi_native_uint table_index, u8 flags)
        /* Copy the entire FADT locally. Zero first for tb_convert_fadt */
 
        ACPI_MEMSET(&acpi_gbl_FADT, 0, sizeof(struct acpi_table_fadt));
+
        ACPI_MEMCPY(&acpi_gbl_FADT, table,
                    ACPI_MIN(length, sizeof(struct acpi_table_fadt)));
 
-       /* All done with the real FADT, unmap it */
-
-       acpi_os_unmap_memory(table, length);
-
        /*
         * 1) Convert the local copy of the FADT to the common internal format
         * 2) Validate some of the important values within the FADT
         */
        acpi_tb_convert_fadt();
-       acpi_tb_validate_fadt(&acpi_gbl_FADT);
-
-       /* Obtain the DSDT and FACS tables via their addresses within the FADT */
-
-       acpi_tb_install_table((acpi_physical_address) acpi_gbl_FADT.Xdsdt,
-                             flags, ACPI_SIG_DSDT, ACPI_TABLE_INDEX_DSDT);
-
-       acpi_tb_install_table((acpi_physical_address) acpi_gbl_FADT.Xfacs,
-                             flags, ACPI_SIG_FACS, ACPI_TABLE_INDEX_FACS);
+       acpi_tb_validate_fadt();
 }
 
 /*******************************************************************************
@@ -244,7 +271,7 @@ void acpi_tb_parse_fadt(acpi_native_uint table_index, u8 flags)
  *
  ******************************************************************************/
 
-void acpi_tb_convert_fadt(void)
+static void acpi_tb_convert_fadt(void)
 {
        u8 pm1_register_length;
        struct acpi_generic_address *target;
@@ -337,7 +364,7 @@ void acpi_tb_convert_fadt(void)
  *
  ******************************************************************************/
 
-void acpi_tb_validate_fadt(struct acpi_table_fadt *table)
+static void acpi_tb_validate_fadt(void)
 {
        u32 *address32;
        struct acpi_generic_address *address64;
@@ -351,10 +378,14 @@ void acpi_tb_validate_fadt(struct acpi_table_fadt *table)
                /* Generate pointers to the 32-bit and 64-bit addresses and get the length */
 
                address64 =
-                   ACPI_ADD_PTR(struct acpi_generic_address, table,
+                   ACPI_ADD_PTR(struct acpi_generic_address, &acpi_gbl_FADT,
                                 fadt_info_table[i].target);
-               address32 = ACPI_ADD_PTR(u32, table, fadt_info_table[i].source);
-               length = *ACPI_ADD_PTR(u8, table, fadt_info_table[i].length);
+               address32 =
+                   ACPI_ADD_PTR(u32, &acpi_gbl_FADT,
+                                fadt_info_table[i].source);
+               length =
+                   *ACPI_ADD_PTR(u8, &acpi_gbl_FADT,
+                                 fadt_info_table[i].length);
 
                if (fadt_info_table[i].type & ACPI_FADT_REQUIRED) {
                        /*
index 65a69cab9db23a195cd99ce0b46c3efe5a2e499e..4079f8a0ea22ceab83b72b3cf745f495a97bb0d7 100644 (file)
@@ -51,9 +51,7 @@ acpi_status acpi_allocate_root_table(u32 initial_table_count);
  */
 void acpi_tb_parse_fadt(acpi_native_uint table_index, u8 flags);
 
-void acpi_tb_convert_fadt(void);
-
-void acpi_tb_validate_fadt(struct acpi_table_fadt *table);
+void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length);
 
 /*
  * tbfind - find ACPI table