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 /* 81c0e1b6dSJung-uk Kim * Copyright (C) 2000 - 2015, 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 79*fe0f0bbbSJung-uk Kim NameBuffer = AcpiNsGetNormalizedPathname (Node, FALSE); 80a159c266SJung-uk Kim 81a159c266SJung-uk Kim return_PTR (NameBuffer); 82a159c266SJung-uk Kim } 83a159c266SJung-uk Kim 84a159c266SJung-uk Kim 85a159c266SJung-uk Kim /******************************************************************************* 86a159c266SJung-uk Kim * 87a159c266SJung-uk Kim * FUNCTION: AcpiNsGetPathnameLength 88a159c266SJung-uk Kim * 89a159c266SJung-uk Kim * PARAMETERS: Node - Namespace node 90a159c266SJung-uk Kim * 91a159c266SJung-uk Kim * RETURN: Length of path, including prefix 92a159c266SJung-uk Kim * 93a159c266SJung-uk Kim * DESCRIPTION: Get the length of the pathname string for this node 94a159c266SJung-uk Kim * 95a159c266SJung-uk Kim ******************************************************************************/ 96a159c266SJung-uk Kim 97a159c266SJung-uk Kim ACPI_SIZE 98a159c266SJung-uk Kim AcpiNsGetPathnameLength ( 99a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node) 100a159c266SJung-uk Kim { 101a159c266SJung-uk Kim ACPI_SIZE Size; 102a159c266SJung-uk Kim 103a159c266SJung-uk Kim 104a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 105a159c266SJung-uk Kim 106a159c266SJung-uk Kim 107*fe0f0bbbSJung-uk Kim Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, FALSE); 108a159c266SJung-uk Kim 109*fe0f0bbbSJung-uk Kim return (Size); 110a159c266SJung-uk Kim } 111a159c266SJung-uk Kim 112a159c266SJung-uk Kim 113a159c266SJung-uk Kim /******************************************************************************* 114a159c266SJung-uk Kim * 115a159c266SJung-uk Kim * FUNCTION: AcpiNsHandleToPathname 116a159c266SJung-uk Kim * 117a159c266SJung-uk Kim * PARAMETERS: TargetHandle - Handle of named object whose name is 118a159c266SJung-uk Kim * to be found 119a159c266SJung-uk Kim * Buffer - Where the pathname is returned 120*fe0f0bbbSJung-uk Kim * NoTrailing - Remove trailing '_' for each name 121*fe0f0bbbSJung-uk Kim * segment 122a159c266SJung-uk Kim * 123a159c266SJung-uk Kim * RETURN: Status, Buffer is filled with pathname if status is AE_OK 124a159c266SJung-uk Kim * 125a159c266SJung-uk Kim * DESCRIPTION: Build and return a full namespace pathname 126a159c266SJung-uk Kim * 127a159c266SJung-uk Kim ******************************************************************************/ 128a159c266SJung-uk Kim 129a159c266SJung-uk Kim ACPI_STATUS 130a159c266SJung-uk Kim AcpiNsHandleToPathname ( 131a159c266SJung-uk Kim ACPI_HANDLE TargetHandle, 132*fe0f0bbbSJung-uk Kim ACPI_BUFFER *Buffer, 133*fe0f0bbbSJung-uk Kim BOOLEAN NoTrailing) 134a159c266SJung-uk Kim { 135a159c266SJung-uk Kim ACPI_STATUS Status; 136a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 137a159c266SJung-uk Kim ACPI_SIZE RequiredSize; 138a159c266SJung-uk Kim 139a159c266SJung-uk Kim 140a159c266SJung-uk Kim ACPI_FUNCTION_TRACE_PTR (NsHandleToPathname, TargetHandle); 141a159c266SJung-uk Kim 142a159c266SJung-uk Kim 143a159c266SJung-uk Kim Node = AcpiNsValidateHandle (TargetHandle); 144a159c266SJung-uk Kim if (!Node) 145a159c266SJung-uk Kim { 146a159c266SJung-uk Kim return_ACPI_STATUS (AE_BAD_PARAMETER); 147a159c266SJung-uk Kim } 148a159c266SJung-uk Kim 149a159c266SJung-uk Kim /* Determine size required for the caller buffer */ 150a159c266SJung-uk Kim 151*fe0f0bbbSJung-uk Kim RequiredSize = AcpiNsBuildNormalizedPath (Node, NULL, 0, NoTrailing); 152a159c266SJung-uk Kim if (!RequiredSize) 153a159c266SJung-uk Kim { 154a159c266SJung-uk Kim return_ACPI_STATUS (AE_BAD_PARAMETER); 155a159c266SJung-uk Kim } 156a159c266SJung-uk Kim 157a159c266SJung-uk Kim /* Validate/Allocate/Clear caller buffer */ 158a159c266SJung-uk Kim 159a159c266SJung-uk Kim Status = AcpiUtInitializeBuffer (Buffer, RequiredSize); 160a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 161a159c266SJung-uk Kim { 162a159c266SJung-uk Kim return_ACPI_STATUS (Status); 163a159c266SJung-uk Kim } 164a159c266SJung-uk Kim 165a159c266SJung-uk Kim /* Build the path in the caller buffer */ 166a159c266SJung-uk Kim 167*fe0f0bbbSJung-uk Kim (void) AcpiNsBuildNormalizedPath (Node, Buffer->Pointer, 168*fe0f0bbbSJung-uk Kim RequiredSize, NoTrailing); 169a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 170a159c266SJung-uk Kim { 171a159c266SJung-uk Kim return_ACPI_STATUS (Status); 172a159c266SJung-uk Kim } 173a159c266SJung-uk Kim 174a159c266SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s [%X]\n", 175a159c266SJung-uk Kim (char *) Buffer->Pointer, (UINT32) RequiredSize)); 176a159c266SJung-uk Kim return_ACPI_STATUS (AE_OK); 177a159c266SJung-uk Kim } 178*fe0f0bbbSJung-uk Kim 179*fe0f0bbbSJung-uk Kim 180*fe0f0bbbSJung-uk Kim /******************************************************************************* 181*fe0f0bbbSJung-uk Kim * 182*fe0f0bbbSJung-uk Kim * FUNCTION: AcpiNsBuildNormalizedPath 183*fe0f0bbbSJung-uk Kim * 184*fe0f0bbbSJung-uk Kim * PARAMETERS: Node - Namespace node 185*fe0f0bbbSJung-uk Kim * FullPath - Where the path name is returned 186*fe0f0bbbSJung-uk Kim * PathSize - Size of returned path name buffer 187*fe0f0bbbSJung-uk Kim * NoTrailing - Remove trailing '_' from each name segment 188*fe0f0bbbSJung-uk Kim * 189*fe0f0bbbSJung-uk Kim * RETURN: Return 1 if the AML path is empty, otherwise returning (length 190*fe0f0bbbSJung-uk Kim * of pathname + 1) which means the 'FullPath' contains a trailing 191*fe0f0bbbSJung-uk Kim * null. 192*fe0f0bbbSJung-uk Kim * 193*fe0f0bbbSJung-uk Kim * DESCRIPTION: Build and return a full namespace pathname. 194*fe0f0bbbSJung-uk Kim * Note that if the size of 'FullPath' isn't large enough to 195*fe0f0bbbSJung-uk Kim * contain the namespace node's path name, the actual required 196*fe0f0bbbSJung-uk Kim * buffer length is returned, and it should be greater than 197*fe0f0bbbSJung-uk Kim * 'PathSize'. So callers are able to check the returning value 198*fe0f0bbbSJung-uk Kim * to determine the buffer size of 'FullPath'. 199*fe0f0bbbSJung-uk Kim * 200*fe0f0bbbSJung-uk Kim ******************************************************************************/ 201*fe0f0bbbSJung-uk Kim 202*fe0f0bbbSJung-uk Kim UINT32 203*fe0f0bbbSJung-uk Kim AcpiNsBuildNormalizedPath ( 204*fe0f0bbbSJung-uk Kim ACPI_NAMESPACE_NODE *Node, 205*fe0f0bbbSJung-uk Kim char *FullPath, 206*fe0f0bbbSJung-uk Kim UINT32 PathSize, 207*fe0f0bbbSJung-uk Kim BOOLEAN NoTrailing) 208*fe0f0bbbSJung-uk Kim { 209*fe0f0bbbSJung-uk Kim UINT32 Length = 0, i; 210*fe0f0bbbSJung-uk Kim char Name[ACPI_NAME_SIZE]; 211*fe0f0bbbSJung-uk Kim BOOLEAN DoNoTrailing; 212*fe0f0bbbSJung-uk Kim char c, *Left, *Right; 213*fe0f0bbbSJung-uk Kim ACPI_NAMESPACE_NODE *NextNode; 214*fe0f0bbbSJung-uk Kim 215*fe0f0bbbSJung-uk Kim 216*fe0f0bbbSJung-uk Kim ACPI_FUNCTION_TRACE_PTR (NsBuildNormalizedPath, Node); 217*fe0f0bbbSJung-uk Kim 218*fe0f0bbbSJung-uk Kim 219*fe0f0bbbSJung-uk Kim #define ACPI_PATH_PUT8(Path, Size, Byte, Length) \ 220*fe0f0bbbSJung-uk Kim do { \ 221*fe0f0bbbSJung-uk Kim if ((Length) < (Size)) \ 222*fe0f0bbbSJung-uk Kim { \ 223*fe0f0bbbSJung-uk Kim (Path)[(Length)] = (Byte); \ 224*fe0f0bbbSJung-uk Kim } \ 225*fe0f0bbbSJung-uk Kim (Length)++; \ 226*fe0f0bbbSJung-uk Kim } while (0) 227*fe0f0bbbSJung-uk Kim 228*fe0f0bbbSJung-uk Kim /* 229*fe0f0bbbSJung-uk Kim * Make sure the PathSize is correct, so that we don't need to 230*fe0f0bbbSJung-uk Kim * validate both FullPath and PathSize. 231*fe0f0bbbSJung-uk Kim */ 232*fe0f0bbbSJung-uk Kim if (!FullPath) 233*fe0f0bbbSJung-uk Kim { 234*fe0f0bbbSJung-uk Kim PathSize = 0; 235*fe0f0bbbSJung-uk Kim } 236*fe0f0bbbSJung-uk Kim 237*fe0f0bbbSJung-uk Kim if (!Node) 238*fe0f0bbbSJung-uk Kim { 239*fe0f0bbbSJung-uk Kim goto BuildTrailingNull; 240*fe0f0bbbSJung-uk Kim } 241*fe0f0bbbSJung-uk Kim 242*fe0f0bbbSJung-uk Kim NextNode = Node; 243*fe0f0bbbSJung-uk Kim while (NextNode && NextNode != AcpiGbl_RootNode) 244*fe0f0bbbSJung-uk Kim { 245*fe0f0bbbSJung-uk Kim if (NextNode != Node) 246*fe0f0bbbSJung-uk Kim { 247*fe0f0bbbSJung-uk Kim ACPI_PATH_PUT8(FullPath, PathSize, AML_DUAL_NAME_PREFIX, Length); 248*fe0f0bbbSJung-uk Kim } 249*fe0f0bbbSJung-uk Kim ACPI_MOVE_32_TO_32 (Name, &NextNode->Name); 250*fe0f0bbbSJung-uk Kim DoNoTrailing = NoTrailing; 251*fe0f0bbbSJung-uk Kim for (i = 0; i < 4; i++) 252*fe0f0bbbSJung-uk Kim { 253*fe0f0bbbSJung-uk Kim c = Name[4-i-1]; 254*fe0f0bbbSJung-uk Kim if (DoNoTrailing && c != '_') 255*fe0f0bbbSJung-uk Kim { 256*fe0f0bbbSJung-uk Kim DoNoTrailing = FALSE; 257*fe0f0bbbSJung-uk Kim } 258*fe0f0bbbSJung-uk Kim if (!DoNoTrailing) 259*fe0f0bbbSJung-uk Kim { 260*fe0f0bbbSJung-uk Kim ACPI_PATH_PUT8(FullPath, PathSize, c, Length); 261*fe0f0bbbSJung-uk Kim } 262*fe0f0bbbSJung-uk Kim } 263*fe0f0bbbSJung-uk Kim NextNode = NextNode->Parent; 264*fe0f0bbbSJung-uk Kim } 265*fe0f0bbbSJung-uk Kim ACPI_PATH_PUT8(FullPath, PathSize, AML_ROOT_PREFIX, Length); 266*fe0f0bbbSJung-uk Kim 267*fe0f0bbbSJung-uk Kim /* Reverse the path string */ 268*fe0f0bbbSJung-uk Kim 269*fe0f0bbbSJung-uk Kim if (Length <= PathSize) 270*fe0f0bbbSJung-uk Kim { 271*fe0f0bbbSJung-uk Kim Left = FullPath; 272*fe0f0bbbSJung-uk Kim Right = FullPath+Length-1; 273*fe0f0bbbSJung-uk Kim while (Left < Right) 274*fe0f0bbbSJung-uk Kim { 275*fe0f0bbbSJung-uk Kim c = *Left; 276*fe0f0bbbSJung-uk Kim *Left++ = *Right; 277*fe0f0bbbSJung-uk Kim *Right-- = c; 278*fe0f0bbbSJung-uk Kim } 279*fe0f0bbbSJung-uk Kim } 280*fe0f0bbbSJung-uk Kim 281*fe0f0bbbSJung-uk Kim /* Append the trailing null */ 282*fe0f0bbbSJung-uk Kim 283*fe0f0bbbSJung-uk Kim BuildTrailingNull: 284*fe0f0bbbSJung-uk Kim ACPI_PATH_PUT8(FullPath, PathSize, '\0', Length); 285*fe0f0bbbSJung-uk Kim 286*fe0f0bbbSJung-uk Kim #undef ACPI_PATH_PUT8 287*fe0f0bbbSJung-uk Kim 288*fe0f0bbbSJung-uk Kim return_UINT32 (Length); 289*fe0f0bbbSJung-uk Kim } 290*fe0f0bbbSJung-uk Kim 291*fe0f0bbbSJung-uk Kim 292*fe0f0bbbSJung-uk Kim /******************************************************************************* 293*fe0f0bbbSJung-uk Kim * 294*fe0f0bbbSJung-uk Kim * FUNCTION: AcpiNsGetNormalizedPathname 295*fe0f0bbbSJung-uk Kim * 296*fe0f0bbbSJung-uk Kim * PARAMETERS: Node - Namespace node whose pathname is needed 297*fe0f0bbbSJung-uk Kim * NoTrailing - Remove trailing '_' from each name segment 298*fe0f0bbbSJung-uk Kim * 299*fe0f0bbbSJung-uk Kim * RETURN: Pointer to storage containing the fully qualified name of 300*fe0f0bbbSJung-uk Kim * the node, In external format (name segments separated by path 301*fe0f0bbbSJung-uk Kim * separators.) 302*fe0f0bbbSJung-uk Kim * 303*fe0f0bbbSJung-uk Kim * DESCRIPTION: Used to obtain the full pathname to a namespace node, usually 304*fe0f0bbbSJung-uk Kim * for error and debug statements. All trailing '_' will be 305*fe0f0bbbSJung-uk Kim * removed from the full pathname if 'NoTrailing' is specified.. 306*fe0f0bbbSJung-uk Kim * 307*fe0f0bbbSJung-uk Kim ******************************************************************************/ 308*fe0f0bbbSJung-uk Kim 309*fe0f0bbbSJung-uk Kim char * 310*fe0f0bbbSJung-uk Kim AcpiNsGetNormalizedPathname ( 311*fe0f0bbbSJung-uk Kim ACPI_NAMESPACE_NODE *Node, 312*fe0f0bbbSJung-uk Kim BOOLEAN NoTrailing) 313*fe0f0bbbSJung-uk Kim { 314*fe0f0bbbSJung-uk Kim char *NameBuffer; 315*fe0f0bbbSJung-uk Kim ACPI_SIZE Size; 316*fe0f0bbbSJung-uk Kim 317*fe0f0bbbSJung-uk Kim 318*fe0f0bbbSJung-uk Kim ACPI_FUNCTION_TRACE_PTR (NsGetNormalizedPathname, Node); 319*fe0f0bbbSJung-uk Kim 320*fe0f0bbbSJung-uk Kim 321*fe0f0bbbSJung-uk Kim /* Calculate required buffer size based on depth below root */ 322*fe0f0bbbSJung-uk Kim 323*fe0f0bbbSJung-uk Kim Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, NoTrailing); 324*fe0f0bbbSJung-uk Kim if (!Size) 325*fe0f0bbbSJung-uk Kim { 326*fe0f0bbbSJung-uk Kim return_PTR (NULL); 327*fe0f0bbbSJung-uk Kim } 328*fe0f0bbbSJung-uk Kim 329*fe0f0bbbSJung-uk Kim /* Allocate a buffer to be returned to caller */ 330*fe0f0bbbSJung-uk Kim 331*fe0f0bbbSJung-uk Kim NameBuffer = ACPI_ALLOCATE_ZEROED (Size); 332*fe0f0bbbSJung-uk Kim if (!NameBuffer) 333*fe0f0bbbSJung-uk Kim { 334*fe0f0bbbSJung-uk Kim ACPI_ERROR ((AE_INFO, "Could not allocate %u bytes", (UINT32) Size)); 335*fe0f0bbbSJung-uk Kim return_PTR (NULL); 336*fe0f0bbbSJung-uk Kim } 337*fe0f0bbbSJung-uk Kim 338*fe0f0bbbSJung-uk Kim /* Build the path in the allocated buffer */ 339*fe0f0bbbSJung-uk Kim 340*fe0f0bbbSJung-uk Kim (void) AcpiNsBuildNormalizedPath (Node, NameBuffer, Size, NoTrailing); 341*fe0f0bbbSJung-uk Kim 342*fe0f0bbbSJung-uk Kim return_PTR (NameBuffer); 343*fe0f0bbbSJung-uk Kim } 344