nsxfobj.c revision 241973
197403Sobrien/******************************************************************************* 297403Sobrien * 3169691Skan * Module Name: nsxfobj - Public interfaces to the ACPI subsystem 4117397Skan * ACPI Object oriented interfaces 597403Sobrien * 697403Sobrien ******************************************************************************/ 797403Sobrien 897403Sobrien/* 997403Sobrien * Copyright (C) 2000 - 2012, Intel Corp. 1097403Sobrien * All rights reserved. 1197403Sobrien * 1297403Sobrien * Redistribution and use in source and binary forms, with or without 1397403Sobrien * modification, are permitted provided that the following conditions 1497403Sobrien * are met: 1597403Sobrien * 1. Redistributions of source code must retain the above copyright 1697403Sobrien * notice, this list of conditions, and the following disclaimer, 1797403Sobrien * without modification. 1897403Sobrien * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19169691Skan * substantially similar to the "NO WARRANTY" disclaimer below 2097403Sobrien * ("Disclaimer") and any redistribution must be conditioned upon 2197403Sobrien * including a substantially similar Disclaimer requirement for further 2297403Sobrien * binary redistribution. 2397403Sobrien * 3. Neither the names of the above-listed copyright holders nor the names 2497403Sobrien * of any contributors may be used to endorse or promote products derived 2597403Sobrien * from this software without specific prior written permission. 2697403Sobrien * 2797403Sobrien * Alternatively, this software may be distributed under the terms of the 2897403Sobrien * GNU General Public License ("GPL") version 2 as published by the Free 2997403Sobrien * Software Foundation. 3097403Sobrien * 3197403Sobrien * NO WARRANTY 3297403Sobrien * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3397403Sobrien * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3497403Sobrien * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3597403Sobrien * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36132720Skan * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37132720Skan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3897403Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3997403Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 4097403Sobrien * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 4197403Sobrien * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42117397Skan * POSSIBILITY OF SUCH DAMAGES. 43117397Skan */ 4497403Sobrien 4597403Sobrien 46169691Skan#define __NSXFOBJ_C__ 47169691Skan 4897403Sobrien#include <contrib/dev/acpica/include/acpi.h> 49117397Skan#include <contrib/dev/acpica/include/accommon.h> 50117397Skan#include <contrib/dev/acpica/include/acnamesp.h> 51117397Skan 52117397Skan 53117397Skan#define _COMPONENT ACPI_NAMESPACE 54117397Skan ACPI_MODULE_NAME ("nsxfobj") 5597403Sobrien 5697403Sobrien/******************************************************************************* 5797403Sobrien * 5897403Sobrien * FUNCTION: AcpiGetType 59117397Skan * 60117397Skan * PARAMETERS: Handle - Handle of object whose type is desired 61117397Skan * RetType - Where the type will be placed 62117397Skan * 63117397Skan * RETURN: Status 64117397Skan * 65117397Skan * DESCRIPTION: This routine returns the type associatd with a particular handle 66117397Skan * 67117397Skan ******************************************************************************/ 68117397Skan 69117397SkanACPI_STATUS 70117397SkanAcpiGetType ( 7197403Sobrien ACPI_HANDLE Handle, 72117397Skan ACPI_OBJECT_TYPE *RetType) 73117397Skan{ 74117397Skan ACPI_NAMESPACE_NODE *Node; 75117397Skan ACPI_STATUS Status; 76117397Skan 77117397Skan 78117397Skan /* Parameter Validation */ 79132720Skan 80132720Skan if (!RetType) 81132720Skan { 82132720Skan return (AE_BAD_PARAMETER); 83117397Skan } 84117397Skan 8597403Sobrien /* 8697403Sobrien * Special case for the predefined Root Node 87117397Skan * (return type ANY) 88117397Skan */ 89117397Skan if (Handle == ACPI_ROOT_OBJECT) 90117397Skan { 9197403Sobrien *RetType = ACPI_TYPE_ANY; 9297403Sobrien return (AE_OK); 93132720Skan } 94132720Skan 95132720Skan Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 96132720Skan if (ACPI_FAILURE (Status)) 97132720Skan { 9897403Sobrien return (Status); 9997403Sobrien } 100117397Skan 101117397Skan /* Convert and validate the handle */ 102117397Skan 103117397Skan Node = AcpiNsValidateHandle (Handle); 104117397Skan if (!Node) 105117397Skan { 106117397Skan (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 107132720Skan return (AE_BAD_PARAMETER); 10897403Sobrien } 10997403Sobrien 110132720Skan *RetType = Node->Type; 111132720Skan 11297403Sobrien 113117397Skan Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 11497403Sobrien return (Status); 115117397Skan} 116117397Skan 117117397SkanACPI_EXPORT_SYMBOL (AcpiGetType) 118117397Skan 119117397Skan 120117397Skan/******************************************************************************* 121117397Skan * 122132720Skan * FUNCTION: AcpiGetParent 123132720Skan * 12497403Sobrien * PARAMETERS: Handle - Handle of object whose parent is desired 12597403Sobrien * RetHandle - Where the parent handle will be placed 126117397Skan * 127117397Skan * RETURN: Status 128117397Skan * 129117397Skan * DESCRIPTION: Returns a handle to the parent of the object represented by 130117397Skan * Handle. 131117397Skan * 132117397Skan ******************************************************************************/ 133132720Skan 13497403SobrienACPI_STATUS 13597403SobrienAcpiGetParent ( 136117397Skan ACPI_HANDLE Handle, 137117397Skan ACPI_HANDLE *RetHandle) 138117397Skan{ 139117397Skan ACPI_NAMESPACE_NODE *Node; 140117397Skan ACPI_NAMESPACE_NODE *ParentNode; 141117397Skan ACPI_STATUS Status; 142132720Skan 143132720Skan 14497403Sobrien if (!RetHandle) 14597403Sobrien { 146132720Skan return (AE_BAD_PARAMETER); 147132720Skan } 148132720Skan 149132720Skan /* Special case for the predefined Root Node (no parent) */ 150132720Skan 151132720Skan if (Handle == ACPI_ROOT_OBJECT) 152132720Skan { 153132720Skan return (AE_NULL_ENTRY); 154132720Skan } 155132720Skan 156132720Skan Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 157132720Skan if (ACPI_FAILURE (Status)) 158132720Skan { 159117397Skan return (Status); 160117397Skan } 161117397Skan 162117397Skan /* Convert and validate the handle */ 163117397Skan 164117397Skan Node = AcpiNsValidateHandle (Handle); 165132720Skan if (!Node) 166132720Skan { 16797403Sobrien Status = AE_BAD_PARAMETER; 16897403Sobrien goto UnlockAndExit; 169117397Skan } 170117397Skan 171117397Skan /* Get the parent entry */ 172117397Skan 173117397Skan ParentNode = Node->Parent; 174117397Skan *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, ParentNode); 175132720Skan 176132720Skan /* Return exception if parent is null */ 17797403Sobrien 17897403Sobrien if (!ParentNode) 179117397Skan { 180117397Skan Status = AE_NULL_ENTRY; 181117397Skan } 182117397Skan 183117397Skan 184117397SkanUnlockAndExit: 185117397Skan 186132720Skan (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 187132720Skan return (Status); 18897403Sobrien} 18997403Sobrien 190117397SkanACPI_EXPORT_SYMBOL (AcpiGetParent) 191117397Skan 192117397Skan 193117397Skan/******************************************************************************* 194117397Skan * 195117397Skan * FUNCTION: AcpiGetNextObject 196132720Skan * 197132720Skan * PARAMETERS: Type - Type of object to be searched for 19897403Sobrien * Parent - Parent object whose children we are getting 19997403Sobrien * LastChild - Previous child that was found. 200117397Skan * The NEXT child will be returned 201117397Skan * RetHandle - Where handle to the next object is placed 202117397Skan * 203117397Skan * RETURN: Status 204117397Skan * 205117397Skan * DESCRIPTION: Return the next peer object within the namespace. If Handle is 206117397Skan * valid, Scope is ignored. Otherwise, the first object within 207132720Skan * Scope is returned. 208132720Skan * 20997403Sobrien ******************************************************************************/ 21097403Sobrien 211117397SkanACPI_STATUS 212117397SkanAcpiGetNextObject ( 213117397Skan ACPI_OBJECT_TYPE Type, 214117397Skan ACPI_HANDLE Parent, 215117397Skan ACPI_HANDLE Child, 216117397Skan ACPI_HANDLE *RetHandle) 217117397Skan{ 218117397Skan ACPI_STATUS Status; 219117397Skan ACPI_NAMESPACE_NODE *Node; 220117397Skan ACPI_NAMESPACE_NODE *ParentNode = NULL; 221117397Skan ACPI_NAMESPACE_NODE *ChildNode = NULL; 222117397Skan 223117397Skan 224117397Skan /* Parameter validation */ 225117397Skan 226117397Skan if (Type > ACPI_TYPE_EXTERNAL_MAX) 227132720Skan { 228117397Skan return (AE_BAD_PARAMETER); 229117397Skan } 230117397Skan 231132720Skan Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 232117397Skan if (ACPI_FAILURE (Status)) 233132720Skan { 234117397Skan return (Status); 235117397Skan } 236132720Skan 237117397Skan /* If null handle, use the parent */ 238117397Skan 239117397Skan if (!Child) 240117397Skan { 241117397Skan /* Start search at the beginning of the specified scope */ 242132720Skan 243132720Skan ParentNode = AcpiNsValidateHandle (Parent); 244132720Skan if (!ParentNode) 245132720Skan { 246132720Skan Status = AE_BAD_PARAMETER; 24797403Sobrien goto UnlockAndExit; 24897403Sobrien } 24997403Sobrien } 250117397Skan else 251117397Skan { 252117397Skan /* Non-null handle, ignore the parent */ 253117397Skan /* Convert and validate the handle */ 254117397Skan 255132720Skan ChildNode = AcpiNsValidateHandle (Child); 256132720Skan if (!ChildNode) 257132720Skan { 258132720Skan Status = AE_BAD_PARAMETER; 25997403Sobrien goto UnlockAndExit; 26097403Sobrien } 261117397Skan } 262117397Skan 263117397Skan /* Internal function does the real work */ 264117397Skan 265117397Skan Node = AcpiNsGetNextNodeTyped (Type, ParentNode, ChildNode); 266117397Skan if (!Node) 267132720Skan { 26897403Sobrien Status = AE_NOT_FOUND; 269132720Skan goto UnlockAndExit; 27097403Sobrien } 271117397Skan 272117397Skan if (RetHandle) 273117397Skan { 274117397Skan *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, Node); 275117397Skan } 276117397Skan 277117397Skan 278117397SkanUnlockAndExit: 279117397Skan 28097403Sobrien (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 281132720Skan return (Status); 28297403Sobrien} 28397403Sobrien 284117397SkanACPI_EXPORT_SYMBOL (AcpiGetNextObject) 285117397Skan