xref: /onnv-gate/usr/src/uts/intel/io/acpica/dispatcher/dsobject.c (revision 7851:e828bbb1689c)
1*7851SDana.Myers@Sun.COM /******************************************************************************
2*7851SDana.Myers@Sun.COM  *
3*7851SDana.Myers@Sun.COM  * Module Name: dsobject - Dispatcher object management routines
4*7851SDana.Myers@Sun.COM  *              $Revision: 1.140 $
5*7851SDana.Myers@Sun.COM  *
6*7851SDana.Myers@Sun.COM  *****************************************************************************/
7*7851SDana.Myers@Sun.COM 
8*7851SDana.Myers@Sun.COM /******************************************************************************
9*7851SDana.Myers@Sun.COM  *
10*7851SDana.Myers@Sun.COM  * 1. Copyright Notice
11*7851SDana.Myers@Sun.COM  *
12*7851SDana.Myers@Sun.COM  * Some or all of this work - Copyright (c) 1999 - 2008, Intel Corp.
13*7851SDana.Myers@Sun.COM  * All rights reserved.
14*7851SDana.Myers@Sun.COM  *
15*7851SDana.Myers@Sun.COM  * 2. License
16*7851SDana.Myers@Sun.COM  *
17*7851SDana.Myers@Sun.COM  * 2.1. This is your license from Intel Corp. under its intellectual property
18*7851SDana.Myers@Sun.COM  * rights.  You may have additional license terms from the party that provided
19*7851SDana.Myers@Sun.COM  * you this software, covering your right to use that party's intellectual
20*7851SDana.Myers@Sun.COM  * property rights.
21*7851SDana.Myers@Sun.COM  *
22*7851SDana.Myers@Sun.COM  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23*7851SDana.Myers@Sun.COM  * copy of the source code appearing in this file ("Covered Code") an
24*7851SDana.Myers@Sun.COM  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25*7851SDana.Myers@Sun.COM  * base code distributed originally by Intel ("Original Intel Code") to copy,
26*7851SDana.Myers@Sun.COM  * make derivatives, distribute, use and display any portion of the Covered
27*7851SDana.Myers@Sun.COM  * Code in any form, with the right to sublicense such rights; and
28*7851SDana.Myers@Sun.COM  *
29*7851SDana.Myers@Sun.COM  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30*7851SDana.Myers@Sun.COM  * license (with the right to sublicense), under only those claims of Intel
31*7851SDana.Myers@Sun.COM  * patents that are infringed by the Original Intel Code, to make, use, sell,
32*7851SDana.Myers@Sun.COM  * offer to sell, and import the Covered Code and derivative works thereof
33*7851SDana.Myers@Sun.COM  * solely to the minimum extent necessary to exercise the above copyright
34*7851SDana.Myers@Sun.COM  * license, and in no event shall the patent license extend to any additions
35*7851SDana.Myers@Sun.COM  * to or modifications of the Original Intel Code.  No other license or right
36*7851SDana.Myers@Sun.COM  * is granted directly or by implication, estoppel or otherwise;
37*7851SDana.Myers@Sun.COM  *
38*7851SDana.Myers@Sun.COM  * The above copyright and patent license is granted only if the following
39*7851SDana.Myers@Sun.COM  * conditions are met:
40*7851SDana.Myers@Sun.COM  *
41*7851SDana.Myers@Sun.COM  * 3. Conditions
42*7851SDana.Myers@Sun.COM  *
43*7851SDana.Myers@Sun.COM  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44*7851SDana.Myers@Sun.COM  * Redistribution of source code of any substantial portion of the Covered
45*7851SDana.Myers@Sun.COM  * Code or modification with rights to further distribute source must include
46*7851SDana.Myers@Sun.COM  * the above Copyright Notice, the above License, this list of Conditions,
47*7851SDana.Myers@Sun.COM  * and the following Disclaimer and Export Compliance provision.  In addition,
48*7851SDana.Myers@Sun.COM  * Licensee must cause all Covered Code to which Licensee contributes to
49*7851SDana.Myers@Sun.COM  * contain a file documenting the changes Licensee made to create that Covered
50*7851SDana.Myers@Sun.COM  * Code and the date of any change.  Licensee must include in that file the
51*7851SDana.Myers@Sun.COM  * documentation of any changes made by any predecessor Licensee.  Licensee
52*7851SDana.Myers@Sun.COM  * must include a prominent statement that the modification is derived,
53*7851SDana.Myers@Sun.COM  * directly or indirectly, from Original Intel Code.
54*7851SDana.Myers@Sun.COM  *
55*7851SDana.Myers@Sun.COM  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56*7851SDana.Myers@Sun.COM  * Redistribution of source code of any substantial portion of the Covered
57*7851SDana.Myers@Sun.COM  * Code or modification without rights to further distribute source must
58*7851SDana.Myers@Sun.COM  * include the following Disclaimer and Export Compliance provision in the
59*7851SDana.Myers@Sun.COM  * documentation and/or other materials provided with distribution.  In
60*7851SDana.Myers@Sun.COM  * addition, Licensee may not authorize further sublicense of source of any
61*7851SDana.Myers@Sun.COM  * portion of the Covered Code, and must include terms to the effect that the
62*7851SDana.Myers@Sun.COM  * license from Licensee to its licensee is limited to the intellectual
63*7851SDana.Myers@Sun.COM  * property embodied in the software Licensee provides to its licensee, and
64*7851SDana.Myers@Sun.COM  * not to intellectual property embodied in modifications its licensee may
65*7851SDana.Myers@Sun.COM  * make.
66*7851SDana.Myers@Sun.COM  *
67*7851SDana.Myers@Sun.COM  * 3.3. Redistribution of Executable. Redistribution in executable form of any
68*7851SDana.Myers@Sun.COM  * substantial portion of the Covered Code or modification must reproduce the
69*7851SDana.Myers@Sun.COM  * above Copyright Notice, and the following Disclaimer and Export Compliance
70*7851SDana.Myers@Sun.COM  * provision in the documentation and/or other materials provided with the
71*7851SDana.Myers@Sun.COM  * distribution.
72*7851SDana.Myers@Sun.COM  *
73*7851SDana.Myers@Sun.COM  * 3.4. Intel retains all right, title, and interest in and to the Original
74*7851SDana.Myers@Sun.COM  * Intel Code.
75*7851SDana.Myers@Sun.COM  *
76*7851SDana.Myers@Sun.COM  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77*7851SDana.Myers@Sun.COM  * Intel shall be used in advertising or otherwise to promote the sale, use or
78*7851SDana.Myers@Sun.COM  * other dealings in products derived from or relating to the Covered Code
79*7851SDana.Myers@Sun.COM  * without prior written authorization from Intel.
80*7851SDana.Myers@Sun.COM  *
81*7851SDana.Myers@Sun.COM  * 4. Disclaimer and Export Compliance
82*7851SDana.Myers@Sun.COM  *
83*7851SDana.Myers@Sun.COM  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84*7851SDana.Myers@Sun.COM  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85*7851SDana.Myers@Sun.COM  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
86*7851SDana.Myers@Sun.COM  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
87*7851SDana.Myers@Sun.COM  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88*7851SDana.Myers@Sun.COM  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89*7851SDana.Myers@Sun.COM  * PARTICULAR PURPOSE.
90*7851SDana.Myers@Sun.COM  *
91*7851SDana.Myers@Sun.COM  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92*7851SDana.Myers@Sun.COM  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93*7851SDana.Myers@Sun.COM  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94*7851SDana.Myers@Sun.COM  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95*7851SDana.Myers@Sun.COM  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96*7851SDana.Myers@Sun.COM  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97*7851SDana.Myers@Sun.COM  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98*7851SDana.Myers@Sun.COM  * LIMITED REMEDY.
99*7851SDana.Myers@Sun.COM  *
100*7851SDana.Myers@Sun.COM  * 4.3. Licensee shall not export, either directly or indirectly, any of this
101*7851SDana.Myers@Sun.COM  * software or system incorporating such software without first obtaining any
102*7851SDana.Myers@Sun.COM  * required license or other approval from the U. S. Department of Commerce or
103*7851SDana.Myers@Sun.COM  * any other agency or department of the United States Government.  In the
104*7851SDana.Myers@Sun.COM  * event Licensee exports any such software from the United States or
105*7851SDana.Myers@Sun.COM  * re-exports any such software from a foreign destination, Licensee shall
106*7851SDana.Myers@Sun.COM  * ensure that the distribution and export/re-export of the software is in
107*7851SDana.Myers@Sun.COM  * compliance with all laws, regulations, orders, or other restrictions of the
108*7851SDana.Myers@Sun.COM  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109*7851SDana.Myers@Sun.COM  * any of its subsidiaries will export/re-export any technical data, process,
110*7851SDana.Myers@Sun.COM  * software, or service, directly or indirectly, to any country for which the
111*7851SDana.Myers@Sun.COM  * United States government or any agency thereof requires an export license,
112*7851SDana.Myers@Sun.COM  * other governmental approval, or letter of assurance, without first obtaining
113*7851SDana.Myers@Sun.COM  * such license, approval or letter.
114*7851SDana.Myers@Sun.COM  *
115*7851SDana.Myers@Sun.COM  *****************************************************************************/
116*7851SDana.Myers@Sun.COM 
117*7851SDana.Myers@Sun.COM #define __DSOBJECT_C__
118*7851SDana.Myers@Sun.COM 
119*7851SDana.Myers@Sun.COM #include "acpi.h"
120*7851SDana.Myers@Sun.COM #include "acparser.h"
121*7851SDana.Myers@Sun.COM #include "amlcode.h"
122*7851SDana.Myers@Sun.COM #include "acdispat.h"
123*7851SDana.Myers@Sun.COM #include "acnamesp.h"
124*7851SDana.Myers@Sun.COM #include "acinterp.h"
125*7851SDana.Myers@Sun.COM 
126*7851SDana.Myers@Sun.COM #define _COMPONENT          ACPI_DISPATCHER
127*7851SDana.Myers@Sun.COM         ACPI_MODULE_NAME    ("dsobject")
128*7851SDana.Myers@Sun.COM 
129*7851SDana.Myers@Sun.COM /* Local prototypes */
130*7851SDana.Myers@Sun.COM 
131*7851SDana.Myers@Sun.COM static ACPI_STATUS
132*7851SDana.Myers@Sun.COM AcpiDsBuildInternalObject (
133*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
134*7851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op,
135*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **ObjDescPtr);
136*7851SDana.Myers@Sun.COM 
137*7851SDana.Myers@Sun.COM 
138*7851SDana.Myers@Sun.COM #ifndef ACPI_NO_METHOD_EXECUTION
139*7851SDana.Myers@Sun.COM /*******************************************************************************
140*7851SDana.Myers@Sun.COM  *
141*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsBuildInternalObject
142*7851SDana.Myers@Sun.COM  *
143*7851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState       - Current walk state
144*7851SDana.Myers@Sun.COM  *              Op              - Parser object to be translated
145*7851SDana.Myers@Sun.COM  *              ObjDescPtr      - Where the ACPI internal object is returned
146*7851SDana.Myers@Sun.COM  *
147*7851SDana.Myers@Sun.COM  * RETURN:      Status
148*7851SDana.Myers@Sun.COM  *
149*7851SDana.Myers@Sun.COM  * DESCRIPTION: Translate a parser Op object to the equivalent namespace object
150*7851SDana.Myers@Sun.COM  *              Simple objects are any objects other than a package object!
151*7851SDana.Myers@Sun.COM  *
152*7851SDana.Myers@Sun.COM  ******************************************************************************/
153*7851SDana.Myers@Sun.COM 
154*7851SDana.Myers@Sun.COM static ACPI_STATUS
155*7851SDana.Myers@Sun.COM AcpiDsBuildInternalObject (
156*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
157*7851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op,
158*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **ObjDescPtr)
159*7851SDana.Myers@Sun.COM {
160*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc;
161*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
162*7851SDana.Myers@Sun.COM 
163*7851SDana.Myers@Sun.COM 
164*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsBuildInternalObject);
165*7851SDana.Myers@Sun.COM 
166*7851SDana.Myers@Sun.COM 
167*7851SDana.Myers@Sun.COM     *ObjDescPtr = NULL;
168*7851SDana.Myers@Sun.COM     if (Op->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
169*7851SDana.Myers@Sun.COM     {
170*7851SDana.Myers@Sun.COM         /*
171*7851SDana.Myers@Sun.COM          * This is a named object reference. If this name was
172*7851SDana.Myers@Sun.COM          * previously looked up in the namespace, it was stored in this op.
173*7851SDana.Myers@Sun.COM          * Otherwise, go ahead and look it up now
174*7851SDana.Myers@Sun.COM          */
175*7851SDana.Myers@Sun.COM         if (!Op->Common.Node)
176*7851SDana.Myers@Sun.COM         {
177*7851SDana.Myers@Sun.COM             Status = AcpiNsLookup (WalkState->ScopeInfo,
178*7851SDana.Myers@Sun.COM                         Op->Common.Value.String,
179*7851SDana.Myers@Sun.COM                         ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
180*7851SDana.Myers@Sun.COM                         ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL,
181*7851SDana.Myers@Sun.COM                         ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &(Op->Common.Node)));
182*7851SDana.Myers@Sun.COM             if (ACPI_FAILURE (Status))
183*7851SDana.Myers@Sun.COM             {
184*7851SDana.Myers@Sun.COM                 /* Check if we are resolving a named reference within a package */
185*7851SDana.Myers@Sun.COM 
186*7851SDana.Myers@Sun.COM                 if ((Status == AE_NOT_FOUND) && (AcpiGbl_EnableInterpreterSlack) &&
187*7851SDana.Myers@Sun.COM 
188*7851SDana.Myers@Sun.COM                     ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
189*7851SDana.Myers@Sun.COM                      (Op->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP)))
190*7851SDana.Myers@Sun.COM                 {
191*7851SDana.Myers@Sun.COM                     /*
192*7851SDana.Myers@Sun.COM                      * We didn't find the target and we are populating elements
193*7851SDana.Myers@Sun.COM                      * of a package - ignore if slack enabled. Some ASL code
194*7851SDana.Myers@Sun.COM                      * contains dangling invalid references in packages and
195*7851SDana.Myers@Sun.COM                      * expects that no exception will be issued. Leave the
196*7851SDana.Myers@Sun.COM                      * element as a null element. It cannot be used, but it
197*7851SDana.Myers@Sun.COM                      * can be overwritten by subsequent ASL code - this is
198*7851SDana.Myers@Sun.COM                      * typically the case.
199*7851SDana.Myers@Sun.COM                      */
200*7851SDana.Myers@Sun.COM                     ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
201*7851SDana.Myers@Sun.COM                         "Ignoring unresolved reference in package [%4.4s]\n",
202*7851SDana.Myers@Sun.COM                         WalkState->ScopeInfo->Scope.Node->Name.Ascii));
203*7851SDana.Myers@Sun.COM 
204*7851SDana.Myers@Sun.COM                     return_ACPI_STATUS (AE_OK);
205*7851SDana.Myers@Sun.COM                 }
206*7851SDana.Myers@Sun.COM                 else
207*7851SDana.Myers@Sun.COM                 {
208*7851SDana.Myers@Sun.COM                     ACPI_ERROR_NAMESPACE (Op->Common.Value.String, Status);
209*7851SDana.Myers@Sun.COM                 }
210*7851SDana.Myers@Sun.COM 
211*7851SDana.Myers@Sun.COM                 return_ACPI_STATUS (Status);
212*7851SDana.Myers@Sun.COM             }
213*7851SDana.Myers@Sun.COM         }
214*7851SDana.Myers@Sun.COM 
215*7851SDana.Myers@Sun.COM         /* Special object resolution for elements of a package */
216*7851SDana.Myers@Sun.COM 
217*7851SDana.Myers@Sun.COM         if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
218*7851SDana.Myers@Sun.COM             (Op->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP))
219*7851SDana.Myers@Sun.COM         {
220*7851SDana.Myers@Sun.COM             /*
221*7851SDana.Myers@Sun.COM              * Attempt to resolve the node to a value before we insert it into
222*7851SDana.Myers@Sun.COM              * the package. If this is a reference to a common data type,
223*7851SDana.Myers@Sun.COM              * resolve it immediately. According to the ACPI spec, package
224*7851SDana.Myers@Sun.COM              * elements can only be "data objects" or method references.
225*7851SDana.Myers@Sun.COM              * Attempt to resolve to an Integer, Buffer, String or Package.
226*7851SDana.Myers@Sun.COM              * If cannot, return the named reference (for things like Devices,
227*7851SDana.Myers@Sun.COM              * Methods, etc.) Buffer Fields and Fields will resolve to simple
228*7851SDana.Myers@Sun.COM              * objects (int/buf/str/pkg).
229*7851SDana.Myers@Sun.COM              *
230*7851SDana.Myers@Sun.COM              * NOTE: References to things like Devices, Methods, Mutexes, etc.
231*7851SDana.Myers@Sun.COM              * will remain as named references. This behavior is not described
232*7851SDana.Myers@Sun.COM              * in the ACPI spec, but it appears to be an oversight.
233*7851SDana.Myers@Sun.COM              */
234*7851SDana.Myers@Sun.COM             ObjDesc = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Op->Common.Node);
235*7851SDana.Myers@Sun.COM 
236*7851SDana.Myers@Sun.COM             Status = AcpiExResolveNodeToValue (
237*7851SDana.Myers@Sun.COM                         ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &ObjDesc),
238*7851SDana.Myers@Sun.COM                         WalkState);
239*7851SDana.Myers@Sun.COM             if (ACPI_FAILURE (Status))
240*7851SDana.Myers@Sun.COM             {
241*7851SDana.Myers@Sun.COM                 return_ACPI_STATUS (Status);
242*7851SDana.Myers@Sun.COM             }
243*7851SDana.Myers@Sun.COM 
244*7851SDana.Myers@Sun.COM             switch (Op->Common.Node->Type)
245*7851SDana.Myers@Sun.COM             {
246*7851SDana.Myers@Sun.COM             /*
247*7851SDana.Myers@Sun.COM              * For these types, we need the actual node, not the subobject.
248*7851SDana.Myers@Sun.COM              * However, the subobject did not get an extra reference count above.
249*7851SDana.Myers@Sun.COM              *
250*7851SDana.Myers@Sun.COM              * TBD: should ExResolveNodeToValue be changed to fix this?
251*7851SDana.Myers@Sun.COM              */
252*7851SDana.Myers@Sun.COM             case ACPI_TYPE_DEVICE:
253*7851SDana.Myers@Sun.COM             case ACPI_TYPE_THERMAL:
254*7851SDana.Myers@Sun.COM 
255*7851SDana.Myers@Sun.COM                 AcpiUtAddReference (Op->Common.Node->Object);
256*7851SDana.Myers@Sun.COM 
257*7851SDana.Myers@Sun.COM                 /*lint -fallthrough */
258*7851SDana.Myers@Sun.COM             /*
259*7851SDana.Myers@Sun.COM              * For these types, we need the actual node, not the subobject.
260*7851SDana.Myers@Sun.COM              * The subobject got an extra reference count in ExResolveNodeToValue.
261*7851SDana.Myers@Sun.COM              */
262*7851SDana.Myers@Sun.COM             case ACPI_TYPE_MUTEX:
263*7851SDana.Myers@Sun.COM             case ACPI_TYPE_METHOD:
264*7851SDana.Myers@Sun.COM             case ACPI_TYPE_POWER:
265*7851SDana.Myers@Sun.COM             case ACPI_TYPE_PROCESSOR:
266*7851SDana.Myers@Sun.COM             case ACPI_TYPE_EVENT:
267*7851SDana.Myers@Sun.COM             case ACPI_TYPE_REGION:
268*7851SDana.Myers@Sun.COM 
269*7851SDana.Myers@Sun.COM                 /* We will create a reference object for these types below */
270*7851SDana.Myers@Sun.COM                 break;
271*7851SDana.Myers@Sun.COM 
272*7851SDana.Myers@Sun.COM             default:
273*7851SDana.Myers@Sun.COM                 /*
274*7851SDana.Myers@Sun.COM                  * All other types - the node was resolved to an actual
275*7851SDana.Myers@Sun.COM                  * object, we are done.
276*7851SDana.Myers@Sun.COM                  */
277*7851SDana.Myers@Sun.COM                 goto Exit;
278*7851SDana.Myers@Sun.COM             }
279*7851SDana.Myers@Sun.COM         }
280*7851SDana.Myers@Sun.COM     }
281*7851SDana.Myers@Sun.COM 
282*7851SDana.Myers@Sun.COM     /* Create and init a new internal ACPI object */
283*7851SDana.Myers@Sun.COM 
284*7851SDana.Myers@Sun.COM     ObjDesc = AcpiUtCreateInternalObject (
285*7851SDana.Myers@Sun.COM                 (AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode))->ObjectType);
286*7851SDana.Myers@Sun.COM     if (!ObjDesc)
287*7851SDana.Myers@Sun.COM     {
288*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_NO_MEMORY);
289*7851SDana.Myers@Sun.COM     }
290*7851SDana.Myers@Sun.COM 
291*7851SDana.Myers@Sun.COM     Status = AcpiDsInitObjectFromOp (WalkState, Op, Op->Common.AmlOpcode,
292*7851SDana.Myers@Sun.COM                 &ObjDesc);
293*7851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
294*7851SDana.Myers@Sun.COM     {
295*7851SDana.Myers@Sun.COM         AcpiUtRemoveReference (ObjDesc);
296*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
297*7851SDana.Myers@Sun.COM     }
298*7851SDana.Myers@Sun.COM 
299*7851SDana.Myers@Sun.COM Exit:
300*7851SDana.Myers@Sun.COM     *ObjDescPtr = ObjDesc;
301*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
302*7851SDana.Myers@Sun.COM }
303*7851SDana.Myers@Sun.COM 
304*7851SDana.Myers@Sun.COM 
305*7851SDana.Myers@Sun.COM /*******************************************************************************
306*7851SDana.Myers@Sun.COM  *
307*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsBuildInternalBufferObj
308*7851SDana.Myers@Sun.COM  *
309*7851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState       - Current walk state
310*7851SDana.Myers@Sun.COM  *              Op              - Parser object to be translated
311*7851SDana.Myers@Sun.COM  *              BufferLength    - Length of the buffer
312*7851SDana.Myers@Sun.COM  *              ObjDescPtr      - Where the ACPI internal object is returned
313*7851SDana.Myers@Sun.COM  *
314*7851SDana.Myers@Sun.COM  * RETURN:      Status
315*7851SDana.Myers@Sun.COM  *
316*7851SDana.Myers@Sun.COM  * DESCRIPTION: Translate a parser Op package object to the equivalent
317*7851SDana.Myers@Sun.COM  *              namespace object
318*7851SDana.Myers@Sun.COM  *
319*7851SDana.Myers@Sun.COM  ******************************************************************************/
320*7851SDana.Myers@Sun.COM 
321*7851SDana.Myers@Sun.COM ACPI_STATUS
322*7851SDana.Myers@Sun.COM AcpiDsBuildInternalBufferObj (
323*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
324*7851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op,
325*7851SDana.Myers@Sun.COM     UINT32                  BufferLength,
326*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **ObjDescPtr)
327*7851SDana.Myers@Sun.COM {
328*7851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Arg;
329*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc;
330*7851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *ByteList;
331*7851SDana.Myers@Sun.COM     UINT32                  ByteListLength = 0;
332*7851SDana.Myers@Sun.COM 
333*7851SDana.Myers@Sun.COM 
334*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsBuildInternalBufferObj);
335*7851SDana.Myers@Sun.COM 
336*7851SDana.Myers@Sun.COM 
337*7851SDana.Myers@Sun.COM     /*
338*7851SDana.Myers@Sun.COM      * If we are evaluating a Named buffer object "Name (xxxx, Buffer)".
339*7851SDana.Myers@Sun.COM      * The buffer object already exists (from the NS node), otherwise it must
340*7851SDana.Myers@Sun.COM      * be created.
341*7851SDana.Myers@Sun.COM      */
342*7851SDana.Myers@Sun.COM     ObjDesc = *ObjDescPtr;
343*7851SDana.Myers@Sun.COM     if (!ObjDesc)
344*7851SDana.Myers@Sun.COM     {
345*7851SDana.Myers@Sun.COM         /* Create a new buffer object */
346*7851SDana.Myers@Sun.COM 
347*7851SDana.Myers@Sun.COM         ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_BUFFER);
348*7851SDana.Myers@Sun.COM         *ObjDescPtr = ObjDesc;
349*7851SDana.Myers@Sun.COM         if (!ObjDesc)
350*7851SDana.Myers@Sun.COM         {
351*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (AE_NO_MEMORY);
352*7851SDana.Myers@Sun.COM         }
353*7851SDana.Myers@Sun.COM     }
354*7851SDana.Myers@Sun.COM 
355*7851SDana.Myers@Sun.COM     /*
356*7851SDana.Myers@Sun.COM      * Second arg is the buffer data (optional) ByteList can be either
357*7851SDana.Myers@Sun.COM      * individual bytes or a string initializer.  In either case, a
358*7851SDana.Myers@Sun.COM      * ByteList appears in the AML.
359*7851SDana.Myers@Sun.COM      */
360*7851SDana.Myers@Sun.COM     Arg = Op->Common.Value.Arg;         /* skip first arg */
361*7851SDana.Myers@Sun.COM 
362*7851SDana.Myers@Sun.COM     ByteList = Arg->Named.Next;
363*7851SDana.Myers@Sun.COM     if (ByteList)
364*7851SDana.Myers@Sun.COM     {
365*7851SDana.Myers@Sun.COM         if (ByteList->Common.AmlOpcode != AML_INT_BYTELIST_OP)
366*7851SDana.Myers@Sun.COM         {
367*7851SDana.Myers@Sun.COM             ACPI_ERROR ((AE_INFO,
368*7851SDana.Myers@Sun.COM                 "Expecting bytelist, got AML opcode %X in op %p",
369*7851SDana.Myers@Sun.COM                 ByteList->Common.AmlOpcode, ByteList));
370*7851SDana.Myers@Sun.COM 
371*7851SDana.Myers@Sun.COM             AcpiUtRemoveReference (ObjDesc);
372*7851SDana.Myers@Sun.COM             return (AE_TYPE);
373*7851SDana.Myers@Sun.COM         }
374*7851SDana.Myers@Sun.COM 
375*7851SDana.Myers@Sun.COM         ByteListLength = (UINT32) ByteList->Common.Value.Integer;
376*7851SDana.Myers@Sun.COM     }
377*7851SDana.Myers@Sun.COM 
378*7851SDana.Myers@Sun.COM     /*
379*7851SDana.Myers@Sun.COM      * The buffer length (number of bytes) will be the larger of:
380*7851SDana.Myers@Sun.COM      * 1) The specified buffer length and
381*7851SDana.Myers@Sun.COM      * 2) The length of the initializer byte list
382*7851SDana.Myers@Sun.COM      */
383*7851SDana.Myers@Sun.COM     ObjDesc->Buffer.Length = BufferLength;
384*7851SDana.Myers@Sun.COM     if (ByteListLength > BufferLength)
385*7851SDana.Myers@Sun.COM     {
386*7851SDana.Myers@Sun.COM         ObjDesc->Buffer.Length = ByteListLength;
387*7851SDana.Myers@Sun.COM     }
388*7851SDana.Myers@Sun.COM 
389*7851SDana.Myers@Sun.COM     /* Allocate the buffer */
390*7851SDana.Myers@Sun.COM 
391*7851SDana.Myers@Sun.COM     if (ObjDesc->Buffer.Length == 0)
392*7851SDana.Myers@Sun.COM     {
393*7851SDana.Myers@Sun.COM         ObjDesc->Buffer.Pointer = NULL;
394*7851SDana.Myers@Sun.COM         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
395*7851SDana.Myers@Sun.COM             "Buffer defined with zero length in AML, creating\n"));
396*7851SDana.Myers@Sun.COM     }
397*7851SDana.Myers@Sun.COM     else
398*7851SDana.Myers@Sun.COM     {
399*7851SDana.Myers@Sun.COM         ObjDesc->Buffer.Pointer = ACPI_ALLOCATE_ZEROED (
400*7851SDana.Myers@Sun.COM                                         ObjDesc->Buffer.Length);
401*7851SDana.Myers@Sun.COM         if (!ObjDesc->Buffer.Pointer)
402*7851SDana.Myers@Sun.COM         {
403*7851SDana.Myers@Sun.COM             AcpiUtDeleteObjectDesc (ObjDesc);
404*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (AE_NO_MEMORY);
405*7851SDana.Myers@Sun.COM         }
406*7851SDana.Myers@Sun.COM 
407*7851SDana.Myers@Sun.COM         /* Initialize buffer from the ByteList (if present) */
408*7851SDana.Myers@Sun.COM 
409*7851SDana.Myers@Sun.COM         if (ByteList)
410*7851SDana.Myers@Sun.COM         {
411*7851SDana.Myers@Sun.COM             ACPI_MEMCPY (ObjDesc->Buffer.Pointer, ByteList->Named.Data,
412*7851SDana.Myers@Sun.COM                          ByteListLength);
413*7851SDana.Myers@Sun.COM         }
414*7851SDana.Myers@Sun.COM     }
415*7851SDana.Myers@Sun.COM 
416*7851SDana.Myers@Sun.COM     ObjDesc->Buffer.Flags |= AOPOBJ_DATA_VALID;
417*7851SDana.Myers@Sun.COM     Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
418*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (AE_OK);
419*7851SDana.Myers@Sun.COM }
420*7851SDana.Myers@Sun.COM 
421*7851SDana.Myers@Sun.COM 
422*7851SDana.Myers@Sun.COM /*******************************************************************************
423*7851SDana.Myers@Sun.COM  *
424*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsBuildInternalPackageObj
425*7851SDana.Myers@Sun.COM  *
426*7851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState       - Current walk state
427*7851SDana.Myers@Sun.COM  *              Op              - Parser object to be translated
428*7851SDana.Myers@Sun.COM  *              ElementCount    - Number of elements in the package - this is
429*7851SDana.Myers@Sun.COM  *                                the NumElements argument to Package()
430*7851SDana.Myers@Sun.COM  *              ObjDescPtr      - Where the ACPI internal object is returned
431*7851SDana.Myers@Sun.COM  *
432*7851SDana.Myers@Sun.COM  * RETURN:      Status
433*7851SDana.Myers@Sun.COM  *
434*7851SDana.Myers@Sun.COM  * DESCRIPTION: Translate a parser Op package object to the equivalent
435*7851SDana.Myers@Sun.COM  *              namespace object
436*7851SDana.Myers@Sun.COM  *
437*7851SDana.Myers@Sun.COM  * NOTE: The number of elements in the package will be always be the NumElements
438*7851SDana.Myers@Sun.COM  * count, regardless of the number of elements in the package list. If
439*7851SDana.Myers@Sun.COM  * NumElements is smaller, only that many package list elements are used.
440*7851SDana.Myers@Sun.COM  * if NumElements is larger, the Package object is padded out with
441*7851SDana.Myers@Sun.COM  * objects of type Uninitialized (as per ACPI spec.)
442*7851SDana.Myers@Sun.COM  *
443*7851SDana.Myers@Sun.COM  * Even though the ASL compilers do not allow NumElements to be smaller
444*7851SDana.Myers@Sun.COM  * than the Package list length (for the fixed length package opcode), some
445*7851SDana.Myers@Sun.COM  * BIOS code modifies the AML on the fly to adjust the NumElements, and
446*7851SDana.Myers@Sun.COM  * this code compensates for that. This also provides compatibility with
447*7851SDana.Myers@Sun.COM  * other AML interpreters.
448*7851SDana.Myers@Sun.COM  *
449*7851SDana.Myers@Sun.COM  ******************************************************************************/
450*7851SDana.Myers@Sun.COM 
451*7851SDana.Myers@Sun.COM ACPI_STATUS
452*7851SDana.Myers@Sun.COM AcpiDsBuildInternalPackageObj (
453*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
454*7851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op,
455*7851SDana.Myers@Sun.COM     UINT32                  ElementCount,
456*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **ObjDescPtr)
457*7851SDana.Myers@Sun.COM {
458*7851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Arg;
459*7851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Parent;
460*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc = NULL;
461*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
462*7851SDana.Myers@Sun.COM     UINT32                  i;
463*7851SDana.Myers@Sun.COM     UINT16                  Index;
464*7851SDana.Myers@Sun.COM     UINT16                  ReferenceCount;
465*7851SDana.Myers@Sun.COM 
466*7851SDana.Myers@Sun.COM 
467*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsBuildInternalPackageObj);
468*7851SDana.Myers@Sun.COM 
469*7851SDana.Myers@Sun.COM 
470*7851SDana.Myers@Sun.COM     /* Find the parent of a possibly nested package */
471*7851SDana.Myers@Sun.COM 
472*7851SDana.Myers@Sun.COM     Parent = Op->Common.Parent;
473*7851SDana.Myers@Sun.COM     while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
474*7851SDana.Myers@Sun.COM            (Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP))
475*7851SDana.Myers@Sun.COM     {
476*7851SDana.Myers@Sun.COM         Parent = Parent->Common.Parent;
477*7851SDana.Myers@Sun.COM     }
478*7851SDana.Myers@Sun.COM 
479*7851SDana.Myers@Sun.COM     /*
480*7851SDana.Myers@Sun.COM      * If we are evaluating a Named package object "Name (xxxx, Package)",
481*7851SDana.Myers@Sun.COM      * the package object already exists, otherwise it must be created.
482*7851SDana.Myers@Sun.COM      */
483*7851SDana.Myers@Sun.COM     ObjDesc = *ObjDescPtr;
484*7851SDana.Myers@Sun.COM     if (!ObjDesc)
485*7851SDana.Myers@Sun.COM     {
486*7851SDana.Myers@Sun.COM         ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
487*7851SDana.Myers@Sun.COM         *ObjDescPtr = ObjDesc;
488*7851SDana.Myers@Sun.COM         if (!ObjDesc)
489*7851SDana.Myers@Sun.COM         {
490*7851SDana.Myers@Sun.COM             return_ACPI_STATUS (AE_NO_MEMORY);
491*7851SDana.Myers@Sun.COM         }
492*7851SDana.Myers@Sun.COM 
493*7851SDana.Myers@Sun.COM         ObjDesc->Package.Node = Parent->Common.Node;
494*7851SDana.Myers@Sun.COM     }
495*7851SDana.Myers@Sun.COM 
496*7851SDana.Myers@Sun.COM     /*
497*7851SDana.Myers@Sun.COM      * Allocate the element array (array of pointers to the individual
498*7851SDana.Myers@Sun.COM      * objects) based on the NumElements parameter. Add an extra pointer slot
499*7851SDana.Myers@Sun.COM      * so that the list is always null terminated.
500*7851SDana.Myers@Sun.COM      */
501*7851SDana.Myers@Sun.COM     ObjDesc->Package.Elements = ACPI_ALLOCATE_ZEROED (
502*7851SDana.Myers@Sun.COM         ((ACPI_SIZE) ElementCount + 1) * sizeof (void *));
503*7851SDana.Myers@Sun.COM 
504*7851SDana.Myers@Sun.COM     if (!ObjDesc->Package.Elements)
505*7851SDana.Myers@Sun.COM     {
506*7851SDana.Myers@Sun.COM         AcpiUtDeleteObjectDesc (ObjDesc);
507*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_NO_MEMORY);
508*7851SDana.Myers@Sun.COM     }
509*7851SDana.Myers@Sun.COM 
510*7851SDana.Myers@Sun.COM     ObjDesc->Package.Count = ElementCount;
511*7851SDana.Myers@Sun.COM 
512*7851SDana.Myers@Sun.COM     /*
513*7851SDana.Myers@Sun.COM      * Initialize the elements of the package, up to the NumElements count.
514*7851SDana.Myers@Sun.COM      * Package is automatically padded with uninitialized (NULL) elements
515*7851SDana.Myers@Sun.COM      * if NumElements is greater than the package list length. Likewise,
516*7851SDana.Myers@Sun.COM      * Package is truncated if NumElements is less than the list length.
517*7851SDana.Myers@Sun.COM      */
518*7851SDana.Myers@Sun.COM     Arg = Op->Common.Value.Arg;
519*7851SDana.Myers@Sun.COM     Arg = Arg->Common.Next;
520*7851SDana.Myers@Sun.COM     for (i = 0; Arg && (i < ElementCount); i++)
521*7851SDana.Myers@Sun.COM     {
522*7851SDana.Myers@Sun.COM         if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
523*7851SDana.Myers@Sun.COM         {
524*7851SDana.Myers@Sun.COM             if (Arg->Common.Node->Type == ACPI_TYPE_METHOD)
525*7851SDana.Myers@Sun.COM             {
526*7851SDana.Myers@Sun.COM                 /*
527*7851SDana.Myers@Sun.COM                  * A method reference "looks" to the parser to be a method
528*7851SDana.Myers@Sun.COM                  * invocation, so we special case it here
529*7851SDana.Myers@Sun.COM                  */
530*7851SDana.Myers@Sun.COM                 Arg->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
531*7851SDana.Myers@Sun.COM                 Status = AcpiDsBuildInternalObject (WalkState, Arg,
532*7851SDana.Myers@Sun.COM                             &ObjDesc->Package.Elements[i]);
533*7851SDana.Myers@Sun.COM             }
534*7851SDana.Myers@Sun.COM             else
535*7851SDana.Myers@Sun.COM             {
536*7851SDana.Myers@Sun.COM                 /* This package element is already built, just get it */
537*7851SDana.Myers@Sun.COM 
538*7851SDana.Myers@Sun.COM                 ObjDesc->Package.Elements[i] =
539*7851SDana.Myers@Sun.COM                     ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
540*7851SDana.Myers@Sun.COM             }
541*7851SDana.Myers@Sun.COM         }
542*7851SDana.Myers@Sun.COM         else
543*7851SDana.Myers@Sun.COM         {
544*7851SDana.Myers@Sun.COM             Status = AcpiDsBuildInternalObject (WalkState, Arg,
545*7851SDana.Myers@Sun.COM                         &ObjDesc->Package.Elements[i]);
546*7851SDana.Myers@Sun.COM         }
547*7851SDana.Myers@Sun.COM 
548*7851SDana.Myers@Sun.COM         if (*ObjDescPtr)
549*7851SDana.Myers@Sun.COM         {
550*7851SDana.Myers@Sun.COM             /* Existing package, get existing reference count */
551*7851SDana.Myers@Sun.COM 
552*7851SDana.Myers@Sun.COM             ReferenceCount = (*ObjDescPtr)->Common.ReferenceCount;
553*7851SDana.Myers@Sun.COM             if (ReferenceCount > 1)
554*7851SDana.Myers@Sun.COM             {
555*7851SDana.Myers@Sun.COM                 /* Make new element ref count match original ref count */
556*7851SDana.Myers@Sun.COM 
557*7851SDana.Myers@Sun.COM                 for (Index = 0; Index < (ReferenceCount - 1); Index++)
558*7851SDana.Myers@Sun.COM                 {
559*7851SDana.Myers@Sun.COM                     AcpiUtAddReference ((ObjDesc->Package.Elements[i]));
560*7851SDana.Myers@Sun.COM                 }
561*7851SDana.Myers@Sun.COM             }
562*7851SDana.Myers@Sun.COM         }
563*7851SDana.Myers@Sun.COM 
564*7851SDana.Myers@Sun.COM         Arg = Arg->Common.Next;
565*7851SDana.Myers@Sun.COM     }
566*7851SDana.Myers@Sun.COM 
567*7851SDana.Myers@Sun.COM     /* Check for match between NumElements and actual length of PackageList */
568*7851SDana.Myers@Sun.COM 
569*7851SDana.Myers@Sun.COM     if (Arg)
570*7851SDana.Myers@Sun.COM     {
571*7851SDana.Myers@Sun.COM         /*
572*7851SDana.Myers@Sun.COM          * NumElements was exhausted, but there are remaining elements in the
573*7851SDana.Myers@Sun.COM          * PackageList.
574*7851SDana.Myers@Sun.COM          *
575*7851SDana.Myers@Sun.COM          * Note: technically, this is an error, from ACPI spec: "It is an error
576*7851SDana.Myers@Sun.COM          * for NumElements to be less than the number of elements in the
577*7851SDana.Myers@Sun.COM          * PackageList". However, for now, we just print an error message and
578*7851SDana.Myers@Sun.COM          * no exception is returned.
579*7851SDana.Myers@Sun.COM          */
580*7851SDana.Myers@Sun.COM         while (Arg)
581*7851SDana.Myers@Sun.COM         {
582*7851SDana.Myers@Sun.COM             /* Find out how many elements there really are */
583*7851SDana.Myers@Sun.COM 
584*7851SDana.Myers@Sun.COM             i++;
585*7851SDana.Myers@Sun.COM             Arg = Arg->Common.Next;
586*7851SDana.Myers@Sun.COM         }
587*7851SDana.Myers@Sun.COM 
588*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO,
589*7851SDana.Myers@Sun.COM             "Package List length (%X) larger than NumElements count (%X), truncated\n",
590*7851SDana.Myers@Sun.COM             i, ElementCount));
591*7851SDana.Myers@Sun.COM     }
592*7851SDana.Myers@Sun.COM     else if (i < ElementCount)
593*7851SDana.Myers@Sun.COM     {
594*7851SDana.Myers@Sun.COM         /*
595*7851SDana.Myers@Sun.COM          * Arg list (elements) was exhausted, but we did not reach NumElements count.
596*7851SDana.Myers@Sun.COM          * Note: this is not an error, the package is padded out with NULLs.
597*7851SDana.Myers@Sun.COM          */
598*7851SDana.Myers@Sun.COM         ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
599*7851SDana.Myers@Sun.COM             "Package List length (%X) smaller than NumElements count (%X), padded with null elements\n",
600*7851SDana.Myers@Sun.COM             i, ElementCount));
601*7851SDana.Myers@Sun.COM     }
602*7851SDana.Myers@Sun.COM 
603*7851SDana.Myers@Sun.COM     ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
604*7851SDana.Myers@Sun.COM     Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
605*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
606*7851SDana.Myers@Sun.COM }
607*7851SDana.Myers@Sun.COM 
608*7851SDana.Myers@Sun.COM 
609*7851SDana.Myers@Sun.COM /*******************************************************************************
610*7851SDana.Myers@Sun.COM  *
611*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsCreateNode
612*7851SDana.Myers@Sun.COM  *
613*7851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState       - Current walk state
614*7851SDana.Myers@Sun.COM  *              Node            - NS Node to be initialized
615*7851SDana.Myers@Sun.COM  *              Op              - Parser object to be translated
616*7851SDana.Myers@Sun.COM  *
617*7851SDana.Myers@Sun.COM  * RETURN:      Status
618*7851SDana.Myers@Sun.COM  *
619*7851SDana.Myers@Sun.COM  * DESCRIPTION: Create the object to be associated with a namespace node
620*7851SDana.Myers@Sun.COM  *
621*7851SDana.Myers@Sun.COM  ******************************************************************************/
622*7851SDana.Myers@Sun.COM 
623*7851SDana.Myers@Sun.COM ACPI_STATUS
624*7851SDana.Myers@Sun.COM AcpiDsCreateNode (
625*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
626*7851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node,
627*7851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op)
628*7851SDana.Myers@Sun.COM {
629*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
630*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc;
631*7851SDana.Myers@Sun.COM 
632*7851SDana.Myers@Sun.COM 
633*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_PTR (DsCreateNode, Op);
634*7851SDana.Myers@Sun.COM 
635*7851SDana.Myers@Sun.COM 
636*7851SDana.Myers@Sun.COM     /*
637*7851SDana.Myers@Sun.COM      * Because of the execution pass through the non-control-method
638*7851SDana.Myers@Sun.COM      * parts of the table, we can arrive here twice.  Only init
639*7851SDana.Myers@Sun.COM      * the named object node the first time through
640*7851SDana.Myers@Sun.COM      */
641*7851SDana.Myers@Sun.COM     if (AcpiNsGetAttachedObject (Node))
642*7851SDana.Myers@Sun.COM     {
643*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_OK);
644*7851SDana.Myers@Sun.COM     }
645*7851SDana.Myers@Sun.COM 
646*7851SDana.Myers@Sun.COM     if (!Op->Common.Value.Arg)
647*7851SDana.Myers@Sun.COM     {
648*7851SDana.Myers@Sun.COM         /* No arguments, there is nothing to do */
649*7851SDana.Myers@Sun.COM 
650*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_OK);
651*7851SDana.Myers@Sun.COM     }
652*7851SDana.Myers@Sun.COM 
653*7851SDana.Myers@Sun.COM     /* Build an internal object for the argument(s) */
654*7851SDana.Myers@Sun.COM 
655*7851SDana.Myers@Sun.COM     Status = AcpiDsBuildInternalObject (WalkState, Op->Common.Value.Arg,
656*7851SDana.Myers@Sun.COM                 &ObjDesc);
657*7851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
658*7851SDana.Myers@Sun.COM     {
659*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
660*7851SDana.Myers@Sun.COM     }
661*7851SDana.Myers@Sun.COM 
662*7851SDana.Myers@Sun.COM     /* Re-type the object according to its argument */
663*7851SDana.Myers@Sun.COM 
664*7851SDana.Myers@Sun.COM     Node->Type = ACPI_GET_OBJECT_TYPE (ObjDesc);
665*7851SDana.Myers@Sun.COM 
666*7851SDana.Myers@Sun.COM     /* Attach obj to node */
667*7851SDana.Myers@Sun.COM 
668*7851SDana.Myers@Sun.COM     Status = AcpiNsAttachObject (Node, ObjDesc, Node->Type);
669*7851SDana.Myers@Sun.COM 
670*7851SDana.Myers@Sun.COM     /* Remove local reference to the object */
671*7851SDana.Myers@Sun.COM 
672*7851SDana.Myers@Sun.COM     AcpiUtRemoveReference (ObjDesc);
673*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
674*7851SDana.Myers@Sun.COM }
675*7851SDana.Myers@Sun.COM 
676*7851SDana.Myers@Sun.COM #endif /* ACPI_NO_METHOD_EXECUTION */
677*7851SDana.Myers@Sun.COM 
678*7851SDana.Myers@Sun.COM 
679*7851SDana.Myers@Sun.COM /*******************************************************************************
680*7851SDana.Myers@Sun.COM  *
681*7851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsInitObjectFromOp
682*7851SDana.Myers@Sun.COM  *
683*7851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState       - Current walk state
684*7851SDana.Myers@Sun.COM  *              Op              - Parser op used to init the internal object
685*7851SDana.Myers@Sun.COM  *              Opcode          - AML opcode associated with the object
686*7851SDana.Myers@Sun.COM  *              RetObjDesc      - Namespace object to be initialized
687*7851SDana.Myers@Sun.COM  *
688*7851SDana.Myers@Sun.COM  * RETURN:      Status
689*7851SDana.Myers@Sun.COM  *
690*7851SDana.Myers@Sun.COM  * DESCRIPTION: Initialize a namespace object from a parser Op and its
691*7851SDana.Myers@Sun.COM  *              associated arguments.  The namespace object is a more compact
692*7851SDana.Myers@Sun.COM  *              representation of the Op and its arguments.
693*7851SDana.Myers@Sun.COM  *
694*7851SDana.Myers@Sun.COM  ******************************************************************************/
695*7851SDana.Myers@Sun.COM 
696*7851SDana.Myers@Sun.COM ACPI_STATUS
697*7851SDana.Myers@Sun.COM AcpiDsInitObjectFromOp (
698*7851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
699*7851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op,
700*7851SDana.Myers@Sun.COM     UINT16                  Opcode,
701*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **RetObjDesc)
702*7851SDana.Myers@Sun.COM {
703*7851SDana.Myers@Sun.COM     const ACPI_OPCODE_INFO  *OpInfo;
704*7851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc;
705*7851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
706*7851SDana.Myers@Sun.COM 
707*7851SDana.Myers@Sun.COM 
708*7851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsInitObjectFromOp);
709*7851SDana.Myers@Sun.COM 
710*7851SDana.Myers@Sun.COM 
711*7851SDana.Myers@Sun.COM     ObjDesc = *RetObjDesc;
712*7851SDana.Myers@Sun.COM     OpInfo = AcpiPsGetOpcodeInfo (Opcode);
713*7851SDana.Myers@Sun.COM     if (OpInfo->Class == AML_CLASS_UNKNOWN)
714*7851SDana.Myers@Sun.COM     {
715*7851SDana.Myers@Sun.COM         /* Unknown opcode */
716*7851SDana.Myers@Sun.COM 
717*7851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_TYPE);
718*7851SDana.Myers@Sun.COM     }
719*7851SDana.Myers@Sun.COM 
720*7851SDana.Myers@Sun.COM     /* Perform per-object initialization */
721*7851SDana.Myers@Sun.COM 
722*7851SDana.Myers@Sun.COM     switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
723*7851SDana.Myers@Sun.COM     {
724*7851SDana.Myers@Sun.COM     case ACPI_TYPE_BUFFER:
725*7851SDana.Myers@Sun.COM 
726*7851SDana.Myers@Sun.COM         /*
727*7851SDana.Myers@Sun.COM          * Defer evaluation of Buffer TermArg operand
728*7851SDana.Myers@Sun.COM          */
729*7851SDana.Myers@Sun.COM         ObjDesc->Buffer.Node      = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
730*7851SDana.Myers@Sun.COM                                         WalkState->Operands[0]);
731*7851SDana.Myers@Sun.COM         ObjDesc->Buffer.AmlStart  = Op->Named.Data;
732*7851SDana.Myers@Sun.COM         ObjDesc->Buffer.AmlLength = Op->Named.Length;
733*7851SDana.Myers@Sun.COM         break;
734*7851SDana.Myers@Sun.COM 
735*7851SDana.Myers@Sun.COM 
736*7851SDana.Myers@Sun.COM     case ACPI_TYPE_PACKAGE:
737*7851SDana.Myers@Sun.COM 
738*7851SDana.Myers@Sun.COM         /*
739*7851SDana.Myers@Sun.COM          * Defer evaluation of Package TermArg operand
740*7851SDana.Myers@Sun.COM          */
741*7851SDana.Myers@Sun.COM         ObjDesc->Package.Node      = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
742*7851SDana.Myers@Sun.COM                                         WalkState->Operands[0]);
743*7851SDana.Myers@Sun.COM         ObjDesc->Package.AmlStart  = Op->Named.Data;
744*7851SDana.Myers@Sun.COM         ObjDesc->Package.AmlLength = Op->Named.Length;
745*7851SDana.Myers@Sun.COM         break;
746*7851SDana.Myers@Sun.COM 
747*7851SDana.Myers@Sun.COM 
748*7851SDana.Myers@Sun.COM     case ACPI_TYPE_INTEGER:
749*7851SDana.Myers@Sun.COM 
750*7851SDana.Myers@Sun.COM         switch (OpInfo->Type)
751*7851SDana.Myers@Sun.COM         {
752*7851SDana.Myers@Sun.COM         case AML_TYPE_CONSTANT:
753*7851SDana.Myers@Sun.COM             /*
754*7851SDana.Myers@Sun.COM              * Resolve AML Constants here - AND ONLY HERE!
755*7851SDana.Myers@Sun.COM              * All constants are integers.
756*7851SDana.Myers@Sun.COM              * We mark the integer with a flag that indicates that it started
757*7851SDana.Myers@Sun.COM              * life as a constant -- so that stores to constants will perform
758*7851SDana.Myers@Sun.COM              * as expected (noop). ZeroOp is used as a placeholder for optional
759*7851SDana.Myers@Sun.COM              * target operands.
760*7851SDana.Myers@Sun.COM              */
761*7851SDana.Myers@Sun.COM             ObjDesc->Common.Flags = AOPOBJ_AML_CONSTANT;
762*7851SDana.Myers@Sun.COM 
763*7851SDana.Myers@Sun.COM             switch (Opcode)
764*7851SDana.Myers@Sun.COM             {
765*7851SDana.Myers@Sun.COM             case AML_ZERO_OP:
766*7851SDana.Myers@Sun.COM 
767*7851SDana.Myers@Sun.COM                 ObjDesc->Integer.Value = 0;
768*7851SDana.Myers@Sun.COM                 break;
769*7851SDana.Myers@Sun.COM 
770*7851SDana.Myers@Sun.COM             case AML_ONE_OP:
771*7851SDana.Myers@Sun.COM 
772*7851SDana.Myers@Sun.COM                 ObjDesc->Integer.Value = 1;
773*7851SDana.Myers@Sun.COM                 break;
774*7851SDana.Myers@Sun.COM 
775*7851SDana.Myers@Sun.COM             case AML_ONES_OP:
776*7851SDana.Myers@Sun.COM 
777*7851SDana.Myers@Sun.COM                 ObjDesc->Integer.Value = ACPI_INTEGER_MAX;
778*7851SDana.Myers@Sun.COM 
779*7851SDana.Myers@Sun.COM                 /* Truncate value if we are executing from a 32-bit ACPI table */
780*7851SDana.Myers@Sun.COM 
781*7851SDana.Myers@Sun.COM #ifndef ACPI_NO_METHOD_EXECUTION
782*7851SDana.Myers@Sun.COM                 AcpiExTruncateFor32bitTable (ObjDesc);
783*7851SDana.Myers@Sun.COM #endif
784*7851SDana.Myers@Sun.COM                 break;
785*7851SDana.Myers@Sun.COM 
786*7851SDana.Myers@Sun.COM             case AML_REVISION_OP:
787*7851SDana.Myers@Sun.COM 
788*7851SDana.Myers@Sun.COM                 ObjDesc->Integer.Value = ACPI_CA_VERSION;
789*7851SDana.Myers@Sun.COM                 break;
790*7851SDana.Myers@Sun.COM 
791*7851SDana.Myers@Sun.COM             default:
792*7851SDana.Myers@Sun.COM 
793*7851SDana.Myers@Sun.COM                 ACPI_ERROR ((AE_INFO,
794*7851SDana.Myers@Sun.COM                     "Unknown constant opcode %X", Opcode));
795*7851SDana.Myers@Sun.COM                 Status = AE_AML_OPERAND_TYPE;
796*7851SDana.Myers@Sun.COM                 break;
797*7851SDana.Myers@Sun.COM             }
798*7851SDana.Myers@Sun.COM             break;
799*7851SDana.Myers@Sun.COM 
800*7851SDana.Myers@Sun.COM 
801*7851SDana.Myers@Sun.COM         case AML_TYPE_LITERAL:
802*7851SDana.Myers@Sun.COM 
803*7851SDana.Myers@Sun.COM             ObjDesc->Integer.Value = Op->Common.Value.Integer;
804*7851SDana.Myers@Sun.COM #ifndef ACPI_NO_METHOD_EXECUTION
805*7851SDana.Myers@Sun.COM             AcpiExTruncateFor32bitTable (ObjDesc);
806*7851SDana.Myers@Sun.COM #endif
807*7851SDana.Myers@Sun.COM             break;
808*7851SDana.Myers@Sun.COM 
809*7851SDana.Myers@Sun.COM 
810*7851SDana.Myers@Sun.COM         default:
811*7851SDana.Myers@Sun.COM             ACPI_ERROR ((AE_INFO, "Unknown Integer type %X",
812*7851SDana.Myers@Sun.COM                 OpInfo->Type));
813*7851SDana.Myers@Sun.COM             Status = AE_AML_OPERAND_TYPE;
814*7851SDana.Myers@Sun.COM             break;
815*7851SDana.Myers@Sun.COM         }
816*7851SDana.Myers@Sun.COM         break;
817*7851SDana.Myers@Sun.COM 
818*7851SDana.Myers@Sun.COM 
819*7851SDana.Myers@Sun.COM     case ACPI_TYPE_STRING:
820*7851SDana.Myers@Sun.COM 
821*7851SDana.Myers@Sun.COM         ObjDesc->String.Pointer = Op->Common.Value.String;
822*7851SDana.Myers@Sun.COM         ObjDesc->String.Length = (UINT32) ACPI_STRLEN (Op->Common.Value.String);
823*7851SDana.Myers@Sun.COM 
824*7851SDana.Myers@Sun.COM         /*
825*7851SDana.Myers@Sun.COM          * The string is contained in the ACPI table, don't ever try
826*7851SDana.Myers@Sun.COM          * to delete it
827*7851SDana.Myers@Sun.COM          */
828*7851SDana.Myers@Sun.COM         ObjDesc->Common.Flags |= AOPOBJ_STATIC_POINTER;
829*7851SDana.Myers@Sun.COM         break;
830*7851SDana.Myers@Sun.COM 
831*7851SDana.Myers@Sun.COM 
832*7851SDana.Myers@Sun.COM     case ACPI_TYPE_METHOD:
833*7851SDana.Myers@Sun.COM         break;
834*7851SDana.Myers@Sun.COM 
835*7851SDana.Myers@Sun.COM 
836*7851SDana.Myers@Sun.COM     case ACPI_TYPE_LOCAL_REFERENCE:
837*7851SDana.Myers@Sun.COM 
838*7851SDana.Myers@Sun.COM         switch (OpInfo->Type)
839*7851SDana.Myers@Sun.COM         {
840*7851SDana.Myers@Sun.COM         case AML_TYPE_LOCAL_VARIABLE:
841*7851SDana.Myers@Sun.COM 
842*7851SDana.Myers@Sun.COM             /* Local ID (0-7) is (AML opcode - base AML_LOCAL_OP) */
843*7851SDana.Myers@Sun.COM 
844*7851SDana.Myers@Sun.COM             ObjDesc->Reference.Value = Opcode - AML_LOCAL_OP;
845*7851SDana.Myers@Sun.COM             ObjDesc->Reference.Class = ACPI_REFCLASS_LOCAL;
846*7851SDana.Myers@Sun.COM 
847*7851SDana.Myers@Sun.COM #ifndef ACPI_NO_METHOD_EXECUTION
848*7851SDana.Myers@Sun.COM             Status = AcpiDsMethodDataGetNode (ACPI_REFCLASS_LOCAL,
849*7851SDana.Myers@Sun.COM                         ObjDesc->Reference.Value, WalkState,
850*7851SDana.Myers@Sun.COM                         ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE,
851*7851SDana.Myers@Sun.COM                             &ObjDesc->Reference.Object));
852*7851SDana.Myers@Sun.COM #endif
853*7851SDana.Myers@Sun.COM             break;
854*7851SDana.Myers@Sun.COM 
855*7851SDana.Myers@Sun.COM 
856*7851SDana.Myers@Sun.COM         case AML_TYPE_METHOD_ARGUMENT:
857*7851SDana.Myers@Sun.COM 
858*7851SDana.Myers@Sun.COM             /* Arg ID (0-6) is (AML opcode - base AML_ARG_OP) */
859*7851SDana.Myers@Sun.COM 
860*7851SDana.Myers@Sun.COM             ObjDesc->Reference.Value = Opcode - AML_ARG_OP;
861*7851SDana.Myers@Sun.COM             ObjDesc->Reference.Class = ACPI_REFCLASS_ARG;
862*7851SDana.Myers@Sun.COM 
863*7851SDana.Myers@Sun.COM #ifndef ACPI_NO_METHOD_EXECUTION
864*7851SDana.Myers@Sun.COM             Status = AcpiDsMethodDataGetNode (ACPI_REFCLASS_ARG,
865*7851SDana.Myers@Sun.COM                         ObjDesc->Reference.Value, WalkState,
866*7851SDana.Myers@Sun.COM                         ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE,
867*7851SDana.Myers@Sun.COM                             &ObjDesc->Reference.Object));
868*7851SDana.Myers@Sun.COM #endif
869*7851SDana.Myers@Sun.COM             break;
870*7851SDana.Myers@Sun.COM 
871*7851SDana.Myers@Sun.COM         default: /* Object name or Debug object */
872*7851SDana.Myers@Sun.COM 
873*7851SDana.Myers@Sun.COM             switch (Op->Common.AmlOpcode)
874*7851SDana.Myers@Sun.COM             {
875*7851SDana.Myers@Sun.COM             case AML_INT_NAMEPATH_OP:
876*7851SDana.Myers@Sun.COM 
877*7851SDana.Myers@Sun.COM                 /* Node was saved in Op */
878*7851SDana.Myers@Sun.COM 
879*7851SDana.Myers@Sun.COM                 ObjDesc->Reference.Node = Op->Common.Node;
880*7851SDana.Myers@Sun.COM                 ObjDesc->Reference.Object = Op->Common.Node->Object;
881*7851SDana.Myers@Sun.COM                 ObjDesc->Reference.Class = ACPI_REFCLASS_NAME;
882*7851SDana.Myers@Sun.COM                 break;
883*7851SDana.Myers@Sun.COM 
884*7851SDana.Myers@Sun.COM             case AML_DEBUG_OP:
885*7851SDana.Myers@Sun.COM 
886*7851SDana.Myers@Sun.COM                 ObjDesc->Reference.Class = ACPI_REFCLASS_DEBUG;
887*7851SDana.Myers@Sun.COM                 break;
888*7851SDana.Myers@Sun.COM 
889*7851SDana.Myers@Sun.COM             default:
890*7851SDana.Myers@Sun.COM 
891*7851SDana.Myers@Sun.COM                 ACPI_ERROR ((AE_INFO,
892*7851SDana.Myers@Sun.COM                     "Unimplemented reference type for AML opcode: %4.4X", Opcode));
893*7851SDana.Myers@Sun.COM                 return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
894*7851SDana.Myers@Sun.COM             }
895*7851SDana.Myers@Sun.COM             break;
896*7851SDana.Myers@Sun.COM         }
897*7851SDana.Myers@Sun.COM         break;
898*7851SDana.Myers@Sun.COM 
899*7851SDana.Myers@Sun.COM 
900*7851SDana.Myers@Sun.COM     default:
901*7851SDana.Myers@Sun.COM 
902*7851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Unimplemented data type: %X",
903*7851SDana.Myers@Sun.COM             ACPI_GET_OBJECT_TYPE (ObjDesc)));
904*7851SDana.Myers@Sun.COM 
905*7851SDana.Myers@Sun.COM         Status = AE_AML_OPERAND_TYPE;
906*7851SDana.Myers@Sun.COM         break;
907*7851SDana.Myers@Sun.COM     }
908*7851SDana.Myers@Sun.COM 
909*7851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
910*7851SDana.Myers@Sun.COM }
911*7851SDana.Myers@Sun.COM 
912*7851SDana.Myers@Sun.COM 
913