Commit 760235cd authored by Lv Zheng's avatar Lv Zheng Committed by Rafael J. Wysocki

ACPICA: Events: Fix acpi_ev_initialize_region() return value

ACPICA commit 543342ab7a676f4eb0c9f100d349388a84dff0e8

This patch changes acpi_ev_initialize_region(), stop returning AE_NOT_EXIST
from it so that, not only in acpi_ds_load2_end_op(), but all places invoking
this function won't emit exceptions. The exception can be seen in
acpi_ds_initialize_objects() when certain table loading mode is chosen.

This patch also removes useless acpi_ns_locked from acpi_ev_initialize_region()
as this function will always be invoked with interpreter lock held now, and
the lock granularity has been tuned to lock around _REG execution, thus it
is now handled by acpi_ex_exit_interpreter(). Lv Zheng.

Link: https://github.com/acpica/acpica/commit/543342abSigned-off-by: default avatarLv Zheng <lv.zheng@intel.com>
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent f7cc8741
...@@ -243,9 +243,7 @@ acpi_ev_default_region_setup(acpi_handle handle, ...@@ -243,9 +243,7 @@ acpi_ev_default_region_setup(acpi_handle handle,
u32 function, u32 function,
void *handler_context, void **region_context); void *handler_context, void **region_context);
acpi_status acpi_status acpi_ev_initialize_region(union acpi_operand_object *region_obj);
acpi_ev_initialize_region(union acpi_operand_object *region_obj,
u8 acpi_ns_locked);
/* /*
* evsci - SCI (System Control Interrupt) handling/dispatch * evsci - SCI (System Control Interrupt) handling/dispatch
......
...@@ -84,7 +84,7 @@ acpi_status acpi_ds_initialize_region(acpi_handle obj_handle) ...@@ -84,7 +84,7 @@ acpi_status acpi_ds_initialize_region(acpi_handle obj_handle)
/* Namespace is NOT locked */ /* Namespace is NOT locked */
status = acpi_ev_initialize_region(obj_desc, FALSE); status = acpi_ev_initialize_region(obj_desc);
return (status); return (status);
} }
......
...@@ -609,18 +609,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state) ...@@ -609,18 +609,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
status = status =
acpi_ev_initialize_region acpi_ev_initialize_region
(acpi_ns_get_attached_object(node), FALSE); (acpi_ns_get_attached_object(node));
if (ACPI_FAILURE(status)) {
/*
* If AE_NOT_EXIST is returned, it is not fatal
* because many regions get created before a handler
* is installed for said region.
*/
if (AE_NOT_EXIST == status) {
status = AE_OK;
}
}
break; break;
case AML_NAME_OP: case AML_NAME_OP:
......
...@@ -479,7 +479,6 @@ acpi_ev_default_region_setup(acpi_handle handle, ...@@ -479,7 +479,6 @@ acpi_ev_default_region_setup(acpi_handle handle,
* FUNCTION: acpi_ev_initialize_region * FUNCTION: acpi_ev_initialize_region
* *
* PARAMETERS: region_obj - Region we are initializing * PARAMETERS: region_obj - Region we are initializing
* acpi_ns_locked - Is namespace locked?
* *
* RETURN: Status * RETURN: Status
* *
...@@ -497,19 +496,28 @@ acpi_ev_default_region_setup(acpi_handle handle, ...@@ -497,19 +496,28 @@ acpi_ev_default_region_setup(acpi_handle handle,
* MUTEX: Interpreter should be unlocked, because we may run the _REG * MUTEX: Interpreter should be unlocked, because we may run the _REG
* method for this region. * method for this region.
* *
* NOTE: Possible incompliance:
* There is a behavior conflict in automatic _REG execution:
* 1. When the interpreter is evaluating a method, we can only
* automatically run _REG for the following case:
* operation_region (OPR1, 0x80, 0x1000010, 0x4)
* 2. When the interpreter is loading a table, we can also
* automatically run _REG for the following case:
* operation_region (OPR1, 0x80, 0x1000010, 0x4)
* Though this may not be compliant to the de-facto standard, the
* logic is kept in order not to trigger regressions. And keeping
* this logic should be taken care by the caller of this function.
*
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status acpi_ev_initialize_region(union acpi_operand_object *region_obj)
acpi_ev_initialize_region(union acpi_operand_object *region_obj,
u8 acpi_ns_locked)
{ {
union acpi_operand_object *handler_obj; union acpi_operand_object *handler_obj;
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
acpi_adr_space_type space_id; acpi_adr_space_type space_id;
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
acpi_status status;
ACPI_FUNCTION_TRACE_U32(ev_initialize_region, acpi_ns_locked); ACPI_FUNCTION_TRACE(ev_initialize_region);
if (!region_obj) { if (!region_obj) {
return_ACPI_STATUS(AE_BAD_PARAMETER); return_ACPI_STATUS(AE_BAD_PARAMETER);
...@@ -580,39 +588,17 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj, ...@@ -580,39 +588,17 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
handler_obj, region_obj, handler_obj, region_obj,
obj_desc)); obj_desc));
status = (void)acpi_ev_attach_region(handler_obj,
acpi_ev_attach_region(handler_obj, region_obj, FALSE);
region_obj,
acpi_ns_locked);
/* /*
* Tell all users that this region is usable by * Tell all users that this region is usable by
* running the _REG method * running the _REG method
*/ */
if (acpi_ns_locked) {
status =
acpi_ut_release_mutex
(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
}
acpi_ex_exit_interpreter(); acpi_ex_exit_interpreter();
status = (void)acpi_ev_execute_reg_method(region_obj,
acpi_ev_execute_reg_method(region_obj,
ACPI_REG_CONNECT); ACPI_REG_CONNECT);
acpi_ex_enter_interpreter(); acpi_ex_enter_interpreter();
if (acpi_ns_locked) {
status =
acpi_ut_acquire_mutex
(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
}
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
} }
...@@ -622,12 +608,15 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj, ...@@ -622,12 +608,15 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
node = node->parent; node = node->parent;
} }
/* If we get here, there is no handler for this region */ /*
* If we get here, there is no handler for this region. This is not
* fatal because many regions get created before a handler is installed
* for said region.
*/
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
"No handler for RegionType %s(%X) (RegionObj %p)\n", "No handler for RegionType %s(%X) (RegionObj %p)\n",
acpi_ut_get_region_name(space_id), space_id, acpi_ut_get_region_name(space_id), space_id,
region_obj)); region_obj));
return_ACPI_STATUS(AE_NOT_EXIST); return_ACPI_STATUS(AE_OK);
} }
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