xref: /minix3/minix/drivers/power/acpi/dispatcher/dswload2.c (revision 29492bb71c7148a089a5afafa0c99409161218df)
1*29492bb7SDavid van Moolenbroek /******************************************************************************
2*29492bb7SDavid van Moolenbroek  *
3*29492bb7SDavid van Moolenbroek  * Module Name: dswload2 - Dispatcher second pass namespace load callbacks
4*29492bb7SDavid van Moolenbroek  *
5*29492bb7SDavid van Moolenbroek  *****************************************************************************/
6*29492bb7SDavid van Moolenbroek 
7*29492bb7SDavid van Moolenbroek /*
8*29492bb7SDavid van Moolenbroek  * Copyright (C) 2000 - 2014, Intel Corp.
9*29492bb7SDavid van Moolenbroek  * All rights reserved.
10*29492bb7SDavid van Moolenbroek  *
11*29492bb7SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
12*29492bb7SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
13*29492bb7SDavid van Moolenbroek  * are met:
14*29492bb7SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
15*29492bb7SDavid van Moolenbroek  *    notice, this list of conditions, and the following disclaimer,
16*29492bb7SDavid van Moolenbroek  *    without modification.
17*29492bb7SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*29492bb7SDavid van Moolenbroek  *    substantially similar to the "NO WARRANTY" disclaimer below
19*29492bb7SDavid van Moolenbroek  *    ("Disclaimer") and any redistribution must be conditioned upon
20*29492bb7SDavid van Moolenbroek  *    including a substantially similar Disclaimer requirement for further
21*29492bb7SDavid van Moolenbroek  *    binary redistribution.
22*29492bb7SDavid van Moolenbroek  * 3. Neither the names of the above-listed copyright holders nor the names
23*29492bb7SDavid van Moolenbroek  *    of any contributors may be used to endorse or promote products derived
24*29492bb7SDavid van Moolenbroek  *    from this software without specific prior written permission.
25*29492bb7SDavid van Moolenbroek  *
26*29492bb7SDavid van Moolenbroek  * Alternatively, this software may be distributed under the terms of the
27*29492bb7SDavid van Moolenbroek  * GNU General Public License ("GPL") version 2 as published by the Free
28*29492bb7SDavid van Moolenbroek  * Software Foundation.
29*29492bb7SDavid van Moolenbroek  *
30*29492bb7SDavid van Moolenbroek  * NO WARRANTY
31*29492bb7SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*29492bb7SDavid van Moolenbroek  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*29492bb7SDavid van Moolenbroek  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*29492bb7SDavid van Moolenbroek  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*29492bb7SDavid van Moolenbroek  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*29492bb7SDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*29492bb7SDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*29492bb7SDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*29492bb7SDavid van Moolenbroek  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*29492bb7SDavid van Moolenbroek  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*29492bb7SDavid van Moolenbroek  * POSSIBILITY OF SUCH DAMAGES.
42*29492bb7SDavid van Moolenbroek  */
43*29492bb7SDavid van Moolenbroek 
44*29492bb7SDavid van Moolenbroek #include "acpi.h"
45*29492bb7SDavid van Moolenbroek #include "accommon.h"
46*29492bb7SDavid van Moolenbroek #include "acparser.h"
47*29492bb7SDavid van Moolenbroek #include "amlcode.h"
48*29492bb7SDavid van Moolenbroek #include "acdispat.h"
49*29492bb7SDavid van Moolenbroek #include "acinterp.h"
50*29492bb7SDavid van Moolenbroek #include "acnamesp.h"
51*29492bb7SDavid van Moolenbroek #include "acevents.h"
52*29492bb7SDavid van Moolenbroek 
53*29492bb7SDavid van Moolenbroek #define _COMPONENT          ACPI_DISPATCHER
54*29492bb7SDavid van Moolenbroek         ACPI_MODULE_NAME    ("dswload2")
55*29492bb7SDavid van Moolenbroek 
56*29492bb7SDavid van Moolenbroek 
57*29492bb7SDavid van Moolenbroek /*******************************************************************************
58*29492bb7SDavid van Moolenbroek  *
59*29492bb7SDavid van Moolenbroek  * FUNCTION:    AcpiDsLoad2BeginOp
60*29492bb7SDavid van Moolenbroek  *
61*29492bb7SDavid van Moolenbroek  * PARAMETERS:  WalkState       - Current state of the parse tree walk
62*29492bb7SDavid van Moolenbroek  *              OutOp           - Wher to return op if a new one is created
63*29492bb7SDavid van Moolenbroek  *
64*29492bb7SDavid van Moolenbroek  * RETURN:      Status
65*29492bb7SDavid van Moolenbroek  *
66*29492bb7SDavid van Moolenbroek  * DESCRIPTION: Descending callback used during the loading of ACPI tables.
67*29492bb7SDavid van Moolenbroek  *
68*29492bb7SDavid van Moolenbroek  ******************************************************************************/
69*29492bb7SDavid van Moolenbroek 
70*29492bb7SDavid van Moolenbroek ACPI_STATUS
AcpiDsLoad2BeginOp(ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT ** OutOp)71*29492bb7SDavid van Moolenbroek AcpiDsLoad2BeginOp (
72*29492bb7SDavid van Moolenbroek     ACPI_WALK_STATE         *WalkState,
73*29492bb7SDavid van Moolenbroek     ACPI_PARSE_OBJECT       **OutOp)
74*29492bb7SDavid van Moolenbroek {
75*29492bb7SDavid van Moolenbroek     ACPI_PARSE_OBJECT       *Op;
76*29492bb7SDavid van Moolenbroek     ACPI_NAMESPACE_NODE     *Node;
77*29492bb7SDavid van Moolenbroek     ACPI_STATUS             Status;
78*29492bb7SDavid van Moolenbroek     ACPI_OBJECT_TYPE        ObjectType;
79*29492bb7SDavid van Moolenbroek     char                    *BufferPtr;
80*29492bb7SDavid van Moolenbroek     UINT32                  Flags;
81*29492bb7SDavid van Moolenbroek 
82*29492bb7SDavid van Moolenbroek 
83*29492bb7SDavid van Moolenbroek     ACPI_FUNCTION_TRACE (DsLoad2BeginOp);
84*29492bb7SDavid van Moolenbroek 
85*29492bb7SDavid van Moolenbroek 
86*29492bb7SDavid van Moolenbroek     Op = WalkState->Op;
87*29492bb7SDavid van Moolenbroek     ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState));
88*29492bb7SDavid van Moolenbroek 
89*29492bb7SDavid van Moolenbroek     if (Op)
90*29492bb7SDavid van Moolenbroek     {
91*29492bb7SDavid van Moolenbroek         if ((WalkState->ControlState) &&
92*29492bb7SDavid van Moolenbroek             (WalkState->ControlState->Common.State ==
93*29492bb7SDavid van Moolenbroek                 ACPI_CONTROL_CONDITIONAL_EXECUTING))
94*29492bb7SDavid van Moolenbroek         {
95*29492bb7SDavid van Moolenbroek             /* We are executing a while loop outside of a method */
96*29492bb7SDavid van Moolenbroek 
97*29492bb7SDavid van Moolenbroek             Status = AcpiDsExecBeginOp (WalkState, OutOp);
98*29492bb7SDavid van Moolenbroek             return_ACPI_STATUS (Status);
99*29492bb7SDavid van Moolenbroek         }
100*29492bb7SDavid van Moolenbroek 
101*29492bb7SDavid van Moolenbroek         /* We only care about Namespace opcodes here */
102*29492bb7SDavid van Moolenbroek 
103*29492bb7SDavid van Moolenbroek         if ((!(WalkState->OpInfo->Flags & AML_NSOPCODE)   &&
104*29492bb7SDavid van Moolenbroek               (WalkState->Opcode != AML_INT_NAMEPATH_OP)) ||
105*29492bb7SDavid van Moolenbroek             (!(WalkState->OpInfo->Flags & AML_NAMED)))
106*29492bb7SDavid van Moolenbroek         {
107*29492bb7SDavid van Moolenbroek             return_ACPI_STATUS (AE_OK);
108*29492bb7SDavid van Moolenbroek         }
109*29492bb7SDavid van Moolenbroek 
110*29492bb7SDavid van Moolenbroek         /* Get the name we are going to enter or lookup in the namespace */
111*29492bb7SDavid van Moolenbroek 
112*29492bb7SDavid van Moolenbroek         if (WalkState->Opcode == AML_INT_NAMEPATH_OP)
113*29492bb7SDavid van Moolenbroek         {
114*29492bb7SDavid van Moolenbroek             /* For Namepath op, get the path string */
115*29492bb7SDavid van Moolenbroek 
116*29492bb7SDavid van Moolenbroek             BufferPtr = Op->Common.Value.String;
117*29492bb7SDavid van Moolenbroek             if (!BufferPtr)
118*29492bb7SDavid van Moolenbroek             {
119*29492bb7SDavid van Moolenbroek                 /* No name, just exit */
120*29492bb7SDavid van Moolenbroek 
121*29492bb7SDavid van Moolenbroek                 return_ACPI_STATUS (AE_OK);
122*29492bb7SDavid van Moolenbroek             }
123*29492bb7SDavid van Moolenbroek         }
124*29492bb7SDavid van Moolenbroek         else
125*29492bb7SDavid van Moolenbroek         {
126*29492bb7SDavid van Moolenbroek             /* Get name from the op */
127*29492bb7SDavid van Moolenbroek 
128*29492bb7SDavid van Moolenbroek             BufferPtr = ACPI_CAST_PTR (char, &Op->Named.Name);
129*29492bb7SDavid van Moolenbroek         }
130*29492bb7SDavid van Moolenbroek     }
131*29492bb7SDavid van Moolenbroek     else
132*29492bb7SDavid van Moolenbroek     {
133*29492bb7SDavid van Moolenbroek         /* Get the namestring from the raw AML */
134*29492bb7SDavid van Moolenbroek 
135*29492bb7SDavid van Moolenbroek         BufferPtr = AcpiPsGetNextNamestring (&WalkState->ParserState);
136*29492bb7SDavid van Moolenbroek     }
137*29492bb7SDavid van Moolenbroek 
138*29492bb7SDavid van Moolenbroek     /* Map the opcode into an internal object type */
139*29492bb7SDavid van Moolenbroek 
140*29492bb7SDavid van Moolenbroek     ObjectType = WalkState->OpInfo->ObjectType;
141*29492bb7SDavid van Moolenbroek 
142*29492bb7SDavid van Moolenbroek     ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
143*29492bb7SDavid van Moolenbroek         "State=%p Op=%p Type=%X\n", WalkState, Op, ObjectType));
144*29492bb7SDavid van Moolenbroek 
145*29492bb7SDavid van Moolenbroek     switch (WalkState->Opcode)
146*29492bb7SDavid van Moolenbroek     {
147*29492bb7SDavid van Moolenbroek     case AML_FIELD_OP:
148*29492bb7SDavid van Moolenbroek     case AML_BANK_FIELD_OP:
149*29492bb7SDavid van Moolenbroek     case AML_INDEX_FIELD_OP:
150*29492bb7SDavid van Moolenbroek 
151*29492bb7SDavid van Moolenbroek         Node = NULL;
152*29492bb7SDavid van Moolenbroek         Status = AE_OK;
153*29492bb7SDavid van Moolenbroek         break;
154*29492bb7SDavid van Moolenbroek 
155*29492bb7SDavid van Moolenbroek     case AML_INT_NAMEPATH_OP:
156*29492bb7SDavid van Moolenbroek         /*
157*29492bb7SDavid van Moolenbroek          * The NamePath is an object reference to an existing object.
158*29492bb7SDavid van Moolenbroek          * Don't enter the name into the namespace, but look it up
159*29492bb7SDavid van Moolenbroek          * for use later.
160*29492bb7SDavid van Moolenbroek          */
161*29492bb7SDavid van Moolenbroek         Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,
162*29492bb7SDavid van Moolenbroek                         ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
163*29492bb7SDavid van Moolenbroek                         WalkState, &(Node));
164*29492bb7SDavid van Moolenbroek         break;
165*29492bb7SDavid van Moolenbroek 
166*29492bb7SDavid van Moolenbroek     case AML_SCOPE_OP:
167*29492bb7SDavid van Moolenbroek 
168*29492bb7SDavid van Moolenbroek         /* Special case for Scope(\) -> refers to the Root node */
169*29492bb7SDavid van Moolenbroek 
170*29492bb7SDavid van Moolenbroek         if (Op && (Op->Named.Node == AcpiGbl_RootNode))
171*29492bb7SDavid van Moolenbroek         {
172*29492bb7SDavid van Moolenbroek             Node = Op->Named.Node;
173*29492bb7SDavid van Moolenbroek 
174*29492bb7SDavid van Moolenbroek             Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
175*29492bb7SDavid van Moolenbroek             if (ACPI_FAILURE (Status))
176*29492bb7SDavid van Moolenbroek             {
177*29492bb7SDavid van Moolenbroek                 return_ACPI_STATUS (Status);
178*29492bb7SDavid van Moolenbroek             }
179*29492bb7SDavid van Moolenbroek         }
180*29492bb7SDavid van Moolenbroek         else
181*29492bb7SDavid van Moolenbroek         {
182*29492bb7SDavid van Moolenbroek             /*
183*29492bb7SDavid van Moolenbroek              * The Path is an object reference to an existing object.
184*29492bb7SDavid van Moolenbroek              * Don't enter the name into the namespace, but look it up
185*29492bb7SDavid van Moolenbroek              * for use later.
186*29492bb7SDavid van Moolenbroek              */
187*29492bb7SDavid van Moolenbroek             Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,
188*29492bb7SDavid van Moolenbroek                         ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
189*29492bb7SDavid van Moolenbroek                         WalkState, &(Node));
190*29492bb7SDavid van Moolenbroek             if (ACPI_FAILURE (Status))
191*29492bb7SDavid van Moolenbroek             {
192*29492bb7SDavid van Moolenbroek #ifdef ACPI_ASL_COMPILER
193*29492bb7SDavid van Moolenbroek                 if (Status == AE_NOT_FOUND)
194*29492bb7SDavid van Moolenbroek                 {
195*29492bb7SDavid van Moolenbroek                     Status = AE_OK;
196*29492bb7SDavid van Moolenbroek                 }
197*29492bb7SDavid van Moolenbroek                 else
198*29492bb7SDavid van Moolenbroek                 {
199*29492bb7SDavid van Moolenbroek                     ACPI_ERROR_NAMESPACE (BufferPtr, Status);
200*29492bb7SDavid van Moolenbroek                 }
201*29492bb7SDavid van Moolenbroek #else
202*29492bb7SDavid van Moolenbroek                 ACPI_ERROR_NAMESPACE (BufferPtr, Status);
203*29492bb7SDavid van Moolenbroek #endif
204*29492bb7SDavid van Moolenbroek                 return_ACPI_STATUS (Status);
205*29492bb7SDavid van Moolenbroek             }
206*29492bb7SDavid van Moolenbroek         }
207*29492bb7SDavid van Moolenbroek 
208*29492bb7SDavid van Moolenbroek         /*
209*29492bb7SDavid van Moolenbroek          * We must check to make sure that the target is
210*29492bb7SDavid van Moolenbroek          * one of the opcodes that actually opens a scope
211*29492bb7SDavid van Moolenbroek          */
212*29492bb7SDavid van Moolenbroek         switch (Node->Type)
213*29492bb7SDavid van Moolenbroek         {
214*29492bb7SDavid van Moolenbroek         case ACPI_TYPE_ANY:
215*29492bb7SDavid van Moolenbroek         case ACPI_TYPE_LOCAL_SCOPE:         /* Scope */
216*29492bb7SDavid van Moolenbroek         case ACPI_TYPE_DEVICE:
217*29492bb7SDavid van Moolenbroek         case ACPI_TYPE_POWER:
218*29492bb7SDavid van Moolenbroek         case ACPI_TYPE_PROCESSOR:
219*29492bb7SDavid van Moolenbroek         case ACPI_TYPE_THERMAL:
220*29492bb7SDavid van Moolenbroek 
221*29492bb7SDavid van Moolenbroek             /* These are acceptable types */
222*29492bb7SDavid van Moolenbroek             break;
223*29492bb7SDavid van Moolenbroek 
224*29492bb7SDavid van Moolenbroek         case ACPI_TYPE_INTEGER:
225*29492bb7SDavid van Moolenbroek         case ACPI_TYPE_STRING:
226*29492bb7SDavid van Moolenbroek         case ACPI_TYPE_BUFFER:
227*29492bb7SDavid van Moolenbroek 
228*29492bb7SDavid van Moolenbroek             /*
229*29492bb7SDavid van Moolenbroek              * These types we will allow, but we will change the type.
230*29492bb7SDavid van Moolenbroek              * This enables some existing code of the form:
231*29492bb7SDavid van Moolenbroek              *
232*29492bb7SDavid van Moolenbroek              *  Name (DEB, 0)
233*29492bb7SDavid van Moolenbroek              *  Scope (DEB) { ... }
234*29492bb7SDavid van Moolenbroek              */
235*29492bb7SDavid van Moolenbroek             ACPI_WARNING ((AE_INFO,
236*29492bb7SDavid van Moolenbroek                 "Type override - [%4.4s] had invalid type (%s) "
237*29492bb7SDavid van Moolenbroek                 "for Scope operator, changed to type ANY",
238*29492bb7SDavid van Moolenbroek                 AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type)));
239*29492bb7SDavid van Moolenbroek 
240*29492bb7SDavid van Moolenbroek             Node->Type = ACPI_TYPE_ANY;
241*29492bb7SDavid van Moolenbroek             WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;
242*29492bb7SDavid van Moolenbroek             break;
243*29492bb7SDavid van Moolenbroek 
244*29492bb7SDavid van Moolenbroek         case ACPI_TYPE_METHOD:
245*29492bb7SDavid van Moolenbroek 
246*29492bb7SDavid van Moolenbroek             /*
247*29492bb7SDavid van Moolenbroek              * Allow scope change to root during execution of module-level
248*29492bb7SDavid van Moolenbroek              * code. Root is typed METHOD during this time.
249*29492bb7SDavid van Moolenbroek              */
250*29492bb7SDavid van Moolenbroek             if ((Node == AcpiGbl_RootNode) &&
251*29492bb7SDavid van Moolenbroek                 (WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
252*29492bb7SDavid van Moolenbroek             {
253*29492bb7SDavid van Moolenbroek                 break;
254*29492bb7SDavid van Moolenbroek             }
255*29492bb7SDavid van Moolenbroek 
256*29492bb7SDavid van Moolenbroek             /*lint -fallthrough */
257*29492bb7SDavid van Moolenbroek 
258*29492bb7SDavid van Moolenbroek         default:
259*29492bb7SDavid van Moolenbroek 
260*29492bb7SDavid van Moolenbroek             /* All other types are an error */
261*29492bb7SDavid van Moolenbroek 
262*29492bb7SDavid van Moolenbroek             ACPI_ERROR ((AE_INFO,
263*29492bb7SDavid van Moolenbroek                 "Invalid type (%s) for target of "
264*29492bb7SDavid van Moolenbroek                 "Scope operator [%4.4s] (Cannot override)",
265*29492bb7SDavid van Moolenbroek                 AcpiUtGetTypeName (Node->Type), AcpiUtGetNodeName (Node)));
266*29492bb7SDavid van Moolenbroek 
267*29492bb7SDavid van Moolenbroek             return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
268*29492bb7SDavid van Moolenbroek         }
269*29492bb7SDavid van Moolenbroek         break;
270*29492bb7SDavid van Moolenbroek 
271*29492bb7SDavid van Moolenbroek     default:
272*29492bb7SDavid van Moolenbroek 
273*29492bb7SDavid van Moolenbroek         /* All other opcodes */
274*29492bb7SDavid van Moolenbroek 
275*29492bb7SDavid van Moolenbroek         if (Op && Op->Common.Node)
276*29492bb7SDavid van Moolenbroek         {
277*29492bb7SDavid van Moolenbroek             /* This op/node was previously entered into the namespace */
278*29492bb7SDavid van Moolenbroek 
279*29492bb7SDavid van Moolenbroek             Node = Op->Common.Node;
280*29492bb7SDavid van Moolenbroek 
281*29492bb7SDavid van Moolenbroek             if (AcpiNsOpensScope (ObjectType))
282*29492bb7SDavid van Moolenbroek             {
283*29492bb7SDavid van Moolenbroek                 Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
284*29492bb7SDavid van Moolenbroek                 if (ACPI_FAILURE (Status))
285*29492bb7SDavid van Moolenbroek                 {
286*29492bb7SDavid van Moolenbroek                     return_ACPI_STATUS (Status);
287*29492bb7SDavid van Moolenbroek                 }
288*29492bb7SDavid van Moolenbroek             }
289*29492bb7SDavid van Moolenbroek 
290*29492bb7SDavid van Moolenbroek             return_ACPI_STATUS (AE_OK);
291*29492bb7SDavid van Moolenbroek         }
292*29492bb7SDavid van Moolenbroek 
293*29492bb7SDavid van Moolenbroek         /*
294*29492bb7SDavid van Moolenbroek          * Enter the named type into the internal namespace. We enter the name
295*29492bb7SDavid van Moolenbroek          * as we go downward in the parse tree. Any necessary subobjects that
296*29492bb7SDavid van Moolenbroek          * involve arguments to the opcode must be created as we go back up the
297*29492bb7SDavid van Moolenbroek          * parse tree later.
298*29492bb7SDavid van Moolenbroek          *
299*29492bb7SDavid van Moolenbroek          * Note: Name may already exist if we are executing a deferred opcode.
300*29492bb7SDavid van Moolenbroek          */
301*29492bb7SDavid van Moolenbroek         if (WalkState->DeferredNode)
302*29492bb7SDavid van Moolenbroek         {
303*29492bb7SDavid van Moolenbroek             /* This name is already in the namespace, get the node */
304*29492bb7SDavid van Moolenbroek 
305*29492bb7SDavid van Moolenbroek             Node = WalkState->DeferredNode;
306*29492bb7SDavid van Moolenbroek             Status = AE_OK;
307*29492bb7SDavid van Moolenbroek             break;
308*29492bb7SDavid van Moolenbroek         }
309*29492bb7SDavid van Moolenbroek 
310*29492bb7SDavid van Moolenbroek         Flags = ACPI_NS_NO_UPSEARCH;
311*29492bb7SDavid van Moolenbroek         if (WalkState->PassNumber == ACPI_IMODE_EXECUTE)
312*29492bb7SDavid van Moolenbroek         {
313*29492bb7SDavid van Moolenbroek             /* Execution mode, node cannot already exist, node is temporary */
314*29492bb7SDavid van Moolenbroek 
315*29492bb7SDavid van Moolenbroek             Flags |= ACPI_NS_ERROR_IF_FOUND;
316*29492bb7SDavid van Moolenbroek 
317*29492bb7SDavid van Moolenbroek             if (!(WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
318*29492bb7SDavid van Moolenbroek             {
319*29492bb7SDavid van Moolenbroek                 Flags |= ACPI_NS_TEMPORARY;
320*29492bb7SDavid van Moolenbroek             }
321*29492bb7SDavid van Moolenbroek         }
322*29492bb7SDavid van Moolenbroek 
323*29492bb7SDavid van Moolenbroek         /* Add new entry or lookup existing entry */
324*29492bb7SDavid van Moolenbroek 
325*29492bb7SDavid van Moolenbroek         Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,
326*29492bb7SDavid van Moolenbroek                     ACPI_IMODE_LOAD_PASS2, Flags, WalkState, &Node);
327*29492bb7SDavid van Moolenbroek 
328*29492bb7SDavid van Moolenbroek         if (ACPI_SUCCESS (Status) && (Flags & ACPI_NS_TEMPORARY))
329*29492bb7SDavid van Moolenbroek         {
330*29492bb7SDavid van Moolenbroek             ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
331*29492bb7SDavid van Moolenbroek                 "***New Node [%4.4s] %p is temporary\n",
332*29492bb7SDavid van Moolenbroek                 AcpiUtGetNodeName (Node), Node));
333*29492bb7SDavid van Moolenbroek         }
334*29492bb7SDavid van Moolenbroek         break;
335*29492bb7SDavid van Moolenbroek     }
336*29492bb7SDavid van Moolenbroek 
337*29492bb7SDavid van Moolenbroek     if (ACPI_FAILURE (Status))
338*29492bb7SDavid van Moolenbroek     {
339*29492bb7SDavid van Moolenbroek         ACPI_ERROR_NAMESPACE (BufferPtr, Status);
340*29492bb7SDavid van Moolenbroek         return_ACPI_STATUS (Status);
341*29492bb7SDavid van Moolenbroek     }
342*29492bb7SDavid van Moolenbroek 
343*29492bb7SDavid van Moolenbroek     if (!Op)
344*29492bb7SDavid van Moolenbroek     {
345*29492bb7SDavid van Moolenbroek         /* Create a new op */
346*29492bb7SDavid van Moolenbroek 
347*29492bb7SDavid van Moolenbroek         Op = AcpiPsAllocOp (WalkState->Opcode);
348*29492bb7SDavid van Moolenbroek         if (!Op)
349*29492bb7SDavid van Moolenbroek         {
350*29492bb7SDavid van Moolenbroek             return_ACPI_STATUS (AE_NO_MEMORY);
351*29492bb7SDavid van Moolenbroek         }
352*29492bb7SDavid van Moolenbroek 
353*29492bb7SDavid van Moolenbroek         /* Initialize the new op */
354*29492bb7SDavid van Moolenbroek 
355*29492bb7SDavid van Moolenbroek         if (Node)
356*29492bb7SDavid van Moolenbroek         {
357*29492bb7SDavid van Moolenbroek             Op->Named.Name = Node->Name.Integer;
358*29492bb7SDavid van Moolenbroek         }
359*29492bb7SDavid van Moolenbroek         *OutOp = Op;
360*29492bb7SDavid van Moolenbroek     }
361*29492bb7SDavid van Moolenbroek 
362*29492bb7SDavid van Moolenbroek     /*
363*29492bb7SDavid van Moolenbroek      * Put the Node in the "op" object that the parser uses, so we
364*29492bb7SDavid van Moolenbroek      * can get it again quickly when this scope is closed
365*29492bb7SDavid van Moolenbroek      */
366*29492bb7SDavid van Moolenbroek     Op->Common.Node = Node;
367*29492bb7SDavid van Moolenbroek     return_ACPI_STATUS (Status);
368*29492bb7SDavid van Moolenbroek }
369*29492bb7SDavid van Moolenbroek 
370*29492bb7SDavid van Moolenbroek 
371*29492bb7SDavid van Moolenbroek /*******************************************************************************
372*29492bb7SDavid van Moolenbroek  *
373*29492bb7SDavid van Moolenbroek  * FUNCTION:    AcpiDsLoad2EndOp
374*29492bb7SDavid van Moolenbroek  *
375*29492bb7SDavid van Moolenbroek  * PARAMETERS:  WalkState       - Current state of the parse tree walk
376*29492bb7SDavid van Moolenbroek  *
377*29492bb7SDavid van Moolenbroek  * RETURN:      Status
378*29492bb7SDavid van Moolenbroek  *
379*29492bb7SDavid van Moolenbroek  * DESCRIPTION: Ascending callback used during the loading of the namespace,
380*29492bb7SDavid van Moolenbroek  *              both control methods and everything else.
381*29492bb7SDavid van Moolenbroek  *
382*29492bb7SDavid van Moolenbroek  ******************************************************************************/
383*29492bb7SDavid van Moolenbroek 
384*29492bb7SDavid van Moolenbroek ACPI_STATUS
AcpiDsLoad2EndOp(ACPI_WALK_STATE * WalkState)385*29492bb7SDavid van Moolenbroek AcpiDsLoad2EndOp (
386*29492bb7SDavid van Moolenbroek     ACPI_WALK_STATE         *WalkState)
387*29492bb7SDavid van Moolenbroek {
388*29492bb7SDavid van Moolenbroek     ACPI_PARSE_OBJECT       *Op;
389*29492bb7SDavid van Moolenbroek     ACPI_STATUS             Status = AE_OK;
390*29492bb7SDavid van Moolenbroek     ACPI_OBJECT_TYPE        ObjectType;
391*29492bb7SDavid van Moolenbroek     ACPI_NAMESPACE_NODE     *Node;
392*29492bb7SDavid van Moolenbroek     ACPI_PARSE_OBJECT       *Arg;
393*29492bb7SDavid van Moolenbroek     ACPI_NAMESPACE_NODE     *NewNode;
394*29492bb7SDavid van Moolenbroek #ifndef ACPI_NO_METHOD_EXECUTION
395*29492bb7SDavid van Moolenbroek     UINT32                  i;
396*29492bb7SDavid van Moolenbroek     UINT8                   RegionSpace;
397*29492bb7SDavid van Moolenbroek #endif
398*29492bb7SDavid van Moolenbroek 
399*29492bb7SDavid van Moolenbroek 
400*29492bb7SDavid van Moolenbroek     ACPI_FUNCTION_TRACE (DsLoad2EndOp);
401*29492bb7SDavid van Moolenbroek 
402*29492bb7SDavid van Moolenbroek     Op = WalkState->Op;
403*29492bb7SDavid van Moolenbroek     ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Opcode [%s] Op %p State %p\n",
404*29492bb7SDavid van Moolenbroek             WalkState->OpInfo->Name, Op, WalkState));
405*29492bb7SDavid van Moolenbroek 
406*29492bb7SDavid van Moolenbroek     /* Check if opcode had an associated namespace object */
407*29492bb7SDavid van Moolenbroek 
408*29492bb7SDavid van Moolenbroek     if (!(WalkState->OpInfo->Flags & AML_NSOBJECT))
409*29492bb7SDavid van Moolenbroek     {
410*29492bb7SDavid van Moolenbroek         return_ACPI_STATUS (AE_OK);
411*29492bb7SDavid van Moolenbroek     }
412*29492bb7SDavid van Moolenbroek 
413*29492bb7SDavid van Moolenbroek     if (Op->Common.AmlOpcode == AML_SCOPE_OP)
414*29492bb7SDavid van Moolenbroek     {
415*29492bb7SDavid van Moolenbroek         ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
416*29492bb7SDavid van Moolenbroek             "Ending scope Op=%p State=%p\n", Op, WalkState));
417*29492bb7SDavid van Moolenbroek     }
418*29492bb7SDavid van Moolenbroek 
419*29492bb7SDavid van Moolenbroek     ObjectType = WalkState->OpInfo->ObjectType;
420*29492bb7SDavid van Moolenbroek 
421*29492bb7SDavid van Moolenbroek     /*
422*29492bb7SDavid van Moolenbroek      * Get the Node/name from the earlier lookup
423*29492bb7SDavid van Moolenbroek      * (It was saved in the *op structure)
424*29492bb7SDavid van Moolenbroek      */
425*29492bb7SDavid van Moolenbroek     Node = Op->Common.Node;
426*29492bb7SDavid van Moolenbroek 
427*29492bb7SDavid van Moolenbroek     /*
428*29492bb7SDavid van Moolenbroek      * Put the Node on the object stack (Contains the ACPI Name of
429*29492bb7SDavid van Moolenbroek      * this object)
430*29492bb7SDavid van Moolenbroek      */
431*29492bb7SDavid van Moolenbroek     WalkState->Operands[0] = (void *) Node;
432*29492bb7SDavid van Moolenbroek     WalkState->NumOperands = 1;
433*29492bb7SDavid van Moolenbroek 
434*29492bb7SDavid van Moolenbroek     /* Pop the scope stack */
435*29492bb7SDavid van Moolenbroek 
436*29492bb7SDavid van Moolenbroek     if (AcpiNsOpensScope (ObjectType) &&
437*29492bb7SDavid van Moolenbroek        (Op->Common.AmlOpcode != AML_INT_METHODCALL_OP))
438*29492bb7SDavid van Moolenbroek     {
439*29492bb7SDavid van Moolenbroek         ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s) Popping scope for Op %p\n",
440*29492bb7SDavid van Moolenbroek             AcpiUtGetTypeName (ObjectType), Op));
441*29492bb7SDavid van Moolenbroek 
442*29492bb7SDavid van Moolenbroek         Status = AcpiDsScopeStackPop (WalkState);
443*29492bb7SDavid van Moolenbroek         if (ACPI_FAILURE (Status))
444*29492bb7SDavid van Moolenbroek         {
445*29492bb7SDavid van Moolenbroek             goto Cleanup;
446*29492bb7SDavid van Moolenbroek         }
447*29492bb7SDavid van Moolenbroek     }
448*29492bb7SDavid van Moolenbroek 
449*29492bb7SDavid van Moolenbroek     /*
450*29492bb7SDavid van Moolenbroek      * Named operations are as follows:
451*29492bb7SDavid van Moolenbroek      *
452*29492bb7SDavid van Moolenbroek      * AML_ALIAS
453*29492bb7SDavid van Moolenbroek      * AML_BANKFIELD
454*29492bb7SDavid van Moolenbroek      * AML_CREATEBITFIELD
455*29492bb7SDavid van Moolenbroek      * AML_CREATEBYTEFIELD
456*29492bb7SDavid van Moolenbroek      * AML_CREATEDWORDFIELD
457*29492bb7SDavid van Moolenbroek      * AML_CREATEFIELD
458*29492bb7SDavid van Moolenbroek      * AML_CREATEQWORDFIELD
459*29492bb7SDavid van Moolenbroek      * AML_CREATEWORDFIELD
460*29492bb7SDavid van Moolenbroek      * AML_DATA_REGION
461*29492bb7SDavid van Moolenbroek      * AML_DEVICE
462*29492bb7SDavid van Moolenbroek      * AML_EVENT
463*29492bb7SDavid van Moolenbroek      * AML_FIELD
464*29492bb7SDavid van Moolenbroek      * AML_INDEXFIELD
465*29492bb7SDavid van Moolenbroek      * AML_METHOD
466*29492bb7SDavid van Moolenbroek      * AML_METHODCALL
467*29492bb7SDavid van Moolenbroek      * AML_MUTEX
468*29492bb7SDavid van Moolenbroek      * AML_NAME
469*29492bb7SDavid van Moolenbroek      * AML_NAMEDFIELD
470*29492bb7SDavid van Moolenbroek      * AML_OPREGION
471*29492bb7SDavid van Moolenbroek      * AML_POWERRES
472*29492bb7SDavid van Moolenbroek      * AML_PROCESSOR
473*29492bb7SDavid van Moolenbroek      * AML_SCOPE
474*29492bb7SDavid van Moolenbroek      * AML_THERMALZONE
475*29492bb7SDavid van Moolenbroek      */
476*29492bb7SDavid van Moolenbroek 
477*29492bb7SDavid van Moolenbroek     ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
478*29492bb7SDavid van Moolenbroek         "Create-Load [%s] State=%p Op=%p NamedObj=%p\n",
479*29492bb7SDavid van Moolenbroek         AcpiPsGetOpcodeName (Op->Common.AmlOpcode), WalkState, Op, Node));
480*29492bb7SDavid van Moolenbroek 
481*29492bb7SDavid van Moolenbroek     /* Decode the opcode */
482*29492bb7SDavid van Moolenbroek 
483*29492bb7SDavid van Moolenbroek     Arg = Op->Common.Value.Arg;
484*29492bb7SDavid van Moolenbroek 
485*29492bb7SDavid van Moolenbroek     switch (WalkState->OpInfo->Type)
486*29492bb7SDavid van Moolenbroek     {
487*29492bb7SDavid van Moolenbroek #ifndef ACPI_NO_METHOD_EXECUTION
488*29492bb7SDavid van Moolenbroek 
489*29492bb7SDavid van Moolenbroek     case AML_TYPE_CREATE_FIELD:
490*29492bb7SDavid van Moolenbroek         /*
491*29492bb7SDavid van Moolenbroek          * Create the field object, but the field buffer and index must
492*29492bb7SDavid van Moolenbroek          * be evaluated later during the execution phase
493*29492bb7SDavid van Moolenbroek          */
494*29492bb7SDavid van Moolenbroek         Status = AcpiDsCreateBufferField (Op, WalkState);
495*29492bb7SDavid van Moolenbroek         break;
496*29492bb7SDavid van Moolenbroek 
497*29492bb7SDavid van Moolenbroek      case AML_TYPE_NAMED_FIELD:
498*29492bb7SDavid van Moolenbroek         /*
499*29492bb7SDavid van Moolenbroek          * If we are executing a method, initialize the field
500*29492bb7SDavid van Moolenbroek          */
501*29492bb7SDavid van Moolenbroek         if (WalkState->MethodNode)
502*29492bb7SDavid van Moolenbroek         {
503*29492bb7SDavid van Moolenbroek             Status = AcpiDsInitFieldObjects (Op, WalkState);
504*29492bb7SDavid van Moolenbroek         }
505*29492bb7SDavid van Moolenbroek 
506*29492bb7SDavid van Moolenbroek         switch (Op->Common.AmlOpcode)
507*29492bb7SDavid van Moolenbroek         {
508*29492bb7SDavid van Moolenbroek         case AML_INDEX_FIELD_OP:
509*29492bb7SDavid van Moolenbroek 
510*29492bb7SDavid van Moolenbroek             Status = AcpiDsCreateIndexField (Op, (ACPI_HANDLE) Arg->Common.Node,
511*29492bb7SDavid van Moolenbroek                         WalkState);
512*29492bb7SDavid van Moolenbroek             break;
513*29492bb7SDavid van Moolenbroek 
514*29492bb7SDavid van Moolenbroek         case AML_BANK_FIELD_OP:
515*29492bb7SDavid van Moolenbroek 
516*29492bb7SDavid van Moolenbroek             Status = AcpiDsCreateBankField (Op, Arg->Common.Node, WalkState);
517*29492bb7SDavid van Moolenbroek             break;
518*29492bb7SDavid van Moolenbroek 
519*29492bb7SDavid van Moolenbroek         case AML_FIELD_OP:
520*29492bb7SDavid van Moolenbroek 
521*29492bb7SDavid van Moolenbroek             Status = AcpiDsCreateField (Op, Arg->Common.Node, WalkState);
522*29492bb7SDavid van Moolenbroek             break;
523*29492bb7SDavid van Moolenbroek 
524*29492bb7SDavid van Moolenbroek         default:
525*29492bb7SDavid van Moolenbroek 
526*29492bb7SDavid van Moolenbroek             /* All NAMED_FIELD opcodes must be handled above */
527*29492bb7SDavid van Moolenbroek             break;
528*29492bb7SDavid van Moolenbroek         }
529*29492bb7SDavid van Moolenbroek         break;
530*29492bb7SDavid van Moolenbroek 
531*29492bb7SDavid van Moolenbroek      case AML_TYPE_NAMED_SIMPLE:
532*29492bb7SDavid van Moolenbroek 
533*29492bb7SDavid van Moolenbroek         Status = AcpiDsCreateOperands (WalkState, Arg);
534*29492bb7SDavid van Moolenbroek         if (ACPI_FAILURE (Status))
535*29492bb7SDavid van Moolenbroek         {
536*29492bb7SDavid van Moolenbroek             goto Cleanup;
537*29492bb7SDavid van Moolenbroek         }
538*29492bb7SDavid van Moolenbroek 
539*29492bb7SDavid van Moolenbroek         switch (Op->Common.AmlOpcode)
540*29492bb7SDavid van Moolenbroek         {
541*29492bb7SDavid van Moolenbroek         case AML_PROCESSOR_OP:
542*29492bb7SDavid van Moolenbroek 
543*29492bb7SDavid van Moolenbroek             Status = AcpiExCreateProcessor (WalkState);
544*29492bb7SDavid van Moolenbroek             break;
545*29492bb7SDavid van Moolenbroek 
546*29492bb7SDavid van Moolenbroek         case AML_POWER_RES_OP:
547*29492bb7SDavid van Moolenbroek 
548*29492bb7SDavid van Moolenbroek             Status = AcpiExCreatePowerResource (WalkState);
549*29492bb7SDavid van Moolenbroek             break;
550*29492bb7SDavid van Moolenbroek 
551*29492bb7SDavid van Moolenbroek         case AML_MUTEX_OP:
552*29492bb7SDavid van Moolenbroek 
553*29492bb7SDavid van Moolenbroek             Status = AcpiExCreateMutex (WalkState);
554*29492bb7SDavid van Moolenbroek             break;
555*29492bb7SDavid van Moolenbroek 
556*29492bb7SDavid van Moolenbroek         case AML_EVENT_OP:
557*29492bb7SDavid van Moolenbroek 
558*29492bb7SDavid van Moolenbroek             Status = AcpiExCreateEvent (WalkState);
559*29492bb7SDavid van Moolenbroek             break;
560*29492bb7SDavid van Moolenbroek 
561*29492bb7SDavid van Moolenbroek         case AML_ALIAS_OP:
562*29492bb7SDavid van Moolenbroek 
563*29492bb7SDavid van Moolenbroek             Status = AcpiExCreateAlias (WalkState);
564*29492bb7SDavid van Moolenbroek             break;
565*29492bb7SDavid van Moolenbroek 
566*29492bb7SDavid van Moolenbroek         default:
567*29492bb7SDavid van Moolenbroek 
568*29492bb7SDavid van Moolenbroek             /* Unknown opcode */
569*29492bb7SDavid van Moolenbroek 
570*29492bb7SDavid van Moolenbroek             Status = AE_OK;
571*29492bb7SDavid van Moolenbroek             goto Cleanup;
572*29492bb7SDavid van Moolenbroek         }
573*29492bb7SDavid van Moolenbroek 
574*29492bb7SDavid van Moolenbroek         /* Delete operands */
575*29492bb7SDavid van Moolenbroek 
576*29492bb7SDavid van Moolenbroek         for (i = 1; i < WalkState->NumOperands; i++)
577*29492bb7SDavid van Moolenbroek         {
578*29492bb7SDavid van Moolenbroek             AcpiUtRemoveReference (WalkState->Operands[i]);
579*29492bb7SDavid van Moolenbroek             WalkState->Operands[i] = NULL;
580*29492bb7SDavid van Moolenbroek         }
581*29492bb7SDavid van Moolenbroek 
582*29492bb7SDavid van Moolenbroek         break;
583*29492bb7SDavid van Moolenbroek #endif /* ACPI_NO_METHOD_EXECUTION */
584*29492bb7SDavid van Moolenbroek 
585*29492bb7SDavid van Moolenbroek     case AML_TYPE_NAMED_COMPLEX:
586*29492bb7SDavid van Moolenbroek 
587*29492bb7SDavid van Moolenbroek         switch (Op->Common.AmlOpcode)
588*29492bb7SDavid van Moolenbroek         {
589*29492bb7SDavid van Moolenbroek #ifndef ACPI_NO_METHOD_EXECUTION
590*29492bb7SDavid van Moolenbroek         case AML_REGION_OP:
591*29492bb7SDavid van Moolenbroek         case AML_DATA_REGION_OP:
592*29492bb7SDavid van Moolenbroek 
593*29492bb7SDavid van Moolenbroek             if (Op->Common.AmlOpcode == AML_REGION_OP)
594*29492bb7SDavid van Moolenbroek             {
595*29492bb7SDavid van Moolenbroek                 RegionSpace = (ACPI_ADR_SPACE_TYPE)
596*29492bb7SDavid van Moolenbroek                       ((Op->Common.Value.Arg)->Common.Value.Integer);
597*29492bb7SDavid van Moolenbroek             }
598*29492bb7SDavid van Moolenbroek             else
599*29492bb7SDavid van Moolenbroek             {
600*29492bb7SDavid van Moolenbroek                 RegionSpace = ACPI_ADR_SPACE_DATA_TABLE;
601*29492bb7SDavid van Moolenbroek             }
602*29492bb7SDavid van Moolenbroek 
603*29492bb7SDavid van Moolenbroek             /*
604*29492bb7SDavid van Moolenbroek              * The OpRegion is not fully parsed at this time. The only valid
605*29492bb7SDavid van Moolenbroek              * argument is the SpaceId. (We must save the address of the
606*29492bb7SDavid van Moolenbroek              * AML of the address and length operands)
607*29492bb7SDavid van Moolenbroek              *
608*29492bb7SDavid van Moolenbroek              * If we have a valid region, initialize it. The namespace is
609*29492bb7SDavid van Moolenbroek              * unlocked at this point.
610*29492bb7SDavid van Moolenbroek              *
611*29492bb7SDavid van Moolenbroek              * Need to unlock interpreter if it is locked (if we are running
612*29492bb7SDavid van Moolenbroek              * a control method), in order to allow _REG methods to be run
613*29492bb7SDavid van Moolenbroek              * during AcpiEvInitializeRegion.
614*29492bb7SDavid van Moolenbroek              */
615*29492bb7SDavid van Moolenbroek             if (WalkState->MethodNode)
616*29492bb7SDavid van Moolenbroek             {
617*29492bb7SDavid van Moolenbroek                 /*
618*29492bb7SDavid van Moolenbroek                  * Executing a method: initialize the region and unlock
619*29492bb7SDavid van Moolenbroek                  * the interpreter
620*29492bb7SDavid van Moolenbroek                  */
621*29492bb7SDavid van Moolenbroek                 Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length,
622*29492bb7SDavid van Moolenbroek                             RegionSpace, WalkState);
623*29492bb7SDavid van Moolenbroek                 if (ACPI_FAILURE (Status))
624*29492bb7SDavid van Moolenbroek                 {
625*29492bb7SDavid van Moolenbroek                     return_ACPI_STATUS (Status);
626*29492bb7SDavid van Moolenbroek                 }
627*29492bb7SDavid van Moolenbroek 
628*29492bb7SDavid van Moolenbroek                 AcpiExExitInterpreter ();
629*29492bb7SDavid van Moolenbroek             }
630*29492bb7SDavid van Moolenbroek 
631*29492bb7SDavid van Moolenbroek             Status = AcpiEvInitializeRegion (AcpiNsGetAttachedObject (Node),
632*29492bb7SDavid van Moolenbroek                         FALSE);
633*29492bb7SDavid van Moolenbroek             if (WalkState->MethodNode)
634*29492bb7SDavid van Moolenbroek             {
635*29492bb7SDavid van Moolenbroek                 AcpiExEnterInterpreter ();
636*29492bb7SDavid van Moolenbroek             }
637*29492bb7SDavid van Moolenbroek 
638*29492bb7SDavid van Moolenbroek             if (ACPI_FAILURE (Status))
639*29492bb7SDavid van Moolenbroek             {
640*29492bb7SDavid van Moolenbroek                 /*
641*29492bb7SDavid van Moolenbroek                  *  If AE_NOT_EXIST is returned, it is not fatal
642*29492bb7SDavid van Moolenbroek                  *  because many regions get created before a handler
643*29492bb7SDavid van Moolenbroek                  *  is installed for said region.
644*29492bb7SDavid van Moolenbroek                  */
645*29492bb7SDavid van Moolenbroek                 if (AE_NOT_EXIST == Status)
646*29492bb7SDavid van Moolenbroek                 {
647*29492bb7SDavid van Moolenbroek                     Status = AE_OK;
648*29492bb7SDavid van Moolenbroek                 }
649*29492bb7SDavid van Moolenbroek             }
650*29492bb7SDavid van Moolenbroek             break;
651*29492bb7SDavid van Moolenbroek 
652*29492bb7SDavid van Moolenbroek         case AML_NAME_OP:
653*29492bb7SDavid van Moolenbroek 
654*29492bb7SDavid van Moolenbroek             Status = AcpiDsCreateNode (WalkState, Node, Op);
655*29492bb7SDavid van Moolenbroek             break;
656*29492bb7SDavid van Moolenbroek 
657*29492bb7SDavid van Moolenbroek         case AML_METHOD_OP:
658*29492bb7SDavid van Moolenbroek             /*
659*29492bb7SDavid van Moolenbroek              * MethodOp PkgLength NameString MethodFlags TermList
660*29492bb7SDavid van Moolenbroek              *
661*29492bb7SDavid van Moolenbroek              * Note: We must create the method node/object pair as soon as we
662*29492bb7SDavid van Moolenbroek              * see the method declaration. This allows later pass1 parsing
663*29492bb7SDavid van Moolenbroek              * of invocations of the method (need to know the number of
664*29492bb7SDavid van Moolenbroek              * arguments.)
665*29492bb7SDavid van Moolenbroek              */
666*29492bb7SDavid van Moolenbroek             ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
667*29492bb7SDavid van Moolenbroek                 "LOADING-Method: State=%p Op=%p NamedObj=%p\n",
668*29492bb7SDavid van Moolenbroek                 WalkState, Op, Op->Named.Node));
669*29492bb7SDavid van Moolenbroek 
670*29492bb7SDavid van Moolenbroek             if (!AcpiNsGetAttachedObject (Op->Named.Node))
671*29492bb7SDavid van Moolenbroek             {
672*29492bb7SDavid van Moolenbroek                 WalkState->Operands[0] = ACPI_CAST_PTR (void, Op->Named.Node);
673*29492bb7SDavid van Moolenbroek                 WalkState->NumOperands = 1;
674*29492bb7SDavid van Moolenbroek 
675*29492bb7SDavid van Moolenbroek                 Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg);
676*29492bb7SDavid van Moolenbroek                 if (ACPI_SUCCESS (Status))
677*29492bb7SDavid van Moolenbroek                 {
678*29492bb7SDavid van Moolenbroek                     Status = AcpiExCreateMethod (Op->Named.Data,
679*29492bb7SDavid van Moolenbroek                                         Op->Named.Length, WalkState);
680*29492bb7SDavid van Moolenbroek                 }
681*29492bb7SDavid van Moolenbroek                 WalkState->Operands[0] = NULL;
682*29492bb7SDavid van Moolenbroek                 WalkState->NumOperands = 0;
683*29492bb7SDavid van Moolenbroek 
684*29492bb7SDavid van Moolenbroek                 if (ACPI_FAILURE (Status))
685*29492bb7SDavid van Moolenbroek                 {
686*29492bb7SDavid van Moolenbroek                     return_ACPI_STATUS (Status);
687*29492bb7SDavid van Moolenbroek                 }
688*29492bb7SDavid van Moolenbroek             }
689*29492bb7SDavid van Moolenbroek             break;
690*29492bb7SDavid van Moolenbroek 
691*29492bb7SDavid van Moolenbroek #endif /* ACPI_NO_METHOD_EXECUTION */
692*29492bb7SDavid van Moolenbroek 
693*29492bb7SDavid van Moolenbroek         default:
694*29492bb7SDavid van Moolenbroek 
695*29492bb7SDavid van Moolenbroek             /* All NAMED_COMPLEX opcodes must be handled above */
696*29492bb7SDavid van Moolenbroek             break;
697*29492bb7SDavid van Moolenbroek         }
698*29492bb7SDavid van Moolenbroek         break;
699*29492bb7SDavid van Moolenbroek 
700*29492bb7SDavid van Moolenbroek     case AML_CLASS_INTERNAL:
701*29492bb7SDavid van Moolenbroek 
702*29492bb7SDavid van Moolenbroek         /* case AML_INT_NAMEPATH_OP: */
703*29492bb7SDavid van Moolenbroek         break;
704*29492bb7SDavid van Moolenbroek 
705*29492bb7SDavid van Moolenbroek     case AML_CLASS_METHOD_CALL:
706*29492bb7SDavid van Moolenbroek 
707*29492bb7SDavid van Moolenbroek         ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
708*29492bb7SDavid van Moolenbroek             "RESOLVING-MethodCall: State=%p Op=%p NamedObj=%p\n",
709*29492bb7SDavid van Moolenbroek             WalkState, Op, Node));
710*29492bb7SDavid van Moolenbroek 
711*29492bb7SDavid van Moolenbroek         /*
712*29492bb7SDavid van Moolenbroek          * Lookup the method name and save the Node
713*29492bb7SDavid van Moolenbroek          */
714*29492bb7SDavid van Moolenbroek         Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
715*29492bb7SDavid van Moolenbroek                         ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS2,
716*29492bb7SDavid van Moolenbroek                         ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
717*29492bb7SDavid van Moolenbroek                         WalkState, &(NewNode));
718*29492bb7SDavid van Moolenbroek         if (ACPI_SUCCESS (Status))
719*29492bb7SDavid van Moolenbroek         {
720*29492bb7SDavid van Moolenbroek             /*
721*29492bb7SDavid van Moolenbroek              * Make sure that what we found is indeed a method
722*29492bb7SDavid van Moolenbroek              * We didn't search for a method on purpose, to see if the name
723*29492bb7SDavid van Moolenbroek              * would resolve
724*29492bb7SDavid van Moolenbroek              */
725*29492bb7SDavid van Moolenbroek             if (NewNode->Type != ACPI_TYPE_METHOD)
726*29492bb7SDavid van Moolenbroek             {
727*29492bb7SDavid van Moolenbroek                 Status = AE_AML_OPERAND_TYPE;
728*29492bb7SDavid van Moolenbroek             }
729*29492bb7SDavid van Moolenbroek 
730*29492bb7SDavid van Moolenbroek             /* We could put the returned object (Node) on the object stack for
731*29492bb7SDavid van Moolenbroek              * later, but for now, we will put it in the "op" object that the
732*29492bb7SDavid van Moolenbroek              * parser uses, so we can get it again at the end of this scope
733*29492bb7SDavid van Moolenbroek              */
734*29492bb7SDavid van Moolenbroek             Op->Common.Node = NewNode;
735*29492bb7SDavid van Moolenbroek         }
736*29492bb7SDavid van Moolenbroek         else
737*29492bb7SDavid van Moolenbroek         {
738*29492bb7SDavid van Moolenbroek             ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
739*29492bb7SDavid van Moolenbroek         }
740*29492bb7SDavid van Moolenbroek         break;
741*29492bb7SDavid van Moolenbroek 
742*29492bb7SDavid van Moolenbroek 
743*29492bb7SDavid van Moolenbroek     default:
744*29492bb7SDavid van Moolenbroek 
745*29492bb7SDavid van Moolenbroek         break;
746*29492bb7SDavid van Moolenbroek     }
747*29492bb7SDavid van Moolenbroek 
748*29492bb7SDavid van Moolenbroek Cleanup:
749*29492bb7SDavid van Moolenbroek 
750*29492bb7SDavid van Moolenbroek     /* Remove the Node pushed at the very beginning */
751*29492bb7SDavid van Moolenbroek 
752*29492bb7SDavid van Moolenbroek     WalkState->Operands[0] = NULL;
753*29492bb7SDavid van Moolenbroek     WalkState->NumOperands = 0;
754*29492bb7SDavid van Moolenbroek     return_ACPI_STATUS (Status);
755*29492bb7SDavid van Moolenbroek }
756