[ACPI] ACPICA 20050815
authorBob Moore <robert.moore@intel.com>
Mon, 15 Aug 2005 11:42:00 +0000 (03:42 -0800)
committerLen Brown <len.brown@intel.com>
Tue, 30 Aug 2005 03:44:25 +0000 (23:44 -0400)
Implemented a full bytewise compare to determine if a table load
request is attempting to load a duplicate table. The compare is
performed if the table signatures and table lengths match. This
will allow different tables with the same OEM Table ID and
revision to be loaded.

Although the BIOS is technically violating the ACPI spec when
this happens -- it does happen -- so Linux must handle it.

Signed-off-by: Robert Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/tables/tbutils.c
drivers/acpi/utilities/utdebug.c
drivers/acpi/utilities/utmisc.c
include/acpi/acconfig.h
include/acpi/acnames.h

index 5bcafebb9ddfe64314e7259b3a94e049b1b4ffe4..4b2fbb592f4933cf8b8138efe64f558c194a96fe 100644 (file)
@@ -80,14 +80,24 @@ acpi_status acpi_tb_is_table_installed(struct acpi_table_desc *new_table_desc)
        /* Examine all installed tables of this type */
 
        while (table_desc) {
-               /* Compare Revision and oem_table_id */
-
+               /*
+                * If the table lengths match, perform a full bytewise compare. This
+                * means that we will allow tables with duplicate oem_table_id(s), as
+                * long as the tables are different in some way.
+                *
+                * Checking if the table has been loaded into the namespace means that
+                * we don't check for duplicate tables during the initial installation
+                * of tables within the RSDT/XSDT.
+                */
                if ((table_desc->loaded_into_namespace) &&
-                   (table_desc->pointer->revision ==
-                    new_table_desc->pointer->revision) &&
-                   (!ACPI_MEMCMP(table_desc->pointer->oem_table_id,
-                                 new_table_desc->pointer->oem_table_id, 8))) {
-                       /* This table is already installed */
+                   (table_desc->pointer->length ==
+                    new_table_desc->pointer->length)
+                   &&
+                   (!ACPI_MEMCMP
+                    ((const char *)table_desc->pointer,
+                     (const char *)new_table_desc->pointer,
+                     (acpi_size) new_table_desc->pointer->length))) {
+                       /* Match: this table is already installed */
 
                        ACPI_DEBUG_PRINT((ACPI_DB_TABLES,
                                          "Table [%4.4s] already installed: Rev %X oem_table_id [%8.8s]\n",
index 081a778aba8804b6f2dd2e16a94aed4113945838..d80e9263993251fc00202730df5ea941551530c0 100644 (file)
@@ -122,13 +122,13 @@ static const char *acpi_ut_trim_function_name(const char *function_name)
 
        /* All Function names are longer than 4 chars, check is safe */
 
-       if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_FUNCTION_PREFIX1) {
+       if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_MIXED) {
                /* This is the case where the original source has not been modified */
 
                return (function_name + 4);
        }
 
-       if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_FUNCTION_PREFIX2) {
+       if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_LOWER) {
                /* This is the case where the source has been 'linuxized' */
 
                return (function_name + 5);
index 474fe7cb6c09fc063b0f8ce635e58b0fdac5eac9..f0275025b718d7c45ce10046e3cf86d75a6392df 100644 (file)
@@ -78,6 +78,10 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
 
        for (i = 0; i < 32; i++) {
                if (!(acpi_gbl_owner_id_mask & (1 << i))) {
+                       ACPI_DEBUG_PRINT((ACPI_DB_VALUES,
+                                         "Current owner_id mask: %8.8X New ID: %2.2X\n",
+                                         acpi_gbl_owner_id_mask, (i + 1)));
+
                        acpi_gbl_owner_id_mask |= (1 << i);
                        *owner_id = (acpi_owner_id) (i + 1);
                        goto exit;
@@ -119,7 +123,7 @@ void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr)
        acpi_owner_id owner_id = *owner_id_ptr;
        acpi_status status;
 
-       ACPI_FUNCTION_TRACE("ut_release_owner_id");
+       ACPI_FUNCTION_TRACE_U32("ut_release_owner_id", owner_id);
 
        /* Always clear the input owner_id (zero is an invalid ID) */
 
index f3810cc5d48ea9f976b66edbbb802e6cefa70abd..73c43a39663b747a6afa6e0abfcd1afc3551b067 100644 (file)
@@ -63,7 +63,7 @@
 
 /* Version string */
 
-#define ACPI_CA_VERSION                 0x20050729
+#define ACPI_CA_VERSION                 0x20050815
 
 /*
  * OS name, used for the _OS object.  The _OS object is essentially obsolete,
index 79152fbc8f8ced30284e3683b8d6adbd191e0c50..4f9063f3e951af91b66c6d876acb14b3fb1b0dd6 100644 (file)
 
 /* Definitions of the predefined namespace names  */
 
-#define ACPI_UNKNOWN_NAME       (u32) 0x3F3F3F3F       /* Unknown name is  "????" */
-#define ACPI_ROOT_NAME          (u32) 0x5F5F5F5C       /* Root name is     "\___" */
-#define ACPI_SYS_BUS_NAME       (u32) 0x5F53425F       /* Sys bus name is  "_SB_" */
+#define ACPI_UNKNOWN_NAME       (u32) 0x3F3F3F3F       /* Unknown name is "????" */
+#define ACPI_ROOT_NAME          (u32) 0x5F5F5F5C       /* Root name is    "\___" */
+
+#define ACPI_PREFIX_MIXED       (u32) 0x69706341       /* "Acpi" */
+#define ACPI_PREFIX_LOWER       (u32) 0x69706361       /* "acpi" */
 
 #define ACPI_NS_ROOT_PATH       "\\"
 #define ACPI_NS_SYSTEM_BUS      "_SB_"
 
-/*! [Begin] no source code translation (not handled by acpisrc) */
-#define ACPI_FUNCTION_PREFIX1   'ipcA'
-#define ACPI_FUNCTION_PREFIX2   'ipca'
-/*! [End] no source code translation !*/
-
 #endif                         /* __ACNAMES_H__  */