]> err.no Git - linux-2.6/commitdiff
ACPICA: Miscellaneous table manager updates and optimizations
authorAlexey Starikovskiy <alexey.y.starikovskiy@intel.com>
Fri, 2 Feb 2007 16:48:22 +0000 (19:48 +0300)
committerLen Brown <len.brown@intel.com>
Sat, 3 Feb 2007 02:14:29 +0000 (21:14 -0500)
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/blacklist.c
drivers/acpi/executer/exconfig.c
drivers/acpi/tables/tbinstal.c
drivers/acpi/tables/tbutils.c
drivers/acpi/tables/tbxface.c
include/acpi/acpixf.h
include/acpi/actables.h

index c8f4cac9d84d4aefe21a6f97bef9e705203fd08d..f289fd41e77d5ef1bdb8d4d44359b08a43651930 100644 (file)
@@ -103,7 +103,7 @@ int __init acpi_blacklisted(void)
 {
        int i = 0;
        int blacklisted = 0;
-       struct acpi_table_header *table_header;
+       struct acpi_table_header table_header;
 
        while (acpi_blacklist[i].oem_id[0] != '\0') {
                if (acpi_get_table_header(acpi_blacklist[i].table, 0, &table_header)) {
@@ -111,13 +111,13 @@ int __init acpi_blacklisted(void)
                        continue;
                }
 
-               if (strncmp(acpi_blacklist[i].oem_id, table_header->oem_id, 6)) {
+               if (strncmp(acpi_blacklist[i].oem_id, table_header.oem_id, 6)) {
                        i++;
                        continue;
                }
 
                if (strncmp
-                   (acpi_blacklist[i].oem_table_id, table_header->oem_table_id,
+                   (acpi_blacklist[i].oem_table_id, table_header.oem_table_id,
                     8)) {
                        i++;
                        continue;
@@ -126,14 +126,14 @@ int __init acpi_blacklisted(void)
                if ((acpi_blacklist[i].oem_revision_predicate == all_versions)
                    || (acpi_blacklist[i].oem_revision_predicate ==
                        less_than_or_equal
-                       && table_header->oem_revision <=
+                       && table_header.oem_revision <=
                        acpi_blacklist[i].oem_revision)
                    || (acpi_blacklist[i].oem_revision_predicate ==
                        greater_than_or_equal
-                       && table_header->oem_revision >=
+                       && table_header.oem_revision >=
                        acpi_blacklist[i].oem_revision)
                    || (acpi_blacklist[i].oem_revision_predicate == equal
-                       && table_header->oem_revision ==
+                       && table_header.oem_revision ==
                        acpi_blacklist[i].oem_revision)) {
 
                        printk(KERN_ERR PREFIX
index 20a5ab87e88f6fc978c0813fb31a96ee8a88033f..7aa18f93f95dd6d68be669aee944743b34c6bf96 100644 (file)
@@ -279,13 +279,14 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
        acpi_native_uint table_index;
        acpi_physical_address address;
        struct acpi_table_header table_header;
+       struct acpi_table_desc table_desc;
        acpi_integer temp;
        u32 i;
 
        ACPI_FUNCTION_TRACE(ex_load_op);
 
        /* Object can be either an op_region or a Field */
-
+       ACPI_MEMSET(&table_desc, 0, sizeof(struct acpi_table_desc));
        switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
        case ACPI_TYPE_REGION:
 
@@ -408,10 +409,13 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
                goto cleanup;
        }
 
+       table_desc.pointer = table_ptr;
+       table_desc.length = table_ptr->length;
+       table_desc.flags = ACPI_TABLE_ORIGIN_ALLOCATED;
        /*
         * Install the new table into the local data structures
         */
-       status = acpi_tb_add_table(table_ptr, &table_index);
+       status = acpi_tb_add_table(&table_desc, &table_index);
        if (ACPI_FAILURE(status)) {
                goto cleanup;
        }
index 9e0b3ce0d8e572985065cee2ef2310b0bf3acb41..b07d9c8330b3f968116e2975cb176ec618a7cd3c 100644 (file)
@@ -61,16 +61,19 @@ ACPI_MODULE_NAME("tbinstal")
  *****************************************************************************/
 acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc)
 {
-       acpi_status status;
+       acpi_status status = AE_OK;
 
        ACPI_FUNCTION_TRACE(tb_verify_table);
 
        /* Map the table if necessary */
 
        if (!table_desc->pointer) {
-               table_desc->pointer =
-                   acpi_tb_map(table_desc->address, table_desc->length,
-                               table_desc->flags & ACPI_TABLE_ORIGIN_MASK);
+               if ((table_desc->flags & ACPI_TABLE_ORIGIN_MASK) ==
+                   ACPI_TABLE_ORIGIN_MAPPED) {
+                       table_desc->pointer =
+                           acpi_os_map_memory(table_desc->address,
+                                              table_desc->length);
+               }
                if (!table_desc->pointer) {
                        return_ACPI_STATUS(AE_NO_MEMORY);
                }
@@ -78,14 +81,15 @@ acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc)
 
        /* FACS is the odd table, has no standard ACPI header and no checksum */
 
-       if (ACPI_COMPARE_NAME(&(table_desc->signature), ACPI_SIG_FACS)) {
-               return_ACPI_STATUS(AE_OK);
-       }
+       if (!ACPI_COMPARE_NAME(&table_desc->signature, ACPI_SIG_FACS)) {
 
-       /* Always calculate checksum, ignore bad checksum if requested */
+               /* Always calculate checksum, ignore bad checksum if requested */
+
+               status =
+                   acpi_tb_verify_checksum(table_desc->pointer,
+                                           table_desc->length);
+       }
 
-       status =
-           acpi_tb_verify_checksum(table_desc->pointer, table_desc->length);
        return_ACPI_STATUS(status);
 }
 
@@ -93,7 +97,7 @@ acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc)
  *
  * FUNCTION:    acpi_tb_add_table
  *
- * PARAMETERS:  Table               - Pointer to the table header
+ * PARAMETERS:  table_desc          - Table descriptor
  *              table_index         - Where the table index is returned
  *
  * RETURN:      Status
@@ -103,7 +107,7 @@ acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc)
  ******************************************************************************/
 
 acpi_status
-acpi_tb_add_table(struct acpi_table_header *table,
+acpi_tb_add_table(struct acpi_table_desc *table_desc,
                  acpi_native_uint * table_index)
 {
        acpi_native_uint i;
@@ -112,6 +116,25 @@ acpi_tb_add_table(struct acpi_table_header *table,
 
        ACPI_FUNCTION_TRACE(tb_add_table);
 
+       if (!table_desc->pointer) {
+               status = acpi_tb_verify_table(table_desc);
+               if (ACPI_FAILURE(status) || !table_desc->pointer) {
+                       return_ACPI_STATUS(status);
+               }
+       }
+
+       /* The table must be either an SSDT or a PSDT */
+
+       if ((!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_PSDT))
+           &&
+           (!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_SSDT)))
+       {
+               ACPI_ERROR((AE_INFO,
+                           "Table has invalid signature [%4.4s], must be SSDT or PSDT",
+                           table_desc->pointer->signature));
+               return_ACPI_STATUS(AE_BAD_SIGNATURE);
+       }
+
        (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
 
        /* Check if table is already registered */
@@ -127,18 +150,17 @@ acpi_tb_add_table(struct acpi_table_header *table,
                        }
                }
 
-               length = ACPI_MIN(table->length,
-                                 acpi_gbl_root_table_list.tables[i].pointer->
-                                 length);
-               if (ACPI_MEMCMP
-                   (table, acpi_gbl_root_table_list.tables[i].pointer,
-                    length)) {
+               length = ACPI_MIN(table_desc->length,
+                                 acpi_gbl_root_table_list.tables[i].length);
+               if (ACPI_MEMCMP(table_desc->pointer,
+                               acpi_gbl_root_table_list.tables[i].pointer,
+                               length)) {
                        continue;
                }
 
                /* Table is already registered */
 
-               ACPI_FREE(table);
+               acpi_tb_delete_table(table_desc);
                *table_index = i;
                goto release;
        }
@@ -146,14 +168,14 @@ acpi_tb_add_table(struct acpi_table_header *table,
        /*
         * Add the table to the global table list
         */
-       status = acpi_tb_store_table(ACPI_TO_INTEGER(table),
-                                    table, table->length,
-                                    ACPI_TABLE_ORIGIN_ALLOCATED, table_index);
+       status = acpi_tb_store_table(table_desc->address, table_desc->pointer,
+                                    table_desc->length, table_desc->flags,
+                                    table_index);
        if (ACPI_FAILURE(status)) {
                goto release;
        }
 
-       acpi_tb_print_table_header(0, table);
+       acpi_tb_print_table_header(table_desc->address, table_desc->pointer);
 
       release:
        (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
@@ -282,25 +304,20 @@ acpi_tb_store_table(acpi_physical_address address,
  *
  ******************************************************************************/
 
-void acpi_tb_delete_table(acpi_native_uint table_index)
+void acpi_tb_delete_table(struct acpi_table_desc *table_desc)
 {
-       struct acpi_table_desc *table_desc;
-
-       /* table_index assumed valid */
-
-       table_desc = &acpi_gbl_root_table_list.tables[table_index];
-
        /* Table must be mapped or allocated */
-
        if (!table_desc->pointer) {
                return;
        }
-
-       if (table_desc->flags & ACPI_TABLE_ORIGIN_MAPPED) {
-               acpi_tb_unmap(table_desc->pointer, table_desc->length,
-                             table_desc->flags & ACPI_TABLE_ORIGIN_MASK);
-       } else if (table_desc->flags & ACPI_TABLE_ORIGIN_ALLOCATED) {
+       switch (table_desc->flags & ACPI_TABLE_ORIGIN_MASK) {
+       case ACPI_TABLE_ORIGIN_MAPPED:
+               acpi_os_unmap_memory(table_desc->pointer, table_desc->length);
+               break;
+       case ACPI_TABLE_ORIGIN_ALLOCATED:
                ACPI_FREE(table_desc->pointer);
+               break;
+       default:;
        }
 
        table_desc->pointer = NULL;
@@ -329,7 +346,7 @@ void acpi_tb_terminate(void)
        /* Delete the individual tables */
 
        for (i = 0; i < acpi_gbl_root_table_list.count; ++i) {
-               acpi_tb_delete_table(i);
+               acpi_tb_delete_table(&acpi_gbl_root_table_list.tables[i]);
        }
 
        /*
index 1033748e73ec8c4669224d6b84b3db15c09facc7..0cb743962fafe8db48bd200a4e3cee8452ecbba4 100644 (file)
@@ -462,49 +462,3 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags)
 
        return_ACPI_STATUS(AE_OK);
 }
-
-/******************************************************************************
- *
- * FUNCTION:    acpi_tb_map
- *
- * PARAMETERS:  Address             - Address to be mapped
- *              Length              - Length to be mapped
- *              Flags               - Logical or physical addressing mode
- *
- * RETURN:      Pointer to mapped region
- *
- * DESCRIPTION: Maps memory according to flag
- *
- *****************************************************************************/
-
-void *acpi_tb_map(acpi_physical_address address, u32 length, u32 flags)
-{
-
-       if (flags == ACPI_TABLE_ORIGIN_MAPPED) {
-               return (acpi_os_map_memory(address, length));
-       } else {
-               return (ACPI_CAST_PTR(void, address));
-       }
-}
-
-/******************************************************************************
- *
- * FUNCTION:    acpi_tb_unmap
- *
- * PARAMETERS:  Pointer             - To mapped region
- *              Length              - Length to be unmapped
- *              Flags               - Logical or physical addressing mode
- *
- * RETURN:      None
- *
- * DESCRIPTION: Unmaps memory according to flag
- *
- *****************************************************************************/
-
-void acpi_tb_unmap(void *pointer, u32 length, u32 flags)
-{
-
-       if (flags == ACPI_TABLE_ORIGIN_MAPPED) {
-               acpi_os_unmap_memory(pointer, length);
-       }
-}
index 9d451e8a4e46eb30674edec1b9d7a65c739fc17d..77224bd0667c56f7ecb24ad2965e4dfbed470a8b 100644 (file)
@@ -220,16 +220,25 @@ acpi_status acpi_load_table(struct acpi_table_header *table_ptr)
 {
        acpi_status status;
        acpi_native_uint table_index;
+       struct acpi_table_desc table_desc;
+
+       if (!table_ptr)
+               return AE_BAD_PARAMETER;
+
+       ACPI_MEMSET(&table_desc, 0, sizeof(struct acpi_table_desc));
+       table_desc.pointer = table_ptr;
+       table_desc.length = table_ptr->length;
+       table_desc.flags = ACPI_TABLE_ORIGIN_UNKNOWN;
 
        /*
         * Install the new table into the local data structures
         */
-       status = acpi_tb_add_table(table_ptr, &table_index);
+       status = acpi_tb_add_table(&table_desc, &table_index);
        if (ACPI_FAILURE(status)) {
-               return_ACPI_STATUS(status);
+               return status;
        }
        status = acpi_ns_load_table(table_index, acpi_gbl_root_node);
-       return_ACPI_STATUS(status);
+       return status;
 }
 
 ACPI_EXPORT_SYMBOL(acpi_load_table)
@@ -240,8 +249,7 @@ ACPI_EXPORT_SYMBOL(acpi_load_table)
  *
  * PARAMETERS:  Signature           - ACPI signature of needed table
  *              Instance            - Which instance (for SSDTs)
- *              out_table_header    - Where the pointer to the table header
- *                                    is returned
+ *              out_table_header    - The pointer to the table header to fill
  *
  * RETURN:      Status and pointer to mapped table header
  *
@@ -254,10 +262,11 @@ ACPI_EXPORT_SYMBOL(acpi_load_table)
 acpi_status
 acpi_get_table_header(char *signature,
                      acpi_native_uint instance,
-                     struct acpi_table_header **out_table_header)
+                     struct acpi_table_header *out_table_header)
 {
        acpi_native_uint i;
        acpi_native_uint j;
+       struct acpi_table_header *header;
 
        /* Parameter validation */
 
@@ -279,16 +288,31 @@ acpi_get_table_header(char *signature,
                        continue;
                }
 
-               *out_table_header =
-                   acpi_tb_map(acpi_gbl_root_table_list.tables[i].address,
-                               (u32) sizeof(struct acpi_table_header),
-                               acpi_gbl_root_table_list.tables[i].
-                               flags & ACPI_TABLE_ORIGIN_MASK);
-
-               if (!(*out_table_header)) {
-                       return (AE_NO_MEMORY);
+               if (!acpi_gbl_root_table_list.tables[i].pointer) {
+                       if ((acpi_gbl_root_table_list.tables[i].
+                            flags & ACPI_TABLE_ORIGIN_MASK) ==
+                           ACPI_TABLE_ORIGIN_MAPPED) {
+                               header =
+                                   acpi_os_map_memory(acpi_gbl_root_table_list.
+                                                      tables[i].address,
+                                                      sizeof(struct
+                                                             acpi_table_header));
+                               if (!header) {
+                                       return AE_NO_MEMORY;
+                               }
+                               ACPI_MEMCPY(out_table_header, header,
+                                           sizeof(struct acpi_table_header));
+                               acpi_os_unmap_memory(header,
+                                                    sizeof(struct
+                                                           acpi_table_header));
+                       } else {
+                               return AE_NOT_FOUND;
+                       }
+               } else {
+                       ACPI_MEMCPY(out_table_header,
+                                   acpi_gbl_root_table_list.tables[i].pointer,
+                                   sizeof(struct acpi_table_header));
                }
-
                return (AE_OK);
        }
 
index 9c26400acc4d75f307a225ef6223697dd15d82b1..918280e823da9e815e0bf2ec31bd25bee5c16ee2 100644 (file)
@@ -109,7 +109,7 @@ acpi_status acpi_unload_table_id(acpi_owner_id id);
 acpi_status
 acpi_get_table_header(acpi_string signature,
                      acpi_native_uint instance,
-                     struct acpi_table_header **out_table_header);
+                     struct acpi_table_header *out_table_header);
 
 acpi_status
 acpi_get_table(acpi_string signature,
index 4079f8a0ea22ceab83b72b3cf745f495a97bb0d7..5ef1b6939370470037c1c1ad0988b0f42bfe63d2 100644 (file)
@@ -69,7 +69,7 @@ acpi_status acpi_tb_resize_root_table_list(void);
 acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc);
 
 acpi_status
-acpi_tb_add_table(struct acpi_table_header *table,
+acpi_tb_add_table(struct acpi_table_desc *table_desc,
                  acpi_native_uint * table_index);
 
 acpi_status
@@ -77,7 +77,7 @@ acpi_tb_store_table(acpi_physical_address address,
                    struct acpi_table_header *table,
                    u32 length, u8 flags, acpi_native_uint * table_index);
 
-void acpi_tb_delete_table(acpi_native_uint table_index);
+void acpi_tb_delete_table(struct acpi_table_desc *table_desc);
 
 void acpi_tb_terminate(void);
 
@@ -113,8 +113,4 @@ acpi_tb_install_table(acpi_physical_address address,
 acpi_status
 acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags);
 
-void *acpi_tb_map(acpi_physical_address address, u32 length, u32 flags);
-
-void acpi_tb_unmap(void *pointer, u32 length, u32 flags);
-
 #endif                         /* __ACTABLES_H__ */