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 /* 8f8146b88SJung-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 * 113*1cc50d6bSJung-uk Kim * FUNCTION: AcpiNsHandleToName 114*1cc50d6bSJung-uk Kim * 115*1cc50d6bSJung-uk Kim * PARAMETERS: TargetHandle - Handle of named object whose name is 116*1cc50d6bSJung-uk Kim * to be found 117*1cc50d6bSJung-uk Kim * Buffer - Where the name is returned 118*1cc50d6bSJung-uk Kim * 119*1cc50d6bSJung-uk Kim * RETURN: Status, Buffer is filled with name if status is AE_OK 120*1cc50d6bSJung-uk Kim * 121*1cc50d6bSJung-uk Kim * DESCRIPTION: Build and return a full namespace name 122*1cc50d6bSJung-uk Kim * 123*1cc50d6bSJung-uk Kim ******************************************************************************/ 124*1cc50d6bSJung-uk Kim 125*1cc50d6bSJung-uk Kim ACPI_STATUS 126*1cc50d6bSJung-uk Kim AcpiNsHandleToName ( 127*1cc50d6bSJung-uk Kim ACPI_HANDLE TargetHandle, 128*1cc50d6bSJung-uk Kim ACPI_BUFFER *Buffer) 129*1cc50d6bSJung-uk Kim { 130*1cc50d6bSJung-uk Kim ACPI_STATUS Status; 131*1cc50d6bSJung-uk Kim ACPI_NAMESPACE_NODE *Node; 132*1cc50d6bSJung-uk Kim const char *NodeName; 133*1cc50d6bSJung-uk Kim 134*1cc50d6bSJung-uk Kim 135*1cc50d6bSJung-uk Kim ACPI_FUNCTION_TRACE_PTR (NsHandleToName, TargetHandle); 136*1cc50d6bSJung-uk Kim 137*1cc50d6bSJung-uk Kim 138*1cc50d6bSJung-uk Kim Node = AcpiNsValidateHandle (TargetHandle); 139*1cc50d6bSJung-uk Kim if (!Node) 140*1cc50d6bSJung-uk Kim { 141*1cc50d6bSJung-uk Kim return_ACPI_STATUS (AE_BAD_PARAMETER); 142*1cc50d6bSJung-uk Kim } 143*1cc50d6bSJung-uk Kim 144*1cc50d6bSJung-uk Kim /* Validate/Allocate/Clear caller buffer */ 145*1cc50d6bSJung-uk Kim 146*1cc50d6bSJung-uk Kim Status = AcpiUtInitializeBuffer (Buffer, ACPI_PATH_SEGMENT_LENGTH); 147*1cc50d6bSJung-uk Kim if (ACPI_FAILURE (Status)) 148*1cc50d6bSJung-uk Kim { 149*1cc50d6bSJung-uk Kim return_ACPI_STATUS (Status); 150*1cc50d6bSJung-uk Kim } 151*1cc50d6bSJung-uk Kim 152*1cc50d6bSJung-uk Kim /* Just copy the ACPI name from the Node and zero terminate it */ 153*1cc50d6bSJung-uk Kim 154*1cc50d6bSJung-uk Kim NodeName = AcpiUtGetNodeName (Node); 155*1cc50d6bSJung-uk Kim ACPI_MOVE_NAME (Buffer->Pointer, NodeName); 156*1cc50d6bSJung-uk Kim ((char *) Buffer->Pointer) [ACPI_NAME_SIZE] = 0; 157*1cc50d6bSJung-uk Kim 158*1cc50d6bSJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%4.4s\n", (char *) Buffer->Pointer)); 159*1cc50d6bSJung-uk Kim return_ACPI_STATUS (AE_OK); 160*1cc50d6bSJung-uk Kim } 161*1cc50d6bSJung-uk Kim 162*1cc50d6bSJung-uk Kim 163*1cc50d6bSJung-uk Kim /******************************************************************************* 164*1cc50d6bSJung-uk Kim * 165a159c266SJung-uk Kim * FUNCTION: AcpiNsHandleToPathname 166a159c266SJung-uk Kim * 167a159c266SJung-uk Kim * PARAMETERS: TargetHandle - Handle of named object whose name is 168a159c266SJung-uk Kim * to be found 169a159c266SJung-uk Kim * Buffer - Where the pathname is returned 170fe0f0bbbSJung-uk Kim * NoTrailing - Remove trailing '_' for each name 171fe0f0bbbSJung-uk Kim * segment 172a159c266SJung-uk Kim * 173a159c266SJung-uk Kim * RETURN: Status, Buffer is filled with pathname if status is AE_OK 174a159c266SJung-uk Kim * 175a159c266SJung-uk Kim * DESCRIPTION: Build and return a full namespace pathname 176a159c266SJung-uk Kim * 177a159c266SJung-uk Kim ******************************************************************************/ 178a159c266SJung-uk Kim 179a159c266SJung-uk Kim ACPI_STATUS 180a159c266SJung-uk Kim AcpiNsHandleToPathname ( 181a159c266SJung-uk Kim ACPI_HANDLE TargetHandle, 182fe0f0bbbSJung-uk Kim ACPI_BUFFER *Buffer, 183fe0f0bbbSJung-uk Kim BOOLEAN NoTrailing) 184a159c266SJung-uk Kim { 185a159c266SJung-uk Kim ACPI_STATUS Status; 186a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 187a159c266SJung-uk Kim ACPI_SIZE RequiredSize; 188a159c266SJung-uk Kim 189a159c266SJung-uk Kim 190a159c266SJung-uk Kim ACPI_FUNCTION_TRACE_PTR (NsHandleToPathname, TargetHandle); 191a159c266SJung-uk Kim 192a159c266SJung-uk Kim 193a159c266SJung-uk Kim Node = AcpiNsValidateHandle (TargetHandle); 194a159c266SJung-uk Kim if (!Node) 195a159c266SJung-uk Kim { 196a159c266SJung-uk Kim return_ACPI_STATUS (AE_BAD_PARAMETER); 197a159c266SJung-uk Kim } 198a159c266SJung-uk Kim 199a159c266SJung-uk Kim /* Determine size required for the caller buffer */ 200a159c266SJung-uk Kim 201fe0f0bbbSJung-uk Kim RequiredSize = AcpiNsBuildNormalizedPath (Node, NULL, 0, NoTrailing); 202a159c266SJung-uk Kim if (!RequiredSize) 203a159c266SJung-uk Kim { 204a159c266SJung-uk Kim return_ACPI_STATUS (AE_BAD_PARAMETER); 205a159c266SJung-uk Kim } 206a159c266SJung-uk Kim 207a159c266SJung-uk Kim /* Validate/Allocate/Clear caller buffer */ 208a159c266SJung-uk Kim 209a159c266SJung-uk Kim Status = AcpiUtInitializeBuffer (Buffer, RequiredSize); 210a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 211a159c266SJung-uk Kim { 212a159c266SJung-uk Kim return_ACPI_STATUS (Status); 213a159c266SJung-uk Kim } 214a159c266SJung-uk Kim 215a159c266SJung-uk Kim /* Build the path in the caller buffer */ 216a159c266SJung-uk Kim 217fe0f0bbbSJung-uk Kim (void) AcpiNsBuildNormalizedPath (Node, Buffer->Pointer, 218fe0f0bbbSJung-uk Kim RequiredSize, NoTrailing); 219a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 220a159c266SJung-uk Kim { 221a159c266SJung-uk Kim return_ACPI_STATUS (Status); 222a159c266SJung-uk Kim } 223a159c266SJung-uk Kim 224a159c266SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s [%X]\n", 225a159c266SJung-uk Kim (char *) Buffer->Pointer, (UINT32) RequiredSize)); 226a159c266SJung-uk Kim return_ACPI_STATUS (AE_OK); 227a159c266SJung-uk Kim } 228fe0f0bbbSJung-uk Kim 229fe0f0bbbSJung-uk Kim 230fe0f0bbbSJung-uk Kim /******************************************************************************* 231fe0f0bbbSJung-uk Kim * 232fe0f0bbbSJung-uk Kim * FUNCTION: AcpiNsBuildNormalizedPath 233fe0f0bbbSJung-uk Kim * 234fe0f0bbbSJung-uk Kim * PARAMETERS: Node - Namespace node 235fe0f0bbbSJung-uk Kim * FullPath - Where the path name is returned 236fe0f0bbbSJung-uk Kim * PathSize - Size of returned path name buffer 237fe0f0bbbSJung-uk Kim * NoTrailing - Remove trailing '_' from each name segment 238fe0f0bbbSJung-uk Kim * 239fe0f0bbbSJung-uk Kim * RETURN: Return 1 if the AML path is empty, otherwise returning (length 240fe0f0bbbSJung-uk Kim * of pathname + 1) which means the 'FullPath' contains a trailing 241fe0f0bbbSJung-uk Kim * null. 242fe0f0bbbSJung-uk Kim * 243fe0f0bbbSJung-uk Kim * DESCRIPTION: Build and return a full namespace pathname. 244fe0f0bbbSJung-uk Kim * Note that if the size of 'FullPath' isn't large enough to 245fe0f0bbbSJung-uk Kim * contain the namespace node's path name, the actual required 246fe0f0bbbSJung-uk Kim * buffer length is returned, and it should be greater than 247fe0f0bbbSJung-uk Kim * 'PathSize'. So callers are able to check the returning value 248fe0f0bbbSJung-uk Kim * to determine the buffer size of 'FullPath'. 249fe0f0bbbSJung-uk Kim * 250fe0f0bbbSJung-uk Kim ******************************************************************************/ 251fe0f0bbbSJung-uk Kim 252fe0f0bbbSJung-uk Kim UINT32 253fe0f0bbbSJung-uk Kim AcpiNsBuildNormalizedPath ( 254fe0f0bbbSJung-uk Kim ACPI_NAMESPACE_NODE *Node, 255fe0f0bbbSJung-uk Kim char *FullPath, 256fe0f0bbbSJung-uk Kim UINT32 PathSize, 257fe0f0bbbSJung-uk Kim BOOLEAN NoTrailing) 258fe0f0bbbSJung-uk Kim { 259fe0f0bbbSJung-uk Kim UINT32 Length = 0, i; 260fe0f0bbbSJung-uk Kim char Name[ACPI_NAME_SIZE]; 261fe0f0bbbSJung-uk Kim BOOLEAN DoNoTrailing; 262fe0f0bbbSJung-uk Kim char c, *Left, *Right; 263fe0f0bbbSJung-uk Kim ACPI_NAMESPACE_NODE *NextNode; 264fe0f0bbbSJung-uk Kim 265fe0f0bbbSJung-uk Kim 266fe0f0bbbSJung-uk Kim ACPI_FUNCTION_TRACE_PTR (NsBuildNormalizedPath, Node); 267fe0f0bbbSJung-uk Kim 268fe0f0bbbSJung-uk Kim 269fe0f0bbbSJung-uk Kim #define ACPI_PATH_PUT8(Path, Size, Byte, Length) \ 270fe0f0bbbSJung-uk Kim do { \ 271fe0f0bbbSJung-uk Kim if ((Length) < (Size)) \ 272fe0f0bbbSJung-uk Kim { \ 273fe0f0bbbSJung-uk Kim (Path)[(Length)] = (Byte); \ 274fe0f0bbbSJung-uk Kim } \ 275fe0f0bbbSJung-uk Kim (Length)++; \ 276fe0f0bbbSJung-uk Kim } while (0) 277fe0f0bbbSJung-uk Kim 278fe0f0bbbSJung-uk Kim /* 279fe0f0bbbSJung-uk Kim * Make sure the PathSize is correct, so that we don't need to 280fe0f0bbbSJung-uk Kim * validate both FullPath and PathSize. 281fe0f0bbbSJung-uk Kim */ 282fe0f0bbbSJung-uk Kim if (!FullPath) 283fe0f0bbbSJung-uk Kim { 284fe0f0bbbSJung-uk Kim PathSize = 0; 285fe0f0bbbSJung-uk Kim } 286fe0f0bbbSJung-uk Kim 287fe0f0bbbSJung-uk Kim if (!Node) 288fe0f0bbbSJung-uk Kim { 289fe0f0bbbSJung-uk Kim goto BuildTrailingNull; 290fe0f0bbbSJung-uk Kim } 291fe0f0bbbSJung-uk Kim 292fe0f0bbbSJung-uk Kim NextNode = Node; 293fe0f0bbbSJung-uk Kim while (NextNode && NextNode != AcpiGbl_RootNode) 294fe0f0bbbSJung-uk Kim { 295fe0f0bbbSJung-uk Kim if (NextNode != Node) 296fe0f0bbbSJung-uk Kim { 297fe0f0bbbSJung-uk Kim ACPI_PATH_PUT8(FullPath, PathSize, AML_DUAL_NAME_PREFIX, Length); 298fe0f0bbbSJung-uk Kim } 299f8146b88SJung-uk Kim 300fe0f0bbbSJung-uk Kim ACPI_MOVE_32_TO_32 (Name, &NextNode->Name); 301fe0f0bbbSJung-uk Kim DoNoTrailing = NoTrailing; 302fe0f0bbbSJung-uk Kim for (i = 0; i < 4; i++) 303fe0f0bbbSJung-uk Kim { 304fe0f0bbbSJung-uk Kim c = Name[4-i-1]; 305fe0f0bbbSJung-uk Kim if (DoNoTrailing && c != '_') 306fe0f0bbbSJung-uk Kim { 307fe0f0bbbSJung-uk Kim DoNoTrailing = FALSE; 308fe0f0bbbSJung-uk Kim } 309fe0f0bbbSJung-uk Kim if (!DoNoTrailing) 310fe0f0bbbSJung-uk Kim { 311fe0f0bbbSJung-uk Kim ACPI_PATH_PUT8(FullPath, PathSize, c, Length); 312fe0f0bbbSJung-uk Kim } 313fe0f0bbbSJung-uk Kim } 314f8146b88SJung-uk Kim 315fe0f0bbbSJung-uk Kim NextNode = NextNode->Parent; 316fe0f0bbbSJung-uk Kim } 317f8146b88SJung-uk Kim 318fe0f0bbbSJung-uk Kim ACPI_PATH_PUT8(FullPath, PathSize, AML_ROOT_PREFIX, Length); 319fe0f0bbbSJung-uk Kim 320fe0f0bbbSJung-uk Kim /* Reverse the path string */ 321fe0f0bbbSJung-uk Kim 322fe0f0bbbSJung-uk Kim if (Length <= PathSize) 323fe0f0bbbSJung-uk Kim { 324fe0f0bbbSJung-uk Kim Left = FullPath; 325fe0f0bbbSJung-uk Kim Right = FullPath+Length - 1; 326f8146b88SJung-uk Kim 327fe0f0bbbSJung-uk Kim while (Left < Right) 328fe0f0bbbSJung-uk Kim { 329fe0f0bbbSJung-uk Kim c = *Left; 330fe0f0bbbSJung-uk Kim *Left++ = *Right; 331fe0f0bbbSJung-uk Kim *Right-- = c; 332fe0f0bbbSJung-uk Kim } 333fe0f0bbbSJung-uk Kim } 334fe0f0bbbSJung-uk Kim 335fe0f0bbbSJung-uk Kim /* Append the trailing null */ 336fe0f0bbbSJung-uk Kim 337fe0f0bbbSJung-uk Kim BuildTrailingNull: 338fe0f0bbbSJung-uk Kim ACPI_PATH_PUT8 (FullPath, PathSize, '\0', Length); 339fe0f0bbbSJung-uk Kim 340fe0f0bbbSJung-uk Kim #undef ACPI_PATH_PUT8 341fe0f0bbbSJung-uk Kim 342fe0f0bbbSJung-uk Kim return_UINT32 (Length); 343fe0f0bbbSJung-uk Kim } 344fe0f0bbbSJung-uk Kim 345fe0f0bbbSJung-uk Kim 346fe0f0bbbSJung-uk Kim /******************************************************************************* 347fe0f0bbbSJung-uk Kim * 348fe0f0bbbSJung-uk Kim * FUNCTION: AcpiNsGetNormalizedPathname 349fe0f0bbbSJung-uk Kim * 350fe0f0bbbSJung-uk Kim * PARAMETERS: Node - Namespace node whose pathname is needed 351fe0f0bbbSJung-uk Kim * NoTrailing - Remove trailing '_' from each name segment 352fe0f0bbbSJung-uk Kim * 353fe0f0bbbSJung-uk Kim * RETURN: Pointer to storage containing the fully qualified name of 354fe0f0bbbSJung-uk Kim * the node, In external format (name segments separated by path 355fe0f0bbbSJung-uk Kim * separators.) 356fe0f0bbbSJung-uk Kim * 357fe0f0bbbSJung-uk Kim * DESCRIPTION: Used to obtain the full pathname to a namespace node, usually 358fe0f0bbbSJung-uk Kim * for error and debug statements. All trailing '_' will be 359fe0f0bbbSJung-uk Kim * removed from the full pathname if 'NoTrailing' is specified.. 360fe0f0bbbSJung-uk Kim * 361fe0f0bbbSJung-uk Kim ******************************************************************************/ 362fe0f0bbbSJung-uk Kim 363fe0f0bbbSJung-uk Kim char * 364fe0f0bbbSJung-uk Kim AcpiNsGetNormalizedPathname ( 365fe0f0bbbSJung-uk Kim ACPI_NAMESPACE_NODE *Node, 366fe0f0bbbSJung-uk Kim BOOLEAN NoTrailing) 367fe0f0bbbSJung-uk Kim { 368fe0f0bbbSJung-uk Kim char *NameBuffer; 369fe0f0bbbSJung-uk Kim ACPI_SIZE Size; 370fe0f0bbbSJung-uk Kim 371fe0f0bbbSJung-uk Kim 372fe0f0bbbSJung-uk Kim ACPI_FUNCTION_TRACE_PTR (NsGetNormalizedPathname, Node); 373fe0f0bbbSJung-uk Kim 374fe0f0bbbSJung-uk Kim 375fe0f0bbbSJung-uk Kim /* Calculate required buffer size based on depth below root */ 376fe0f0bbbSJung-uk Kim 377fe0f0bbbSJung-uk Kim Size = AcpiNsBuildNormalizedPath (Node, NULL, 0, NoTrailing); 378fe0f0bbbSJung-uk Kim if (!Size) 379fe0f0bbbSJung-uk Kim { 380fe0f0bbbSJung-uk Kim return_PTR (NULL); 381fe0f0bbbSJung-uk Kim } 382fe0f0bbbSJung-uk Kim 383fe0f0bbbSJung-uk Kim /* Allocate a buffer to be returned to caller */ 384fe0f0bbbSJung-uk Kim 385fe0f0bbbSJung-uk Kim NameBuffer = ACPI_ALLOCATE_ZEROED (Size); 386fe0f0bbbSJung-uk Kim if (!NameBuffer) 387fe0f0bbbSJung-uk Kim { 388f8146b88SJung-uk Kim ACPI_ERROR ((AE_INFO, 389f8146b88SJung-uk Kim "Could not allocate %u bytes", (UINT32) Size)); 390fe0f0bbbSJung-uk Kim return_PTR (NULL); 391fe0f0bbbSJung-uk Kim } 392fe0f0bbbSJung-uk Kim 393fe0f0bbbSJung-uk Kim /* Build the path in the allocated buffer */ 394fe0f0bbbSJung-uk Kim 395fe0f0bbbSJung-uk Kim (void) AcpiNsBuildNormalizedPath (Node, NameBuffer, Size, NoTrailing); 396fe0f0bbbSJung-uk Kim 397fe0f0bbbSJung-uk Kim return_PTR (NameBuffer); 398fe0f0bbbSJung-uk Kim } 399