Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  * Module Name: dbnames - Debugger commands for the acpi namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8) #include <acpi/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9) #include "accommon.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10) #include "acnamesp.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) #include "acdebug.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) #include "acpredef.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) #include "acinterp.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) #define _COMPONENT          ACPI_CA_DEBUGGER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) ACPI_MODULE_NAME("dbnames")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) /* Local prototypes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) acpi_db_walk_and_match_name(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) 			    u32 nesting_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) 			    void *context, void **return_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) acpi_db_walk_for_predefined_names(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) 				  u32 nesting_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) 				  void *context, void **return_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) acpi_db_walk_for_specific_objects(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) 				  u32 nesting_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) 				  void *context, void **return_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) acpi_db_walk_for_object_counts(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) 			       u32 nesting_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) 			       void *context, void **return_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) acpi_db_integrity_walk(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) 		       u32 nesting_level, void *context, void **return_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) acpi_db_walk_for_references(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) 			    u32 nesting_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) 			    void *context, void **return_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) acpi_db_bus_walk(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) 		 u32 nesting_level, void *context, void **return_value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53)  * Arguments for the Objects command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54)  * These object types map directly to the ACPI_TYPES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) static struct acpi_db_argument_info acpi_db_object_types[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 	{"ANY"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) 	{"INTEGERS"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 	{"STRINGS"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 	{"BUFFERS"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) 	{"PACKAGES"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) 	{"FIELDS"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 	{"DEVICES"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) 	{"EVENTS"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) 	{"METHODS"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) 	{"MUTEXES"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 	{"REGIONS"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) 	{"POWERRESOURCES"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 	{"PROCESSORS"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) 	{"THERMALZONES"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) 	{"BUFFERFIELDS"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) 	{"DDBHANDLES"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) 	{"DEBUG"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 	{"REGIONFIELDS"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) 	{"BANKFIELDS"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) 	{"INDEXFIELDS"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) 	{"REFERENCES"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 	{"ALIASES"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) 	{"METHODALIASES"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 	{"NOTIFY"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 	{"ADDRESSHANDLER"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) 	{"RESOURCE"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) 	{"RESOURCEFIELD"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) 	{"SCOPES"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 	{NULL}			/* Must be null terminated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90)  * FUNCTION:    acpi_db_set_scope
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92)  * PARAMETERS:  name                - New scope path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96)  * DESCRIPTION: Set the "current scope" as maintained by this utility.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97)  *              The scope is used as a prefix to ACPI paths.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) void acpi_db_set_scope(char *name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 	struct acpi_namespace_node *node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) 	if (!name || name[0] == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 		acpi_os_printf("Current scope: %s\n", acpi_gbl_db_scope_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) 	acpi_db_prep_namestring(name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) 	if (ACPI_IS_ROOT_PREFIX(name[0])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) 		/* Validate new scope from the root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 		status = acpi_ns_get_node(acpi_gbl_root_node, name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 					  ACPI_NS_NO_UPSEARCH, &node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) 		if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) 			goto error_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) 		acpi_gbl_db_scope_buf[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) 		/* Validate new scope relative to old scope */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) 		status = acpi_ns_get_node(acpi_gbl_db_scope_node, name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 					  ACPI_NS_NO_UPSEARCH, &node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 		if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 			goto error_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) 	/* Build the final pathname */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) 	if (acpi_ut_safe_strcat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) 	    (acpi_gbl_db_scope_buf, sizeof(acpi_gbl_db_scope_buf), name)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 		status = AE_BUFFER_OVERFLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 		goto error_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) 	if (acpi_ut_safe_strcat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) 	    (acpi_gbl_db_scope_buf, sizeof(acpi_gbl_db_scope_buf), "\\")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 		status = AE_BUFFER_OVERFLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) 		goto error_exit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 	acpi_gbl_db_scope_node = node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 	acpi_os_printf("New scope: %s\n", acpi_gbl_db_scope_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) 	return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) error_exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 	acpi_os_printf("Could not attach scope: %s, %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 		       name, acpi_format_exception(status));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160)  * FUNCTION:    acpi_db_dump_namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162)  * PARAMETERS:  start_arg       - Node to begin namespace dump
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163)  *              depth_arg       - Maximum tree depth to be dumped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165)  * RETURN:      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167)  * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168)  *              with type and other information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) void acpi_db_dump_namespace(char *start_arg, char *depth_arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 	acpi_handle subtree_entry = acpi_gbl_root_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) 	u32 max_depth = ACPI_UINT32_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) 	/* No argument given, just start at the root and dump entire namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 	if (start_arg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 		subtree_entry = acpi_db_convert_to_node(start_arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 		if (!subtree_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 		/* Now we can check for the depth argument */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 		if (depth_arg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 			max_depth = strtoul(depth_arg, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 	acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 	if (((struct acpi_namespace_node *)subtree_entry)->parent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 		acpi_os_printf("ACPI Namespace (from %4.4s (%p) subtree):\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 			       ((struct acpi_namespace_node *)subtree_entry)->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) 			       name.ascii, subtree_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 		acpi_os_printf("ACPI Namespace (from %s):\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 			       ACPI_NAMESPACE_ROOT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 	/* Display the subtree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 	acpi_ns_dump_objects(ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, max_depth,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 			     ACPI_OWNER_ID_MAX, subtree_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213)  * FUNCTION:    acpi_db_dump_namespace_paths
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215)  * PARAMETERS:  None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217)  * RETURN:      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219)  * DESCRIPTION: Dump entire namespace with full object pathnames and object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220)  *              type information. Alternative to "namespace" command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) void acpi_db_dump_namespace_paths(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 	acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 	acpi_os_printf("ACPI Namespace (from root):\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 	/* Display the entire namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 	acpi_ns_dump_object_paths(ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 				  ACPI_UINT32_MAX, ACPI_OWNER_ID_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 				  acpi_gbl_root_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242)  * FUNCTION:    acpi_db_dump_namespace_by_owner
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244)  * PARAMETERS:  owner_arg       - Owner ID whose nodes will be displayed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245)  *              depth_arg       - Maximum tree depth to be dumped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247)  * RETURN:      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249)  * DESCRIPTION: Dump elements of the namespace that are owned by the owner_id.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) void acpi_db_dump_namespace_by_owner(char *owner_arg, char *depth_arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	acpi_handle subtree_entry = acpi_gbl_root_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 	u32 max_depth = ACPI_UINT32_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 	acpi_owner_id owner_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 	owner_id = (acpi_owner_id)strtoul(owner_arg, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 	/* Now we can check for the depth argument */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 	if (depth_arg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 		max_depth = strtoul(depth_arg, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 	acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 	acpi_os_printf("ACPI Namespace by owner %X:\n", owner_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 	/* Display the subtree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 	acpi_ns_dump_objects(ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, max_depth,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 			     owner_id, subtree_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280)  * FUNCTION:    acpi_db_walk_and_match_name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282)  * PARAMETERS:  Callback from walk_namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286)  * DESCRIPTION: Find a particular name/names within the namespace. Wildcards
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287)  *              are supported -- '?' matches any character.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) acpi_db_walk_and_match_name(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 			    u32 nesting_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 			    void *context, void **return_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 	char *requested_name = (char *)context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 	u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 	struct acpi_buffer buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 	struct acpi_walk_info info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 	/* Check for a name match */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 	for (i = 0; i < 4; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 		/* Wildcard support */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 		if ((requested_name[i] != '?') &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 		    (requested_name[i] != ((struct acpi_namespace_node *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 					   obj_handle)->name.ascii[i])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 			/* No match, just exit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 			return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 	/* Get the full pathname to this object */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 	status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 		acpi_os_printf("Could Not get pathname for object %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 			       obj_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 		info.count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 		info.owner_id = ACPI_OWNER_ID_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 		info.debug_level = ACPI_UINT32_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 		info.display_type = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 		acpi_os_printf("%32s", (char *)buffer.pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 		(void)acpi_ns_dump_one_object(obj_handle, nesting_level, &info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 					      NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 		ACPI_FREE(buffer.pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 	return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342)  * FUNCTION:    acpi_db_find_name_in_namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344)  * PARAMETERS:  name_arg        - The 4-character ACPI name to find.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345)  *                                wildcards are supported.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347)  * RETURN:      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349)  * DESCRIPTION: Search the namespace for a given name (with wildcards)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) acpi_status acpi_db_find_name_in_namespace(char *name_arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	char acpi_name[5] = "____";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 	char *acpi_name_ptr = acpi_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 	if (strlen(name_arg) > ACPI_NAMESEG_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) 		acpi_os_printf("Name must be no longer than 4 characters\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 	/* Pad out name with underscores as necessary to create a 4-char name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 	acpi_ut_strupr(name_arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 	while (*name_arg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 		*acpi_name_ptr = *name_arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 		acpi_name_ptr++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) 		name_arg++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 	/* Walk the namespace from the root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 				  ACPI_UINT32_MAX, acpi_db_walk_and_match_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 				  NULL, acpi_name, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 	return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384)  * FUNCTION:    acpi_db_walk_for_predefined_names
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386)  * PARAMETERS:  Callback from walk_namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390)  * DESCRIPTION: Detect and display predefined ACPI names (names that start with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391)  *              an underscore)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) acpi_db_walk_for_predefined_names(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 				  u32 nesting_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 				  void *context, void **return_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 	struct acpi_namespace_node *node =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 	    (struct acpi_namespace_node *)obj_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 	u32 *count = (u32 *)context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 	const union acpi_predefined_info *predefined;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 	const union acpi_predefined_info *package = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 	char *pathname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 	char string_buffer[48];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 	predefined = acpi_ut_match_predefined_method(node->name.ascii);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 	if (!predefined) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 	pathname = acpi_ns_get_normalized_pathname(node, TRUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 	if (!pathname) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 	/* If method returns a package, the info is in the next table entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 	if (predefined->info.expected_btypes & ACPI_RTYPE_PACKAGE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 		package = predefined + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 	acpi_ut_get_expected_return_types(string_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 					  predefined->info.expected_btypes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 	acpi_os_printf("%-32s Arguments %X, Return Types: %s", pathname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 		       METHOD_GET_ARG_COUNT(predefined->info.argument_list),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 		       string_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 	if (package) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 		acpi_os_printf(" (PkgType %2.2X, ObjType %2.2X, Count %2.2X)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 			       package->ret_info.type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 			       package->ret_info.object_type1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 			       package->ret_info.count1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 	acpi_os_printf("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 	/* Check that the declared argument count matches the ACPI spec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 	acpi_ns_check_acpi_compliance(pathname, node, predefined);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 	ACPI_FREE(pathname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 	(*count)++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 	return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451)  * FUNCTION:    acpi_db_check_predefined_names
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453)  * PARAMETERS:  None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455)  * RETURN:      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457)  * DESCRIPTION: Validate all predefined names in the namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) void acpi_db_check_predefined_names(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 	u32 count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 	/* Search all nodes in namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 				  ACPI_UINT32_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 				  acpi_db_walk_for_predefined_names, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 				  (void *)&count, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 	acpi_os_printf("Found %u predefined names in the namespace\n", count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477)  * FUNCTION:    acpi_db_walk_for_object_counts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479)  * PARAMETERS:  Callback from walk_namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483)  * DESCRIPTION: Display short info about objects in the namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) acpi_db_walk_for_object_counts(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 			       u32 nesting_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 			       void *context, void **return_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 	struct acpi_object_info *info = (struct acpi_object_info *)context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 	struct acpi_namespace_node *node =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 	    (struct acpi_namespace_node *)obj_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 	if (node->type > ACPI_TYPE_NS_NODE_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 		acpi_os_printf("[%4.4s]: Unknown object type %X\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 			       node->name.ascii, node->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 		info->types[node->type]++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 	return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508)  * FUNCTION:    acpi_db_walk_for_fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510)  * PARAMETERS:  Callback from walk_namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514)  * DESCRIPTION: Display short info about objects in the namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) acpi_db_walk_for_fields(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 			u32 nesting_level, void *context, void **return_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 	union acpi_object *ret_value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 	struct acpi_region_walk_info *info =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 	    (struct acpi_region_walk_info *)context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 	struct acpi_buffer buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 	struct acpi_namespace_node *node = acpi_ns_validate_handle(obj_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 	if (!node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 	if (node->object->field.region_obj->region.space_id !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 	    info->address_space_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 	info->count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 	/* Get and display the full pathname to this object */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 	status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 		acpi_os_printf("Could Not get pathname for object %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 			       obj_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) 	acpi_os_printf("%s ", (char *)buffer.pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 	ACPI_FREE(buffer.pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 	acpi_evaluate_object(obj_handle, NULL, NULL, &buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 	 * Since this is a field unit, surround the output in braces
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 	acpi_os_printf("{");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 	ret_value = (union acpi_object *)buffer.pointer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 	switch (ret_value->type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 	case ACPI_TYPE_INTEGER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 		acpi_os_printf("%8.8X%8.8X",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 			       ACPI_FORMAT_UINT64(ret_value->integer.value));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 	case ACPI_TYPE_BUFFER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 		acpi_ut_dump_buffer(ret_value->buffer.pointer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 				    ret_value->buffer.length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 				    DB_DISPLAY_DATA_ONLY | DB_BYTE_DISPLAY, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 	acpi_os_printf("}\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 	ACPI_FREE(buffer.pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 	return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588)  * FUNCTION:    acpi_db_walk_for_specific_objects
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590)  * PARAMETERS:  Callback from walk_namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594)  * DESCRIPTION: Display short info about objects in the namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) acpi_db_walk_for_specific_objects(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 				  u32 nesting_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 				  void *context, void **return_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 	struct acpi_walk_info *info = (struct acpi_walk_info *)context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 	struct acpi_buffer buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 	info->count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 	/* Get and display the full pathname to this object */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 	status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 		acpi_os_printf("Could Not get pathname for object %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 			       obj_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 	acpi_os_printf("%32s", (char *)buffer.pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 	ACPI_FREE(buffer.pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 	/* Dump short info about the object */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 	(void)acpi_ns_dump_one_object(obj_handle, nesting_level, info, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 	return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630)  * FUNCTION:    acpi_db_display_objects
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632)  * PARAMETERS:  obj_type_arg        - Type of object to display
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633)  *              display_count_arg   - Max depth to display
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635)  * RETURN:      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637)  * DESCRIPTION: Display objects in the namespace of the requested type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) acpi_status acpi_db_display_objects(char *obj_type_arg, char *display_count_arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 	struct acpi_walk_info info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 	acpi_object_type type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 	struct acpi_object_info *object_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 	u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 	u32 total_objects = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 	/* No argument means display summary/count of all object types */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 	if (!obj_type_arg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 		object_info =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 		    ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_object_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 		/* Walk the namespace from the root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 		(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 					  ACPI_UINT32_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 					  acpi_db_walk_for_object_counts, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 					  (void *)object_info, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) 		acpi_os_printf("\nSummary of namespace objects:\n\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 		for (i = 0; i < ACPI_TOTAL_TYPES; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 			acpi_os_printf("%8u %s\n", object_info->types[i],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 				       acpi_ut_get_type_name(i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 			total_objects += object_info->types[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 		acpi_os_printf("\n%8u Total namespace objects\n\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 			       total_objects);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 		ACPI_FREE(object_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 	/* Get the object type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 	type = acpi_db_match_argument(obj_type_arg, acpi_db_object_types);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) 	if (type == ACPI_TYPE_NOT_FOUND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 		acpi_os_printf("Invalid or unsupported argument\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 	acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 	acpi_os_printf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 	    ("Objects of type [%s] defined in the current ACPI Namespace:\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 	     acpi_ut_get_type_name(type));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 	acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 	info.count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 	info.owner_id = ACPI_OWNER_ID_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 	info.debug_level = ACPI_UINT32_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 	info.display_type = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 	/* Walk the namespace from the root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 	(void)acpi_walk_namespace(type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 				  acpi_db_walk_for_specific_objects, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 				  (void *)&info, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 	acpi_os_printf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 	    ("\nFound %u objects of type [%s] in the current ACPI Namespace\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 	     info.count, acpi_ut_get_type_name(type));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 	acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 	return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714)  * FUNCTION:    acpi_db_display_fields
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716)  * PARAMETERS:  obj_type_arg        - Type of object to display
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717)  *              display_count_arg   - Max depth to display
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719)  * RETURN:      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721)  * DESCRIPTION: Display objects in the namespace of the requested type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) acpi_status acpi_db_display_fields(u32 address_space_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 	struct acpi_region_walk_info info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 	info.count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 	info.owner_id = ACPI_OWNER_ID_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 	info.debug_level = ACPI_UINT32_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 	info.display_type = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 	info.address_space_id = address_space_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 	/* Walk the namespace from the root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 	(void)acpi_walk_namespace(ACPI_TYPE_LOCAL_REGION_FIELD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 				  ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 				  acpi_db_walk_for_fields, NULL, (void *)&info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 				  NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 	return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747)  * FUNCTION:    acpi_db_integrity_walk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749)  * PARAMETERS:  Callback from walk_namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753)  * DESCRIPTION: Examine one NS node for valid values.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) acpi_db_integrity_walk(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 		       u32 nesting_level, void *context, void **return_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 	struct acpi_integrity_info *info =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 	    (struct acpi_integrity_info *)context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 	struct acpi_namespace_node *node =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 	    (struct acpi_namespace_node *)obj_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 	union acpi_operand_object *object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 	u8 alias = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 	info->nodes++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 	/* Verify the NS node, and dereference aliases */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 	while (alias) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 		if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 			acpi_os_printf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 			    ("Invalid Descriptor Type for Node %p [%s] - "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 			     "is %2.2X should be %2.2X\n", node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 			     acpi_ut_get_descriptor_name(node),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 			     ACPI_GET_DESCRIPTOR_TYPE(node),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 			     ACPI_DESC_TYPE_NAMED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 			return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 		if ((node->type == ACPI_TYPE_LOCAL_ALIAS) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 		    (node->type == ACPI_TYPE_LOCAL_METHOD_ALIAS)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 			node = (struct acpi_namespace_node *)node->object;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 			alias = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 	if (node->type > ACPI_TYPE_LOCAL_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 		acpi_os_printf("Invalid Object Type for Node %p, Type = %X\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 			       node, node->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 	if (!acpi_ut_valid_nameseg(node->name.ascii)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 		acpi_os_printf("Invalid AcpiName for Node %p\n", node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 	object = acpi_ns_get_attached_object(node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 	if (object) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 		info->objects++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 		if (ACPI_GET_DESCRIPTOR_TYPE(object) != ACPI_DESC_TYPE_OPERAND) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 			acpi_os_printf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 			    ("Invalid Descriptor Type for Object %p [%s]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 			     object, acpi_ut_get_descriptor_name(object));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 	return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817)  * FUNCTION:    acpi_db_check_integrity
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819)  * PARAMETERS:  None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821)  * RETURN:      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823)  * DESCRIPTION: Check entire namespace for data structure integrity
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) void acpi_db_check_integrity(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 	struct acpi_integrity_info info = { 0, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 	/* Search all nodes in namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 				  ACPI_UINT32_MAX, acpi_db_integrity_walk, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 				  (void *)&info, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 	acpi_os_printf("Verified %u namespace nodes with %u Objects\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 		       info.nodes, info.objects);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843)  * FUNCTION:    acpi_db_walk_for_references
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845)  * PARAMETERS:  Callback from walk_namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849)  * DESCRIPTION: Check if this namespace object refers to the target object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850)  *              that is passed in as the context value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852)  * Note: Currently doesn't check subobjects within the Node's object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) acpi_db_walk_for_references(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 			    u32 nesting_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 			    void *context, void **return_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 	union acpi_operand_object *obj_desc =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 	    (union acpi_operand_object *)context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 	struct acpi_namespace_node *node =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 	    (struct acpi_namespace_node *)obj_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 	/* Check for match against the namespace node itself */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 	if (node == (void *)obj_desc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 		acpi_os_printf("Object is a Node [%4.4s]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 			       acpi_ut_get_node_name(node));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 	/* Check for match against the object attached to the node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 	if (acpi_ns_get_attached_object(node) == obj_desc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 		acpi_os_printf("Reference at Node->Object %p [%4.4s]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 			       node, acpi_ut_get_node_name(node));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 	return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885)  * FUNCTION:    acpi_db_find_references
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887)  * PARAMETERS:  object_arg      - String with hex value of the object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889)  * RETURN:      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891)  * DESCRIPTION: Search namespace for all references to the input object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) void acpi_db_find_references(char *object_arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 	union acpi_operand_object *obj_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 	acpi_size address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 	/* Convert string to object pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 	address = strtoul(object_arg, NULL, 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 	obj_desc = ACPI_TO_POINTER(address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 	/* Search all nodes in namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) 				  ACPI_UINT32_MAX, acpi_db_walk_for_references,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 				  NULL, (void *)obj_desc, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914)  * FUNCTION:    acpi_db_bus_walk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916)  * PARAMETERS:  Callback from walk_namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920)  * DESCRIPTION: Display info about device objects that have a corresponding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921)  *              _PRT method.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) static acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) acpi_db_bus_walk(acpi_handle obj_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 		 u32 nesting_level, void *context, void **return_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 	struct acpi_namespace_node *node =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 	    (struct acpi_namespace_node *)obj_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 	acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 	struct acpi_buffer buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 	struct acpi_namespace_node *temp_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 	struct acpi_device_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 	u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 	if ((node->type != ACPI_TYPE_DEVICE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 	    (node->type != ACPI_TYPE_PROCESSOR)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 	/* Exit if there is no _PRT under this device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 	status = acpi_get_handle(node, METHOD_NAME__PRT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 				 ACPI_CAST_PTR(acpi_handle, &temp_node));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 	/* Get the full path to this device object */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 	buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 	status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 		acpi_os_printf("Could Not get pathname for object %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 			       obj_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 	status = acpi_get_object_info(obj_handle, &info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 		return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 	/* Display the full path */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 	acpi_os_printf("%-32s Type %X", (char *)buffer.pointer, node->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 	ACPI_FREE(buffer.pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 	if (info->flags & ACPI_PCI_ROOT_BRIDGE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 		acpi_os_printf(" - Is PCI Root Bridge");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 	acpi_os_printf("\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 	/* _PRT info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 	acpi_os_printf("_PRT: %p\n", temp_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 	/* Dump _ADR, _HID, _UID, _CID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 	if (info->valid & ACPI_VALID_ADR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 		acpi_os_printf("_ADR: %8.8X%8.8X\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 			       ACPI_FORMAT_UINT64(info->address));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 		acpi_os_printf("_ADR: <Not Present>\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 	if (info->valid & ACPI_VALID_HID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 		acpi_os_printf("_HID: %s\n", info->hardware_id.string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 		acpi_os_printf("_HID: <Not Present>\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 	if (info->valid & ACPI_VALID_UID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 		acpi_os_printf("_UID: %s\n", info->unique_id.string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 		acpi_os_printf("_UID: <Not Present>\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 	if (info->valid & ACPI_VALID_CID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 		for (i = 0; i < info->compatible_id_list.count; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 			acpi_os_printf("_CID: %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 				       info->compatible_id_list.ids[i].string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 		acpi_os_printf("_CID: <Not Present>\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 	ACPI_FREE(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 	return (AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)  * FUNCTION:    acpi_db_get_bus_info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)  * PARAMETERS:  None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019)  * RETURN:      None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021)  * DESCRIPTION: Display info about system buses.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) void acpi_db_get_bus_info(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 	/* Search all nodes in namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 	(void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 				  ACPI_UINT32_MAX, acpi_db_bus_walk, NULL, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 				  NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) }