aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/acpi/acpica/acglobal.h8
-rw-r--r--drivers/acpi/acpica/actables.h2
-rw-r--r--drivers/acpi/acpica/psxface.c1
-rw-r--r--drivers/acpi/acpica/tbutils.c35
-rw-r--r--drivers/acpi/acpica/tbxface.c10
-rw-r--r--include/acpi/acpixf.h1
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 */
118u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE); 118u8 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 */
126u8 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
122struct acpi_table_fadt acpi_gbl_FADT; 130struct 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
110void acpi_tb_check_dsdt_header(void); 110void acpi_tb_check_dsdt_header(void);
111 111
112void acpi_tb_copy_dsdt(struct acpi_table_desc *table_desc);
113
112void 114void
113acpi_tb_install_table(acpi_physical_address address, 115acpi_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
402void 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;
68extern acpi_name acpi_gbl_trace_method_name; 68extern acpi_name acpi_gbl_trace_method_name;
69extern u32 acpi_gbl_trace_flags; 69extern u32 acpi_gbl_trace_flags;
70extern u8 acpi_gbl_enable_aml_debug_object; 70extern u8 acpi_gbl_enable_aml_debug_object;
71extern u8 acpi_gbl_copy_dsdt_locally;
71 72
72extern u32 acpi_current_gpe_count; 73extern u32 acpi_current_gpe_count;
73extern struct acpi_table_fadt acpi_gbl_FADT; 74extern struct acpi_table_fadt acpi_gbl_FADT;