nsinit.c revision 140216
167754Smsmith/******************************************************************************
267754Smsmith *
367754Smsmith * Module Name: nsinit - namespace initialization
4138287Smarks *              $Revision: 62 $
567754Smsmith *
667754Smsmith *****************************************************************************/
767754Smsmith
867754Smsmith/******************************************************************************
967754Smsmith *
1067754Smsmith * 1. Copyright Notice
1167754Smsmith *
12126372Snjl * Some or all of this work - Copyright (c) 1999 - 2004, Intel Corp.
1370243Smsmith * All rights reserved.
1467754Smsmith *
1567754Smsmith * 2. License
1667754Smsmith *
1767754Smsmith * 2.1. This is your license from Intel Corp. under its intellectual property
1867754Smsmith * rights.  You may have additional license terms from the party that provided
1967754Smsmith * you this software, covering your right to use that party's intellectual
2067754Smsmith * property rights.
2167754Smsmith *
2267754Smsmith * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
2367754Smsmith * copy of the source code appearing in this file ("Covered Code") an
2467754Smsmith * irrevocable, perpetual, worldwide license under Intel's copyrights in the
2567754Smsmith * base code distributed originally by Intel ("Original Intel Code") to copy,
2667754Smsmith * make derivatives, distribute, use and display any portion of the Covered
2767754Smsmith * Code in any form, with the right to sublicense such rights; and
2867754Smsmith *
2967754Smsmith * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
3067754Smsmith * license (with the right to sublicense), under only those claims of Intel
3167754Smsmith * patents that are infringed by the Original Intel Code, to make, use, sell,
3267754Smsmith * offer to sell, and import the Covered Code and derivative works thereof
3367754Smsmith * solely to the minimum extent necessary to exercise the above copyright
3467754Smsmith * license, and in no event shall the patent license extend to any additions
3567754Smsmith * to or modifications of the Original Intel Code.  No other license or right
3667754Smsmith * is granted directly or by implication, estoppel or otherwise;
3767754Smsmith *
3867754Smsmith * The above copyright and patent license is granted only if the following
3967754Smsmith * conditions are met:
4067754Smsmith *
4167754Smsmith * 3. Conditions
4267754Smsmith *
4367754Smsmith * 3.1. Redistribution of Source with Rights to Further Distribute Source.
4467754Smsmith * Redistribution of source code of any substantial portion of the Covered
4567754Smsmith * Code or modification with rights to further distribute source must include
4667754Smsmith * the above Copyright Notice, the above License, this list of Conditions,
4767754Smsmith * and the following Disclaimer and Export Compliance provision.  In addition,
4867754Smsmith * Licensee must cause all Covered Code to which Licensee contributes to
4967754Smsmith * contain a file documenting the changes Licensee made to create that Covered
5067754Smsmith * Code and the date of any change.  Licensee must include in that file the
5167754Smsmith * documentation of any changes made by any predecessor Licensee.  Licensee
5267754Smsmith * must include a prominent statement that the modification is derived,
5367754Smsmith * directly or indirectly, from Original Intel Code.
5467754Smsmith *
5567754Smsmith * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
5667754Smsmith * Redistribution of source code of any substantial portion of the Covered
5767754Smsmith * Code or modification without rights to further distribute source must
5867754Smsmith * include the following Disclaimer and Export Compliance provision in the
5967754Smsmith * documentation and/or other materials provided with distribution.  In
6067754Smsmith * addition, Licensee may not authorize further sublicense of source of any
6167754Smsmith * portion of the Covered Code, and must include terms to the effect that the
6267754Smsmith * license from Licensee to its licensee is limited to the intellectual
6367754Smsmith * property embodied in the software Licensee provides to its licensee, and
6467754Smsmith * not to intellectual property embodied in modifications its licensee may
6567754Smsmith * make.
6667754Smsmith *
6767754Smsmith * 3.3. Redistribution of Executable. Redistribution in executable form of any
6867754Smsmith * substantial portion of the Covered Code or modification must reproduce the
6967754Smsmith * above Copyright Notice, and the following Disclaimer and Export Compliance
7067754Smsmith * provision in the documentation and/or other materials provided with the
7167754Smsmith * distribution.
7267754Smsmith *
7367754Smsmith * 3.4. Intel retains all right, title, and interest in and to the Original
7467754Smsmith * Intel Code.
7567754Smsmith *
7667754Smsmith * 3.5. Neither the name Intel nor any other trademark owned or controlled by
7767754Smsmith * Intel shall be used in advertising or otherwise to promote the sale, use or
7867754Smsmith * other dealings in products derived from or relating to the Covered Code
7967754Smsmith * without prior written authorization from Intel.
8067754Smsmith *
8167754Smsmith * 4. Disclaimer and Export Compliance
8267754Smsmith *
8367754Smsmith * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
8467754Smsmith * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
8567754Smsmith * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
8667754Smsmith * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
8767754Smsmith * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
8867754Smsmith * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
8967754Smsmith * PARTICULAR PURPOSE.
9067754Smsmith *
9167754Smsmith * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
9267754Smsmith * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
9367754Smsmith * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
9467754Smsmith * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
9567754Smsmith * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
9667754Smsmith * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
9767754Smsmith * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
9867754Smsmith * LIMITED REMEDY.
9967754Smsmith *
10067754Smsmith * 4.3. Licensee shall not export, either directly or indirectly, any of this
10167754Smsmith * software or system incorporating such software without first obtaining any
10267754Smsmith * required license or other approval from the U. S. Department of Commerce or
10367754Smsmith * any other agency or department of the United States Government.  In the
10467754Smsmith * event Licensee exports any such software from the United States or
10567754Smsmith * re-exports any such software from a foreign destination, Licensee shall
10667754Smsmith * ensure that the distribution and export/re-export of the software is in
10767754Smsmith * compliance with all laws, regulations, orders, or other restrictions of the
10867754Smsmith * U.S. Export Administration Regulations. Licensee agrees that neither it nor
10967754Smsmith * any of its subsidiaries will export/re-export any technical data, process,
11067754Smsmith * software, or service, directly or indirectly, to any country for which the
11167754Smsmith * United States government or any agency thereof requires an export license,
11267754Smsmith * other governmental approval, or letter of assurance, without first obtaining
11367754Smsmith * such license, approval or letter.
11467754Smsmith *
11567754Smsmith *****************************************************************************/
11667754Smsmith
11767754Smsmith
11867754Smsmith#define __NSXFINIT_C__
11967754Smsmith
12067754Smsmith#include "acpi.h"
12167754Smsmith#include "acnamesp.h"
12267754Smsmith#include "acdispat.h"
12380062Smsmith#include "acinterp.h"
12467754Smsmith
12577424Smsmith#define _COMPONENT          ACPI_NAMESPACE
12691116Smsmith        ACPI_MODULE_NAME    ("nsinit")
12767754Smsmith
12867754Smsmith
12967754Smsmith/*******************************************************************************
13067754Smsmith *
13167754Smsmith * FUNCTION:    AcpiNsInitializeObjects
13267754Smsmith *
13367754Smsmith * PARAMETERS:  None
13467754Smsmith *
13567754Smsmith * RETURN:      Status
13667754Smsmith *
13767754Smsmith * DESCRIPTION: Walk the entire namespace and perform any necessary
13867754Smsmith *              initialization on the objects found therein
13967754Smsmith *
14067754Smsmith ******************************************************************************/
14167754Smsmith
14267754SmsmithACPI_STATUS
14367754SmsmithAcpiNsInitializeObjects (
14467754Smsmith    void)
14567754Smsmith{
14667754Smsmith    ACPI_STATUS             Status;
14767754Smsmith    ACPI_INIT_WALK_INFO     Info;
14867754Smsmith
14967754Smsmith
15091116Smsmith    ACPI_FUNCTION_TRACE ("NsInitializeObjects");
15167754Smsmith
15267754Smsmith
15382367Smsmith    ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
15482367Smsmith        "**** Starting initialization of namespace objects ****\n"));
155138287Smarks    ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
156138287Smarks        "Completing Region/Field/Buffer/Package initialization:"));
15767754Smsmith
15899146Siwasaki    /* Set all init info to zero */
15967754Smsmith
16099146Siwasaki    ACPI_MEMSET (&Info, 0, sizeof (ACPI_INIT_WALK_INFO));
16167754Smsmith
16267754Smsmith    /* Walk entire namespace from the supplied root */
16367754Smsmith
16467754Smsmith    Status = AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
16567754Smsmith                                ACPI_UINT32_MAX, AcpiNsInitOneObject,
16667754Smsmith                                &Info, NULL);
16767754Smsmith    if (ACPI_FAILURE (Status))
16867754Smsmith    {
169102550Siwasaki        ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "WalkNamespace failed! %s\n",
17099679Siwasaki            AcpiFormatException (Status)));
17167754Smsmith    }
17267754Smsmith
173114237Snjl    ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
17499679Siwasaki        "\nInitialized %hd/%hd Regions %hd/%hd Fields %hd/%hd Buffers %hd/%hd Packages (%hd nodes)\n",
175102550Siwasaki        Info.OpRegionInit,  Info.OpRegionCount,
176102550Siwasaki        Info.FieldInit,     Info.FieldCount,
177102550Siwasaki        Info.BufferInit,    Info.BufferCount,
17899146Siwasaki        Info.PackageInit,   Info.PackageCount, Info.ObjectCount));
179114237Snjl
18082367Smsmith    ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
18199679Siwasaki        "%hd Control Methods found\n", Info.MethodCount));
18282367Smsmith    ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
18399679Siwasaki        "%hd Op Regions found\n", Info.OpRegionCount));
18467754Smsmith
18567754Smsmith    return_ACPI_STATUS (AE_OK);
18667754Smsmith}
18767754Smsmith
18867754Smsmith
18977424Smsmith/*******************************************************************************
19067754Smsmith *
19167754Smsmith * FUNCTION:    AcpiNsInitializeDevices
19267754Smsmith *
19367754Smsmith * PARAMETERS:  None
19467754Smsmith *
19567754Smsmith * RETURN:      ACPI_STATUS
19667754Smsmith *
19767754Smsmith * DESCRIPTION: Walk the entire namespace and initialize all ACPI devices.
19867754Smsmith *              This means running _INI on all present devices.
19967754Smsmith *
20077424Smsmith *              Note: We install PCI config space handler on region access,
20177424Smsmith *              not here.
20267754Smsmith *
20377424Smsmith ******************************************************************************/
20467754Smsmith
20567754SmsmithACPI_STATUS
20667754SmsmithAcpiNsInitializeDevices (
20773561Smsmith    void)
20867754Smsmith{
20967754Smsmith    ACPI_STATUS             Status;
21067754Smsmith    ACPI_DEVICE_WALK_INFO   Info;
21167754Smsmith
21267754Smsmith
21391116Smsmith    ACPI_FUNCTION_TRACE ("NsInitializeDevices");
21467754Smsmith
21567754Smsmith
21699146Siwasaki    /* Init counters */
21799146Siwasaki
21867754Smsmith    Info.DeviceCount = 0;
21967754Smsmith    Info.Num_STA = 0;
22067754Smsmith    Info.Num_INI = 0;
22167754Smsmith
222138287Smarks    ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
223138287Smarks        "Executing all Device _STA and_INI methods:"));
22467754Smsmith
225123315Snjl    Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
226123315Snjl    if (ACPI_FAILURE (Status))
227123315Snjl    {
228123315Snjl        return_ACPI_STATUS (Status);
229123315Snjl    }
23067754Smsmith
231129684Snjl    /* Walk namespace for all objects */
23267754Smsmith
233123315Snjl    Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
234123315Snjl                    ACPI_UINT32_MAX, TRUE, AcpiNsInitOneDevice, &Info, NULL);
235123315Snjl
236123315Snjl    (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
237123315Snjl
23867754Smsmith    if (ACPI_FAILURE (Status))
23967754Smsmith    {
240102550Siwasaki        ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "WalkNamespace failed! %s\n",
24199679Siwasaki            AcpiFormatException (Status)));
24267754Smsmith    }
24367754Smsmith
244114237Snjl    ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
24599679Siwasaki        "\n%hd Devices found containing: %hd _STA, %hd _INI methods\n",
24669746Smsmith        Info.DeviceCount, Info.Num_STA, Info.Num_INI));
24767754Smsmith
24867754Smsmith    return_ACPI_STATUS (Status);
24967754Smsmith}
25067754Smsmith
25167754Smsmith
25267754Smsmith/*******************************************************************************
25367754Smsmith *
25467754Smsmith * FUNCTION:    AcpiNsInitOneObject
25567754Smsmith *
25667754Smsmith * PARAMETERS:  ObjHandle       - Node
25767754Smsmith *              Level           - Current nesting level
25867754Smsmith *              Context         - Points to a init info struct
25967754Smsmith *              ReturnValue     - Not used
26067754Smsmith *
26167754Smsmith * RETURN:      Status
26267754Smsmith *
26367754Smsmith * DESCRIPTION: Callback from AcpiWalkNamespace.  Invoked for every object
26467754Smsmith *              within the  namespace.
26567754Smsmith *
26667754Smsmith *              Currently, the only objects that require initialization are:
26767754Smsmith *              1) Methods
26867754Smsmith *              2) Op Regions
26967754Smsmith *
27067754Smsmith ******************************************************************************/
27167754Smsmith
27267754SmsmithACPI_STATUS
27367754SmsmithAcpiNsInitOneObject (
27467754Smsmith    ACPI_HANDLE             ObjHandle,
27567754Smsmith    UINT32                  Level,
27667754Smsmith    void                    *Context,
27767754Smsmith    void                    **ReturnValue)
27867754Smsmith{
27991116Smsmith    ACPI_OBJECT_TYPE        Type;
28067754Smsmith    ACPI_STATUS             Status;
28167754Smsmith    ACPI_INIT_WALK_INFO     *Info = (ACPI_INIT_WALK_INFO *) Context;
28267754Smsmith    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
28367754Smsmith    ACPI_OPERAND_OBJECT     *ObjDesc;
28467754Smsmith
28567754Smsmith
28691116Smsmith    ACPI_FUNCTION_NAME ("NsInitOneObject");
28782367Smsmith
28882367Smsmith
28967754Smsmith    Info->ObjectCount++;
29067754Smsmith
29167754Smsmith    /* And even then, we are only interested in a few object types */
29267754Smsmith
29367754Smsmith    Type = AcpiNsGetType (ObjHandle);
29487031Smsmith    ObjDesc = AcpiNsGetAttachedObject (Node);
29567754Smsmith    if (!ObjDesc)
29667754Smsmith    {
29767754Smsmith        return (AE_OK);
29867754Smsmith    }
29967754Smsmith
30099146Siwasaki    /* Increment counters for object types we are looking for */
30199146Siwasaki
30299146Siwasaki    switch (Type)
30380062Smsmith    {
30499146Siwasaki    case ACPI_TYPE_REGION:
30599146Siwasaki        Info->OpRegionCount++;
30699146Siwasaki        break;
30799146Siwasaki
30899146Siwasaki    case ACPI_TYPE_BUFFER_FIELD:
30999146Siwasaki        Info->FieldCount++;
31099146Siwasaki        break;
31199146Siwasaki
31299146Siwasaki    case ACPI_TYPE_BUFFER:
31399146Siwasaki        Info->BufferCount++;
31499146Siwasaki        break;
31599146Siwasaki
31699146Siwasaki    case ACPI_TYPE_PACKAGE:
31799146Siwasaki        Info->PackageCount++;
31899146Siwasaki        break;
31999146Siwasaki
32099146Siwasaki    default:
32199146Siwasaki
32299146Siwasaki        /* No init required, just exit now */
32380062Smsmith        return (AE_OK);
32480062Smsmith    }
32580062Smsmith
32699146Siwasaki    /*
32799146Siwasaki     * If the object is already initialized, nothing else to do
32899146Siwasaki     */
32999146Siwasaki    if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
33099146Siwasaki    {
33199146Siwasaki        return (AE_OK);
33299146Siwasaki    }
33380062Smsmith
33480062Smsmith    /*
33580062Smsmith     * Must lock the interpreter before executing AML code
33680062Smsmith     */
33780062Smsmith    Status = AcpiExEnterInterpreter ();
33880062Smsmith    if (ACPI_FAILURE (Status))
33980062Smsmith    {
34080062Smsmith        return (Status);
34180062Smsmith    }
34280062Smsmith
34399146Siwasaki    /*
344138287Smarks     * Each of these types can contain executable AML code within the
345138287Smarks     * declaration.
34699146Siwasaki     */
34767754Smsmith    switch (Type)
34867754Smsmith    {
34967754Smsmith    case ACPI_TYPE_REGION:
35067754Smsmith
35167754Smsmith        Info->OpRegionInit++;
35267754Smsmith        Status = AcpiDsGetRegionArguments (ObjDesc);
35367754Smsmith        break;
35467754Smsmith
35577424Smsmith    case ACPI_TYPE_BUFFER_FIELD:
35667754Smsmith
35767754Smsmith        Info->FieldInit++;
35877424Smsmith        Status = AcpiDsGetBufferFieldArguments (ObjDesc);
35999146Siwasaki        break;
36067754Smsmith
36199146Siwasaki    case ACPI_TYPE_BUFFER:
36299146Siwasaki
36399146Siwasaki        Info->BufferInit++;
36499146Siwasaki        Status = AcpiDsGetBufferArguments (ObjDesc);
36567754Smsmith        break;
36667754Smsmith
36799146Siwasaki    case ACPI_TYPE_PACKAGE:
36899146Siwasaki
36999146Siwasaki        Info->PackageInit++;
37099146Siwasaki        Status = AcpiDsGetPackageArguments (ObjDesc);
37167754Smsmith        break;
37299679Siwasaki
37399679Siwasaki    default:
37499679Siwasaki        /* No other types can get here */
37599679Siwasaki        break;
37667754Smsmith    }
37767754Smsmith
37899146Siwasaki    if (ACPI_FAILURE (Status))
37999146Siwasaki    {
38099146Siwasaki        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ERROR, "\n"));
38199146Siwasaki        ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
38299146Siwasaki                "Could not execute arguments for [%4.4s] (%s), %s\n",
383123315Snjl                AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Type),
384123315Snjl                AcpiFormatException (Status)));
38599146Siwasaki    }
38680062Smsmith
387138287Smarks    /*
388138287Smarks     * Print a dot for each object unless we are going to print the entire
389138287Smarks     * pathname
390138287Smarks     */
391114237Snjl    if (!(AcpiDbgLevel & ACPI_LV_INIT_NAMES))
39299146Siwasaki    {
393114237Snjl        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));
39499146Siwasaki    }
39599146Siwasaki
39667754Smsmith    /*
397138287Smarks     * We ignore errors from above, and always return OK, since we don't want
398138287Smarks     * to abort the walk on any single error.
39967754Smsmith     */
40080062Smsmith    AcpiExExitInterpreter ();
40167754Smsmith    return (AE_OK);
40267754Smsmith}
40367754Smsmith
40467754Smsmith
40577424Smsmith/*******************************************************************************
40667754Smsmith *
40767754Smsmith * FUNCTION:    AcpiNsInitOneDevice
40867754Smsmith *
40977424Smsmith * PARAMETERS:  ACPI_WALK_CALLBACK
41067754Smsmith *
41167754Smsmith * RETURN:      ACPI_STATUS
41267754Smsmith *
41367754Smsmith * DESCRIPTION: This is called once per device soon after ACPI is enabled
41467754Smsmith *              to initialize each device. It determines if the device is
41567754Smsmith *              present, and if so, calls _INI.
41667754Smsmith *
41777424Smsmith ******************************************************************************/
41867754Smsmith
41967754SmsmithACPI_STATUS
42067754SmsmithAcpiNsInitOneDevice (
42167754Smsmith    ACPI_HANDLE             ObjHandle,
42267754Smsmith    UINT32                  NestingLevel,
42367754Smsmith    void                    *Context,
42467754Smsmith    void                    **ReturnValue)
42567754Smsmith{
426129684Snjl    ACPI_DEVICE_WALK_INFO  *Info = (ACPI_DEVICE_WALK_INFO *) Context;
427129684Snjl    ACPI_PARAMETER_INFO     Pinfo;
428129684Snjl    UINT32                  Flags;
42967754Smsmith    ACPI_STATUS             Status;
43067754Smsmith
43167754Smsmith
43291116Smsmith    ACPI_FUNCTION_TRACE ("NsInitOneDevice");
43367754Smsmith
43467754Smsmith
435129684Snjl    Pinfo.Parameters = NULL;
436129684Snjl    Pinfo.ParameterType = ACPI_PARAM_ARGS;
437129684Snjl
438129684Snjl    Pinfo.Node = AcpiNsMapHandleToNode (ObjHandle);
439129684Snjl    if (!Pinfo.Node)
44073561Smsmith    {
441123315Snjl        return_ACPI_STATUS (AE_BAD_PARAMETER);
44273561Smsmith    }
44373561Smsmith
444123315Snjl    /*
445129684Snjl     * We will run _STA/_INI on Devices, Processors and ThermalZones only
446123315Snjl     */
447129684Snjl    if ((Pinfo.Node->Type != ACPI_TYPE_DEVICE)      &&
448129684Snjl        (Pinfo.Node->Type != ACPI_TYPE_PROCESSOR)   &&
449129684Snjl        (Pinfo.Node->Type != ACPI_TYPE_THERMAL))
45091116Smsmith    {
451123315Snjl        return_ACPI_STATUS (AE_OK);
45291116Smsmith    }
45367754Smsmith
454138287Smarks    if ((AcpiDbgLevel <= ACPI_LV_ALL_EXCEPTIONS) &&
455138287Smarks        (!(AcpiDbgLevel & ACPI_LV_INFO)))
45667754Smsmith    {
457123315Snjl        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));
45867754Smsmith    }
45967754Smsmith
460123315Snjl    Info->DeviceCount++;
46167754Smsmith
46267754Smsmith    /*
46367754Smsmith     * Run _STA to determine if we can run _INI on the device.
46467754Smsmith     */
465129684Snjl    ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (ACPI_TYPE_METHOD, Pinfo.Node, "_STA"));
466129684Snjl    Status = AcpiUtExecute_STA (Pinfo.Node, &Flags);
467123315Snjl
46867754Smsmith    if (ACPI_FAILURE (Status))
46967754Smsmith    {
470129684Snjl        if (Pinfo.Node->Type == ACPI_TYPE_DEVICE)
471123315Snjl        {
472123315Snjl            /* Ignore error and move on to next device */
47371867Smsmith
474123315Snjl            return_ACPI_STATUS (AE_OK);
475123315Snjl        }
476123315Snjl
477129684Snjl        /* _STA is not required for Processor or ThermalZone objects */
47867754Smsmith    }
479123315Snjl    else
480123315Snjl    {
481123315Snjl        Info->Num_STA++;
48267754Smsmith
483123315Snjl        if (!(Flags & 0x01))
484123315Snjl        {
485123315Snjl            /* Don't look at children of a not present device */
48667754Smsmith
487123315Snjl            return_ACPI_STATUS(AE_CTRL_DEPTH);
488123315Snjl        }
48967754Smsmith    }
49067754Smsmith
49167754Smsmith    /*
49267754Smsmith     * The device is present. Run _INI.
49367754Smsmith     */
494129684Snjl    ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (ACPI_TYPE_METHOD, Pinfo.Node, "_INI"));
495129684Snjl    Status = AcpiNsEvaluateRelative ("_INI", &Pinfo);
49699679Siwasaki    if (ACPI_FAILURE (Status))
49767754Smsmith    {
49899679Siwasaki        /* No _INI (AE_NOT_FOUND) means device requires no initialization */
49977424Smsmith
50099679Siwasaki        if (Status != AE_NOT_FOUND)
50199679Siwasaki        {
50299679Siwasaki            /* Ignore error and move on to next device */
50367754Smsmith
504129684Snjl#ifdef ACPI_DEBUG_OUTPUT
505129684Snjl            char        *ScopeName = AcpiNsGetExternalPathname (Pinfo.Node);
50671867Smsmith
50799679Siwasaki            ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "%s._INI failed: %s\n",
50899679Siwasaki                    ScopeName, AcpiFormatException (Status)));
50967754Smsmith
51099679Siwasaki            ACPI_MEM_FREE (ScopeName);
511129684Snjl#endif
51299679Siwasaki        }
51367754Smsmith
51499679Siwasaki        Status = AE_OK;
51567754Smsmith    }
51667754Smsmith    else
51767754Smsmith    {
518140216Snjl        /* Delete any return object (Especially if ImplicitReturn is enabled) */
519140216Snjl
520140216Snjl        if (Pinfo.ReturnObject)
521140216Snjl        {
522140216Snjl            AcpiUtRemoveReference (Pinfo.ReturnObject);
523140216Snjl        }
524140216Snjl
52577424Smsmith        /* Count of successful INIs */
52671867Smsmith
52767754Smsmith        Info->Num_INI++;
52867754Smsmith    }
52967754Smsmith
53099679Siwasaki    if (AcpiGbl_InitHandler)
53199679Siwasaki    {
53299679Siwasaki        /* External initialization handler is present, call it */
53399679Siwasaki
534129684Snjl        Status = AcpiGbl_InitHandler (Pinfo.Node, ACPI_INIT_DEVICE_INI);
53599679Siwasaki    }
53699679Siwasaki
53799679Siwasaki    return_ACPI_STATUS (Status);
53867754Smsmith}
539