xref: /openbmc/linux/drivers/acpi/acpica/dbnames.c (revision 77ffc72b)
195857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
299575102SLv Zheng /*******************************************************************************
399575102SLv Zheng  *
499575102SLv Zheng  * Module Name: dbnames - Debugger commands for the acpi namespace
599575102SLv Zheng  *
699575102SLv Zheng  ******************************************************************************/
799575102SLv Zheng 
899575102SLv Zheng #include <acpi/acpi.h>
999575102SLv Zheng #include "accommon.h"
1099575102SLv Zheng #include "acnamesp.h"
1199575102SLv Zheng #include "acdebug.h"
1299575102SLv Zheng #include "acpredef.h"
135fd03328SErik Schmauss #include "acinterp.h"
1499575102SLv Zheng 
1599575102SLv Zheng #define _COMPONENT          ACPI_CA_DEBUGGER
1699575102SLv Zheng ACPI_MODULE_NAME("dbnames")
1799575102SLv Zheng 
1899575102SLv Zheng /* Local prototypes */
1999575102SLv Zheng static acpi_status
2099575102SLv Zheng acpi_db_walk_and_match_name(acpi_handle obj_handle,
2199575102SLv Zheng 			    u32 nesting_level,
2299575102SLv Zheng 			    void *context, void **return_value);
2399575102SLv Zheng 
2499575102SLv Zheng static acpi_status
2599575102SLv Zheng acpi_db_walk_for_predefined_names(acpi_handle obj_handle,
2699575102SLv Zheng 				  u32 nesting_level,
2799575102SLv Zheng 				  void *context, void **return_value);
2899575102SLv Zheng 
2999575102SLv Zheng static acpi_status
3099575102SLv Zheng acpi_db_walk_for_specific_objects(acpi_handle obj_handle,
3199575102SLv Zheng 				  u32 nesting_level,
3299575102SLv Zheng 				  void *context, void **return_value);
3399575102SLv Zheng 
3499575102SLv Zheng static acpi_status
3599575102SLv Zheng acpi_db_walk_for_object_counts(acpi_handle obj_handle,
3699575102SLv Zheng 			       u32 nesting_level,
3799575102SLv Zheng 			       void *context, void **return_value);
3899575102SLv Zheng 
3999575102SLv Zheng static acpi_status
4099575102SLv Zheng acpi_db_integrity_walk(acpi_handle obj_handle,
4199575102SLv Zheng 		       u32 nesting_level, void *context, void **return_value);
4299575102SLv Zheng 
4399575102SLv Zheng static acpi_status
4499575102SLv Zheng acpi_db_walk_for_references(acpi_handle obj_handle,
4599575102SLv Zheng 			    u32 nesting_level,
4699575102SLv Zheng 			    void *context, void **return_value);
4799575102SLv Zheng 
4899575102SLv Zheng static acpi_status
4999575102SLv Zheng acpi_db_bus_walk(acpi_handle obj_handle,
5099575102SLv Zheng 		 u32 nesting_level, void *context, void **return_value);
5199575102SLv Zheng 
5299575102SLv Zheng /*
5399575102SLv Zheng  * Arguments for the Objects command
5499575102SLv Zheng  * These object types map directly to the ACPI_TYPES
5599575102SLv Zheng  */
5699575102SLv Zheng static struct acpi_db_argument_info acpi_db_object_types[] = {
5799575102SLv Zheng 	{"ANY"},
5899575102SLv Zheng 	{"INTEGERS"},
5999575102SLv Zheng 	{"STRINGS"},
6099575102SLv Zheng 	{"BUFFERS"},
6199575102SLv Zheng 	{"PACKAGES"},
6299575102SLv Zheng 	{"FIELDS"},
6399575102SLv Zheng 	{"DEVICES"},
6499575102SLv Zheng 	{"EVENTS"},
6599575102SLv Zheng 	{"METHODS"},
6699575102SLv Zheng 	{"MUTEXES"},
6799575102SLv Zheng 	{"REGIONS"},
6899575102SLv Zheng 	{"POWERRESOURCES"},
6999575102SLv Zheng 	{"PROCESSORS"},
7099575102SLv Zheng 	{"THERMALZONES"},
7199575102SLv Zheng 	{"BUFFERFIELDS"},
7299575102SLv Zheng 	{"DDBHANDLES"},
7399575102SLv Zheng 	{"DEBUG"},
7499575102SLv Zheng 	{"REGIONFIELDS"},
7599575102SLv Zheng 	{"BANKFIELDS"},
7699575102SLv Zheng 	{"INDEXFIELDS"},
7799575102SLv Zheng 	{"REFERENCES"},
7899575102SLv Zheng 	{"ALIASES"},
7999575102SLv Zheng 	{"METHODALIASES"},
8099575102SLv Zheng 	{"NOTIFY"},
8199575102SLv Zheng 	{"ADDRESSHANDLER"},
8299575102SLv Zheng 	{"RESOURCE"},
8399575102SLv Zheng 	{"RESOURCEFIELD"},
8499575102SLv Zheng 	{"SCOPES"},
8599575102SLv Zheng 	{NULL}			/* Must be null terminated */
8699575102SLv Zheng };
8799575102SLv Zheng 
8899575102SLv Zheng /*******************************************************************************
8999575102SLv Zheng  *
9099575102SLv Zheng  * FUNCTION:    acpi_db_set_scope
9199575102SLv Zheng  *
9299575102SLv Zheng  * PARAMETERS:  name                - New scope path
9399575102SLv Zheng  *
9499575102SLv Zheng  * RETURN:      Status
9599575102SLv Zheng  *
9699575102SLv Zheng  * DESCRIPTION: Set the "current scope" as maintained by this utility.
9799575102SLv Zheng  *              The scope is used as a prefix to ACPI paths.
9899575102SLv Zheng  *
9999575102SLv Zheng  ******************************************************************************/
10099575102SLv Zheng 
acpi_db_set_scope(char * name)10199575102SLv Zheng void acpi_db_set_scope(char *name)
10299575102SLv Zheng {
10399575102SLv Zheng 	acpi_status status;
10499575102SLv Zheng 	struct acpi_namespace_node *node;
10599575102SLv Zheng 
10699575102SLv Zheng 	if (!name || name[0] == 0) {
10799575102SLv Zheng 		acpi_os_printf("Current scope: %s\n", acpi_gbl_db_scope_buf);
10899575102SLv Zheng 		return;
10999575102SLv Zheng 	}
11099575102SLv Zheng 
11199575102SLv Zheng 	acpi_db_prep_namestring(name);
11299575102SLv Zheng 
11399575102SLv Zheng 	if (ACPI_IS_ROOT_PREFIX(name[0])) {
11499575102SLv Zheng 
11599575102SLv Zheng 		/* Validate new scope from the root */
11699575102SLv Zheng 
11799575102SLv Zheng 		status = acpi_ns_get_node(acpi_gbl_root_node, name,
11899575102SLv Zheng 					  ACPI_NS_NO_UPSEARCH, &node);
11999575102SLv Zheng 		if (ACPI_FAILURE(status)) {
12099575102SLv Zheng 			goto error_exit;
12199575102SLv Zheng 		}
12299575102SLv Zheng 
12399575102SLv Zheng 		acpi_gbl_db_scope_buf[0] = 0;
12499575102SLv Zheng 	} else {
12599575102SLv Zheng 		/* Validate new scope relative to old scope */
12699575102SLv Zheng 
12799575102SLv Zheng 		status = acpi_ns_get_node(acpi_gbl_db_scope_node, name,
12899575102SLv Zheng 					  ACPI_NS_NO_UPSEARCH, &node);
12999575102SLv Zheng 		if (ACPI_FAILURE(status)) {
13099575102SLv Zheng 			goto error_exit;
13199575102SLv Zheng 		}
13299575102SLv Zheng 	}
13399575102SLv Zheng 
13499575102SLv Zheng 	/* Build the final pathname */
13599575102SLv Zheng 
13699575102SLv Zheng 	if (acpi_ut_safe_strcat
13799575102SLv Zheng 	    (acpi_gbl_db_scope_buf, sizeof(acpi_gbl_db_scope_buf), name)) {
13899575102SLv Zheng 		status = AE_BUFFER_OVERFLOW;
13999575102SLv Zheng 		goto error_exit;
14099575102SLv Zheng 	}
14199575102SLv Zheng 
14299575102SLv Zheng 	if (acpi_ut_safe_strcat
14399575102SLv Zheng 	    (acpi_gbl_db_scope_buf, sizeof(acpi_gbl_db_scope_buf), "\\")) {
14499575102SLv Zheng 		status = AE_BUFFER_OVERFLOW;
14599575102SLv Zheng 		goto error_exit;
14699575102SLv Zheng 	}
14799575102SLv Zheng 
14899575102SLv Zheng 	acpi_gbl_db_scope_node = node;
14999575102SLv Zheng 	acpi_os_printf("New scope: %s\n", acpi_gbl_db_scope_buf);
15099575102SLv Zheng 	return;
15199575102SLv Zheng 
15299575102SLv Zheng error_exit:
15399575102SLv Zheng 
15499575102SLv Zheng 	acpi_os_printf("Could not attach scope: %s, %s\n",
15599575102SLv Zheng 		       name, acpi_format_exception(status));
15699575102SLv Zheng }
15799575102SLv Zheng 
15899575102SLv Zheng /*******************************************************************************
15999575102SLv Zheng  *
16099575102SLv Zheng  * FUNCTION:    acpi_db_dump_namespace
16199575102SLv Zheng  *
16299575102SLv Zheng  * PARAMETERS:  start_arg       - Node to begin namespace dump
16399575102SLv Zheng  *              depth_arg       - Maximum tree depth to be dumped
16499575102SLv Zheng  *
16599575102SLv Zheng  * RETURN:      None
16699575102SLv Zheng  *
16799575102SLv Zheng  * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed
16899575102SLv Zheng  *              with type and other information.
16999575102SLv Zheng  *
17099575102SLv Zheng  ******************************************************************************/
17199575102SLv Zheng 
acpi_db_dump_namespace(char * start_arg,char * depth_arg)17299575102SLv Zheng void acpi_db_dump_namespace(char *start_arg, char *depth_arg)
17399575102SLv Zheng {
17499575102SLv Zheng 	acpi_handle subtree_entry = acpi_gbl_root_node;
17599575102SLv Zheng 	u32 max_depth = ACPI_UINT32_MAX;
17699575102SLv Zheng 
17799575102SLv Zheng 	/* No argument given, just start at the root and dump entire namespace */
17899575102SLv Zheng 
17999575102SLv Zheng 	if (start_arg) {
18099575102SLv Zheng 		subtree_entry = acpi_db_convert_to_node(start_arg);
18199575102SLv Zheng 		if (!subtree_entry) {
18299575102SLv Zheng 			return;
18399575102SLv Zheng 		}
18499575102SLv Zheng 
18599575102SLv Zheng 		/* Now we can check for the depth argument */
18699575102SLv Zheng 
18799575102SLv Zheng 		if (depth_arg) {
18899575102SLv Zheng 			max_depth = strtoul(depth_arg, NULL, 0);
18999575102SLv Zheng 		}
19099575102SLv Zheng 	}
19199575102SLv Zheng 
19299575102SLv Zheng 	acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT);
1934032cc3eSBob Moore 
1944032cc3eSBob Moore 	if (((struct acpi_namespace_node *)subtree_entry)->parent) {
19599575102SLv Zheng 		acpi_os_printf("ACPI Namespace (from %4.4s (%p) subtree):\n",
1964032cc3eSBob Moore 			       ((struct acpi_namespace_node *)subtree_entry)->
1974032cc3eSBob Moore 			       name.ascii, subtree_entry);
1984032cc3eSBob Moore 	} else {
1994032cc3eSBob Moore 		acpi_os_printf("ACPI Namespace (from %s):\n",
2004032cc3eSBob Moore 			       ACPI_NAMESPACE_ROOT);
2014032cc3eSBob Moore 	}
20299575102SLv Zheng 
20399575102SLv Zheng 	/* Display the subtree */
20499575102SLv Zheng 
20599575102SLv Zheng 	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
20699575102SLv Zheng 	acpi_ns_dump_objects(ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, max_depth,
20799575102SLv Zheng 			     ACPI_OWNER_ID_MAX, subtree_entry);
20899575102SLv Zheng 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
20999575102SLv Zheng }
21099575102SLv Zheng 
21199575102SLv Zheng /*******************************************************************************
21299575102SLv Zheng  *
21399575102SLv Zheng  * FUNCTION:    acpi_db_dump_namespace_paths
21499575102SLv Zheng  *
21599575102SLv Zheng  * PARAMETERS:  None
21699575102SLv Zheng  *
21799575102SLv Zheng  * RETURN:      None
21899575102SLv Zheng  *
21999575102SLv Zheng  * DESCRIPTION: Dump entire namespace with full object pathnames and object
22099575102SLv Zheng  *              type information. Alternative to "namespace" command.
22199575102SLv Zheng  *
22299575102SLv Zheng  ******************************************************************************/
22399575102SLv Zheng 
acpi_db_dump_namespace_paths(void)22499575102SLv Zheng void acpi_db_dump_namespace_paths(void)
22599575102SLv Zheng {
22699575102SLv Zheng 
22799575102SLv Zheng 	acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT);
22899575102SLv Zheng 	acpi_os_printf("ACPI Namespace (from root):\n");
22999575102SLv Zheng 
23099575102SLv Zheng 	/* Display the entire namespace */
23199575102SLv Zheng 
23299575102SLv Zheng 	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
23399575102SLv Zheng 	acpi_ns_dump_object_paths(ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY,
23499575102SLv Zheng 				  ACPI_UINT32_MAX, ACPI_OWNER_ID_MAX,
23599575102SLv Zheng 				  acpi_gbl_root_node);
23699575102SLv Zheng 
23799575102SLv Zheng 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
23899575102SLv Zheng }
23999575102SLv Zheng 
24099575102SLv Zheng /*******************************************************************************
24199575102SLv Zheng  *
24299575102SLv Zheng  * FUNCTION:    acpi_db_dump_namespace_by_owner
24399575102SLv Zheng  *
24499575102SLv Zheng  * PARAMETERS:  owner_arg       - Owner ID whose nodes will be displayed
24599575102SLv Zheng  *              depth_arg       - Maximum tree depth to be dumped
24699575102SLv Zheng  *
24799575102SLv Zheng  * RETURN:      None
24899575102SLv Zheng  *
24999575102SLv Zheng  * DESCRIPTION: Dump elements of the namespace that are owned by the owner_id.
25099575102SLv Zheng  *
25199575102SLv Zheng  ******************************************************************************/
25299575102SLv Zheng 
acpi_db_dump_namespace_by_owner(char * owner_arg,char * depth_arg)25399575102SLv Zheng void acpi_db_dump_namespace_by_owner(char *owner_arg, char *depth_arg)
25499575102SLv Zheng {
25599575102SLv Zheng 	acpi_handle subtree_entry = acpi_gbl_root_node;
25699575102SLv Zheng 	u32 max_depth = ACPI_UINT32_MAX;
25799575102SLv Zheng 	acpi_owner_id owner_id;
25899575102SLv Zheng 
25999575102SLv Zheng 	owner_id = (acpi_owner_id)strtoul(owner_arg, NULL, 0);
26099575102SLv Zheng 
26199575102SLv Zheng 	/* Now we can check for the depth argument */
26299575102SLv Zheng 
26399575102SLv Zheng 	if (depth_arg) {
26499575102SLv Zheng 		max_depth = strtoul(depth_arg, NULL, 0);
26599575102SLv Zheng 	}
26699575102SLv Zheng 
26799575102SLv Zheng 	acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT);
26899575102SLv Zheng 	acpi_os_printf("ACPI Namespace by owner %X:\n", owner_id);
26999575102SLv Zheng 
27099575102SLv Zheng 	/* Display the subtree */
27199575102SLv Zheng 
27299575102SLv Zheng 	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
27399575102SLv Zheng 	acpi_ns_dump_objects(ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, max_depth,
27499575102SLv Zheng 			     owner_id, subtree_entry);
27599575102SLv Zheng 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
27699575102SLv Zheng }
27799575102SLv Zheng 
27899575102SLv Zheng /*******************************************************************************
27999575102SLv Zheng  *
28099575102SLv Zheng  * FUNCTION:    acpi_db_walk_and_match_name
28199575102SLv Zheng  *
28299575102SLv Zheng  * PARAMETERS:  Callback from walk_namespace
28399575102SLv Zheng  *
28499575102SLv Zheng  * RETURN:      Status
28599575102SLv Zheng  *
28699575102SLv Zheng  * DESCRIPTION: Find a particular name/names within the namespace. Wildcards
28799575102SLv Zheng  *              are supported -- '?' matches any character.
28899575102SLv Zheng  *
28999575102SLv Zheng  ******************************************************************************/
29099575102SLv Zheng 
29199575102SLv Zheng static acpi_status
acpi_db_walk_and_match_name(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)29299575102SLv Zheng acpi_db_walk_and_match_name(acpi_handle obj_handle,
29399575102SLv Zheng 			    u32 nesting_level,
29499575102SLv Zheng 			    void *context, void **return_value)
29599575102SLv Zheng {
29699575102SLv Zheng 	acpi_status status;
29799575102SLv Zheng 	char *requested_name = (char *)context;
29899575102SLv Zheng 	u32 i;
29999575102SLv Zheng 	struct acpi_buffer buffer;
30099575102SLv Zheng 	struct acpi_walk_info info;
30199575102SLv Zheng 
30299575102SLv Zheng 	/* Check for a name match */
30399575102SLv Zheng 
30499575102SLv Zheng 	for (i = 0; i < 4; i++) {
30599575102SLv Zheng 
30699575102SLv Zheng 		/* Wildcard support */
30799575102SLv Zheng 
30899575102SLv Zheng 		if ((requested_name[i] != '?') &&
30999575102SLv Zheng 		    (requested_name[i] != ((struct acpi_namespace_node *)
31099575102SLv Zheng 					   obj_handle)->name.ascii[i])) {
31199575102SLv Zheng 
31299575102SLv Zheng 			/* No match, just exit */
31399575102SLv Zheng 
31499575102SLv Zheng 			return (AE_OK);
31599575102SLv Zheng 		}
31699575102SLv Zheng 	}
31799575102SLv Zheng 
31899575102SLv Zheng 	/* Get the full pathname to this object */
31999575102SLv Zheng 
32099575102SLv Zheng 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
32199575102SLv Zheng 	status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE);
32299575102SLv Zheng 	if (ACPI_FAILURE(status)) {
32399575102SLv Zheng 		acpi_os_printf("Could Not get pathname for object %p\n",
32499575102SLv Zheng 			       obj_handle);
32599575102SLv Zheng 	} else {
3261387cdd8SBob Moore 		info.count = 0;
32799575102SLv Zheng 		info.owner_id = ACPI_OWNER_ID_MAX;
32899575102SLv Zheng 		info.debug_level = ACPI_UINT32_MAX;
32999575102SLv Zheng 		info.display_type = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
33099575102SLv Zheng 
33199575102SLv Zheng 		acpi_os_printf("%32s", (char *)buffer.pointer);
33299575102SLv Zheng 		(void)acpi_ns_dump_one_object(obj_handle, nesting_level, &info,
33399575102SLv Zheng 					      NULL);
33499575102SLv Zheng 		ACPI_FREE(buffer.pointer);
33599575102SLv Zheng 	}
33699575102SLv Zheng 
33799575102SLv Zheng 	return (AE_OK);
33899575102SLv Zheng }
33999575102SLv Zheng 
34099575102SLv Zheng /*******************************************************************************
34199575102SLv Zheng  *
34299575102SLv Zheng  * FUNCTION:    acpi_db_find_name_in_namespace
34399575102SLv Zheng  *
34499575102SLv Zheng  * PARAMETERS:  name_arg        - The 4-character ACPI name to find.
34599575102SLv Zheng  *                                wildcards are supported.
34699575102SLv Zheng  *
34799575102SLv Zheng  * RETURN:      None
34899575102SLv Zheng  *
34999575102SLv Zheng  * DESCRIPTION: Search the namespace for a given name (with wildcards)
35099575102SLv Zheng  *
35199575102SLv Zheng  ******************************************************************************/
35299575102SLv Zheng 
acpi_db_find_name_in_namespace(char * name_arg)35399575102SLv Zheng acpi_status acpi_db_find_name_in_namespace(char *name_arg)
35499575102SLv Zheng {
35599575102SLv Zheng 	char acpi_name[5] = "____";
35699575102SLv Zheng 	char *acpi_name_ptr = acpi_name;
35799575102SLv Zheng 
35832786755SBob Moore 	if (strlen(name_arg) > ACPI_NAMESEG_SIZE) {
35999575102SLv Zheng 		acpi_os_printf("Name must be no longer than 4 characters\n");
36099575102SLv Zheng 		return (AE_OK);
36199575102SLv Zheng 	}
36299575102SLv Zheng 
36399575102SLv Zheng 	/* Pad out name with underscores as necessary to create a 4-char name */
36499575102SLv Zheng 
36599575102SLv Zheng 	acpi_ut_strupr(name_arg);
36699575102SLv Zheng 	while (*name_arg) {
36799575102SLv Zheng 		*acpi_name_ptr = *name_arg;
36899575102SLv Zheng 		acpi_name_ptr++;
36999575102SLv Zheng 		name_arg++;
37099575102SLv Zheng 	}
37199575102SLv Zheng 
37299575102SLv Zheng 	/* Walk the namespace from the root */
37399575102SLv Zheng 
37499575102SLv Zheng 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
37599575102SLv Zheng 				  ACPI_UINT32_MAX, acpi_db_walk_and_match_name,
37699575102SLv Zheng 				  NULL, acpi_name, NULL);
37799575102SLv Zheng 
37899575102SLv Zheng 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
37999575102SLv Zheng 	return (AE_OK);
38099575102SLv Zheng }
38199575102SLv Zheng 
38299575102SLv Zheng /*******************************************************************************
38399575102SLv Zheng  *
38499575102SLv Zheng  * FUNCTION:    acpi_db_walk_for_predefined_names
38599575102SLv Zheng  *
38699575102SLv Zheng  * PARAMETERS:  Callback from walk_namespace
38799575102SLv Zheng  *
38899575102SLv Zheng  * RETURN:      Status
38999575102SLv Zheng  *
39099575102SLv Zheng  * DESCRIPTION: Detect and display predefined ACPI names (names that start with
39199575102SLv Zheng  *              an underscore)
39299575102SLv Zheng  *
39399575102SLv Zheng  ******************************************************************************/
39499575102SLv Zheng 
39599575102SLv Zheng static acpi_status
acpi_db_walk_for_predefined_names(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)39699575102SLv Zheng acpi_db_walk_for_predefined_names(acpi_handle obj_handle,
39799575102SLv Zheng 				  u32 nesting_level,
39899575102SLv Zheng 				  void *context, void **return_value)
39999575102SLv Zheng {
40099575102SLv Zheng 	struct acpi_namespace_node *node =
40199575102SLv Zheng 	    (struct acpi_namespace_node *)obj_handle;
40299575102SLv Zheng 	u32 *count = (u32 *)context;
40399575102SLv Zheng 	const union acpi_predefined_info *predefined;
40499575102SLv Zheng 	const union acpi_predefined_info *package = NULL;
40599575102SLv Zheng 	char *pathname;
40699575102SLv Zheng 	char string_buffer[48];
40799575102SLv Zheng 
40899575102SLv Zheng 	predefined = acpi_ut_match_predefined_method(node->name.ascii);
40999575102SLv Zheng 	if (!predefined) {
41099575102SLv Zheng 		return (AE_OK);
41199575102SLv Zheng 	}
41299575102SLv Zheng 
4130e166e4fSLv Zheng 	pathname = acpi_ns_get_normalized_pathname(node, TRUE);
41499575102SLv Zheng 	if (!pathname) {
41599575102SLv Zheng 		return (AE_OK);
41699575102SLv Zheng 	}
41799575102SLv Zheng 
41899575102SLv Zheng 	/* If method returns a package, the info is in the next table entry */
41999575102SLv Zheng 
42099575102SLv Zheng 	if (predefined->info.expected_btypes & ACPI_RTYPE_PACKAGE) {
42199575102SLv Zheng 		package = predefined + 1;
42299575102SLv Zheng 	}
42399575102SLv Zheng 
42499575102SLv Zheng 	acpi_ut_get_expected_return_types(string_buffer,
42599575102SLv Zheng 					  predefined->info.expected_btypes);
42699575102SLv Zheng 
42799575102SLv Zheng 	acpi_os_printf("%-32s Arguments %X, Return Types: %s", pathname,
42899575102SLv Zheng 		       METHOD_GET_ARG_COUNT(predefined->info.argument_list),
42999575102SLv Zheng 		       string_buffer);
43099575102SLv Zheng 
43199575102SLv Zheng 	if (package) {
43299575102SLv Zheng 		acpi_os_printf(" (PkgType %2.2X, ObjType %2.2X, Count %2.2X)",
43399575102SLv Zheng 			       package->ret_info.type,
43499575102SLv Zheng 			       package->ret_info.object_type1,
43599575102SLv Zheng 			       package->ret_info.count1);
43699575102SLv Zheng 	}
43799575102SLv Zheng 
43899575102SLv Zheng 	acpi_os_printf("\n");
43999575102SLv Zheng 
44099575102SLv Zheng 	/* Check that the declared argument count matches the ACPI spec */
44199575102SLv Zheng 
44299575102SLv Zheng 	acpi_ns_check_acpi_compliance(pathname, node, predefined);
44399575102SLv Zheng 
44499575102SLv Zheng 	ACPI_FREE(pathname);
44599575102SLv Zheng 	(*count)++;
44699575102SLv Zheng 	return (AE_OK);
44799575102SLv Zheng }
44899575102SLv Zheng 
44999575102SLv Zheng /*******************************************************************************
45099575102SLv Zheng  *
45199575102SLv Zheng  * FUNCTION:    acpi_db_check_predefined_names
45299575102SLv Zheng  *
45399575102SLv Zheng  * PARAMETERS:  None
45499575102SLv Zheng  *
45599575102SLv Zheng  * RETURN:      None
45699575102SLv Zheng  *
45799575102SLv Zheng  * DESCRIPTION: Validate all predefined names in the namespace
45899575102SLv Zheng  *
45999575102SLv Zheng  ******************************************************************************/
46099575102SLv Zheng 
acpi_db_check_predefined_names(void)46199575102SLv Zheng void acpi_db_check_predefined_names(void)
46299575102SLv Zheng {
46399575102SLv Zheng 	u32 count = 0;
46499575102SLv Zheng 
46599575102SLv Zheng 	/* Search all nodes in namespace */
46699575102SLv Zheng 
46799575102SLv Zheng 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
46899575102SLv Zheng 				  ACPI_UINT32_MAX,
46999575102SLv Zheng 				  acpi_db_walk_for_predefined_names, NULL,
47099575102SLv Zheng 				  (void *)&count, NULL);
47199575102SLv Zheng 
47299575102SLv Zheng 	acpi_os_printf("Found %u predefined names in the namespace\n", count);
47399575102SLv Zheng }
47499575102SLv Zheng 
47599575102SLv Zheng /*******************************************************************************
47699575102SLv Zheng  *
47799575102SLv Zheng  * FUNCTION:    acpi_db_walk_for_object_counts
47899575102SLv Zheng  *
47999575102SLv Zheng  * PARAMETERS:  Callback from walk_namespace
48099575102SLv Zheng  *
48199575102SLv Zheng  * RETURN:      Status
48299575102SLv Zheng  *
48399575102SLv Zheng  * DESCRIPTION: Display short info about objects in the namespace
48499575102SLv Zheng  *
48599575102SLv Zheng  ******************************************************************************/
48699575102SLv Zheng 
48799575102SLv Zheng static acpi_status
acpi_db_walk_for_object_counts(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)48899575102SLv Zheng acpi_db_walk_for_object_counts(acpi_handle obj_handle,
48999575102SLv Zheng 			       u32 nesting_level,
49099575102SLv Zheng 			       void *context, void **return_value)
49199575102SLv Zheng {
49299575102SLv Zheng 	struct acpi_object_info *info = (struct acpi_object_info *)context;
49399575102SLv Zheng 	struct acpi_namespace_node *node =
49499575102SLv Zheng 	    (struct acpi_namespace_node *)obj_handle;
49599575102SLv Zheng 
49699575102SLv Zheng 	if (node->type > ACPI_TYPE_NS_NODE_MAX) {
49799575102SLv Zheng 		acpi_os_printf("[%4.4s]: Unknown object type %X\n",
49899575102SLv Zheng 			       node->name.ascii, node->type);
49999575102SLv Zheng 	} else {
50099575102SLv Zheng 		info->types[node->type]++;
50199575102SLv Zheng 	}
50299575102SLv Zheng 
50399575102SLv Zheng 	return (AE_OK);
50499575102SLv Zheng }
50599575102SLv Zheng 
50699575102SLv Zheng /*******************************************************************************
50799575102SLv Zheng  *
5085fd03328SErik Schmauss  * FUNCTION:    acpi_db_walk_for_fields
5095fd03328SErik Schmauss  *
5105fd03328SErik Schmauss  * PARAMETERS:  Callback from walk_namespace
5115fd03328SErik Schmauss  *
5125fd03328SErik Schmauss  * RETURN:      Status
5135fd03328SErik Schmauss  *
5145fd03328SErik Schmauss  * DESCRIPTION: Display short info about objects in the namespace
5155fd03328SErik Schmauss  *
5165fd03328SErik Schmauss  ******************************************************************************/
5175fd03328SErik Schmauss 
5185fd03328SErik Schmauss static acpi_status
acpi_db_walk_for_fields(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)5195fd03328SErik Schmauss acpi_db_walk_for_fields(acpi_handle obj_handle,
5205fd03328SErik Schmauss 			u32 nesting_level, void *context, void **return_value)
5215fd03328SErik Schmauss {
5225fd03328SErik Schmauss 	union acpi_object *ret_value;
5235fd03328SErik Schmauss 	struct acpi_region_walk_info *info =
5245fd03328SErik Schmauss 	    (struct acpi_region_walk_info *)context;
5255fd03328SErik Schmauss 	struct acpi_buffer buffer;
5265fd03328SErik Schmauss 	acpi_status status;
5275fd03328SErik Schmauss 	struct acpi_namespace_node *node = acpi_ns_validate_handle(obj_handle);
5285fd03328SErik Schmauss 
5295fd03328SErik Schmauss 	if (!node) {
5305fd03328SErik Schmauss 		return (AE_OK);
5315fd03328SErik Schmauss 	}
5325fd03328SErik Schmauss 	if (node->object->field.region_obj->region.space_id !=
5335fd03328SErik Schmauss 	    info->address_space_id) {
5345fd03328SErik Schmauss 		return (AE_OK);
5355fd03328SErik Schmauss 	}
5365fd03328SErik Schmauss 
5375fd03328SErik Schmauss 	info->count++;
5385fd03328SErik Schmauss 
5395fd03328SErik Schmauss 	/* Get and display the full pathname to this object */
5405fd03328SErik Schmauss 
5415fd03328SErik Schmauss 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
5425fd03328SErik Schmauss 	status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE);
5435fd03328SErik Schmauss 	if (ACPI_FAILURE(status)) {
5445fd03328SErik Schmauss 		acpi_os_printf("Could Not get pathname for object %p\n",
5455fd03328SErik Schmauss 			       obj_handle);
5465fd03328SErik Schmauss 		return (AE_OK);
5475fd03328SErik Schmauss 	}
5485fd03328SErik Schmauss 
5495fd03328SErik Schmauss 	acpi_os_printf("%s ", (char *)buffer.pointer);
5505fd03328SErik Schmauss 	ACPI_FREE(buffer.pointer);
5515fd03328SErik Schmauss 
5525fd03328SErik Schmauss 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
553*77ffc72bSNikita Kiryushin 	status = acpi_evaluate_object(obj_handle, NULL, NULL, &buffer);
554*77ffc72bSNikita Kiryushin 	if (ACPI_FAILURE(status)) {
555*77ffc72bSNikita Kiryushin 		acpi_os_printf("Could Not evaluate object %p\n",
556*77ffc72bSNikita Kiryushin 			       obj_handle);
557*77ffc72bSNikita Kiryushin 		return (AE_OK);
558*77ffc72bSNikita Kiryushin 	}
55920d93fceSErik Schmauss 	/*
56020d93fceSErik Schmauss 	 * Since this is a field unit, surround the output in braces
56120d93fceSErik Schmauss 	 */
56220d93fceSErik Schmauss 	acpi_os_printf("{");
56320d93fceSErik Schmauss 
5645fd03328SErik Schmauss 	ret_value = (union acpi_object *)buffer.pointer;
5655fd03328SErik Schmauss 	switch (ret_value->type) {
5665fd03328SErik Schmauss 	case ACPI_TYPE_INTEGER:
5675fd03328SErik Schmauss 
5685fd03328SErik Schmauss 		acpi_os_printf("%8.8X%8.8X",
5695fd03328SErik Schmauss 			       ACPI_FORMAT_UINT64(ret_value->integer.value));
5705fd03328SErik Schmauss 		break;
5715fd03328SErik Schmauss 
5725fd03328SErik Schmauss 	case ACPI_TYPE_BUFFER:
5735fd03328SErik Schmauss 
5745fd03328SErik Schmauss 		acpi_ut_dump_buffer(ret_value->buffer.pointer,
5755fd03328SErik Schmauss 				    ret_value->buffer.length,
5765fd03328SErik Schmauss 				    DB_DISPLAY_DATA_ONLY | DB_BYTE_DISPLAY, 0);
5775fd03328SErik Schmauss 		break;
5785fd03328SErik Schmauss 
5795fd03328SErik Schmauss 	default:
5805fd03328SErik Schmauss 
5815fd03328SErik Schmauss 		break;
5825fd03328SErik Schmauss 	}
58320d93fceSErik Schmauss 	acpi_os_printf("}\n");
5845fd03328SErik Schmauss 
5855fd03328SErik Schmauss 	ACPI_FREE(buffer.pointer);
5865fd03328SErik Schmauss 
5875fd03328SErik Schmauss 	return (AE_OK);
5885fd03328SErik Schmauss }
5895fd03328SErik Schmauss 
5905fd03328SErik Schmauss /*******************************************************************************
5915fd03328SErik Schmauss  *
59299575102SLv Zheng  * FUNCTION:    acpi_db_walk_for_specific_objects
59399575102SLv Zheng  *
59499575102SLv Zheng  * PARAMETERS:  Callback from walk_namespace
59599575102SLv Zheng  *
59699575102SLv Zheng  * RETURN:      Status
59799575102SLv Zheng  *
59899575102SLv Zheng  * DESCRIPTION: Display short info about objects in the namespace
59999575102SLv Zheng  *
60099575102SLv Zheng  ******************************************************************************/
60199575102SLv Zheng 
60299575102SLv Zheng static acpi_status
acpi_db_walk_for_specific_objects(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)60399575102SLv Zheng acpi_db_walk_for_specific_objects(acpi_handle obj_handle,
60499575102SLv Zheng 				  u32 nesting_level,
60599575102SLv Zheng 				  void *context, void **return_value)
60699575102SLv Zheng {
60799575102SLv Zheng 	struct acpi_walk_info *info = (struct acpi_walk_info *)context;
60899575102SLv Zheng 	struct acpi_buffer buffer;
60999575102SLv Zheng 	acpi_status status;
61099575102SLv Zheng 
61199575102SLv Zheng 	info->count++;
61299575102SLv Zheng 
61399575102SLv Zheng 	/* Get and display the full pathname to this object */
61499575102SLv Zheng 
61599575102SLv Zheng 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
61699575102SLv Zheng 	status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE);
61799575102SLv Zheng 	if (ACPI_FAILURE(status)) {
61899575102SLv Zheng 		acpi_os_printf("Could Not get pathname for object %p\n",
61999575102SLv Zheng 			       obj_handle);
62099575102SLv Zheng 		return (AE_OK);
62199575102SLv Zheng 	}
62299575102SLv Zheng 
62399575102SLv Zheng 	acpi_os_printf("%32s", (char *)buffer.pointer);
62499575102SLv Zheng 	ACPI_FREE(buffer.pointer);
62599575102SLv Zheng 
62699575102SLv Zheng 	/* Dump short info about the object */
62799575102SLv Zheng 
62899575102SLv Zheng 	(void)acpi_ns_dump_one_object(obj_handle, nesting_level, info, NULL);
62999575102SLv Zheng 	return (AE_OK);
63099575102SLv Zheng }
63199575102SLv Zheng 
63299575102SLv Zheng /*******************************************************************************
63399575102SLv Zheng  *
63499575102SLv Zheng  * FUNCTION:    acpi_db_display_objects
63599575102SLv Zheng  *
63699575102SLv Zheng  * PARAMETERS:  obj_type_arg        - Type of object to display
63799575102SLv Zheng  *              display_count_arg   - Max depth to display
63899575102SLv Zheng  *
63999575102SLv Zheng  * RETURN:      None
64099575102SLv Zheng  *
64199575102SLv Zheng  * DESCRIPTION: Display objects in the namespace of the requested type
64299575102SLv Zheng  *
64399575102SLv Zheng  ******************************************************************************/
64499575102SLv Zheng 
acpi_db_display_objects(char * obj_type_arg,char * display_count_arg)64599575102SLv Zheng acpi_status acpi_db_display_objects(char *obj_type_arg, char *display_count_arg)
64699575102SLv Zheng {
64799575102SLv Zheng 	struct acpi_walk_info info;
64899575102SLv Zheng 	acpi_object_type type;
64999575102SLv Zheng 	struct acpi_object_info *object_info;
65099575102SLv Zheng 	u32 i;
65199575102SLv Zheng 	u32 total_objects = 0;
65299575102SLv Zheng 
65399575102SLv Zheng 	/* No argument means display summary/count of all object types */
65499575102SLv Zheng 
65599575102SLv Zheng 	if (!obj_type_arg) {
65699575102SLv Zheng 		object_info =
65799575102SLv Zheng 		    ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_object_info));
65899575102SLv Zheng 
659ae5a0eccSvoid0red 		if (!object_info)
660ae5a0eccSvoid0red 			return (AE_NO_MEMORY);
661ae5a0eccSvoid0red 
66299575102SLv Zheng 		/* Walk the namespace from the root */
66399575102SLv Zheng 
66499575102SLv Zheng 		(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
66599575102SLv Zheng 					  ACPI_UINT32_MAX,
66699575102SLv Zheng 					  acpi_db_walk_for_object_counts, NULL,
66799575102SLv Zheng 					  (void *)object_info, NULL);
66899575102SLv Zheng 
66999575102SLv Zheng 		acpi_os_printf("\nSummary of namespace objects:\n\n");
67099575102SLv Zheng 
67199575102SLv Zheng 		for (i = 0; i < ACPI_TOTAL_TYPES; i++) {
67299575102SLv Zheng 			acpi_os_printf("%8u %s\n", object_info->types[i],
67399575102SLv Zheng 				       acpi_ut_get_type_name(i));
67499575102SLv Zheng 
67599575102SLv Zheng 			total_objects += object_info->types[i];
67699575102SLv Zheng 		}
67799575102SLv Zheng 
67899575102SLv Zheng 		acpi_os_printf("\n%8u Total namespace objects\n\n",
67999575102SLv Zheng 			       total_objects);
68099575102SLv Zheng 
68199575102SLv Zheng 		ACPI_FREE(object_info);
68299575102SLv Zheng 		return (AE_OK);
68399575102SLv Zheng 	}
68499575102SLv Zheng 
68599575102SLv Zheng 	/* Get the object type */
68699575102SLv Zheng 
68799575102SLv Zheng 	type = acpi_db_match_argument(obj_type_arg, acpi_db_object_types);
68899575102SLv Zheng 	if (type == ACPI_TYPE_NOT_FOUND) {
68999575102SLv Zheng 		acpi_os_printf("Invalid or unsupported argument\n");
69099575102SLv Zheng 		return (AE_OK);
69199575102SLv Zheng 	}
69299575102SLv Zheng 
69399575102SLv Zheng 	acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT);
69499575102SLv Zheng 	acpi_os_printf
69599575102SLv Zheng 	    ("Objects of type [%s] defined in the current ACPI Namespace:\n",
69699575102SLv Zheng 	     acpi_ut_get_type_name(type));
69799575102SLv Zheng 
69899575102SLv Zheng 	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
69999575102SLv Zheng 
70099575102SLv Zheng 	info.count = 0;
70199575102SLv Zheng 	info.owner_id = ACPI_OWNER_ID_MAX;
70299575102SLv Zheng 	info.debug_level = ACPI_UINT32_MAX;
70399575102SLv Zheng 	info.display_type = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
70499575102SLv Zheng 
70599575102SLv Zheng 	/* Walk the namespace from the root */
70699575102SLv Zheng 
70799575102SLv Zheng 	(void)acpi_walk_namespace(type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
70899575102SLv Zheng 				  acpi_db_walk_for_specific_objects, NULL,
70999575102SLv Zheng 				  (void *)&info, NULL);
71099575102SLv Zheng 
71199575102SLv Zheng 	acpi_os_printf
71299575102SLv Zheng 	    ("\nFound %u objects of type [%s] in the current ACPI Namespace\n",
71399575102SLv Zheng 	     info.count, acpi_ut_get_type_name(type));
71499575102SLv Zheng 
71599575102SLv Zheng 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
71699575102SLv Zheng 	return (AE_OK);
71799575102SLv Zheng }
71899575102SLv Zheng 
71999575102SLv Zheng /*******************************************************************************
72099575102SLv Zheng  *
7215fd03328SErik Schmauss  * FUNCTION:    acpi_db_display_fields
7225fd03328SErik Schmauss  *
7235fd03328SErik Schmauss  * PARAMETERS:  obj_type_arg        - Type of object to display
7245fd03328SErik Schmauss  *              display_count_arg   - Max depth to display
7255fd03328SErik Schmauss  *
7265fd03328SErik Schmauss  * RETURN:      None
7275fd03328SErik Schmauss  *
7285fd03328SErik Schmauss  * DESCRIPTION: Display objects in the namespace of the requested type
7295fd03328SErik Schmauss  *
7305fd03328SErik Schmauss  ******************************************************************************/
7315fd03328SErik Schmauss 
acpi_db_display_fields(u32 address_space_id)7325fd03328SErik Schmauss acpi_status acpi_db_display_fields(u32 address_space_id)
7335fd03328SErik Schmauss {
7345fd03328SErik Schmauss 	struct acpi_region_walk_info info;
7355fd03328SErik Schmauss 
7365fd03328SErik Schmauss 	info.count = 0;
7375fd03328SErik Schmauss 	info.owner_id = ACPI_OWNER_ID_MAX;
7385fd03328SErik Schmauss 	info.debug_level = ACPI_UINT32_MAX;
7395fd03328SErik Schmauss 	info.display_type = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
7405fd03328SErik Schmauss 	info.address_space_id = address_space_id;
7415fd03328SErik Schmauss 
7425fd03328SErik Schmauss 	/* Walk the namespace from the root */
7435fd03328SErik Schmauss 
7445fd03328SErik Schmauss 	(void)acpi_walk_namespace(ACPI_TYPE_LOCAL_REGION_FIELD,
7455fd03328SErik Schmauss 				  ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
7465fd03328SErik Schmauss 				  acpi_db_walk_for_fields, NULL, (void *)&info,
7475fd03328SErik Schmauss 				  NULL);
7485fd03328SErik Schmauss 
7495fd03328SErik Schmauss 	return (AE_OK);
7505fd03328SErik Schmauss }
7515fd03328SErik Schmauss 
7525fd03328SErik Schmauss /*******************************************************************************
7535fd03328SErik Schmauss  *
75499575102SLv Zheng  * FUNCTION:    acpi_db_integrity_walk
75599575102SLv Zheng  *
75699575102SLv Zheng  * PARAMETERS:  Callback from walk_namespace
75799575102SLv Zheng  *
75899575102SLv Zheng  * RETURN:      Status
75999575102SLv Zheng  *
76099575102SLv Zheng  * DESCRIPTION: Examine one NS node for valid values.
76199575102SLv Zheng  *
76299575102SLv Zheng  ******************************************************************************/
76399575102SLv Zheng 
76499575102SLv Zheng static acpi_status
acpi_db_integrity_walk(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)76599575102SLv Zheng acpi_db_integrity_walk(acpi_handle obj_handle,
76699575102SLv Zheng 		       u32 nesting_level, void *context, void **return_value)
76799575102SLv Zheng {
76899575102SLv Zheng 	struct acpi_integrity_info *info =
76999575102SLv Zheng 	    (struct acpi_integrity_info *)context;
77099575102SLv Zheng 	struct acpi_namespace_node *node =
77199575102SLv Zheng 	    (struct acpi_namespace_node *)obj_handle;
77299575102SLv Zheng 	union acpi_operand_object *object;
77399575102SLv Zheng 	u8 alias = TRUE;
77499575102SLv Zheng 
77599575102SLv Zheng 	info->nodes++;
77699575102SLv Zheng 
77799575102SLv Zheng 	/* Verify the NS node, and dereference aliases */
77899575102SLv Zheng 
77999575102SLv Zheng 	while (alias) {
78099575102SLv Zheng 		if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) {
78199575102SLv Zheng 			acpi_os_printf
78299575102SLv Zheng 			    ("Invalid Descriptor Type for Node %p [%s] - "
78399575102SLv Zheng 			     "is %2.2X should be %2.2X\n", node,
78499575102SLv Zheng 			     acpi_ut_get_descriptor_name(node),
78599575102SLv Zheng 			     ACPI_GET_DESCRIPTOR_TYPE(node),
78699575102SLv Zheng 			     ACPI_DESC_TYPE_NAMED);
78799575102SLv Zheng 			return (AE_OK);
78899575102SLv Zheng 		}
78999575102SLv Zheng 
79099575102SLv Zheng 		if ((node->type == ACPI_TYPE_LOCAL_ALIAS) ||
79199575102SLv Zheng 		    (node->type == ACPI_TYPE_LOCAL_METHOD_ALIAS)) {
79299575102SLv Zheng 			node = (struct acpi_namespace_node *)node->object;
79399575102SLv Zheng 		} else {
79499575102SLv Zheng 			alias = FALSE;
79599575102SLv Zheng 		}
79699575102SLv Zheng 	}
79799575102SLv Zheng 
79899575102SLv Zheng 	if (node->type > ACPI_TYPE_LOCAL_MAX) {
79999575102SLv Zheng 		acpi_os_printf("Invalid Object Type for Node %p, Type = %X\n",
80099575102SLv Zheng 			       node, node->type);
80199575102SLv Zheng 		return (AE_OK);
80299575102SLv Zheng 	}
80399575102SLv Zheng 
8046a0df32cSBob Moore 	if (!acpi_ut_valid_nameseg(node->name.ascii)) {
80599575102SLv Zheng 		acpi_os_printf("Invalid AcpiName for Node %p\n", node);
80699575102SLv Zheng 		return (AE_OK);
80799575102SLv Zheng 	}
80899575102SLv Zheng 
80999575102SLv Zheng 	object = acpi_ns_get_attached_object(node);
81099575102SLv Zheng 	if (object) {
81199575102SLv Zheng 		info->objects++;
81299575102SLv Zheng 		if (ACPI_GET_DESCRIPTOR_TYPE(object) != ACPI_DESC_TYPE_OPERAND) {
81399575102SLv Zheng 			acpi_os_printf
81499575102SLv Zheng 			    ("Invalid Descriptor Type for Object %p [%s]\n",
81599575102SLv Zheng 			     object, acpi_ut_get_descriptor_name(object));
81699575102SLv Zheng 		}
81799575102SLv Zheng 	}
81899575102SLv Zheng 
81999575102SLv Zheng 	return (AE_OK);
82099575102SLv Zheng }
82199575102SLv Zheng 
82299575102SLv Zheng /*******************************************************************************
82399575102SLv Zheng  *
82499575102SLv Zheng  * FUNCTION:    acpi_db_check_integrity
82599575102SLv Zheng  *
82699575102SLv Zheng  * PARAMETERS:  None
82799575102SLv Zheng  *
82899575102SLv Zheng  * RETURN:      None
82999575102SLv Zheng  *
83099575102SLv Zheng  * DESCRIPTION: Check entire namespace for data structure integrity
83199575102SLv Zheng  *
83299575102SLv Zheng  ******************************************************************************/
83399575102SLv Zheng 
acpi_db_check_integrity(void)83499575102SLv Zheng void acpi_db_check_integrity(void)
83599575102SLv Zheng {
83699575102SLv Zheng 	struct acpi_integrity_info info = { 0, 0 };
83799575102SLv Zheng 
83899575102SLv Zheng 	/* Search all nodes in namespace */
83999575102SLv Zheng 
84099575102SLv Zheng 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
84199575102SLv Zheng 				  ACPI_UINT32_MAX, acpi_db_integrity_walk, NULL,
84299575102SLv Zheng 				  (void *)&info, NULL);
84399575102SLv Zheng 
84499575102SLv Zheng 	acpi_os_printf("Verified %u namespace nodes with %u Objects\n",
84599575102SLv Zheng 		       info.nodes, info.objects);
84699575102SLv Zheng }
84799575102SLv Zheng 
84899575102SLv Zheng /*******************************************************************************
84999575102SLv Zheng  *
85099575102SLv Zheng  * FUNCTION:    acpi_db_walk_for_references
85199575102SLv Zheng  *
85299575102SLv Zheng  * PARAMETERS:  Callback from walk_namespace
85399575102SLv Zheng  *
85499575102SLv Zheng  * RETURN:      Status
85599575102SLv Zheng  *
85699575102SLv Zheng  * DESCRIPTION: Check if this namespace object refers to the target object
85799575102SLv Zheng  *              that is passed in as the context value.
85899575102SLv Zheng  *
85999575102SLv Zheng  * Note: Currently doesn't check subobjects within the Node's object
86099575102SLv Zheng  *
86199575102SLv Zheng  ******************************************************************************/
86299575102SLv Zheng 
86399575102SLv Zheng static acpi_status
acpi_db_walk_for_references(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)86499575102SLv Zheng acpi_db_walk_for_references(acpi_handle obj_handle,
86599575102SLv Zheng 			    u32 nesting_level,
86699575102SLv Zheng 			    void *context, void **return_value)
86799575102SLv Zheng {
86899575102SLv Zheng 	union acpi_operand_object *obj_desc =
86999575102SLv Zheng 	    (union acpi_operand_object *)context;
87099575102SLv Zheng 	struct acpi_namespace_node *node =
87199575102SLv Zheng 	    (struct acpi_namespace_node *)obj_handle;
87299575102SLv Zheng 
87399575102SLv Zheng 	/* Check for match against the namespace node itself */
87499575102SLv Zheng 
87599575102SLv Zheng 	if (node == (void *)obj_desc) {
87699575102SLv Zheng 		acpi_os_printf("Object is a Node [%4.4s]\n",
87799575102SLv Zheng 			       acpi_ut_get_node_name(node));
87899575102SLv Zheng 	}
87999575102SLv Zheng 
88099575102SLv Zheng 	/* Check for match against the object attached to the node */
88199575102SLv Zheng 
88299575102SLv Zheng 	if (acpi_ns_get_attached_object(node) == obj_desc) {
88399575102SLv Zheng 		acpi_os_printf("Reference at Node->Object %p [%4.4s]\n",
88499575102SLv Zheng 			       node, acpi_ut_get_node_name(node));
88599575102SLv Zheng 	}
88699575102SLv Zheng 
88799575102SLv Zheng 	return (AE_OK);
88899575102SLv Zheng }
88999575102SLv Zheng 
89099575102SLv Zheng /*******************************************************************************
89199575102SLv Zheng  *
89299575102SLv Zheng  * FUNCTION:    acpi_db_find_references
89399575102SLv Zheng  *
89499575102SLv Zheng  * PARAMETERS:  object_arg      - String with hex value of the object
89599575102SLv Zheng  *
89699575102SLv Zheng  * RETURN:      None
89799575102SLv Zheng  *
89899575102SLv Zheng  * DESCRIPTION: Search namespace for all references to the input object
89999575102SLv Zheng  *
90099575102SLv Zheng  ******************************************************************************/
90199575102SLv Zheng 
acpi_db_find_references(char * object_arg)90299575102SLv Zheng void acpi_db_find_references(char *object_arg)
90399575102SLv Zheng {
90499575102SLv Zheng 	union acpi_operand_object *obj_desc;
90599575102SLv Zheng 	acpi_size address;
90699575102SLv Zheng 
90799575102SLv Zheng 	/* Convert string to object pointer */
90899575102SLv Zheng 
90999575102SLv Zheng 	address = strtoul(object_arg, NULL, 16);
91099575102SLv Zheng 	obj_desc = ACPI_TO_POINTER(address);
91199575102SLv Zheng 
91299575102SLv Zheng 	/* Search all nodes in namespace */
91399575102SLv Zheng 
91499575102SLv Zheng 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
91599575102SLv Zheng 				  ACPI_UINT32_MAX, acpi_db_walk_for_references,
91699575102SLv Zheng 				  NULL, (void *)obj_desc, NULL);
91799575102SLv Zheng }
91899575102SLv Zheng 
91999575102SLv Zheng /*******************************************************************************
92099575102SLv Zheng  *
92199575102SLv Zheng  * FUNCTION:    acpi_db_bus_walk
92299575102SLv Zheng  *
92399575102SLv Zheng  * PARAMETERS:  Callback from walk_namespace
92499575102SLv Zheng  *
92599575102SLv Zheng  * RETURN:      Status
92699575102SLv Zheng  *
92799575102SLv Zheng  * DESCRIPTION: Display info about device objects that have a corresponding
92899575102SLv Zheng  *              _PRT method.
92999575102SLv Zheng  *
93099575102SLv Zheng  ******************************************************************************/
93199575102SLv Zheng 
93299575102SLv Zheng static acpi_status
acpi_db_bus_walk(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)93399575102SLv Zheng acpi_db_bus_walk(acpi_handle obj_handle,
93499575102SLv Zheng 		 u32 nesting_level, void *context, void **return_value)
93599575102SLv Zheng {
93699575102SLv Zheng 	struct acpi_namespace_node *node =
93799575102SLv Zheng 	    (struct acpi_namespace_node *)obj_handle;
93899575102SLv Zheng 	acpi_status status;
93999575102SLv Zheng 	struct acpi_buffer buffer;
94099575102SLv Zheng 	struct acpi_namespace_node *temp_node;
94199575102SLv Zheng 	struct acpi_device_info *info;
94299575102SLv Zheng 	u32 i;
94399575102SLv Zheng 
94499575102SLv Zheng 	if ((node->type != ACPI_TYPE_DEVICE) &&
94599575102SLv Zheng 	    (node->type != ACPI_TYPE_PROCESSOR)) {
94699575102SLv Zheng 		return (AE_OK);
94799575102SLv Zheng 	}
94899575102SLv Zheng 
94999575102SLv Zheng 	/* Exit if there is no _PRT under this device */
95099575102SLv Zheng 
95199575102SLv Zheng 	status = acpi_get_handle(node, METHOD_NAME__PRT,
95299575102SLv Zheng 				 ACPI_CAST_PTR(acpi_handle, &temp_node));
95399575102SLv Zheng 	if (ACPI_FAILURE(status)) {
95499575102SLv Zheng 		return (AE_OK);
95599575102SLv Zheng 	}
95699575102SLv Zheng 
95799575102SLv Zheng 	/* Get the full path to this device object */
95899575102SLv Zheng 
95999575102SLv Zheng 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
96099575102SLv Zheng 	status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE);
96199575102SLv Zheng 	if (ACPI_FAILURE(status)) {
96299575102SLv Zheng 		acpi_os_printf("Could Not get pathname for object %p\n",
96399575102SLv Zheng 			       obj_handle);
96499575102SLv Zheng 		return (AE_OK);
96599575102SLv Zheng 	}
96699575102SLv Zheng 
96799575102SLv Zheng 	status = acpi_get_object_info(obj_handle, &info);
96899575102SLv Zheng 	if (ACPI_FAILURE(status)) {
96999575102SLv Zheng 		return (AE_OK);
97099575102SLv Zheng 	}
97199575102SLv Zheng 
97299575102SLv Zheng 	/* Display the full path */
97399575102SLv Zheng 
97499575102SLv Zheng 	acpi_os_printf("%-32s Type %X", (char *)buffer.pointer, node->type);
97599575102SLv Zheng 	ACPI_FREE(buffer.pointer);
97699575102SLv Zheng 
97799575102SLv Zheng 	if (info->flags & ACPI_PCI_ROOT_BRIDGE) {
97899575102SLv Zheng 		acpi_os_printf(" - Is PCI Root Bridge");
97999575102SLv Zheng 	}
98099575102SLv Zheng 	acpi_os_printf("\n");
98199575102SLv Zheng 
98299575102SLv Zheng 	/* _PRT info */
98399575102SLv Zheng 
98499575102SLv Zheng 	acpi_os_printf("_PRT: %p\n", temp_node);
98599575102SLv Zheng 
98699575102SLv Zheng 	/* Dump _ADR, _HID, _UID, _CID */
98799575102SLv Zheng 
98899575102SLv Zheng 	if (info->valid & ACPI_VALID_ADR) {
98999575102SLv Zheng 		acpi_os_printf("_ADR: %8.8X%8.8X\n",
99099575102SLv Zheng 			       ACPI_FORMAT_UINT64(info->address));
99199575102SLv Zheng 	} else {
99299575102SLv Zheng 		acpi_os_printf("_ADR: <Not Present>\n");
99399575102SLv Zheng 	}
99499575102SLv Zheng 
99599575102SLv Zheng 	if (info->valid & ACPI_VALID_HID) {
99699575102SLv Zheng 		acpi_os_printf("_HID: %s\n", info->hardware_id.string);
99799575102SLv Zheng 	} else {
99899575102SLv Zheng 		acpi_os_printf("_HID: <Not Present>\n");
99999575102SLv Zheng 	}
100099575102SLv Zheng 
100199575102SLv Zheng 	if (info->valid & ACPI_VALID_UID) {
100299575102SLv Zheng 		acpi_os_printf("_UID: %s\n", info->unique_id.string);
100399575102SLv Zheng 	} else {
100499575102SLv Zheng 		acpi_os_printf("_UID: <Not Present>\n");
100599575102SLv Zheng 	}
100699575102SLv Zheng 
100799575102SLv Zheng 	if (info->valid & ACPI_VALID_CID) {
100899575102SLv Zheng 		for (i = 0; i < info->compatible_id_list.count; i++) {
100999575102SLv Zheng 			acpi_os_printf("_CID: %s\n",
101099575102SLv Zheng 				       info->compatible_id_list.ids[i].string);
101199575102SLv Zheng 		}
101299575102SLv Zheng 	} else {
101399575102SLv Zheng 		acpi_os_printf("_CID: <Not Present>\n");
101499575102SLv Zheng 	}
101599575102SLv Zheng 
101699575102SLv Zheng 	ACPI_FREE(info);
101799575102SLv Zheng 	return (AE_OK);
101899575102SLv Zheng }
101999575102SLv Zheng 
102099575102SLv Zheng /*******************************************************************************
102199575102SLv Zheng  *
102299575102SLv Zheng  * FUNCTION:    acpi_db_get_bus_info
102399575102SLv Zheng  *
102499575102SLv Zheng  * PARAMETERS:  None
102599575102SLv Zheng  *
102699575102SLv Zheng  * RETURN:      None
102799575102SLv Zheng  *
1028c163f90cSErik Schmauss  * DESCRIPTION: Display info about system buses.
102999575102SLv Zheng  *
103099575102SLv Zheng  ******************************************************************************/
103199575102SLv Zheng 
acpi_db_get_bus_info(void)103299575102SLv Zheng void acpi_db_get_bus_info(void)
103399575102SLv Zheng {
103499575102SLv Zheng 	/* Search all nodes in namespace */
103599575102SLv Zheng 
103699575102SLv Zheng 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
103799575102SLv Zheng 				  ACPI_UINT32_MAX, acpi_db_bus_walk, NULL, NULL,
103899575102SLv Zheng 				  NULL);
103999575102SLv Zheng }
1040