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