Orange Pi5 kernel

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

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Module Name: 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) }