diff options
Diffstat (limited to 'drivers/acpi/tables')
| -rw-r--r-- | drivers/acpi/tables/tbinstal.c | 22 | ||||
| -rw-r--r-- | drivers/acpi/tables/tbutils.c | 67 | ||||
| -rw-r--r-- | drivers/acpi/tables/tbxface.c | 14 | ||||
| -rw-r--r-- | drivers/acpi/tables/tbxfroot.c | 4 |
4 files changed, 96 insertions, 11 deletions
diff --git a/drivers/acpi/tables/tbinstal.c b/drivers/acpi/tables/tbinstal.c index 2ad72f204551..698799901f55 100644 --- a/drivers/acpi/tables/tbinstal.c +++ b/drivers/acpi/tables/tbinstal.c | |||
| @@ -124,9 +124,7 @@ acpi_tb_match_signature ( | |||
| 124 | * | 124 | * |
| 125 | * RETURN: Status | 125 | * RETURN: Status |
| 126 | * | 126 | * |
| 127 | * DESCRIPTION: Load and validate all tables other than the RSDT. The RSDT must | 127 | * DESCRIPTION: Install the table into the global data structures. |
| 128 | * already be loaded and validated. | ||
| 129 | * Install the table into the global data structs. | ||
| 130 | * | 128 | * |
| 131 | ******************************************************************************/ | 129 | ******************************************************************************/ |
| 132 | 130 | ||
| @@ -136,6 +134,7 @@ acpi_tb_install_table ( | |||
| 136 | { | 134 | { |
| 137 | acpi_status status; | 135 | acpi_status status; |
| 138 | 136 | ||
| 137 | |||
| 139 | ACPI_FUNCTION_TRACE ("tb_install_table"); | 138 | ACPI_FUNCTION_TRACE ("tb_install_table"); |
| 140 | 139 | ||
| 141 | 140 | ||
| @@ -143,22 +142,33 @@ acpi_tb_install_table ( | |||
| 143 | 142 | ||
| 144 | status = acpi_ut_acquire_mutex (ACPI_MTX_TABLES); | 143 | status = acpi_ut_acquire_mutex (ACPI_MTX_TABLES); |
| 145 | if (ACPI_FAILURE (status)) { | 144 | if (ACPI_FAILURE (status)) { |
| 146 | ACPI_REPORT_ERROR (("Could not acquire table mutex for [%4.4s], %s\n", | 145 | ACPI_REPORT_ERROR (("Could not acquire table mutex, %s\n", |
| 147 | table_info->pointer->signature, acpi_format_exception (status))); | 146 | acpi_format_exception (status))); |
| 148 | return_ACPI_STATUS (status); | 147 | return_ACPI_STATUS (status); |
| 149 | } | 148 | } |
| 150 | 149 | ||
| 150 | /* | ||
| 151 | * Ignore a table that is already installed. For example, some BIOS | ||
| 152 | * ASL code will repeatedly attempt to load the same SSDT. | ||
| 153 | */ | ||
| 154 | status = acpi_tb_is_table_installed (table_info); | ||
| 155 | if (ACPI_FAILURE (status)) { | ||
| 156 | goto unlock_and_exit; | ||
| 157 | } | ||
| 158 | |||
| 151 | /* Install the table into the global data structure */ | 159 | /* Install the table into the global data structure */ |
| 152 | 160 | ||
| 153 | status = acpi_tb_init_table_descriptor (table_info->type, table_info); | 161 | status = acpi_tb_init_table_descriptor (table_info->type, table_info); |
| 154 | if (ACPI_FAILURE (status)) { | 162 | if (ACPI_FAILURE (status)) { |
| 155 | ACPI_REPORT_ERROR (("Could not install ACPI table [%4.4s], %s\n", | 163 | ACPI_REPORT_ERROR (("Could not install table [%4.4s], %s\n", |
| 156 | table_info->pointer->signature, acpi_format_exception (status))); | 164 | table_info->pointer->signature, acpi_format_exception (status))); |
| 157 | } | 165 | } |
| 158 | 166 | ||
| 159 | ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%s located at %p\n", | 167 | ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%s located at %p\n", |
| 160 | acpi_gbl_table_data[table_info->type].name, table_info->pointer)); | 168 | acpi_gbl_table_data[table_info->type].name, table_info->pointer)); |
| 161 | 169 | ||
| 170 | |||
| 171 | unlock_and_exit: | ||
| 162 | (void) acpi_ut_release_mutex (ACPI_MTX_TABLES); | 172 | (void) acpi_ut_release_mutex (ACPI_MTX_TABLES); |
| 163 | return_ACPI_STATUS (status); | 173 | return_ACPI_STATUS (status); |
| 164 | } | 174 | } |
diff --git a/drivers/acpi/tables/tbutils.c b/drivers/acpi/tables/tbutils.c index e69d01d443d2..6fc1e36e6042 100644 --- a/drivers/acpi/tables/tbutils.c +++ b/drivers/acpi/tables/tbutils.c | |||
| @@ -61,6 +61,67 @@ acpi_tb_handle_to_object ( | |||
| 61 | 61 | ||
| 62 | /******************************************************************************* | 62 | /******************************************************************************* |
| 63 | * | 63 | * |
| 64 | * FUNCTION: acpi_tb_is_table_installed | ||
| 65 | * | ||
| 66 | * PARAMETERS: new_table_desc - Descriptor for new table being installed | ||
| 67 | * | ||
| 68 | * RETURN: Status - AE_ALREADY_EXISTS if the table is already installed | ||
| 69 | * | ||
| 70 | * DESCRIPTION: Determine if an ACPI table is already installed | ||
| 71 | * | ||
| 72 | * MUTEX: Table data structures should be locked | ||
| 73 | * | ||
| 74 | ******************************************************************************/ | ||
| 75 | |||
| 76 | acpi_status | ||
| 77 | acpi_tb_is_table_installed ( | ||
| 78 | struct acpi_table_desc *new_table_desc) | ||
| 79 | { | ||
| 80 | struct acpi_table_desc *table_desc; | ||
| 81 | |||
| 82 | |||
| 83 | ACPI_FUNCTION_TRACE ("tb_is_table_installed"); | ||
| 84 | |||
| 85 | |||
| 86 | /* Get the list descriptor and first table descriptor */ | ||
| 87 | |||
| 88 | table_desc = acpi_gbl_table_lists[new_table_desc->type].next; | ||
| 89 | |||
| 90 | /* Examine all installed tables of this type */ | ||
| 91 | |||
| 92 | while (table_desc) { | ||
| 93 | /* Compare Revision and oem_table_id */ | ||
| 94 | |||
| 95 | if ((table_desc->loaded_into_namespace) && | ||
| 96 | (table_desc->pointer->revision == | ||
| 97 | new_table_desc->pointer->revision) && | ||
| 98 | (!ACPI_MEMCMP (table_desc->pointer->oem_table_id, | ||
| 99 | new_table_desc->pointer->oem_table_id, 8))) { | ||
| 100 | /* This table is already installed */ | ||
| 101 | |||
| 102 | ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, | ||
| 103 | "Table [%4.4s] already installed: Rev %X oem_table_id [%8.8s]\n", | ||
| 104 | new_table_desc->pointer->signature, | ||
| 105 | new_table_desc->pointer->revision, | ||
| 106 | new_table_desc->pointer->oem_table_id)); | ||
| 107 | |||
| 108 | new_table_desc->owner_id = table_desc->owner_id; | ||
| 109 | new_table_desc->installed_desc = table_desc; | ||
| 110 | |||
| 111 | return_ACPI_STATUS (AE_ALREADY_EXISTS); | ||
| 112 | } | ||
| 113 | |||
| 114 | /* Get next table on the list */ | ||
| 115 | |||
| 116 | table_desc = table_desc->next; | ||
| 117 | } | ||
| 118 | |||
| 119 | return_ACPI_STATUS (AE_OK); | ||
| 120 | } | ||
| 121 | |||
| 122 | |||
| 123 | /******************************************************************************* | ||
| 124 | * | ||
| 64 | * FUNCTION: acpi_tb_validate_table_header | 125 | * FUNCTION: acpi_tb_validate_table_header |
| 65 | * | 126 | * |
| 66 | * PARAMETERS: table_header - Logical pointer to the table | 127 | * PARAMETERS: table_header - Logical pointer to the table |
| @@ -157,7 +218,7 @@ acpi_tb_verify_table_checksum ( | |||
| 157 | 218 | ||
| 158 | /* Compute the checksum on the table */ | 219 | /* Compute the checksum on the table */ |
| 159 | 220 | ||
| 160 | checksum = acpi_tb_checksum (table_header, table_header->length); | 221 | checksum = acpi_tb_generate_checksum (table_header, table_header->length); |
| 161 | 222 | ||
| 162 | /* Return the appropriate exception */ | 223 | /* Return the appropriate exception */ |
| 163 | 224 | ||
| @@ -175,7 +236,7 @@ acpi_tb_verify_table_checksum ( | |||
| 175 | 236 | ||
| 176 | /******************************************************************************* | 237 | /******************************************************************************* |
| 177 | * | 238 | * |
| 178 | * FUNCTION: acpi_tb_checksum | 239 | * FUNCTION: acpi_tb_generate_checksum |
| 179 | * | 240 | * |
| 180 | * PARAMETERS: Buffer - Buffer to checksum | 241 | * PARAMETERS: Buffer - Buffer to checksum |
| 181 | * Length - Size of the buffer | 242 | * Length - Size of the buffer |
| @@ -187,7 +248,7 @@ acpi_tb_verify_table_checksum ( | |||
| 187 | ******************************************************************************/ | 248 | ******************************************************************************/ |
| 188 | 249 | ||
| 189 | u8 | 250 | u8 |
| 190 | acpi_tb_checksum ( | 251 | acpi_tb_generate_checksum ( |
| 191 | void *buffer, | 252 | void *buffer, |
| 192 | u32 length) | 253 | u32 length) |
| 193 | { | 254 | { |
diff --git a/drivers/acpi/tables/tbxface.c b/drivers/acpi/tables/tbxface.c index ca2dbdd23ed3..e18a05d1b9b3 100644 --- a/drivers/acpi/tables/tbxface.c +++ b/drivers/acpi/tables/tbxface.c | |||
| @@ -182,10 +182,23 @@ acpi_load_table ( | |||
| 182 | return_ACPI_STATUS (status); | 182 | return_ACPI_STATUS (status); |
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | /* Check signature for a valid table type */ | ||
| 186 | |||
| 187 | status = acpi_tb_recognize_table (&table_info, ACPI_TABLE_ALL); | ||
| 188 | if (ACPI_FAILURE (status)) { | ||
| 189 | return_ACPI_STATUS (status); | ||
| 190 | } | ||
| 191 | |||
| 185 | /* Install the new table into the local data structures */ | 192 | /* Install the new table into the local data structures */ |
| 186 | 193 | ||
| 187 | status = acpi_tb_install_table (&table_info); | 194 | status = acpi_tb_install_table (&table_info); |
| 188 | if (ACPI_FAILURE (status)) { | 195 | if (ACPI_FAILURE (status)) { |
| 196 | if (status == AE_ALREADY_EXISTS) { | ||
| 197 | /* Table already exists, no error */ | ||
| 198 | |||
| 199 | status = AE_OK; | ||
| 200 | } | ||
| 201 | |||
| 189 | /* Free table allocated by acpi_tb_get_table_body */ | 202 | /* Free table allocated by acpi_tb_get_table_body */ |
| 190 | 203 | ||
| 191 | acpi_tb_delete_single_table (&table_info); | 204 | acpi_tb_delete_single_table (&table_info); |
| @@ -261,6 +274,7 @@ acpi_unload_table ( | |||
| 261 | * simply a position within the hierarchy | 274 | * simply a position within the hierarchy |
| 262 | */ | 275 | */ |
| 263 | acpi_ns_delete_namespace_by_owner (table_desc->owner_id); | 276 | acpi_ns_delete_namespace_by_owner (table_desc->owner_id); |
| 277 | acpi_ut_release_owner_id (&table_desc->owner_id); | ||
| 264 | table_desc = table_desc->next; | 278 | table_desc = table_desc->next; |
| 265 | } | 279 | } |
| 266 | 280 | ||
diff --git a/drivers/acpi/tables/tbxfroot.c b/drivers/acpi/tables/tbxfroot.c index abb4c9346560..87dccdda9ae2 100644 --- a/drivers/acpi/tables/tbxfroot.c +++ b/drivers/acpi/tables/tbxfroot.c | |||
| @@ -93,14 +93,14 @@ acpi_tb_validate_rsdp ( | |||
| 93 | 93 | ||
| 94 | /* Check the standard checksum */ | 94 | /* Check the standard checksum */ |
| 95 | 95 | ||
| 96 | if (acpi_tb_checksum (rsdp, ACPI_RSDP_CHECKSUM_LENGTH) != 0) { | 96 | if (acpi_tb_generate_checksum (rsdp, ACPI_RSDP_CHECKSUM_LENGTH) != 0) { |
| 97 | return (AE_BAD_CHECKSUM); | 97 | return (AE_BAD_CHECKSUM); |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | /* Check extended checksum if table version >= 2 */ | 100 | /* Check extended checksum if table version >= 2 */ |
| 101 | 101 | ||
| 102 | if ((rsdp->revision >= 2) && | 102 | if ((rsdp->revision >= 2) && |
| 103 | (acpi_tb_checksum (rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0)) { | 103 | (acpi_tb_generate_checksum (rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0)) { |
| 104 | return (AE_BAD_CHECKSUM); | 104 | return (AE_BAD_CHECKSUM); |
| 105 | } | 105 | } |
| 106 | 106 | ||
