nsxfobj.c revision 256281
1311118Sdim/*******************************************************************************
2311118Sdim *
3353358Sdim * Module Name: nsxfobj - Public interfaces to the ACPI subsystem
4353358Sdim *                         ACPI Object oriented interfaces
5353358Sdim *
6311118Sdim ******************************************************************************/
7311118Sdim
8311118Sdim/*
9311118Sdim * Copyright (C) 2000 - 2013, Intel Corp.
10311118Sdim * All rights reserved.
11311118Sdim *
12311118Sdim * Redistribution and use in source and binary forms, with or without
13311118Sdim * modification, are permitted provided that the following conditions
14311118Sdim * are met:
15311118Sdim * 1. Redistributions of source code must retain the above copyright
16311118Sdim *    notice, this list of conditions, and the following disclaimer,
17344779Sdim *    without modification.
18311118Sdim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19311118Sdim *    substantially similar to the "NO WARRANTY" disclaimer below
20311118Sdim *    ("Disclaimer") and any redistribution must be conditioned upon
21311118Sdim *    including a substantially similar Disclaimer requirement for further
22311118Sdim *    binary redistribution.
23311118Sdim * 3. Neither the names of the above-listed copyright holders nor the names
24311118Sdim *    of any contributors may be used to endorse or promote products derived
25311118Sdim *    from this software without specific prior written permission.
26311118Sdim *
27311118Sdim * Alternatively, this software may be distributed under the terms of the
28311118Sdim * GNU General Public License ("GPL") version 2 as published by the Free
29311118Sdim * Software Foundation.
30311118Sdim *
31311118Sdim * NO WARRANTY
32311118Sdim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33311118Sdim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34311118Sdim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35311118Sdim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36311118Sdim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37311118Sdim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38311118Sdim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39311118Sdim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40311118Sdim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41311118Sdim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42311118Sdim * POSSIBILITY OF SUCH DAMAGES.
43311118Sdim */
44311118Sdim
45311118Sdim
46311118Sdim#define __NSXFOBJ_C__
47311118Sdim
48311118Sdim#include <contrib/dev/acpica/include/acpi.h>
49311118Sdim#include <contrib/dev/acpica/include/accommon.h>
50311118Sdim#include <contrib/dev/acpica/include/acnamesp.h>
51311118Sdim
52311118Sdim
53311118Sdim#define _COMPONENT          ACPI_NAMESPACE
54311118Sdim        ACPI_MODULE_NAME    ("nsxfobj")
55311118Sdim
56311118Sdim/*******************************************************************************
57311118Sdim *
58311118Sdim * FUNCTION:    AcpiGetType
59311118Sdim *
60311118Sdim * PARAMETERS:  Handle          - Handle of object whose type is desired
61311118Sdim *              RetType         - Where the type will be placed
62311118Sdim *
63311118Sdim * RETURN:      Status
64311118Sdim *
65311118Sdim * DESCRIPTION: This routine returns the type associatd with a particular handle
66311118Sdim *
67311118Sdim ******************************************************************************/
68311118Sdim
69311118SdimACPI_STATUS
70311118SdimAcpiGetType (
71    ACPI_HANDLE             Handle,
72    ACPI_OBJECT_TYPE        *RetType)
73{
74    ACPI_NAMESPACE_NODE     *Node;
75    ACPI_STATUS             Status;
76
77
78    /* Parameter Validation */
79
80    if (!RetType)
81    {
82        return (AE_BAD_PARAMETER);
83    }
84
85    /*
86     * Special case for the predefined Root Node
87     * (return type ANY)
88     */
89    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