nsxfeval.c revision 167802
1100966Siwasaki/*******************************************************************************
2100966Siwasaki *
3100966Siwasaki * Module Name: nsxfeval - Public interfaces to the ACPI subsystem
4100966Siwasaki *                         ACPI Object evaluation interfaces
5167802Sjkim *              $Revision: 1.30 $
6100966Siwasaki *
7100966Siwasaki ******************************************************************************/
8100966Siwasaki
9100966Siwasaki/******************************************************************************
10100966Siwasaki *
11100966Siwasaki * 1. Copyright Notice
12100966Siwasaki *
13167802Sjkim * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
14100966Siwasaki * All rights reserved.
15100966Siwasaki *
16100966Siwasaki * 2. License
17100966Siwasaki *
18100966Siwasaki * 2.1. This is your license from Intel Corp. under its intellectual property
19100966Siwasaki * rights.  You may have additional license terms from the party that provided
20100966Siwasaki * you this software, covering your right to use that party's intellectual
21100966Siwasaki * property rights.
22100966Siwasaki *
23100966Siwasaki * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
24100966Siwasaki * copy of the source code appearing in this file ("Covered Code") an
25100966Siwasaki * irrevocable, perpetual, worldwide license under Intel's copyrights in the
26100966Siwasaki * base code distributed originally by Intel ("Original Intel Code") to copy,
27100966Siwasaki * make derivatives, distribute, use and display any portion of the Covered
28100966Siwasaki * Code in any form, with the right to sublicense such rights; and
29100966Siwasaki *
30100966Siwasaki * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
31100966Siwasaki * license (with the right to sublicense), under only those claims of Intel
32100966Siwasaki * patents that are infringed by the Original Intel Code, to make, use, sell,
33100966Siwasaki * offer to sell, and import the Covered Code and derivative works thereof
34100966Siwasaki * solely to the minimum extent necessary to exercise the above copyright
35100966Siwasaki * license, and in no event shall the patent license extend to any additions
36100966Siwasaki * to or modifications of the Original Intel Code.  No other license or right
37100966Siwasaki * is granted directly or by implication, estoppel or otherwise;
38100966Siwasaki *
39100966Siwasaki * The above copyright and patent license is granted only if the following
40100966Siwasaki * conditions are met:
41100966Siwasaki *
42100966Siwasaki * 3. Conditions
43100966Siwasaki *
44100966Siwasaki * 3.1. Redistribution of Source with Rights to Further Distribute Source.
45100966Siwasaki * Redistribution of source code of any substantial portion of the Covered
46100966Siwasaki * Code or modification with rights to further distribute source must include
47100966Siwasaki * the above Copyright Notice, the above License, this list of Conditions,
48100966Siwasaki * and the following Disclaimer and Export Compliance provision.  In addition,
49100966Siwasaki * Licensee must cause all Covered Code to which Licensee contributes to
50100966Siwasaki * contain a file documenting the changes Licensee made to create that Covered
51100966Siwasaki * Code and the date of any change.  Licensee must include in that file the
52100966Siwasaki * documentation of any changes made by any predecessor Licensee.  Licensee
53100966Siwasaki * must include a prominent statement that the modification is derived,
54100966Siwasaki * directly or indirectly, from Original Intel Code.
55100966Siwasaki *
56100966Siwasaki * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
57100966Siwasaki * Redistribution of source code of any substantial portion of the Covered
58100966Siwasaki * Code or modification without rights to further distribute source must
59100966Siwasaki * include the following Disclaimer and Export Compliance provision in the
60100966Siwasaki * documentation and/or other materials provided with distribution.  In
61100966Siwasaki * addition, Licensee may not authorize further sublicense of source of any
62100966Siwasaki * portion of the Covered Code, and must include terms to the effect that the
63100966Siwasaki * license from Licensee to its licensee is limited to the intellectual
64100966Siwasaki * property embodied in the software Licensee provides to its licensee, and
65100966Siwasaki * not to intellectual property embodied in modifications its licensee may
66100966Siwasaki * make.
67100966Siwasaki *
68100966Siwasaki * 3.3. Redistribution of Executable. Redistribution in executable form of any
69100966Siwasaki * substantial portion of the Covered Code or modification must reproduce the
70100966Siwasaki * above Copyright Notice, and the following Disclaimer and Export Compliance
71100966Siwasaki * provision in the documentation and/or other materials provided with the
72100966Siwasaki * distribution.
73100966Siwasaki *
74100966Siwasaki * 3.4. Intel retains all right, title, and interest in and to the Original
75100966Siwasaki * Intel Code.
76100966Siwasaki *
77100966Siwasaki * 3.5. Neither the name Intel nor any other trademark owned or controlled by
78100966Siwasaki * Intel shall be used in advertising or otherwise to promote the sale, use or
79100966Siwasaki * other dealings in products derived from or relating to the Covered Code
80100966Siwasaki * without prior written authorization from Intel.
81100966Siwasaki *
82100966Siwasaki * 4. Disclaimer and Export Compliance
83100966Siwasaki *
84100966Siwasaki * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
85100966Siwasaki * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
86100966Siwasaki * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
87100966Siwasaki * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
88100966Siwasaki * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
89100966Siwasaki * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
90100966Siwasaki * PARTICULAR PURPOSE.
91100966Siwasaki *
92100966Siwasaki * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
93100966Siwasaki * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
94100966Siwasaki * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
95100966Siwasaki * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
96100966Siwasaki * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
97100966Siwasaki * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
98100966Siwasaki * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
99100966Siwasaki * LIMITED REMEDY.
100100966Siwasaki *
101100966Siwasaki * 4.3. Licensee shall not export, either directly or indirectly, any of this
102100966Siwasaki * software or system incorporating such software without first obtaining any
103100966Siwasaki * required license or other approval from the U. S. Department of Commerce or
104100966Siwasaki * any other agency or department of the United States Government.  In the
105100966Siwasaki * event Licensee exports any such software from the United States or
106100966Siwasaki * re-exports any such software from a foreign destination, Licensee shall
107100966Siwasaki * ensure that the distribution and export/re-export of the software is in
108100966Siwasaki * compliance with all laws, regulations, orders, or other restrictions of the
109100966Siwasaki * U.S. Export Administration Regulations. Licensee agrees that neither it nor
110100966Siwasaki * any of its subsidiaries will export/re-export any technical data, process,
111100966Siwasaki * software, or service, directly or indirectly, to any country for which the
112100966Siwasaki * United States government or any agency thereof requires an export license,
113100966Siwasaki * other governmental approval, or letter of assurance, without first obtaining
114100966Siwasaki * such license, approval or letter.
115100966Siwasaki *
116100966Siwasaki *****************************************************************************/
117100966Siwasaki
118100966Siwasaki
119100966Siwasaki#define __NSXFEVAL_C__
120100966Siwasaki
121151600Sobrien#include <contrib/dev/acpica/acpi.h>
122151600Sobrien#include <contrib/dev/acpica/acnamesp.h>
123151600Sobrien#include <contrib/dev/acpica/acinterp.h>
124100966Siwasaki
125100966Siwasaki
126100966Siwasaki#define _COMPONENT          ACPI_NAMESPACE
127100966Siwasaki        ACPI_MODULE_NAME    ("nsxfeval")
128100966Siwasaki
129100966Siwasaki
130100966Siwasaki/*******************************************************************************
131100966Siwasaki *
132100966Siwasaki * FUNCTION:    AcpiEvaluateObjectTyped
133100966Siwasaki *
134100966Siwasaki * PARAMETERS:  Handle              - Object handle (optional)
135151937Sjkim *              Pathname            - Object pathname (optional)
136151937Sjkim *              ExternalParams      - List of parameters to pass to method,
137100966Siwasaki *                                    terminated by NULL.  May be NULL
138100966Siwasaki *                                    if no parameters are being passed.
139151937Sjkim *              ReturnBuffer        - Where to put method's return value (if
140100966Siwasaki *                                    any).  If NULL, no value is returned.
141100966Siwasaki *              ReturnType          - Expected type of return object
142100966Siwasaki *
143100966Siwasaki * RETURN:      Status
144100966Siwasaki *
145100966Siwasaki * DESCRIPTION: Find and evaluate the given object, passing the given
146100966Siwasaki *              parameters if necessary.  One of "Handle" or "Pathname" must
147100966Siwasaki *              be valid (non-null)
148100966Siwasaki *
149100966Siwasaki ******************************************************************************/
150100966Siwasaki
151100966SiwasakiACPI_STATUS
152100966SiwasakiAcpiEvaluateObjectTyped (
153100966Siwasaki    ACPI_HANDLE             Handle,
154100966Siwasaki    ACPI_STRING             Pathname,
155100966Siwasaki    ACPI_OBJECT_LIST        *ExternalParams,
156100966Siwasaki    ACPI_BUFFER             *ReturnBuffer,
157100966Siwasaki    ACPI_OBJECT_TYPE        ReturnType)
158100966Siwasaki{
159100966Siwasaki    ACPI_STATUS             Status;
160100966Siwasaki    BOOLEAN                 MustFree = FALSE;
161100966Siwasaki
162100966Siwasaki
163167802Sjkim    ACPI_FUNCTION_TRACE (AcpiEvaluateObjectTyped);
164100966Siwasaki
165100966Siwasaki
166100966Siwasaki    /* Return buffer must be valid */
167100966Siwasaki
168100966Siwasaki    if (!ReturnBuffer)
169100966Siwasaki    {
170100966Siwasaki        return_ACPI_STATUS (AE_BAD_PARAMETER);
171100966Siwasaki    }
172100966Siwasaki
173100966Siwasaki    if (ReturnBuffer->Length == ACPI_ALLOCATE_BUFFER)
174100966Siwasaki    {
175100966Siwasaki        MustFree = TRUE;
176100966Siwasaki    }
177100966Siwasaki
178100966Siwasaki    /* Evaluate the object */
179100966Siwasaki
180100966Siwasaki    Status = AcpiEvaluateObject (Handle, Pathname, ExternalParams, ReturnBuffer);
181100966Siwasaki    if (ACPI_FAILURE (Status))
182100966Siwasaki    {
183100966Siwasaki        return_ACPI_STATUS (Status);
184100966Siwasaki    }
185100966Siwasaki
186100966Siwasaki    /* Type ANY means "don't care" */
187100966Siwasaki
188100966Siwasaki    if (ReturnType == ACPI_TYPE_ANY)
189100966Siwasaki    {
190100966Siwasaki        return_ACPI_STATUS (AE_OK);
191100966Siwasaki    }
192100966Siwasaki
193100966Siwasaki    if (ReturnBuffer->Length == 0)
194100966Siwasaki    {
195100966Siwasaki        /* Error because caller specifically asked for a return value */
196100966Siwasaki
197167802Sjkim        ACPI_ERROR ((AE_INFO, "No return value"));
198100966Siwasaki        return_ACPI_STATUS (AE_NULL_OBJECT);
199100966Siwasaki    }
200100966Siwasaki
201100966Siwasaki    /* Examine the object type returned from EvaluateObject */
202100966Siwasaki
203100966Siwasaki    if (((ACPI_OBJECT *) ReturnBuffer->Pointer)->Type == ReturnType)
204100966Siwasaki    {
205100966Siwasaki        return_ACPI_STATUS (AE_OK);
206100966Siwasaki    }
207100966Siwasaki
208100966Siwasaki    /* Return object type does not match requested type */
209100966Siwasaki
210167802Sjkim    ACPI_ERROR ((AE_INFO,
211167802Sjkim        "Incorrect return type [%s] requested [%s]",
212100966Siwasaki        AcpiUtGetTypeName (((ACPI_OBJECT *) ReturnBuffer->Pointer)->Type),
213100966Siwasaki        AcpiUtGetTypeName (ReturnType)));
214100966Siwasaki
215100966Siwasaki    if (MustFree)
216100966Siwasaki    {
217100966Siwasaki        /* Caller used ACPI_ALLOCATE_BUFFER, free the return buffer */
218100966Siwasaki
219100966Siwasaki        AcpiOsFree (ReturnBuffer->Pointer);
220100966Siwasaki        ReturnBuffer->Pointer = NULL;
221100966Siwasaki    }
222100966Siwasaki
223100966Siwasaki    ReturnBuffer->Length = 0;
224100966Siwasaki    return_ACPI_STATUS (AE_TYPE);
225100966Siwasaki}
226100966Siwasaki
227167802SjkimACPI_EXPORT_SYMBOL (AcpiEvaluateObjectTyped)
228100966Siwasaki
229167802Sjkim
230100966Siwasaki/*******************************************************************************
231100966Siwasaki *
232100966Siwasaki * FUNCTION:    AcpiEvaluateObject
233100966Siwasaki *
234100966Siwasaki * PARAMETERS:  Handle              - Object handle (optional)
235128212Snjl *              Pathname            - Object pathname (optional)
236128212Snjl *              ExternalParams      - List of parameters to pass to method,
237100966Siwasaki *                                    terminated by NULL.  May be NULL
238100966Siwasaki *                                    if no parameters are being passed.
239128212Snjl *              ReturnBuffer        - Where to put method's return value (if
240100966Siwasaki *                                    any).  If NULL, no value is returned.
241100966Siwasaki *
242100966Siwasaki * RETURN:      Status
243100966Siwasaki *
244100966Siwasaki * DESCRIPTION: Find and evaluate the given object, passing the given
245100966Siwasaki *              parameters if necessary.  One of "Handle" or "Pathname" must
246100966Siwasaki *              be valid (non-null)
247100966Siwasaki *
248100966Siwasaki ******************************************************************************/
249100966Siwasaki
250100966SiwasakiACPI_STATUS
251100966SiwasakiAcpiEvaluateObject (
252100966Siwasaki    ACPI_HANDLE             Handle,
253100966Siwasaki    ACPI_STRING             Pathname,
254100966Siwasaki    ACPI_OBJECT_LIST        *ExternalParams,
255100966Siwasaki    ACPI_BUFFER             *ReturnBuffer)
256100966Siwasaki{
257100966Siwasaki    ACPI_STATUS             Status;
258167802Sjkim    ACPI_EVALUATE_INFO      *Info;
259100966Siwasaki    ACPI_SIZE               BufferSpaceNeeded;
260100966Siwasaki    UINT32                  i;
261100966Siwasaki
262100966Siwasaki
263167802Sjkim    ACPI_FUNCTION_TRACE (AcpiEvaluateObject);
264100966Siwasaki
265100966Siwasaki
266167802Sjkim    /* Allocate and initialize the evaluation information block */
267129684Snjl
268167802Sjkim    Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));
269167802Sjkim    if (!Info)
270167802Sjkim    {
271167802Sjkim        return_ACPI_STATUS (AE_NO_MEMORY);
272167802Sjkim    }
273167802Sjkim
274167802Sjkim    Info->Pathname = Pathname;
275167802Sjkim    Info->ParameterType = ACPI_PARAM_ARGS;
276167802Sjkim
277167802Sjkim    /* Convert and validate the device handle */
278167802Sjkim
279167802Sjkim    Info->PrefixNode = AcpiNsMapHandleToNode (Handle);
280167802Sjkim    if (!Info->PrefixNode)
281167802Sjkim    {
282167802Sjkim        Status = AE_BAD_PARAMETER;
283167802Sjkim        goto Cleanup;
284167802Sjkim    }
285167802Sjkim
286100966Siwasaki    /*
287167802Sjkim     * If there are parameters to be passed to a control method, the external
288167802Sjkim     * objects must all be converted to internal objects
289100966Siwasaki     */
290100966Siwasaki    if (ExternalParams && ExternalParams->Count)
291100966Siwasaki    {
292100966Siwasaki        /*
293100966Siwasaki         * Allocate a new parameter block for the internal objects
294100966Siwasaki         * Add 1 to count to allow for null terminated internal list
295100966Siwasaki         */
296167802Sjkim        Info->Parameters = ACPI_ALLOCATE_ZEROED (
297167802Sjkim            ((ACPI_SIZE) ExternalParams->Count + 1) * sizeof (void *));
298167802Sjkim        if (!Info->Parameters)
299100966Siwasaki        {
300167802Sjkim            Status = AE_NO_MEMORY;
301167802Sjkim            goto Cleanup;
302100966Siwasaki        }
303100966Siwasaki
304167802Sjkim        /* Convert each external object in the list to an internal object */
305167802Sjkim
306100966Siwasaki        for (i = 0; i < ExternalParams->Count; i++)
307100966Siwasaki        {
308167802Sjkim            Status = AcpiUtCopyEobjectToIobject (
309167802Sjkim                        &ExternalParams->Pointer[i], &Info->Parameters[i]);
310100966Siwasaki            if (ACPI_FAILURE (Status))
311100966Siwasaki            {
312167802Sjkim                goto Cleanup;
313100966Siwasaki            }
314100966Siwasaki        }
315167802Sjkim        Info->Parameters[ExternalParams->Count] = NULL;
316100966Siwasaki    }
317100966Siwasaki
318100966Siwasaki    /*
319100966Siwasaki     * Three major cases:
320100966Siwasaki     * 1) Fully qualified pathname
321100966Siwasaki     * 2) No handle, not fully qualified pathname (error)
322100966Siwasaki     * 3) Valid handle
323100966Siwasaki     */
324100966Siwasaki    if ((Pathname) &&
325100966Siwasaki        (AcpiNsValidRootPrefix (Pathname[0])))
326100966Siwasaki    {
327167802Sjkim        /* The path is fully qualified, just evaluate by name */
328167802Sjkim
329167802Sjkim        Info->PrefixNode = NULL;
330167802Sjkim        Status = AcpiNsEvaluate (Info);
331100966Siwasaki    }
332100966Siwasaki    else if (!Handle)
333100966Siwasaki    {
334100966Siwasaki        /*
335167802Sjkim         * A handle is optional iff a fully qualified pathname is specified.
336167802Sjkim         * Since we've already handled fully qualified names above, this is
337167802Sjkim         * an error
338100966Siwasaki         */
339100966Siwasaki        if (!Pathname)
340100966Siwasaki        {
341167802Sjkim            ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
342167802Sjkim                "Both Handle and Pathname are NULL"));
343100966Siwasaki        }
344100966Siwasaki        else
345100966Siwasaki        {
346167802Sjkim            ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
347167802Sjkim                "Null Handle with relative pathname [%s]", Pathname));
348100966Siwasaki        }
349100966Siwasaki
350100966Siwasaki        Status = AE_BAD_PARAMETER;
351100966Siwasaki    }
352100966Siwasaki    else
353100966Siwasaki    {
354167802Sjkim        /* We have a namespace a node and a possible relative path */
355167802Sjkim
356167802Sjkim        Status = AcpiNsEvaluate (Info);
357100966Siwasaki    }
358100966Siwasaki
359100966Siwasaki    /*
360100966Siwasaki     * If we are expecting a return value, and all went well above,
361100966Siwasaki     * copy the return value to an external object.
362100966Siwasaki     */
363100966Siwasaki    if (ReturnBuffer)
364100966Siwasaki    {
365167802Sjkim        if (!Info->ReturnObject)
366100966Siwasaki        {
367100966Siwasaki            ReturnBuffer->Length = 0;
368100966Siwasaki        }
369100966Siwasaki        else
370100966Siwasaki        {
371167802Sjkim            if (ACPI_GET_DESCRIPTOR_TYPE (Info->ReturnObject) ==
372167802Sjkim                ACPI_DESC_TYPE_NAMED)
373100966Siwasaki            {
374100966Siwasaki                /*
375100966Siwasaki                 * If we received a NS Node as a return object, this means that
376100966Siwasaki                 * the object we are evaluating has nothing interesting to
377100966Siwasaki                 * return (such as a mutex, etc.)  We return an error because
378100966Siwasaki                 * these types are essentially unsupported by this interface.
379100966Siwasaki                 * We don't check up front because this makes it easier to add
380100966Siwasaki                 * support for various types at a later date if necessary.
381100966Siwasaki                 */
382100966Siwasaki                Status = AE_TYPE;
383167802Sjkim                Info->ReturnObject = NULL;   /* No need to delete a NS Node */
384100966Siwasaki                ReturnBuffer->Length = 0;
385100966Siwasaki            }
386100966Siwasaki
387100966Siwasaki            if (ACPI_SUCCESS (Status))
388100966Siwasaki            {
389167802Sjkim                /* Get the size of the returned object */
390167802Sjkim
391167802Sjkim                Status = AcpiUtGetObjectSize (Info->ReturnObject,
392167802Sjkim                            &BufferSpaceNeeded);
393100966Siwasaki                if (ACPI_SUCCESS (Status))
394100966Siwasaki                {
395100966Siwasaki                    /* Validate/Allocate/Clear caller buffer */
396100966Siwasaki
397151937Sjkim                    Status = AcpiUtInitializeBuffer (ReturnBuffer,
398167802Sjkim                                BufferSpaceNeeded);
399100966Siwasaki                    if (ACPI_FAILURE (Status))
400100966Siwasaki                    {
401100966Siwasaki                        /*
402167802Sjkim                         * Caller's buffer is too small or a new one can't
403167802Sjkim                         * be allocated
404100966Siwasaki                         */
405100966Siwasaki                        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
406100966Siwasaki                            "Needed buffer size %X, %s\n",
407129684Snjl                            (UINT32) BufferSpaceNeeded,
408129684Snjl                            AcpiFormatException (Status)));
409100966Siwasaki                    }
410100966Siwasaki                    else
411100966Siwasaki                    {
412167802Sjkim                        /* We have enough space for the object, build it */
413167802Sjkim
414167802Sjkim                        Status = AcpiUtCopyIobjectToEobject (Info->ReturnObject,
415167802Sjkim                                    ReturnBuffer);
416100966Siwasaki                    }
417100966Siwasaki                }
418100966Siwasaki            }
419100966Siwasaki        }
420100966Siwasaki    }
421100966Siwasaki
422167802Sjkim    if (Info->ReturnObject)
423100966Siwasaki    {
424129684Snjl        /*
425167802Sjkim         * Delete the internal return object. NOTE: Interpreter must be
426167802Sjkim         * locked to avoid race condition.
427100966Siwasaki         */
428167802Sjkim        AcpiExEnterInterpreter ();
429167802Sjkim
430167802Sjkim        /* Remove one reference on the return object (should delete it) */
431167802Sjkim
432167802Sjkim        AcpiUtRemoveReference (Info->ReturnObject);
433167802Sjkim        AcpiExExitInterpreter ();
434100966Siwasaki    }
435100966Siwasaki
436167802Sjkim
437167802SjkimCleanup:
438167802Sjkim
439167802Sjkim    /* Free the input parameter list (if we created one) */
440167802Sjkim
441167802Sjkim    if (Info->Parameters)
442100966Siwasaki    {
443100966Siwasaki        /* Free the allocated parameter block */
444100966Siwasaki
445167802Sjkim        AcpiUtDeleteInternalObjectList (Info->Parameters);
446100966Siwasaki    }
447100966Siwasaki
448167802Sjkim    ACPI_FREE (Info);
449100966Siwasaki    return_ACPI_STATUS (Status);
450100966Siwasaki}
451100966Siwasaki
452167802SjkimACPI_EXPORT_SYMBOL (AcpiEvaluateObject)
453100966Siwasaki
454167802Sjkim
455100966Siwasaki/*******************************************************************************
456100966Siwasaki *
457100966Siwasaki * FUNCTION:    AcpiWalkNamespace
458100966Siwasaki *
459100966Siwasaki * PARAMETERS:  Type                - ACPI_OBJECT_TYPE to search for
460100966Siwasaki *              StartObject         - Handle in namespace where search begins
461100966Siwasaki *              MaxDepth            - Depth to which search is to reach
462100966Siwasaki *              UserFunction        - Called when an object of "Type" is found
463100966Siwasaki *              Context             - Passed to user function
464100966Siwasaki *              ReturnValue         - Location where return value of
465100966Siwasaki *                                    UserFunction is put if terminated early
466100966Siwasaki *
467100966Siwasaki * RETURNS      Return value from the UserFunction if terminated early.
468100966Siwasaki *              Otherwise, returns NULL.
469100966Siwasaki *
470100966Siwasaki * DESCRIPTION: Performs a modified depth-first walk of the namespace tree,
471100966Siwasaki *              starting (and ending) at the object specified by StartHandle.
472100966Siwasaki *              The UserFunction is called whenever an object that matches
473100966Siwasaki *              the type parameter is found.  If the user function returns
474100966Siwasaki *              a non-zero value, the search is terminated immediately and this
475100966Siwasaki *              value is returned to the caller.
476100966Siwasaki *
477100966Siwasaki *              The point of this procedure is to provide a generic namespace
478100966Siwasaki *              walk routine that can be called from multiple places to
479100966Siwasaki *              provide multiple services;  the User Function can be tailored
480100966Siwasaki *              to each task, whether it is a print function, a compare
481100966Siwasaki *              function, etc.
482100966Siwasaki *
483100966Siwasaki ******************************************************************************/
484100966Siwasaki
485100966SiwasakiACPI_STATUS
486100966SiwasakiAcpiWalkNamespace (
487100966Siwasaki    ACPI_OBJECT_TYPE        Type,
488100966Siwasaki    ACPI_HANDLE             StartObject,
489100966Siwasaki    UINT32                  MaxDepth,
490100966Siwasaki    ACPI_WALK_CALLBACK      UserFunction,
491100966Siwasaki    void                    *Context,
492100966Siwasaki    void                    **ReturnValue)
493100966Siwasaki{
494100966Siwasaki    ACPI_STATUS             Status;
495100966Siwasaki
496100966Siwasaki
497167802Sjkim    ACPI_FUNCTION_TRACE (AcpiWalkNamespace);
498100966Siwasaki
499100966Siwasaki
500100966Siwasaki    /* Parameter validation */
501100966Siwasaki
502167802Sjkim    if ((Type > ACPI_TYPE_LOCAL_MAX) ||
503167802Sjkim        (!MaxDepth)                  ||
504100966Siwasaki        (!UserFunction))
505100966Siwasaki    {
506100966Siwasaki        return_ACPI_STATUS (AE_BAD_PARAMETER);
507100966Siwasaki    }
508100966Siwasaki
509100966Siwasaki    /*
510100966Siwasaki     * Lock the namespace around the walk.
511100966Siwasaki     * The namespace will be unlocked/locked around each call
512100966Siwasaki     * to the user function - since this function
513100966Siwasaki     * must be allowed to make Acpi calls itself.
514100966Siwasaki     */
515100966Siwasaki    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
516100966Siwasaki    if (ACPI_FAILURE (Status))
517100966Siwasaki    {
518100966Siwasaki        return_ACPI_STATUS (Status);
519100966Siwasaki    }
520100966Siwasaki
521151937Sjkim    Status = AcpiNsWalkNamespace (Type, StartObject, MaxDepth,
522151937Sjkim                    ACPI_NS_WALK_UNLOCK,
523100966Siwasaki                    UserFunction, Context, ReturnValue);
524100966Siwasaki
525100966Siwasaki    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
526100966Siwasaki    return_ACPI_STATUS (Status);
527100966Siwasaki}
528100966Siwasaki
529167802SjkimACPI_EXPORT_SYMBOL (AcpiWalkNamespace)
530100966Siwasaki
531167802Sjkim
532100966Siwasaki/*******************************************************************************
533100966Siwasaki *
534100966Siwasaki * FUNCTION:    AcpiNsGetDeviceCallback
535100966Siwasaki *
536100966Siwasaki * PARAMETERS:  Callback from AcpiGetDevice
537100966Siwasaki *
538100966Siwasaki * RETURN:      Status
539100966Siwasaki *
540100966Siwasaki * DESCRIPTION: Takes callbacks from WalkNamespace and filters out all non-
541100966Siwasaki *              present devices, or if they specified a HID, it filters based
542100966Siwasaki *              on that.
543100966Siwasaki *
544100966Siwasaki ******************************************************************************/
545100966Siwasaki
546100966Siwasakistatic ACPI_STATUS
547100966SiwasakiAcpiNsGetDeviceCallback (
548100966Siwasaki    ACPI_HANDLE             ObjHandle,
549100966Siwasaki    UINT32                  NestingLevel,
550100966Siwasaki    void                    *Context,
551100966Siwasaki    void                    **ReturnValue)
552100966Siwasaki{
553117521Snjl    ACPI_GET_DEVICES_INFO   *Info = Context;
554100966Siwasaki    ACPI_STATUS             Status;
555100966Siwasaki    ACPI_NAMESPACE_NODE     *Node;
556100966Siwasaki    UINT32                  Flags;
557100966Siwasaki    ACPI_DEVICE_ID          Hid;
558117521Snjl    ACPI_COMPATIBLE_ID_LIST *Cid;
559117521Snjl    ACPI_NATIVE_UINT        i;
560100966Siwasaki
561100966Siwasaki
562100966Siwasaki    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
563100966Siwasaki    if (ACPI_FAILURE (Status))
564100966Siwasaki    {
565100966Siwasaki        return (Status);
566100966Siwasaki    }
567100966Siwasaki
568100966Siwasaki    Node = AcpiNsMapHandleToNode (ObjHandle);
569100966Siwasaki    Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
570100966Siwasaki    if (ACPI_FAILURE (Status))
571100966Siwasaki    {
572100966Siwasaki        return (Status);
573100966Siwasaki    }
574100966Siwasaki
575100966Siwasaki    if (!Node)
576100966Siwasaki    {
577100966Siwasaki        return (AE_BAD_PARAMETER);
578100966Siwasaki    }
579100966Siwasaki
580117521Snjl    /* Run _STA to determine if device is present */
581117521Snjl
582100966Siwasaki    Status = AcpiUtExecute_STA (Node, &Flags);
583100966Siwasaki    if (ACPI_FAILURE (Status))
584100966Siwasaki    {
585100966Siwasaki        return (AE_CTRL_DEPTH);
586100966Siwasaki    }
587100966Siwasaki
588167802Sjkim    if (!(Flags & ACPI_STA_DEVICE_PRESENT))
589100966Siwasaki    {
590167802Sjkim        /* Don't examine children of the device if not present */
591117521Snjl
592100966Siwasaki        return (AE_CTRL_DEPTH);
593100966Siwasaki    }
594100966Siwasaki
595117521Snjl    /* Filter based on device HID & CID */
596117521Snjl
597100966Siwasaki    if (Info->Hid != NULL)
598100966Siwasaki    {
599100966Siwasaki        Status = AcpiUtExecute_HID (Node, &Hid);
600100966Siwasaki        if (Status == AE_NOT_FOUND)
601100966Siwasaki        {
602100966Siwasaki            return (AE_OK);
603100966Siwasaki        }
604100966Siwasaki        else if (ACPI_FAILURE (Status))
605100966Siwasaki        {
606100966Siwasaki            return (AE_CTRL_DEPTH);
607100966Siwasaki        }
608100966Siwasaki
609117521Snjl        if (ACPI_STRNCMP (Hid.Value, Info->Hid, sizeof (Hid.Value)) != 0)
610100966Siwasaki        {
611117521Snjl            /* Get the list of Compatible IDs */
612117521Snjl
613100966Siwasaki            Status = AcpiUtExecute_CID (Node, &Cid);
614100966Siwasaki            if (Status == AE_NOT_FOUND)
615100966Siwasaki            {
616100966Siwasaki                return (AE_OK);
617100966Siwasaki            }
618100966Siwasaki            else if (ACPI_FAILURE (Status))
619100966Siwasaki            {
620100966Siwasaki                return (AE_CTRL_DEPTH);
621100966Siwasaki            }
622100966Siwasaki
623117521Snjl            /* Walk the CID list */
624100966Siwasaki
625117521Snjl            for (i = 0; i < Cid->Count; i++)
626100966Siwasaki            {
627117521Snjl                if (ACPI_STRNCMP (Cid->Id[i].Value, Info->Hid,
628117521Snjl                                        sizeof (ACPI_COMPATIBLE_ID)) != 0)
629117521Snjl                {
630167802Sjkim                    ACPI_FREE (Cid);
631117521Snjl                    return (AE_OK);
632117521Snjl                }
633100966Siwasaki            }
634167802Sjkim            ACPI_FREE (Cid);
635100966Siwasaki        }
636100966Siwasaki    }
637100966Siwasaki
638151937Sjkim    Status = Info->UserFunction (ObjHandle, NestingLevel, Info->Context,
639151937Sjkim                ReturnValue);
640100966Siwasaki    return (Status);
641100966Siwasaki}
642100966Siwasaki
643100966Siwasaki
644100966Siwasaki/*******************************************************************************
645100966Siwasaki *
646100966Siwasaki * FUNCTION:    AcpiGetDevices
647100966Siwasaki *
648100966Siwasaki * PARAMETERS:  HID                 - HID to search for. Can be NULL.
649100966Siwasaki *              UserFunction        - Called when a matching object is found
650100966Siwasaki *              Context             - Passed to user function
651100966Siwasaki *              ReturnValue         - Location where return value of
652100966Siwasaki *                                    UserFunction is put if terminated early
653100966Siwasaki *
654100966Siwasaki * RETURNS      Return value from the UserFunction if terminated early.
655100966Siwasaki *              Otherwise, returns NULL.
656100966Siwasaki *
657100966Siwasaki * DESCRIPTION: Performs a modified depth-first walk of the namespace tree,
658100966Siwasaki *              starting (and ending) at the object specified by StartHandle.
659117521Snjl *              The UserFunction is called whenever an object of type
660117521Snjl *              Device is found.  If the user function returns
661100966Siwasaki *              a non-zero value, the search is terminated immediately and this
662100966Siwasaki *              value is returned to the caller.
663100966Siwasaki *
664100966Siwasaki *              This is a wrapper for WalkNamespace, but the callback performs
665100966Siwasaki *              additional filtering. Please see AcpiGetDeviceCallback.
666100966Siwasaki *
667100966Siwasaki ******************************************************************************/
668100966Siwasaki
669100966SiwasakiACPI_STATUS
670100966SiwasakiAcpiGetDevices (
671114237Snjl    char                    *HID,
672100966Siwasaki    ACPI_WALK_CALLBACK      UserFunction,
673100966Siwasaki    void                    *Context,
674100966Siwasaki    void                    **ReturnValue)
675100966Siwasaki{
676100966Siwasaki    ACPI_STATUS             Status;
677100966Siwasaki    ACPI_GET_DEVICES_INFO   Info;
678100966Siwasaki
679100966Siwasaki
680167802Sjkim    ACPI_FUNCTION_TRACE (AcpiGetDevices);
681100966Siwasaki
682100966Siwasaki
683100966Siwasaki    /* Parameter validation */
684100966Siwasaki
685100966Siwasaki    if (!UserFunction)
686100966Siwasaki    {
687100966Siwasaki        return_ACPI_STATUS (AE_BAD_PARAMETER);
688100966Siwasaki    }
689100966Siwasaki
690100966Siwasaki    /*
691100966Siwasaki     * We're going to call their callback from OUR callback, so we need
692100966Siwasaki     * to know what it is, and their context parameter.
693100966Siwasaki     */
694167802Sjkim    Info.Hid          = HID;
695100966Siwasaki    Info.Context      = Context;
696100966Siwasaki    Info.UserFunction = UserFunction;
697100966Siwasaki
698100966Siwasaki    /*
699100966Siwasaki     * Lock the namespace around the walk.
700100966Siwasaki     * The namespace will be unlocked/locked around each call
701100966Siwasaki     * to the user function - since this function
702100966Siwasaki     * must be allowed to make Acpi calls itself.
703100966Siwasaki     */
704100966Siwasaki    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
705100966Siwasaki    if (ACPI_FAILURE (Status))
706100966Siwasaki    {
707100966Siwasaki        return_ACPI_STATUS (Status);
708100966Siwasaki    }
709100966Siwasaki
710167802Sjkim    Status = AcpiNsWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
711167802Sjkim                ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK,
712167802Sjkim                AcpiNsGetDeviceCallback, &Info, ReturnValue);
713100966Siwasaki
714100966Siwasaki    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
715100966Siwasaki    return_ACPI_STATUS (Status);
716100966Siwasaki}
717100966Siwasaki
718167802SjkimACPI_EXPORT_SYMBOL (AcpiGetDevices)
719100966Siwasaki
720167802Sjkim
721100966Siwasaki/*******************************************************************************
722100966Siwasaki *
723100966Siwasaki * FUNCTION:    AcpiAttachData
724100966Siwasaki *
725114237Snjl * PARAMETERS:  ObjHandle           - Namespace node
726107325Siwasaki *              Handler             - Handler for this attachment
727107325Siwasaki *              Data                - Pointer to data to be attached
728100966Siwasaki *
729100966Siwasaki * RETURN:      Status
730100966Siwasaki *
731107325Siwasaki * DESCRIPTION: Attach arbitrary data and handler to a namespace node.
732100966Siwasaki *
733100966Siwasaki ******************************************************************************/
734100966Siwasaki
735100966SiwasakiACPI_STATUS
736100966SiwasakiAcpiAttachData (
737100966Siwasaki    ACPI_HANDLE             ObjHandle,
738100966Siwasaki    ACPI_OBJECT_HANDLER     Handler,
739100966Siwasaki    void                    *Data)
740100966Siwasaki{
741100966Siwasaki    ACPI_NAMESPACE_NODE     *Node;
742100966Siwasaki    ACPI_STATUS             Status;
743100966Siwasaki
744100966Siwasaki
745100966Siwasaki    /* Parameter validation */
746100966Siwasaki
747100966Siwasaki    if (!ObjHandle  ||
748100966Siwasaki        !Handler    ||
749100966Siwasaki        !Data)
750100966Siwasaki    {
751100966Siwasaki        return (AE_BAD_PARAMETER);
752100966Siwasaki    }
753100966Siwasaki
754100966Siwasaki    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
755100966Siwasaki    if (ACPI_FAILURE (Status))
756100966Siwasaki    {
757100966Siwasaki        return (Status);
758100966Siwasaki    }
759100966Siwasaki
760100966Siwasaki    /* Convert and validate the handle */
761100966Siwasaki
762100966Siwasaki    Node = AcpiNsMapHandleToNode (ObjHandle);
763100966Siwasaki    if (!Node)
764100966Siwasaki    {
765100966Siwasaki        Status = AE_BAD_PARAMETER;
766100966Siwasaki        goto UnlockAndExit;
767100966Siwasaki    }
768100966Siwasaki
769100966Siwasaki    Status = AcpiNsAttachData (Node, Handler, Data);
770100966Siwasaki
771100966SiwasakiUnlockAndExit:
772100966Siwasaki    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
773100966Siwasaki    return (Status);
774100966Siwasaki}
775100966Siwasaki
776167802SjkimACPI_EXPORT_SYMBOL (AcpiAttachData)
777100966Siwasaki
778167802Sjkim
779100966Siwasaki/*******************************************************************************
780100966Siwasaki *
781100966Siwasaki * FUNCTION:    AcpiDetachData
782100966Siwasaki *
783107325Siwasaki * PARAMETERS:  ObjHandle           - Namespace node handle
784107325Siwasaki *              Handler             - Handler used in call to AcpiAttachData
785100966Siwasaki *
786100966Siwasaki * RETURN:      Status
787100966Siwasaki *
788107325Siwasaki * DESCRIPTION: Remove data that was previously attached to a node.
789100966Siwasaki *
790100966Siwasaki ******************************************************************************/
791100966Siwasaki
792100966SiwasakiACPI_STATUS
793100966SiwasakiAcpiDetachData (
794100966Siwasaki    ACPI_HANDLE             ObjHandle,
795100966Siwasaki    ACPI_OBJECT_HANDLER     Handler)
796100966Siwasaki{
797100966Siwasaki    ACPI_NAMESPACE_NODE     *Node;
798100966Siwasaki    ACPI_STATUS             Status;
799100966Siwasaki
800100966Siwasaki
801100966Siwasaki    /* Parameter validation */
802100966Siwasaki
803100966Siwasaki    if (!ObjHandle  ||
804100966Siwasaki        !Handler)
805100966Siwasaki    {
806100966Siwasaki        return (AE_BAD_PARAMETER);
807100966Siwasaki    }
808100966Siwasaki
809100966Siwasaki    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
810100966Siwasaki    if (ACPI_FAILURE (Status))
811100966Siwasaki    {
812100966Siwasaki        return (Status);
813100966Siwasaki    }
814100966Siwasaki
815100966Siwasaki    /* Convert and validate the handle */
816100966Siwasaki
817100966Siwasaki    Node = AcpiNsMapHandleToNode (ObjHandle);
818100966Siwasaki    if (!Node)
819100966Siwasaki    {
820100966Siwasaki        Status = AE_BAD_PARAMETER;
821100966Siwasaki        goto UnlockAndExit;
822100966Siwasaki    }
823100966Siwasaki
824100966Siwasaki    Status = AcpiNsDetachData (Node, Handler);
825100966Siwasaki
826100966SiwasakiUnlockAndExit:
827100966Siwasaki    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
828100966Siwasaki    return (Status);
829100966Siwasaki}
830100966Siwasaki
831167802SjkimACPI_EXPORT_SYMBOL (AcpiDetachData)
832100966Siwasaki
833167802Sjkim
834100966Siwasaki/*******************************************************************************
835100966Siwasaki *
836100966Siwasaki * FUNCTION:    AcpiGetData
837100966Siwasaki *
838107325Siwasaki * PARAMETERS:  ObjHandle           - Namespace node
839107325Siwasaki *              Handler             - Handler used in call to AttachData
840107325Siwasaki *              Data                - Where the data is returned
841100966Siwasaki *
842100966Siwasaki * RETURN:      Status
843100966Siwasaki *
844107325Siwasaki * DESCRIPTION: Retrieve data that was previously attached to a namespace node.
845100966Siwasaki *
846100966Siwasaki ******************************************************************************/
847100966Siwasaki
848100966SiwasakiACPI_STATUS
849100966SiwasakiAcpiGetData (
850100966Siwasaki    ACPI_HANDLE             ObjHandle,
851100966Siwasaki    ACPI_OBJECT_HANDLER     Handler,
852100966Siwasaki    void                    **Data)
853100966Siwasaki{
854100966Siwasaki    ACPI_NAMESPACE_NODE     *Node;
855100966Siwasaki    ACPI_STATUS             Status;
856100966Siwasaki
857100966Siwasaki
858100966Siwasaki    /* Parameter validation */
859100966Siwasaki
860100966Siwasaki    if (!ObjHandle  ||
861100966Siwasaki        !Handler    ||
862100966Siwasaki        !Data)
863100966Siwasaki    {
864100966Siwasaki        return (AE_BAD_PARAMETER);
865100966Siwasaki    }
866100966Siwasaki
867100966Siwasaki    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
868100966Siwasaki    if (ACPI_FAILURE (Status))
869100966Siwasaki    {
870100966Siwasaki        return (Status);
871100966Siwasaki    }
872100966Siwasaki
873100966Siwasaki    /* Convert and validate the handle */
874100966Siwasaki
875100966Siwasaki    Node = AcpiNsMapHandleToNode (ObjHandle);
876100966Siwasaki    if (!Node)
877100966Siwasaki    {
878100966Siwasaki        Status = AE_BAD_PARAMETER;
879100966Siwasaki        goto UnlockAndExit;
880100966Siwasaki    }
881100966Siwasaki
882100966Siwasaki    Status = AcpiNsGetAttachedData (Node, Handler, Data);
883100966Siwasaki
884100966SiwasakiUnlockAndExit:
885100966Siwasaki    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
886100966Siwasaki    return (Status);
887100966Siwasaki}
888100966Siwasaki
889167802SjkimACPI_EXPORT_SYMBOL (AcpiGetData)
890100966Siwasaki
891167802Sjkim
892