Commit 186c307f authored by Bob Moore's avatar Bob Moore Committed by Len Brown

ACPICA: Add GPE support for dynamically loaded ACPI tables

For all GPEs, including FADT-based and GPE Block Devices, execute
any _PRW methods in the new table, and process any _Lxx/_Exx GPE
methods in the new table. Any runtime GPE that is referred to
by an _Lxx/_Exx method in the new table is immediately enabled.
ACPICA BZ 833.

http://www.acpica.org/bugzilla/show_bug.cgi?id=833Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarLin Ming <ming.m.lin@intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent b9ee2043
...@@ -110,6 +110,8 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, ...@@ -110,6 +110,8 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
u32 interrupt_number, u32 interrupt_number,
struct acpi_gpe_block_info **return_gpe_block); struct acpi_gpe_block_info **return_gpe_block);
void acpi_ev_update_gpes(acpi_owner_id table_owner_id);
acpi_status acpi_status
acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device,
struct acpi_gpe_block_info *gpe_block); struct acpi_gpe_block_info *gpe_block);
......
...@@ -470,6 +470,10 @@ struct acpi_gpe_xrupt_info { ...@@ -470,6 +470,10 @@ struct acpi_gpe_xrupt_info {
struct acpi_gpe_walk_info { struct acpi_gpe_walk_info {
struct acpi_namespace_node *gpe_device; struct acpi_namespace_node *gpe_device;
struct acpi_gpe_block_info *gpe_block; struct acpi_gpe_block_info *gpe_block;
u16 count;
acpi_owner_id owner_id;
u8 enable_this_gpe;
u8 execute_by_owner_id;
}; };
struct acpi_gpe_device_info { struct acpi_gpe_device_info {
......
...@@ -265,7 +265,7 @@ struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device, ...@@ -265,7 +265,7 @@ struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device,
ACPI_FUNCTION_ENTRY(); ACPI_FUNCTION_ENTRY();
/* A NULL gpe_block means use the FADT-defined GPE block(s) */ /* A NULL gpe_device means use the FADT-defined GPE block(s) */
if (!gpe_device) { if (!gpe_device) {
......
This diff is collapsed.
...@@ -82,8 +82,9 @@ acpi_ex_add_table(u32 table_index, ...@@ -82,8 +82,9 @@ acpi_ex_add_table(u32 table_index,
struct acpi_namespace_node *parent_node, struct acpi_namespace_node *parent_node,
union acpi_operand_object **ddb_handle) union acpi_operand_object **ddb_handle)
{ {
acpi_status status;
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
acpi_status status;
acpi_owner_id owner_id;
ACPI_FUNCTION_TRACE(ex_add_table); ACPI_FUNCTION_TRACE(ex_add_table);
...@@ -119,7 +120,14 @@ acpi_ex_add_table(u32 table_index, ...@@ -119,7 +120,14 @@ acpi_ex_add_table(u32 table_index,
acpi_ns_exec_module_code_list(); acpi_ns_exec_module_code_list();
acpi_ex_enter_interpreter(); acpi_ex_enter_interpreter();
return_ACPI_STATUS(status); /* Update GPEs for any new _PRW or _Lxx/_Exx methods. Ignore errors */
status = acpi_tb_get_owner_id(table_index, &owner_id);
if (ACPI_SUCCESS(status)) {
acpi_ev_update_gpes(owner_id);
}
return_ACPI_STATUS(AE_OK);
} }
/******************************************************************************* /*******************************************************************************
...@@ -248,10 +256,8 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state, ...@@ -248,10 +256,8 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
status = acpi_get_table_by_index(table_index, &table); status = acpi_get_table_by_index(table_index, &table);
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
ACPI_INFO((AE_INFO, ACPI_INFO((AE_INFO, "Dynamic OEM Table Load:"));
"Dynamic OEM Table Load - [%.4s] OemId [%.6s] OemTableId [%.8s]", acpi_tb_print_table_header(0, table);
table->signature, table->oem_id,
table->oem_table_id));
} }
/* Invoke table handler if present */ /* Invoke table handler if present */
...@@ -525,6 +531,9 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, ...@@ -525,6 +531,9 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
ACPI_INFO((AE_INFO, "Dynamic OEM Table Load:"));
acpi_tb_print_table_header(0, table_desc.pointer);
/* Remove the reference by added by acpi_ex_store above */ /* Remove the reference by added by acpi_ex_store above */
acpi_ut_remove_reference(ddb_handle); acpi_ut_remove_reference(ddb_handle);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment