diff options
author | Alexey Starikovskiy <alexey.y.starikovskiy@intel.com> | 2007-02-02 11:48:22 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2007-02-02 21:14:29 -0500 |
commit | 428f211297bc95fd41f23830eab4180339020dd0 (patch) | |
tree | 81537f25f9add9e727e9d764fdcb333a1af07528 /drivers/acpi/tables/tbinstal.c | |
parent | 77f6a9fca39f4f19d2d9d5fff1ff5c2ccf20629c (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/tbinstal.c')
-rw-r--r-- | drivers/acpi/tables/tbinstal.c | 91 |
1 files changed, 54 insertions, 37 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 | *****************************************************************************/ |
62 | acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc) | 62 | acpi_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 | ||
105 | acpi_status | 109 | acpi_status |
106 | acpi_tb_add_table(struct acpi_table_header *table, | 110 | acpi_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 | ||
285 | void acpi_tb_delete_table(acpi_native_uint table_index) | 307 | void 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 | /* |