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