^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: nsutils - Utilities for accessing ACPI namespace, accessing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * parents and siblings and Scope manipulation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 2000 - 2020, Intel Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <acpi/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include "accommon.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include "acnamesp.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include "amlcode.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define _COMPONENT ACPI_NAMESPACE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) ACPI_MODULE_NAME("nsutils")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) /* Local prototypes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #ifdef ACPI_OBSOLETE_FUNCTIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) acpi_name acpi_ns_find_parent_name(struct acpi_namespace_node *node_to_search);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * FUNCTION: acpi_ns_print_node_pathname
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * PARAMETERS: node - Object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * message - Prefix message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * DESCRIPTION: Print an object's full namespace pathname
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * Manages allocation/freeing of a pathname buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) acpi_ns_print_node_pathname(struct acpi_namespace_node *node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) const char *message)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) struct acpi_buffer buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) if (!node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) acpi_os_printf("[NULL NAME]");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /* Convert handle to full pathname and print it (with supplied message) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) status = acpi_ns_handle_to_pathname(node, &buffer, TRUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) if (ACPI_SUCCESS(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) if (message) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) acpi_os_printf("%s ", message);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) acpi_os_printf("%s", (char *)buffer.pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) ACPI_FREE(buffer.pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * FUNCTION: acpi_ns_get_type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * PARAMETERS: node - Parent Node to be examined
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * RETURN: Type field from Node whose handle is passed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * DESCRIPTION: Return the type of a Namespace node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) acpi_object_type acpi_ns_get_type(struct acpi_namespace_node * node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) ACPI_FUNCTION_TRACE(ns_get_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) if (!node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) ACPI_WARNING((AE_INFO, "Null Node parameter"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) return_UINT8(ACPI_TYPE_ANY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) return_UINT8(node->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) }
^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) * FUNCTION: acpi_ns_local
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) * PARAMETERS: type - A namespace object type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) * RETURN: LOCAL if names must be found locally in objects of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * passed type, 0 if enclosing scopes should be searched
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * DESCRIPTION: Returns scope rule for the given object type.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) *
^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) u32 acpi_ns_local(acpi_object_type type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) ACPI_FUNCTION_TRACE(ns_local);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) if (!acpi_ut_valid_object_type(type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) /* Type code out of range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) ACPI_WARNING((AE_INFO, "Invalid Object Type 0x%X", type));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) return_UINT32(ACPI_NS_NORMAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) return_UINT32(acpi_gbl_ns_properties[type] & ACPI_NS_LOCAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) * FUNCTION: acpi_ns_get_internal_name_length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) * PARAMETERS: info - Info struct initialized with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) * external name pointer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) * RETURN: None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) * DESCRIPTION: Calculate the length of the internal (AML) namestring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) * corresponding to the external (ASL) namestring.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) void acpi_ns_get_internal_name_length(struct acpi_namestring_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) const char *next_external_char;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) ACPI_FUNCTION_ENTRY();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) next_external_char = info->external_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) info->num_carats = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) info->num_segments = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) info->fully_qualified = FALSE;
^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) * For the internal name, the required length is 4 bytes per segment,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) * plus 1 each for root_prefix, multi_name_prefix_op, segment count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) * trailing null (which is not really needed, but no there's harm in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) * putting it there)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) * strlen() + 1 covers the first name_seg, which has no path separator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) if (ACPI_IS_ROOT_PREFIX(*next_external_char)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) info->fully_qualified = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) next_external_char++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) /* Skip redundant root_prefix, like \\_SB.PCI0.SBRG.EC0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) while (ACPI_IS_ROOT_PREFIX(*next_external_char)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) next_external_char++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /* Handle Carat prefixes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) while (ACPI_IS_PARENT_PREFIX(*next_external_char)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) info->num_carats++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) next_external_char++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) * Determine the number of ACPI name "segments" by counting the number of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * path separators within the string. Start with one segment since the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) * segment count is [(# separators) + 1], and zero separators is ok.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) if (*next_external_char) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) info->num_segments = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) for (i = 0; next_external_char[i]; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) if (ACPI_IS_PATH_SEPARATOR(next_external_char[i])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) info->num_segments++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) info->length = (ACPI_NAMESEG_SIZE * info->num_segments) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 4 + info->num_carats;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) info->next_external_char = next_external_char;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) * FUNCTION: acpi_ns_build_internal_name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) * PARAMETERS: info - Info struct fully initialized
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) * DESCRIPTION: Construct the internal (AML) namestring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) * corresponding to the external (ASL) namestring.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) u32 num_segments = info->num_segments;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) char *internal_name = info->internal_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) const char *external_name = info->next_external_char;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) char *result = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) u32 i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) ACPI_FUNCTION_TRACE(ns_build_internal_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) /* Setup the correct prefixes, counts, and pointers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) if (info->fully_qualified) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) internal_name[0] = AML_ROOT_PREFIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) if (num_segments <= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) result = &internal_name[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) } else if (num_segments == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) internal_name[1] = AML_DUAL_NAME_PREFIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) result = &internal_name[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) internal_name[1] = AML_MULTI_NAME_PREFIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) internal_name[2] = (char)num_segments;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) result = &internal_name[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) * Not fully qualified.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) * Handle Carats first, then append the name segments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) if (info->num_carats) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) for (i = 0; i < info->num_carats; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) internal_name[i] = AML_PARENT_PREFIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) if (num_segments <= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) result = &internal_name[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) } else if (num_segments == 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) internal_name[i] = AML_DUAL_NAME_PREFIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) result = &internal_name[(acpi_size)i + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) internal_name[i] = AML_MULTI_NAME_PREFIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) internal_name[(acpi_size)i + 1] = (char)num_segments;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) result = &internal_name[(acpi_size)i + 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) /* Build the name (minus path separators) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) for (; num_segments; num_segments--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) for (i = 0; i < ACPI_NAMESEG_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) if (ACPI_IS_PATH_SEPARATOR(*external_name) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) (*external_name == 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) /* Pad the segment with underscore(s) if segment is short */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) result[i] = '_';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) /* Convert the character to uppercase and save it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) result[i] = (char)toupper((int)*external_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) external_name++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) }
^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) /* Now we must have a path separator, or the pathname is bad */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) if (!ACPI_IS_PATH_SEPARATOR(*external_name) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) (*external_name != 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) return_ACPI_STATUS(AE_BAD_PATHNAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) /* Move on the next segment */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) external_name++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) result += ACPI_NAMESEG_SIZE;
^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) /* Terminate the string */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) *result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) if (info->fully_qualified) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) "Returning [%p] (abs) \"\\%s\"\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) internal_name, internal_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Returning [%p] (rel) \"%s\"\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) internal_name, internal_name));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) * FUNCTION: acpi_ns_internalize_name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) * PARAMETERS: *external_name - External representation of name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) * **Converted name - Where to return the resulting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) * internal represention of the name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) * DESCRIPTION: Convert an external representation (e.g. "\_PR_.CPU0")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) * to internal form (e.g. 5c 2f 02 5f 50 52 5f 43 50 55 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) *******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) acpi_ns_internalize_name(const char *external_name, char **converted_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) char *internal_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) struct acpi_namestring_info info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) ACPI_FUNCTION_TRACE(ns_internalize_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) if ((!external_name) || (*external_name == 0) || (!converted_name)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) return_ACPI_STATUS(AE_BAD_PARAMETER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) /* Get the length of the new internal name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) info.external_name = external_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) acpi_ns_get_internal_name_length(&info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) /* We need a segment to store the internal name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) internal_name = ACPI_ALLOCATE_ZEROED(info.length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) if (!internal_name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) return_ACPI_STATUS(AE_NO_MEMORY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) /* Build the name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) info.internal_name = internal_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) status = acpi_ns_build_internal_name(&info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) ACPI_FREE(internal_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) *converted_name = internal_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) * FUNCTION: acpi_ns_externalize_name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) * PARAMETERS: internal_name_length - Length of the internal name below
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) * internal_name - Internal representation of name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) * converted_name_length - Where the length is returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) * converted_name - Where the resulting external name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) * is returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) * RETURN: Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) * DESCRIPTION: Convert internal name (e.g. 5c 2f 02 5f 50 52 5f 43 50 55 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) * to its external (printable) form (e.g. "\_PR_.CPU0")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) acpi_ns_externalize_name(u32 internal_name_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) const char *internal_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) u32 * converted_name_length, char **converted_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) u32 names_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) u32 num_segments = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) u32 required_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) u32 prefix_length = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) u32 i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) u32 j = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) ACPI_FUNCTION_TRACE(ns_externalize_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) if (!internal_name_length || !internal_name || !converted_name) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) return_ACPI_STATUS(AE_BAD_PARAMETER);
^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) /* Check for a prefix (one '\' | one or more '^') */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) switch (internal_name[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) case AML_ROOT_PREFIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) prefix_length = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) case AML_PARENT_PREFIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) for (i = 0; i < internal_name_length; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) if (ACPI_IS_PARENT_PREFIX(internal_name[i])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) prefix_length = i + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) if (i == internal_name_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) prefix_length = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) break;
^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) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) * Check for object names. Note that there could be 0-255 of these
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) * 4-byte elements.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) if (prefix_length < internal_name_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) switch (internal_name[prefix_length]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) case AML_MULTI_NAME_PREFIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) /* <count> 4-byte names */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) names_index = prefix_length + 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) num_segments = (u8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) internal_name[(acpi_size)prefix_length + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) case AML_DUAL_NAME_PREFIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) /* Two 4-byte names */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) names_index = prefix_length + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) num_segments = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /* null_name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) names_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) num_segments = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) /* one 4-byte name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) names_index = prefix_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) num_segments = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) * Calculate the length of converted_name, which equals the length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) * of the prefix, length of all object names, length of any required
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) * punctuation ('.') between object names, plus the NULL terminator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) required_length = prefix_length + (4 * num_segments) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) ((num_segments > 0) ? (num_segments - 1) : 0) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) * Check to see if we're still in bounds. If not, there's a problem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) * with internal_name (invalid format).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) if (required_length > internal_name_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) ACPI_ERROR((AE_INFO, "Invalid internal name"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) return_ACPI_STATUS(AE_BAD_PATHNAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) /* Build the converted_name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) *converted_name = ACPI_ALLOCATE_ZEROED(required_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) if (!(*converted_name)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) return_ACPI_STATUS(AE_NO_MEMORY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) j = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) for (i = 0; i < prefix_length; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) (*converted_name)[j++] = internal_name[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) if (num_segments > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) for (i = 0; i < num_segments; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) if (i > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) (*converted_name)[j++] = '.';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) /* Copy and validate the 4-char name segment */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) ACPI_COPY_NAMESEG(&(*converted_name)[j],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) &internal_name[names_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) acpi_ut_repair_name(&(*converted_name)[j]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) j += ACPI_NAMESEG_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) names_index += ACPI_NAMESEG_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) if (converted_name_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) *converted_name_length = (u32) required_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) return_ACPI_STATUS(AE_OK);
^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) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) * FUNCTION: acpi_ns_validate_handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) * PARAMETERS: handle - Handle to be validated and typecast to a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) * namespace node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) * RETURN: A pointer to a namespace node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) * DESCRIPTION: Convert a namespace handle to a namespace node. Handles special
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) * cases for the root node.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) * NOTE: Real integer handles would allow for more verification
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) * and keep all pointers within this subsystem - however this introduces
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) * more overhead and has not been necessary to this point. Drivers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) * holding handles are typically notified before a node becomes invalid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) * due to a table unload.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) struct acpi_namespace_node *acpi_ns_validate_handle(acpi_handle handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) ACPI_FUNCTION_ENTRY();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) /* Parameter validation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) if ((!handle) || (handle == ACPI_ROOT_OBJECT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) return (acpi_gbl_root_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) /* We can at least attempt to verify the handle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) if (ACPI_GET_DESCRIPTOR_TYPE(handle) != ACPI_DESC_TYPE_NAMED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) return (NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) return (ACPI_CAST_PTR(struct acpi_namespace_node, handle));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) }
^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) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) * FUNCTION: acpi_ns_terminate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) * PARAMETERS: none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) * RETURN: none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) * DESCRIPTION: free memory allocated for namespace and ACPI table storage.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) void acpi_ns_terminate(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) ACPI_FUNCTION_TRACE(ns_terminate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) * Free the entire namespace -- all nodes and all objects
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) * attached to the nodes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) acpi_ns_delete_namespace_subtree(acpi_gbl_root_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) /* Delete any objects attached to the root node */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) return_VOID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) acpi_ns_delete_node(acpi_gbl_root_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Namespace freed\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) return_VOID;
^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_ns_opens_scope
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) * PARAMETERS: type - A valid namespace type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) * RETURN: NEWSCOPE if the passed type "opens a name scope" according
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) * to the ACPI specification, else 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) *
^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) u32 acpi_ns_opens_scope(acpi_object_type type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) ACPI_FUNCTION_ENTRY();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) if (type > ACPI_TYPE_LOCAL_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) /* type code out of range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) ACPI_WARNING((AE_INFO, "Invalid Object Type 0x%X", type));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) return (ACPI_NS_NORMAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) return (((u32)acpi_gbl_ns_properties[type]) & ACPI_NS_NEWSCOPE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) * FUNCTION: acpi_ns_get_node_unlocked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) * PARAMETERS: *pathname - Name to be found, in external (ASL) format. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) * \ (backslash) and ^ (carat) prefixes, and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) * . (period) to separate segments are supported.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) * prefix_node - Root of subtree to be searched, or NS_ALL for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) * root of the name space. If Name is fully
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) * qualified (first s8 is '\'), the passed value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) * of Scope will not be accessed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) * flags - Used to indicate whether to perform upsearch or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) * not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) * return_node - Where the Node is returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) * DESCRIPTION: Look up a name relative to a given scope and return the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) * corresponding Node. NOTE: Scope can be null.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) * MUTEX: Doesn't locks namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) acpi_ns_get_node_unlocked(struct acpi_namespace_node *prefix_node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) const char *pathname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) u32 flags, struct acpi_namespace_node **return_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) union acpi_generic_state scope_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) char *internal_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) ACPI_FUNCTION_TRACE_PTR(ns_get_node_unlocked,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) ACPI_CAST_PTR(char, pathname));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) /* Simplest case is a null pathname */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) if (!pathname) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) *return_node = prefix_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) if (!prefix_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) *return_node = acpi_gbl_root_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) /* Quick check for a reference to the root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) if (ACPI_IS_ROOT_PREFIX(pathname[0]) && (!pathname[1])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) *return_node = acpi_gbl_root_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) return_ACPI_STATUS(AE_OK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) /* Convert path to internal representation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) status = acpi_ns_internalize_name(pathname, &internal_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) return_ACPI_STATUS(status);
^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) /* Setup lookup scope (search starting point) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) scope_info.scope.node = prefix_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) /* Lookup the name in the namespace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) status = acpi_ns_lookup(&scope_info, internal_path, ACPI_TYPE_ANY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) ACPI_IMODE_EXECUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) (flags | ACPI_NS_DONT_OPEN_SCOPE), NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) return_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s, %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) pathname, acpi_format_exception(status)));
^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_FREE(internal_path);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) * FUNCTION: acpi_ns_get_node
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) * PARAMETERS: *pathname - Name to be found, in external (ASL) format. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) * \ (backslash) and ^ (carat) prefixes, and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) * . (period) to separate segments are supported.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) * prefix_node - Root of subtree to be searched, or NS_ALL for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) * root of the name space. If Name is fully
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) * qualified (first s8 is '\'), the passed value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) * of Scope will not be accessed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) * flags - Used to indicate whether to perform upsearch or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) * not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) * return_node - Where the Node is returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) * DESCRIPTION: Look up a name relative to a given scope and return the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) * corresponding Node. NOTE: Scope can be null.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) * MUTEX: Locks namespace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) *
^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) acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) acpi_ns_get_node(struct acpi_namespace_node *prefix_node,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) const char *pathname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) u32 flags, struct acpi_namespace_node **return_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) acpi_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) ACPI_FUNCTION_TRACE_PTR(ns_get_node, ACPI_CAST_PTR(char, pathname));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) status = acpi_ns_get_node_unlocked(prefix_node, pathname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) flags, return_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) }