162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
262306a36Sopenharmony_ci/*******************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Module Name: dbutils - AML debugger utilities
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci ******************************************************************************/
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <acpi/acpi.h>
962306a36Sopenharmony_ci#include "accommon.h"
1062306a36Sopenharmony_ci#include "acnamesp.h"
1162306a36Sopenharmony_ci#include "acdebug.h"
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#define _COMPONENT          ACPI_CA_DEBUGGER
1462306a36Sopenharmony_ciACPI_MODULE_NAME("dbutils")
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/* Local prototypes */
1762306a36Sopenharmony_ci#ifdef ACPI_OBSOLETE_FUNCTIONS
1862306a36Sopenharmony_ciacpi_status acpi_db_second_pass_parse(union acpi_parse_object *root);
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_civoid acpi_db_dump_buffer(u32 address);
2162306a36Sopenharmony_ci#endif
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci/*******************************************************************************
2462306a36Sopenharmony_ci *
2562306a36Sopenharmony_ci * FUNCTION:    acpi_db_match_argument
2662306a36Sopenharmony_ci *
2762306a36Sopenharmony_ci * PARAMETERS:  user_argument           - User command line
2862306a36Sopenharmony_ci *              arguments               - Array of commands to match against
2962306a36Sopenharmony_ci *
3062306a36Sopenharmony_ci * RETURN:      Index into command array or ACPI_TYPE_NOT_FOUND if not found
3162306a36Sopenharmony_ci *
3262306a36Sopenharmony_ci * DESCRIPTION: Search command array for a command match
3362306a36Sopenharmony_ci *
3462306a36Sopenharmony_ci ******************************************************************************/
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ciacpi_object_type
3762306a36Sopenharmony_ciacpi_db_match_argument(char *user_argument,
3862306a36Sopenharmony_ci		       struct acpi_db_argument_info *arguments)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	u32 i;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	if (!user_argument || user_argument[0] == 0) {
4362306a36Sopenharmony_ci		return (ACPI_TYPE_NOT_FOUND);
4462306a36Sopenharmony_ci	}
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	for (i = 0; arguments[i].name; i++) {
4762306a36Sopenharmony_ci		if (strstr(ACPI_CAST_PTR(char, arguments[i].name),
4862306a36Sopenharmony_ci			   ACPI_CAST_PTR(char,
4962306a36Sopenharmony_ci					 user_argument)) == arguments[i].name) {
5062306a36Sopenharmony_ci			return (i);
5162306a36Sopenharmony_ci		}
5262306a36Sopenharmony_ci	}
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	/* Argument not recognized */
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	return (ACPI_TYPE_NOT_FOUND);
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci/*******************************************************************************
6062306a36Sopenharmony_ci *
6162306a36Sopenharmony_ci * FUNCTION:    acpi_db_set_output_destination
6262306a36Sopenharmony_ci *
6362306a36Sopenharmony_ci * PARAMETERS:  output_flags        - Current flags word
6462306a36Sopenharmony_ci *
6562306a36Sopenharmony_ci * RETURN:      None
6662306a36Sopenharmony_ci *
6762306a36Sopenharmony_ci * DESCRIPTION: Set the current destination for debugger output. Also sets
6862306a36Sopenharmony_ci *              the debug output level accordingly.
6962306a36Sopenharmony_ci *
7062306a36Sopenharmony_ci ******************************************************************************/
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_civoid acpi_db_set_output_destination(u32 output_flags)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	acpi_gbl_db_output_flags = (u8)output_flags;
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	if ((output_flags & ACPI_DB_REDIRECTABLE_OUTPUT) &&
7862306a36Sopenharmony_ci	    acpi_gbl_db_output_to_file) {
7962306a36Sopenharmony_ci		acpi_dbg_level = acpi_gbl_db_debug_level;
8062306a36Sopenharmony_ci	} else {
8162306a36Sopenharmony_ci		acpi_dbg_level = acpi_gbl_db_console_debug_level;
8262306a36Sopenharmony_ci	}
8362306a36Sopenharmony_ci}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci/*******************************************************************************
8662306a36Sopenharmony_ci *
8762306a36Sopenharmony_ci * FUNCTION:    acpi_db_dump_external_object
8862306a36Sopenharmony_ci *
8962306a36Sopenharmony_ci * PARAMETERS:  obj_desc        - External ACPI object to dump
9062306a36Sopenharmony_ci *              level           - Nesting level.
9162306a36Sopenharmony_ci *
9262306a36Sopenharmony_ci * RETURN:      None
9362306a36Sopenharmony_ci *
9462306a36Sopenharmony_ci * DESCRIPTION: Dump the contents of an ACPI external object
9562306a36Sopenharmony_ci *
9662306a36Sopenharmony_ci ******************************************************************************/
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_civoid acpi_db_dump_external_object(union acpi_object *obj_desc, u32 level)
9962306a36Sopenharmony_ci{
10062306a36Sopenharmony_ci	u32 i;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	if (!obj_desc) {
10362306a36Sopenharmony_ci		acpi_os_printf("[Null Object]\n");
10462306a36Sopenharmony_ci		return;
10562306a36Sopenharmony_ci	}
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	for (i = 0; i < level; i++) {
10862306a36Sopenharmony_ci		acpi_os_printf(" ");
10962306a36Sopenharmony_ci	}
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	switch (obj_desc->type) {
11262306a36Sopenharmony_ci	case ACPI_TYPE_ANY:
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci		acpi_os_printf("[Null Object] (Type=0)\n");
11562306a36Sopenharmony_ci		break;
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci	case ACPI_TYPE_INTEGER:
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci		acpi_os_printf("[Integer] = %8.8X%8.8X\n",
12062306a36Sopenharmony_ci			       ACPI_FORMAT_UINT64(obj_desc->integer.value));
12162306a36Sopenharmony_ci		break;
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	case ACPI_TYPE_STRING:
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci		acpi_os_printf("[String] Length %.2X = ",
12662306a36Sopenharmony_ci			       obj_desc->string.length);
12762306a36Sopenharmony_ci		acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX);
12862306a36Sopenharmony_ci		acpi_os_printf("\n");
12962306a36Sopenharmony_ci		break;
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	case ACPI_TYPE_BUFFER:
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci		acpi_os_printf("[Buffer] Length %.2X = ",
13462306a36Sopenharmony_ci			       obj_desc->buffer.length);
13562306a36Sopenharmony_ci		if (obj_desc->buffer.length) {
13662306a36Sopenharmony_ci			if (obj_desc->buffer.length > 16) {
13762306a36Sopenharmony_ci				acpi_os_printf("\n");
13862306a36Sopenharmony_ci			}
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci			acpi_ut_debug_dump_buffer(ACPI_CAST_PTR
14162306a36Sopenharmony_ci						  (u8,
14262306a36Sopenharmony_ci						   obj_desc->buffer.pointer),
14362306a36Sopenharmony_ci						  obj_desc->buffer.length,
14462306a36Sopenharmony_ci						  DB_BYTE_DISPLAY, _COMPONENT);
14562306a36Sopenharmony_ci		} else {
14662306a36Sopenharmony_ci			acpi_os_printf("\n");
14762306a36Sopenharmony_ci		}
14862306a36Sopenharmony_ci		break;
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci	case ACPI_TYPE_PACKAGE:
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci		acpi_os_printf("[Package] Contains %u Elements:\n",
15362306a36Sopenharmony_ci			       obj_desc->package.count);
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci		for (i = 0; i < obj_desc->package.count; i++) {
15662306a36Sopenharmony_ci			acpi_db_dump_external_object(&obj_desc->package.
15762306a36Sopenharmony_ci						     elements[i], level + 1);
15862306a36Sopenharmony_ci		}
15962306a36Sopenharmony_ci		break;
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	case ACPI_TYPE_LOCAL_REFERENCE:
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci		acpi_os_printf("[Object Reference] = ");
16462306a36Sopenharmony_ci		acpi_db_display_internal_object(obj_desc->reference.handle,
16562306a36Sopenharmony_ci						NULL);
16662306a36Sopenharmony_ci		break;
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci	case ACPI_TYPE_PROCESSOR:
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci		acpi_os_printf("[Processor]\n");
17162306a36Sopenharmony_ci		break;
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	case ACPI_TYPE_POWER:
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci		acpi_os_printf("[Power Resource]\n");
17662306a36Sopenharmony_ci		break;
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	default:
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci		acpi_os_printf("[Unknown Type] %X\n", obj_desc->type);
18162306a36Sopenharmony_ci		break;
18262306a36Sopenharmony_ci	}
18362306a36Sopenharmony_ci}
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci/*******************************************************************************
18662306a36Sopenharmony_ci *
18762306a36Sopenharmony_ci * FUNCTION:    acpi_db_prep_namestring
18862306a36Sopenharmony_ci *
18962306a36Sopenharmony_ci * PARAMETERS:  name            - String to prepare
19062306a36Sopenharmony_ci *
19162306a36Sopenharmony_ci * RETURN:      None
19262306a36Sopenharmony_ci *
19362306a36Sopenharmony_ci * DESCRIPTION: Translate all forward slashes and dots to backslashes.
19462306a36Sopenharmony_ci *
19562306a36Sopenharmony_ci ******************************************************************************/
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_civoid acpi_db_prep_namestring(char *name)
19862306a36Sopenharmony_ci{
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci	if (!name) {
20162306a36Sopenharmony_ci		return;
20262306a36Sopenharmony_ci	}
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	acpi_ut_strupr(name);
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci	/* Convert a leading forward slash to a backslash */
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	if (*name == '/') {
20962306a36Sopenharmony_ci		*name = '\\';
21062306a36Sopenharmony_ci	}
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci	/* Ignore a leading backslash, this is the root prefix */
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci	if (ACPI_IS_ROOT_PREFIX(*name)) {
21562306a36Sopenharmony_ci		name++;
21662306a36Sopenharmony_ci	}
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci	/* Convert all slash path separators to dots */
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	while (*name) {
22162306a36Sopenharmony_ci		if ((*name == '/') || (*name == '\\')) {
22262306a36Sopenharmony_ci			*name = '.';
22362306a36Sopenharmony_ci		}
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci		name++;
22662306a36Sopenharmony_ci	}
22762306a36Sopenharmony_ci}
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci/*******************************************************************************
23062306a36Sopenharmony_ci *
23162306a36Sopenharmony_ci * FUNCTION:    acpi_db_local_ns_lookup
23262306a36Sopenharmony_ci *
23362306a36Sopenharmony_ci * PARAMETERS:  name            - Name to lookup
23462306a36Sopenharmony_ci *
23562306a36Sopenharmony_ci * RETURN:      Pointer to a namespace node, null on failure
23662306a36Sopenharmony_ci *
23762306a36Sopenharmony_ci * DESCRIPTION: Lookup a name in the ACPI namespace
23862306a36Sopenharmony_ci *
23962306a36Sopenharmony_ci * Note: Currently begins search from the root. Could be enhanced to use
24062306a36Sopenharmony_ci * the current prefix (scope) node as the search beginning point.
24162306a36Sopenharmony_ci *
24262306a36Sopenharmony_ci ******************************************************************************/
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_cistruct acpi_namespace_node *acpi_db_local_ns_lookup(char *name)
24562306a36Sopenharmony_ci{
24662306a36Sopenharmony_ci	char *internal_path;
24762306a36Sopenharmony_ci	acpi_status status;
24862306a36Sopenharmony_ci	struct acpi_namespace_node *node = NULL;
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci	acpi_db_prep_namestring(name);
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci	/* Build an internal namestring */
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci	status = acpi_ns_internalize_name(name, &internal_path);
25562306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
25662306a36Sopenharmony_ci		acpi_os_printf("Invalid namestring: %s\n", name);
25762306a36Sopenharmony_ci		return (NULL);
25862306a36Sopenharmony_ci	}
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci	/*
26162306a36Sopenharmony_ci	 * Lookup the name.
26262306a36Sopenharmony_ci	 * (Uses root node as the search starting point)
26362306a36Sopenharmony_ci	 */
26462306a36Sopenharmony_ci	status = acpi_ns_lookup(NULL, internal_path, ACPI_TYPE_ANY,
26562306a36Sopenharmony_ci				ACPI_IMODE_EXECUTE,
26662306a36Sopenharmony_ci				ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE,
26762306a36Sopenharmony_ci				NULL, &node);
26862306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
26962306a36Sopenharmony_ci		acpi_os_printf("Could not locate name: %s, %s\n",
27062306a36Sopenharmony_ci			       name, acpi_format_exception(status));
27162306a36Sopenharmony_ci	}
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci	ACPI_FREE(internal_path);
27462306a36Sopenharmony_ci	return (node);
27562306a36Sopenharmony_ci}
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci/*******************************************************************************
27862306a36Sopenharmony_ci *
27962306a36Sopenharmony_ci * FUNCTION:    acpi_db_uint32_to_hex_string
28062306a36Sopenharmony_ci *
28162306a36Sopenharmony_ci * PARAMETERS:  value           - The value to be converted to string
28262306a36Sopenharmony_ci *              buffer          - Buffer for result (not less than 11 bytes)
28362306a36Sopenharmony_ci *
28462306a36Sopenharmony_ci * RETURN:      None
28562306a36Sopenharmony_ci *
28662306a36Sopenharmony_ci * DESCRIPTION: Convert the unsigned 32-bit value to the hexadecimal image
28762306a36Sopenharmony_ci *
28862306a36Sopenharmony_ci * NOTE: It is the caller's responsibility to ensure that the length of buffer
28962306a36Sopenharmony_ci *       is sufficient.
29062306a36Sopenharmony_ci *
29162306a36Sopenharmony_ci ******************************************************************************/
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_civoid acpi_db_uint32_to_hex_string(u32 value, char *buffer)
29462306a36Sopenharmony_ci{
29562306a36Sopenharmony_ci	int i;
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci	if (value == 0) {
29862306a36Sopenharmony_ci		strcpy(buffer, "0");
29962306a36Sopenharmony_ci		return;
30062306a36Sopenharmony_ci	}
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	buffer[8] = '\0';
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci	for (i = 7; i >= 0; i--) {
30562306a36Sopenharmony_ci		buffer[i] = acpi_gbl_upper_hex_digits[value & 0x0F];
30662306a36Sopenharmony_ci		value = value >> 4;
30762306a36Sopenharmony_ci	}
30862306a36Sopenharmony_ci}
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci#ifdef ACPI_OBSOLETE_FUNCTIONS
31162306a36Sopenharmony_ci/*******************************************************************************
31262306a36Sopenharmony_ci *
31362306a36Sopenharmony_ci * FUNCTION:    acpi_db_second_pass_parse
31462306a36Sopenharmony_ci *
31562306a36Sopenharmony_ci * PARAMETERS:  root            - Root of the parse tree
31662306a36Sopenharmony_ci *
31762306a36Sopenharmony_ci * RETURN:      Status
31862306a36Sopenharmony_ci *
31962306a36Sopenharmony_ci * DESCRIPTION: Second pass parse of the ACPI tables. We need to wait until
32062306a36Sopenharmony_ci *              second pass to parse the control methods
32162306a36Sopenharmony_ci *
32262306a36Sopenharmony_ci ******************************************************************************/
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ciacpi_status acpi_db_second_pass_parse(union acpi_parse_object *root)
32562306a36Sopenharmony_ci{
32662306a36Sopenharmony_ci	union acpi_parse_object *op = root;
32762306a36Sopenharmony_ci	union acpi_parse_object *method;
32862306a36Sopenharmony_ci	union acpi_parse_object *search_op;
32962306a36Sopenharmony_ci	union acpi_parse_object *start_op;
33062306a36Sopenharmony_ci	acpi_status status = AE_OK;
33162306a36Sopenharmony_ci	u32 base_aml_offset;
33262306a36Sopenharmony_ci	struct acpi_walk_state *walk_state;
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ci	ACPI_FUNCTION_ENTRY();
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ci	acpi_os_printf("Pass two parse ....\n");
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	while (op) {
33962306a36Sopenharmony_ci		if (op->common.aml_opcode == AML_METHOD_OP) {
34062306a36Sopenharmony_ci			method = op;
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci			/* Create a new walk state for the parse */
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci			walk_state =
34562306a36Sopenharmony_ci			    acpi_ds_create_walk_state(0, NULL, NULL, NULL);
34662306a36Sopenharmony_ci			if (!walk_state) {
34762306a36Sopenharmony_ci				return (AE_NO_MEMORY);
34862306a36Sopenharmony_ci			}
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci			/* Init the Walk State */
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci			walk_state->parser_state.aml =
35362306a36Sopenharmony_ci			    walk_state->parser_state.aml_start =
35462306a36Sopenharmony_ci			    method->named.data;
35562306a36Sopenharmony_ci			walk_state->parser_state.aml_end =
35662306a36Sopenharmony_ci			    walk_state->parser_state.pkg_end =
35762306a36Sopenharmony_ci			    method->named.data + method->named.length;
35862306a36Sopenharmony_ci			walk_state->parser_state.start_scope = op;
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci			walk_state->descending_callback =
36162306a36Sopenharmony_ci			    acpi_ds_load1_begin_op;
36262306a36Sopenharmony_ci			walk_state->ascending_callback = acpi_ds_load1_end_op;
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci			/* Perform the AML parse */
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci			status = acpi_ps_parse_aml(walk_state);
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci			base_aml_offset =
36962306a36Sopenharmony_ci			    (method->common.value.arg)->common.aml_offset + 1;
37062306a36Sopenharmony_ci			start_op = (method->common.value.arg)->common.next;
37162306a36Sopenharmony_ci			search_op = start_op;
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci			while (search_op) {
37462306a36Sopenharmony_ci				search_op->common.aml_offset += base_aml_offset;
37562306a36Sopenharmony_ci				search_op =
37662306a36Sopenharmony_ci				    acpi_ps_get_depth_next(start_op, search_op);
37762306a36Sopenharmony_ci			}
37862306a36Sopenharmony_ci		}
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci		if (op->common.aml_opcode == AML_REGION_OP) {
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_ci			/* TBD: [Investigate] this isn't quite the right thing to do! */
38362306a36Sopenharmony_ci			/*
38462306a36Sopenharmony_ci			 *
38562306a36Sopenharmony_ci			 * Method = (ACPI_DEFERRED_OP *) Op;
38662306a36Sopenharmony_ci			 * Status = acpi_ps_parse_aml (Op, Method->Body, Method->body_length);
38762306a36Sopenharmony_ci			 */
38862306a36Sopenharmony_ci		}
38962306a36Sopenharmony_ci
39062306a36Sopenharmony_ci		if (ACPI_FAILURE(status)) {
39162306a36Sopenharmony_ci			break;
39262306a36Sopenharmony_ci		}
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci		op = acpi_ps_get_depth_next(root, op);
39562306a36Sopenharmony_ci	}
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ci	return (status);
39862306a36Sopenharmony_ci}
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ci/*******************************************************************************
40162306a36Sopenharmony_ci *
40262306a36Sopenharmony_ci * FUNCTION:    acpi_db_dump_buffer
40362306a36Sopenharmony_ci *
40462306a36Sopenharmony_ci * PARAMETERS:  address             - Pointer to the buffer
40562306a36Sopenharmony_ci *
40662306a36Sopenharmony_ci * RETURN:      None
40762306a36Sopenharmony_ci *
40862306a36Sopenharmony_ci * DESCRIPTION: Print a portion of a buffer
40962306a36Sopenharmony_ci *
41062306a36Sopenharmony_ci ******************************************************************************/
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_civoid acpi_db_dump_buffer(u32 address)
41362306a36Sopenharmony_ci{
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_ci	acpi_os_printf("\nLocation %X:\n", address);
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci	acpi_dbg_level |= ACPI_LV_TABLES;
41862306a36Sopenharmony_ci	acpi_ut_debug_dump_buffer(ACPI_TO_POINTER(address), 64, DB_BYTE_DISPLAY,
41962306a36Sopenharmony_ci				  ACPI_UINT32_MAX);
42062306a36Sopenharmony_ci}
42162306a36Sopenharmony_ci#endif
422