1433d6423SLionel Sambuc /******************************************************************************
2433d6423SLionel Sambuc *
3433d6423SLionel Sambuc * Module Name: dsfield - Dispatcher field routines
4433d6423SLionel Sambuc *
5433d6423SLionel Sambuc *****************************************************************************/
6433d6423SLionel Sambuc
7*29492bb7SDavid van Moolenbroek /*
8*29492bb7SDavid van Moolenbroek * Copyright (C) 2000 - 2014, Intel Corp.
9433d6423SLionel Sambuc * All rights reserved.
10433d6423SLionel Sambuc *
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.
25433d6423SLionel Sambuc *
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.
29433d6423SLionel Sambuc *
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 */
43433d6423SLionel Sambuc
44433d6423SLionel Sambuc #include "acpi.h"
45433d6423SLionel Sambuc #include "accommon.h"
46433d6423SLionel Sambuc #include "amlcode.h"
47433d6423SLionel Sambuc #include "acdispat.h"
48433d6423SLionel Sambuc #include "acinterp.h"
49433d6423SLionel Sambuc #include "acnamesp.h"
50433d6423SLionel Sambuc #include "acparser.h"
51433d6423SLionel Sambuc
52433d6423SLionel Sambuc
53433d6423SLionel Sambuc #define _COMPONENT ACPI_DISPATCHER
54433d6423SLionel Sambuc ACPI_MODULE_NAME ("dsfield")
55433d6423SLionel Sambuc
56433d6423SLionel Sambuc /* Local prototypes */
57433d6423SLionel Sambuc
58*29492bb7SDavid van Moolenbroek #ifdef ACPI_ASL_COMPILER
59*29492bb7SDavid van Moolenbroek #include "acdisasm.h"
60*29492bb7SDavid van Moolenbroek
61*29492bb7SDavid van Moolenbroek static ACPI_STATUS
62*29492bb7SDavid van Moolenbroek AcpiDsCreateExternalRegion (
63*29492bb7SDavid van Moolenbroek ACPI_STATUS LookupStatus,
64*29492bb7SDavid van Moolenbroek ACPI_PARSE_OBJECT *Op,
65*29492bb7SDavid van Moolenbroek char *Path,
66*29492bb7SDavid van Moolenbroek ACPI_WALK_STATE *WalkState,
67*29492bb7SDavid van Moolenbroek ACPI_NAMESPACE_NODE **Node);
68*29492bb7SDavid van Moolenbroek #endif
69*29492bb7SDavid van Moolenbroek
70433d6423SLionel Sambuc static ACPI_STATUS
71433d6423SLionel Sambuc AcpiDsGetFieldNames (
72433d6423SLionel Sambuc ACPI_CREATE_FIELD_INFO *Info,
73433d6423SLionel Sambuc ACPI_WALK_STATE *WalkState,
74433d6423SLionel Sambuc ACPI_PARSE_OBJECT *Arg);
75433d6423SLionel Sambuc
76433d6423SLionel Sambuc
77*29492bb7SDavid van Moolenbroek #ifdef ACPI_ASL_COMPILER
78*29492bb7SDavid van Moolenbroek /*******************************************************************************
79*29492bb7SDavid van Moolenbroek *
80*29492bb7SDavid van Moolenbroek * FUNCTION: AcpiDsCreateExternalRegion (iASL Disassembler only)
81*29492bb7SDavid van Moolenbroek *
82*29492bb7SDavid van Moolenbroek * PARAMETERS: LookupStatus - Status from NsLookup operation
83*29492bb7SDavid van Moolenbroek * Op - Op containing the Field definition and args
84*29492bb7SDavid van Moolenbroek * Path - Pathname of the region
85*29492bb7SDavid van Moolenbroek * ` WalkState - Current method state
86*29492bb7SDavid van Moolenbroek * Node - Where the new region node is returned
87*29492bb7SDavid van Moolenbroek *
88*29492bb7SDavid van Moolenbroek * RETURN: Status
89*29492bb7SDavid van Moolenbroek *
90*29492bb7SDavid van Moolenbroek * DESCRIPTION: Add region to the external list if NOT_FOUND. Create a new
91*29492bb7SDavid van Moolenbroek * region node/object.
92*29492bb7SDavid van Moolenbroek *
93*29492bb7SDavid van Moolenbroek ******************************************************************************/
94*29492bb7SDavid van Moolenbroek
95*29492bb7SDavid van Moolenbroek static ACPI_STATUS
AcpiDsCreateExternalRegion(ACPI_STATUS LookupStatus,ACPI_PARSE_OBJECT * Op,char * Path,ACPI_WALK_STATE * WalkState,ACPI_NAMESPACE_NODE ** Node)96*29492bb7SDavid van Moolenbroek AcpiDsCreateExternalRegion (
97*29492bb7SDavid van Moolenbroek ACPI_STATUS LookupStatus,
98*29492bb7SDavid van Moolenbroek ACPI_PARSE_OBJECT *Op,
99*29492bb7SDavid van Moolenbroek char *Path,
100*29492bb7SDavid van Moolenbroek ACPI_WALK_STATE *WalkState,
101*29492bb7SDavid van Moolenbroek ACPI_NAMESPACE_NODE **Node)
102*29492bb7SDavid van Moolenbroek {
103*29492bb7SDavid van Moolenbroek ACPI_STATUS Status;
104*29492bb7SDavid van Moolenbroek ACPI_OPERAND_OBJECT *ObjDesc;
105*29492bb7SDavid van Moolenbroek
106*29492bb7SDavid van Moolenbroek
107*29492bb7SDavid van Moolenbroek if (LookupStatus != AE_NOT_FOUND)
108*29492bb7SDavid van Moolenbroek {
109*29492bb7SDavid van Moolenbroek return (LookupStatus);
110*29492bb7SDavid van Moolenbroek }
111*29492bb7SDavid van Moolenbroek
112*29492bb7SDavid van Moolenbroek /*
113*29492bb7SDavid van Moolenbroek * Table disassembly:
114*29492bb7SDavid van Moolenbroek * OperationRegion not found. Generate an External for it, and
115*29492bb7SDavid van Moolenbroek * insert the name into the namespace.
116*29492bb7SDavid van Moolenbroek */
117*29492bb7SDavid van Moolenbroek AcpiDmAddOpToExternalList (Op, Path, ACPI_TYPE_REGION, 0, 0);
118*29492bb7SDavid van Moolenbroek Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_REGION,
119*29492bb7SDavid van Moolenbroek ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, WalkState, Node);
120*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
121*29492bb7SDavid van Moolenbroek {
122*29492bb7SDavid van Moolenbroek return (Status);
123*29492bb7SDavid van Moolenbroek }
124*29492bb7SDavid van Moolenbroek
125*29492bb7SDavid van Moolenbroek /* Must create and install a region object for the new node */
126*29492bb7SDavid van Moolenbroek
127*29492bb7SDavid van Moolenbroek ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
128*29492bb7SDavid van Moolenbroek if (!ObjDesc)
129*29492bb7SDavid van Moolenbroek {
130*29492bb7SDavid van Moolenbroek return (AE_NO_MEMORY);
131*29492bb7SDavid van Moolenbroek }
132*29492bb7SDavid van Moolenbroek
133*29492bb7SDavid van Moolenbroek ObjDesc->Region.Node = *Node;
134*29492bb7SDavid van Moolenbroek Status = AcpiNsAttachObject (*Node, ObjDesc, ACPI_TYPE_REGION);
135*29492bb7SDavid van Moolenbroek return (Status);
136*29492bb7SDavid van Moolenbroek }
137*29492bb7SDavid van Moolenbroek #endif
138*29492bb7SDavid van Moolenbroek
139*29492bb7SDavid van Moolenbroek
140433d6423SLionel Sambuc /*******************************************************************************
141433d6423SLionel Sambuc *
142433d6423SLionel Sambuc * FUNCTION: AcpiDsCreateBufferField
143433d6423SLionel Sambuc *
144433d6423SLionel Sambuc * PARAMETERS: Op - Current parse op (CreateXXField)
145433d6423SLionel Sambuc * WalkState - Current state
146433d6423SLionel Sambuc *
147433d6423SLionel Sambuc * RETURN: Status
148433d6423SLionel Sambuc *
149433d6423SLionel Sambuc * DESCRIPTION: Execute the CreateField operators:
150433d6423SLionel Sambuc * CreateBitFieldOp,
151433d6423SLionel Sambuc * CreateByteFieldOp,
152433d6423SLionel Sambuc * CreateWordFieldOp,
153*29492bb7SDavid van Moolenbroek * CreateDwordFieldOp,
154*29492bb7SDavid van Moolenbroek * CreateQwordFieldOp,
155433d6423SLionel Sambuc * CreateFieldOp (all of which define a field in a buffer)
156433d6423SLionel Sambuc *
157433d6423SLionel Sambuc ******************************************************************************/
158433d6423SLionel Sambuc
159433d6423SLionel Sambuc ACPI_STATUS
AcpiDsCreateBufferField(ACPI_PARSE_OBJECT * Op,ACPI_WALK_STATE * WalkState)160433d6423SLionel Sambuc AcpiDsCreateBufferField (
161433d6423SLionel Sambuc ACPI_PARSE_OBJECT *Op,
162433d6423SLionel Sambuc ACPI_WALK_STATE *WalkState)
163433d6423SLionel Sambuc {
164433d6423SLionel Sambuc ACPI_PARSE_OBJECT *Arg;
165433d6423SLionel Sambuc ACPI_NAMESPACE_NODE *Node;
166433d6423SLionel Sambuc ACPI_STATUS Status;
167433d6423SLionel Sambuc ACPI_OPERAND_OBJECT *ObjDesc;
168433d6423SLionel Sambuc ACPI_OPERAND_OBJECT *SecondDesc = NULL;
169433d6423SLionel Sambuc UINT32 Flags;
170433d6423SLionel Sambuc
171433d6423SLionel Sambuc
172433d6423SLionel Sambuc ACPI_FUNCTION_TRACE (DsCreateBufferField);
173433d6423SLionel Sambuc
174433d6423SLionel Sambuc
175433d6423SLionel Sambuc /*
176433d6423SLionel Sambuc * Get the NameString argument (name of the new BufferField)
177433d6423SLionel Sambuc */
178433d6423SLionel Sambuc if (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)
179433d6423SLionel Sambuc {
180433d6423SLionel Sambuc /* For CreateField, name is the 4th argument */
181433d6423SLionel Sambuc
182433d6423SLionel Sambuc Arg = AcpiPsGetArg (Op, 3);
183433d6423SLionel Sambuc }
184433d6423SLionel Sambuc else
185433d6423SLionel Sambuc {
186433d6423SLionel Sambuc /* For all other CreateXXXField operators, name is the 3rd argument */
187433d6423SLionel Sambuc
188433d6423SLionel Sambuc Arg = AcpiPsGetArg (Op, 2);
189433d6423SLionel Sambuc }
190433d6423SLionel Sambuc
191433d6423SLionel Sambuc if (!Arg)
192433d6423SLionel Sambuc {
193433d6423SLionel Sambuc return_ACPI_STATUS (AE_AML_NO_OPERAND);
194433d6423SLionel Sambuc }
195433d6423SLionel Sambuc
196433d6423SLionel Sambuc if (WalkState->DeferredNode)
197433d6423SLionel Sambuc {
198433d6423SLionel Sambuc Node = WalkState->DeferredNode;
199433d6423SLionel Sambuc Status = AE_OK;
200433d6423SLionel Sambuc }
201433d6423SLionel Sambuc else
202433d6423SLionel Sambuc {
203433d6423SLionel Sambuc /* Execute flag should always be set when this function is entered */
204433d6423SLionel Sambuc
205433d6423SLionel Sambuc if (!(WalkState->ParseFlags & ACPI_PARSE_EXECUTE))
206433d6423SLionel Sambuc {
207433d6423SLionel Sambuc return_ACPI_STATUS (AE_AML_INTERNAL);
208433d6423SLionel Sambuc }
209433d6423SLionel Sambuc
210433d6423SLionel Sambuc /* Creating new namespace node, should not already exist */
211433d6423SLionel Sambuc
212433d6423SLionel Sambuc Flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
213433d6423SLionel Sambuc ACPI_NS_ERROR_IF_FOUND;
214433d6423SLionel Sambuc
215433d6423SLionel Sambuc /*
216433d6423SLionel Sambuc * Mark node temporary if we are executing a normal control
217433d6423SLionel Sambuc * method. (Don't mark if this is a module-level code method)
218433d6423SLionel Sambuc */
219433d6423SLionel Sambuc if (WalkState->MethodNode &&
220433d6423SLionel Sambuc !(WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
221433d6423SLionel Sambuc {
222433d6423SLionel Sambuc Flags |= ACPI_NS_TEMPORARY;
223433d6423SLionel Sambuc }
224433d6423SLionel Sambuc
225433d6423SLionel Sambuc /* Enter the NameString into the namespace */
226433d6423SLionel Sambuc
227433d6423SLionel Sambuc Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
228433d6423SLionel Sambuc ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1,
229433d6423SLionel Sambuc Flags, WalkState, &Node);
230433d6423SLionel Sambuc if (ACPI_FAILURE (Status))
231433d6423SLionel Sambuc {
232433d6423SLionel Sambuc ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
233433d6423SLionel Sambuc return_ACPI_STATUS (Status);
234433d6423SLionel Sambuc }
235433d6423SLionel Sambuc }
236433d6423SLionel Sambuc
237433d6423SLionel Sambuc /*
238433d6423SLionel Sambuc * We could put the returned object (Node) on the object stack for later,
239433d6423SLionel Sambuc * but for now, we will put it in the "op" object that the parser uses,
240433d6423SLionel Sambuc * so we can get it again at the end of this scope.
241433d6423SLionel Sambuc */
242433d6423SLionel Sambuc Op->Common.Node = Node;
243433d6423SLionel Sambuc
244433d6423SLionel Sambuc /*
245433d6423SLionel Sambuc * If there is no object attached to the node, this node was just created
246433d6423SLionel Sambuc * and we need to create the field object. Otherwise, this was a lookup
247433d6423SLionel Sambuc * of an existing node and we don't want to create the field object again.
248433d6423SLionel Sambuc */
249433d6423SLionel Sambuc ObjDesc = AcpiNsGetAttachedObject (Node);
250433d6423SLionel Sambuc if (ObjDesc)
251433d6423SLionel Sambuc {
252433d6423SLionel Sambuc return_ACPI_STATUS (AE_OK);
253433d6423SLionel Sambuc }
254433d6423SLionel Sambuc
255433d6423SLionel Sambuc /*
256433d6423SLionel Sambuc * The Field definition is not fully parsed at this time.
257433d6423SLionel Sambuc * (We must save the address of the AML for the buffer and index operands)
258433d6423SLionel Sambuc */
259433d6423SLionel Sambuc
260433d6423SLionel Sambuc /* Create the buffer field object */
261433d6423SLionel Sambuc
262433d6423SLionel Sambuc ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_BUFFER_FIELD);
263433d6423SLionel Sambuc if (!ObjDesc)
264433d6423SLionel Sambuc {
265433d6423SLionel Sambuc Status = AE_NO_MEMORY;
266433d6423SLionel Sambuc goto Cleanup;
267433d6423SLionel Sambuc }
268433d6423SLionel Sambuc
269433d6423SLionel Sambuc /*
270433d6423SLionel Sambuc * Remember location in AML stream of the field unit opcode and operands --
271433d6423SLionel Sambuc * since the buffer and index operands must be evaluated.
272433d6423SLionel Sambuc */
273433d6423SLionel Sambuc SecondDesc = ObjDesc->Common.NextObject;
274433d6423SLionel Sambuc SecondDesc->Extra.AmlStart = Op->Named.Data;
275433d6423SLionel Sambuc SecondDesc->Extra.AmlLength = Op->Named.Length;
276433d6423SLionel Sambuc ObjDesc->BufferField.Node = Node;
277433d6423SLionel Sambuc
278433d6423SLionel Sambuc /* Attach constructed field descriptors to parent node */
279433d6423SLionel Sambuc
280433d6423SLionel Sambuc Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_BUFFER_FIELD);
281433d6423SLionel Sambuc if (ACPI_FAILURE (Status))
282433d6423SLionel Sambuc {
283433d6423SLionel Sambuc goto Cleanup;
284433d6423SLionel Sambuc }
285433d6423SLionel Sambuc
286433d6423SLionel Sambuc
287433d6423SLionel Sambuc Cleanup:
288433d6423SLionel Sambuc
289433d6423SLionel Sambuc /* Remove local reference to the object */
290433d6423SLionel Sambuc
291433d6423SLionel Sambuc AcpiUtRemoveReference (ObjDesc);
292433d6423SLionel Sambuc return_ACPI_STATUS (Status);
293433d6423SLionel Sambuc }
294433d6423SLionel Sambuc
295433d6423SLionel Sambuc
296433d6423SLionel Sambuc /*******************************************************************************
297433d6423SLionel Sambuc *
298433d6423SLionel Sambuc * FUNCTION: AcpiDsGetFieldNames
299433d6423SLionel Sambuc *
300433d6423SLionel Sambuc * PARAMETERS: Info - CreateField info structure
301433d6423SLionel Sambuc * ` WalkState - Current method state
302433d6423SLionel Sambuc * Arg - First parser arg for the field name list
303433d6423SLionel Sambuc *
304433d6423SLionel Sambuc * RETURN: Status
305433d6423SLionel Sambuc *
306433d6423SLionel Sambuc * DESCRIPTION: Process all named fields in a field declaration. Names are
307433d6423SLionel Sambuc * entered into the namespace.
308433d6423SLionel Sambuc *
309433d6423SLionel Sambuc ******************************************************************************/
310433d6423SLionel Sambuc
311433d6423SLionel Sambuc static ACPI_STATUS
AcpiDsGetFieldNames(ACPI_CREATE_FIELD_INFO * Info,ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT * Arg)312433d6423SLionel Sambuc AcpiDsGetFieldNames (
313433d6423SLionel Sambuc ACPI_CREATE_FIELD_INFO *Info,
314433d6423SLionel Sambuc ACPI_WALK_STATE *WalkState,
315433d6423SLionel Sambuc ACPI_PARSE_OBJECT *Arg)
316433d6423SLionel Sambuc {
317433d6423SLionel Sambuc ACPI_STATUS Status;
318433d6423SLionel Sambuc UINT64 Position;
319*29492bb7SDavid van Moolenbroek ACPI_PARSE_OBJECT *Child;
320433d6423SLionel Sambuc
321433d6423SLionel Sambuc
322433d6423SLionel Sambuc ACPI_FUNCTION_TRACE_PTR (DsGetFieldNames, Info);
323433d6423SLionel Sambuc
324433d6423SLionel Sambuc
325433d6423SLionel Sambuc /* First field starts at bit zero */
326433d6423SLionel Sambuc
327433d6423SLionel Sambuc Info->FieldBitPosition = 0;
328433d6423SLionel Sambuc
329433d6423SLionel Sambuc /* Process all elements in the field list (of parse nodes) */
330433d6423SLionel Sambuc
331433d6423SLionel Sambuc while (Arg)
332433d6423SLionel Sambuc {
333433d6423SLionel Sambuc /*
334*29492bb7SDavid van Moolenbroek * Four types of field elements are handled:
335*29492bb7SDavid van Moolenbroek * 1) Name - Enters a new named field into the namespace
336*29492bb7SDavid van Moolenbroek * 2) Offset - specifies a bit offset
337*29492bb7SDavid van Moolenbroek * 3) AccessAs - changes the access mode/attributes
338*29492bb7SDavid van Moolenbroek * 4) Connection - Associate a resource template with the field
339433d6423SLionel Sambuc */
340433d6423SLionel Sambuc switch (Arg->Common.AmlOpcode)
341433d6423SLionel Sambuc {
342433d6423SLionel Sambuc case AML_INT_RESERVEDFIELD_OP:
343433d6423SLionel Sambuc
344433d6423SLionel Sambuc Position = (UINT64) Info->FieldBitPosition
345433d6423SLionel Sambuc + (UINT64) Arg->Common.Value.Size;
346433d6423SLionel Sambuc
347433d6423SLionel Sambuc if (Position > ACPI_UINT32_MAX)
348433d6423SLionel Sambuc {
349433d6423SLionel Sambuc ACPI_ERROR ((AE_INFO,
350433d6423SLionel Sambuc "Bit offset within field too large (> 0xFFFFFFFF)"));
351433d6423SLionel Sambuc return_ACPI_STATUS (AE_SUPPORT);
352433d6423SLionel Sambuc }
353433d6423SLionel Sambuc
354433d6423SLionel Sambuc Info->FieldBitPosition = (UINT32) Position;
355433d6423SLionel Sambuc break;
356433d6423SLionel Sambuc
357433d6423SLionel Sambuc case AML_INT_ACCESSFIELD_OP:
358*29492bb7SDavid van Moolenbroek case AML_INT_EXTACCESSFIELD_OP:
359433d6423SLionel Sambuc /*
360*29492bb7SDavid van Moolenbroek * Get new AccessType, AccessAttribute, and AccessLength fields
361*29492bb7SDavid van Moolenbroek * -- to be used for all field units that follow, until the
362*29492bb7SDavid van Moolenbroek * end-of-field or another AccessAs keyword is encountered.
363*29492bb7SDavid van Moolenbroek * NOTE. These three bytes are encoded in the integer value
364*29492bb7SDavid van Moolenbroek * of the parseop for convenience.
365433d6423SLionel Sambuc *
366433d6423SLionel Sambuc * In FieldFlags, preserve the flag bits other than the
367*29492bb7SDavid van Moolenbroek * ACCESS_TYPE bits.
368433d6423SLionel Sambuc */
369*29492bb7SDavid van Moolenbroek
370*29492bb7SDavid van Moolenbroek /* AccessType (ByteAcc, WordAcc, etc.) */
371*29492bb7SDavid van Moolenbroek
372433d6423SLionel Sambuc Info->FieldFlags = (UINT8)
373433d6423SLionel Sambuc ((Info->FieldFlags & ~(AML_FIELD_ACCESS_TYPE_MASK)) |
374*29492bb7SDavid van Moolenbroek ((UINT8) ((UINT32) (Arg->Common.Value.Integer & 0x07))));
375433d6423SLionel Sambuc
376*29492bb7SDavid van Moolenbroek /* AccessAttribute (AttribQuick, AttribByte, etc.) */
377*29492bb7SDavid van Moolenbroek
378*29492bb7SDavid van Moolenbroek Info->Attribute = (UINT8) ((Arg->Common.Value.Integer >> 8) & 0xFF);
379*29492bb7SDavid van Moolenbroek
380*29492bb7SDavid van Moolenbroek /* AccessLength (for serial/buffer protocols) */
381*29492bb7SDavid van Moolenbroek
382*29492bb7SDavid van Moolenbroek Info->AccessLength = (UINT8) ((Arg->Common.Value.Integer >> 16) & 0xFF);
383433d6423SLionel Sambuc break;
384433d6423SLionel Sambuc
385*29492bb7SDavid van Moolenbroek case AML_INT_CONNECTION_OP:
386*29492bb7SDavid van Moolenbroek /*
387*29492bb7SDavid van Moolenbroek * Clear any previous connection. New connection is used for all
388*29492bb7SDavid van Moolenbroek * fields that follow, similar to AccessAs
389*29492bb7SDavid van Moolenbroek */
390*29492bb7SDavid van Moolenbroek Info->ResourceBuffer = NULL;
391*29492bb7SDavid van Moolenbroek Info->ConnectionNode = NULL;
392*29492bb7SDavid van Moolenbroek Info->PinNumberIndex = 0;
393*29492bb7SDavid van Moolenbroek
394*29492bb7SDavid van Moolenbroek /*
395*29492bb7SDavid van Moolenbroek * A Connection() is either an actual resource descriptor (buffer)
396*29492bb7SDavid van Moolenbroek * or a named reference to a resource template
397*29492bb7SDavid van Moolenbroek */
398*29492bb7SDavid van Moolenbroek Child = Arg->Common.Value.Arg;
399*29492bb7SDavid van Moolenbroek if (Child->Common.AmlOpcode == AML_INT_BYTELIST_OP)
400*29492bb7SDavid van Moolenbroek {
401*29492bb7SDavid van Moolenbroek Info->ResourceBuffer = Child->Named.Data;
402*29492bb7SDavid van Moolenbroek Info->ResourceLength = (UINT16) Child->Named.Value.Integer;
403*29492bb7SDavid van Moolenbroek }
404*29492bb7SDavid van Moolenbroek else
405*29492bb7SDavid van Moolenbroek {
406*29492bb7SDavid van Moolenbroek /* Lookup the Connection() namepath, it should already exist */
407*29492bb7SDavid van Moolenbroek
408*29492bb7SDavid van Moolenbroek Status = AcpiNsLookup (WalkState->ScopeInfo,
409*29492bb7SDavid van Moolenbroek Child->Common.Value.Name, ACPI_TYPE_ANY,
410*29492bb7SDavid van Moolenbroek ACPI_IMODE_EXECUTE, ACPI_NS_DONT_OPEN_SCOPE,
411*29492bb7SDavid van Moolenbroek WalkState, &Info->ConnectionNode);
412*29492bb7SDavid van Moolenbroek if (ACPI_FAILURE (Status))
413*29492bb7SDavid van Moolenbroek {
414*29492bb7SDavid van Moolenbroek ACPI_ERROR_NAMESPACE (Child->Common.Value.Name, Status);
415*29492bb7SDavid van Moolenbroek return_ACPI_STATUS (Status);
416*29492bb7SDavid van Moolenbroek }
417*29492bb7SDavid van Moolenbroek }
418*29492bb7SDavid van Moolenbroek break;
419433d6423SLionel Sambuc
420433d6423SLionel Sambuc case AML_INT_NAMEDFIELD_OP:
421433d6423SLionel Sambuc
422433d6423SLionel Sambuc /* Lookup the name, it should already exist */
423433d6423SLionel Sambuc
424433d6423SLionel Sambuc Status = AcpiNsLookup (WalkState->ScopeInfo,
425433d6423SLionel Sambuc (char *) &Arg->Named.Name, Info->FieldType,
426433d6423SLionel Sambuc ACPI_IMODE_EXECUTE, ACPI_NS_DONT_OPEN_SCOPE,
427433d6423SLionel Sambuc WalkState, &Info->FieldNode);
428433d6423SLionel Sambuc if (ACPI_FAILURE (Status))
429433d6423SLionel Sambuc {
430433d6423SLionel Sambuc ACPI_ERROR_NAMESPACE ((char *) &Arg->Named.Name, Status);
431433d6423SLionel Sambuc return_ACPI_STATUS (Status);
432433d6423SLionel Sambuc }
433433d6423SLionel Sambuc else
434433d6423SLionel Sambuc {
435433d6423SLionel Sambuc Arg->Common.Node = Info->FieldNode;
436433d6423SLionel Sambuc Info->FieldBitLength = Arg->Common.Value.Size;
437433d6423SLionel Sambuc
438433d6423SLionel Sambuc /*
439433d6423SLionel Sambuc * If there is no object attached to the node, this node was
440433d6423SLionel Sambuc * just created and we need to create the field object.
441433d6423SLionel Sambuc * Otherwise, this was a lookup of an existing node and we
442433d6423SLionel Sambuc * don't want to create the field object again.
443433d6423SLionel Sambuc */
444433d6423SLionel Sambuc if (!AcpiNsGetAttachedObject (Info->FieldNode))
445433d6423SLionel Sambuc {
446433d6423SLionel Sambuc Status = AcpiExPrepFieldValue (Info);
447433d6423SLionel Sambuc if (ACPI_FAILURE (Status))
448433d6423SLionel Sambuc {
449433d6423SLionel Sambuc return_ACPI_STATUS (Status);
450433d6423SLionel Sambuc }
451433d6423SLionel Sambuc }
452433d6423SLionel Sambuc }
453433d6423SLionel Sambuc
454433d6423SLionel Sambuc /* Keep track of bit position for the next field */
455433d6423SLionel Sambuc
456433d6423SLionel Sambuc Position = (UINT64) Info->FieldBitPosition
457433d6423SLionel Sambuc + (UINT64) Arg->Common.Value.Size;
458433d6423SLionel Sambuc
459433d6423SLionel Sambuc if (Position > ACPI_UINT32_MAX)
460433d6423SLionel Sambuc {
461433d6423SLionel Sambuc ACPI_ERROR ((AE_INFO,
462433d6423SLionel Sambuc "Field [%4.4s] bit offset too large (> 0xFFFFFFFF)",
463433d6423SLionel Sambuc ACPI_CAST_PTR (char, &Info->FieldNode->Name)));
464433d6423SLionel Sambuc return_ACPI_STATUS (AE_SUPPORT);
465433d6423SLionel Sambuc }
466433d6423SLionel Sambuc
467433d6423SLionel Sambuc Info->FieldBitPosition += Info->FieldBitLength;
468*29492bb7SDavid van Moolenbroek Info->PinNumberIndex++; /* Index relative to previous Connection() */
469433d6423SLionel Sambuc break;
470433d6423SLionel Sambuc
471433d6423SLionel Sambuc default:
472433d6423SLionel Sambuc
473433d6423SLionel Sambuc ACPI_ERROR ((AE_INFO,
474433d6423SLionel Sambuc "Invalid opcode in field list: 0x%X", Arg->Common.AmlOpcode));
475433d6423SLionel Sambuc return_ACPI_STATUS (AE_AML_BAD_OPCODE);
476433d6423SLionel Sambuc }
477433d6423SLionel Sambuc
478433d6423SLionel Sambuc Arg = Arg->Common.Next;
479433d6423SLionel Sambuc }
480433d6423SLionel Sambuc
481433d6423SLionel Sambuc return_ACPI_STATUS (AE_OK);
482433d6423SLionel Sambuc }
483433d6423SLionel Sambuc
484433d6423SLionel Sambuc
485433d6423SLionel Sambuc /*******************************************************************************
486433d6423SLionel Sambuc *
487433d6423SLionel Sambuc * FUNCTION: AcpiDsCreateField
488433d6423SLionel Sambuc *
489433d6423SLionel Sambuc * PARAMETERS: Op - Op containing the Field definition and args
490433d6423SLionel Sambuc * RegionNode - Object for the containing Operation Region
491433d6423SLionel Sambuc * ` WalkState - Current method state
492433d6423SLionel Sambuc *
493433d6423SLionel Sambuc * RETURN: Status
494433d6423SLionel Sambuc *
495433d6423SLionel Sambuc * DESCRIPTION: Create a new field in the specified operation region
496433d6423SLionel Sambuc *
497433d6423SLionel Sambuc ******************************************************************************/
498433d6423SLionel Sambuc
499433d6423SLionel Sambuc ACPI_STATUS
AcpiDsCreateField(ACPI_PARSE_OBJECT * Op,ACPI_NAMESPACE_NODE * RegionNode,ACPI_WALK_STATE * WalkState)500433d6423SLionel Sambuc AcpiDsCreateField (
501433d6423SLionel Sambuc ACPI_PARSE_OBJECT *Op,
502433d6423SLionel Sambuc ACPI_NAMESPACE_NODE *RegionNode,
503433d6423SLionel Sambuc ACPI_WALK_STATE *WalkState)
504433d6423SLionel Sambuc {
505433d6423SLionel Sambuc ACPI_STATUS Status;
506433d6423SLionel Sambuc ACPI_PARSE_OBJECT *Arg;
507433d6423SLionel Sambuc ACPI_CREATE_FIELD_INFO Info;
508433d6423SLionel Sambuc
509433d6423SLionel Sambuc
510433d6423SLionel Sambuc ACPI_FUNCTION_TRACE_PTR (DsCreateField, Op);
511433d6423SLionel Sambuc
512433d6423SLionel Sambuc
513433d6423SLionel Sambuc /* First arg is the name of the parent OpRegion (must already exist) */
514433d6423SLionel Sambuc
515433d6423SLionel Sambuc Arg = Op->Common.Value.Arg;
516*29492bb7SDavid van Moolenbroek
517433d6423SLionel Sambuc if (!RegionNode)
518433d6423SLionel Sambuc {
519433d6423SLionel Sambuc Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
520433d6423SLionel Sambuc ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
521433d6423SLionel Sambuc ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
522*29492bb7SDavid van Moolenbroek #ifdef ACPI_ASL_COMPILER
523*29492bb7SDavid van Moolenbroek Status = AcpiDsCreateExternalRegion (Status, Arg,
524*29492bb7SDavid van Moolenbroek Arg->Common.Value.Name, WalkState, &RegionNode);
525*29492bb7SDavid van Moolenbroek #endif
526433d6423SLionel Sambuc if (ACPI_FAILURE (Status))
527433d6423SLionel Sambuc {
528433d6423SLionel Sambuc ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);
529433d6423SLionel Sambuc return_ACPI_STATUS (Status);
530433d6423SLionel Sambuc }
531433d6423SLionel Sambuc }
532433d6423SLionel Sambuc
533*29492bb7SDavid van Moolenbroek ACPI_MEMSET (&Info, 0, sizeof (ACPI_CREATE_FIELD_INFO));
534*29492bb7SDavid van Moolenbroek
535433d6423SLionel Sambuc /* Second arg is the field flags */
536433d6423SLionel Sambuc
537433d6423SLionel Sambuc Arg = Arg->Common.Next;
538433d6423SLionel Sambuc Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;
539433d6423SLionel Sambuc Info.Attribute = 0;
540433d6423SLionel Sambuc
541433d6423SLionel Sambuc /* Each remaining arg is a Named Field */
542433d6423SLionel Sambuc
543433d6423SLionel Sambuc Info.FieldType = ACPI_TYPE_LOCAL_REGION_FIELD;
544433d6423SLionel Sambuc Info.RegionNode = RegionNode;
545433d6423SLionel Sambuc
546433d6423SLionel Sambuc Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);
547433d6423SLionel Sambuc return_ACPI_STATUS (Status);
548433d6423SLionel Sambuc }
549433d6423SLionel Sambuc
550433d6423SLionel Sambuc
551433d6423SLionel Sambuc /*******************************************************************************
552433d6423SLionel Sambuc *
553433d6423SLionel Sambuc * FUNCTION: AcpiDsInitFieldObjects
554433d6423SLionel Sambuc *
555433d6423SLionel Sambuc * PARAMETERS: Op - Op containing the Field definition and args
556433d6423SLionel Sambuc * ` WalkState - Current method state
557433d6423SLionel Sambuc *
558433d6423SLionel Sambuc * RETURN: Status
559433d6423SLionel Sambuc *
560433d6423SLionel Sambuc * DESCRIPTION: For each "Field Unit" name in the argument list that is
561433d6423SLionel Sambuc * part of the field declaration, enter the name into the
562433d6423SLionel Sambuc * namespace.
563433d6423SLionel Sambuc *
564433d6423SLionel Sambuc ******************************************************************************/
565433d6423SLionel Sambuc
566433d6423SLionel Sambuc ACPI_STATUS
AcpiDsInitFieldObjects(ACPI_PARSE_OBJECT * Op,ACPI_WALK_STATE * WalkState)567433d6423SLionel Sambuc AcpiDsInitFieldObjects (
568433d6423SLionel Sambuc ACPI_PARSE_OBJECT *Op,
569433d6423SLionel Sambuc ACPI_WALK_STATE *WalkState)
570433d6423SLionel Sambuc {
571433d6423SLionel Sambuc ACPI_STATUS Status;
572433d6423SLionel Sambuc ACPI_PARSE_OBJECT *Arg = NULL;
573433d6423SLionel Sambuc ACPI_NAMESPACE_NODE *Node;
574433d6423SLionel Sambuc UINT8 Type = 0;
575433d6423SLionel Sambuc UINT32 Flags;
576433d6423SLionel Sambuc
577433d6423SLionel Sambuc
578433d6423SLionel Sambuc ACPI_FUNCTION_TRACE_PTR (DsInitFieldObjects, Op);
579433d6423SLionel Sambuc
580433d6423SLionel Sambuc
581433d6423SLionel Sambuc /* Execute flag should always be set when this function is entered */
582433d6423SLionel Sambuc
583433d6423SLionel Sambuc if (!(WalkState->ParseFlags & ACPI_PARSE_EXECUTE))
584433d6423SLionel Sambuc {
585433d6423SLionel Sambuc if (WalkState->ParseFlags & ACPI_PARSE_DEFERRED_OP)
586433d6423SLionel Sambuc {
587433d6423SLionel Sambuc /* BankField Op is deferred, just return OK */
588433d6423SLionel Sambuc
589433d6423SLionel Sambuc return_ACPI_STATUS (AE_OK);
590433d6423SLionel Sambuc }
591433d6423SLionel Sambuc
592433d6423SLionel Sambuc return_ACPI_STATUS (AE_AML_INTERNAL);
593433d6423SLionel Sambuc }
594433d6423SLionel Sambuc
595433d6423SLionel Sambuc /*
596433d6423SLionel Sambuc * Get the FieldList argument for this opcode. This is the start of the
597433d6423SLionel Sambuc * list of field elements.
598433d6423SLionel Sambuc */
599433d6423SLionel Sambuc switch (WalkState->Opcode)
600433d6423SLionel Sambuc {
601433d6423SLionel Sambuc case AML_FIELD_OP:
602*29492bb7SDavid van Moolenbroek
603433d6423SLionel Sambuc Arg = AcpiPsGetArg (Op, 2);
604433d6423SLionel Sambuc Type = ACPI_TYPE_LOCAL_REGION_FIELD;
605433d6423SLionel Sambuc break;
606433d6423SLionel Sambuc
607433d6423SLionel Sambuc case AML_BANK_FIELD_OP:
608*29492bb7SDavid van Moolenbroek
609433d6423SLionel Sambuc Arg = AcpiPsGetArg (Op, 4);
610433d6423SLionel Sambuc Type = ACPI_TYPE_LOCAL_BANK_FIELD;
611433d6423SLionel Sambuc break;
612433d6423SLionel Sambuc
613433d6423SLionel Sambuc case AML_INDEX_FIELD_OP:
614*29492bb7SDavid van Moolenbroek
615433d6423SLionel Sambuc Arg = AcpiPsGetArg (Op, 3);
616433d6423SLionel Sambuc Type = ACPI_TYPE_LOCAL_INDEX_FIELD;
617433d6423SLionel Sambuc break;
618433d6423SLionel Sambuc
619433d6423SLionel Sambuc default:
620*29492bb7SDavid van Moolenbroek
621433d6423SLionel Sambuc return_ACPI_STATUS (AE_BAD_PARAMETER);
622433d6423SLionel Sambuc }
623433d6423SLionel Sambuc
624433d6423SLionel Sambuc /* Creating new namespace node(s), should not already exist */
625433d6423SLionel Sambuc
626433d6423SLionel Sambuc Flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
627433d6423SLionel Sambuc ACPI_NS_ERROR_IF_FOUND;
628433d6423SLionel Sambuc
629433d6423SLionel Sambuc /*
630433d6423SLionel Sambuc * Mark node(s) temporary if we are executing a normal control
631433d6423SLionel Sambuc * method. (Don't mark if this is a module-level code method)
632433d6423SLionel Sambuc */
633433d6423SLionel Sambuc if (WalkState->MethodNode &&
634433d6423SLionel Sambuc !(WalkState->ParseFlags & ACPI_PARSE_MODULE_LEVEL))
635433d6423SLionel Sambuc {
636433d6423SLionel Sambuc Flags |= ACPI_NS_TEMPORARY;
637433d6423SLionel Sambuc }
638433d6423SLionel Sambuc
639433d6423SLionel Sambuc /*
640433d6423SLionel Sambuc * Walk the list of entries in the FieldList
641433d6423SLionel Sambuc * Note: FieldList can be of zero length. In this case, Arg will be NULL.
642433d6423SLionel Sambuc */
643433d6423SLionel Sambuc while (Arg)
644433d6423SLionel Sambuc {
645433d6423SLionel Sambuc /*
646*29492bb7SDavid van Moolenbroek * Ignore OFFSET/ACCESSAS/CONNECTION terms here; we are only interested
647*29492bb7SDavid van Moolenbroek * in the field names in order to enter them into the namespace.
648433d6423SLionel Sambuc */
649433d6423SLionel Sambuc if (Arg->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
650433d6423SLionel Sambuc {
651433d6423SLionel Sambuc Status = AcpiNsLookup (WalkState->ScopeInfo,
652433d6423SLionel Sambuc (char *) &Arg->Named.Name, Type, ACPI_IMODE_LOAD_PASS1,
653433d6423SLionel Sambuc Flags, WalkState, &Node);
654433d6423SLionel Sambuc if (ACPI_FAILURE (Status))
655433d6423SLionel Sambuc {
656433d6423SLionel Sambuc ACPI_ERROR_NAMESPACE ((char *) &Arg->Named.Name, Status);
657433d6423SLionel Sambuc if (Status != AE_ALREADY_EXISTS)
658433d6423SLionel Sambuc {
659433d6423SLionel Sambuc return_ACPI_STATUS (Status);
660433d6423SLionel Sambuc }
661433d6423SLionel Sambuc
662433d6423SLionel Sambuc /* Name already exists, just ignore this error */
663433d6423SLionel Sambuc
664433d6423SLionel Sambuc Status = AE_OK;
665433d6423SLionel Sambuc }
666433d6423SLionel Sambuc
667433d6423SLionel Sambuc Arg->Common.Node = Node;
668433d6423SLionel Sambuc }
669433d6423SLionel Sambuc
670433d6423SLionel Sambuc /* Get the next field element in the list */
671433d6423SLionel Sambuc
672433d6423SLionel Sambuc Arg = Arg->Common.Next;
673433d6423SLionel Sambuc }
674433d6423SLionel Sambuc
675433d6423SLionel Sambuc return_ACPI_STATUS (AE_OK);
676433d6423SLionel Sambuc }
677433d6423SLionel Sambuc
678433d6423SLionel Sambuc
679433d6423SLionel Sambuc /*******************************************************************************
680433d6423SLionel Sambuc *
681433d6423SLionel Sambuc * FUNCTION: AcpiDsCreateBankField
682433d6423SLionel Sambuc *
683433d6423SLionel Sambuc * PARAMETERS: Op - Op containing the Field definition and args
684433d6423SLionel Sambuc * RegionNode - Object for the containing Operation Region
685433d6423SLionel Sambuc * WalkState - Current method state
686433d6423SLionel Sambuc *
687433d6423SLionel Sambuc * RETURN: Status
688433d6423SLionel Sambuc *
689433d6423SLionel Sambuc * DESCRIPTION: Create a new bank field in the specified operation region
690433d6423SLionel Sambuc *
691433d6423SLionel Sambuc ******************************************************************************/
692433d6423SLionel Sambuc
693433d6423SLionel Sambuc ACPI_STATUS
AcpiDsCreateBankField(ACPI_PARSE_OBJECT * Op,ACPI_NAMESPACE_NODE * RegionNode,ACPI_WALK_STATE * WalkState)694433d6423SLionel Sambuc AcpiDsCreateBankField (
695433d6423SLionel Sambuc ACPI_PARSE_OBJECT *Op,
696433d6423SLionel Sambuc ACPI_NAMESPACE_NODE *RegionNode,
697433d6423SLionel Sambuc ACPI_WALK_STATE *WalkState)
698433d6423SLionel Sambuc {
699433d6423SLionel Sambuc ACPI_STATUS Status;
700433d6423SLionel Sambuc ACPI_PARSE_OBJECT *Arg;
701433d6423SLionel Sambuc ACPI_CREATE_FIELD_INFO Info;
702433d6423SLionel Sambuc
703433d6423SLionel Sambuc
704433d6423SLionel Sambuc ACPI_FUNCTION_TRACE_PTR (DsCreateBankField, Op);
705433d6423SLionel Sambuc
706433d6423SLionel Sambuc
707433d6423SLionel Sambuc /* First arg is the name of the parent OpRegion (must already exist) */
708433d6423SLionel Sambuc
709433d6423SLionel Sambuc Arg = Op->Common.Value.Arg;
710433d6423SLionel Sambuc if (!RegionNode)
711433d6423SLionel Sambuc {
712433d6423SLionel Sambuc Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
713433d6423SLionel Sambuc ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
714433d6423SLionel Sambuc ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
715*29492bb7SDavid van Moolenbroek #ifdef ACPI_ASL_COMPILER
716*29492bb7SDavid van Moolenbroek Status = AcpiDsCreateExternalRegion (Status, Arg,
717*29492bb7SDavid van Moolenbroek Arg->Common.Value.Name, WalkState, &RegionNode);
718*29492bb7SDavid van Moolenbroek #endif
719433d6423SLionel Sambuc if (ACPI_FAILURE (Status))
720433d6423SLionel Sambuc {
721433d6423SLionel Sambuc ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);
722433d6423SLionel Sambuc return_ACPI_STATUS (Status);
723433d6423SLionel Sambuc }
724433d6423SLionel Sambuc }
725433d6423SLionel Sambuc
726433d6423SLionel Sambuc /* Second arg is the Bank Register (Field) (must already exist) */
727433d6423SLionel Sambuc
728433d6423SLionel Sambuc Arg = Arg->Common.Next;
729433d6423SLionel Sambuc Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
730433d6423SLionel Sambuc ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
731433d6423SLionel Sambuc ACPI_NS_SEARCH_PARENT, WalkState, &Info.RegisterNode);
732433d6423SLionel Sambuc if (ACPI_FAILURE (Status))
733433d6423SLionel Sambuc {
734433d6423SLionel Sambuc ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
735433d6423SLionel Sambuc return_ACPI_STATUS (Status);
736433d6423SLionel Sambuc }
737433d6423SLionel Sambuc
738433d6423SLionel Sambuc /*
739433d6423SLionel Sambuc * Third arg is the BankValue
740433d6423SLionel Sambuc * This arg is a TermArg, not a constant
741433d6423SLionel Sambuc * It will be evaluated later, by AcpiDsEvalBankFieldOperands
742433d6423SLionel Sambuc */
743433d6423SLionel Sambuc Arg = Arg->Common.Next;
744433d6423SLionel Sambuc
745433d6423SLionel Sambuc /* Fourth arg is the field flags */
746433d6423SLionel Sambuc
747433d6423SLionel Sambuc Arg = Arg->Common.Next;
748433d6423SLionel Sambuc Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;
749433d6423SLionel Sambuc
750433d6423SLionel Sambuc /* Each remaining arg is a Named Field */
751433d6423SLionel Sambuc
752433d6423SLionel Sambuc Info.FieldType = ACPI_TYPE_LOCAL_BANK_FIELD;
753433d6423SLionel Sambuc Info.RegionNode = RegionNode;
754433d6423SLionel Sambuc
755433d6423SLionel Sambuc /*
756433d6423SLionel Sambuc * Use Info.DataRegisterNode to store BankField Op
757433d6423SLionel Sambuc * It's safe because DataRegisterNode will never be used when create bank field
758433d6423SLionel Sambuc * We store AmlStart and AmlLength in the BankField Op for late evaluation
759433d6423SLionel Sambuc * Used in AcpiExPrepFieldValue(Info)
760433d6423SLionel Sambuc *
761433d6423SLionel Sambuc * TBD: Or, should we add a field in ACPI_CREATE_FIELD_INFO, like "void *ParentOp"?
762433d6423SLionel Sambuc */
763433d6423SLionel Sambuc Info.DataRegisterNode = (ACPI_NAMESPACE_NODE*) Op;
764433d6423SLionel Sambuc
765433d6423SLionel Sambuc Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);
766433d6423SLionel Sambuc return_ACPI_STATUS (Status);
767433d6423SLionel Sambuc }
768433d6423SLionel Sambuc
769433d6423SLionel Sambuc
770433d6423SLionel Sambuc /*******************************************************************************
771433d6423SLionel Sambuc *
772433d6423SLionel Sambuc * FUNCTION: AcpiDsCreateIndexField
773433d6423SLionel Sambuc *
774433d6423SLionel Sambuc * PARAMETERS: Op - Op containing the Field definition and args
775433d6423SLionel Sambuc * RegionNode - Object for the containing Operation Region
776433d6423SLionel Sambuc * ` WalkState - Current method state
777433d6423SLionel Sambuc *
778433d6423SLionel Sambuc * RETURN: Status
779433d6423SLionel Sambuc *
780433d6423SLionel Sambuc * DESCRIPTION: Create a new index field in the specified operation region
781433d6423SLionel Sambuc *
782433d6423SLionel Sambuc ******************************************************************************/
783433d6423SLionel Sambuc
784433d6423SLionel Sambuc ACPI_STATUS
AcpiDsCreateIndexField(ACPI_PARSE_OBJECT * Op,ACPI_NAMESPACE_NODE * RegionNode,ACPI_WALK_STATE * WalkState)785433d6423SLionel Sambuc AcpiDsCreateIndexField (
786433d6423SLionel Sambuc ACPI_PARSE_OBJECT *Op,
787433d6423SLionel Sambuc ACPI_NAMESPACE_NODE *RegionNode,
788433d6423SLionel Sambuc ACPI_WALK_STATE *WalkState)
789433d6423SLionel Sambuc {
790433d6423SLionel Sambuc ACPI_STATUS Status;
791433d6423SLionel Sambuc ACPI_PARSE_OBJECT *Arg;
792433d6423SLionel Sambuc ACPI_CREATE_FIELD_INFO Info;
793433d6423SLionel Sambuc
794433d6423SLionel Sambuc
795433d6423SLionel Sambuc ACPI_FUNCTION_TRACE_PTR (DsCreateIndexField, Op);
796433d6423SLionel Sambuc
797433d6423SLionel Sambuc
798433d6423SLionel Sambuc /* First arg is the name of the Index register (must already exist) */
799433d6423SLionel Sambuc
800433d6423SLionel Sambuc Arg = Op->Common.Value.Arg;
801433d6423SLionel Sambuc Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
802433d6423SLionel Sambuc ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
803433d6423SLionel Sambuc ACPI_NS_SEARCH_PARENT, WalkState, &Info.RegisterNode);
804433d6423SLionel Sambuc if (ACPI_FAILURE (Status))
805433d6423SLionel Sambuc {
806433d6423SLionel Sambuc ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
807433d6423SLionel Sambuc return_ACPI_STATUS (Status);
808433d6423SLionel Sambuc }
809433d6423SLionel Sambuc
810433d6423SLionel Sambuc /* Second arg is the data register (must already exist) */
811433d6423SLionel Sambuc
812433d6423SLionel Sambuc Arg = Arg->Common.Next;
813433d6423SLionel Sambuc Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
814433d6423SLionel Sambuc ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
815433d6423SLionel Sambuc ACPI_NS_SEARCH_PARENT, WalkState, &Info.DataRegisterNode);
816433d6423SLionel Sambuc if (ACPI_FAILURE (Status))
817433d6423SLionel Sambuc {
818433d6423SLionel Sambuc ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
819433d6423SLionel Sambuc return_ACPI_STATUS (Status);
820433d6423SLionel Sambuc }
821433d6423SLionel Sambuc
822433d6423SLionel Sambuc /* Next arg is the field flags */
823433d6423SLionel Sambuc
824433d6423SLionel Sambuc Arg = Arg->Common.Next;
825433d6423SLionel Sambuc Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;
826433d6423SLionel Sambuc
827433d6423SLionel Sambuc /* Each remaining arg is a Named Field */
828433d6423SLionel Sambuc
829433d6423SLionel Sambuc Info.FieldType = ACPI_TYPE_LOCAL_INDEX_FIELD;
830433d6423SLionel Sambuc Info.RegionNode = RegionNode;
831433d6423SLionel Sambuc
832433d6423SLionel Sambuc Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);
833433d6423SLionel Sambuc return_ACPI_STATUS (Status);
834433d6423SLionel Sambuc }
835