diff options
-rw-r--r-- | drivers/acpi/acpica/acglobal.h | 8 | ||||
-rw-r--r-- | drivers/acpi/acpica/actables.h | 2 | ||||
-rw-r--r-- | drivers/acpi/acpica/psxface.c | 1 | ||||
-rw-r--r-- | drivers/acpi/acpica/tbutils.c | 35 | ||||
-rw-r--r-- | drivers/acpi/acpica/tbxface.c | 10 | ||||
-rw-r--r-- | include/acpi/acpixf.h | 1 |
6 files changed, 57 insertions, 0 deletions
diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h index a419fe98a5fc..e3813d290b4f 100644 --- a/drivers/acpi/acpica/acglobal.h +++ b/drivers/acpi/acpica/acglobal.h | |||
@@ -117,6 +117,14 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_use_default_register_widths, TRUE); | |||
117 | */ | 117 | */ |
118 | u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE); | 118 | u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE); |
119 | 119 | ||
120 | /* | ||
121 | * Optionally copy the entire DSDT to local memory (instead of simply | ||
122 | * mapping it.) There are some BIOSs that corrupt or replace the original | ||
123 | * DSDT, creating the need for this option. Default is FALSE, do not copy | ||
124 | * the DSDT. | ||
125 | */ | ||
126 | u8 ACPI_INIT_GLOBAL(acpi_gbl_copy_dsdt_locally, FALSE); | ||
127 | |||
120 | /* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */ | 128 | /* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */ |
121 | 129 | ||
122 | struct acpi_table_fadt acpi_gbl_FADT; | 130 | struct acpi_table_fadt acpi_gbl_FADT; |
diff --git a/drivers/acpi/acpica/actables.h b/drivers/acpi/acpica/actables.h index fc52b6f2d69c..b7197bf4af0b 100644 --- a/drivers/acpi/acpica/actables.h +++ b/drivers/acpi/acpica/actables.h | |||
@@ -109,6 +109,8 @@ acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length); | |||
109 | 109 | ||
110 | void acpi_tb_check_dsdt_header(void); | 110 | void acpi_tb_check_dsdt_header(void); |
111 | 111 | ||
112 | void acpi_tb_copy_dsdt(struct acpi_table_desc *table_desc); | ||
113 | |||
112 | void | 114 | void |
113 | acpi_tb_install_table(acpi_physical_address address, | 115 | acpi_tb_install_table(acpi_physical_address address, |
114 | char *signature, u32 table_index); | 116 | char *signature, u32 table_index); |
diff --git a/drivers/acpi/acpica/psxface.c b/drivers/acpi/acpica/psxface.c index 67e7ad517051..c42f067cff9d 100644 --- a/drivers/acpi/acpica/psxface.c +++ b/drivers/acpi/acpica/psxface.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include "acparser.h" | 46 | #include "acparser.h" |
47 | #include "acdispat.h" | 47 | #include "acdispat.h" |
48 | #include "acinterp.h" | 48 | #include "acinterp.h" |
49 | #include "actables.h" | ||
49 | #include "amlcode.h" | 50 | #include "amlcode.h" |
50 | 51 | ||
51 | #define _COMPONENT ACPI_PARSER | 52 | #define _COMPONENT ACPI_PARSER |
diff --git a/drivers/acpi/acpica/tbutils.c b/drivers/acpi/acpica/tbutils.c index 07bc7437f82b..1efb0940e8b2 100644 --- a/drivers/acpi/acpica/tbutils.c +++ b/drivers/acpi/acpica/tbutils.c | |||
@@ -387,6 +387,41 @@ void acpi_tb_check_dsdt_header(void) | |||
387 | 387 | ||
388 | /******************************************************************************* | 388 | /******************************************************************************* |
389 | * | 389 | * |
390 | * FUNCTION: acpi_tb_copy_dsdt | ||
391 | * | ||
392 | * PARAMETERS: table_desc - Installed table to copy | ||
393 | * | ||
394 | * RETURN: None | ||
395 | * | ||
396 | * DESCRIPTION: Implements a subsystem option to copy the DSDT to local memory. | ||
397 | * Some very bad BIOSs are known to either corrupt the DSDT or | ||
398 | * install a new, bad DSDT. This copy works around the problem. | ||
399 | * | ||
400 | ******************************************************************************/ | ||
401 | |||
402 | void acpi_tb_copy_dsdt(struct acpi_table_desc *table_desc) | ||
403 | { | ||
404 | struct acpi_table_header *new_table; | ||
405 | |||
406 | new_table = ACPI_ALLOCATE(table_desc->length); | ||
407 | if (!new_table) { | ||
408 | ACPI_ERROR((AE_INFO, "Could not copy DSDT of length 0x%X", | ||
409 | table_desc->length)); | ||
410 | return; | ||
411 | } | ||
412 | |||
413 | ACPI_MEMCPY(new_table, table_desc->pointer, table_desc->length); | ||
414 | acpi_tb_delete_table(table_desc); | ||
415 | table_desc->pointer = new_table; | ||
416 | table_desc->flags = ACPI_TABLE_ORIGIN_ALLOCATED; | ||
417 | |||
418 | ACPI_INFO((AE_INFO, | ||
419 | "Forced DSDT copy: length 0x%05X copied locally, original unmapped", | ||
420 | new_table->length)); | ||
421 | } | ||
422 | |||
423 | /******************************************************************************* | ||
424 | * | ||
390 | * FUNCTION: acpi_tb_install_table | 425 | * FUNCTION: acpi_tb_install_table |
391 | * | 426 | * |
392 | * PARAMETERS: Address - Physical address of DSDT or FACS | 427 | * PARAMETERS: Address - Physical address of DSDT or FACS |
diff --git a/drivers/acpi/acpica/tbxface.c b/drivers/acpi/acpica/tbxface.c index 30565100b94c..f5378fc302b3 100644 --- a/drivers/acpi/acpica/tbxface.c +++ b/drivers/acpi/acpica/tbxface.c | |||
@@ -532,6 +532,16 @@ static acpi_status acpi_tb_load_namespace(void) | |||
532 | } | 532 | } |
533 | 533 | ||
534 | /* | 534 | /* |
535 | * Optionally copy the entire DSDT to local memory (instead of simply | ||
536 | * mapping it.) There are some BIOSs that corrupt or replace the original | ||
537 | * DSDT, creating the need for this option. Default is FALSE, do not copy | ||
538 | * the DSDT. | ||
539 | */ | ||
540 | if (acpi_gbl_copy_dsdt_locally) { | ||
541 | acpi_tb_copy_dsdt(acpi_gbl_DSDT); | ||
542 | } | ||
543 | |||
544 | /* | ||
535 | * Save the original DSDT header for detection of table corruption | 545 | * Save the original DSDT header for detection of table corruption |
536 | * and/or replacement of the DSDT from outside the OS. | 546 | * and/or replacement of the DSDT from outside the OS. |
537 | */ | 547 | */ |
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index f753222d5cfa..fd815f605426 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h | |||
@@ -68,6 +68,7 @@ extern u8 acpi_gbl_use_default_register_widths; | |||
68 | extern acpi_name acpi_gbl_trace_method_name; | 68 | extern acpi_name acpi_gbl_trace_method_name; |
69 | extern u32 acpi_gbl_trace_flags; | 69 | extern u32 acpi_gbl_trace_flags; |
70 | extern u8 acpi_gbl_enable_aml_debug_object; | 70 | extern u8 acpi_gbl_enable_aml_debug_object; |
71 | extern u8 acpi_gbl_copy_dsdt_locally; | ||
71 | 72 | ||
72 | extern u32 acpi_current_gpe_count; | 73 | extern u32 acpi_current_gpe_count; |
73 | extern struct acpi_table_fadt acpi_gbl_FADT; | 74 | extern struct acpi_table_fadt acpi_gbl_FADT; |