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: exnames - interpreter/scanner name load/execute
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * Copyright (C) 2000 - 2020, Intel Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *
^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) #include <acpi/acpi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include "accommon.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include "acinterp.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include "amlcode.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #define _COMPONENT          ACPI_EXECUTER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) ACPI_MODULE_NAME("exnames")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) /* Local prototypes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) static char *acpi_ex_allocate_name_string(u32 prefix_count, u32 num_name_segs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) static acpi_status acpi_ex_name_segment(u8 **in_aml_address, char *name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 
^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)  * FUNCTION:    acpi_ex_allocate_name_string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  * PARAMETERS:  prefix_count        - Count of parent levels. Special cases:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  *                                    (-1)==root,  0==none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  *              num_name_segs       - count of 4-character name segments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)  * RETURN:      A pointer to the allocated string segment. This segment must
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)  *              be deleted by the caller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)  * DESCRIPTION: Allocate a buffer for a name string. Ensure allocated name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)  *              string is long enough, and set up prefix if any.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) static char *acpi_ex_allocate_name_string(u32 prefix_count, u32 num_name_segs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	char *temp_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	char *name_string;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	u32 size_needed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	ACPI_FUNCTION_TRACE(ex_allocate_name_string);
^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) 	 * Allow room for all \ and ^ prefixes, all segments and a multi_name_prefix.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	 * Also, one byte for the null terminator.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	 * This may actually be somewhat longer than needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	if (prefix_count == ACPI_UINT32_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 		/* Special case for root */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 		size_needed = 1 + (ACPI_NAMESEG_SIZE * num_name_segs) + 2 + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 		size_needed =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 		    prefix_count + (ACPI_NAMESEG_SIZE * num_name_segs) + 2 + 1;
^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) 	 * Allocate a buffer for the name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	 * This buffer must be deleted by the caller!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	name_string = ACPI_ALLOCATE(size_needed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	if (!name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 		ACPI_ERROR((AE_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 			    "Could not allocate size %u", size_needed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		return_PTR(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	temp_ptr = name_string;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	/* Set up Root or Parent prefixes if needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	if (prefix_count == ACPI_UINT32_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 		*temp_ptr++ = AML_ROOT_PREFIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 		while (prefix_count--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 			*temp_ptr++ = AML_PARENT_PREFIX;
^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) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	/* Set up Dual or Multi prefixes if needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	if (num_name_segs > 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 		/* Set up multi prefixes   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 		*temp_ptr++ = AML_MULTI_NAME_PREFIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 		*temp_ptr++ = (char)num_name_segs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	} else if (2 == num_name_segs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 		/* Set up dual prefixes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 		*temp_ptr++ = AML_DUAL_NAME_PREFIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	 * Terminate string following prefixes. acpi_ex_name_segment() will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	 * append the segment(s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	*temp_ptr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	return_PTR(name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)  * FUNCTION:    acpi_ex_name_segment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)  * PARAMETERS:  in_aml_address  - Pointer to the name in the AML code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)  *              name_string     - Where to return the name. The name is appended
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)  *                                to any existing string to form a namepath
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)  * RETURN:      Status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)  * DESCRIPTION: Extract an ACPI name (4 bytes) from the AML byte stream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) static acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	char *aml_address = (void *)*in_aml_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	acpi_status status = AE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	u32 index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	char char_buf[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	ACPI_FUNCTION_TRACE(ex_name_segment);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	 * If first character is a digit, then we know that we aren't looking
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	 * at a valid name segment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	char_buf[0] = *aml_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	if ('0' <= char_buf[0] && char_buf[0] <= '9') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 		ACPI_ERROR((AE_INFO, "Invalid leading digit: %c", char_buf[0]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 		return_ACPI_STATUS(AE_CTRL_PENDING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	for (index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	     (index < ACPI_NAMESEG_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	     && (acpi_ut_valid_name_char(*aml_address, 0)); index++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		char_buf[index] = *aml_address++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	/* Valid name segment  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	if (index == 4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 		/* Found 4 valid characters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 		char_buf[4] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 		if (name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 			ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 					  "Appending NameSeg %s\n", char_buf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 			strcat(name_string, char_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 			ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 					  "No Name string - %s\n", char_buf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	} else if (index == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 		 * First character was not a valid name character,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 		 * so we are looking at something other than a name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 				  "Leading character is not alpha: %02Xh (not a name)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 				  char_buf[0]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 		status = AE_CTRL_PENDING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 		 * Segment started with one or more valid characters, but fewer than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 		 * the required 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 		status = AE_AML_BAD_NAME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 		ACPI_ERROR((AE_INFO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 			    "Bad character 0x%02x in name, at %p",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 			    *aml_address, aml_address));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	*in_aml_address = ACPI_CAST_PTR(u8, aml_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	return_ACPI_STATUS(status);
^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) /*******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)  * FUNCTION:    acpi_ex_get_name_string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)  * PARAMETERS:  data_type           - Object type to be associated with this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)  *                                    name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)  *              in_aml_address      - Pointer to the namestring in the AML code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)  *              out_name_string     - Where the namestring is returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)  *              out_name_length     - Length of the returned string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)  * RETURN:      Status, namestring and length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)  * DESCRIPTION: Extract a full namepath from the AML byte stream,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)  *              including any prefixes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) acpi_status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) acpi_ex_get_name_string(acpi_object_type data_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 			u8 * in_aml_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 			char **out_name_string, u32 * out_name_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	acpi_status status = AE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	u8 *aml_address = in_aml_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	char *name_string = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	u32 num_segments;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	u32 prefix_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	u8 has_prefix = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	ACPI_FUNCTION_TRACE_PTR(ex_get_name_string, aml_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	if (ACPI_TYPE_LOCAL_REGION_FIELD == data_type ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	    ACPI_TYPE_LOCAL_BANK_FIELD == data_type ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	    ACPI_TYPE_LOCAL_INDEX_FIELD == data_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 		/* Disallow prefixes for types associated with field_unit names */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 		name_string = acpi_ex_allocate_name_string(0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 		if (!name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 			status = AE_NO_MEMORY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 			status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 			    acpi_ex_name_segment(&aml_address, name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 		 * data_type is not a field name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 		 * Examine first character of name for root or parent prefix operators
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 		switch (*aml_address) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 		case AML_ROOT_PREFIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 			ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 					  "RootPrefix(\\) at %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 					  aml_address));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 			 * Remember that we have a root_prefix --
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 			 * see comment in acpi_ex_allocate_name_string()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 			aml_address++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 			prefix_count = ACPI_UINT32_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 			has_prefix = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 		case AML_PARENT_PREFIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 			/* Increment past possibly multiple parent prefixes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 			do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 				ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 						  "ParentPrefix (^) at %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 						  aml_address));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 				aml_address++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 				prefix_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 			} while (*aml_address == AML_PARENT_PREFIX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 			has_prefix = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 			/* Not a prefix character */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 		/* Examine first character of name for name segment prefix operator */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 		switch (*aml_address) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 		case AML_DUAL_NAME_PREFIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 			ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 					  "DualNamePrefix at %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 					  aml_address));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 			aml_address++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 			name_string =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 			    acpi_ex_allocate_name_string(prefix_count, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 			if (!name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 				status = AE_NO_MEMORY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 			/* Indicate that we processed a prefix */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 			has_prefix = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 			status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 			    acpi_ex_name_segment(&aml_address, name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 			if (ACPI_SUCCESS(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 				status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 				    acpi_ex_name_segment(&aml_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 							 name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 		case AML_MULTI_NAME_PREFIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 			ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 					  "MultiNamePrefix at %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 					  aml_address));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 			/* Fetch count of segments remaining in name path */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 			aml_address++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 			num_segments = *aml_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 			name_string =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 			    acpi_ex_allocate_name_string(prefix_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 							 num_segments);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 			if (!name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 				status = AE_NO_MEMORY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 			/* Indicate that we processed a prefix */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 			aml_address++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 			has_prefix = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 			while (num_segments &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 			       (status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 				acpi_ex_name_segment(&aml_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 						     name_string)) == AE_OK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 				num_segments--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 		case 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 			/* null_name valid as of 8-12-98 ASL/AML Grammar Update */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 			if (prefix_count == ACPI_UINT32_MAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 				ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 						  "NameSeg is \"\\\" followed by NULL\n"));
^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) 			/* Consume the NULL byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 			aml_address++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 			name_string =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 			    acpi_ex_allocate_name_string(prefix_count, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 			if (!name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 				status = AE_NO_MEMORY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 			/* Name segment string */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 			name_string =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 			    acpi_ex_allocate_name_string(prefix_count, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 			if (!name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 				status = AE_NO_MEMORY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 			status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 			    acpi_ex_name_segment(&aml_address, name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 	if (AE_CTRL_PENDING == status && has_prefix) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 		/* Ran out of segments after processing a prefix */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 		ACPI_ERROR((AE_INFO, "Malformed Name at %p", name_string));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 		status = AE_AML_BAD_NAME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 	if (ACPI_FAILURE(status)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 		if (name_string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 			ACPI_FREE(name_string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 		return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 	*out_name_string = name_string;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 	*out_name_length = (u32) (aml_address - in_aml_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 	return_ACPI_STATUS(status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) }