162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 262306a36Sopenharmony_ci/******************************************************************************* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Module Name: dbnames - Debugger commands for the acpi namespace 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci ******************************************************************************/ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <acpi/acpi.h> 962306a36Sopenharmony_ci#include "accommon.h" 1062306a36Sopenharmony_ci#include "acnamesp.h" 1162306a36Sopenharmony_ci#include "acdebug.h" 1262306a36Sopenharmony_ci#include "acpredef.h" 1362306a36Sopenharmony_ci#include "acinterp.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define _COMPONENT ACPI_CA_DEBUGGER 1662306a36Sopenharmony_ciACPI_MODULE_NAME("dbnames") 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/* Local prototypes */ 1962306a36Sopenharmony_cistatic acpi_status 2062306a36Sopenharmony_ciacpi_db_walk_and_match_name(acpi_handle obj_handle, 2162306a36Sopenharmony_ci u32 nesting_level, 2262306a36Sopenharmony_ci void *context, void **return_value); 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistatic acpi_status 2562306a36Sopenharmony_ciacpi_db_walk_for_predefined_names(acpi_handle obj_handle, 2662306a36Sopenharmony_ci u32 nesting_level, 2762306a36Sopenharmony_ci void *context, void **return_value); 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic acpi_status 3062306a36Sopenharmony_ciacpi_db_walk_for_specific_objects(acpi_handle obj_handle, 3162306a36Sopenharmony_ci u32 nesting_level, 3262306a36Sopenharmony_ci void *context, void **return_value); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistatic acpi_status 3562306a36Sopenharmony_ciacpi_db_walk_for_object_counts(acpi_handle obj_handle, 3662306a36Sopenharmony_ci u32 nesting_level, 3762306a36Sopenharmony_ci void *context, void **return_value); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistatic acpi_status 4062306a36Sopenharmony_ciacpi_db_integrity_walk(acpi_handle obj_handle, 4162306a36Sopenharmony_ci u32 nesting_level, void *context, void **return_value); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistatic acpi_status 4462306a36Sopenharmony_ciacpi_db_walk_for_references(acpi_handle obj_handle, 4562306a36Sopenharmony_ci u32 nesting_level, 4662306a36Sopenharmony_ci void *context, void **return_value); 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistatic acpi_status 4962306a36Sopenharmony_ciacpi_db_bus_walk(acpi_handle obj_handle, 5062306a36Sopenharmony_ci u32 nesting_level, void *context, void **return_value); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/* 5362306a36Sopenharmony_ci * Arguments for the Objects command 5462306a36Sopenharmony_ci * These object types map directly to the ACPI_TYPES 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_cistatic struct acpi_db_argument_info acpi_db_object_types[] = { 5762306a36Sopenharmony_ci {"ANY"}, 5862306a36Sopenharmony_ci {"INTEGERS"}, 5962306a36Sopenharmony_ci {"STRINGS"}, 6062306a36Sopenharmony_ci {"BUFFERS"}, 6162306a36Sopenharmony_ci {"PACKAGES"}, 6262306a36Sopenharmony_ci {"FIELDS"}, 6362306a36Sopenharmony_ci {"DEVICES"}, 6462306a36Sopenharmony_ci {"EVENTS"}, 6562306a36Sopenharmony_ci {"METHODS"}, 6662306a36Sopenharmony_ci {"MUTEXES"}, 6762306a36Sopenharmony_ci {"REGIONS"}, 6862306a36Sopenharmony_ci {"POWERRESOURCES"}, 6962306a36Sopenharmony_ci {"PROCESSORS"}, 7062306a36Sopenharmony_ci {"THERMALZONES"}, 7162306a36Sopenharmony_ci {"BUFFERFIELDS"}, 7262306a36Sopenharmony_ci {"DDBHANDLES"}, 7362306a36Sopenharmony_ci {"DEBUG"}, 7462306a36Sopenharmony_ci {"REGIONFIELDS"}, 7562306a36Sopenharmony_ci {"BANKFIELDS"}, 7662306a36Sopenharmony_ci {"INDEXFIELDS"}, 7762306a36Sopenharmony_ci {"REFERENCES"}, 7862306a36Sopenharmony_ci {"ALIASES"}, 7962306a36Sopenharmony_ci {"METHODALIASES"}, 8062306a36Sopenharmony_ci {"NOTIFY"}, 8162306a36Sopenharmony_ci {"ADDRESSHANDLER"}, 8262306a36Sopenharmony_ci {"RESOURCE"}, 8362306a36Sopenharmony_ci {"RESOURCEFIELD"}, 8462306a36Sopenharmony_ci {"SCOPES"}, 8562306a36Sopenharmony_ci {NULL} /* Must be null terminated */ 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci/******************************************************************************* 8962306a36Sopenharmony_ci * 9062306a36Sopenharmony_ci * FUNCTION: acpi_db_set_scope 9162306a36Sopenharmony_ci * 9262306a36Sopenharmony_ci * PARAMETERS: name - New scope path 9362306a36Sopenharmony_ci * 9462306a36Sopenharmony_ci * RETURN: Status 9562306a36Sopenharmony_ci * 9662306a36Sopenharmony_ci * DESCRIPTION: Set the "current scope" as maintained by this utility. 9762306a36Sopenharmony_ci * The scope is used as a prefix to ACPI paths. 9862306a36Sopenharmony_ci * 9962306a36Sopenharmony_ci ******************************************************************************/ 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_civoid acpi_db_set_scope(char *name) 10262306a36Sopenharmony_ci{ 10362306a36Sopenharmony_ci acpi_status status; 10462306a36Sopenharmony_ci struct acpi_namespace_node *node; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci if (!name || name[0] == 0) { 10762306a36Sopenharmony_ci acpi_os_printf("Current scope: %s\n", acpi_gbl_db_scope_buf); 10862306a36Sopenharmony_ci return; 10962306a36Sopenharmony_ci } 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci acpi_db_prep_namestring(name); 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci if (ACPI_IS_ROOT_PREFIX(name[0])) { 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci /* Validate new scope from the root */ 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci status = acpi_ns_get_node(acpi_gbl_root_node, name, 11862306a36Sopenharmony_ci ACPI_NS_NO_UPSEARCH, &node); 11962306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 12062306a36Sopenharmony_ci goto error_exit; 12162306a36Sopenharmony_ci } 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci acpi_gbl_db_scope_buf[0] = 0; 12462306a36Sopenharmony_ci } else { 12562306a36Sopenharmony_ci /* Validate new scope relative to old scope */ 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci status = acpi_ns_get_node(acpi_gbl_db_scope_node, name, 12862306a36Sopenharmony_ci ACPI_NS_NO_UPSEARCH, &node); 12962306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 13062306a36Sopenharmony_ci goto error_exit; 13162306a36Sopenharmony_ci } 13262306a36Sopenharmony_ci } 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci /* Build the final pathname */ 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci if (acpi_ut_safe_strcat 13762306a36Sopenharmony_ci (acpi_gbl_db_scope_buf, sizeof(acpi_gbl_db_scope_buf), name)) { 13862306a36Sopenharmony_ci status = AE_BUFFER_OVERFLOW; 13962306a36Sopenharmony_ci goto error_exit; 14062306a36Sopenharmony_ci } 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci if (acpi_ut_safe_strcat 14362306a36Sopenharmony_ci (acpi_gbl_db_scope_buf, sizeof(acpi_gbl_db_scope_buf), "\\")) { 14462306a36Sopenharmony_ci status = AE_BUFFER_OVERFLOW; 14562306a36Sopenharmony_ci goto error_exit; 14662306a36Sopenharmony_ci } 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci acpi_gbl_db_scope_node = node; 14962306a36Sopenharmony_ci acpi_os_printf("New scope: %s\n", acpi_gbl_db_scope_buf); 15062306a36Sopenharmony_ci return; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_cierror_exit: 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci acpi_os_printf("Could not attach scope: %s, %s\n", 15562306a36Sopenharmony_ci name, acpi_format_exception(status)); 15662306a36Sopenharmony_ci} 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci/******************************************************************************* 15962306a36Sopenharmony_ci * 16062306a36Sopenharmony_ci * FUNCTION: acpi_db_dump_namespace 16162306a36Sopenharmony_ci * 16262306a36Sopenharmony_ci * PARAMETERS: start_arg - Node to begin namespace dump 16362306a36Sopenharmony_ci * depth_arg - Maximum tree depth to be dumped 16462306a36Sopenharmony_ci * 16562306a36Sopenharmony_ci * RETURN: None 16662306a36Sopenharmony_ci * 16762306a36Sopenharmony_ci * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed 16862306a36Sopenharmony_ci * with type and other information. 16962306a36Sopenharmony_ci * 17062306a36Sopenharmony_ci ******************************************************************************/ 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_civoid acpi_db_dump_namespace(char *start_arg, char *depth_arg) 17362306a36Sopenharmony_ci{ 17462306a36Sopenharmony_ci acpi_handle subtree_entry = acpi_gbl_root_node; 17562306a36Sopenharmony_ci u32 max_depth = ACPI_UINT32_MAX; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci /* No argument given, just start at the root and dump entire namespace */ 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci if (start_arg) { 18062306a36Sopenharmony_ci subtree_entry = acpi_db_convert_to_node(start_arg); 18162306a36Sopenharmony_ci if (!subtree_entry) { 18262306a36Sopenharmony_ci return; 18362306a36Sopenharmony_ci } 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci /* Now we can check for the depth argument */ 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci if (depth_arg) { 18862306a36Sopenharmony_ci max_depth = strtoul(depth_arg, NULL, 0); 18962306a36Sopenharmony_ci } 19062306a36Sopenharmony_ci } 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT); 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci if (((struct acpi_namespace_node *)subtree_entry)->parent) { 19562306a36Sopenharmony_ci acpi_os_printf("ACPI Namespace (from %4.4s (%p) subtree):\n", 19662306a36Sopenharmony_ci ((struct acpi_namespace_node *)subtree_entry)-> 19762306a36Sopenharmony_ci name.ascii, subtree_entry); 19862306a36Sopenharmony_ci } else { 19962306a36Sopenharmony_ci acpi_os_printf("ACPI Namespace (from %s):\n", 20062306a36Sopenharmony_ci ACPI_NAMESPACE_ROOT); 20162306a36Sopenharmony_ci } 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci /* Display the subtree */ 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT); 20662306a36Sopenharmony_ci acpi_ns_dump_objects(ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, max_depth, 20762306a36Sopenharmony_ci ACPI_OWNER_ID_MAX, subtree_entry); 20862306a36Sopenharmony_ci acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT); 20962306a36Sopenharmony_ci} 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci/******************************************************************************* 21262306a36Sopenharmony_ci * 21362306a36Sopenharmony_ci * FUNCTION: acpi_db_dump_namespace_paths 21462306a36Sopenharmony_ci * 21562306a36Sopenharmony_ci * PARAMETERS: None 21662306a36Sopenharmony_ci * 21762306a36Sopenharmony_ci * RETURN: None 21862306a36Sopenharmony_ci * 21962306a36Sopenharmony_ci * DESCRIPTION: Dump entire namespace with full object pathnames and object 22062306a36Sopenharmony_ci * type information. Alternative to "namespace" command. 22162306a36Sopenharmony_ci * 22262306a36Sopenharmony_ci ******************************************************************************/ 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_civoid acpi_db_dump_namespace_paths(void) 22562306a36Sopenharmony_ci{ 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT); 22862306a36Sopenharmony_ci acpi_os_printf("ACPI Namespace (from root):\n"); 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci /* Display the entire namespace */ 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT); 23362306a36Sopenharmony_ci acpi_ns_dump_object_paths(ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, 23462306a36Sopenharmony_ci ACPI_UINT32_MAX, ACPI_OWNER_ID_MAX, 23562306a36Sopenharmony_ci acpi_gbl_root_node); 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT); 23862306a36Sopenharmony_ci} 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci/******************************************************************************* 24162306a36Sopenharmony_ci * 24262306a36Sopenharmony_ci * FUNCTION: acpi_db_dump_namespace_by_owner 24362306a36Sopenharmony_ci * 24462306a36Sopenharmony_ci * PARAMETERS: owner_arg - Owner ID whose nodes will be displayed 24562306a36Sopenharmony_ci * depth_arg - Maximum tree depth to be dumped 24662306a36Sopenharmony_ci * 24762306a36Sopenharmony_ci * RETURN: None 24862306a36Sopenharmony_ci * 24962306a36Sopenharmony_ci * DESCRIPTION: Dump elements of the namespace that are owned by the owner_id. 25062306a36Sopenharmony_ci * 25162306a36Sopenharmony_ci ******************************************************************************/ 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_civoid acpi_db_dump_namespace_by_owner(char *owner_arg, char *depth_arg) 25462306a36Sopenharmony_ci{ 25562306a36Sopenharmony_ci acpi_handle subtree_entry = acpi_gbl_root_node; 25662306a36Sopenharmony_ci u32 max_depth = ACPI_UINT32_MAX; 25762306a36Sopenharmony_ci acpi_owner_id owner_id; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci owner_id = (acpi_owner_id)strtoul(owner_arg, NULL, 0); 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci /* Now we can check for the depth argument */ 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci if (depth_arg) { 26462306a36Sopenharmony_ci max_depth = strtoul(depth_arg, NULL, 0); 26562306a36Sopenharmony_ci } 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT); 26862306a36Sopenharmony_ci acpi_os_printf("ACPI Namespace by owner %X:\n", owner_id); 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci /* Display the subtree */ 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT); 27362306a36Sopenharmony_ci acpi_ns_dump_objects(ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, max_depth, 27462306a36Sopenharmony_ci owner_id, subtree_entry); 27562306a36Sopenharmony_ci acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT); 27662306a36Sopenharmony_ci} 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci/******************************************************************************* 27962306a36Sopenharmony_ci * 28062306a36Sopenharmony_ci * FUNCTION: acpi_db_walk_and_match_name 28162306a36Sopenharmony_ci * 28262306a36Sopenharmony_ci * PARAMETERS: Callback from walk_namespace 28362306a36Sopenharmony_ci * 28462306a36Sopenharmony_ci * RETURN: Status 28562306a36Sopenharmony_ci * 28662306a36Sopenharmony_ci * DESCRIPTION: Find a particular name/names within the namespace. Wildcards 28762306a36Sopenharmony_ci * are supported -- '?' matches any character. 28862306a36Sopenharmony_ci * 28962306a36Sopenharmony_ci ******************************************************************************/ 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_cistatic acpi_status 29262306a36Sopenharmony_ciacpi_db_walk_and_match_name(acpi_handle obj_handle, 29362306a36Sopenharmony_ci u32 nesting_level, 29462306a36Sopenharmony_ci void *context, void **return_value) 29562306a36Sopenharmony_ci{ 29662306a36Sopenharmony_ci acpi_status status; 29762306a36Sopenharmony_ci char *requested_name = (char *)context; 29862306a36Sopenharmony_ci u32 i; 29962306a36Sopenharmony_ci struct acpi_buffer buffer; 30062306a36Sopenharmony_ci struct acpi_walk_info info; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci /* Check for a name match */ 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci for (i = 0; i < 4; i++) { 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci /* Wildcard support */ 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci if ((requested_name[i] != '?') && 30962306a36Sopenharmony_ci (requested_name[i] != ((struct acpi_namespace_node *) 31062306a36Sopenharmony_ci obj_handle)->name.ascii[i])) { 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci /* No match, just exit */ 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci return (AE_OK); 31562306a36Sopenharmony_ci } 31662306a36Sopenharmony_ci } 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci /* Get the full pathname to this object */ 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; 32162306a36Sopenharmony_ci status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE); 32262306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 32362306a36Sopenharmony_ci acpi_os_printf("Could Not get pathname for object %p\n", 32462306a36Sopenharmony_ci obj_handle); 32562306a36Sopenharmony_ci } else { 32662306a36Sopenharmony_ci info.count = 0; 32762306a36Sopenharmony_ci info.owner_id = ACPI_OWNER_ID_MAX; 32862306a36Sopenharmony_ci info.debug_level = ACPI_UINT32_MAX; 32962306a36Sopenharmony_ci info.display_type = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT; 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci acpi_os_printf("%32s", (char *)buffer.pointer); 33262306a36Sopenharmony_ci (void)acpi_ns_dump_one_object(obj_handle, nesting_level, &info, 33362306a36Sopenharmony_ci NULL); 33462306a36Sopenharmony_ci ACPI_FREE(buffer.pointer); 33562306a36Sopenharmony_ci } 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci return (AE_OK); 33862306a36Sopenharmony_ci} 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci/******************************************************************************* 34162306a36Sopenharmony_ci * 34262306a36Sopenharmony_ci * FUNCTION: acpi_db_find_name_in_namespace 34362306a36Sopenharmony_ci * 34462306a36Sopenharmony_ci * PARAMETERS: name_arg - The 4-character ACPI name to find. 34562306a36Sopenharmony_ci * wildcards are supported. 34662306a36Sopenharmony_ci * 34762306a36Sopenharmony_ci * RETURN: None 34862306a36Sopenharmony_ci * 34962306a36Sopenharmony_ci * DESCRIPTION: Search the namespace for a given name (with wildcards) 35062306a36Sopenharmony_ci * 35162306a36Sopenharmony_ci ******************************************************************************/ 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ciacpi_status acpi_db_find_name_in_namespace(char *name_arg) 35462306a36Sopenharmony_ci{ 35562306a36Sopenharmony_ci char acpi_name[5] = "____"; 35662306a36Sopenharmony_ci char *acpi_name_ptr = acpi_name; 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci if (strlen(name_arg) > ACPI_NAMESEG_SIZE) { 35962306a36Sopenharmony_ci acpi_os_printf("Name must be no longer than 4 characters\n"); 36062306a36Sopenharmony_ci return (AE_OK); 36162306a36Sopenharmony_ci } 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci /* Pad out name with underscores as necessary to create a 4-char name */ 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci acpi_ut_strupr(name_arg); 36662306a36Sopenharmony_ci while (*name_arg) { 36762306a36Sopenharmony_ci *acpi_name_ptr = *name_arg; 36862306a36Sopenharmony_ci acpi_name_ptr++; 36962306a36Sopenharmony_ci name_arg++; 37062306a36Sopenharmony_ci } 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci /* Walk the namespace from the root */ 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci (void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 37562306a36Sopenharmony_ci ACPI_UINT32_MAX, acpi_db_walk_and_match_name, 37662306a36Sopenharmony_ci NULL, acpi_name, NULL); 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT); 37962306a36Sopenharmony_ci return (AE_OK); 38062306a36Sopenharmony_ci} 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci/******************************************************************************* 38362306a36Sopenharmony_ci * 38462306a36Sopenharmony_ci * FUNCTION: acpi_db_walk_for_predefined_names 38562306a36Sopenharmony_ci * 38662306a36Sopenharmony_ci * PARAMETERS: Callback from walk_namespace 38762306a36Sopenharmony_ci * 38862306a36Sopenharmony_ci * RETURN: Status 38962306a36Sopenharmony_ci * 39062306a36Sopenharmony_ci * DESCRIPTION: Detect and display predefined ACPI names (names that start with 39162306a36Sopenharmony_ci * an underscore) 39262306a36Sopenharmony_ci * 39362306a36Sopenharmony_ci ******************************************************************************/ 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_cistatic acpi_status 39662306a36Sopenharmony_ciacpi_db_walk_for_predefined_names(acpi_handle obj_handle, 39762306a36Sopenharmony_ci u32 nesting_level, 39862306a36Sopenharmony_ci void *context, void **return_value) 39962306a36Sopenharmony_ci{ 40062306a36Sopenharmony_ci struct acpi_namespace_node *node = 40162306a36Sopenharmony_ci (struct acpi_namespace_node *)obj_handle; 40262306a36Sopenharmony_ci u32 *count = (u32 *)context; 40362306a36Sopenharmony_ci const union acpi_predefined_info *predefined; 40462306a36Sopenharmony_ci const union acpi_predefined_info *package = NULL; 40562306a36Sopenharmony_ci char *pathname; 40662306a36Sopenharmony_ci char string_buffer[48]; 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci predefined = acpi_ut_match_predefined_method(node->name.ascii); 40962306a36Sopenharmony_ci if (!predefined) { 41062306a36Sopenharmony_ci return (AE_OK); 41162306a36Sopenharmony_ci } 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci pathname = acpi_ns_get_normalized_pathname(node, TRUE); 41462306a36Sopenharmony_ci if (!pathname) { 41562306a36Sopenharmony_ci return (AE_OK); 41662306a36Sopenharmony_ci } 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci /* If method returns a package, the info is in the next table entry */ 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci if (predefined->info.expected_btypes & ACPI_RTYPE_PACKAGE) { 42162306a36Sopenharmony_ci package = predefined + 1; 42262306a36Sopenharmony_ci } 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci acpi_ut_get_expected_return_types(string_buffer, 42562306a36Sopenharmony_ci predefined->info.expected_btypes); 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci acpi_os_printf("%-32s Arguments %X, Return Types: %s", pathname, 42862306a36Sopenharmony_ci METHOD_GET_ARG_COUNT(predefined->info.argument_list), 42962306a36Sopenharmony_ci string_buffer); 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci if (package) { 43262306a36Sopenharmony_ci acpi_os_printf(" (PkgType %2.2X, ObjType %2.2X, Count %2.2X)", 43362306a36Sopenharmony_ci package->ret_info.type, 43462306a36Sopenharmony_ci package->ret_info.object_type1, 43562306a36Sopenharmony_ci package->ret_info.count1); 43662306a36Sopenharmony_ci } 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci acpi_os_printf("\n"); 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci /* Check that the declared argument count matches the ACPI spec */ 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci acpi_ns_check_acpi_compliance(pathname, node, predefined); 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_ci ACPI_FREE(pathname); 44562306a36Sopenharmony_ci (*count)++; 44662306a36Sopenharmony_ci return (AE_OK); 44762306a36Sopenharmony_ci} 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci/******************************************************************************* 45062306a36Sopenharmony_ci * 45162306a36Sopenharmony_ci * FUNCTION: acpi_db_check_predefined_names 45262306a36Sopenharmony_ci * 45362306a36Sopenharmony_ci * PARAMETERS: None 45462306a36Sopenharmony_ci * 45562306a36Sopenharmony_ci * RETURN: None 45662306a36Sopenharmony_ci * 45762306a36Sopenharmony_ci * DESCRIPTION: Validate all predefined names in the namespace 45862306a36Sopenharmony_ci * 45962306a36Sopenharmony_ci ******************************************************************************/ 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_civoid acpi_db_check_predefined_names(void) 46262306a36Sopenharmony_ci{ 46362306a36Sopenharmony_ci u32 count = 0; 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_ci /* Search all nodes in namespace */ 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_ci (void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 46862306a36Sopenharmony_ci ACPI_UINT32_MAX, 46962306a36Sopenharmony_ci acpi_db_walk_for_predefined_names, NULL, 47062306a36Sopenharmony_ci (void *)&count, NULL); 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_ci acpi_os_printf("Found %u predefined names in the namespace\n", count); 47362306a36Sopenharmony_ci} 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci/******************************************************************************* 47662306a36Sopenharmony_ci * 47762306a36Sopenharmony_ci * FUNCTION: acpi_db_walk_for_object_counts 47862306a36Sopenharmony_ci * 47962306a36Sopenharmony_ci * PARAMETERS: Callback from walk_namespace 48062306a36Sopenharmony_ci * 48162306a36Sopenharmony_ci * RETURN: Status 48262306a36Sopenharmony_ci * 48362306a36Sopenharmony_ci * DESCRIPTION: Display short info about objects in the namespace 48462306a36Sopenharmony_ci * 48562306a36Sopenharmony_ci ******************************************************************************/ 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_cistatic acpi_status 48862306a36Sopenharmony_ciacpi_db_walk_for_object_counts(acpi_handle obj_handle, 48962306a36Sopenharmony_ci u32 nesting_level, 49062306a36Sopenharmony_ci void *context, void **return_value) 49162306a36Sopenharmony_ci{ 49262306a36Sopenharmony_ci struct acpi_object_info *info = (struct acpi_object_info *)context; 49362306a36Sopenharmony_ci struct acpi_namespace_node *node = 49462306a36Sopenharmony_ci (struct acpi_namespace_node *)obj_handle; 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci if (node->type > ACPI_TYPE_NS_NODE_MAX) { 49762306a36Sopenharmony_ci acpi_os_printf("[%4.4s]: Unknown object type %X\n", 49862306a36Sopenharmony_ci node->name.ascii, node->type); 49962306a36Sopenharmony_ci } else { 50062306a36Sopenharmony_ci info->types[node->type]++; 50162306a36Sopenharmony_ci } 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_ci return (AE_OK); 50462306a36Sopenharmony_ci} 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_ci/******************************************************************************* 50762306a36Sopenharmony_ci * 50862306a36Sopenharmony_ci * FUNCTION: acpi_db_walk_for_fields 50962306a36Sopenharmony_ci * 51062306a36Sopenharmony_ci * PARAMETERS: Callback from walk_namespace 51162306a36Sopenharmony_ci * 51262306a36Sopenharmony_ci * RETURN: Status 51362306a36Sopenharmony_ci * 51462306a36Sopenharmony_ci * DESCRIPTION: Display short info about objects in the namespace 51562306a36Sopenharmony_ci * 51662306a36Sopenharmony_ci ******************************************************************************/ 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_cistatic acpi_status 51962306a36Sopenharmony_ciacpi_db_walk_for_fields(acpi_handle obj_handle, 52062306a36Sopenharmony_ci u32 nesting_level, void *context, void **return_value) 52162306a36Sopenharmony_ci{ 52262306a36Sopenharmony_ci union acpi_object *ret_value; 52362306a36Sopenharmony_ci struct acpi_region_walk_info *info = 52462306a36Sopenharmony_ci (struct acpi_region_walk_info *)context; 52562306a36Sopenharmony_ci struct acpi_buffer buffer; 52662306a36Sopenharmony_ci acpi_status status; 52762306a36Sopenharmony_ci struct acpi_namespace_node *node = acpi_ns_validate_handle(obj_handle); 52862306a36Sopenharmony_ci 52962306a36Sopenharmony_ci if (!node) { 53062306a36Sopenharmony_ci return (AE_OK); 53162306a36Sopenharmony_ci } 53262306a36Sopenharmony_ci if (node->object->field.region_obj->region.space_id != 53362306a36Sopenharmony_ci info->address_space_id) { 53462306a36Sopenharmony_ci return (AE_OK); 53562306a36Sopenharmony_ci } 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_ci info->count++; 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_ci /* Get and display the full pathname to this object */ 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; 54262306a36Sopenharmony_ci status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE); 54362306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 54462306a36Sopenharmony_ci acpi_os_printf("Could Not get pathname for object %p\n", 54562306a36Sopenharmony_ci obj_handle); 54662306a36Sopenharmony_ci return (AE_OK); 54762306a36Sopenharmony_ci } 54862306a36Sopenharmony_ci 54962306a36Sopenharmony_ci acpi_os_printf("%s ", (char *)buffer.pointer); 55062306a36Sopenharmony_ci ACPI_FREE(buffer.pointer); 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_ci buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; 55362306a36Sopenharmony_ci acpi_evaluate_object(obj_handle, NULL, NULL, &buffer); 55462306a36Sopenharmony_ci 55562306a36Sopenharmony_ci /* 55662306a36Sopenharmony_ci * Since this is a field unit, surround the output in braces 55762306a36Sopenharmony_ci */ 55862306a36Sopenharmony_ci acpi_os_printf("{"); 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_ci ret_value = (union acpi_object *)buffer.pointer; 56162306a36Sopenharmony_ci switch (ret_value->type) { 56262306a36Sopenharmony_ci case ACPI_TYPE_INTEGER: 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci acpi_os_printf("%8.8X%8.8X", 56562306a36Sopenharmony_ci ACPI_FORMAT_UINT64(ret_value->integer.value)); 56662306a36Sopenharmony_ci break; 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_ci case ACPI_TYPE_BUFFER: 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_ci acpi_ut_dump_buffer(ret_value->buffer.pointer, 57162306a36Sopenharmony_ci ret_value->buffer.length, 57262306a36Sopenharmony_ci DB_DISPLAY_DATA_ONLY | DB_BYTE_DISPLAY, 0); 57362306a36Sopenharmony_ci break; 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci default: 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_ci break; 57862306a36Sopenharmony_ci } 57962306a36Sopenharmony_ci acpi_os_printf("}\n"); 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_ci ACPI_FREE(buffer.pointer); 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_ci return (AE_OK); 58462306a36Sopenharmony_ci} 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_ci/******************************************************************************* 58762306a36Sopenharmony_ci * 58862306a36Sopenharmony_ci * FUNCTION: acpi_db_walk_for_specific_objects 58962306a36Sopenharmony_ci * 59062306a36Sopenharmony_ci * PARAMETERS: Callback from walk_namespace 59162306a36Sopenharmony_ci * 59262306a36Sopenharmony_ci * RETURN: Status 59362306a36Sopenharmony_ci * 59462306a36Sopenharmony_ci * DESCRIPTION: Display short info about objects in the namespace 59562306a36Sopenharmony_ci * 59662306a36Sopenharmony_ci ******************************************************************************/ 59762306a36Sopenharmony_ci 59862306a36Sopenharmony_cistatic acpi_status 59962306a36Sopenharmony_ciacpi_db_walk_for_specific_objects(acpi_handle obj_handle, 60062306a36Sopenharmony_ci u32 nesting_level, 60162306a36Sopenharmony_ci void *context, void **return_value) 60262306a36Sopenharmony_ci{ 60362306a36Sopenharmony_ci struct acpi_walk_info *info = (struct acpi_walk_info *)context; 60462306a36Sopenharmony_ci struct acpi_buffer buffer; 60562306a36Sopenharmony_ci acpi_status status; 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_ci info->count++; 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_ci /* Get and display the full pathname to this object */ 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_ci buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; 61262306a36Sopenharmony_ci status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE); 61362306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 61462306a36Sopenharmony_ci acpi_os_printf("Could Not get pathname for object %p\n", 61562306a36Sopenharmony_ci obj_handle); 61662306a36Sopenharmony_ci return (AE_OK); 61762306a36Sopenharmony_ci } 61862306a36Sopenharmony_ci 61962306a36Sopenharmony_ci acpi_os_printf("%32s", (char *)buffer.pointer); 62062306a36Sopenharmony_ci ACPI_FREE(buffer.pointer); 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_ci /* Dump short info about the object */ 62362306a36Sopenharmony_ci 62462306a36Sopenharmony_ci (void)acpi_ns_dump_one_object(obj_handle, nesting_level, info, NULL); 62562306a36Sopenharmony_ci return (AE_OK); 62662306a36Sopenharmony_ci} 62762306a36Sopenharmony_ci 62862306a36Sopenharmony_ci/******************************************************************************* 62962306a36Sopenharmony_ci * 63062306a36Sopenharmony_ci * FUNCTION: acpi_db_display_objects 63162306a36Sopenharmony_ci * 63262306a36Sopenharmony_ci * PARAMETERS: obj_type_arg - Type of object to display 63362306a36Sopenharmony_ci * display_count_arg - Max depth to display 63462306a36Sopenharmony_ci * 63562306a36Sopenharmony_ci * RETURN: None 63662306a36Sopenharmony_ci * 63762306a36Sopenharmony_ci * DESCRIPTION: Display objects in the namespace of the requested type 63862306a36Sopenharmony_ci * 63962306a36Sopenharmony_ci ******************************************************************************/ 64062306a36Sopenharmony_ci 64162306a36Sopenharmony_ciacpi_status acpi_db_display_objects(char *obj_type_arg, char *display_count_arg) 64262306a36Sopenharmony_ci{ 64362306a36Sopenharmony_ci struct acpi_walk_info info; 64462306a36Sopenharmony_ci acpi_object_type type; 64562306a36Sopenharmony_ci struct acpi_object_info *object_info; 64662306a36Sopenharmony_ci u32 i; 64762306a36Sopenharmony_ci u32 total_objects = 0; 64862306a36Sopenharmony_ci 64962306a36Sopenharmony_ci /* No argument means display summary/count of all object types */ 65062306a36Sopenharmony_ci 65162306a36Sopenharmony_ci if (!obj_type_arg) { 65262306a36Sopenharmony_ci object_info = 65362306a36Sopenharmony_ci ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_object_info)); 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_ci if (!object_info) 65662306a36Sopenharmony_ci return (AE_NO_MEMORY); 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_ci /* Walk the namespace from the root */ 65962306a36Sopenharmony_ci 66062306a36Sopenharmony_ci (void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 66162306a36Sopenharmony_ci ACPI_UINT32_MAX, 66262306a36Sopenharmony_ci acpi_db_walk_for_object_counts, NULL, 66362306a36Sopenharmony_ci (void *)object_info, NULL); 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_ci acpi_os_printf("\nSummary of namespace objects:\n\n"); 66662306a36Sopenharmony_ci 66762306a36Sopenharmony_ci for (i = 0; i < ACPI_TOTAL_TYPES; i++) { 66862306a36Sopenharmony_ci acpi_os_printf("%8u %s\n", object_info->types[i], 66962306a36Sopenharmony_ci acpi_ut_get_type_name(i)); 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_ci total_objects += object_info->types[i]; 67262306a36Sopenharmony_ci } 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ci acpi_os_printf("\n%8u Total namespace objects\n\n", 67562306a36Sopenharmony_ci total_objects); 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci ACPI_FREE(object_info); 67862306a36Sopenharmony_ci return (AE_OK); 67962306a36Sopenharmony_ci } 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_ci /* Get the object type */ 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ci type = acpi_db_match_argument(obj_type_arg, acpi_db_object_types); 68462306a36Sopenharmony_ci if (type == ACPI_TYPE_NOT_FOUND) { 68562306a36Sopenharmony_ci acpi_os_printf("Invalid or unsupported argument\n"); 68662306a36Sopenharmony_ci return (AE_OK); 68762306a36Sopenharmony_ci } 68862306a36Sopenharmony_ci 68962306a36Sopenharmony_ci acpi_db_set_output_destination(ACPI_DB_DUPLICATE_OUTPUT); 69062306a36Sopenharmony_ci acpi_os_printf 69162306a36Sopenharmony_ci ("Objects of type [%s] defined in the current ACPI Namespace:\n", 69262306a36Sopenharmony_ci acpi_ut_get_type_name(type)); 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_ci acpi_db_set_output_destination(ACPI_DB_REDIRECTABLE_OUTPUT); 69562306a36Sopenharmony_ci 69662306a36Sopenharmony_ci info.count = 0; 69762306a36Sopenharmony_ci info.owner_id = ACPI_OWNER_ID_MAX; 69862306a36Sopenharmony_ci info.debug_level = ACPI_UINT32_MAX; 69962306a36Sopenharmony_ci info.display_type = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT; 70062306a36Sopenharmony_ci 70162306a36Sopenharmony_ci /* Walk the namespace from the root */ 70262306a36Sopenharmony_ci 70362306a36Sopenharmony_ci (void)acpi_walk_namespace(type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 70462306a36Sopenharmony_ci acpi_db_walk_for_specific_objects, NULL, 70562306a36Sopenharmony_ci (void *)&info, NULL); 70662306a36Sopenharmony_ci 70762306a36Sopenharmony_ci acpi_os_printf 70862306a36Sopenharmony_ci ("\nFound %u objects of type [%s] in the current ACPI Namespace\n", 70962306a36Sopenharmony_ci info.count, acpi_ut_get_type_name(type)); 71062306a36Sopenharmony_ci 71162306a36Sopenharmony_ci acpi_db_set_output_destination(ACPI_DB_CONSOLE_OUTPUT); 71262306a36Sopenharmony_ci return (AE_OK); 71362306a36Sopenharmony_ci} 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_ci/******************************************************************************* 71662306a36Sopenharmony_ci * 71762306a36Sopenharmony_ci * FUNCTION: acpi_db_display_fields 71862306a36Sopenharmony_ci * 71962306a36Sopenharmony_ci * PARAMETERS: obj_type_arg - Type of object to display 72062306a36Sopenharmony_ci * display_count_arg - Max depth to display 72162306a36Sopenharmony_ci * 72262306a36Sopenharmony_ci * RETURN: None 72362306a36Sopenharmony_ci * 72462306a36Sopenharmony_ci * DESCRIPTION: Display objects in the namespace of the requested type 72562306a36Sopenharmony_ci * 72662306a36Sopenharmony_ci ******************************************************************************/ 72762306a36Sopenharmony_ci 72862306a36Sopenharmony_ciacpi_status acpi_db_display_fields(u32 address_space_id) 72962306a36Sopenharmony_ci{ 73062306a36Sopenharmony_ci struct acpi_region_walk_info info; 73162306a36Sopenharmony_ci 73262306a36Sopenharmony_ci info.count = 0; 73362306a36Sopenharmony_ci info.owner_id = ACPI_OWNER_ID_MAX; 73462306a36Sopenharmony_ci info.debug_level = ACPI_UINT32_MAX; 73562306a36Sopenharmony_ci info.display_type = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT; 73662306a36Sopenharmony_ci info.address_space_id = address_space_id; 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_ci /* Walk the namespace from the root */ 73962306a36Sopenharmony_ci 74062306a36Sopenharmony_ci (void)acpi_walk_namespace(ACPI_TYPE_LOCAL_REGION_FIELD, 74162306a36Sopenharmony_ci ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 74262306a36Sopenharmony_ci acpi_db_walk_for_fields, NULL, (void *)&info, 74362306a36Sopenharmony_ci NULL); 74462306a36Sopenharmony_ci 74562306a36Sopenharmony_ci return (AE_OK); 74662306a36Sopenharmony_ci} 74762306a36Sopenharmony_ci 74862306a36Sopenharmony_ci/******************************************************************************* 74962306a36Sopenharmony_ci * 75062306a36Sopenharmony_ci * FUNCTION: acpi_db_integrity_walk 75162306a36Sopenharmony_ci * 75262306a36Sopenharmony_ci * PARAMETERS: Callback from walk_namespace 75362306a36Sopenharmony_ci * 75462306a36Sopenharmony_ci * RETURN: Status 75562306a36Sopenharmony_ci * 75662306a36Sopenharmony_ci * DESCRIPTION: Examine one NS node for valid values. 75762306a36Sopenharmony_ci * 75862306a36Sopenharmony_ci ******************************************************************************/ 75962306a36Sopenharmony_ci 76062306a36Sopenharmony_cistatic acpi_status 76162306a36Sopenharmony_ciacpi_db_integrity_walk(acpi_handle obj_handle, 76262306a36Sopenharmony_ci u32 nesting_level, void *context, void **return_value) 76362306a36Sopenharmony_ci{ 76462306a36Sopenharmony_ci struct acpi_integrity_info *info = 76562306a36Sopenharmony_ci (struct acpi_integrity_info *)context; 76662306a36Sopenharmony_ci struct acpi_namespace_node *node = 76762306a36Sopenharmony_ci (struct acpi_namespace_node *)obj_handle; 76862306a36Sopenharmony_ci union acpi_operand_object *object; 76962306a36Sopenharmony_ci u8 alias = TRUE; 77062306a36Sopenharmony_ci 77162306a36Sopenharmony_ci info->nodes++; 77262306a36Sopenharmony_ci 77362306a36Sopenharmony_ci /* Verify the NS node, and dereference aliases */ 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_ci while (alias) { 77662306a36Sopenharmony_ci if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) { 77762306a36Sopenharmony_ci acpi_os_printf 77862306a36Sopenharmony_ci ("Invalid Descriptor Type for Node %p [%s] - " 77962306a36Sopenharmony_ci "is %2.2X should be %2.2X\n", node, 78062306a36Sopenharmony_ci acpi_ut_get_descriptor_name(node), 78162306a36Sopenharmony_ci ACPI_GET_DESCRIPTOR_TYPE(node), 78262306a36Sopenharmony_ci ACPI_DESC_TYPE_NAMED); 78362306a36Sopenharmony_ci return (AE_OK); 78462306a36Sopenharmony_ci } 78562306a36Sopenharmony_ci 78662306a36Sopenharmony_ci if ((node->type == ACPI_TYPE_LOCAL_ALIAS) || 78762306a36Sopenharmony_ci (node->type == ACPI_TYPE_LOCAL_METHOD_ALIAS)) { 78862306a36Sopenharmony_ci node = (struct acpi_namespace_node *)node->object; 78962306a36Sopenharmony_ci } else { 79062306a36Sopenharmony_ci alias = FALSE; 79162306a36Sopenharmony_ci } 79262306a36Sopenharmony_ci } 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_ci if (node->type > ACPI_TYPE_LOCAL_MAX) { 79562306a36Sopenharmony_ci acpi_os_printf("Invalid Object Type for Node %p, Type = %X\n", 79662306a36Sopenharmony_ci node, node->type); 79762306a36Sopenharmony_ci return (AE_OK); 79862306a36Sopenharmony_ci } 79962306a36Sopenharmony_ci 80062306a36Sopenharmony_ci if (!acpi_ut_valid_nameseg(node->name.ascii)) { 80162306a36Sopenharmony_ci acpi_os_printf("Invalid AcpiName for Node %p\n", node); 80262306a36Sopenharmony_ci return (AE_OK); 80362306a36Sopenharmony_ci } 80462306a36Sopenharmony_ci 80562306a36Sopenharmony_ci object = acpi_ns_get_attached_object(node); 80662306a36Sopenharmony_ci if (object) { 80762306a36Sopenharmony_ci info->objects++; 80862306a36Sopenharmony_ci if (ACPI_GET_DESCRIPTOR_TYPE(object) != ACPI_DESC_TYPE_OPERAND) { 80962306a36Sopenharmony_ci acpi_os_printf 81062306a36Sopenharmony_ci ("Invalid Descriptor Type for Object %p [%s]\n", 81162306a36Sopenharmony_ci object, acpi_ut_get_descriptor_name(object)); 81262306a36Sopenharmony_ci } 81362306a36Sopenharmony_ci } 81462306a36Sopenharmony_ci 81562306a36Sopenharmony_ci return (AE_OK); 81662306a36Sopenharmony_ci} 81762306a36Sopenharmony_ci 81862306a36Sopenharmony_ci/******************************************************************************* 81962306a36Sopenharmony_ci * 82062306a36Sopenharmony_ci * FUNCTION: acpi_db_check_integrity 82162306a36Sopenharmony_ci * 82262306a36Sopenharmony_ci * PARAMETERS: None 82362306a36Sopenharmony_ci * 82462306a36Sopenharmony_ci * RETURN: None 82562306a36Sopenharmony_ci * 82662306a36Sopenharmony_ci * DESCRIPTION: Check entire namespace for data structure integrity 82762306a36Sopenharmony_ci * 82862306a36Sopenharmony_ci ******************************************************************************/ 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_civoid acpi_db_check_integrity(void) 83162306a36Sopenharmony_ci{ 83262306a36Sopenharmony_ci struct acpi_integrity_info info = { 0, 0 }; 83362306a36Sopenharmony_ci 83462306a36Sopenharmony_ci /* Search all nodes in namespace */ 83562306a36Sopenharmony_ci 83662306a36Sopenharmony_ci (void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 83762306a36Sopenharmony_ci ACPI_UINT32_MAX, acpi_db_integrity_walk, NULL, 83862306a36Sopenharmony_ci (void *)&info, NULL); 83962306a36Sopenharmony_ci 84062306a36Sopenharmony_ci acpi_os_printf("Verified %u namespace nodes with %u Objects\n", 84162306a36Sopenharmony_ci info.nodes, info.objects); 84262306a36Sopenharmony_ci} 84362306a36Sopenharmony_ci 84462306a36Sopenharmony_ci/******************************************************************************* 84562306a36Sopenharmony_ci * 84662306a36Sopenharmony_ci * FUNCTION: acpi_db_walk_for_references 84762306a36Sopenharmony_ci * 84862306a36Sopenharmony_ci * PARAMETERS: Callback from walk_namespace 84962306a36Sopenharmony_ci * 85062306a36Sopenharmony_ci * RETURN: Status 85162306a36Sopenharmony_ci * 85262306a36Sopenharmony_ci * DESCRIPTION: Check if this namespace object refers to the target object 85362306a36Sopenharmony_ci * that is passed in as the context value. 85462306a36Sopenharmony_ci * 85562306a36Sopenharmony_ci * Note: Currently doesn't check subobjects within the Node's object 85662306a36Sopenharmony_ci * 85762306a36Sopenharmony_ci ******************************************************************************/ 85862306a36Sopenharmony_ci 85962306a36Sopenharmony_cistatic acpi_status 86062306a36Sopenharmony_ciacpi_db_walk_for_references(acpi_handle obj_handle, 86162306a36Sopenharmony_ci u32 nesting_level, 86262306a36Sopenharmony_ci void *context, void **return_value) 86362306a36Sopenharmony_ci{ 86462306a36Sopenharmony_ci union acpi_operand_object *obj_desc = 86562306a36Sopenharmony_ci (union acpi_operand_object *)context; 86662306a36Sopenharmony_ci struct acpi_namespace_node *node = 86762306a36Sopenharmony_ci (struct acpi_namespace_node *)obj_handle; 86862306a36Sopenharmony_ci 86962306a36Sopenharmony_ci /* Check for match against the namespace node itself */ 87062306a36Sopenharmony_ci 87162306a36Sopenharmony_ci if (node == (void *)obj_desc) { 87262306a36Sopenharmony_ci acpi_os_printf("Object is a Node [%4.4s]\n", 87362306a36Sopenharmony_ci acpi_ut_get_node_name(node)); 87462306a36Sopenharmony_ci } 87562306a36Sopenharmony_ci 87662306a36Sopenharmony_ci /* Check for match against the object attached to the node */ 87762306a36Sopenharmony_ci 87862306a36Sopenharmony_ci if (acpi_ns_get_attached_object(node) == obj_desc) { 87962306a36Sopenharmony_ci acpi_os_printf("Reference at Node->Object %p [%4.4s]\n", 88062306a36Sopenharmony_ci node, acpi_ut_get_node_name(node)); 88162306a36Sopenharmony_ci } 88262306a36Sopenharmony_ci 88362306a36Sopenharmony_ci return (AE_OK); 88462306a36Sopenharmony_ci} 88562306a36Sopenharmony_ci 88662306a36Sopenharmony_ci/******************************************************************************* 88762306a36Sopenharmony_ci * 88862306a36Sopenharmony_ci * FUNCTION: acpi_db_find_references 88962306a36Sopenharmony_ci * 89062306a36Sopenharmony_ci * PARAMETERS: object_arg - String with hex value of the object 89162306a36Sopenharmony_ci * 89262306a36Sopenharmony_ci * RETURN: None 89362306a36Sopenharmony_ci * 89462306a36Sopenharmony_ci * DESCRIPTION: Search namespace for all references to the input object 89562306a36Sopenharmony_ci * 89662306a36Sopenharmony_ci ******************************************************************************/ 89762306a36Sopenharmony_ci 89862306a36Sopenharmony_civoid acpi_db_find_references(char *object_arg) 89962306a36Sopenharmony_ci{ 90062306a36Sopenharmony_ci union acpi_operand_object *obj_desc; 90162306a36Sopenharmony_ci acpi_size address; 90262306a36Sopenharmony_ci 90362306a36Sopenharmony_ci /* Convert string to object pointer */ 90462306a36Sopenharmony_ci 90562306a36Sopenharmony_ci address = strtoul(object_arg, NULL, 16); 90662306a36Sopenharmony_ci obj_desc = ACPI_TO_POINTER(address); 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_ci /* Search all nodes in namespace */ 90962306a36Sopenharmony_ci 91062306a36Sopenharmony_ci (void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 91162306a36Sopenharmony_ci ACPI_UINT32_MAX, acpi_db_walk_for_references, 91262306a36Sopenharmony_ci NULL, (void *)obj_desc, NULL); 91362306a36Sopenharmony_ci} 91462306a36Sopenharmony_ci 91562306a36Sopenharmony_ci/******************************************************************************* 91662306a36Sopenharmony_ci * 91762306a36Sopenharmony_ci * FUNCTION: acpi_db_bus_walk 91862306a36Sopenharmony_ci * 91962306a36Sopenharmony_ci * PARAMETERS: Callback from walk_namespace 92062306a36Sopenharmony_ci * 92162306a36Sopenharmony_ci * RETURN: Status 92262306a36Sopenharmony_ci * 92362306a36Sopenharmony_ci * DESCRIPTION: Display info about device objects that have a corresponding 92462306a36Sopenharmony_ci * _PRT method. 92562306a36Sopenharmony_ci * 92662306a36Sopenharmony_ci ******************************************************************************/ 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_cistatic acpi_status 92962306a36Sopenharmony_ciacpi_db_bus_walk(acpi_handle obj_handle, 93062306a36Sopenharmony_ci u32 nesting_level, void *context, void **return_value) 93162306a36Sopenharmony_ci{ 93262306a36Sopenharmony_ci struct acpi_namespace_node *node = 93362306a36Sopenharmony_ci (struct acpi_namespace_node *)obj_handle; 93462306a36Sopenharmony_ci acpi_status status; 93562306a36Sopenharmony_ci struct acpi_buffer buffer; 93662306a36Sopenharmony_ci struct acpi_namespace_node *temp_node; 93762306a36Sopenharmony_ci struct acpi_device_info *info; 93862306a36Sopenharmony_ci u32 i; 93962306a36Sopenharmony_ci 94062306a36Sopenharmony_ci if ((node->type != ACPI_TYPE_DEVICE) && 94162306a36Sopenharmony_ci (node->type != ACPI_TYPE_PROCESSOR)) { 94262306a36Sopenharmony_ci return (AE_OK); 94362306a36Sopenharmony_ci } 94462306a36Sopenharmony_ci 94562306a36Sopenharmony_ci /* Exit if there is no _PRT under this device */ 94662306a36Sopenharmony_ci 94762306a36Sopenharmony_ci status = acpi_get_handle(node, METHOD_NAME__PRT, 94862306a36Sopenharmony_ci ACPI_CAST_PTR(acpi_handle, &temp_node)); 94962306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 95062306a36Sopenharmony_ci return (AE_OK); 95162306a36Sopenharmony_ci } 95262306a36Sopenharmony_ci 95362306a36Sopenharmony_ci /* Get the full path to this device object */ 95462306a36Sopenharmony_ci 95562306a36Sopenharmony_ci buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; 95662306a36Sopenharmony_ci status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE); 95762306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 95862306a36Sopenharmony_ci acpi_os_printf("Could Not get pathname for object %p\n", 95962306a36Sopenharmony_ci obj_handle); 96062306a36Sopenharmony_ci return (AE_OK); 96162306a36Sopenharmony_ci } 96262306a36Sopenharmony_ci 96362306a36Sopenharmony_ci status = acpi_get_object_info(obj_handle, &info); 96462306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 96562306a36Sopenharmony_ci return (AE_OK); 96662306a36Sopenharmony_ci } 96762306a36Sopenharmony_ci 96862306a36Sopenharmony_ci /* Display the full path */ 96962306a36Sopenharmony_ci 97062306a36Sopenharmony_ci acpi_os_printf("%-32s Type %X", (char *)buffer.pointer, node->type); 97162306a36Sopenharmony_ci ACPI_FREE(buffer.pointer); 97262306a36Sopenharmony_ci 97362306a36Sopenharmony_ci if (info->flags & ACPI_PCI_ROOT_BRIDGE) { 97462306a36Sopenharmony_ci acpi_os_printf(" - Is PCI Root Bridge"); 97562306a36Sopenharmony_ci } 97662306a36Sopenharmony_ci acpi_os_printf("\n"); 97762306a36Sopenharmony_ci 97862306a36Sopenharmony_ci /* _PRT info */ 97962306a36Sopenharmony_ci 98062306a36Sopenharmony_ci acpi_os_printf("_PRT: %p\n", temp_node); 98162306a36Sopenharmony_ci 98262306a36Sopenharmony_ci /* Dump _ADR, _HID, _UID, _CID */ 98362306a36Sopenharmony_ci 98462306a36Sopenharmony_ci if (info->valid & ACPI_VALID_ADR) { 98562306a36Sopenharmony_ci acpi_os_printf("_ADR: %8.8X%8.8X\n", 98662306a36Sopenharmony_ci ACPI_FORMAT_UINT64(info->address)); 98762306a36Sopenharmony_ci } else { 98862306a36Sopenharmony_ci acpi_os_printf("_ADR: <Not Present>\n"); 98962306a36Sopenharmony_ci } 99062306a36Sopenharmony_ci 99162306a36Sopenharmony_ci if (info->valid & ACPI_VALID_HID) { 99262306a36Sopenharmony_ci acpi_os_printf("_HID: %s\n", info->hardware_id.string); 99362306a36Sopenharmony_ci } else { 99462306a36Sopenharmony_ci acpi_os_printf("_HID: <Not Present>\n"); 99562306a36Sopenharmony_ci } 99662306a36Sopenharmony_ci 99762306a36Sopenharmony_ci if (info->valid & ACPI_VALID_UID) { 99862306a36Sopenharmony_ci acpi_os_printf("_UID: %s\n", info->unique_id.string); 99962306a36Sopenharmony_ci } else { 100062306a36Sopenharmony_ci acpi_os_printf("_UID: <Not Present>\n"); 100162306a36Sopenharmony_ci } 100262306a36Sopenharmony_ci 100362306a36Sopenharmony_ci if (info->valid & ACPI_VALID_CID) { 100462306a36Sopenharmony_ci for (i = 0; i < info->compatible_id_list.count; i++) { 100562306a36Sopenharmony_ci acpi_os_printf("_CID: %s\n", 100662306a36Sopenharmony_ci info->compatible_id_list.ids[i].string); 100762306a36Sopenharmony_ci } 100862306a36Sopenharmony_ci } else { 100962306a36Sopenharmony_ci acpi_os_printf("_CID: <Not Present>\n"); 101062306a36Sopenharmony_ci } 101162306a36Sopenharmony_ci 101262306a36Sopenharmony_ci ACPI_FREE(info); 101362306a36Sopenharmony_ci return (AE_OK); 101462306a36Sopenharmony_ci} 101562306a36Sopenharmony_ci 101662306a36Sopenharmony_ci/******************************************************************************* 101762306a36Sopenharmony_ci * 101862306a36Sopenharmony_ci * FUNCTION: acpi_db_get_bus_info 101962306a36Sopenharmony_ci * 102062306a36Sopenharmony_ci * PARAMETERS: None 102162306a36Sopenharmony_ci * 102262306a36Sopenharmony_ci * RETURN: None 102362306a36Sopenharmony_ci * 102462306a36Sopenharmony_ci * DESCRIPTION: Display info about system buses. 102562306a36Sopenharmony_ci * 102662306a36Sopenharmony_ci ******************************************************************************/ 102762306a36Sopenharmony_ci 102862306a36Sopenharmony_civoid acpi_db_get_bus_info(void) 102962306a36Sopenharmony_ci{ 103062306a36Sopenharmony_ci /* Search all nodes in namespace */ 103162306a36Sopenharmony_ci 103262306a36Sopenharmony_ci (void)acpi_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, 103362306a36Sopenharmony_ci ACPI_UINT32_MAX, acpi_db_bus_walk, NULL, NULL, 103462306a36Sopenharmony_ci NULL); 103562306a36Sopenharmony_ci} 1036