mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
ACPICA: Add subsystem option to force copy of DSDT to local memory
Optionally copy the entire DSDT to local memory (instead of simply mapping it.) There are some BIOSs that corrupt or replace the original DSDT, creating the need for this option. Default is FALSE, do not copy the DSDT. https://bugzilla.kernel.org/show_bug.cgi?id=14679 Signed-off-by: Lin Ming <ming.m.lin@intel.com> Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
729df0f848
commit
69ec87efa8
6 changed files with 57 additions and 0 deletions
|
@ -117,6 +117,14 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_use_default_register_widths, TRUE);
|
||||||
*/
|
*/
|
||||||
u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE);
|
u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Optionally copy the entire DSDT to local memory (instead of simply
|
||||||
|
* mapping it.) There are some BIOSs that corrupt or replace the original
|
||||||
|
* DSDT, creating the need for this option. Default is FALSE, do not copy
|
||||||
|
* the DSDT.
|
||||||
|
*/
|
||||||
|
u8 ACPI_INIT_GLOBAL(acpi_gbl_copy_dsdt_locally, FALSE);
|
||||||
|
|
||||||
/* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */
|
/* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */
|
||||||
|
|
||||||
struct acpi_table_fadt acpi_gbl_FADT;
|
struct acpi_table_fadt acpi_gbl_FADT;
|
||||||
|
|
|
@ -109,6 +109,8 @@ acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length);
|
||||||
|
|
||||||
void acpi_tb_check_dsdt_header(void);
|
void acpi_tb_check_dsdt_header(void);
|
||||||
|
|
||||||
|
void acpi_tb_copy_dsdt(struct acpi_table_desc *table_desc);
|
||||||
|
|
||||||
void
|
void
|
||||||
acpi_tb_install_table(acpi_physical_address address,
|
acpi_tb_install_table(acpi_physical_address address,
|
||||||
char *signature, u32 table_index);
|
char *signature, u32 table_index);
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
#include "acparser.h"
|
#include "acparser.h"
|
||||||
#include "acdispat.h"
|
#include "acdispat.h"
|
||||||
#include "acinterp.h"
|
#include "acinterp.h"
|
||||||
|
#include "actables.h"
|
||||||
#include "amlcode.h"
|
#include "amlcode.h"
|
||||||
|
|
||||||
#define _COMPONENT ACPI_PARSER
|
#define _COMPONENT ACPI_PARSER
|
||||||
|
|
|
@ -385,6 +385,41 @@ void acpi_tb_check_dsdt_header(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
*
|
||||||
|
* FUNCTION: acpi_tb_copy_dsdt
|
||||||
|
*
|
||||||
|
* PARAMETERS: table_desc - Installed table to copy
|
||||||
|
*
|
||||||
|
* RETURN: None
|
||||||
|
*
|
||||||
|
* DESCRIPTION: Implements a subsystem option to copy the DSDT to local memory.
|
||||||
|
* Some very bad BIOSs are known to either corrupt the DSDT or
|
||||||
|
* install a new, bad DSDT. This copy works around the problem.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
void acpi_tb_copy_dsdt(struct acpi_table_desc *table_desc)
|
||||||
|
{
|
||||||
|
struct acpi_table_header *new_table;
|
||||||
|
|
||||||
|
new_table = ACPI_ALLOCATE(table_desc->length);
|
||||||
|
if (!new_table) {
|
||||||
|
ACPI_ERROR((AE_INFO, "Could not copy DSDT of length 0x%X",
|
||||||
|
table_desc->length));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ACPI_MEMCPY(new_table, table_desc->pointer, table_desc->length);
|
||||||
|
acpi_tb_delete_table(table_desc);
|
||||||
|
table_desc->pointer = new_table;
|
||||||
|
table_desc->flags = ACPI_TABLE_ORIGIN_ALLOCATED;
|
||||||
|
|
||||||
|
ACPI_INFO((AE_INFO,
|
||||||
|
"Forced DSDT copy: length 0x%05X copied locally, original unmapped",
|
||||||
|
new_table->length));
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
*
|
*
|
||||||
* FUNCTION: acpi_tb_install_table
|
* FUNCTION: acpi_tb_install_table
|
||||||
|
|
|
@ -531,6 +531,16 @@ static acpi_status acpi_tb_load_namespace(void)
|
||||||
goto unlock_and_exit;
|
goto unlock_and_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Optionally copy the entire DSDT to local memory (instead of simply
|
||||||
|
* mapping it.) There are some BIOSs that corrupt or replace the original
|
||||||
|
* DSDT, creating the need for this option. Default is FALSE, do not copy
|
||||||
|
* the DSDT.
|
||||||
|
*/
|
||||||
|
if (acpi_gbl_copy_dsdt_locally) {
|
||||||
|
acpi_tb_copy_dsdt(acpi_gbl_DSDT);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Save the original DSDT header for detection of table corruption
|
* Save the original DSDT header for detection of table corruption
|
||||||
* and/or replacement of the DSDT from outside the OS.
|
* and/or replacement of the DSDT from outside the OS.
|
||||||
|
|
|
@ -68,6 +68,7 @@ extern u8 acpi_gbl_use_default_register_widths;
|
||||||
extern acpi_name acpi_gbl_trace_method_name;
|
extern acpi_name acpi_gbl_trace_method_name;
|
||||||
extern u32 acpi_gbl_trace_flags;
|
extern u32 acpi_gbl_trace_flags;
|
||||||
extern u8 acpi_gbl_enable_aml_debug_object;
|
extern u8 acpi_gbl_enable_aml_debug_object;
|
||||||
|
extern u8 acpi_gbl_copy_dsdt_locally;
|
||||||
|
|
||||||
extern u32 acpi_current_gpe_count;
|
extern u32 acpi_current_gpe_count;
|
||||||
extern struct acpi_table_fadt acpi_gbl_FADT;
|
extern struct acpi_table_fadt acpi_gbl_FADT;
|
||||||
|
|
Loading…
Reference in a new issue