Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e407c16 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

Merge back earlier ACPICA changes for 4.21.

parents ae6b3e54 08728658
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@
#define ACPI_NS_TEMPORARY           0x0040
#define ACPI_NS_OVERRIDE_IF_FOUND   0x0080
#define ACPI_NS_EARLY_INIT          0x0100
#define ACPI_NS_PREFIX_MUST_EXIST   0x0200

/* Flags for acpi_ns_walk_namespace */

+74 −44
Original line number Diff line number Diff line
@@ -24,6 +24,13 @@ acpi_db_start_command(struct acpi_walk_state *walk_state,
void acpi_db_method_end(struct acpi_walk_state *walk_state);
#endif

#ifdef ACPI_DISASSEMBLER
static union acpi_parse_object *acpi_db_get_display_op(struct acpi_walk_state
						       *walk_state,
						       union acpi_parse_object
						       *op);
#endif

/*******************************************************************************
 *
 * FUNCTION:    acpi_db_start_command
@@ -113,6 +120,70 @@ void acpi_db_signal_break_point(struct acpi_walk_state *walk_state)
	acpi_os_printf("**break** Executed AML BreakPoint opcode\n");
}

#ifdef ACPI_DISASSEMBLER
/*******************************************************************************
 *
 * FUNCTION:    acpi_db_get_display_op
 *
 * PARAMETERS:  walk_state      - Current walk
 *              op              - Current executing op (from aml interpreter)
 *
 * RETURN:      Opcode to display
 *
 * DESCRIPTION: Find the opcode to display during single stepping
 *
 ******************************************************************************/

static union acpi_parse_object *acpi_db_get_display_op(struct acpi_walk_state
						       *walk_state,
						       union acpi_parse_object
						       *op)
{
	union acpi_parse_object *display_op;
	union acpi_parse_object *parent_op;

	display_op = op;
	parent_op = op->common.parent;
	if (parent_op) {
		if ((walk_state->control_state) &&
		    (walk_state->control_state->common.state ==
		     ACPI_CONTROL_PREDICATE_EXECUTING)) {
			/*
			 * We are executing the predicate of an IF or WHILE statement
			 * Search upwards for the containing IF or WHILE so that the
			 * entire predicate can be displayed.
			 */
			while (parent_op) {
				if ((parent_op->common.aml_opcode == AML_IF_OP)
				    || (parent_op->common.aml_opcode ==
					AML_WHILE_OP)) {
					display_op = parent_op;
					break;
				}
				parent_op = parent_op->common.parent;
			}
		} else {
			while (parent_op) {
				if ((parent_op->common.aml_opcode == AML_IF_OP)
				    || (parent_op->common.aml_opcode ==
					AML_ELSE_OP)
				    || (parent_op->common.aml_opcode ==
					AML_SCOPE_OP)
				    || (parent_op->common.aml_opcode ==
					AML_METHOD_OP)
				    || (parent_op->common.aml_opcode ==
					AML_WHILE_OP)) {
					break;
				}
				display_op = parent_op;
				parent_op = parent_op->common.parent;
			}
		}
	}
	return display_op;
}
#endif

/*******************************************************************************
 *
 * FUNCTION:    acpi_db_single_step
@@ -134,8 +205,6 @@ acpi_db_single_step(struct acpi_walk_state *walk_state,
	union acpi_parse_object *next;
	acpi_status status = AE_OK;
	u32 original_debug_level;
	union acpi_parse_object *display_op;
	union acpi_parse_object *parent_op;
	u32 aml_offset;

	ACPI_FUNCTION_ENTRY();
@@ -222,51 +291,12 @@ acpi_db_single_step(struct acpi_walk_state *walk_state,
		next = op->common.next;
		op->common.next = NULL;

		display_op = op;
		parent_op = op->common.parent;
		if (parent_op) {
			if ((walk_state->control_state) &&
			    (walk_state->control_state->common.state ==
			     ACPI_CONTROL_PREDICATE_EXECUTING)) {
				/*
				 * We are executing the predicate of an IF or WHILE statement
				 * Search upwards for the containing IF or WHILE so that the
				 * entire predicate can be displayed.
				 */
				while (parent_op) {
					if ((parent_op->common.aml_opcode ==
					     AML_IF_OP)
					    || (parent_op->common.aml_opcode ==
						AML_WHILE_OP)) {
						display_op = parent_op;
						break;
					}
					parent_op = parent_op->common.parent;
				}
			} else {
				while (parent_op) {
					if ((parent_op->common.aml_opcode ==
					     AML_IF_OP)
					    || (parent_op->common.aml_opcode ==
						AML_ELSE_OP)
					    || (parent_op->common.aml_opcode ==
						AML_SCOPE_OP)
					    || (parent_op->common.aml_opcode ==
						AML_METHOD_OP)
					    || (parent_op->common.aml_opcode ==
						AML_WHILE_OP)) {
						break;
					}
					display_op = parent_op;
					parent_op = parent_op->common.parent;
				}
			}
		}

		/* Now we can disassemble and display it */

