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