Commit 62fd33d3 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branch 'acpica'

* acpica:
  ACPICA: Update version to 20190703
  ACPICA: Update table load object initialization
  ACPICA: Update for object initialization sequence
  ACPICA: remove legacy module-level code due to deprecation
  ACPICA: Namespace: simplify creation of the initial/default namespace
  ACPICA: Clear status of GPEs on first direct enable
parents 8ca572ec 02a93f35
...@@ -69,7 +69,8 @@ acpi_status ...@@ -69,7 +69,8 @@ acpi_status
acpi_ev_mask_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 is_masked); acpi_ev_mask_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 is_masked);
acpi_status acpi_status
acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info); acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info,
u8 clear_on_enable);
acpi_status acpi_status
acpi_ev_remove_gpe_reference(struct acpi_gpe_event_info *gpe_event_info); acpi_ev_remove_gpe_reference(struct acpi_gpe_event_info *gpe_event_info);
......
...@@ -178,7 +178,6 @@ ACPI_GLOBAL(u8, acpi_gbl_verbose_leak_dump); ...@@ -178,7 +178,6 @@ ACPI_GLOBAL(u8, acpi_gbl_verbose_leak_dump);
ACPI_GLOBAL(struct acpi_namespace_node, acpi_gbl_root_node_struct); ACPI_GLOBAL(struct acpi_namespace_node, acpi_gbl_root_node_struct);
ACPI_GLOBAL(struct acpi_namespace_node *, acpi_gbl_root_node); ACPI_GLOBAL(struct acpi_namespace_node *, acpi_gbl_root_node);
ACPI_GLOBAL(struct acpi_namespace_node *, acpi_gbl_fadt_gpe_device); ACPI_GLOBAL(struct acpi_namespace_node *, acpi_gbl_fadt_gpe_device);
ACPI_GLOBAL(union acpi_operand_object *, acpi_gbl_module_code_list);
extern const u8 acpi_gbl_ns_properties[ACPI_NUM_NS_TYPES]; extern const u8 acpi_gbl_ns_properties[ACPI_NUM_NS_TYPES];
extern const struct acpi_predefined_names extern const struct acpi_predefined_names
......
...@@ -207,8 +207,6 @@ acpi_ns_dump_object_paths(acpi_object_type type, ...@@ -207,8 +207,6 @@ acpi_ns_dump_object_paths(acpi_object_type type,
*/ */
acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info); acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info);
void acpi_ns_exec_module_code_list(void);
/* /*
* nsarguments - Argument count/type checking for predefined/reserved names * nsarguments - Argument count/type checking for predefined/reserved names
*/ */
......
...@@ -202,7 +202,7 @@ acpi_ds_initialize_objects(u32 table_index, ...@@ -202,7 +202,7 @@ acpi_ds_initialize_objects(u32 table_index,
if (ACPI_COMPARE_NAMESEG(table->signature, ACPI_SIG_DSDT)) { if (ACPI_COMPARE_NAMESEG(table->signature, ACPI_SIG_DSDT)) {
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
"\nInitializing Namespace objects:\n")); "\nACPI table initialization:\n"));
} }
/* Summary of objects initialized */ /* Summary of objects initialized */
......
...@@ -146,6 +146,7 @@ acpi_ev_mask_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 is_masked) ...@@ -146,6 +146,7 @@ acpi_ev_mask_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 is_masked)
* FUNCTION: acpi_ev_add_gpe_reference * FUNCTION: acpi_ev_add_gpe_reference
* *
* PARAMETERS: gpe_event_info - Add a reference to this GPE * PARAMETERS: gpe_event_info - Add a reference to this GPE
* clear_on_enable - Clear GPE status before enabling it
* *
* RETURN: Status * RETURN: Status
* *
...@@ -155,7 +156,8 @@ acpi_ev_mask_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 is_masked) ...@@ -155,7 +156,8 @@ acpi_ev_mask_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 is_masked)
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info) acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info,
u8 clear_on_enable)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
...@@ -170,6 +172,10 @@ acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info) ...@@ -170,6 +172,10 @@ acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info)
/* Enable on first reference */ /* Enable on first reference */
if (clear_on_enable) {
(void)acpi_hw_clear_gpe(gpe_event_info);
}
status = acpi_ev_update_gpe_enable_mask(gpe_event_info); status = acpi_ev_update_gpe_enable_mask(gpe_event_info);
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
status = acpi_ev_enable_gpe(gpe_event_info); status = acpi_ev_enable_gpe(gpe_event_info);
......
...@@ -453,7 +453,7 @@ acpi_ev_initialize_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, ...@@ -453,7 +453,7 @@ acpi_ev_initialize_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
continue; continue;
} }
status = acpi_ev_add_gpe_reference(gpe_event_info); status = acpi_ev_add_gpe_reference(gpe_event_info, FALSE);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_EXCEPTION((AE_INFO, status, ACPI_EXCEPTION((AE_INFO, status,
"Could not enable GPE 0x%02X", "Could not enable GPE 0x%02X",
......
...@@ -971,7 +971,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device, ...@@ -971,7 +971,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
ACPI_GPE_DISPATCH_METHOD) || ACPI_GPE_DISPATCH_METHOD) ||
(ACPI_GPE_DISPATCH_TYPE(handler->original_flags) == (ACPI_GPE_DISPATCH_TYPE(handler->original_flags) ==
ACPI_GPE_DISPATCH_NOTIFY)) && handler->originally_enabled) { ACPI_GPE_DISPATCH_NOTIFY)) && handler->originally_enabled) {
(void)acpi_ev_add_gpe_reference(gpe_event_info); (void)acpi_ev_add_gpe_reference(gpe_event_info, FALSE);
if (ACPI_GPE_IS_POLLING_NEEDED(gpe_event_info)) { if (ACPI_GPE_IS_POLLING_NEEDED(gpe_event_info)) {
/* Poll edge triggered GPEs to handle existing events */ /* Poll edge triggered GPEs to handle existing events */
......
...@@ -108,7 +108,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number) ...@@ -108,7 +108,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number)
if (gpe_event_info) { if (gpe_event_info) {
if (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) != if (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) !=
ACPI_GPE_DISPATCH_NONE) { ACPI_GPE_DISPATCH_NONE) {
status = acpi_ev_add_gpe_reference(gpe_event_info); status = acpi_ev_add_gpe_reference(gpe_event_info, TRUE);
if (ACPI_SUCCESS(status) && if (ACPI_SUCCESS(status) &&
ACPI_GPE_IS_POLLING_NEEDED(gpe_event_info)) { ACPI_GPE_IS_POLLING_NEEDED(gpe_event_info)) {
......
...@@ -174,12 +174,9 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state, ...@@ -174,12 +174,9 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
/* Complete the initialization/resolution of package objects */ /* Complete the initialization/resolution of new objects */
status = acpi_ns_walk_namespace(ACPI_TYPE_PACKAGE, ACPI_ROOT_OBJECT, acpi_ns_initialize_objects();
ACPI_UINT32_MAX, 0,
acpi_ns_init_one_package, NULL, NULL,
NULL);
/* Parameter Data (optional) */ /* Parameter Data (optional) */
...@@ -437,12 +434,11 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, ...@@ -437,12 +434,11 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
/* Complete the initialization/resolution of package objects */ /* Complete the initialization/resolution of new objects */
status = acpi_ns_walk_namespace(ACPI_TYPE_PACKAGE, ACPI_ROOT_OBJECT, acpi_ex_exit_interpreter();
ACPI_UINT32_MAX, 0, acpi_ns_initialize_objects();
acpi_ns_init_one_package, NULL, NULL, acpi_ex_enter_interpreter();
NULL);
/* Store the ddb_handle into the Target operand */ /* Store the ddb_handle into the Target operand */
......
...@@ -36,6 +36,7 @@ acpi_status acpi_ns_root_initialize(void) ...@@ -36,6 +36,7 @@ acpi_status acpi_ns_root_initialize(void)
acpi_status status; acpi_status status;
const struct acpi_predefined_names *init_val = NULL; const struct acpi_predefined_names *init_val = NULL;
struct acpi_namespace_node *new_node; struct acpi_namespace_node *new_node;
struct acpi_namespace_node *prev_node = NULL;
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
acpi_string val = NULL; acpi_string val = NULL;
...@@ -61,12 +62,28 @@ acpi_status acpi_ns_root_initialize(void) ...@@ -61,12 +62,28 @@ acpi_status acpi_ns_root_initialize(void)
*/ */
acpi_gbl_root_node = &acpi_gbl_root_node_struct; acpi_gbl_root_node = &acpi_gbl_root_node_struct;
/* Enter the pre-defined names in the name table */ /* Enter the predefined names in the name table */
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Entering predefined entries into namespace\n")); "Entering predefined entries into namespace\n"));
/*
* Create the initial (default) namespace.
* This namespace looks like something similar to this:
*
* ACPI Namespace (from Namespace Root):
* 0 _GPE Scope 00203160 00
* 0 _PR_ Scope 002031D0 00
* 0 _SB_ Device 00203240 00 Notify Object: 0020ADD8
* 0 _SI_ Scope 002032B0 00
* 0 _TZ_ Device 00203320 00
* 0 _REV Integer 00203390 00 = 0000000000000002
* 0 _OS_ String 00203488 00 Len 14 "Microsoft Windows NT"
* 0 _GL_ Mutex 00203580 00 Object 002035F0
* 0 _OSI Method 00203678 00 Args 1 Len 0000 Aml 00000000
*/
for (init_val = acpi_gbl_pre_defined_names; init_val->name; init_val++) { for (init_val = acpi_gbl_pre_defined_names; init_val->name; init_val++) {
status = AE_OK;
/* _OSI is optional for now, will be permanent later */ /* _OSI is optional for now, will be permanent later */
...@@ -75,17 +92,32 @@ acpi_status acpi_ns_root_initialize(void) ...@@ -75,17 +92,32 @@ acpi_status acpi_ns_root_initialize(void)
continue; continue;
} }
status = /*
acpi_ns_lookup(NULL, ACPI_CAST_PTR(char, init_val->name), * Create, init, and link the new predefined name
init_val->type, ACPI_IMODE_LOAD_PASS2, * Note: No need to use acpi_ns_lookup here because all the
ACPI_NS_NO_UPSEARCH, NULL, &new_node); * predefined names are at the root level. It is much easier to
if (ACPI_FAILURE(status)) { * just create and link the new node(s) here.
ACPI_EXCEPTION((AE_INFO, status, */
"Could not create predefined name %s", new_node =
init_val->name)); ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_namespace_node));
continue; if (!new_node) {
status = AE_NO_MEMORY;
goto unlock_and_exit;
} }
ACPI_COPY_NAMESEG(new_node->name.ascii, init_val->name);
new_node->descriptor_type = ACPI_DESC_TYPE_NAMED;
new_node->type = init_val->type;
if (!prev_node) {
acpi_gbl_root_node_struct.child = new_node;
} else {
prev_node->peer = new_node;
}
new_node->parent = &acpi_gbl_root_node_struct;
prev_node = new_node;
/* /*
* Name entered successfully. If entry in pre_defined_names[] specifies * Name entered successfully. If entry in pre_defined_names[] specifies
* an initial value, create the initial value. * an initial value, create the initial value.
...@@ -131,7 +163,7 @@ acpi_status acpi_ns_root_initialize(void) ...@@ -131,7 +163,7 @@ acpi_status acpi_ns_root_initialize(void)
new_node->value = obj_desc->method.param_count; new_node->value = obj_desc->method.param_count;
#else #else
/* Mark this as a very SPECIAL method */ /* Mark this as a very SPECIAL method (_OSI) */
obj_desc->method.info_flags = obj_desc->method.info_flags =
ACPI_METHOD_INTERNAL_ONLY; ACPI_METHOD_INTERNAL_ONLY;
......
...@@ -14,11 +14,6 @@ ...@@ -14,11 +14,6 @@
#define _COMPONENT ACPI_NAMESPACE #define _COMPONENT ACPI_NAMESPACE
ACPI_MODULE_NAME("nseval") ACPI_MODULE_NAME("nseval")
/* Local prototypes */
static void
acpi_ns_exec_module_code(union acpi_operand_object *method_obj,
struct acpi_evaluate_info *info);
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ns_evaluate * FUNCTION: acpi_ns_evaluate
...@@ -44,7 +39,6 @@ acpi_ns_exec_module_code(union acpi_operand_object *method_obj, ...@@ -44,7 +39,6 @@ acpi_ns_exec_module_code(union acpi_operand_object *method_obj,
* MUTEX: Locks interpreter * MUTEX: Locks interpreter
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info) acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info)
{ {
acpi_status status; acpi_status status;
...@@ -310,187 +304,3 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info) ...@@ -310,187 +304,3 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info)
info->full_pathname = NULL; info->full_pathname = NULL;
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
/*******************************************************************************
*
* FUNCTION: acpi_ns_exec_module_code_list
*
* PARAMETERS: None
*
* RETURN: None. Exceptions during method execution are ignored, since
* we cannot abort a table load.
*
* DESCRIPTION: Execute all elements of the global module-level code list.
* Each element is executed as a single control method.
*
* NOTE: With this option enabled, each block of detected executable AML
* code that is outside of any control method is wrapped with a temporary
* control method object and placed on a global list. The methods on this
* list are executed below.
*
* This function executes the module-level code for all tables only after
* all of the tables have been loaded. It is a legacy option and is
* not compatible with other ACPI implementations. See acpi_ns_load_table.
*
* This function will be removed when the legacy option is removed.
*
******************************************************************************/
void acpi_ns_exec_module_code_list(void)
{
union acpi_operand_object *prev;
union acpi_operand_object *next;
struct acpi_evaluate_info *info;
u32 method_count = 0;
ACPI_FUNCTION_TRACE(ns_exec_module_code_list);
/* Exit now if the list is empty */
next = acpi_gbl_module_code_list;
if (!next) {
ACPI_DEBUG_PRINT((ACPI_DB_INIT_NAMES,
"Legacy MLC block list is empty\n"));
return_VOID;
}
/* Allocate the evaluation information block */
info = ACPI_ALLOCATE(sizeof(struct acpi_evaluate_info));
if (!info) {
return_VOID;
}
/* Walk the list, executing each "method" */
while (next) {
prev = next;
next = next->method.mutex;
/* Clear the link field and execute the method */
prev->method.mutex = NULL;
acpi_ns_exec_module_code(prev, info);
method_count++;
/* Delete the (temporary) method object */
acpi_ut_remove_reference(prev);
}
ACPI_INFO(("Executed %u blocks of module-level executable AML code",
method_count));
ACPI_FREE(info);
acpi_gbl_module_code_list = NULL;
return_VOID;
}
/*******************************************************************************
*
* FUNCTION: acpi_ns_exec_module_code
*
* PARAMETERS: method_obj - Object container for the module-level code
* info - Info block for method evaluation
*
* RETURN: None. Exceptions during method execution are ignored, since
* we cannot abort a table load.
*
* DESCRIPTION: Execute a control method containing a block of module-level
* executable AML code. The control method is temporarily
* installed to the root node, then evaluated.
*
******************************************************************************/
static void
acpi_ns_exec_module_code(union acpi_operand_object *method_obj,
struct acpi_evaluate_info *info)
{
union acpi_operand_object *parent_obj;
struct acpi_namespace_node *parent_node;
acpi_object_type type;
acpi_status status;
ACPI_FUNCTION_TRACE(ns_exec_module_code);
/*
* Get the parent node. We cheat by using the next_object field
* of the method object descriptor.
*/
parent_node =
ACPI_CAST_PTR(struct acpi_namespace_node,
method_obj->method.next_object);
type = acpi_ns_get_type(parent_node);
/*
* Get the region handler and save it in the method object. We may need
* this if an operation region declaration causes a _REG method to be run.
*
* We can't do this in acpi_ps_link_module_code because
* acpi_gbl_root_node->Object is NULL at PASS1.
*/
if ((type == ACPI_TYPE_DEVICE) && parent_node->object) {
method_obj->method.dispatch.handler =
parent_node->object->device.handler;
}
/* Must clear next_object (acpi_ns_attach_object needs the field) */
method_obj->method.next_object = NULL;
/* Initialize the evaluation information block */
memset(info, 0, sizeof(struct acpi_evaluate_info));
info->prefix_node = parent_node;
/*
* Get the currently attached parent object. Add a reference,
* because the ref count will be decreased when the method object
* is installed to the parent node.
*/
parent_obj = acpi_ns_get_attached_object(parent_node);
if (parent_obj) {
acpi_ut_add_reference(parent_obj);
}
/* Install the method (module-level code) in the parent node */
status =
acpi_ns_attach_object(parent_node, method_obj, ACPI_TYPE_METHOD);
if (ACPI_FAILURE(status)) {
goto exit;
}
/* Execute the parent node as a control method */
status = acpi_ns_evaluate(info);
ACPI_DEBUG_PRINT((ACPI_DB_INIT_NAMES,
"Executed module-level code at %p\n",
method_obj->method.aml_start));
/* Delete a possible implicit return value (in slack mode) */
if (info->return_object) {
acpi_ut_remove_reference(info->return_object);
}
/* Detach the temporary method object */
acpi_ns_detach_object(parent_node);
/* Restore the original parent object */
if (parent_obj) {
status = acpi_ns_attach_object(parent_node, parent_obj, type);
} else {
parent_node->type = (u8)type;
}
exit:
if (parent_obj) {
acpi_ut_remove_reference(parent_obj);
}
return_VOID;
}
...@@ -55,14 +55,19 @@ acpi_status acpi_ns_initialize_objects(void) ...@@ -55,14 +55,19 @@ acpi_status acpi_ns_initialize_objects(void)
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"**** Starting initialization of namespace objects ****\n")); "**** Starting initialization of namespace objects ****\n"));
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
"Completing Region/Field/Buffer/Package initialization:\n")); "Final data object initialization: "));
/* Set all init info to zero */ /* Clear the info block */
memset(&info, 0, sizeof(struct acpi_init_walk_info)); memset(&info, 0, sizeof(struct acpi_init_walk_info));
/* Walk entire namespace from the supplied root */ /* Walk entire namespace from the supplied root */
/*
* TBD: will become ACPI_TYPE_PACKAGE as this type object
* is now the only one that supports deferred initialization
* (forward references).
*/
status = acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, status = acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
ACPI_UINT32_MAX, acpi_ns_init_one_object, ACPI_UINT32_MAX, acpi_ns_init_one_object,
NULL, &info, NULL); NULL, &info, NULL);
...@@ -71,13 +76,8 @@ acpi_status acpi_ns_initialize_objects(void) ...@@ -71,13 +76,8 @@ acpi_status acpi_ns_initialize_objects(void)
} }
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
" Initialized %u/%u Regions %u/%u Fields %u/%u " "Namespace contains %u (0x%X) objects\n",
"Buffers %u/%u Packages (%u nodes)\n", info.object_count, info.object_count));
info.op_region_init, info.op_region_count,
info.field_init, info.field_count,
info.buffer_init, info.buffer_count,
info.package_init, info.package_count,
info.object_count));
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"%u Control Methods found\n%u Op Regions found\n", "%u Control Methods found\n%u Op Regions found\n",
...@@ -382,34 +382,18 @@ acpi_ns_init_one_object(acpi_handle obj_handle, ...@@ -382,34 +382,18 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
acpi_ex_enter_interpreter(); acpi_ex_enter_interpreter();
/* /*
* Each of these types can contain executable AML code within the * Only initialization of Package objects can be deferred, in order
* declaration. * to support forward references.
*/ */
switch (type) { switch (type) {
case ACPI_TYPE_REGION:
info->op_region_init++;
status = acpi_ds_get_region_arguments(obj_desc);
break;
case ACPI_TYPE_BUFFER_FIELD:
info->field_init++;
status = acpi_ds_get_buffer_field_arguments(obj_desc);
break;
case ACPI_TYPE_LOCAL_BANK_FIELD: case ACPI_TYPE_LOCAL_BANK_FIELD:
/* TBD: bank_fields do not require deferred init, remove this code */
info->field_init++; info->field_init++;
status = acpi_ds_get_bank_field_arguments(obj_desc); status = acpi_ds_get_bank_field_arguments(obj_desc);
break; break;
case ACPI_TYPE_BUFFER:
info->buffer_init++;
status = acpi_ds_get_buffer_arguments(obj_desc);
break;
case ACPI_TYPE_PACKAGE: case ACPI_TYPE_PACKAGE:
/* Complete the initialization/resolution of the package object */ /* Complete the initialization/resolution of the package object */
...@@ -421,8 +405,13 @@ acpi_ns_init_one_object(acpi_handle obj_handle, ...@@ -421,8 +405,13 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
default: default:
/* No other types can get here */ /* No other types should get here */
status = AE_TYPE;
ACPI_EXCEPTION((AE_INFO, status,
"Opcode is not deferred [%4.4s] (%s)",
acpi_ut_get_node_name(node),
acpi_ut_get_type_name(type)));
break; break;
} }
......
...@@ -109,18 +109,6 @@ acpi_ns_load_table(u32 table_index, struct acpi_namespace_node *node) ...@@ -109,18 +109,6 @@ acpi_ns_load_table(u32 table_index, struct acpi_namespace_node *node)
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"**** Completed Table Object Initialization\n")); "**** Completed Table Object Initialization\n"));
/*
* This case handles the legacy option that groups all module-level
* code blocks together and defers execution until all of the tables
* are loaded. Execute all of these blocks at this time.
* Execute any module-level code that was detected during the table
* load phase.
*
* Note: this option is deprecated and will be eliminated in the
* future. Use of this option can cause problems with AML code that
* depends upon in-order immediate execution of module-level code.
*/
acpi_ns_exec_module_code_list();
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
......
...@@ -560,21 +560,9 @@ struct acpi_namespace_node *acpi_ns_validate_handle(acpi_handle handle) ...@@ -560,21 +560,9 @@ struct acpi_namespace_node *acpi_ns_validate_handle(acpi_handle handle)
void acpi_ns_terminate(void) void acpi_ns_terminate(void)
{ {
acpi_status status; acpi_status status;
union acpi_operand_object *prev;
union acpi_operand_object *next;
ACPI_FUNCTION_TRACE(ns_terminate); ACPI_FUNCTION_TRACE(ns_terminate);
/* Delete any module-level code blocks */
next = acpi_gbl_module_code_list;
while (next) {
prev = next;
next = next->method.mutex;
prev->method.mutex = NULL; /* Clear the Mutex (cheated) field */
acpi_ut_remove_reference(prev);
}
/* /*
* Free the entire namespace -- all nodes and all objects * Free the entire namespace -- all nodes and all objects
* attached to the nodes * attached to the nodes
......
...@@ -933,19 +933,6 @@ acpi_tb_load_table(u32 table_index, struct acpi_namespace_node *parent_node) ...@@ -933,19 +933,6 @@ acpi_tb_load_table(u32 table_index, struct acpi_namespace_node *parent_node)
status = acpi_ns_load_table(table_index, parent_node); status = acpi_ns_load_table(table_index, parent_node);
/*
* This case handles the legacy option that groups all module-level
* code blocks together and defers execution until all of the tables
* are loaded. Execute all of these blocks at this time.
* Execute any module-level code that was detected during the table
* load phase.
*
* Note: this option is deprecated and will be eliminated in the
* future. Use of this option can cause problems with AML code that
* depends upon in-order immediate execution of module-level code.
*/
acpi_ns_exec_module_code_list();
/* /*
* Update GPEs for any new _Lxx/_Exx methods. Ignore errors. The host is * Update GPEs for any new _Lxx/_Exx methods. Ignore errors. The host is
* responsible for discovering any new wake GPEs by running _PRW methods * responsible for discovering any new wake GPEs by running _PRW methods
......
...@@ -297,15 +297,11 @@ acpi_status acpi_load_table(struct acpi_table_header *table) ...@@ -297,15 +297,11 @@ acpi_status acpi_load_table(struct acpi_table_header *table)
status = acpi_tb_install_and_load_table(ACPI_PTR_TO_PHYSADDR(table), status = acpi_tb_install_and_load_table(ACPI_PTR_TO_PHYSADDR(table),
ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
FALSE, &table_index); FALSE, &table_index);
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
/* Complete the initialization/resolution of package objects */
status = acpi_ns_walk_namespace(ACPI_TYPE_PACKAGE, /* Complete the initialization/resolution of new objects */
ACPI_ROOT_OBJECT,
ACPI_UINT32_MAX, 0, acpi_ns_initialize_objects();
acpi_ns_init_one_package,
NULL, NULL, NULL);
} }
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
......
...@@ -180,7 +180,6 @@ acpi_status acpi_ut_init_globals(void) ...@@ -180,7 +180,6 @@ acpi_status acpi_ut_init_globals(void)
/* Namespace */ /* Namespace */
acpi_gbl_module_code_list = NULL;
acpi_gbl_root_node = NULL; acpi_gbl_root_node = NULL;
acpi_gbl_root_node_struct.name.integer = ACPI_ROOT_NAME; acpi_gbl_root_node_struct.name.integer = ACPI_ROOT_NAME;
acpi_gbl_root_node_struct.descriptor_type = ACPI_DESC_TYPE_NAMED; acpi_gbl_root_node_struct.descriptor_type = ACPI_DESC_TYPE_NAMED;
......
...@@ -211,24 +211,17 @@ acpi_status ACPI_INIT_FUNCTION acpi_initialize_objects(u32 flags) ...@@ -211,24 +211,17 @@ acpi_status ACPI_INIT_FUNCTION acpi_initialize_objects(u32 flags)
ACPI_FUNCTION_TRACE(acpi_initialize_objects); ACPI_FUNCTION_TRACE(acpi_initialize_objects);
#ifdef ACPI_OBSOLETE_BEHAVIOR
/* /*
* This case handles the legacy option that groups all module-level * 05/2019: Removed, initialization now happens at both object
* code blocks together and defers execution until all of the tables * creation and table load time
* are loaded. Execute all of these blocks at this time.
* Execute any module-level code that was detected during the table
* load phase.
*
* Note: this option is deprecated and will be eliminated in the
* future. Use of this option can cause problems with AML code that
* depends upon in-order immediate execution of module-level code.
*/ */
acpi_ns_exec_module_code_list();
/* /*
* Initialize the objects that remain uninitialized. This * Initialize the objects that remain uninitialized. This
* runs the executable AML that may be part of the * runs the executable AML that may be part of the
* declaration of these objects: * declaration of these objects: operation_regions, buffer_fields,
* operation_regions, buffer_fields, Buffers, and Packages. * bank_fields, Buffers, and Packages.
*/ */
if (!(flags & ACPI_NO_OBJECT_INIT)) { if (!(flags & ACPI_NO_OBJECT_INIT)) {
status = acpi_ns_initialize_objects(); status = acpi_ns_initialize_objects();
...@@ -236,6 +229,7 @@ acpi_status ACPI_INIT_FUNCTION acpi_initialize_objects(u32 flags) ...@@ -236,6 +229,7 @@ acpi_status ACPI_INIT_FUNCTION acpi_initialize_objects(u32 flags)
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
} }
#endif
/* /*
* Initialize all device/region objects in the namespace. This runs * Initialize all device/region objects in the namespace. This runs
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */ /* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20190509 #define ACPI_CA_VERSION 0x20190703
#include <acpi/acconfig.h> #include <acpi/acconfig.h>
#include <acpi/actypes.h> #include <acpi/actypes.h>
......
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