diff options
Diffstat (limited to 'drivers/acpi/tables.c')
-rw-r--r-- | drivers/acpi/tables.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c index 775c97a282bd..fec1ae36d431 100644 --- a/drivers/acpi/tables.c +++ b/drivers/acpi/tables.c | |||
@@ -181,14 +181,15 @@ acpi_table_parse_entries(char *id, | |||
181 | struct acpi_subtable_header *entry; | 181 | struct acpi_subtable_header *entry; |
182 | unsigned int count = 0; | 182 | unsigned int count = 0; |
183 | unsigned long table_end; | 183 | unsigned long table_end; |
184 | acpi_size tbl_size; | ||
184 | 185 | ||
185 | if (!handler) | 186 | if (!handler) |
186 | return -EINVAL; | 187 | return -EINVAL; |
187 | 188 | ||
188 | if (strncmp(id, ACPI_SIG_MADT, 4) == 0) | 189 | if (strncmp(id, ACPI_SIG_MADT, 4) == 0) |
189 | acpi_get_table(id, acpi_apic_instance, &table_header); | 190 | acpi_get_table_with_size(id, acpi_apic_instance, &table_header, &tbl_size); |
190 | else | 191 | else |
191 | acpi_get_table(id, 0, &table_header); | 192 | acpi_get_table_with_size(id, 0, &table_header, &tbl_size); |
192 | 193 | ||
193 | if (!table_header) { | 194 | if (!table_header) { |
194 | printk(KERN_WARNING PREFIX "%4.4s not present\n", id); | 195 | printk(KERN_WARNING PREFIX "%4.4s not present\n", id); |
@@ -206,8 +207,10 @@ acpi_table_parse_entries(char *id, | |||
206 | table_end) { | 207 | table_end) { |
207 | if (entry->type == entry_id | 208 | if (entry->type == entry_id |
208 | && (!max_entries || count++ < max_entries)) | 209 | && (!max_entries || count++ < max_entries)) |
209 | if (handler(entry, table_end)) | 210 | if (handler(entry, table_end)) { |
211 | early_acpi_os_unmap_memory((char *)table_header, tbl_size); | ||
210 | return -EINVAL; | 212 | return -EINVAL; |
213 | } | ||
211 | 214 | ||
212 | entry = (struct acpi_subtable_header *) | 215 | entry = (struct acpi_subtable_header *) |
213 | ((unsigned long)entry + entry->length); | 216 | ((unsigned long)entry + entry->length); |
@@ -217,6 +220,7 @@ acpi_table_parse_entries(char *id, | |||
217 | "%i found\n", id, entry_id, count - max_entries, count); | 220 | "%i found\n", id, entry_id, count - max_entries, count); |
218 | } | 221 | } |
219 | 222 | ||
223 | early_acpi_os_unmap_memory((char *)table_header, tbl_size); | ||
220 | return count; | 224 | return count; |
221 | } | 225 | } |
222 | 226 | ||
@@ -241,17 +245,19 @@ acpi_table_parse_madt(enum acpi_madt_type id, | |||
241 | int __init acpi_table_parse(char *id, acpi_table_handler handler) | 245 | int __init acpi_table_parse(char *id, acpi_table_handler handler) |
242 | { | 246 | { |
243 | struct acpi_table_header *table = NULL; | 247 | struct acpi_table_header *table = NULL; |
248 | acpi_size tbl_size; | ||
244 | 249 | ||
245 | if (!handler) | 250 | if (!handler) |
246 | return -EINVAL; | 251 | return -EINVAL; |
247 | 252 | ||
248 | if (strncmp(id, ACPI_SIG_MADT, 4) == 0) | 253 | if (strncmp(id, ACPI_SIG_MADT, 4) == 0) |
249 | acpi_get_table(id, acpi_apic_instance, &table); | 254 | acpi_get_table_with_size(id, acpi_apic_instance, &table, &tbl_size); |
250 | else | 255 | else |
251 | acpi_get_table(id, 0, &table); | 256 | acpi_get_table_with_size(id, 0, &table, &tbl_size); |
252 | 257 | ||
253 | if (table) { | 258 | if (table) { |
254 | handler(table); | 259 | handler(table); |
260 | early_acpi_os_unmap_memory(table, tbl_size); | ||
255 | return 0; | 261 | return 0; |
256 | } else | 262 | } else |
257 | return 1; | 263 | return 1; |
@@ -265,8 +271,9 @@ int __init acpi_table_parse(char *id, acpi_table_handler handler) | |||
265 | static void __init check_multiple_madt(void) | 271 | static void __init check_multiple_madt(void) |
266 | { | 272 | { |
267 | struct acpi_table_header *table = NULL; | 273 | struct acpi_table_header *table = NULL; |
274 | acpi_size tbl_size; | ||
268 | 275 | ||
269 | acpi_get_table(ACPI_SIG_MADT, 2, &table); | 276 | acpi_get_table_with_size(ACPI_SIG_MADT, 2, &table, &tbl_size); |
270 | if (table) { | 277 | if (table) { |
271 | printk(KERN_WARNING PREFIX | 278 | printk(KERN_WARNING PREFIX |
272 | "BIOS bug: multiple APIC/MADT found," | 279 | "BIOS bug: multiple APIC/MADT found," |
@@ -275,6 +282,7 @@ static void __init check_multiple_madt(void) | |||
275 | "If \"acpi_apic_instance=%d\" works better, " | 282 | "If \"acpi_apic_instance=%d\" works better, " |
276 | "notify linux-acpi@vger.kernel.org\n", | 283 | "notify linux-acpi@vger.kernel.org\n", |
277 | acpi_apic_instance ? 0 : 2); | 284 | acpi_apic_instance ? 0 : 2); |
285 | early_acpi_os_unmap_memory(table, tbl_size); | ||
278 | 286 | ||
279 | } else | 287 | } else |
280 | acpi_apic_instance = 0; | 288 | acpi_apic_instance = 0; |
@@ -293,7 +301,12 @@ static void __init check_multiple_madt(void) | |||
293 | 301 | ||
294 | int __init acpi_table_init(void) | 302 | int __init acpi_table_init(void) |
295 | { | 303 | { |
296 | acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0); | 304 | acpi_status status; |
305 | |||
306 | status = acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0); | ||
307 | if (ACPI_FAILURE(status)) | ||
308 | return 1; | ||
309 | |||
297 | check_multiple_madt(); | 310 | check_multiple_madt(); |
298 | return 0; | 311 | return 0; |
299 | } | 312 | } |