aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/tables
diff options
context:
space:
mode:
authorAlexey Starikovskiy <alexey.y.starikovskiy@intel.com>2007-02-02 11:48:22 -0500
committerLen Brown <len.brown@intel.com>2007-02-02 21:14:29 -0500
commit428f211297bc95fd41f23830eab4180339020dd0 (patch)
tree81537f25f9add9e727e9d764fdcb333a1af07528 /drivers/acpi/tables
parent77f6a9fca39f4f19d2d9d5fff1ff5c2ccf20629c (diff)
ACPICA: Miscellaneous table manager updates and optimizations
Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/tables')
-rw-r--r--drivers/acpi/tables/tbinstal.c91
-rw-r--r--drivers/acpi/tables/tbutils.c46
-rw-r--r--drivers/acpi/tables/tbxface.c54
3 files changed, 93 insertions, 98 deletions
diff --git a/drivers/acpi/tables/tbinstal.c b/drivers/acpi/tables/tbinstal.c
index 9e0b3ce0d8e5..b07d9c8330b3 100644
--- a/drivers/acpi/tables/tbinstal.c
+++ b/drivers/acpi/tables/tbinstal.c
@@ -61,16 +61,19 @@ ACPI_MODULE_NAME("tbinstal")
61 *****************************************************************************/ 61 *****************************************************************************/
62acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc) 62acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc)
63{ 63{
64 acpi_status status; 64 acpi_status status = AE_OK;
65 65
66 ACPI_FUNCTION_TRACE(tb_verify_table); 66 ACPI_FUNCTION_TRACE(tb_verify_table);
67 67
68 /* Map the table if necessary */ 68 /* Map the table if necessary */
69 69
70 if (!table_desc->pointer) { 70 if (!table_desc->pointer) {
71 table_desc->pointer = 71 if ((table_desc->flags & ACPI_TABLE_ORIGIN_MASK) ==
72 acpi_tb_map(table_desc->address, table_desc->length, 72 ACPI_TABLE_ORIGIN_MAPPED) {
73 table_desc->flags & ACPI_TABLE_ORIGIN_MASK); 73 table_desc->pointer =
74 acpi_os_map_memory(table_desc->address,
75 table_desc->length);
76 }
74 if (!table_desc->pointer) { 77 if (!table_desc->pointer) {
75 return_ACPI_STATUS(AE_NO_MEMORY); 78 return_ACPI_STATUS(AE_NO_MEMORY);
76 } 79 }
@@ -78,14 +81,15 @@ acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc)
78 81
79 /* FACS is the odd table, has no standard ACPI header and no checksum */ 82 /* FACS is the odd table, has no standard ACPI header and no checksum */
80 83
81 if (ACPI_COMPARE_NAME(&(table_desc->signature), ACPI_SIG_FACS)) { 84 if (!ACPI_COMPARE_NAME(&table_desc->signature, ACPI_SIG_FACS)) {
82 return_ACPI_STATUS(AE_OK);
83 }
84 85
85 /* Always calculate checksum, ignore bad checksum if requested */ 86 /* Always calculate checksum, ignore bad checksum if requested */
87
88 status =
89 acpi_tb_verify_checksum(table_desc->pointer,
90 table_desc->length);
91 }
86 92
87 status =
88 acpi_tb_verify_checksum(table_desc->pointer, table_desc->length);
89 return_ACPI_STATUS(status); 93 return_ACPI_STATUS(status);
90} 94}
91 95
@@ -93,7 +97,7 @@ acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc)
93 * 97 *
94 * FUNCTION: acpi_tb_add_table 98 * FUNCTION: acpi_tb_add_table
95 * 99 *
96 * PARAMETERS: Table - Pointer to the table header 100 * PARAMETERS: table_desc - Table descriptor
97 * table_index - Where the table index is returned 101 * table_index - Where the table index is returned
98 * 102 *
99 * RETURN: Status 103 * RETURN: Status
@@ -103,7 +107,7 @@ acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc)
103 ******************************************************************************/ 107 ******************************************************************************/
104 108
105acpi_status 109acpi_status
106acpi_tb_add_table(struct acpi_table_header *table, 110acpi_tb_add_table(struct acpi_table_desc *table_desc,
107 acpi_native_uint * table_index) 111 acpi_native_uint * table_index)
108{ 112{
109 acpi_native_uint i; 113 acpi_native_uint i;
@@ -112,6 +116,25 @@ acpi_tb_add_table(struct acpi_table_header *table,
112 116
113 ACPI_FUNCTION_TRACE(tb_add_table); 117 ACPI_FUNCTION_TRACE(tb_add_table);
114 118
119 if (!table_desc->pointer) {
120 status = acpi_tb_verify_table(table_desc);
121 if (ACPI_FAILURE(status) || !table_desc->pointer) {
122 return_ACPI_STATUS(status);
123 }
124 }
125
126 /* The table must be either an SSDT or a PSDT */
127
128 if ((!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_PSDT))
129 &&
130 (!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_SSDT)))
131 {
132 ACPI_ERROR((AE_INFO,
133 "Table has invalid signature [%4.4s], must be SSDT or PSDT",
134 table_desc->pointer->signature));
135 return_ACPI_STATUS(AE_BAD_SIGNATURE);
136 }
137
115 (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); 138 (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
116 139
117 /* Check if table is already registered */ 140 /* Check if table is already registered */
@@ -127,18 +150,17 @@ acpi_tb_add_table(struct acpi_table_header *table,
127 } 150 }
128 } 151 }
129 152
130 length = ACPI_MIN(table->length, 153 length = ACPI_MIN(table_desc->length,
131 acpi_gbl_root_table_list.tables[i].pointer-> 154 acpi_gbl_root_table_list.tables[i].length);
132 length); 155 if (ACPI_MEMCMP(table_desc->pointer,
133 if (ACPI_MEMCMP 156 acpi_gbl_root_table_list.tables[i].pointer,
134 (table, acpi_gbl_root_table_list.tables[i].pointer, 157 length)) {
135 length)) {
136 continue; 158 continue;
137 } 159 }
138 160
139 /* Table is already registered */ 161 /* Table is already registered */
140 162
141 ACPI_FREE(table); 163 acpi_tb_delete_table(table_desc);
142 *table_index = i; 164 *table_index = i;
143 goto release; 165 goto release;
144 } 166 }
@@ -146,14 +168,14 @@ acpi_tb_add_table(struct acpi_table_header *table,
146 /* 168 /*
147 * Add the table to the global table list 169 * Add the table to the global table list
148 */ 170 */
149 status = acpi_tb_store_table(ACPI_TO_INTEGER(table), 171 status = acpi_tb_store_table(table_desc->address, table_desc->pointer,
150 table, table->length, 172 table_desc->length, table_desc->flags,
151 ACPI_TABLE_ORIGIN_ALLOCATED, table_index); 173 table_index);
152 if (ACPI_FAILURE(status)) { 174 if (ACPI_FAILURE(status)) {
153 goto release; 175 goto release;
154 } 176 }
155 177
156 acpi_tb_print_table_header(0, table); 178 acpi_tb_print_table_header(table_desc->address, table_desc->pointer);
157 179
158 release: 180 release:
159 (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); 181 (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
@@ -282,25 +304,20 @@ acpi_tb_store_table(acpi_physical_address address,
282 * 304 *
283 ******************************************************************************/ 305 ******************************************************************************/
284 306
285void acpi_tb_delete_table(acpi_native_uint table_index) 307void acpi_tb_delete_table(struct acpi_table_desc *table_desc)
286{ 308{
287 struct acpi_table_desc *table_desc;
288
289 /* table_index assumed valid */
290
291 table_desc = &acpi_gbl_root_table_list.tables[table_index];
292
293 /* Table must be mapped or allocated */ 309 /* Table must be mapped or allocated */
294
295 if (!table_desc->pointer) { 310 if (!table_desc->pointer) {
296 return; 311 return;
297 } 312 }
298 313 switch (table_desc->flags & ACPI_TABLE_ORIGIN_MASK) {
299 if (table_desc->flags & ACPI_TABLE_ORIGIN_MAPPED) { 314 case ACPI_TABLE_ORIGIN_MAPPED:
300 acpi_tb_unmap(table_desc->pointer, table_desc->length, 315 acpi_os_unmap_memory(table_desc->pointer, table_desc->length);
301 table_desc->flags & ACPI_TABLE_ORIGIN_MASK); 316 break;
302 } else if (table_desc->flags & ACPI_TABLE_ORIGIN_ALLOCATED) { 317 case ACPI_TABLE_ORIGIN_ALLOCATED:
303 ACPI_FREE(table_desc->pointer); 318 ACPI_FREE(table_desc->pointer);
319 break;
320 default:;
304 } 321 }
305 322
306 table_desc->pointer = NULL; 323 table_desc->pointer = NULL;
@@ -329,7 +346,7 @@ void acpi_tb_terminate(void)
329 /* Delete the individual tables */ 346 /* Delete the individual tables */
330 347
331 for (i = 0; i < acpi_gbl_root_table_list.count; ++i) { 348 for (i = 0; i < acpi_gbl_root_table_list.count; ++i) {
332 acpi_tb_delete_table(i); 349 acpi_tb_delete_table(&acpi_gbl_root_table_list.tables[i]);
333 } 350 }
334 351
335 /* 352 /*
diff --git a/drivers/acpi/tables/tbutils.c b/drivers/acpi/tables/tbutils.c
index 1033748e73ec..0cb743962faf 100644
--- a/drivers/acpi/tables/tbutils.c
+++ b/drivers/acpi/tables/tbutils.c
@@ -462,49 +462,3 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags)
462 462
463 return_ACPI_STATUS(AE_OK); 463 return_ACPI_STATUS(AE_OK);
464} 464}
465
466/******************************************************************************
467 *
468 * FUNCTION: acpi_tb_map
469 *
470 * PARAMETERS: Address - Address to be mapped
471 * Length - Length to be mapped
472 * Flags - Logical or physical addressing mode
473 *
474 * RETURN: Pointer to mapped region
475 *
476 * DESCRIPTION: Maps memory according to flag
477 *
478 *****************************************************************************/
479
480void *acpi_tb_map(acpi_physical_address address, u32 length, u32 flags)
481{
482
483 if (flags == ACPI_TABLE_ORIGIN_MAPPED) {
484 return (acpi_os_map_memory(address, length));
485 } else {
486 return (ACPI_CAST_PTR(void, address));
487 }
488}
489
490/******************************************************************************
491 *
492 * FUNCTION: acpi_tb_unmap
493 *
494 * PARAMETERS: Pointer - To mapped region
495 * Length - Length to be unmapped
496 * Flags - Logical or physical addressing mode
497 *
498 * RETURN: None
499 *
500 * DESCRIPTION: Unmaps memory according to flag
501 *
502 *****************************************************************************/
503
504void acpi_tb_unmap(void *pointer, u32 length, u32 flags)
505{
506
507 if (flags == ACPI_TABLE_ORIGIN_MAPPED) {
508 acpi_os_unmap_memory(pointer, length);
509 }
510}
diff --git a/drivers/acpi/tables/tbxface.c b/drivers/acpi/tables/tbxface.c
index 9d451e8a4e46..77224bd0667c 100644
--- a/drivers/acpi/tables/tbxface.c
+++ b/drivers/acpi/tables/tbxface.c
@@ -220,16 +220,25 @@ acpi_status acpi_load_table(struct acpi_table_header *table_ptr)
220{ 220{
221 acpi_status status; 221 acpi_status status;
222 acpi_native_uint table_index; 222 acpi_native_uint table_index;
223 struct acpi_table_desc table_desc;
224
225 if (!table_ptr)
226 return AE_BAD_PARAMETER;
227
228 ACPI_MEMSET(&table_desc, 0, sizeof(struct acpi_table_desc));
229 table_desc.pointer = table_ptr;
230 table_desc.length = table_ptr->length;
231 table_desc.flags = ACPI_TABLE_ORIGIN_UNKNOWN;
223 232
224 /* 233 /*
225 * Install the new table into the local data structures 234 * Install the new table into the local data structures
226 */ 235 */
227 status = acpi_tb_add_table(table_ptr, &table_index); 236 status = acpi_tb_add_table(&table_desc, &table_index);
228 if (ACPI_FAILURE(status)) { 237 if (ACPI_FAILURE(status)) {
229 return_ACPI_STATUS(status); 238 return status;
230 } 239 }
231 status = acpi_ns_load_table(table_index, acpi_gbl_root_node); 240 status = acpi_ns_load_table(table_index, acpi_gbl_root_node);
232 return_ACPI_STATUS(status); 241 return status;
233} 242}
234 243
235ACPI_EXPORT_SYMBOL(acpi_load_table) 244ACPI_EXPORT_SYMBOL(acpi_load_table)
@@ -240,8 +249,7 @@ ACPI_EXPORT_SYMBOL(acpi_load_table)
240 * 249 *
241 * PARAMETERS: Signature - ACPI signature of needed table 250 * PARAMETERS: Signature - ACPI signature of needed table
242 * Instance - Which instance (for SSDTs) 251 * Instance - Which instance (for SSDTs)
243 * out_table_header - Where the pointer to the table header 252 * out_table_header - The pointer to the table header to fill
244 * is returned
245 * 253 *
246 * RETURN: Status and pointer to mapped table header 254 * RETURN: Status and pointer to mapped table header
247 * 255 *
@@ -254,10 +262,11 @@ ACPI_EXPORT_SYMBOL(acpi_load_table)
254acpi_status 262acpi_status
255acpi_get_table_header(char *signature, 263acpi_get_table_header(char *signature,
256 acpi_native_uint instance, 264 acpi_native_uint instance,
257 struct acpi_table_header **out_table_header) 265 struct acpi_table_header *out_table_header)
258{ 266{
259 acpi_native_uint i; 267 acpi_native_uint i;
260 acpi_native_uint j; 268 acpi_native_uint j;
269 struct acpi_table_header *header;
261 270
262 /* Parameter validation */ 271 /* Parameter validation */
263 272
@@ -279,16 +288,31 @@ acpi_get_table_header(char *signature,
279 continue; 288 continue;
280 } 289 }
281 290
282 *out_table_header = 291 if (!acpi_gbl_root_table_list.tables[i].pointer) {
283 acpi_tb_map(acpi_gbl_root_table_list.tables[i].address, 292 if ((acpi_gbl_root_table_list.tables[i].
284 (u32) sizeof(struct acpi_table_header), 293 flags & ACPI_TABLE_ORIGIN_MASK) ==
285 acpi_gbl_root_table_list.tables[i]. 294 ACPI_TABLE_ORIGIN_MAPPED) {
286 flags & ACPI_TABLE_ORIGIN_MASK); 295 header =
287 296 acpi_os_map_memory(acpi_gbl_root_table_list.
288 if (!(*out_table_header)) { 297 tables[i].address,
289 return (AE_NO_MEMORY); 298 sizeof(struct
299 acpi_table_header));
300 if (!header) {
301 return AE_NO_MEMORY;
302 }
303 ACPI_MEMCPY(out_table_header, header,
304 sizeof(struct acpi_table_header));
305 acpi_os_unmap_memory(header,
306 sizeof(struct
307 acpi_table_header));
308 } else {
309 return AE_NOT_FOUND;
310 }
311 } else {
312 ACPI_MEMCPY(out_table_header,
313 acpi_gbl_root_table_list.tables[i].pointer,
314 sizeof(struct acpi_table_header));
290 } 315 }
291
292 return (AE_OK); 316 return (AE_OK);
293 } 317 }
294 318