162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 262306a36Sopenharmony_ci/****************************************************************************** 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Module Name: nsdump - table dumping routines for debug 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2000 - 2023, Intel Corp. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci *****************************************************************************/ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <acpi/acpi.h> 1162306a36Sopenharmony_ci#include "accommon.h" 1262306a36Sopenharmony_ci#include "acnamesp.h" 1362306a36Sopenharmony_ci#include <acpi/acoutput.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define _COMPONENT ACPI_NAMESPACE 1662306a36Sopenharmony_ciACPI_MODULE_NAME("nsdump") 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/* Local prototypes */ 1962306a36Sopenharmony_ci#ifdef ACPI_OBSOLETE_FUNCTIONS 2062306a36Sopenharmony_civoid acpi_ns_dump_root_devices(void); 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistatic acpi_status 2362306a36Sopenharmony_ciacpi_ns_dump_one_device(acpi_handle obj_handle, 2462306a36Sopenharmony_ci u32 level, void *context, void **return_value); 2562306a36Sopenharmony_ci#endif 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic acpi_status 3062306a36Sopenharmony_ciacpi_ns_dump_one_object_path(acpi_handle obj_handle, 3162306a36Sopenharmony_ci u32 level, void *context, void **return_value); 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistatic acpi_status 3462306a36Sopenharmony_ciacpi_ns_get_max_depth(acpi_handle obj_handle, 3562306a36Sopenharmony_ci u32 level, void *context, void **return_value); 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci/******************************************************************************* 3862306a36Sopenharmony_ci * 3962306a36Sopenharmony_ci * FUNCTION: acpi_ns_print_pathname 4062306a36Sopenharmony_ci * 4162306a36Sopenharmony_ci * PARAMETERS: num_segments - Number of ACPI name segments 4262306a36Sopenharmony_ci * pathname - The compressed (internal) path 4362306a36Sopenharmony_ci * 4462306a36Sopenharmony_ci * RETURN: None 4562306a36Sopenharmony_ci * 4662306a36Sopenharmony_ci * DESCRIPTION: Print an object's full namespace pathname 4762306a36Sopenharmony_ci * 4862306a36Sopenharmony_ci ******************************************************************************/ 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_civoid acpi_ns_print_pathname(u32 num_segments, const char *pathname) 5162306a36Sopenharmony_ci{ 5262306a36Sopenharmony_ci u32 i; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci ACPI_FUNCTION_NAME(ns_print_pathname); 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci /* Check if debug output enabled */ 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_NAMES, ACPI_NAMESPACE)) { 5962306a36Sopenharmony_ci return; 6062306a36Sopenharmony_ci } 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci /* Print the entire name */ 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "[")); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci while (num_segments) { 6762306a36Sopenharmony_ci for (i = 0; i < 4; i++) { 6862306a36Sopenharmony_ci isprint((int)pathname[i]) ? 6962306a36Sopenharmony_ci acpi_os_printf("%c", pathname[i]) : 7062306a36Sopenharmony_ci acpi_os_printf("?"); 7162306a36Sopenharmony_ci } 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci pathname += ACPI_NAMESEG_SIZE; 7462306a36Sopenharmony_ci num_segments--; 7562306a36Sopenharmony_ci if (num_segments) { 7662306a36Sopenharmony_ci acpi_os_printf("."); 7762306a36Sopenharmony_ci } 7862306a36Sopenharmony_ci } 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci acpi_os_printf("]\n"); 8162306a36Sopenharmony_ci} 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#ifdef ACPI_OBSOLETE_FUNCTIONS 8462306a36Sopenharmony_ci/* Not used at this time, perhaps later */ 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci/******************************************************************************* 8762306a36Sopenharmony_ci * 8862306a36Sopenharmony_ci * FUNCTION: acpi_ns_dump_pathname 8962306a36Sopenharmony_ci * 9062306a36Sopenharmony_ci * PARAMETERS: handle - Object 9162306a36Sopenharmony_ci * msg - Prefix message 9262306a36Sopenharmony_ci * level - Desired debug level 9362306a36Sopenharmony_ci * component - Caller's component ID 9462306a36Sopenharmony_ci * 9562306a36Sopenharmony_ci * RETURN: None 9662306a36Sopenharmony_ci * 9762306a36Sopenharmony_ci * DESCRIPTION: Print an object's full namespace pathname 9862306a36Sopenharmony_ci * Manages allocation/freeing of a pathname buffer 9962306a36Sopenharmony_ci * 10062306a36Sopenharmony_ci ******************************************************************************/ 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_civoid 10362306a36Sopenharmony_ciacpi_ns_dump_pathname(acpi_handle handle, 10462306a36Sopenharmony_ci const char *msg, u32 level, u32 component) 10562306a36Sopenharmony_ci{ 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci ACPI_FUNCTION_TRACE(ns_dump_pathname); 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci /* Do this only if the requested debug level and component are enabled */ 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci if (!ACPI_IS_DEBUG_ENABLED(level, component)) { 11262306a36Sopenharmony_ci return_VOID; 11362306a36Sopenharmony_ci } 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci /* Convert handle to a full pathname and print it (with supplied message) */ 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci acpi_ns_print_node_pathname(handle, msg); 11862306a36Sopenharmony_ci acpi_os_printf("\n"); 11962306a36Sopenharmony_ci return_VOID; 12062306a36Sopenharmony_ci} 12162306a36Sopenharmony_ci#endif 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci/******************************************************************************* 12462306a36Sopenharmony_ci * 12562306a36Sopenharmony_ci * FUNCTION: acpi_ns_dump_one_object 12662306a36Sopenharmony_ci * 12762306a36Sopenharmony_ci * PARAMETERS: obj_handle - Node to be dumped 12862306a36Sopenharmony_ci * level - Nesting level of the handle 12962306a36Sopenharmony_ci * context - Passed into walk_namespace 13062306a36Sopenharmony_ci * return_value - Not used 13162306a36Sopenharmony_ci * 13262306a36Sopenharmony_ci * RETURN: Status 13362306a36Sopenharmony_ci * 13462306a36Sopenharmony_ci * DESCRIPTION: Dump a single Node 13562306a36Sopenharmony_ci * This procedure is a user_function called by acpi_ns_walk_namespace. 13662306a36Sopenharmony_ci * 13762306a36Sopenharmony_ci ******************************************************************************/ 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ciacpi_status 14062306a36Sopenharmony_ciacpi_ns_dump_one_object(acpi_handle obj_handle, 14162306a36Sopenharmony_ci u32 level, void *context, void **return_value) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci struct acpi_walk_info *info = (struct acpi_walk_info *)context; 14462306a36Sopenharmony_ci struct acpi_namespace_node *this_node; 14562306a36Sopenharmony_ci union acpi_operand_object *obj_desc = NULL; 14662306a36Sopenharmony_ci acpi_object_type obj_type; 14762306a36Sopenharmony_ci acpi_object_type type; 14862306a36Sopenharmony_ci u32 bytes_to_dump; 14962306a36Sopenharmony_ci u32 dbg_level; 15062306a36Sopenharmony_ci u32 i; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci ACPI_FUNCTION_NAME(ns_dump_one_object); 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci /* Is output enabled? */ 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci if (!(acpi_dbg_level & info->debug_level)) { 15762306a36Sopenharmony_ci return (AE_OK); 15862306a36Sopenharmony_ci } 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci if (!obj_handle) { 16162306a36Sopenharmony_ci ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Null object handle\n")); 16262306a36Sopenharmony_ci return (AE_OK); 16362306a36Sopenharmony_ci } 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci this_node = acpi_ns_validate_handle(obj_handle); 16662306a36Sopenharmony_ci if (!this_node) { 16762306a36Sopenharmony_ci ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Invalid object handle %p\n", 16862306a36Sopenharmony_ci obj_handle)); 16962306a36Sopenharmony_ci return (AE_OK); 17062306a36Sopenharmony_ci } 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci type = this_node->type; 17362306a36Sopenharmony_ci info->count++; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci /* Check if the owner matches */ 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci if ((info->owner_id != ACPI_OWNER_ID_MAX) && 17862306a36Sopenharmony_ci (info->owner_id != this_node->owner_id)) { 17962306a36Sopenharmony_ci return (AE_OK); 18062306a36Sopenharmony_ci } 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci if (!(info->display_type & ACPI_DISPLAY_SHORT)) { 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci /* Indent the object according to the level */ 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci acpi_os_printf("%2d%*s", (u32) level - 1, (int)level * 2, " "); 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci /* Check the node type and name */ 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci if (type > ACPI_TYPE_LOCAL_MAX) { 19162306a36Sopenharmony_ci ACPI_WARNING((AE_INFO, 19262306a36Sopenharmony_ci "Invalid ACPI Object Type 0x%08X", type)); 19362306a36Sopenharmony_ci } 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci acpi_os_printf("%4.4s", acpi_ut_get_node_name(this_node)); 19662306a36Sopenharmony_ci } 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci /* Now we can print out the pertinent information */ 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci acpi_os_printf(" %-12s %p %3.3X ", 20162306a36Sopenharmony_ci acpi_ut_get_type_name(type), this_node, 20262306a36Sopenharmony_ci this_node->owner_id); 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci dbg_level = acpi_dbg_level; 20562306a36Sopenharmony_ci acpi_dbg_level = 0; 20662306a36Sopenharmony_ci obj_desc = acpi_ns_get_attached_object(this_node); 20762306a36Sopenharmony_ci acpi_dbg_level = dbg_level; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci /* Temp nodes are those nodes created by a control method */ 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci if (this_node->flags & ANOBJ_TEMPORARY) { 21262306a36Sopenharmony_ci acpi_os_printf("(T) "); 21362306a36Sopenharmony_ci } 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci switch (info->display_type & ACPI_DISPLAY_MASK) { 21662306a36Sopenharmony_ci case ACPI_DISPLAY_SUMMARY: 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci if (!obj_desc) { 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci /* No attached object. Some types should always have an object */ 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci switch (type) { 22362306a36Sopenharmony_ci case ACPI_TYPE_INTEGER: 22462306a36Sopenharmony_ci case ACPI_TYPE_PACKAGE: 22562306a36Sopenharmony_ci case ACPI_TYPE_BUFFER: 22662306a36Sopenharmony_ci case ACPI_TYPE_STRING: 22762306a36Sopenharmony_ci case ACPI_TYPE_METHOD: 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci acpi_os_printf("<No attached object>"); 23062306a36Sopenharmony_ci break; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci default: 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci break; 23562306a36Sopenharmony_ci } 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci acpi_os_printf("\n"); 23862306a36Sopenharmony_ci return (AE_OK); 23962306a36Sopenharmony_ci } 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci switch (type) { 24262306a36Sopenharmony_ci case ACPI_TYPE_PROCESSOR: 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci acpi_os_printf("ID %02X Len %02X Addr %8.8X%8.8X\n", 24562306a36Sopenharmony_ci obj_desc->processor.proc_id, 24662306a36Sopenharmony_ci obj_desc->processor.length, 24762306a36Sopenharmony_ci ACPI_FORMAT_UINT64(obj_desc->processor. 24862306a36Sopenharmony_ci address)); 24962306a36Sopenharmony_ci break; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci case ACPI_TYPE_DEVICE: 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci acpi_os_printf("Notify Object: %p\n", obj_desc); 25462306a36Sopenharmony_ci break; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci case ACPI_TYPE_METHOD: 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci acpi_os_printf("Args %X Len %.4X Aml %p\n", 25962306a36Sopenharmony_ci (u32) obj_desc->method.param_count, 26062306a36Sopenharmony_ci obj_desc->method.aml_length, 26162306a36Sopenharmony_ci obj_desc->method.aml_start); 26262306a36Sopenharmony_ci break; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci case ACPI_TYPE_INTEGER: 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci acpi_os_printf("= %8.8X%8.8X\n", 26762306a36Sopenharmony_ci ACPI_FORMAT_UINT64(obj_desc->integer. 26862306a36Sopenharmony_ci value)); 26962306a36Sopenharmony_ci break; 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci case ACPI_TYPE_PACKAGE: 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { 27462306a36Sopenharmony_ci acpi_os_printf("Elements %.2X\n", 27562306a36Sopenharmony_ci obj_desc->package.count); 27662306a36Sopenharmony_ci } else { 27762306a36Sopenharmony_ci acpi_os_printf("[Length not yet evaluated]\n"); 27862306a36Sopenharmony_ci } 27962306a36Sopenharmony_ci break; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci case ACPI_TYPE_BUFFER: 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { 28462306a36Sopenharmony_ci acpi_os_printf("Len %.2X", 28562306a36Sopenharmony_ci obj_desc->buffer.length); 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci /* Dump some of the buffer */ 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci if (obj_desc->buffer.length > 0) { 29062306a36Sopenharmony_ci acpi_os_printf(" ="); 29162306a36Sopenharmony_ci for (i = 0; 29262306a36Sopenharmony_ci (i < obj_desc->buffer.length 29362306a36Sopenharmony_ci && i < 12); i++) { 29462306a36Sopenharmony_ci acpi_os_printf(" %2.2X", 29562306a36Sopenharmony_ci obj_desc->buffer. 29662306a36Sopenharmony_ci pointer[i]); 29762306a36Sopenharmony_ci } 29862306a36Sopenharmony_ci } 29962306a36Sopenharmony_ci acpi_os_printf("\n"); 30062306a36Sopenharmony_ci } else { 30162306a36Sopenharmony_ci acpi_os_printf("[Length not yet evaluated]\n"); 30262306a36Sopenharmony_ci } 30362306a36Sopenharmony_ci break; 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci case ACPI_TYPE_STRING: 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci acpi_os_printf("Len %.2X ", obj_desc->string.length); 30862306a36Sopenharmony_ci acpi_ut_print_string(obj_desc->string.pointer, 80); 30962306a36Sopenharmony_ci acpi_os_printf("\n"); 31062306a36Sopenharmony_ci break; 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci case ACPI_TYPE_REGION: 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci acpi_os_printf("[%s]", 31562306a36Sopenharmony_ci acpi_ut_get_region_name(obj_desc->region. 31662306a36Sopenharmony_ci space_id)); 31762306a36Sopenharmony_ci if (obj_desc->region.flags & AOPOBJ_DATA_VALID) { 31862306a36Sopenharmony_ci acpi_os_printf(" Addr %8.8X%8.8X Len %.4X\n", 31962306a36Sopenharmony_ci ACPI_FORMAT_UINT64(obj_desc-> 32062306a36Sopenharmony_ci region. 32162306a36Sopenharmony_ci address), 32262306a36Sopenharmony_ci obj_desc->region.length); 32362306a36Sopenharmony_ci } else { 32462306a36Sopenharmony_ci acpi_os_printf 32562306a36Sopenharmony_ci (" [Address/Length not yet evaluated]\n"); 32662306a36Sopenharmony_ci } 32762306a36Sopenharmony_ci break; 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci case ACPI_TYPE_LOCAL_REFERENCE: 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci acpi_os_printf("[%s]\n", 33262306a36Sopenharmony_ci acpi_ut_get_reference_name(obj_desc)); 33362306a36Sopenharmony_ci break; 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci case ACPI_TYPE_BUFFER_FIELD: 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci if (obj_desc->buffer_field.buffer_obj && 33862306a36Sopenharmony_ci obj_desc->buffer_field.buffer_obj->buffer.node) { 33962306a36Sopenharmony_ci acpi_os_printf("Buf [%4.4s]", 34062306a36Sopenharmony_ci acpi_ut_get_node_name(obj_desc-> 34162306a36Sopenharmony_ci buffer_field. 34262306a36Sopenharmony_ci buffer_obj-> 34362306a36Sopenharmony_ci buffer. 34462306a36Sopenharmony_ci node)); 34562306a36Sopenharmony_ci } 34662306a36Sopenharmony_ci break; 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci case ACPI_TYPE_LOCAL_REGION_FIELD: 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci acpi_os_printf("Rgn [%4.4s]", 35162306a36Sopenharmony_ci acpi_ut_get_node_name(obj_desc-> 35262306a36Sopenharmony_ci common_field. 35362306a36Sopenharmony_ci region_obj->region. 35462306a36Sopenharmony_ci node)); 35562306a36Sopenharmony_ci break; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci case ACPI_TYPE_LOCAL_BANK_FIELD: 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci acpi_os_printf("Rgn [%4.4s] Bnk [%4.4s]", 36062306a36Sopenharmony_ci acpi_ut_get_node_name(obj_desc-> 36162306a36Sopenharmony_ci common_field. 36262306a36Sopenharmony_ci region_obj->region. 36362306a36Sopenharmony_ci node), 36462306a36Sopenharmony_ci acpi_ut_get_node_name(obj_desc-> 36562306a36Sopenharmony_ci bank_field. 36662306a36Sopenharmony_ci bank_obj-> 36762306a36Sopenharmony_ci common_field. 36862306a36Sopenharmony_ci node)); 36962306a36Sopenharmony_ci break; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci case ACPI_TYPE_LOCAL_INDEX_FIELD: 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci acpi_os_printf("Idx [%4.4s] Dat [%4.4s]", 37462306a36Sopenharmony_ci acpi_ut_get_node_name(obj_desc-> 37562306a36Sopenharmony_ci index_field. 37662306a36Sopenharmony_ci index_obj-> 37762306a36Sopenharmony_ci common_field.node), 37862306a36Sopenharmony_ci acpi_ut_get_node_name(obj_desc-> 37962306a36Sopenharmony_ci index_field. 38062306a36Sopenharmony_ci data_obj-> 38162306a36Sopenharmony_ci common_field. 38262306a36Sopenharmony_ci node)); 38362306a36Sopenharmony_ci break; 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci case ACPI_TYPE_LOCAL_ALIAS: 38662306a36Sopenharmony_ci case ACPI_TYPE_LOCAL_METHOD_ALIAS: 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci acpi_os_printf("Target %4.4s (%p)\n", 38962306a36Sopenharmony_ci acpi_ut_get_node_name(obj_desc), 39062306a36Sopenharmony_ci obj_desc); 39162306a36Sopenharmony_ci break; 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci default: 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci acpi_os_printf("Object %p\n", obj_desc); 39662306a36Sopenharmony_ci break; 39762306a36Sopenharmony_ci } 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci /* Common field handling */ 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ci switch (type) { 40262306a36Sopenharmony_ci case ACPI_TYPE_BUFFER_FIELD: 40362306a36Sopenharmony_ci case ACPI_TYPE_LOCAL_REGION_FIELD: 40462306a36Sopenharmony_ci case ACPI_TYPE_LOCAL_BANK_FIELD: 40562306a36Sopenharmony_ci case ACPI_TYPE_LOCAL_INDEX_FIELD: 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci acpi_os_printf(" Off %.3X Len %.2X Acc %.2X\n", 40862306a36Sopenharmony_ci (obj_desc->common_field. 40962306a36Sopenharmony_ci base_byte_offset * 8) 41062306a36Sopenharmony_ci + 41162306a36Sopenharmony_ci obj_desc->common_field. 41262306a36Sopenharmony_ci start_field_bit_offset, 41362306a36Sopenharmony_ci obj_desc->common_field.bit_length, 41462306a36Sopenharmony_ci obj_desc->common_field. 41562306a36Sopenharmony_ci access_byte_width); 41662306a36Sopenharmony_ci break; 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci default: 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci break; 42162306a36Sopenharmony_ci } 42262306a36Sopenharmony_ci break; 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci case ACPI_DISPLAY_OBJECTS: 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci acpi_os_printf("O:%p", obj_desc); 42762306a36Sopenharmony_ci if (!obj_desc) { 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci /* No attached object, we are done */ 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci acpi_os_printf("\n"); 43262306a36Sopenharmony_ci return (AE_OK); 43362306a36Sopenharmony_ci } 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci acpi_os_printf("(R%u)", obj_desc->common.reference_count); 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci switch (type) { 43862306a36Sopenharmony_ci case ACPI_TYPE_METHOD: 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci /* Name is a Method and its AML offset/length are set */ 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci acpi_os_printf(" M:%p-%X\n", obj_desc->method.aml_start, 44362306a36Sopenharmony_ci obj_desc->method.aml_length); 44462306a36Sopenharmony_ci break; 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci case ACPI_TYPE_INTEGER: 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci acpi_os_printf(" I:%8.8X8.8%X\n", 44962306a36Sopenharmony_ci ACPI_FORMAT_UINT64(obj_desc->integer. 45062306a36Sopenharmony_ci value)); 45162306a36Sopenharmony_ci break; 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_ci case ACPI_TYPE_STRING: 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci acpi_os_printf(" S:%p-%X\n", obj_desc->string.pointer, 45662306a36Sopenharmony_ci obj_desc->string.length); 45762306a36Sopenharmony_ci break; 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_ci case ACPI_TYPE_BUFFER: 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci acpi_os_printf(" B:%p-%X\n", obj_desc->buffer.pointer, 46262306a36Sopenharmony_ci obj_desc->buffer.length); 46362306a36Sopenharmony_ci break; 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_ci default: 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_ci acpi_os_printf("\n"); 46862306a36Sopenharmony_ci break; 46962306a36Sopenharmony_ci } 47062306a36Sopenharmony_ci break; 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_ci default: 47362306a36Sopenharmony_ci acpi_os_printf("\n"); 47462306a36Sopenharmony_ci break; 47562306a36Sopenharmony_ci } 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_ci /* If debug turned off, done */ 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci if (!(acpi_dbg_level & ACPI_LV_VALUES)) { 48062306a36Sopenharmony_ci return (AE_OK); 48162306a36Sopenharmony_ci } 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ci /* If there is an attached object, display it */ 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_ci dbg_level = acpi_dbg_level; 48662306a36Sopenharmony_ci acpi_dbg_level = 0; 48762306a36Sopenharmony_ci obj_desc = acpi_ns_get_attached_object(this_node); 48862306a36Sopenharmony_ci acpi_dbg_level = dbg_level; 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci /* Dump attached objects */ 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ci while (obj_desc) { 49362306a36Sopenharmony_ci obj_type = ACPI_TYPE_INVALID; 49462306a36Sopenharmony_ci acpi_os_printf("Attached Object %p: ", obj_desc); 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci /* Decode the type of attached object and dump the contents */ 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ci switch (ACPI_GET_DESCRIPTOR_TYPE(obj_desc)) { 49962306a36Sopenharmony_ci case ACPI_DESC_TYPE_NAMED: 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_ci acpi_os_printf("(Ptr to Node)\n"); 50262306a36Sopenharmony_ci bytes_to_dump = sizeof(struct acpi_namespace_node); 50362306a36Sopenharmony_ci ACPI_DUMP_BUFFER(obj_desc, bytes_to_dump); 50462306a36Sopenharmony_ci break; 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_ci case ACPI_DESC_TYPE_OPERAND: 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci obj_type = obj_desc->common.type; 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ci if (obj_type > ACPI_TYPE_LOCAL_MAX) { 51162306a36Sopenharmony_ci acpi_os_printf 51262306a36Sopenharmony_ci ("(Pointer to ACPI Object type %.2X [UNKNOWN])\n", 51362306a36Sopenharmony_ci obj_type); 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_ci bytes_to_dump = 32; 51662306a36Sopenharmony_ci } else { 51762306a36Sopenharmony_ci acpi_os_printf 51862306a36Sopenharmony_ci ("(Pointer to ACPI Object type %.2X [%s])\n", 51962306a36Sopenharmony_ci obj_type, acpi_ut_get_type_name(obj_type)); 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_ci bytes_to_dump = 52262306a36Sopenharmony_ci sizeof(union acpi_operand_object); 52362306a36Sopenharmony_ci } 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci ACPI_DUMP_BUFFER(obj_desc, bytes_to_dump); 52662306a36Sopenharmony_ci break; 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci default: 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_ci break; 53162306a36Sopenharmony_ci } 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_ci /* If value is NOT an internal object, we are done */ 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != 53662306a36Sopenharmony_ci ACPI_DESC_TYPE_OPERAND) { 53762306a36Sopenharmony_ci goto cleanup; 53862306a36Sopenharmony_ci } 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ci /* Valid object, get the pointer to next level, if any */ 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_ci switch (obj_type) { 54362306a36Sopenharmony_ci case ACPI_TYPE_BUFFER: 54462306a36Sopenharmony_ci case ACPI_TYPE_STRING: 54562306a36Sopenharmony_ci /* 54662306a36Sopenharmony_ci * NOTE: takes advantage of common fields between string/buffer 54762306a36Sopenharmony_ci */ 54862306a36Sopenharmony_ci bytes_to_dump = obj_desc->string.length; 54962306a36Sopenharmony_ci obj_desc = (void *)obj_desc->string.pointer; 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_ci acpi_os_printf("(Buffer/String pointer %p length %X)\n", 55262306a36Sopenharmony_ci obj_desc, bytes_to_dump); 55362306a36Sopenharmony_ci ACPI_DUMP_BUFFER(obj_desc, bytes_to_dump); 55462306a36Sopenharmony_ci goto cleanup; 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_ci case ACPI_TYPE_BUFFER_FIELD: 55762306a36Sopenharmony_ci 55862306a36Sopenharmony_ci obj_desc = 55962306a36Sopenharmony_ci (union acpi_operand_object *)obj_desc->buffer_field. 56062306a36Sopenharmony_ci buffer_obj; 56162306a36Sopenharmony_ci break; 56262306a36Sopenharmony_ci 56362306a36Sopenharmony_ci case ACPI_TYPE_PACKAGE: 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_ci obj_desc = (void *)obj_desc->package.elements; 56662306a36Sopenharmony_ci break; 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_ci case ACPI_TYPE_METHOD: 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_ci obj_desc = (void *)obj_desc->method.aml_start; 57162306a36Sopenharmony_ci break; 57262306a36Sopenharmony_ci 57362306a36Sopenharmony_ci case ACPI_TYPE_LOCAL_REGION_FIELD: 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci obj_desc = (void *)obj_desc->field.region_obj; 57662306a36Sopenharmony_ci break; 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_ci case ACPI_TYPE_LOCAL_BANK_FIELD: 57962306a36Sopenharmony_ci 58062306a36Sopenharmony_ci obj_desc = (void *)obj_desc->bank_field.region_obj; 58162306a36Sopenharmony_ci break; 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_ci case ACPI_TYPE_LOCAL_INDEX_FIELD: 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci obj_desc = (void *)obj_desc->index_field.index_obj; 58662306a36Sopenharmony_ci break; 58762306a36Sopenharmony_ci 58862306a36Sopenharmony_ci default: 58962306a36Sopenharmony_ci 59062306a36Sopenharmony_ci goto cleanup; 59162306a36Sopenharmony_ci } 59262306a36Sopenharmony_ci } 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_cicleanup: 59562306a36Sopenharmony_ci acpi_os_printf("\n"); 59662306a36Sopenharmony_ci return (AE_OK); 59762306a36Sopenharmony_ci} 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_ci/******************************************************************************* 60062306a36Sopenharmony_ci * 60162306a36Sopenharmony_ci * FUNCTION: acpi_ns_dump_objects 60262306a36Sopenharmony_ci * 60362306a36Sopenharmony_ci * PARAMETERS: type - Object type to be dumped 60462306a36Sopenharmony_ci * display_type - 0 or ACPI_DISPLAY_SUMMARY 60562306a36Sopenharmony_ci * max_depth - Maximum depth of dump. Use ACPI_UINT32_MAX 60662306a36Sopenharmony_ci * for an effectively unlimited depth. 60762306a36Sopenharmony_ci * owner_id - Dump only objects owned by this ID. Use 60862306a36Sopenharmony_ci * ACPI_UINT32_MAX to match all owners. 60962306a36Sopenharmony_ci * start_handle - Where in namespace to start/end search 61062306a36Sopenharmony_ci * 61162306a36Sopenharmony_ci * RETURN: None 61262306a36Sopenharmony_ci * 61362306a36Sopenharmony_ci * DESCRIPTION: Dump typed objects within the loaded namespace. Uses 61462306a36Sopenharmony_ci * acpi_ns_walk_namespace in conjunction with acpi_ns_dump_one_object. 61562306a36Sopenharmony_ci * 61662306a36Sopenharmony_ci ******************************************************************************/ 61762306a36Sopenharmony_ci 61862306a36Sopenharmony_civoid 61962306a36Sopenharmony_ciacpi_ns_dump_objects(acpi_object_type type, 62062306a36Sopenharmony_ci u8 display_type, 62162306a36Sopenharmony_ci u32 max_depth, 62262306a36Sopenharmony_ci acpi_owner_id owner_id, acpi_handle start_handle) 62362306a36Sopenharmony_ci{ 62462306a36Sopenharmony_ci struct acpi_walk_info info; 62562306a36Sopenharmony_ci acpi_status status; 62662306a36Sopenharmony_ci 62762306a36Sopenharmony_ci ACPI_FUNCTION_ENTRY(); 62862306a36Sopenharmony_ci 62962306a36Sopenharmony_ci /* 63062306a36Sopenharmony_ci * Just lock the entire namespace for the duration of the dump. 63162306a36Sopenharmony_ci * We don't want any changes to the namespace during this time, 63262306a36Sopenharmony_ci * especially the temporary nodes since we are going to display 63362306a36Sopenharmony_ci * them also. 63462306a36Sopenharmony_ci */ 63562306a36Sopenharmony_ci status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); 63662306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 63762306a36Sopenharmony_ci acpi_os_printf("Could not acquire namespace mutex\n"); 63862306a36Sopenharmony_ci return; 63962306a36Sopenharmony_ci } 64062306a36Sopenharmony_ci 64162306a36Sopenharmony_ci info.count = 0; 64262306a36Sopenharmony_ci info.debug_level = ACPI_LV_TABLES; 64362306a36Sopenharmony_ci info.owner_id = owner_id; 64462306a36Sopenharmony_ci info.display_type = display_type; 64562306a36Sopenharmony_ci 64662306a36Sopenharmony_ci (void)acpi_ns_walk_namespace(type, start_handle, max_depth, 64762306a36Sopenharmony_ci ACPI_NS_WALK_NO_UNLOCK | 64862306a36Sopenharmony_ci ACPI_NS_WALK_TEMP_NODES, 64962306a36Sopenharmony_ci acpi_ns_dump_one_object, NULL, 65062306a36Sopenharmony_ci (void *)&info, NULL); 65162306a36Sopenharmony_ci 65262306a36Sopenharmony_ci acpi_os_printf("\nNamespace node count: %u\n\n", info.count); 65362306a36Sopenharmony_ci (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 65462306a36Sopenharmony_ci} 65562306a36Sopenharmony_ci 65662306a36Sopenharmony_ci/******************************************************************************* 65762306a36Sopenharmony_ci * 65862306a36Sopenharmony_ci * FUNCTION: acpi_ns_dump_one_object_path, acpi_ns_get_max_depth 65962306a36Sopenharmony_ci * 66062306a36Sopenharmony_ci * PARAMETERS: obj_handle - Node to be dumped 66162306a36Sopenharmony_ci * level - Nesting level of the handle 66262306a36Sopenharmony_ci * context - Passed into walk_namespace 66362306a36Sopenharmony_ci * return_value - Not used 66462306a36Sopenharmony_ci * 66562306a36Sopenharmony_ci * RETURN: Status 66662306a36Sopenharmony_ci * 66762306a36Sopenharmony_ci * DESCRIPTION: Dump the full pathname to a namespace object. acp_ns_get_max_depth 66862306a36Sopenharmony_ci * computes the maximum nesting depth in the namespace tree, in 66962306a36Sopenharmony_ci * order to simplify formatting in acpi_ns_dump_one_object_path. 67062306a36Sopenharmony_ci * These procedures are user_functions called by acpi_ns_walk_namespace. 67162306a36Sopenharmony_ci * 67262306a36Sopenharmony_ci ******************************************************************************/ 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_cistatic acpi_status 67562306a36Sopenharmony_ciacpi_ns_dump_one_object_path(acpi_handle obj_handle, 67662306a36Sopenharmony_ci u32 level, void *context, void **return_value) 67762306a36Sopenharmony_ci{ 67862306a36Sopenharmony_ci u32 max_level = *((u32 *)context); 67962306a36Sopenharmony_ci char *pathname; 68062306a36Sopenharmony_ci struct acpi_namespace_node *node; 68162306a36Sopenharmony_ci int path_indent; 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ci if (!obj_handle) { 68462306a36Sopenharmony_ci return (AE_OK); 68562306a36Sopenharmony_ci } 68662306a36Sopenharmony_ci 68762306a36Sopenharmony_ci node = acpi_ns_validate_handle(obj_handle); 68862306a36Sopenharmony_ci if (!node) { 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ci /* Ignore bad node during namespace walk */ 69162306a36Sopenharmony_ci 69262306a36Sopenharmony_ci return (AE_OK); 69362306a36Sopenharmony_ci } 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ci pathname = acpi_ns_get_normalized_pathname(node, TRUE); 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ci path_indent = 1; 69862306a36Sopenharmony_ci if (level <= max_level) { 69962306a36Sopenharmony_ci path_indent = max_level - level + 1; 70062306a36Sopenharmony_ci } 70162306a36Sopenharmony_ci 70262306a36Sopenharmony_ci acpi_os_printf("%2d%*s%-12s%*s", 70362306a36Sopenharmony_ci level, level, " ", acpi_ut_get_type_name(node->type), 70462306a36Sopenharmony_ci path_indent, " "); 70562306a36Sopenharmony_ci 70662306a36Sopenharmony_ci acpi_os_printf("%s\n", &pathname[1]); 70762306a36Sopenharmony_ci ACPI_FREE(pathname); 70862306a36Sopenharmony_ci return (AE_OK); 70962306a36Sopenharmony_ci} 71062306a36Sopenharmony_ci 71162306a36Sopenharmony_cistatic acpi_status 71262306a36Sopenharmony_ciacpi_ns_get_max_depth(acpi_handle obj_handle, 71362306a36Sopenharmony_ci u32 level, void *context, void **return_value) 71462306a36Sopenharmony_ci{ 71562306a36Sopenharmony_ci u32 *max_level = (u32 *)context; 71662306a36Sopenharmony_ci 71762306a36Sopenharmony_ci if (level > *max_level) { 71862306a36Sopenharmony_ci *max_level = level; 71962306a36Sopenharmony_ci } 72062306a36Sopenharmony_ci return (AE_OK); 72162306a36Sopenharmony_ci} 72262306a36Sopenharmony_ci 72362306a36Sopenharmony_ci/******************************************************************************* 72462306a36Sopenharmony_ci * 72562306a36Sopenharmony_ci * FUNCTION: acpi_ns_dump_object_paths 72662306a36Sopenharmony_ci * 72762306a36Sopenharmony_ci * PARAMETERS: type - Object type to be dumped 72862306a36Sopenharmony_ci * display_type - 0 or ACPI_DISPLAY_SUMMARY 72962306a36Sopenharmony_ci * max_depth - Maximum depth of dump. Use ACPI_UINT32_MAX 73062306a36Sopenharmony_ci * for an effectively unlimited depth. 73162306a36Sopenharmony_ci * owner_id - Dump only objects owned by this ID. Use 73262306a36Sopenharmony_ci * ACPI_UINT32_MAX to match all owners. 73362306a36Sopenharmony_ci * start_handle - Where in namespace to start/end search 73462306a36Sopenharmony_ci * 73562306a36Sopenharmony_ci * RETURN: None 73662306a36Sopenharmony_ci * 73762306a36Sopenharmony_ci * DESCRIPTION: Dump full object pathnames within the loaded namespace. Uses 73862306a36Sopenharmony_ci * acpi_ns_walk_namespace in conjunction with acpi_ns_dump_one_object_path. 73962306a36Sopenharmony_ci * 74062306a36Sopenharmony_ci ******************************************************************************/ 74162306a36Sopenharmony_ci 74262306a36Sopenharmony_civoid 74362306a36Sopenharmony_ciacpi_ns_dump_object_paths(acpi_object_type type, 74462306a36Sopenharmony_ci u8 display_type, 74562306a36Sopenharmony_ci u32 max_depth, 74662306a36Sopenharmony_ci acpi_owner_id owner_id, acpi_handle start_handle) 74762306a36Sopenharmony_ci{ 74862306a36Sopenharmony_ci acpi_status status; 74962306a36Sopenharmony_ci u32 max_level = 0; 75062306a36Sopenharmony_ci 75162306a36Sopenharmony_ci ACPI_FUNCTION_ENTRY(); 75262306a36Sopenharmony_ci 75362306a36Sopenharmony_ci /* 75462306a36Sopenharmony_ci * Just lock the entire namespace for the duration of the dump. 75562306a36Sopenharmony_ci * We don't want any changes to the namespace during this time, 75662306a36Sopenharmony_ci * especially the temporary nodes since we are going to display 75762306a36Sopenharmony_ci * them also. 75862306a36Sopenharmony_ci */ 75962306a36Sopenharmony_ci status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); 76062306a36Sopenharmony_ci if (ACPI_FAILURE(status)) { 76162306a36Sopenharmony_ci acpi_os_printf("Could not acquire namespace mutex\n"); 76262306a36Sopenharmony_ci return; 76362306a36Sopenharmony_ci } 76462306a36Sopenharmony_ci 76562306a36Sopenharmony_ci /* Get the max depth of the namespace tree, for formatting later */ 76662306a36Sopenharmony_ci 76762306a36Sopenharmony_ci (void)acpi_ns_walk_namespace(type, start_handle, max_depth, 76862306a36Sopenharmony_ci ACPI_NS_WALK_NO_UNLOCK | 76962306a36Sopenharmony_ci ACPI_NS_WALK_TEMP_NODES, 77062306a36Sopenharmony_ci acpi_ns_get_max_depth, NULL, 77162306a36Sopenharmony_ci (void *)&max_level, NULL); 77262306a36Sopenharmony_ci 77362306a36Sopenharmony_ci /* Now dump the entire namespace */ 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_ci (void)acpi_ns_walk_namespace(type, start_handle, max_depth, 77662306a36Sopenharmony_ci ACPI_NS_WALK_NO_UNLOCK | 77762306a36Sopenharmony_ci ACPI_NS_WALK_TEMP_NODES, 77862306a36Sopenharmony_ci acpi_ns_dump_one_object_path, NULL, 77962306a36Sopenharmony_ci (void *)&max_level, NULL); 78062306a36Sopenharmony_ci 78162306a36Sopenharmony_ci (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 78262306a36Sopenharmony_ci} 78362306a36Sopenharmony_ci 78462306a36Sopenharmony_ci/******************************************************************************* 78562306a36Sopenharmony_ci * 78662306a36Sopenharmony_ci * FUNCTION: acpi_ns_dump_entry 78762306a36Sopenharmony_ci * 78862306a36Sopenharmony_ci * PARAMETERS: handle - Node to be dumped 78962306a36Sopenharmony_ci * debug_level - Output level 79062306a36Sopenharmony_ci * 79162306a36Sopenharmony_ci * RETURN: None 79262306a36Sopenharmony_ci * 79362306a36Sopenharmony_ci * DESCRIPTION: Dump a single Node 79462306a36Sopenharmony_ci * 79562306a36Sopenharmony_ci ******************************************************************************/ 79662306a36Sopenharmony_ci 79762306a36Sopenharmony_civoid acpi_ns_dump_entry(acpi_handle handle, u32 debug_level) 79862306a36Sopenharmony_ci{ 79962306a36Sopenharmony_ci struct acpi_walk_info info; 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_ci ACPI_FUNCTION_ENTRY(); 80262306a36Sopenharmony_ci 80362306a36Sopenharmony_ci info.debug_level = debug_level; 80462306a36Sopenharmony_ci info.owner_id = ACPI_OWNER_ID_MAX; 80562306a36Sopenharmony_ci info.display_type = ACPI_DISPLAY_SUMMARY; 80662306a36Sopenharmony_ci 80762306a36Sopenharmony_ci (void)acpi_ns_dump_one_object(handle, 1, &info, NULL); 80862306a36Sopenharmony_ci} 80962306a36Sopenharmony_ci 81062306a36Sopenharmony_ci#ifdef ACPI_ASL_COMPILER 81162306a36Sopenharmony_ci/******************************************************************************* 81262306a36Sopenharmony_ci * 81362306a36Sopenharmony_ci * FUNCTION: acpi_ns_dump_tables 81462306a36Sopenharmony_ci * 81562306a36Sopenharmony_ci * PARAMETERS: search_base - Root of subtree to be dumped, or 81662306a36Sopenharmony_ci * NS_ALL to dump the entire namespace 81762306a36Sopenharmony_ci * max_depth - Maximum depth of dump. Use INT_MAX 81862306a36Sopenharmony_ci * for an effectively unlimited depth. 81962306a36Sopenharmony_ci * 82062306a36Sopenharmony_ci * RETURN: None 82162306a36Sopenharmony_ci * 82262306a36Sopenharmony_ci * DESCRIPTION: Dump the name space, or a portion of it. 82362306a36Sopenharmony_ci * 82462306a36Sopenharmony_ci ******************************************************************************/ 82562306a36Sopenharmony_ci 82662306a36Sopenharmony_civoid acpi_ns_dump_tables(acpi_handle search_base, u32 max_depth) 82762306a36Sopenharmony_ci{ 82862306a36Sopenharmony_ci acpi_handle search_handle = search_base; 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_ci ACPI_FUNCTION_TRACE(ns_dump_tables); 83162306a36Sopenharmony_ci 83262306a36Sopenharmony_ci if (!acpi_gbl_root_node) { 83362306a36Sopenharmony_ci /* 83462306a36Sopenharmony_ci * If the name space has not been initialized, 83562306a36Sopenharmony_ci * there is nothing to dump. 83662306a36Sopenharmony_ci */ 83762306a36Sopenharmony_ci ACPI_DEBUG_PRINT((ACPI_DB_TABLES, 83862306a36Sopenharmony_ci "namespace not initialized!\n")); 83962306a36Sopenharmony_ci return_VOID; 84062306a36Sopenharmony_ci } 84162306a36Sopenharmony_ci 84262306a36Sopenharmony_ci if (ACPI_NS_ALL == search_base) { 84362306a36Sopenharmony_ci 84462306a36Sopenharmony_ci /* Entire namespace */ 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_ci search_handle = acpi_gbl_root_node; 84762306a36Sopenharmony_ci ACPI_DEBUG_PRINT((ACPI_DB_TABLES, "\\\n")); 84862306a36Sopenharmony_ci } 84962306a36Sopenharmony_ci 85062306a36Sopenharmony_ci acpi_ns_dump_objects(ACPI_TYPE_ANY, ACPI_DISPLAY_OBJECTS, max_depth, 85162306a36Sopenharmony_ci ACPI_OWNER_ID_MAX, search_handle); 85262306a36Sopenharmony_ci return_VOID; 85362306a36Sopenharmony_ci} 85462306a36Sopenharmony_ci#endif 85562306a36Sopenharmony_ci#endif 856