#ifdef ACPI_DISASSEMBLER
		acpi_dm_disassemble(walk_state, display_op, ACPI_UINT32_MAX);
		acpi_dm_disassemble(walk_state,
				    acpi_db_get_display_op(walk_state, op),
				    ACPI_UINT32_MAX);
#else
		/*
		 * The AML Disassembler is not configured - at least we can
+8 −0
Original line number Diff line number Diff line
@@ -296,6 +296,14 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
		}
#endif

		/*
		 * For name creation opcodes, the full namepath prefix must
		 * exist, except for the final (new) nameseg.
		 */
		if (walk_state->op_info->flags & AML_NAMED) {
			flags |= ACPI_NS_PREFIX_MUST_EXIST;
		}

		/* Add new entry or lookup existing entry */

		status =
+21 −2
Original line number Diff line number Diff line
@@ -267,6 +267,7 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
	acpi_object_type this_search_type;
	u32 search_parent_flag = ACPI_NS_SEARCH_PARENT;
	u32 local_flags;
	acpi_interpreter_mode local_interpreter_mode;

	ACPI_FUNCTION_TRACE(ns_lookup);

@@ -506,6 +507,7 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
	 */
	this_search_type = ACPI_TYPE_ANY;
	current_node = this_node;

	while (num_segments && current_node) {
		num_segments--;
		if (!num_segments) {
@@ -536,6 +538,16 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
			}
		}

		/* Handle opcodes that create a new name_seg via a full name_path */

		local_interpreter_mode = interpreter_mode;
		if ((flags & ACPI_NS_PREFIX_MUST_EXIST) && (num_segments > 0)) {

			/* Every element of the path must exist (except for the final name_seg) */

			local_interpreter_mode = ACPI_IMODE_EXECUTE;
		}

		/* Extract one ACPI name from the front of the pathname */

		ACPI_MOVE_32_TO_32(&simple_name, path);
@@ -544,12 +556,19 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,

		status =
		    acpi_ns_search_and_enter(simple_name, walk_state,
					     current_node, interpreter_mode,
					     current_node,
					     local_interpreter_mode,
					     this_search_type, local_flags,
					     &this_node);
		if (ACPI_FAILURE(status)) {
			if (status == AE_NOT_FOUND) {

#if !defined ACPI_ASL_COMPILER	/* Note: iASL reports this error by itself, not needed here */
				if (flags & ACPI_NS_PREFIX_MUST_EXIST) {
					acpi_os_printf(ACPI_MSG_BIOS_ERROR
						       "Object does not exist: %4.4s\n",
						       &simple_name);
				}
#endif
				/* Name not found in ACPI namespace */

				ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
+3 −5
Original line number Diff line number Diff line
@@ -508,7 +508,8 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
				 */
				if ((walk_state->
				     parse_flags & ACPI_PARSE_MODULE_LEVEL)
				    && status == AE_ALREADY_EXISTS) {
				    && ((status == AE_ALREADY_EXISTS)
					|| (status == AE_NOT_FOUND))) {
					status = AE_OK;
				}
				if (status == AE_CTRL_PARSE_CONTINUE) {
@@ -537,10 +538,7 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
					 * the scope op because the parse failure indicates that
					 * the device may not exist.
					 */
					ACPI_ERROR((AE_INFO,
						    "Skip parsing opcode %s",
						    acpi_ps_get_opcode_name
						    (walk_state->opcode)));
					ACPI_INFO(("Skipping parse of AML opcode: %s (0x%4.4X)", acpi_ps_get_opcode_name(walk_state->opcode), walk_state->opcode));

					/*
					 * Determine the opcode length before skipping the opcode.
Loading