1a159c266SJung-uk Kim /******************************************************************************* 2a159c266SJung-uk Kim * 3a159c266SJung-uk Kim * Module Name: nsnames - Name manipulation and search 4a159c266SJung-uk Kim * 5a159c266SJung-uk Kim ******************************************************************************/ 6a159c266SJung-uk Kim 7a159c266SJung-uk Kim /* 8*f8146b88SJung-uk Kim * Copyright (C) 2000 - 2016, Intel Corp. 9a159c266SJung-uk Kim * All rights reserved. 10a159c266SJung-uk Kim * 11a159c266SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12a159c266SJung-uk Kim * modification, are permitted provided that the following conditions 13a159c266SJung-uk Kim * are met: 14a159c266SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15a159c266SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16a159c266SJung-uk Kim * without modification. 17a159c266SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18a159c266SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19a159c266SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20a159c266SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21a159c266SJung-uk Kim * binary redistribution. 22a159c266SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23a159c266SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24a159c266SJung-uk Kim * from this software without specific prior written permission. 25a159c266SJung-uk Kim * 26a159c266SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27a159c266SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28a159c266SJung-uk Kim * Software Foundation. 29a159c266SJung-uk Kim * 30a159c266SJung-uk Kim * NO WARRANTY 31a159c266SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32a159c266SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33a159c266SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34a159c266SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35a159c266SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36a159c266SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37a159c266SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38a159c266SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39a159c266SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40a159c266SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41a159c266SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42a159c266SJung-uk Kim */ 43a159c266SJung-uk Kim 44a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 45a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 46a159c266SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 47a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 48a159c266SJung-uk Kim 49a159c266SJung-uk Kim 50a159c266SJung-uk Kim #define _COMPONENT ACPI_NAMESPACE 51a159c266SJung-uk Kim ACPI_MODULE_NAME ("nsnames") 52a159c266SJung-uk Kim 53a159c266SJung-uk Kim 54a159c266SJung-uk Kim /******************************************************************************* 55a159c266SJung-uk Kim * 56a159c266SJung-uk Kim * FUNCTION: AcpiNsGetExternalPathname 57a159c266SJung-uk Kim * 58a159c266SJung-uk Kim * PARAMETERS: Node - Namespace node whose pathname is needed 59a159c266SJung-uk Kim * 60a159c266SJung-uk Kim * RETURN: Pointer to storage containing the fully qualified name of 61a159c266SJung-uk Kim * the node, In external format (name segments separated by path 62a159c266SJung-uk Kim * separators.) 63a159c266SJung-uk Kim * 64a159c266SJung-uk Kim * DESCRIPTION: Used to obtain the full pathname to a namespace node, usually 65a159c266SJung-uk Kim * for error and debug statements. 66a159c266SJung-uk Kim * 67a159c266SJung-uk Kim ******************************************************************************/ 68a159c266SJung-uk Kim 69a159c266SJung-uk Kim char * 70a159c266SJung-uk Kim AcpiNsGetExternalPathname ( 71a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node) 72a159c266SJung-uk Kim { 73a159c266SJung-uk Kim char *NameBuffer; 74a159c266SJung-uk Kim 75a159c266SJung-uk Kim 76a159c266SJung-uk Kim ACPI_FUNCTION_TRACE_PTR (NsGetExternalPathname, Node); 77a159c266SJung-uk Kim 78a159c266SJung-uk Kim 79fe0f0bbbSJung-uk Kim NameBuffer = AcpiNsGetNormalizedPathname (Node, FALSE); 80a159c266SJung-uk Kim return_PTR (NameBuffer); 81a159c266SJung-uk Kim } 82a159c266SJung-uk Kim 83a159c266SJung-uk Kim 84a159c266SJung-uk Kim /******************************************************************************* 85a159c266SJung-uk Kim * 86a159c266SJung-uk Kim * FUNCTION: AcpiNsGetPathnameLength 87a159c266SJung-uk Kim * 88a159c266SJung-uk Kim * PARAMETERS: Node - Namespace node 89a159c266SJung-uk Kim * 90a159c266SJung-uk Kim * RETURN: Length of path, including prefix 91a159c266SJung-uk Kim * 92a159c266SJung-uk Kim * DESCRIPTION: Get the length of the pathname string for this node 93a159c266SJung-uk Kim * 94a159c266SJung-uk Kim ******************************************************************************/ 95a159c266SJung-uk Kim 96a159c266SJung-uk Kim ACPI_SIZE 97a159c266SJung-uk Kim AcpiNsGetPathnameLength ( 98a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node) 99a159c266SJung-uk Kim { 100a159c266SJung-uk Kim ACPI_SIZE Size; 101a159c266SJung-uk Kim 102a159c266SJung-uk Kim 103a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 104a159c266SJung-uk Kim 105a159c266SJung-uk Kim 106fe0f0bbbSJung-uk Kim Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, FALSE); 107fe0f0bbbSJung-uk Kim return (Size); 108a159c266SJung-uk Kim } 109a159c266SJung-uk Kim 110a159c266SJung-uk Kim 111a159c266SJung-uk Kim /******************************************************************************* 112a159c266SJung-uk Kim * 113a159c266SJung-uk Kim * FUNCTION: AcpiNsHandleToPathname 114a159c266SJung-uk Kim * 115a159c266SJung-uk Kim * PARAMETERS: TargetHandle - Handle of named object whose name is 116a159c266SJung-uk Kim * to be found 117a159c266SJung-uk Kim * Buffer - Where the pathname is returned 118fe0f0bbbSJung-uk Kim * NoTrailing - Remove trailing '_' for each name 119fe0f0bbbSJung-uk Kim * segment 120a159c266SJung-uk Kim * 121a159c266SJung-uk Kim * RETURN: Status, Buffer is filled with pathname if status is AE_OK 122a159c266SJung-uk Kim * 123a159c266SJung-uk Kim * DESCRIPTION: Build and return a full namespace pathname 124a159c266SJung-uk Kim * 125a159c266SJung-uk Kim ******************************************************************************/ 126a159c266SJung-uk Kim 127a159c266SJung-uk Kim ACPI_STATUS 128a159c266SJung-uk Kim AcpiNsHandleToPathname ( 129a159c266SJung-uk Kim ACPI_HANDLE TargetHandle, 130fe0f0bbbSJung-uk Kim ACPI_BUFFER *Buffer, 131fe0f0bbbSJung-uk Kim BOOLEAN NoTrailing) 132a159c266SJung-uk Kim { 133a159c266SJung-uk Kim ACPI_STATUS Status; 134a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 135a159c266SJung-uk Kim ACPI_SIZE RequiredSize; 136a159c266SJung-uk Kim 137a159c266SJung-uk Kim 138a159c266SJung-uk Kim ACPI_FUNCTION_TRACE_PTR (NsHandleToPathname, TargetHandle); 139a159c266SJung-uk Kim 140a159c266SJung-uk Kim 141a159c266SJung-uk Kim Node = AcpiNsValidateHandle (TargetHandle); 142a159c266SJung-uk Kim if (!Node) 143a159c266SJung-uk Kim { 144a159c266SJung-uk Kim return_ACPI_STATUS (AE_BAD_PARAMETER); 145a159c266SJung-uk Kim } 146a159c266SJung-uk Kim 147a159c266SJung-uk Kim /* Determine size required for the caller buffer */ 148a159c266SJung-uk Kim 149fe0f0bbbSJung-uk Kim RequiredSize = AcpiNsBuildNormalizedPath (Node, NULL, 0, NoTrailing); 150a159c266SJung-uk Kim if (!RequiredSize) 151a159c266SJung-uk Kim { 152a159c266SJung-uk Kim return_ACPI_STATUS (AE_BAD_PARAMETER); 153a159c266SJung-uk Kim } 154a159c266SJung-uk Kim 155a159c266SJung-uk Kim /* Validate/Allocate/Clear caller buffer */ 156a159c266SJung-uk Kim 157a159c266SJung-uk Kim Status = AcpiUtInitializeBuffer (Buffer, RequiredSize); 158a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 159a159c266SJung-uk Kim { 160a159c266SJung-uk Kim return_ACPI_STATUS (Status); 161a159c266SJung-uk Kim } 162a159c266SJung-uk Kim 163a159c266SJung-uk Kim /* Build the path in the caller buffer */ 164a159c266SJung-uk Kim 165fe0f0bbbSJung-uk Kim (void) AcpiNsBuildNormalizedPath (Node, Buffer->Pointer, 166fe0f0bbbSJung-uk Kim RequiredSize, NoTrailing); 167a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 168a159c266SJung-uk Kim { 169a159c266SJung-uk Kim return_ACPI_STATUS (Status); 170a159c266SJung-uk Kim } 171a159c266SJung-uk Kim 172a159c266SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s [%X]\n", 173a159c266SJung-uk Kim (char *) Buffer->Pointer, (UINT32) RequiredSize)); 174a159c266SJung-uk Kim return_ACPI_STATUS (AE_OK); 175a159c266SJung-uk Kim } 176fe0f0bbbSJung-uk Kim 177fe0f0bbbSJung-uk Kim 178fe0f0bbbSJung-uk Kim /******************************************************************************* 179fe0f0bbbSJung-uk Kim * 180fe0f0bbbSJung-uk Kim * FUNCTION: AcpiNsBuildNormalizedPath 181fe0f0bbbSJung-uk Kim * 182fe0f0bbbSJung-uk Kim * PARAMETERS: Node - Namespace node 183fe0f0bbbSJung-uk Kim * FullPath - Where the path name is returned 184fe0f0bbbSJung-uk Kim * PathSize - Size of returned path name buffer 185fe0f0bbbSJung-uk Kim * NoTrailing - Remove trailing '_' from each name segment 186fe0f0bbbSJung-uk Kim * 187fe0f0bbbSJung-uk Kim * RETURN: Return 1 if the AML path is empty, otherwise returning (length 188fe0f0bbbSJung-uk Kim * of pathname + 1) which means the 'FullPath' contains a trailing 189fe0f0bbbSJung-uk Kim * null. 190fe0f0bbbSJung-uk Kim * 191fe0f0bbbSJung-uk Kim * DESCRIPTION: Build and return a full namespace pathname. 192fe0f0bbbSJung-uk Kim * Note that if the size of 'FullPath' isn't large enough to 193fe0f0bbbSJung-uk Kim * contain the namespace node's path name, the actual required 194fe0f0bbbSJung-uk Kim * buffer length is returned, and it should be greater than 195fe0f0bbbSJung-uk Kim * 'PathSize'. So callers are able to check the returning value 196fe0f0bbbSJung-uk Kim * to determine the buffer size of 'FullPath'. 197fe0f0bbbSJung-uk Kim * 198fe0f0bbbSJung-uk Kim ******************************************************************************/ 199fe0f0bbbSJung-uk Kim 200fe0f0bbbSJung-uk Kim UINT32 201fe0f0bbbSJung-uk Kim AcpiNsBuildNormalizedPath ( 202fe0f0bbbSJung-uk Kim ACPI_NAMESPACE_NODE *Node, 203fe0f0bbbSJung-uk Kim char *FullPath, 204fe0f0bbbSJung-uk Kim UINT32 PathSize, 205fe0f0bbbSJung-uk Kim BOOLEAN NoTrailing) 206fe0f0bbbSJung-uk Kim { 207fe0f0bbbSJung-uk Kim UINT32 Length = 0, i; 208fe0f0bbbSJung-uk Kim char Name[ACPI_NAME_SIZE]; 209fe0f0bbbSJung-uk Kim BOOLEAN DoNoTrailing; 210fe0f0bbbSJung-uk Kim char c, *Left, *Right; 211fe0f0bbbSJung-uk Kim ACPI_NAMESPACE_NODE *NextNode; 212fe0f0bbbSJung-uk Kim 213fe0f0bbbSJung-uk Kim 214fe0f0bbbSJung-uk Kim ACPI_FUNCTION_TRACE_PTR (NsBuildNormalizedPath, Node); 215fe0f0bbbSJung-uk Kim 216fe0f0bbbSJung-uk Kim 217fe0f0bbbSJung-uk Kim #define ACPI_PATH_PUT8(Path, Size, Byte, Length) \ 218fe0f0bbbSJung-uk Kim do { \ 219fe0f0bbbSJung-uk Kim if ((Length) < (Size)) \ 220fe0f0bbbSJung-uk Kim { \ 221fe0f0bbbSJung-uk Kim (Path)[(Length)] = (Byte); \ 222fe0f0bbbSJung-uk Kim } \ 223fe0f0bbbSJung-uk Kim (Length)++; \ 224fe0f0bbbSJung-uk Kim } while (0) 225fe0f0bbbSJung-uk Kim 226fe0f0bbbSJung-uk Kim /* 227fe0f0bbbSJung-uk Kim * Make sure the PathSize is correct, so that we don't need to 228fe0f0bbbSJung-uk Kim * validate both FullPath and PathSize. 229fe0f0bbbSJung-uk Kim */ 230fe0f0bbbSJung-uk Kim if (!FullPath) 231fe0f0bbbSJung-uk Kim { 232fe0f0bbbSJung-uk Kim PathSize = 0; 233fe0f0bbbSJung-uk Kim } 234fe0f0bbbSJung-uk Kim 235fe0f0bbbSJung-uk Kim if (!Node) 236fe0f0bbbSJung-uk Kim { 237fe0f0bbbSJung-uk Kim goto BuildTrailingNull; 238fe0f0bbbSJung-uk Kim } 239fe0f0bbbSJung-uk Kim 240fe0f0bbbSJung-uk Kim NextNode = Node; 241fe0f0bbbSJung-uk Kim while (NextNode && NextNode != AcpiGbl_RootNode) 242fe0f0bbbSJung-uk Kim { 243fe0f0bbbSJung-uk Kim if (NextNode != Node) 244fe0f0bbbSJung-uk Kim { 245fe0f0bbbSJung-uk Kim ACPI_PATH_PUT8(FullPath, PathSize, AML_DUAL_NAME_PREFIX, Length); 246fe0f0bbbSJung-uk Kim } 247*f8146b88SJung-uk Kim 248fe0f0bbbSJung-uk Kim ACPI_MOVE_32_TO_32 (Name, &NextNode->Name); 249fe0f0bbbSJung-uk Kim DoNoTrailing = NoTrailing; 250fe0f0bbbSJung-uk Kim for (i = 0; i < 4; i++) 251fe0f0bbbSJung-uk Kim { 252fe0f0bbbSJung-uk Kim c = Name[4-i-1]; 253fe0f0bbbSJung-uk Kim if (DoNoTrailing && c != '_') 254fe0f0bbbSJung-uk Kim { 255fe0f0bbbSJung-uk Kim DoNoTrailing = FALSE; 256fe0f0bbbSJung-uk Kim } 257fe0f0bbbSJung-uk Kim if (!DoNoTrailing) 258fe0f0bbbSJung-uk Kim { 259fe0f0bbbSJung-uk Kim ACPI_PATH_PUT8(FullPath, PathSize, c, Length); 260fe0f0bbbSJung-uk Kim } 261fe0f0bbbSJung-uk Kim } 262*f8146b88SJung-uk Kim 263fe0f0bbbSJung-uk Kim NextNode = NextNode->Parent; 264fe0f0bbbSJung-uk Kim } 265*f8146b88SJung-uk Kim 266fe0f0bbbSJung-uk Kim ACPI_PATH_PUT8(FullPath, PathSize, AML_ROOT_PREFIX, Length); 267fe0f0bbbSJung-uk Kim 268fe0f0bbbSJung-uk Kim /* Reverse the path string */ 269fe0f0bbbSJung-uk Kim 270fe0f0bbbSJung-uk Kim if (Length <= PathSize) 271fe0f0bbbSJung-uk Kim { 272fe0f0bbbSJung-uk Kim Left = FullPath; 273fe0f0bbbSJung-uk Kim Right = FullPath+Length - 1; 274*f8146b88SJung-uk Kim 275fe0f0bbbSJung-uk Kim while (Left < Right) 276fe0f0bbbSJung-uk Kim { 277fe0f0bbbSJung-uk Kim c = *Left; 278fe0f0bbbSJung-uk Kim *Left++ = *Right; 279fe0f0bbbSJung-uk Kim *Right-- = c; 280fe0f0bbbSJung-uk Kim } 281fe0f0bbbSJung-uk Kim } 282fe0f0bbbSJung-uk Kim 283fe0f0bbbSJung-uk Kim /* Append the trailing null */ 284fe0f0bbbSJung-uk Kim 285fe0f0bbbSJung-uk Kim BuildTrailingNull: 286fe0f0bbbSJung-uk Kim ACPI_PATH_PUT8 (FullPath, PathSize, '\0', Length); 287fe0f0bbbSJung-uk Kim 288fe0f0bbbSJung-uk Kim #undef ACPI_PATH_PUT8 289fe0f0bbbSJung-uk Kim 290fe0f0bbbSJung-uk Kim return_UINT32 (Length); 291fe0f0bbbSJung-uk Kim } 292fe0f0bbbSJung-uk Kim 293fe0f0bbbSJung-uk Kim 294fe0f0bbbSJung-uk Kim /******************************************************************************* 295fe0f0bbbSJung-uk Kim * 296fe0f0bbbSJung-uk Kim * FUNCTION: AcpiNsGetNormalizedPathname 297fe0f0bbbSJung-uk Kim * 298fe0f0bbbSJung-uk Kim * PARAMETERS: Node - Namespace node whose pathname is needed 299fe0f0bbbSJung-uk Kim * NoTrailing - Remove trailing '_' from each name segment 300fe0f0bbbSJung-uk Kim * 301fe0f0bbbSJung-uk Kim * RETURN: Pointer to storage containing the fully qualified name of 302fe0f0bbbSJung-uk Kim * the node, In external format (name segments separated by path 303fe0f0bbbSJung-uk Kim * separators.) 304fe0f0bbbSJung-uk Kim * 305fe0f0bbbSJung-uk Kim * DESCRIPTION: Used to obtain the full pathname to a namespace node, usually 306fe0f0bbbSJung-uk Kim * for error and debug statements. All trailing '_' will be 307fe0f0bbbSJung-uk Kim * removed from the full pathname if 'NoTrailing' is specified.. 308fe0f0bbbSJung-uk Kim * 309fe0f0bbbSJung-uk Kim ******************************************************************************/ 310fe0f0bbbSJung-uk Kim 311fe0f0bbbSJung-uk Kim char * 312fe0f0bbbSJung-uk Kim AcpiNsGetNormalizedPathname ( 313fe0f0bbbSJung-uk Kim ACPI_NAMESPACE_NODE *Node, 314fe0f0bbbSJung-uk Kim BOOLEAN NoTrailing) 315fe0f0bbbSJung-uk Kim { 316fe0f0bbbSJung-uk Kim char *NameBuffer; 317fe0f0bbbSJung-uk Kim ACPI_SIZE Size; 318fe0f0bbbSJung-uk Kim 319fe0f0bbbSJung-uk Kim 320fe0f0bbbSJung-uk Kim ACPI_FUNCTION_TRACE_PTR (NsGetNormalizedPathname, Node); 321fe0f0bbbSJung-uk Kim 322fe0f0bbbSJung-uk Kim 323fe0f0bbbSJung-uk Kim /* Calculate required buffer size based on depth below root */ 324fe0f0bbbSJung-uk Kim 325fe0f0bbbSJung-uk Kim Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, NoTrailing); 326fe0f0bbbSJung-uk Kim if (!Size) 327fe0f0bbbSJung-uk Kim { 328fe0f0bbbSJung-uk Kim return_PTR (NULL); 329fe0f0bbbSJung-uk Kim } 330fe0f0bbbSJung-uk Kim 331fe0f0bbbSJung-uk Kim /* Allocate a buffer to be returned to caller */ 332fe0f0bbbSJung-uk Kim 333fe0f0bbbSJung-uk Kim NameBuffer = ACPI_ALLOCATE_ZEROED (Size); 334fe0f0bbbSJung-uk Kim if (!NameBuffer) 335fe0f0bbbSJung-uk Kim { 336*f8146b88SJung-uk Kim ACPI_ERROR ((AE_INFO, 337*f8146b88SJung-uk Kim "Could not allocate %u bytes", (UINT32) Size)); 338fe0f0bbbSJung-uk Kim return_PTR (NULL); 339fe0f0bbbSJung-uk Kim } 340fe0f0bbbSJung-uk Kim 341fe0f0bbbSJung-uk Kim /* Build the path in the allocated buffer */ 342fe0f0bbbSJung-uk Kim 343fe0f0bbbSJung-uk Kim (void) AcpiNsBuildNormalizedPath (Node, NameBuffer, Size, NoTrailing); 344fe0f0bbbSJung-uk Kim 345fe0f0bbbSJung-uk Kim return_PTR (NameBuffer); 346fe0f0bbbSJung-uk Kim } 347