162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
262306a36Sopenharmony_ci/*******************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Module Name: dbcmds - Miscellaneous debug commands and output routines
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci ******************************************************************************/
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <acpi/acpi.h>
962306a36Sopenharmony_ci#include "accommon.h"
1062306a36Sopenharmony_ci#include "acevents.h"
1162306a36Sopenharmony_ci#include "acdebug.h"
1262306a36Sopenharmony_ci#include "acnamesp.h"
1362306a36Sopenharmony_ci#include "acresrc.h"
1462306a36Sopenharmony_ci#include "actables.h"
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define _COMPONENT          ACPI_CA_DEBUGGER
1762306a36Sopenharmony_ciACPI_MODULE_NAME("dbcmds")
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/* Local prototypes */
2062306a36Sopenharmony_cistatic void
2162306a36Sopenharmony_ciacpi_dm_compare_aml_resources(u8 *aml1_buffer,
2262306a36Sopenharmony_ci			      acpi_rsdesc_size aml1_buffer_length,
2362306a36Sopenharmony_ci			      u8 *aml2_buffer,
2462306a36Sopenharmony_ci			      acpi_rsdesc_size aml2_buffer_length);
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistatic acpi_status
2762306a36Sopenharmony_ciacpi_dm_test_resource_conversion(struct acpi_namespace_node *node, char *name);
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistatic acpi_status
3062306a36Sopenharmony_ciacpi_db_resource_callback(struct acpi_resource *resource, void *context);
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistatic acpi_status
3362306a36Sopenharmony_ciacpi_db_device_resources(acpi_handle obj_handle,
3462306a36Sopenharmony_ci			 u32 nesting_level, void *context, void **return_value);
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_cistatic void acpi_db_do_one_sleep_state(u8 sleep_state);
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistatic char *acpi_db_trace_method_name = NULL;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/*******************************************************************************
4162306a36Sopenharmony_ci *
4262306a36Sopenharmony_ci * FUNCTION:    acpi_db_convert_to_node
4362306a36Sopenharmony_ci *
4462306a36Sopenharmony_ci * PARAMETERS:  in_string           - String to convert
4562306a36Sopenharmony_ci *
4662306a36Sopenharmony_ci * RETURN:      Pointer to a NS node
4762306a36Sopenharmony_ci *
4862306a36Sopenharmony_ci * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or
4962306a36Sopenharmony_ci *              alphanumeric strings.
5062306a36Sopenharmony_ci *
5162306a36Sopenharmony_ci ******************************************************************************/
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistruct acpi_namespace_node *acpi_db_convert_to_node(char *in_string)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	struct acpi_namespace_node *node;
5662306a36Sopenharmony_ci	acpi_size address;
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	if ((*in_string >= 0x30) && (*in_string <= 0x39)) {
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci		/* Numeric argument, convert */
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci		address = strtoul(in_string, NULL, 16);
6362306a36Sopenharmony_ci		node = ACPI_TO_POINTER(address);
6462306a36Sopenharmony_ci		if (!acpi_os_readable(node, sizeof(struct acpi_namespace_node))) {
6562306a36Sopenharmony_ci			acpi_os_printf("Address %p is invalid", node);
6662306a36Sopenharmony_ci			return (NULL);
6762306a36Sopenharmony_ci		}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci		/* Make sure pointer is valid NS node */
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci		if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) {
7262306a36Sopenharmony_ci			acpi_os_printf
7362306a36Sopenharmony_ci			    ("Address %p is not a valid namespace node [%s]\n",
7462306a36Sopenharmony_ci			     node, acpi_ut_get_descriptor_name(node));
7562306a36Sopenharmony_ci			return (NULL);
7662306a36Sopenharmony_ci		}
7762306a36Sopenharmony_ci	} else {
7862306a36Sopenharmony_ci		/*
7962306a36Sopenharmony_ci		 * Alpha argument: The parameter is a name string that must be
8062306a36Sopenharmony_ci		 * resolved to a Namespace object.
8162306a36Sopenharmony_ci		 */
8262306a36Sopenharmony_ci		node = acpi_db_local_ns_lookup(in_string);
8362306a36Sopenharmony_ci		if (!node) {
8462306a36Sopenharmony_ci			acpi_os_printf
8562306a36Sopenharmony_ci			    ("Could not find [%s] in namespace, defaulting to root node\n",
8662306a36Sopenharmony_ci			     in_string);
8762306a36Sopenharmony_ci			node = acpi_gbl_root_node;
8862306a36Sopenharmony_ci		}
8962306a36Sopenharmony_ci	}
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	return (node);
9262306a36Sopenharmony_ci}
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/*******************************************************************************
9562306a36Sopenharmony_ci *
9662306a36Sopenharmony_ci * FUNCTION:    acpi_db_sleep
9762306a36Sopenharmony_ci *
9862306a36Sopenharmony_ci * PARAMETERS:  object_arg          - Desired sleep state (0-5). NULL means
9962306a36Sopenharmony_ci *                                    invoke all possible sleep states.
10062306a36Sopenharmony_ci *
10162306a36Sopenharmony_ci * RETURN:      Status
10262306a36Sopenharmony_ci *
10362306a36Sopenharmony_ci * DESCRIPTION: Simulate sleep/wake sequences
10462306a36Sopenharmony_ci *
10562306a36Sopenharmony_ci ******************************************************************************/
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ciacpi_status acpi_db_sleep(char *object_arg)
10862306a36Sopenharmony_ci{
10962306a36Sopenharmony_ci	u8 sleep_state;
11062306a36Sopenharmony_ci	u32 i;
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	ACPI_FUNCTION_TRACE(acpi_db_sleep);
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci	/* Null input (no arguments) means to invoke all sleep states */
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci	if (!object_arg) {
11762306a36Sopenharmony_ci		acpi_os_printf("Invoking all possible sleep states, 0-%d\n",
11862306a36Sopenharmony_ci			       ACPI_S_STATES_MAX);
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci		for (i = 0; i <= ACPI_S_STATES_MAX; i++) {
12162306a36Sopenharmony_ci			acpi_db_do_one_sleep_state((u8)i);
12262306a36Sopenharmony_ci		}
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci		return_ACPI_STATUS(AE_OK);
12562306a36Sopenharmony_ci	}
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	/* Convert argument to binary and invoke the sleep state */
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci	sleep_state = (u8)strtoul(object_arg, NULL, 0);
13062306a36Sopenharmony_ci	acpi_db_do_one_sleep_state(sleep_state);
13162306a36Sopenharmony_ci	return_ACPI_STATUS(AE_OK);
13262306a36Sopenharmony_ci}
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci/*******************************************************************************
13562306a36Sopenharmony_ci *
13662306a36Sopenharmony_ci * FUNCTION:    acpi_db_do_one_sleep_state
13762306a36Sopenharmony_ci *
13862306a36Sopenharmony_ci * PARAMETERS:  sleep_state         - Desired sleep state (0-5)
13962306a36Sopenharmony_ci *
14062306a36Sopenharmony_ci * RETURN:      None
14162306a36Sopenharmony_ci *
14262306a36Sopenharmony_ci * DESCRIPTION: Simulate a sleep/wake sequence
14362306a36Sopenharmony_ci *
14462306a36Sopenharmony_ci ******************************************************************************/
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_cistatic void acpi_db_do_one_sleep_state(u8 sleep_state)
14762306a36Sopenharmony_ci{
14862306a36Sopenharmony_ci	acpi_status status;
14962306a36Sopenharmony_ci	u8 sleep_type_a;
15062306a36Sopenharmony_ci	u8 sleep_type_b;
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	/* Validate parameter */
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	if (sleep_state > ACPI_S_STATES_MAX) {
15562306a36Sopenharmony_ci		acpi_os_printf("Sleep state %d out of range (%d max)\n",
15662306a36Sopenharmony_ci			       sleep_state, ACPI_S_STATES_MAX);
15762306a36Sopenharmony_ci		return;
15862306a36Sopenharmony_ci	}
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci	acpi_os_printf("\n---- Invoking sleep state S%d (%s):\n",
16162306a36Sopenharmony_ci		       sleep_state, acpi_gbl_sleep_state_names[sleep_state]);
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci	/* Get the values for the sleep type registers (for display only) */
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci	status =
16662306a36Sopenharmony_ci	    acpi_get_sleep_type_data(sleep_state, &sleep_type_a, &sleep_type_b);
16762306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
16862306a36Sopenharmony_ci		acpi_os_printf("Could not evaluate [%s] method, %s\n",
16962306a36Sopenharmony_ci			       acpi_gbl_sleep_state_names[sleep_state],
17062306a36Sopenharmony_ci			       acpi_format_exception(status));
17162306a36Sopenharmony_ci		return;
17262306a36Sopenharmony_ci	}
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci	acpi_os_printf
17562306a36Sopenharmony_ci	    ("Register values for sleep state S%d: Sleep-A: %.2X, Sleep-B: %.2X\n",
17662306a36Sopenharmony_ci	     sleep_state, sleep_type_a, sleep_type_b);
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	/* Invoke the various sleep/wake interfaces */
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci	acpi_os_printf("**** Sleep: Prepare to sleep (S%d) ****\n",
18162306a36Sopenharmony_ci		       sleep_state);
18262306a36Sopenharmony_ci	status = acpi_enter_sleep_state_prep(sleep_state);
18362306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
18462306a36Sopenharmony_ci		goto error_exit;
18562306a36Sopenharmony_ci	}
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci	acpi_os_printf("**** Sleep: Going to sleep (S%d) ****\n", sleep_state);
18862306a36Sopenharmony_ci	status = acpi_enter_sleep_state(sleep_state);
18962306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
19062306a36Sopenharmony_ci		goto error_exit;
19162306a36Sopenharmony_ci	}
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci	acpi_os_printf("**** Wake: Prepare to return from sleep (S%d) ****\n",
19462306a36Sopenharmony_ci		       sleep_state);
19562306a36Sopenharmony_ci	status = acpi_leave_sleep_state_prep(sleep_state);
19662306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
19762306a36Sopenharmony_ci		goto error_exit;
19862306a36Sopenharmony_ci	}
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci	acpi_os_printf("**** Wake: Return from sleep (S%d) ****\n",
20162306a36Sopenharmony_ci		       sleep_state);
20262306a36Sopenharmony_ci	status = acpi_leave_sleep_state(sleep_state);
20362306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
20462306a36Sopenharmony_ci		goto error_exit;
20562306a36Sopenharmony_ci	}
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci	return;
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_cierror_exit:
21062306a36Sopenharmony_ci	ACPI_EXCEPTION((AE_INFO, status, "During invocation of sleep state S%d",
21162306a36Sopenharmony_ci			sleep_state));
21262306a36Sopenharmony_ci}
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci/*******************************************************************************
21562306a36Sopenharmony_ci *
21662306a36Sopenharmony_ci * FUNCTION:    acpi_db_display_locks
21762306a36Sopenharmony_ci *
21862306a36Sopenharmony_ci * PARAMETERS:  None
21962306a36Sopenharmony_ci *
22062306a36Sopenharmony_ci * RETURN:      None
22162306a36Sopenharmony_ci *
22262306a36Sopenharmony_ci * DESCRIPTION: Display information about internal mutexes.
22362306a36Sopenharmony_ci *
22462306a36Sopenharmony_ci ******************************************************************************/
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_civoid acpi_db_display_locks(void)
22762306a36Sopenharmony_ci{
22862306a36Sopenharmony_ci	u32 i;
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci	for (i = 0; i < ACPI_MAX_MUTEX; i++) {
23162306a36Sopenharmony_ci		acpi_os_printf("%26s : %s\n", acpi_ut_get_mutex_name(i),
23262306a36Sopenharmony_ci			       acpi_gbl_mutex_info[i].thread_id ==
23362306a36Sopenharmony_ci			       ACPI_MUTEX_NOT_ACQUIRED ? "Locked" : "Unlocked");
23462306a36Sopenharmony_ci	}
23562306a36Sopenharmony_ci}
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci/*******************************************************************************
23862306a36Sopenharmony_ci *
23962306a36Sopenharmony_ci * FUNCTION:    acpi_db_display_table_info
24062306a36Sopenharmony_ci *
24162306a36Sopenharmony_ci * PARAMETERS:  table_arg           - Name of table to be displayed
24262306a36Sopenharmony_ci *
24362306a36Sopenharmony_ci * RETURN:      None
24462306a36Sopenharmony_ci *
24562306a36Sopenharmony_ci * DESCRIPTION: Display information about loaded tables. Current
24662306a36Sopenharmony_ci *              implementation displays all loaded tables.
24762306a36Sopenharmony_ci *
24862306a36Sopenharmony_ci ******************************************************************************/
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_civoid acpi_db_display_table_info(char *table_arg)
25162306a36Sopenharmony_ci{
25262306a36Sopenharmony_ci	u32 i;
25362306a36Sopenharmony_ci	struct acpi_table_desc *table_desc;
25462306a36Sopenharmony_ci	acpi_status status;
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci	/* Header */
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci	acpi_os_printf("Idx ID  Status Type                    "
25962306a36Sopenharmony_ci		       "TableHeader (Sig, Address, Length, Misc)\n");
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci	/* Walk the entire root table list */
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci	for (i = 0; i < acpi_gbl_root_table_list.current_table_count; i++) {
26462306a36Sopenharmony_ci		table_desc = &acpi_gbl_root_table_list.tables[i];
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci		/* Index and Table ID */
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci		acpi_os_printf("%3u %.2u ", i, table_desc->owner_id);
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ci		/* Decode the table flags */
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_ci		if (!(table_desc->flags & ACPI_TABLE_IS_LOADED)) {
27362306a36Sopenharmony_ci			acpi_os_printf("NotLoaded ");
27462306a36Sopenharmony_ci		} else {
27562306a36Sopenharmony_ci			acpi_os_printf(" Loaded ");
27662306a36Sopenharmony_ci		}
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci		switch (table_desc->flags & ACPI_TABLE_ORIGIN_MASK) {
27962306a36Sopenharmony_ci		case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci			acpi_os_printf("External/virtual ");
28262306a36Sopenharmony_ci			break;
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci		case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci			acpi_os_printf("Internal/physical ");
28762306a36Sopenharmony_ci			break;
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ci		case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci			acpi_os_printf("Internal/virtual ");
29262306a36Sopenharmony_ci			break;
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci		default:
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci			acpi_os_printf("INVALID TYPE    ");
29762306a36Sopenharmony_ci			break;
29862306a36Sopenharmony_ci		}
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci		/* Make sure that the table is mapped */
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci		status = acpi_tb_validate_table(table_desc);
30362306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
30462306a36Sopenharmony_ci			return;
30562306a36Sopenharmony_ci		}
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci		/* Dump the table header */
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci		if (table_desc->pointer) {
31062306a36Sopenharmony_ci			acpi_tb_print_table_header(table_desc->address,
31162306a36Sopenharmony_ci						   table_desc->pointer);
31262306a36Sopenharmony_ci		} else {
31362306a36Sopenharmony_ci			/* If the pointer is null, the table has been unloaded */
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci			ACPI_INFO(("%4.4s - Table has been unloaded",
31662306a36Sopenharmony_ci				   table_desc->signature.ascii));
31762306a36Sopenharmony_ci		}
31862306a36Sopenharmony_ci	}
31962306a36Sopenharmony_ci}
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ci/*******************************************************************************
32262306a36Sopenharmony_ci *
32362306a36Sopenharmony_ci * FUNCTION:    acpi_db_unload_acpi_table
32462306a36Sopenharmony_ci *
32562306a36Sopenharmony_ci * PARAMETERS:  object_name         - Namespace pathname for an object that
32662306a36Sopenharmony_ci *                                    is owned by the table to be unloaded
32762306a36Sopenharmony_ci *
32862306a36Sopenharmony_ci * RETURN:      None
32962306a36Sopenharmony_ci *
33062306a36Sopenharmony_ci * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned
33162306a36Sopenharmony_ci *              by the table.
33262306a36Sopenharmony_ci *
33362306a36Sopenharmony_ci ******************************************************************************/
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_civoid acpi_db_unload_acpi_table(char *object_name)
33662306a36Sopenharmony_ci{
33762306a36Sopenharmony_ci	struct acpi_namespace_node *node;
33862306a36Sopenharmony_ci	acpi_status status;
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci	/* Translate name to an Named object */
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci	node = acpi_db_convert_to_node(object_name);
34362306a36Sopenharmony_ci	if (!node) {
34462306a36Sopenharmony_ci		return;
34562306a36Sopenharmony_ci	}
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci	status = acpi_unload_parent_table(ACPI_CAST_PTR(acpi_handle, node));
34862306a36Sopenharmony_ci	if (ACPI_SUCCESS(status)) {
34962306a36Sopenharmony_ci		acpi_os_printf("Parent of [%s] (%p) unloaded and uninstalled\n",
35062306a36Sopenharmony_ci			       object_name, node);
35162306a36Sopenharmony_ci	} else {
35262306a36Sopenharmony_ci		acpi_os_printf("%s, while unloading parent table of [%s]\n",
35362306a36Sopenharmony_ci			       acpi_format_exception(status), object_name);
35462306a36Sopenharmony_ci	}
35562306a36Sopenharmony_ci}
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ci/*******************************************************************************
35862306a36Sopenharmony_ci *
35962306a36Sopenharmony_ci * FUNCTION:    acpi_db_send_notify
36062306a36Sopenharmony_ci *
36162306a36Sopenharmony_ci * PARAMETERS:  name                - Name of ACPI object where to send notify
36262306a36Sopenharmony_ci *              value               - Value of the notify to send.
36362306a36Sopenharmony_ci *
36462306a36Sopenharmony_ci * RETURN:      None
36562306a36Sopenharmony_ci *
36662306a36Sopenharmony_ci * DESCRIPTION: Send an ACPI notification. The value specified is sent to the
36762306a36Sopenharmony_ci *              named object as an ACPI notify.
36862306a36Sopenharmony_ci *
36962306a36Sopenharmony_ci ******************************************************************************/
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_civoid acpi_db_send_notify(char *name, u32 value)
37262306a36Sopenharmony_ci{
37362306a36Sopenharmony_ci	struct acpi_namespace_node *node;
37462306a36Sopenharmony_ci	acpi_status status;
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci	/* Translate name to an Named object */
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci	node = acpi_db_convert_to_node(name);
37962306a36Sopenharmony_ci	if (!node) {
38062306a36Sopenharmony_ci		return;
38162306a36Sopenharmony_ci	}
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci	/* Dispatch the notify if legal */
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci	if (acpi_ev_is_notify_object(node)) {
38662306a36Sopenharmony_ci		status = acpi_ev_queue_notify_request(node, value);
38762306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
38862306a36Sopenharmony_ci			acpi_os_printf("Could not queue notify\n");
38962306a36Sopenharmony_ci		}
39062306a36Sopenharmony_ci	} else {
39162306a36Sopenharmony_ci		acpi_os_printf("Named object [%4.4s] Type %s, "
39262306a36Sopenharmony_ci			       "must be Device/Thermal/Processor type\n",
39362306a36Sopenharmony_ci			       acpi_ut_get_node_name(node),
39462306a36Sopenharmony_ci			       acpi_ut_get_type_name(node->type));
39562306a36Sopenharmony_ci	}
39662306a36Sopenharmony_ci}
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci/*******************************************************************************
39962306a36Sopenharmony_ci *
40062306a36Sopenharmony_ci * FUNCTION:    acpi_db_display_interfaces
40162306a36Sopenharmony_ci *
40262306a36Sopenharmony_ci * PARAMETERS:  action_arg          - Null, "install", or "remove"
40362306a36Sopenharmony_ci *              interface_name_arg  - Name for install/remove options
40462306a36Sopenharmony_ci *
40562306a36Sopenharmony_ci * RETURN:      None
40662306a36Sopenharmony_ci *
40762306a36Sopenharmony_ci * DESCRIPTION: Display or modify the global _OSI interface list
40862306a36Sopenharmony_ci *
40962306a36Sopenharmony_ci ******************************************************************************/
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_civoid acpi_db_display_interfaces(char *action_arg, char *interface_name_arg)
41262306a36Sopenharmony_ci{
41362306a36Sopenharmony_ci	struct acpi_interface_info *next_interface;
41462306a36Sopenharmony_ci	char *sub_string;
41562306a36Sopenharmony_ci	acpi_status status;
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci	/* If no arguments, just display current interface list */
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_ci	if (!action_arg) {
42062306a36Sopenharmony_ci		(void)acpi_os_acquire_mutex(acpi_gbl_osi_mutex,
42162306a36Sopenharmony_ci					    ACPI_WAIT_FOREVER);
42262306a36Sopenharmony_ci
42362306a36Sopenharmony_ci		next_interface = acpi_gbl_supported_interfaces;
42462306a36Sopenharmony_ci		while (next_interface) {
42562306a36Sopenharmony_ci			if (!(next_interface->flags & ACPI_OSI_INVALID)) {
42662306a36Sopenharmony_ci				acpi_os_printf("%s\n", next_interface->name);
42762306a36Sopenharmony_ci			}
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_ci			next_interface = next_interface->next;
43062306a36Sopenharmony_ci		}
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_ci		acpi_os_release_mutex(acpi_gbl_osi_mutex);
43362306a36Sopenharmony_ci		return;
43462306a36Sopenharmony_ci	}
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_ci	/* If action_arg exists, so must interface_name_arg */
43762306a36Sopenharmony_ci
43862306a36Sopenharmony_ci	if (!interface_name_arg) {
43962306a36Sopenharmony_ci		acpi_os_printf("Missing Interface Name argument\n");
44062306a36Sopenharmony_ci		return;
44162306a36Sopenharmony_ci	}
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci	/* Uppercase the action for match below */
44462306a36Sopenharmony_ci
44562306a36Sopenharmony_ci	acpi_ut_strupr(action_arg);
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci	/* install - install an interface */
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_ci	sub_string = strstr("INSTALL", action_arg);
45062306a36Sopenharmony_ci	if (sub_string) {
45162306a36Sopenharmony_ci		status = acpi_install_interface(interface_name_arg);
45262306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
45362306a36Sopenharmony_ci			acpi_os_printf("%s, while installing \"%s\"\n",
45462306a36Sopenharmony_ci				       acpi_format_exception(status),
45562306a36Sopenharmony_ci				       interface_name_arg);
45662306a36Sopenharmony_ci		}
45762306a36Sopenharmony_ci		return;
45862306a36Sopenharmony_ci	}
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_ci	/* remove - remove an interface */
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_ci	sub_string = strstr("REMOVE", action_arg);
46362306a36Sopenharmony_ci	if (sub_string) {
46462306a36Sopenharmony_ci		status = acpi_remove_interface(interface_name_arg);
46562306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
46662306a36Sopenharmony_ci			acpi_os_printf("%s, while removing \"%s\"\n",
46762306a36Sopenharmony_ci				       acpi_format_exception(status),
46862306a36Sopenharmony_ci				       interface_name_arg);
46962306a36Sopenharmony_ci		}
47062306a36Sopenharmony_ci		return;
47162306a36Sopenharmony_ci	}
47262306a36Sopenharmony_ci
47362306a36Sopenharmony_ci	/* Invalid action_arg */
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_ci	acpi_os_printf("Invalid action argument: %s\n", action_arg);
47662306a36Sopenharmony_ci	return;
47762306a36Sopenharmony_ci}
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci/*******************************************************************************
48062306a36Sopenharmony_ci *
48162306a36Sopenharmony_ci * FUNCTION:    acpi_db_display_template
48262306a36Sopenharmony_ci *
48362306a36Sopenharmony_ci * PARAMETERS:  buffer_arg          - Buffer name or address
48462306a36Sopenharmony_ci *
48562306a36Sopenharmony_ci * RETURN:      None
48662306a36Sopenharmony_ci *
48762306a36Sopenharmony_ci * DESCRIPTION: Dump a buffer that contains a resource template
48862306a36Sopenharmony_ci *
48962306a36Sopenharmony_ci ******************************************************************************/
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_civoid acpi_db_display_template(char *buffer_arg)
49262306a36Sopenharmony_ci{
49362306a36Sopenharmony_ci	struct acpi_namespace_node *node;
49462306a36Sopenharmony_ci	acpi_status status;
49562306a36Sopenharmony_ci	struct acpi_buffer return_buffer;
49662306a36Sopenharmony_ci
49762306a36Sopenharmony_ci	/* Translate buffer_arg to an Named object */
49862306a36Sopenharmony_ci
49962306a36Sopenharmony_ci	node = acpi_db_convert_to_node(buffer_arg);
50062306a36Sopenharmony_ci	if (!node || (node == acpi_gbl_root_node)) {
50162306a36Sopenharmony_ci		acpi_os_printf("Invalid argument: %s\n", buffer_arg);
50262306a36Sopenharmony_ci		return;
50362306a36Sopenharmony_ci	}
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci	/* We must have a buffer object */
50662306a36Sopenharmony_ci
50762306a36Sopenharmony_ci	if (node->type != ACPI_TYPE_BUFFER) {
50862306a36Sopenharmony_ci		acpi_os_printf
50962306a36Sopenharmony_ci		    ("Not a Buffer object, cannot be a template: %s\n",
51062306a36Sopenharmony_ci		     buffer_arg);
51162306a36Sopenharmony_ci		return;
51262306a36Sopenharmony_ci	}
51362306a36Sopenharmony_ci
51462306a36Sopenharmony_ci	return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
51562306a36Sopenharmony_ci	return_buffer.pointer = acpi_gbl_db_buffer;
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_ci	/* Attempt to convert the raw buffer to a resource list */
51862306a36Sopenharmony_ci
51962306a36Sopenharmony_ci	status = acpi_rs_create_resource_list(node->object, &return_buffer);
52062306a36Sopenharmony_ci
52162306a36Sopenharmony_ci	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
52262306a36Sopenharmony_ci	acpi_dbg_level |= ACPI_LV_RESOURCES;
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
52562306a36Sopenharmony_ci		acpi_os_printf
52662306a36Sopenharmony_ci		    ("Could not convert Buffer to a resource list: %s, %s\n",
52762306a36Sopenharmony_ci		     buffer_arg, acpi_format_exception(status));
52862306a36Sopenharmony_ci		goto dump_buffer;
52962306a36Sopenharmony_ci	}
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_ci	/* Now we can dump the resource list */
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_ci	acpi_rs_dump_resource_list(ACPI_CAST_PTR(struct acpi_resource,
53462306a36Sopenharmony_ci						 return_buffer.pointer));
53562306a36Sopenharmony_ci
53662306a36Sopenharmony_cidump_buffer:
53762306a36Sopenharmony_ci	acpi_os_printf("\nRaw data buffer:\n");
53862306a36Sopenharmony_ci	acpi_ut_debug_dump_buffer((u8 *)node->object->buffer.pointer,
53962306a36Sopenharmony_ci				  node->object->buffer.length,
54062306a36Sopenharmony_ci				  DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
54162306a36Sopenharmony_ci
54262306a36Sopenharmony_ci	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
54362306a36Sopenharmony_ci	return;
54462306a36Sopenharmony_ci}
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_ci/*******************************************************************************
54762306a36Sopenharmony_ci *
54862306a36Sopenharmony_ci * FUNCTION:    acpi_dm_compare_aml_resources
54962306a36Sopenharmony_ci *
55062306a36Sopenharmony_ci * PARAMETERS:  aml1_buffer         - Contains first resource list
55162306a36Sopenharmony_ci *              aml1_buffer_length  - Length of first resource list
55262306a36Sopenharmony_ci *              aml2_buffer         - Contains second resource list
55362306a36Sopenharmony_ci *              aml2_buffer_length  - Length of second resource list
55462306a36Sopenharmony_ci *
55562306a36Sopenharmony_ci * RETURN:      None
55662306a36Sopenharmony_ci *
55762306a36Sopenharmony_ci * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in
55862306a36Sopenharmony_ci *              order to isolate a miscompare to an individual resource)
55962306a36Sopenharmony_ci *
56062306a36Sopenharmony_ci ******************************************************************************/
56162306a36Sopenharmony_ci
56262306a36Sopenharmony_cistatic void
56362306a36Sopenharmony_ciacpi_dm_compare_aml_resources(u8 *aml1_buffer,
56462306a36Sopenharmony_ci			      acpi_rsdesc_size aml1_buffer_length,
56562306a36Sopenharmony_ci			      u8 *aml2_buffer,
56662306a36Sopenharmony_ci			      acpi_rsdesc_size aml2_buffer_length)
56762306a36Sopenharmony_ci{
56862306a36Sopenharmony_ci	u8 *aml1;
56962306a36Sopenharmony_ci	u8 *aml2;
57062306a36Sopenharmony_ci	u8 *aml1_end;
57162306a36Sopenharmony_ci	u8 *aml2_end;
57262306a36Sopenharmony_ci	acpi_rsdesc_size aml1_length;
57362306a36Sopenharmony_ci	acpi_rsdesc_size aml2_length;
57462306a36Sopenharmony_ci	acpi_rsdesc_size offset = 0;
57562306a36Sopenharmony_ci	u8 resource_type;
57662306a36Sopenharmony_ci	u32 count = 0;
57762306a36Sopenharmony_ci	u32 i;
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_ci	/* Compare overall buffer sizes (may be different due to size rounding) */
58062306a36Sopenharmony_ci
58162306a36Sopenharmony_ci	if (aml1_buffer_length != aml2_buffer_length) {
58262306a36Sopenharmony_ci		acpi_os_printf("**** Buffer length mismatch in converted "
58362306a36Sopenharmony_ci			       "AML: Original %X, New %X ****\n",
58462306a36Sopenharmony_ci			       aml1_buffer_length, aml2_buffer_length);
58562306a36Sopenharmony_ci	}
58662306a36Sopenharmony_ci
58762306a36Sopenharmony_ci	aml1 = aml1_buffer;
58862306a36Sopenharmony_ci	aml2 = aml2_buffer;
58962306a36Sopenharmony_ci	aml1_end = aml1_buffer + aml1_buffer_length;
59062306a36Sopenharmony_ci	aml2_end = aml2_buffer + aml2_buffer_length;
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_ci	/* Walk the descriptor lists, comparing each descriptor */
59362306a36Sopenharmony_ci
59462306a36Sopenharmony_ci	while ((aml1 < aml1_end) && (aml2 < aml2_end)) {
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci		/* Get the lengths of each descriptor */
59762306a36Sopenharmony_ci
59862306a36Sopenharmony_ci		aml1_length = acpi_ut_get_descriptor_length(aml1);
59962306a36Sopenharmony_ci		aml2_length = acpi_ut_get_descriptor_length(aml2);
60062306a36Sopenharmony_ci		resource_type = acpi_ut_get_resource_type(aml1);
60162306a36Sopenharmony_ci
60262306a36Sopenharmony_ci		/* Check for descriptor length match */
60362306a36Sopenharmony_ci
60462306a36Sopenharmony_ci		if (aml1_length != aml2_length) {
60562306a36Sopenharmony_ci			acpi_os_printf
60662306a36Sopenharmony_ci			    ("**** Length mismatch in descriptor [%.2X] type %2.2X, "
60762306a36Sopenharmony_ci			     "Offset %8.8X Len1 %X, Len2 %X ****\n", count,
60862306a36Sopenharmony_ci			     resource_type, offset, aml1_length, aml2_length);
60962306a36Sopenharmony_ci		}
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_ci		/* Check for descriptor byte match */
61262306a36Sopenharmony_ci
61362306a36Sopenharmony_ci		else if (memcmp(aml1, aml2, aml1_length)) {
61462306a36Sopenharmony_ci			acpi_os_printf
61562306a36Sopenharmony_ci			    ("**** Data mismatch in descriptor [%.2X] type %2.2X, "
61662306a36Sopenharmony_ci			     "Offset %8.8X ****\n", count, resource_type,
61762306a36Sopenharmony_ci			     offset);
61862306a36Sopenharmony_ci
61962306a36Sopenharmony_ci			for (i = 0; i < aml1_length; i++) {
62062306a36Sopenharmony_ci				if (aml1[i] != aml2[i]) {
62162306a36Sopenharmony_ci					acpi_os_printf
62262306a36Sopenharmony_ci					    ("Mismatch at byte offset %.2X: is %2.2X, "
62362306a36Sopenharmony_ci					     "should be %2.2X\n", i, aml2[i],
62462306a36Sopenharmony_ci					     aml1[i]);
62562306a36Sopenharmony_ci				}
62662306a36Sopenharmony_ci			}
62762306a36Sopenharmony_ci		}
62862306a36Sopenharmony_ci
62962306a36Sopenharmony_ci		/* Exit on end_tag descriptor */
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_ci		if (resource_type == ACPI_RESOURCE_NAME_END_TAG) {
63262306a36Sopenharmony_ci			return;
63362306a36Sopenharmony_ci		}
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_ci		/* Point to next descriptor in each buffer */
63662306a36Sopenharmony_ci
63762306a36Sopenharmony_ci		count++;
63862306a36Sopenharmony_ci		offset += aml1_length;
63962306a36Sopenharmony_ci		aml1 += aml1_length;
64062306a36Sopenharmony_ci		aml2 += aml2_length;
64162306a36Sopenharmony_ci	}
64262306a36Sopenharmony_ci}
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_ci/*******************************************************************************
64562306a36Sopenharmony_ci *
64662306a36Sopenharmony_ci * FUNCTION:    acpi_dm_test_resource_conversion
64762306a36Sopenharmony_ci *
64862306a36Sopenharmony_ci * PARAMETERS:  node                - Parent device node
64962306a36Sopenharmony_ci *              name                - resource method name (_CRS)
65062306a36Sopenharmony_ci *
65162306a36Sopenharmony_ci * RETURN:      Status
65262306a36Sopenharmony_ci *
65362306a36Sopenharmony_ci * DESCRIPTION: Compare the original AML with a conversion of the AML to
65462306a36Sopenharmony_ci *              internal resource list, then back to AML.
65562306a36Sopenharmony_ci *
65662306a36Sopenharmony_ci ******************************************************************************/
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_cistatic acpi_status
65962306a36Sopenharmony_ciacpi_dm_test_resource_conversion(struct acpi_namespace_node *node, char *name)
66062306a36Sopenharmony_ci{
66162306a36Sopenharmony_ci	acpi_status status;
66262306a36Sopenharmony_ci	struct acpi_buffer return_buffer;
66362306a36Sopenharmony_ci	struct acpi_buffer resource_buffer;
66462306a36Sopenharmony_ci	struct acpi_buffer new_aml;
66562306a36Sopenharmony_ci	union acpi_object *original_aml;
66662306a36Sopenharmony_ci
66762306a36Sopenharmony_ci	acpi_os_printf("Resource Conversion Comparison:\n");
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_ci	new_aml.length = ACPI_ALLOCATE_LOCAL_BUFFER;
67062306a36Sopenharmony_ci	return_buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
67162306a36Sopenharmony_ci	resource_buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
67262306a36Sopenharmony_ci
67362306a36Sopenharmony_ci	/* Get the original _CRS AML resource template */
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_ci	status = acpi_evaluate_object(node, name, NULL, &return_buffer);
67662306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
67762306a36Sopenharmony_ci		acpi_os_printf("Could not obtain %s: %s\n",
67862306a36Sopenharmony_ci			       name, acpi_format_exception(status));
67962306a36Sopenharmony_ci		return (status);
68062306a36Sopenharmony_ci	}
68162306a36Sopenharmony_ci
68262306a36Sopenharmony_ci	/* Get the AML resource template, converted to internal resource structs */
68362306a36Sopenharmony_ci
68462306a36Sopenharmony_ci	status = acpi_get_current_resources(node, &resource_buffer);
68562306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
68662306a36Sopenharmony_ci		acpi_os_printf("AcpiGetCurrentResources failed: %s\n",
68762306a36Sopenharmony_ci			       acpi_format_exception(status));
68862306a36Sopenharmony_ci		goto exit1;
68962306a36Sopenharmony_ci	}
69062306a36Sopenharmony_ci
69162306a36Sopenharmony_ci	/* Convert internal resource list to external AML resource template */
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_ci	status = acpi_rs_create_aml_resources(&resource_buffer, &new_aml);
69462306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
69562306a36Sopenharmony_ci		acpi_os_printf("AcpiRsCreateAmlResources failed: %s\n",
69662306a36Sopenharmony_ci			       acpi_format_exception(status));
69762306a36Sopenharmony_ci		goto exit2;
69862306a36Sopenharmony_ci	}
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_ci	/* Compare original AML to the newly created AML resource list */
70162306a36Sopenharmony_ci
70262306a36Sopenharmony_ci	original_aml = return_buffer.pointer;
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_ci	acpi_dm_compare_aml_resources(original_aml->buffer.pointer,
70562306a36Sopenharmony_ci				      (acpi_rsdesc_size)original_aml->buffer.
70662306a36Sopenharmony_ci				      length, new_aml.pointer,
70762306a36Sopenharmony_ci				      (acpi_rsdesc_size)new_aml.length);
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_ci	/* Cleanup and exit */
71062306a36Sopenharmony_ci
71162306a36Sopenharmony_ci	ACPI_FREE(new_aml.pointer);
71262306a36Sopenharmony_ciexit2:
71362306a36Sopenharmony_ci	ACPI_FREE(resource_buffer.pointer);
71462306a36Sopenharmony_ciexit1:
71562306a36Sopenharmony_ci	ACPI_FREE(return_buffer.pointer);
71662306a36Sopenharmony_ci	return (status);
71762306a36Sopenharmony_ci}
71862306a36Sopenharmony_ci
71962306a36Sopenharmony_ci/*******************************************************************************
72062306a36Sopenharmony_ci *
72162306a36Sopenharmony_ci * FUNCTION:    acpi_db_resource_callback
72262306a36Sopenharmony_ci *
72362306a36Sopenharmony_ci * PARAMETERS:  acpi_walk_resource_callback
72462306a36Sopenharmony_ci *
72562306a36Sopenharmony_ci * RETURN:      Status
72662306a36Sopenharmony_ci *
72762306a36Sopenharmony_ci * DESCRIPTION: Simple callback to exercise acpi_walk_resources and
72862306a36Sopenharmony_ci *              acpi_walk_resource_buffer.
72962306a36Sopenharmony_ci *
73062306a36Sopenharmony_ci ******************************************************************************/
73162306a36Sopenharmony_ci
73262306a36Sopenharmony_cistatic acpi_status
73362306a36Sopenharmony_ciacpi_db_resource_callback(struct acpi_resource *resource, void *context)
73462306a36Sopenharmony_ci{
73562306a36Sopenharmony_ci
73662306a36Sopenharmony_ci	return (AE_OK);
73762306a36Sopenharmony_ci}
73862306a36Sopenharmony_ci
73962306a36Sopenharmony_ci/*******************************************************************************
74062306a36Sopenharmony_ci *
74162306a36Sopenharmony_ci * FUNCTION:    acpi_db_device_resources
74262306a36Sopenharmony_ci *
74362306a36Sopenharmony_ci * PARAMETERS:  acpi_walk_callback
74462306a36Sopenharmony_ci *
74562306a36Sopenharmony_ci * RETURN:      Status
74662306a36Sopenharmony_ci *
74762306a36Sopenharmony_ci * DESCRIPTION: Display the _PRT/_CRS/_PRS resources for a device object.
74862306a36Sopenharmony_ci *
74962306a36Sopenharmony_ci ******************************************************************************/
75062306a36Sopenharmony_ci
75162306a36Sopenharmony_cistatic acpi_status
75262306a36Sopenharmony_ciacpi_db_device_resources(acpi_handle obj_handle,
75362306a36Sopenharmony_ci			 u32 nesting_level, void *context, void **return_value)
75462306a36Sopenharmony_ci{
75562306a36Sopenharmony_ci	struct acpi_namespace_node *node;
75662306a36Sopenharmony_ci	struct acpi_namespace_node *prt_node = NULL;
75762306a36Sopenharmony_ci	struct acpi_namespace_node *crs_node = NULL;
75862306a36Sopenharmony_ci	struct acpi_namespace_node *prs_node = NULL;
75962306a36Sopenharmony_ci	struct acpi_namespace_node *aei_node = NULL;
76062306a36Sopenharmony_ci	char *parent_path;
76162306a36Sopenharmony_ci	struct acpi_buffer return_buffer;
76262306a36Sopenharmony_ci	acpi_status status;
76362306a36Sopenharmony_ci
76462306a36Sopenharmony_ci	node = ACPI_CAST_PTR(struct acpi_namespace_node, obj_handle);
76562306a36Sopenharmony_ci	parent_path = acpi_ns_get_normalized_pathname(node, TRUE);
76662306a36Sopenharmony_ci	if (!parent_path) {
76762306a36Sopenharmony_ci		return (AE_NO_MEMORY);
76862306a36Sopenharmony_ci	}
76962306a36Sopenharmony_ci
77062306a36Sopenharmony_ci	/* Get handles to the resource methods for this device */
77162306a36Sopenharmony_ci
77262306a36Sopenharmony_ci	(void)acpi_get_handle(node, METHOD_NAME__PRT,
77362306a36Sopenharmony_ci			      ACPI_CAST_PTR(acpi_handle, &prt_node));
77462306a36Sopenharmony_ci	(void)acpi_get_handle(node, METHOD_NAME__CRS,
77562306a36Sopenharmony_ci			      ACPI_CAST_PTR(acpi_handle, &crs_node));
77662306a36Sopenharmony_ci	(void)acpi_get_handle(node, METHOD_NAME__PRS,
77762306a36Sopenharmony_ci			      ACPI_CAST_PTR(acpi_handle, &prs_node));
77862306a36Sopenharmony_ci	(void)acpi_get_handle(node, METHOD_NAME__AEI,
77962306a36Sopenharmony_ci			      ACPI_CAST_PTR(acpi_handle, &aei_node));
78062306a36Sopenharmony_ci
78162306a36Sopenharmony_ci	if (!prt_node && !crs_node && !prs_node && !aei_node) {
78262306a36Sopenharmony_ci		goto cleanup;	/* Nothing to do */
78362306a36Sopenharmony_ci	}
78462306a36Sopenharmony_ci
78562306a36Sopenharmony_ci	acpi_os_printf("\nDevice: %s\n", parent_path);
78662306a36Sopenharmony_ci
78762306a36Sopenharmony_ci	/* Prepare for a return object of arbitrary size */
78862306a36Sopenharmony_ci
78962306a36Sopenharmony_ci	return_buffer.pointer = acpi_gbl_db_buffer;
79062306a36Sopenharmony_ci	return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
79162306a36Sopenharmony_ci
79262306a36Sopenharmony_ci	/* _PRT */
79362306a36Sopenharmony_ci
79462306a36Sopenharmony_ci	if (prt_node) {
79562306a36Sopenharmony_ci		acpi_os_printf("Evaluating _PRT\n");
79662306a36Sopenharmony_ci
79762306a36Sopenharmony_ci		status =
79862306a36Sopenharmony_ci		    acpi_evaluate_object(prt_node, NULL, NULL, &return_buffer);
79962306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
80062306a36Sopenharmony_ci			acpi_os_printf("Could not evaluate _PRT: %s\n",
80162306a36Sopenharmony_ci				       acpi_format_exception(status));
80262306a36Sopenharmony_ci			goto get_crs;
80362306a36Sopenharmony_ci		}
80462306a36Sopenharmony_ci
80562306a36Sopenharmony_ci		return_buffer.pointer = acpi_gbl_db_buffer;
80662306a36Sopenharmony_ci		return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
80762306a36Sopenharmony_ci
80862306a36Sopenharmony_ci		status = acpi_get_irq_routing_table(node, &return_buffer);
80962306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
81062306a36Sopenharmony_ci			acpi_os_printf("GetIrqRoutingTable failed: %s\n",
81162306a36Sopenharmony_ci				       acpi_format_exception(status));
81262306a36Sopenharmony_ci			goto get_crs;
81362306a36Sopenharmony_ci		}
81462306a36Sopenharmony_ci
81562306a36Sopenharmony_ci		acpi_rs_dump_irq_list(ACPI_CAST_PTR(u8, acpi_gbl_db_buffer));
81662306a36Sopenharmony_ci	}
81762306a36Sopenharmony_ci
81862306a36Sopenharmony_ci	/* _CRS */
81962306a36Sopenharmony_ci
82062306a36Sopenharmony_ciget_crs:
82162306a36Sopenharmony_ci	if (crs_node) {
82262306a36Sopenharmony_ci		acpi_os_printf("Evaluating _CRS\n");
82362306a36Sopenharmony_ci
82462306a36Sopenharmony_ci		return_buffer.pointer = acpi_gbl_db_buffer;
82562306a36Sopenharmony_ci		return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
82662306a36Sopenharmony_ci
82762306a36Sopenharmony_ci		status =
82862306a36Sopenharmony_ci		    acpi_evaluate_object(crs_node, NULL, NULL, &return_buffer);
82962306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
83062306a36Sopenharmony_ci			acpi_os_printf("Could not evaluate _CRS: %s\n",
83162306a36Sopenharmony_ci				       acpi_format_exception(status));
83262306a36Sopenharmony_ci			goto get_prs;
83362306a36Sopenharmony_ci		}
83462306a36Sopenharmony_ci
83562306a36Sopenharmony_ci		/* This code exercises the acpi_walk_resources interface */
83662306a36Sopenharmony_ci
83762306a36Sopenharmony_ci		status = acpi_walk_resources(node, METHOD_NAME__CRS,
83862306a36Sopenharmony_ci					     acpi_db_resource_callback, NULL);
83962306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
84062306a36Sopenharmony_ci			acpi_os_printf("AcpiWalkResources failed: %s\n",
84162306a36Sopenharmony_ci				       acpi_format_exception(status));
84262306a36Sopenharmony_ci			goto get_prs;
84362306a36Sopenharmony_ci		}
84462306a36Sopenharmony_ci
84562306a36Sopenharmony_ci		/* Get the _CRS resource list (test ALLOCATE buffer) */
84662306a36Sopenharmony_ci
84762306a36Sopenharmony_ci		return_buffer.pointer = NULL;
84862306a36Sopenharmony_ci		return_buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
84962306a36Sopenharmony_ci
85062306a36Sopenharmony_ci		status = acpi_get_current_resources(node, &return_buffer);
85162306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
85262306a36Sopenharmony_ci			acpi_os_printf("AcpiGetCurrentResources failed: %s\n",
85362306a36Sopenharmony_ci				       acpi_format_exception(status));
85462306a36Sopenharmony_ci			goto get_prs;
85562306a36Sopenharmony_ci		}
85662306a36Sopenharmony_ci
85762306a36Sopenharmony_ci		/* This code exercises the acpi_walk_resource_buffer interface */
85862306a36Sopenharmony_ci
85962306a36Sopenharmony_ci		status = acpi_walk_resource_buffer(&return_buffer,
86062306a36Sopenharmony_ci						   acpi_db_resource_callback,
86162306a36Sopenharmony_ci						   NULL);
86262306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
86362306a36Sopenharmony_ci			acpi_os_printf("AcpiWalkResourceBuffer failed: %s\n",
86462306a36Sopenharmony_ci				       acpi_format_exception(status));
86562306a36Sopenharmony_ci			goto end_crs;
86662306a36Sopenharmony_ci		}
86762306a36Sopenharmony_ci
86862306a36Sopenharmony_ci		/* Dump the _CRS resource list */
86962306a36Sopenharmony_ci
87062306a36Sopenharmony_ci		acpi_rs_dump_resource_list(ACPI_CAST_PTR(struct acpi_resource,
87162306a36Sopenharmony_ci							 return_buffer.
87262306a36Sopenharmony_ci							 pointer));
87362306a36Sopenharmony_ci
87462306a36Sopenharmony_ci		/*
87562306a36Sopenharmony_ci		 * Perform comparison of original AML to newly created AML. This
87662306a36Sopenharmony_ci		 * tests both the AML->Resource conversion and the Resource->AML
87762306a36Sopenharmony_ci		 * conversion.
87862306a36Sopenharmony_ci		 */
87962306a36Sopenharmony_ci		(void)acpi_dm_test_resource_conversion(node, METHOD_NAME__CRS);
88062306a36Sopenharmony_ci
88162306a36Sopenharmony_ci		/* Execute _SRS with the resource list */
88262306a36Sopenharmony_ci
88362306a36Sopenharmony_ci		acpi_os_printf("Evaluating _SRS\n");
88462306a36Sopenharmony_ci
88562306a36Sopenharmony_ci		status = acpi_set_current_resources(node, &return_buffer);
88662306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
88762306a36Sopenharmony_ci			acpi_os_printf("AcpiSetCurrentResources failed: %s\n",
88862306a36Sopenharmony_ci				       acpi_format_exception(status));
88962306a36Sopenharmony_ci			goto end_crs;
89062306a36Sopenharmony_ci		}
89162306a36Sopenharmony_ci
89262306a36Sopenharmony_ciend_crs:
89362306a36Sopenharmony_ci		ACPI_FREE(return_buffer.pointer);
89462306a36Sopenharmony_ci	}
89562306a36Sopenharmony_ci
89662306a36Sopenharmony_ci	/* _PRS */
89762306a36Sopenharmony_ci
89862306a36Sopenharmony_ciget_prs:
89962306a36Sopenharmony_ci	if (prs_node) {
90062306a36Sopenharmony_ci		acpi_os_printf("Evaluating _PRS\n");
90162306a36Sopenharmony_ci
90262306a36Sopenharmony_ci		return_buffer.pointer = acpi_gbl_db_buffer;
90362306a36Sopenharmony_ci		return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
90462306a36Sopenharmony_ci
90562306a36Sopenharmony_ci		status =
90662306a36Sopenharmony_ci		    acpi_evaluate_object(prs_node, NULL, NULL, &return_buffer);
90762306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
90862306a36Sopenharmony_ci			acpi_os_printf("Could not evaluate _PRS: %s\n",
90962306a36Sopenharmony_ci				       acpi_format_exception(status));
91062306a36Sopenharmony_ci			goto get_aei;
91162306a36Sopenharmony_ci		}
91262306a36Sopenharmony_ci
91362306a36Sopenharmony_ci		return_buffer.pointer = acpi_gbl_db_buffer;
91462306a36Sopenharmony_ci		return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
91562306a36Sopenharmony_ci
91662306a36Sopenharmony_ci		status = acpi_get_possible_resources(node, &return_buffer);
91762306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
91862306a36Sopenharmony_ci			acpi_os_printf("AcpiGetPossibleResources failed: %s\n",
91962306a36Sopenharmony_ci				       acpi_format_exception(status));
92062306a36Sopenharmony_ci			goto get_aei;
92162306a36Sopenharmony_ci		}
92262306a36Sopenharmony_ci
92362306a36Sopenharmony_ci		acpi_rs_dump_resource_list(ACPI_CAST_PTR
92462306a36Sopenharmony_ci					   (struct acpi_resource,
92562306a36Sopenharmony_ci					    acpi_gbl_db_buffer));
92662306a36Sopenharmony_ci	}
92762306a36Sopenharmony_ci
92862306a36Sopenharmony_ci	/* _AEI */
92962306a36Sopenharmony_ci
93062306a36Sopenharmony_ciget_aei:
93162306a36Sopenharmony_ci	if (aei_node) {
93262306a36Sopenharmony_ci		acpi_os_printf("Evaluating _AEI\n");
93362306a36Sopenharmony_ci
93462306a36Sopenharmony_ci		return_buffer.pointer = acpi_gbl_db_buffer;
93562306a36Sopenharmony_ci		return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
93662306a36Sopenharmony_ci
93762306a36Sopenharmony_ci		status =
93862306a36Sopenharmony_ci		    acpi_evaluate_object(aei_node, NULL, NULL, &return_buffer);
93962306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
94062306a36Sopenharmony_ci			acpi_os_printf("Could not evaluate _AEI: %s\n",
94162306a36Sopenharmony_ci				       acpi_format_exception(status));
94262306a36Sopenharmony_ci			goto cleanup;
94362306a36Sopenharmony_ci		}
94462306a36Sopenharmony_ci
94562306a36Sopenharmony_ci		return_buffer.pointer = acpi_gbl_db_buffer;
94662306a36Sopenharmony_ci		return_buffer.length = ACPI_DEBUG_BUFFER_SIZE;
94762306a36Sopenharmony_ci
94862306a36Sopenharmony_ci		status = acpi_get_event_resources(node, &return_buffer);
94962306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
95062306a36Sopenharmony_ci			acpi_os_printf("AcpiGetEventResources failed: %s\n",
95162306a36Sopenharmony_ci				       acpi_format_exception(status));
95262306a36Sopenharmony_ci			goto cleanup;
95362306a36Sopenharmony_ci		}
95462306a36Sopenharmony_ci
95562306a36Sopenharmony_ci		acpi_rs_dump_resource_list(ACPI_CAST_PTR
95662306a36Sopenharmony_ci					   (struct acpi_resource,
95762306a36Sopenharmony_ci					    acpi_gbl_db_buffer));
95862306a36Sopenharmony_ci	}
95962306a36Sopenharmony_ci
96062306a36Sopenharmony_cicleanup:
96162306a36Sopenharmony_ci	ACPI_FREE(parent_path);
96262306a36Sopenharmony_ci	return (AE_OK);
96362306a36Sopenharmony_ci}
96462306a36Sopenharmony_ci
96562306a36Sopenharmony_ci/*******************************************************************************
96662306a36Sopenharmony_ci *
96762306a36Sopenharmony_ci * FUNCTION:    acpi_db_display_resources
96862306a36Sopenharmony_ci *
96962306a36Sopenharmony_ci * PARAMETERS:  object_arg          - String object name or object pointer.
97062306a36Sopenharmony_ci *                                    NULL or "*" means "display resources for
97162306a36Sopenharmony_ci *                                    all devices"
97262306a36Sopenharmony_ci *
97362306a36Sopenharmony_ci * RETURN:      None
97462306a36Sopenharmony_ci *
97562306a36Sopenharmony_ci * DESCRIPTION: Display the resource objects associated with a device.
97662306a36Sopenharmony_ci *
97762306a36Sopenharmony_ci ******************************************************************************/
97862306a36Sopenharmony_ci
97962306a36Sopenharmony_civoid acpi_db_display_resources(char *object_arg)
98062306a36Sopenharmony_ci{
98162306a36Sopenharmony_ci	struct acpi_namespace_node *node;
98262306a36Sopenharmony_ci
98362306a36Sopenharmony_ci	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
98462306a36Sopenharmony_ci	acpi_dbg_level |= ACPI_LV_RESOURCES;
98562306a36Sopenharmony_ci
98662306a36Sopenharmony_ci	/* Asterisk means "display resources for all devices" */
98762306a36Sopenharmony_ci
98862306a36Sopenharmony_ci	if (!object_arg || (!strcmp(object_arg, "*"))) {
98962306a36Sopenharmony_ci		(void)acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
99062306a36Sopenharmony_ci					  ACPI_UINT32_MAX,
99162306a36Sopenharmony_ci					  acpi_db_device_resources, NULL, NULL,
99262306a36Sopenharmony_ci					  NULL);
99362306a36Sopenharmony_ci	} else {
99462306a36Sopenharmony_ci		/* Convert string to object pointer */
99562306a36Sopenharmony_ci
99662306a36Sopenharmony_ci		node = acpi_db_convert_to_node(object_arg);
99762306a36Sopenharmony_ci		if (node) {
99862306a36Sopenharmony_ci			if (node->type != ACPI_TYPE_DEVICE) {
99962306a36Sopenharmony_ci				acpi_os_printf
100062306a36Sopenharmony_ci				    ("%4.4s: Name is not a device object (%s)\n",
100162306a36Sopenharmony_ci				     node->name.ascii,
100262306a36Sopenharmony_ci				     acpi_ut_get_type_name(node->type));
100362306a36Sopenharmony_ci			} else {
100462306a36Sopenharmony_ci				(void)acpi_db_device_resources(node, 0, NULL,
100562306a36Sopenharmony_ci							       NULL);
100662306a36Sopenharmony_ci			}
100762306a36Sopenharmony_ci		}
100862306a36Sopenharmony_ci	}
100962306a36Sopenharmony_ci
101062306a36Sopenharmony_ci	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
101162306a36Sopenharmony_ci}
101262306a36Sopenharmony_ci
101362306a36Sopenharmony_ci/*******************************************************************************
101462306a36Sopenharmony_ci *
101562306a36Sopenharmony_ci * FUNCTION:    acpi_db_generate_ged
101662306a36Sopenharmony_ci *
101762306a36Sopenharmony_ci * PARAMETERS:  ged_arg             - Raw GED number, ascii string
101862306a36Sopenharmony_ci *
101962306a36Sopenharmony_ci * RETURN:      None
102062306a36Sopenharmony_ci *
102162306a36Sopenharmony_ci * DESCRIPTION: Simulate firing of a GED
102262306a36Sopenharmony_ci *
102362306a36Sopenharmony_ci ******************************************************************************/
102462306a36Sopenharmony_ci
102562306a36Sopenharmony_civoid acpi_db_generate_interrupt(char *gsiv_arg)
102662306a36Sopenharmony_ci{
102762306a36Sopenharmony_ci	u32 gsiv_number;
102862306a36Sopenharmony_ci	struct acpi_ged_handler_info *ged_info = acpi_gbl_ged_handler_list;
102962306a36Sopenharmony_ci
103062306a36Sopenharmony_ci	if (!ged_info) {
103162306a36Sopenharmony_ci		acpi_os_printf("No GED handling present\n");
103262306a36Sopenharmony_ci	}
103362306a36Sopenharmony_ci
103462306a36Sopenharmony_ci	gsiv_number = strtoul(gsiv_arg, NULL, 0);
103562306a36Sopenharmony_ci
103662306a36Sopenharmony_ci	while (ged_info) {
103762306a36Sopenharmony_ci
103862306a36Sopenharmony_ci		if (ged_info->int_id == gsiv_number) {
103962306a36Sopenharmony_ci			struct acpi_object_list arg_list;
104062306a36Sopenharmony_ci			union acpi_object arg0;
104162306a36Sopenharmony_ci			acpi_handle evt_handle = ged_info->evt_method;
104262306a36Sopenharmony_ci			acpi_status status;
104362306a36Sopenharmony_ci
104462306a36Sopenharmony_ci			acpi_os_printf("Evaluate GED _EVT (GSIV=%d)\n",
104562306a36Sopenharmony_ci				       gsiv_number);
104662306a36Sopenharmony_ci
104762306a36Sopenharmony_ci			if (!evt_handle) {
104862306a36Sopenharmony_ci				acpi_os_printf("Undefined _EVT method\n");
104962306a36Sopenharmony_ci				return;
105062306a36Sopenharmony_ci			}
105162306a36Sopenharmony_ci
105262306a36Sopenharmony_ci			arg0.integer.type = ACPI_TYPE_INTEGER;
105362306a36Sopenharmony_ci			arg0.integer.value = gsiv_number;
105462306a36Sopenharmony_ci
105562306a36Sopenharmony_ci			arg_list.count = 1;
105662306a36Sopenharmony_ci			arg_list.pointer = &arg0;
105762306a36Sopenharmony_ci
105862306a36Sopenharmony_ci			status =
105962306a36Sopenharmony_ci			    acpi_evaluate_object(evt_handle, NULL, &arg_list,
106062306a36Sopenharmony_ci						 NULL);
106162306a36Sopenharmony_ci			if (ACPI_FAILURE(status)) {
106262306a36Sopenharmony_ci				acpi_os_printf("Could not evaluate _EVT\n");
106362306a36Sopenharmony_ci				return;
106462306a36Sopenharmony_ci			}
106562306a36Sopenharmony_ci
106662306a36Sopenharmony_ci		}
106762306a36Sopenharmony_ci		ged_info = ged_info->next;
106862306a36Sopenharmony_ci	}
106962306a36Sopenharmony_ci}
107062306a36Sopenharmony_ci
107162306a36Sopenharmony_ci#if (!ACPI_REDUCED_HARDWARE)
107262306a36Sopenharmony_ci/*******************************************************************************
107362306a36Sopenharmony_ci *
107462306a36Sopenharmony_ci * FUNCTION:    acpi_db_generate_gpe
107562306a36Sopenharmony_ci *
107662306a36Sopenharmony_ci * PARAMETERS:  gpe_arg             - Raw GPE number, ascii string
107762306a36Sopenharmony_ci *              block_arg           - GPE block number, ascii string
107862306a36Sopenharmony_ci *                                    0 or 1 for FADT GPE blocks
107962306a36Sopenharmony_ci *
108062306a36Sopenharmony_ci * RETURN:      None
108162306a36Sopenharmony_ci *
108262306a36Sopenharmony_ci * DESCRIPTION: Simulate firing of a GPE
108362306a36Sopenharmony_ci *
108462306a36Sopenharmony_ci ******************************************************************************/
108562306a36Sopenharmony_ci
108662306a36Sopenharmony_civoid acpi_db_generate_gpe(char *gpe_arg, char *block_arg)
108762306a36Sopenharmony_ci{
108862306a36Sopenharmony_ci	u32 block_number = 0;
108962306a36Sopenharmony_ci	u32 gpe_number;
109062306a36Sopenharmony_ci	struct acpi_gpe_event_info *gpe_event_info;
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_ci	gpe_number = strtoul(gpe_arg, NULL, 0);
109362306a36Sopenharmony_ci
109462306a36Sopenharmony_ci	/*
109562306a36Sopenharmony_ci	 * If no block arg, or block arg == 0 or 1, use the FADT-defined
109662306a36Sopenharmony_ci	 * GPE blocks.
109762306a36Sopenharmony_ci	 */
109862306a36Sopenharmony_ci	if (block_arg) {
109962306a36Sopenharmony_ci		block_number = strtoul(block_arg, NULL, 0);
110062306a36Sopenharmony_ci		if (block_number == 1) {
110162306a36Sopenharmony_ci			block_number = 0;
110262306a36Sopenharmony_ci		}
110362306a36Sopenharmony_ci	}
110462306a36Sopenharmony_ci
110562306a36Sopenharmony_ci	gpe_event_info =
110662306a36Sopenharmony_ci	    acpi_ev_get_gpe_event_info(ACPI_TO_POINTER(block_number),
110762306a36Sopenharmony_ci				       gpe_number);
110862306a36Sopenharmony_ci	if (!gpe_event_info) {
110962306a36Sopenharmony_ci		acpi_os_printf("Invalid GPE\n");
111062306a36Sopenharmony_ci		return;
111162306a36Sopenharmony_ci	}
111262306a36Sopenharmony_ci
111362306a36Sopenharmony_ci	(void)acpi_ev_gpe_dispatch(NULL, gpe_event_info, gpe_number);
111462306a36Sopenharmony_ci}
111562306a36Sopenharmony_ci
111662306a36Sopenharmony_ci/*******************************************************************************
111762306a36Sopenharmony_ci *
111862306a36Sopenharmony_ci * FUNCTION:    acpi_db_generate_sci
111962306a36Sopenharmony_ci *
112062306a36Sopenharmony_ci * PARAMETERS:  None
112162306a36Sopenharmony_ci *
112262306a36Sopenharmony_ci * RETURN:      None
112362306a36Sopenharmony_ci *
112462306a36Sopenharmony_ci * DESCRIPTION: Simulate an SCI -- just call the SCI dispatch.
112562306a36Sopenharmony_ci *
112662306a36Sopenharmony_ci ******************************************************************************/
112762306a36Sopenharmony_ci
112862306a36Sopenharmony_civoid acpi_db_generate_sci(void)
112962306a36Sopenharmony_ci{
113062306a36Sopenharmony_ci	acpi_ev_sci_dispatch();
113162306a36Sopenharmony_ci}
113262306a36Sopenharmony_ci
113362306a36Sopenharmony_ci#endif				/* !ACPI_REDUCED_HARDWARE */
113462306a36Sopenharmony_ci
113562306a36Sopenharmony_ci/*******************************************************************************
113662306a36Sopenharmony_ci *
113762306a36Sopenharmony_ci * FUNCTION:    acpi_db_trace
113862306a36Sopenharmony_ci *
113962306a36Sopenharmony_ci * PARAMETERS:  enable_arg          - ENABLE/AML to enable tracer
114062306a36Sopenharmony_ci *                                    DISABLE to disable tracer
114162306a36Sopenharmony_ci *              method_arg          - Method to trace
114262306a36Sopenharmony_ci *              once_arg            - Whether trace once
114362306a36Sopenharmony_ci *
114462306a36Sopenharmony_ci * RETURN:      None
114562306a36Sopenharmony_ci *
114662306a36Sopenharmony_ci * DESCRIPTION: Control method tracing facility
114762306a36Sopenharmony_ci *
114862306a36Sopenharmony_ci ******************************************************************************/
114962306a36Sopenharmony_ci
115062306a36Sopenharmony_civoid acpi_db_trace(char *enable_arg, char *method_arg, char *once_arg)
115162306a36Sopenharmony_ci{
115262306a36Sopenharmony_ci	u32 debug_level = 0;
115362306a36Sopenharmony_ci	u32 debug_layer = 0;
115462306a36Sopenharmony_ci	u32 flags = 0;
115562306a36Sopenharmony_ci
115662306a36Sopenharmony_ci	acpi_ut_strupr(enable_arg);
115762306a36Sopenharmony_ci	acpi_ut_strupr(once_arg);
115862306a36Sopenharmony_ci
115962306a36Sopenharmony_ci	if (method_arg) {
116062306a36Sopenharmony_ci		if (acpi_db_trace_method_name) {
116162306a36Sopenharmony_ci			ACPI_FREE(acpi_db_trace_method_name);
116262306a36Sopenharmony_ci			acpi_db_trace_method_name = NULL;
116362306a36Sopenharmony_ci		}
116462306a36Sopenharmony_ci
116562306a36Sopenharmony_ci		acpi_db_trace_method_name =
116662306a36Sopenharmony_ci		    ACPI_ALLOCATE(strlen(method_arg) + 1);
116762306a36Sopenharmony_ci		if (!acpi_db_trace_method_name) {
116862306a36Sopenharmony_ci			acpi_os_printf("Failed to allocate method name (%s)\n",
116962306a36Sopenharmony_ci				       method_arg);
117062306a36Sopenharmony_ci			return;
117162306a36Sopenharmony_ci		}
117262306a36Sopenharmony_ci
117362306a36Sopenharmony_ci		strcpy(acpi_db_trace_method_name, method_arg);
117462306a36Sopenharmony_ci	}
117562306a36Sopenharmony_ci
117662306a36Sopenharmony_ci	if (!strcmp(enable_arg, "ENABLE") ||
117762306a36Sopenharmony_ci	    !strcmp(enable_arg, "METHOD") || !strcmp(enable_arg, "OPCODE")) {
117862306a36Sopenharmony_ci		if (!strcmp(enable_arg, "ENABLE")) {
117962306a36Sopenharmony_ci
118062306a36Sopenharmony_ci			/* Inherit current console settings */
118162306a36Sopenharmony_ci
118262306a36Sopenharmony_ci			debug_level = acpi_gbl_db_console_debug_level;
118362306a36Sopenharmony_ci			debug_layer = acpi_dbg_layer;
118462306a36Sopenharmony_ci		} else {
118562306a36Sopenharmony_ci			/* Restrict console output to trace points only */
118662306a36Sopenharmony_ci
118762306a36Sopenharmony_ci			debug_level = ACPI_LV_TRACE_POINT;
118862306a36Sopenharmony_ci			debug_layer = ACPI_EXECUTER;
118962306a36Sopenharmony_ci		}
119062306a36Sopenharmony_ci
119162306a36Sopenharmony_ci		flags = ACPI_TRACE_ENABLED;
119262306a36Sopenharmony_ci
119362306a36Sopenharmony_ci		if (!strcmp(enable_arg, "OPCODE")) {
119462306a36Sopenharmony_ci			flags |= ACPI_TRACE_OPCODE;
119562306a36Sopenharmony_ci		}
119662306a36Sopenharmony_ci
119762306a36Sopenharmony_ci		if (once_arg && !strcmp(once_arg, "ONCE")) {
119862306a36Sopenharmony_ci			flags |= ACPI_TRACE_ONESHOT;
119962306a36Sopenharmony_ci		}
120062306a36Sopenharmony_ci	}
120162306a36Sopenharmony_ci
120262306a36Sopenharmony_ci	(void)acpi_debug_trace(acpi_db_trace_method_name,
120362306a36Sopenharmony_ci			       debug_level, debug_layer, flags);
120462306a36Sopenharmony_ci}
1205