nsxfobj.c revision 217365
12116Sjkh/*******************************************************************************
22116Sjkh *
32116Sjkh * Module Name: nsxfobj - Public interfaces to the ACPI subsystem
42116Sjkh *                         ACPI Object oriented interfaces
52116Sjkh *
62116Sjkh ******************************************************************************/
72116Sjkh
88870Srgrimes/*
92116Sjkh * Copyright (C) 2000 - 2011, Intel Corp.
102116Sjkh * All rights reserved.
112116Sjkh *
122116Sjkh * Redistribution and use in source and binary forms, with or without
13176385Sbde * modification, are permitted provided that the following conditions
14176385Sbde * are met:
152116Sjkh * 1. Redistributions of source code must retain the above copyright
162116Sjkh *    notice, this list of conditions, and the following disclaimer,
172116Sjkh *    without modification.
182116Sjkh * 2. Redistributions in binary form must reproduce at minimum a disclaimer
192116Sjkh *    substantially similar to the "NO WARRANTY" disclaimer below
202116Sjkh *    ("Disclaimer") and any redistribution must be conditioned upon
212116Sjkh *    including a substantially similar Disclaimer requirement for further
222116Sjkh *    binary redistribution.
232116Sjkh * 3. Neither the names of the above-listed copyright holders nor the names
242116Sjkh *    of any contributors may be used to endorse or promote products derived
258870Srgrimes *    from this software without specific prior written permission.
268870Srgrimes *
272116Sjkh * Alternatively, this software may be distributed under the terms of the
282116Sjkh * GNU General Public License ("GPL") version 2 as published by the Free
292116Sjkh * Software Foundation.
302116Sjkh *
312116Sjkh * NO WARRANTY
322116Sjkh * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
332116Sjkh * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
342116Sjkh * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
352116Sjkh * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
362116Sjkh * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
372116Sjkh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
382116Sjkh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
392116Sjkh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
402116Sjkh * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
412116Sjkh * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
422116Sjkh * POSSIBILITY OF SUCH DAMAGES.
432116Sjkh */
448870Srgrimes
452116Sjkh
462116Sjkh#define __NSXFOBJ_C__
47176360Sdas
48176360Sdas#include <contrib/dev/acpica/include/acpi.h>
492116Sjkh#include <contrib/dev/acpica/include/accommon.h>
50176385Sbde#include <contrib/dev/acpica/include/acnamesp.h>
512116Sjkh
52176385Sbde
532116Sjkh#define _COMPONENT          ACPI_NAMESPACE
5497413Salfred        ACPI_MODULE_NAME    ("nsxfobj")
55117912Speter
562116Sjkh/*******************************************************************************
572116Sjkh *
582116Sjkh * FUNCTION:    AcpiGetType
592116Sjkh *
602116Sjkh * PARAMETERS:  Handle          - Handle of object whose type is desired
612116Sjkh *              RetType         - Where the type will be placed
622116Sjkh *
632116Sjkh * RETURN:      Status
642116Sjkh *
65151620Sbde * DESCRIPTION: This routine returns the type associatd with a particular handle
66218509Sdas *
67151620Sbde ******************************************************************************/
68151620Sbde
69151620SbdeACPI_STATUS
702116SjkhAcpiGetType (
712116Sjkh    ACPI_HANDLE             Handle,
722116Sjkh    ACPI_OBJECT_TYPE        *RetType)
732116Sjkh{
742116Sjkh    ACPI_NAMESPACE_NODE     *Node;
752116Sjkh    ACPI_STATUS             Status;
762116Sjkh
772116Sjkh
782116Sjkh    /* Parameter Validation */
792116Sjkh
802116Sjkh    if (!RetType)
812116Sjkh    {
822116Sjkh        return (AE_BAD_PARAMETER);
832116Sjkh    }
842116Sjkh
852116Sjkh    /*
86176360Sdas     * Special case for the predefined Root Node
87176360Sdas     * (return type ANY)
88176360Sdas     */
89176360Sdas    if (Handle == ACPI_ROOT_OBJECT)
90    {
91        *RetType = ACPI_TYPE_ANY;
92        return (AE_OK);
93    }
94
95    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
96    if (ACPI_FAILURE (Status))
97    {
98        return (Status);
99    }
100
101    /* Convert and validate the handle */
102
103    Node = AcpiNsValidateHandle (Handle);
104    if (!Node)
105    {
106        (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
107        return (AE_BAD_PARAMETER);
108    }
109
110    *RetType = Node->Type;
111
112
113    Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
114    return (Status);
115}
116
117ACPI_EXPORT_SYMBOL (AcpiGetType)
118
119
120/*******************************************************************************
121 *
122 * FUNCTION:    AcpiGetParent
123 *
124 * PARAMETERS:  Handle          - Handle of object whose parent is desired
125 *              RetHandle       - Where the parent handle will be placed
126 *
127 * RETURN:      Status
128 *
129 * DESCRIPTION: Returns a handle to the parent of the object represented by
130 *              Handle.
131 *
132 ******************************************************************************/
133
134ACPI_STATUS
135AcpiGetParent (
136    ACPI_HANDLE             Handle,
137    ACPI_HANDLE             *RetHandle)
138{
139    ACPI_NAMESPACE_NODE     *Node;
140    ACPI_NAMESPACE_NODE     *ParentNode;
141    ACPI_STATUS             Status;
142
143
144    if (!RetHandle)
145    {
146        return (AE_BAD_PARAMETER);
147    }
148
149    /* Special case for the predefined Root Node (no parent) */
150
151    if (Handle == ACPI_ROOT_OBJECT)
152    {
153        return (AE_NULL_ENTRY);
154    }
155
156    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
157    if (ACPI_FAILURE (Status))
158    {
159        return (Status);
160    }
161
162    /* Convert and validate the handle */
163
164    Node = AcpiNsValidateHandle (Handle);
165    if (!Node)
166    {
167        Status = AE_BAD_PARAMETER;
168        goto UnlockAndExit;
169    }
170
171    /* Get the parent entry */
172
173    ParentNode = Node->Parent;
174    *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, ParentNode);
175
176    /* Return exception if parent is null */
177
178    if (!ParentNode)
179    {
180        Status = AE_NULL_ENTRY;
181    }
182
183
184UnlockAndExit:
185
186    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
187    return (Status);
188}
189
190ACPI_EXPORT_SYMBOL (AcpiGetParent)
191
192
193/*******************************************************************************
194 *
195 * FUNCTION:    AcpiGetNextObject
196 *
197 * PARAMETERS:  Type            - Type of object to be searched for
198 *              Parent          - Parent object whose children we are getting
199 *              LastChild       - Previous child that was found.
200 *                                The NEXT child will be returned
201 *              RetHandle       - Where handle to the next object is placed
202 *
203 * RETURN:      Status
204 *
205 * DESCRIPTION: Return the next peer object within the namespace.  If Handle is
206 *              valid, Scope is ignored.  Otherwise, the first object within
207 *              Scope is returned.
208 *
209 ******************************************************************************/
210
211ACPI_STATUS
212AcpiGetNextObject (
213    ACPI_OBJECT_TYPE        Type,
214    ACPI_HANDLE             Parent,
215    ACPI_HANDLE             Child,
216    ACPI_HANDLE             *RetHandle)
217{
218    ACPI_STATUS             Status;
219    ACPI_NAMESPACE_NODE     *Node;
220    ACPI_NAMESPACE_NODE     *ParentNode = NULL;
221    ACPI_NAMESPACE_NODE     *ChildNode = NULL;
222
223
224    /* Parameter validation */
225
226    if (Type > ACPI_TYPE_EXTERNAL_MAX)
227    {
228        return (AE_BAD_PARAMETER);
229    }
230
231    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
232    if (ACPI_FAILURE (Status))
233    {
234        return (Status);
235    }
236
237    /* If null handle, use the parent */
238
239    if (!Child)
240    {
241        /* Start search at the beginning of the specified scope */
242
243        ParentNode = AcpiNsValidateHandle (Parent);
244        if (!ParentNode)
245        {
246            Status = AE_BAD_PARAMETER;
247            goto UnlockAndExit;
248        }
249    }
250    else
251    {
252        /* Non-null handle, ignore the parent */
253        /* Convert and validate the handle */
254
255        ChildNode = AcpiNsValidateHandle (Child);
256        if (!ChildNode)
257        {
258            Status = AE_BAD_PARAMETER;
259            goto UnlockAndExit;
260        }
261    }
262
263    /* Internal function does the real work */
264
265    Node = AcpiNsGetNextNodeTyped (Type, ParentNode, ChildNode);
266    if (!Node)
267    {
268        Status = AE_NOT_FOUND;
269        goto UnlockAndExit;
270    }
271
272    if (RetHandle)
273    {
274        *RetHandle = ACPI_CAST_PTR (ACPI_HANDLE, Node);
275    }
276
277
278UnlockAndExit:
279
280    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
281    return (Status);
282}
283
284ACPI_EXPORT_SYMBOL (AcpiGetNextObject)
285
286