1 /******************************************************************************* 2 * 3 * Module Name: nsxfobj - Public interfaces to the ACPI subsystem 4 * ACPI Object oriented interfaces 5 * 6 ******************************************************************************/ 7 8 /* 9 * Copyright (C) 2000 - 2016, Intel Corp. 10 * All rights reserved. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions, and the following disclaimer, 17 * without modification. 18 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19 * substantially similar to the "NO WARRANTY" disclaimer below 20 * ("Disclaimer") and any redistribution must be conditioned upon 21 * including a substantially similar Disclaimer requirement for further 22 * binary redistribution. 23 * 3. Neither the names of the above-listed copyright holders nor the names 24 * of any contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * Alternatively, this software may be distributed under the terms of the 28 * GNU General Public License ("GPL") version 2 as published by the Free 29 * Software Foundation. 30 * 31 * NO WARRANTY 32 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42 * POSSIBILITY OF SUCH DAMAGES. 43 */ 44 45 #define EXPORT_ACPI_INTERFACES 46 47 #include "acpi.h" 48 #include "accommon.h" 49 #include "acnamesp.h" 50 51 52 #define _COMPONENT ACPI_NAMESPACE 53 ACPI_MODULE_NAME ("nsxfobj") 54 55 /******************************************************************************* 56 * 57 * FUNCTION: AcpiGetType 58 * 59 * PARAMETERS: Handle - Handle of object whose type is desired 60 * RetType - Where the type will be placed 61 * 62 * RETURN: Status 63 * 64 * DESCRIPTION: This routine returns the type associatd with a particular handle 65 * 66 ******************************************************************************/ 67 68 ACPI_STATUS 69 AcpiGetType ( 70 ACPI_HANDLE Handle, 71 ACPI_OBJECT_TYPE *RetType) 72 { 73 ACPI_NAMESPACE_NODE *Node; 74 ACPI_STATUS Status; 75 76 77 /* Parameter Validation */ 78 79 if (!RetType) 80 { 81 return (AE_BAD_PARAMETER); 82 } 83 84 /* Special case for the predefined Root Node (return type ANY) */ 85 86 if (Handle == ACPI_ROOT_OBJECT) 87 { 88 *RetType = ACPI_TYPE_ANY; 89 return (AE_OK); 90 } 91 92 Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 93 if (ACPI_FAILURE (Status)) 94 { 95 return (Status); 96 } 97 98 /* Convert and validate the handle */ 99 100 Node = AcpiNsValidateHandle (Handle); 101 if (!Node) 102 { 103 (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 104 return (AE_BAD_PARAMETER); 105 } 106 107 *RetType = Node->Type; 108 109 Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 110 return (Status); 111 } 112 113 ACPI_EXPORT_SYMBOL (AcpiGetType) 114 115 116 /******************************************************************************* 117 * 118 * FUNCTION: AcpiGetParent 119 * 120 * PARAMETERS: Handle - Handle of object whose parent is desired 121 * RetHandle - Where the parent handle will be placed 122 * 123 * RETURN: Status 124 * 125 * DESCRIPTION: Returns a handle to the parent of the object represented by 126 * Handle. 127 * 128 ******************************************************************************/ 129 130 ACPI_STATUS 131 AcpiGetParent ( 132 ACPI_HANDLE Handle, 133 ACPI_HANDLE *RetHandle) 134 { 135 ACPI_NAMESPACE_NODE *Node; 136 ACPI_NAMESPACE_NODE *ParentNode; 137 ACPI_STATUS Status; 138 139 140 if (!RetHandle) 141 { 142 return (AE_BAD_PARAMETER); 143 } 144 145 /* Special case for the predefined Root Node (no parent) */ 146 147 if (Handle == ACPI_ROOT_OBJECT) 148 { 149 return (AE_NULL_ENTRY); 150 } 151 152 Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 153 if (ACPI_FAILURE (Status)) 154 { 155 return (Status); 156 } 157 158 /* Convert and validate the handle */ 159 160 Node = AcpiNsValidateHandle (Handle); 161 if (!Node) 162 { 163 Status = AE_BAD_PARAMETER; 164 goto UnlockAndExit; 165 } 166 167 /* Get the parent entry */ 168 169 ParentNode = Node->Parent; 170 *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, ParentNode); 171 172 /* Return exception if parent is null */ 173 174 if (!ParentNode) 175 { 176 Status = AE_NULL_ENTRY; 177 } 178 179 180 UnlockAndExit: 181 182 (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 183 return (Status); 184 } 185 186 ACPI_EXPORT_SYMBOL (AcpiGetParent) 187 188 189 /******************************************************************************* 190 * 191 * FUNCTION: AcpiGetNextObject 192 * 193 * PARAMETERS: Type - Type of object to be searched for 194 * Parent - Parent object whose children we are getting 195 * LastChild - Previous child that was found. 196 * The NEXT child will be returned 197 * RetHandle - Where handle to the next object is placed 198 * 199 * RETURN: Status 200 * 201 * DESCRIPTION: Return the next peer object within the namespace. If Handle is 202 * valid, Scope is ignored. Otherwise, the first object within 203 * Scope is returned. 204 * 205 ******************************************************************************/ 206 207 ACPI_STATUS 208 AcpiGetNextObject ( 209 ACPI_OBJECT_TYPE Type, 210 ACPI_HANDLE Parent, 211 ACPI_HANDLE Child, 212 ACPI_HANDLE *RetHandle) 213 { 214 ACPI_STATUS Status; 215 ACPI_NAMESPACE_NODE *Node; 216 ACPI_NAMESPACE_NODE *ParentNode = NULL; 217 ACPI_NAMESPACE_NODE *ChildNode = NULL; 218 219 220 /* Parameter validation */ 221 222 if (Type > ACPI_TYPE_EXTERNAL_MAX) 223 { 224 return (AE_BAD_PARAMETER); 225 } 226 227 Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 228 if (ACPI_FAILURE (Status)) 229 { 230 return (Status); 231 } 232 233 /* If null handle, use the parent */ 234 235 if (!Child) 236 { 237 /* Start search at the beginning of the specified scope */ 238 239 ParentNode = AcpiNsValidateHandle (Parent); 240 if (!ParentNode) 241 { 242 Status = AE_BAD_PARAMETER; 243 goto UnlockAndExit; 244 } 245 } 246 else 247 { 248 /* Non-null handle, ignore the parent */ 249 /* Convert and validate the handle */ 250 251 ChildNode = AcpiNsValidateHandle (Child); 252 if (!ChildNode) 253 { 254 Status = AE_BAD_PARAMETER; 255 goto UnlockAndExit; 256 } 257 } 258 259 /* Internal function does the real work */ 260 261 Node = AcpiNsGetNextNodeTyped (Type, ParentNode, ChildNode); 262 if (!Node) 263 { 264 Status = AE_NOT_FOUND; 265 goto UnlockAndExit; 266 } 267 268 if (RetHandle) 269 { 270 *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, Node); 271 } 272 273 274 UnlockAndExit: 275 276 (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 277 return (Status); 278 } 279 280 ACPI_EXPORT_SYMBOL (AcpiGetNextObject) 281