11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module Name: dsobject - Dispatcher object management routines
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *****************************************************************************/
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
877848130e53b06c22fe37a7b6acbb82bb3e9bfbaBob Moore * Copyright (C) 2000 - 2012, Intel Corp.
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * All rights reserved.
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Redistribution and use in source and binary forms, with or without
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modification, are permitted provided that the following conditions
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are met:
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1. Redistributions of source code must retain the above copyright
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    notice, this list of conditions, and the following disclaimer,
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    without modification.
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2. Redistributions in binary form must reproduce at minimum a disclaimer
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    substantially similar to the "NO WARRANTY" disclaimer below
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    ("Disclaimer") and any redistribution must be conditioned upon
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    including a substantially similar Disclaimer requirement for further
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    binary redistribution.
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3. Neither the names of the above-listed copyright holders nor the names
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    of any contributors may be used to endorse or promote products derived
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    from this software without specific prior written permission.
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Alternatively, this software may be distributed under the terms of the
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License ("GPL") version 2 as published by the Free
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Software Foundation.
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NO WARRANTY
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * POSSIBILITY OF SUCH DAMAGES.
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <acpi/acpi.h>
45e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "accommon.h"
46e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acparser.h"
47e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "amlcode.h"
48e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acdispat.h"
49e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acnamesp.h"
50e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acinterp.h"
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPONENT          ACPI_DISPATCHER
534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen BrownACPI_MODULE_NAME("dsobject")
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore/* Local prototypes */
5644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status
574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			      union acpi_parse_object *op,
594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			      union acpi_operand_object **obj_desc_ptr);
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef ACPI_NO_METHOD_EXECUTION
6244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ds_build_internal_object
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  walk_state      - Current walk state
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Op              - Parser object to be translated
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              obj_desc_ptr    - Where the ACPI internal object is returned
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Translate a parser Op object to the equivalent namespace object
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Simple objects are any objects other than a package object!
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
7544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status
784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
794be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			      union acpi_parse_object *op,
804be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			      union acpi_operand_object **obj_desc_ptr)
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *obj_desc;
834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status;
8409079250db4d470f75eddcce31e0229c92d6c3bfBob Moore	acpi_object_type type;
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
86b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore	ACPI_FUNCTION_TRACE(ds_build_internal_object);
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*obj_desc_ptr = NULL;
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (op->common.aml_opcode == AML_INT_NAMEPATH_OP) {
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
91defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore		 * This is a named object reference. If this name was
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * previously looked up in the namespace, it was stored in this op.
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Otherwise, go ahead and look it up now
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!op->common.node) {
964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			status = acpi_ns_lookup(walk_state->scope_info,
974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown						op->common.value.string,
984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown						ACPI_TYPE_ANY,
994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown						ACPI_IMODE_EXECUTE,
1004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown						ACPI_NS_SEARCH_PARENT |
1014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown						ACPI_NS_DONT_OPEN_SCOPE, NULL,
102defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore						ACPI_CAST_INDIRECT_PTR(struct
103defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore								       acpi_namespace_node,
104defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore								       &(op->
105defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore									 common.
106defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore									 node)));
1074be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			if (ACPI_FAILURE(status)) {
10852fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore
109defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore				/* Check if we are resolving a named reference within a package */
110defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore
111defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore				if ((status == AE_NOT_FOUND)
112defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore				    && (acpi_gbl_enable_interpreter_slack)
113defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore				    &&
114defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore				    ((op->common.parent->common.aml_opcode ==
115defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore				      AML_PACKAGE_OP)
116defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore				     || (op->common.parent->common.aml_opcode ==
117defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore					 AML_VAR_PACKAGE_OP))) {
118defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore					/*
119defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore					 * We didn't find the target and we are populating elements
120defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore					 * of a package - ignore if slack enabled. Some ASL code
121defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore					 * contains dangling invalid references in packages and
122defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore					 * expects that no exception will be issued. Leave the
123defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore					 * element as a null element. It cannot be used, but it
124defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore					 * can be overwritten by subsequent ASL code - this is
125defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore					 * typically the case.
126defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore					 */
127defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore					ACPI_DEBUG_PRINT((ACPI_DB_INFO,
128defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore							  "Ignoring unresolved reference in package [%4.4s]\n",
129defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore							  walk_state->
130defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore							  scope_info->scope.
131defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore							  node->name.ascii));
132defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore
133defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore					return_ACPI_STATUS(AE_OK);
134defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore				} else {
135b8e4d89357fc434618a59c1047cac72641191805Bob Moore					ACPI_ERROR_NAMESPACE(op->common.value.
136b8e4d89357fc434618a59c1047cac72641191805Bob Moore							     string, status);
137defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore				}
138defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore
1394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				return_ACPI_STATUS(status);
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
142152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore
143152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore		/* Special object resolution for elements of a package */
144152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore
145152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore		if ((op->common.parent->common.aml_opcode == AML_PACKAGE_OP) ||
146152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore		    (op->common.parent->common.aml_opcode ==
147152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore		     AML_VAR_PACKAGE_OP)) {
148152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			/*
149152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			 * Attempt to resolve the node to a value before we insert it into
150152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			 * the package. If this is a reference to a common data type,
151152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			 * resolve it immediately. According to the ACPI spec, package
152152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			 * elements can only be "data objects" or method references.
153152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			 * Attempt to resolve to an Integer, Buffer, String or Package.
154152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			 * If cannot, return the named reference (for things like Devices,
155152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			 * Methods, etc.) Buffer Fields and Fields will resolve to simple
156152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			 * objects (int/buf/str/pkg).
157152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			 *
158152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			 * NOTE: References to things like Devices, Methods, Mutexes, etc.
159152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			 * will remain as named references. This behavior is not described
160152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			 * in the ACPI spec, but it appears to be an oversight.
161152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			 */
162b7f9f04228eae2cf5adc2ffeb494d4970a8dd8a5Bob Moore			obj_desc =
163b7f9f04228eae2cf5adc2ffeb494d4970a8dd8a5Bob Moore			    ACPI_CAST_PTR(union acpi_operand_object,
164b7f9f04228eae2cf5adc2ffeb494d4970a8dd8a5Bob Moore					  op->common.node);
165152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore
166152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			status =
167152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			    acpi_ex_resolve_node_to_value(ACPI_CAST_INDIRECT_PTR
168152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore							  (struct
169152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore							   acpi_namespace_node,
170152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore							   &obj_desc),
171152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore							  walk_state);
172152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			if (ACPI_FAILURE(status)) {
173152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				return_ACPI_STATUS(status);
174152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			}
175152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore
17609079250db4d470f75eddcce31e0229c92d6c3bfBob Moore			/*
17709079250db4d470f75eddcce31e0229c92d6c3bfBob Moore			 * Special handling for Alias objects. We need to setup the type
17809079250db4d470f75eddcce31e0229c92d6c3bfBob Moore			 * and the Op->Common.Node to point to the Alias target. Note,
17909079250db4d470f75eddcce31e0229c92d6c3bfBob Moore			 * Alias has at most one level of indirection internally.
18009079250db4d470f75eddcce31e0229c92d6c3bfBob Moore			 */
18109079250db4d470f75eddcce31e0229c92d6c3bfBob Moore			type = op->common.node->type;
18209079250db4d470f75eddcce31e0229c92d6c3bfBob Moore			if (type == ACPI_TYPE_LOCAL_ALIAS) {
18309079250db4d470f75eddcce31e0229c92d6c3bfBob Moore				type = obj_desc->common.type;
18409079250db4d470f75eddcce31e0229c92d6c3bfBob Moore				op->common.node =
18509079250db4d470f75eddcce31e0229c92d6c3bfBob Moore				    ACPI_CAST_PTR(struct acpi_namespace_node,
18609079250db4d470f75eddcce31e0229c92d6c3bfBob Moore						  op->common.node->object);
18709079250db4d470f75eddcce31e0229c92d6c3bfBob Moore			}
18809079250db4d470f75eddcce31e0229c92d6c3bfBob Moore
18909079250db4d470f75eddcce31e0229c92d6c3bfBob Moore			switch (type) {
190152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				/*
191152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				 * For these types, we need the actual node, not the subobject.
1929e41d93c975d403380b7debe05517d630c8e2836Bob Moore				 * However, the subobject did not get an extra reference count above.
1939e41d93c975d403380b7debe05517d630c8e2836Bob Moore				 *
1949e41d93c975d403380b7debe05517d630c8e2836Bob Moore				 * TBD: should ex_resolve_node_to_value be changed to fix this?
1959e41d93c975d403380b7debe05517d630c8e2836Bob Moore				 */
1969e41d93c975d403380b7debe05517d630c8e2836Bob Moore			case ACPI_TYPE_DEVICE:
1979e41d93c975d403380b7debe05517d630c8e2836Bob Moore			case ACPI_TYPE_THERMAL:
1989e41d93c975d403380b7debe05517d630c8e2836Bob Moore
1999e41d93c975d403380b7debe05517d630c8e2836Bob Moore				acpi_ut_add_reference(op->common.node->object);
2009e41d93c975d403380b7debe05517d630c8e2836Bob Moore
2019e41d93c975d403380b7debe05517d630c8e2836Bob Moore				/*lint -fallthrough */
2029e41d93c975d403380b7debe05517d630c8e2836Bob Moore				/*
2039e41d93c975d403380b7debe05517d630c8e2836Bob Moore				 * For these types, we need the actual node, not the subobject.
2049e41d93c975d403380b7debe05517d630c8e2836Bob Moore				 * The subobject got an extra reference count in ex_resolve_node_to_value.
205152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				 */
206152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			case ACPI_TYPE_MUTEX:
207152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			case ACPI_TYPE_METHOD:
208152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			case ACPI_TYPE_POWER:
209152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			case ACPI_TYPE_PROCESSOR:
210152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			case ACPI_TYPE_EVENT:
211152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			case ACPI_TYPE_REGION:
212152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore
2139e41d93c975d403380b7debe05517d630c8e2836Bob Moore				/* We will create a reference object for these types below */
214152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				break;
215152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore
216152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			default:
2179e41d93c975d403380b7debe05517d630c8e2836Bob Moore				/*
2189e41d93c975d403380b7debe05517d630c8e2836Bob Moore				 * All other types - the node was resolved to an actual
2199e41d93c975d403380b7debe05517d630c8e2836Bob Moore				 * object, we are done.
2209e41d93c975d403380b7debe05517d630c8e2836Bob Moore				 */
221152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				goto exit;
222152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			}
223152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore		}
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
226defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore	/* Create and init a new internal ACPI object */
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2284be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	obj_desc = acpi_ut_create_internal_object((acpi_ps_get_opcode_info
2294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown						   (op->common.aml_opcode))->
2304be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown						  object_type);
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!obj_desc) {
2324be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(AE_NO_MEMORY);
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2354be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	status =
2364be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	    acpi_ds_init_object_from_op(walk_state, op, op->common.aml_opcode,
2374be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					&obj_desc);
2384be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (ACPI_FAILURE(status)) {
2394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		acpi_ut_remove_reference(obj_desc);
2404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(status);
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
243152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore      exit:
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*obj_desc_ptr = obj_desc;
2459e41d93c975d403380b7debe05517d630c8e2836Bob Moore	return_ACPI_STATUS(status);
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
24844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ds_build_internal_buffer_obj
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  walk_state      - Current walk state
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Op              - Parser object to be translated
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              buffer_length   - Length of the buffer
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              obj_desc_ptr    - Where the ACPI internal object is returned
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Translate a parser Op package object to the equivalent
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              namespace object
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
26244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status
2654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state,
2664be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  union acpi_parse_object *op,
2674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  u32 buffer_length,
2684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  union acpi_operand_object **obj_desc_ptr)
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_parse_object *arg;
2714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *obj_desc;
2724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_parse_object *byte_list;
2734be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	u32 byte_list_length = 0;
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
275b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore	ACPI_FUNCTION_TRACE(ds_build_internal_buffer_obj);
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
277defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore	/*
278defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore	 * If we are evaluating a Named buffer object "Name (xxxx, Buffer)".
279defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore	 * The buffer object already exists (from the NS node), otherwise it must
280defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore	 * be created.
281defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore	 */
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	obj_desc = *obj_desc_ptr;
283defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore	if (!obj_desc) {
28452fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Create a new buffer object */
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2874be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER);
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*obj_desc_ptr = obj_desc;
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!obj_desc) {
2904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			return_ACPI_STATUS(AE_NO_MEMORY);
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Second arg is the buffer data (optional) byte_list can be either
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * individual bytes or a string initializer.  In either case, a
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * byte_list appears in the AML.
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
2994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	arg = op->common.value.arg;	/* skip first arg */
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	byte_list = arg->named.next;
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (byte_list) {
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (byte_list->common.aml_opcode != AML_INT_BYTELIST_OP) {
304b8e4d89357fc434618a59c1047cac72641191805Bob Moore			ACPI_ERROR((AE_INFO,
305f6a22b0bc417042e83117f52ab1a03696af185abBob Moore				    "Expecting bytelist, found AML opcode 0x%X in op %p",
306b8e4d89357fc434618a59c1047cac72641191805Bob Moore				    byte_list->common.aml_opcode, byte_list));
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3084be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			acpi_ut_remove_reference(obj_desc);
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return (AE_TYPE);
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		byte_list_length = (u32) byte_list->common.value.integer;
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * The buffer length (number of bytes) will be the larger of:
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * 1) The specified buffer length and
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * 2) The length of the initializer byte list
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	obj_desc->buffer.length = buffer_length;
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (byte_list_length > buffer_length) {
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		obj_desc->buffer.length = byte_list_length;
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Allocate the buffer */
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (obj_desc->buffer.length == 0) {
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		obj_desc->buffer.pointer = NULL;
3294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
3304be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  "Buffer defined with zero length in AML, creating\n"));
3314be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	} else {
3324be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		obj_desc->buffer.pointer =
3338313524a0d466f451a62709aaedf988d8257b21cBob Moore		    ACPI_ALLOCATE_ZEROED(obj_desc->buffer.length);
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!obj_desc->buffer.pointer) {
3354be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			acpi_ut_delete_object_desc(obj_desc);
3364be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			return_ACPI_STATUS(AE_NO_MEMORY);
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Initialize buffer from the byte_list (if present) */
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (byte_list) {
3424be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			ACPI_MEMCPY(obj_desc->buffer.pointer,
3434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				    byte_list->named.data, byte_list_length);
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	obj_desc->buffer.flags |= AOPOBJ_DATA_VALID;
3488f9337c88335846b01801b1047a4caf10527a320Bob Moore	op->common.node = ACPI_CAST_PTR(struct acpi_namespace_node, obj_desc);
3494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(AE_OK);
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
35244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ds_build_internal_package_obj
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  walk_state      - Current walk state
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Op              - Parser object to be translated
3588f9337c88335846b01801b1047a4caf10527a320Bob Moore *              element_count   - Number of elements in the package - this is
3598f9337c88335846b01801b1047a4caf10527a320Bob Moore *                                the num_elements argument to Package()
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              obj_desc_ptr    - Where the ACPI internal object is returned
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Translate a parser Op package object to the equivalent
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              namespace object
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3678f9337c88335846b01801b1047a4caf10527a320Bob Moore * NOTE: The number of elements in the package will be always be the num_elements
3688f9337c88335846b01801b1047a4caf10527a320Bob Moore * count, regardless of the number of elements in the package list. If
3698f9337c88335846b01801b1047a4caf10527a320Bob Moore * num_elements is smaller, only that many package list elements are used.
3708f9337c88335846b01801b1047a4caf10527a320Bob Moore * if num_elements is larger, the Package object is padded out with
3718f9337c88335846b01801b1047a4caf10527a320Bob Moore * objects of type Uninitialized (as per ACPI spec.)
3728f9337c88335846b01801b1047a4caf10527a320Bob Moore *
3738f9337c88335846b01801b1047a4caf10527a320Bob Moore * Even though the ASL compilers do not allow num_elements to be smaller
3748f9337c88335846b01801b1047a4caf10527a320Bob Moore * than the Package list length (for the fixed length package opcode), some
3758f9337c88335846b01801b1047a4caf10527a320Bob Moore * BIOS code modifies the AML on the fly to adjust the num_elements, and
3768f9337c88335846b01801b1047a4caf10527a320Bob Moore * this code compensates for that. This also provides compatibility with
3778f9337c88335846b01801b1047a4caf10527a320Bob Moore * other AML interpreters.
3788f9337c88335846b01801b1047a4caf10527a320Bob Moore *
37944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status
3824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
3834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				   union acpi_parse_object *op,
3848f9337c88335846b01801b1047a4caf10527a320Bob Moore				   u32 element_count,
3854be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				   union acpi_operand_object **obj_desc_ptr)
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3874be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_parse_object *arg;
3884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_parse_object *parent;
3894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *obj_desc = NULL;
3904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status = AE_OK;
3910ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore	unsigned i;
39291d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore	u16 index;
39391d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore	u16 reference_count;
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
395b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore	ACPI_FUNCTION_TRACE(ds_build_internal_package_obj);
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Find the parent of a possibly nested package */
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	parent = op->common.parent;
4004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	while ((parent->common.aml_opcode == AML_PACKAGE_OP) ||
4014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	       (parent->common.aml_opcode == AML_VAR_PACKAGE_OP)) {
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		parent = parent->common.parent;
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
405defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore	/*
406defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore	 * If we are evaluating a Named package object "Name (xxxx, Package)",
407defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore	 * the package object already exists, otherwise it must be created.
408defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore	 */
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	obj_desc = *obj_desc_ptr;
410defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore	if (!obj_desc) {
4114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE);
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*obj_desc_ptr = obj_desc;
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!obj_desc) {
4144be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			return_ACPI_STATUS(AE_NO_MEMORY);
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		obj_desc->package.node = parent->common.node;
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
4218f9337c88335846b01801b1047a4caf10527a320Bob Moore	 * Allocate the element array (array of pointers to the individual
4228f9337c88335846b01801b1047a4caf10527a320Bob Moore	 * objects) based on the num_elements parameter. Add an extra pointer slot
4238f9337c88335846b01801b1047a4caf10527a320Bob Moore	 * so that the list is always null terminated.
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
4258313524a0d466f451a62709aaedf988d8257b21cBob Moore	obj_desc->package.elements = ACPI_ALLOCATE_ZEROED(((acpi_size)
4268f9337c88335846b01801b1047a4caf10527a320Bob Moore							   element_count +
4278313524a0d466f451a62709aaedf988d8257b21cBob Moore							   1) * sizeof(void *));
4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!obj_desc->package.elements) {
4304be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		acpi_ut_delete_object_desc(obj_desc);
4314be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(AE_NO_MEMORY);
4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4348f9337c88335846b01801b1047a4caf10527a320Bob Moore	obj_desc->package.count = element_count;
4358f9337c88335846b01801b1047a4caf10527a320Bob Moore
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
4378f9337c88335846b01801b1047a4caf10527a320Bob Moore	 * Initialize the elements of the package, up to the num_elements count.
4388f9337c88335846b01801b1047a4caf10527a320Bob Moore	 * Package is automatically padded with uninitialized (NULL) elements
4398f9337c88335846b01801b1047a4caf10527a320Bob Moore	 * if num_elements is greater than the package list length. Likewise,
4408f9337c88335846b01801b1047a4caf10527a320Bob Moore	 * Package is truncated if num_elements is less than the list length.
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	arg = op->common.value.arg;
4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	arg = arg->common.next;
4448f9337c88335846b01801b1047a4caf10527a320Bob Moore	for (i = 0; arg && (i < element_count); i++) {
4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
446152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			if (arg->common.node->type == ACPI_TYPE_METHOD) {
447152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				/*
448152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				 * A method reference "looks" to the parser to be a method
449152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				 * invocation, so we special case it here
450152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				 */
451152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				arg->common.aml_opcode = AML_INT_NAMEPATH_OP;
452152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				status =
453152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				    acpi_ds_build_internal_object(walk_state,
454152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore								  arg,
455152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore								  &obj_desc->
456152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore								  package.
457152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore								  elements[i]);
458152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			} else {
459152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				/* This package element is already built, just get it */
460152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore
461152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				obj_desc->package.elements[i] =
462152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore				    ACPI_CAST_PTR(union acpi_operand_object,
463152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore						  arg->common.node);
464152c300d007c70c4a1847dad39ecdaba22e7d457Bob Moore			}
4654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		} else {
4664be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			status = acpi_ds_build_internal_object(walk_state, arg,
4674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							       &obj_desc->
4684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							       package.
4694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							       elements[i]);
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
47191d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore
47291d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore		if (*obj_desc_ptr) {
47391d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore
47491d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore			/* Existing package, get existing reference count */
47591d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore
47691d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore			reference_count =
47791d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore			    (*obj_desc_ptr)->common.reference_count;
47891d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore			if (reference_count > 1) {
47991d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore
48091d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore				/* Make new element ref count match original ref count */
48191d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore
48291d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore				for (index = 0; index < (reference_count - 1);
48391d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore				     index++) {
48491d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore					acpi_ut_add_reference((obj_desc->
48591d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore							       package.
48691d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore							       elements[i]));
48791d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore				}
48891d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore			}
48991d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore		}
49091d02132fea3a60d3db7bd72933e38e36cd9e4c7Bob Moore
4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		arg = arg->common.next;
4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4940ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore	/* Check for match between num_elements and actual length of package_list */
4950ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore
4960ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore	if (arg) {
4970ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore		/*
4980ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore		 * num_elements was exhausted, but there are remaining elements in the
499e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore		 * package_list. Truncate the package to num_elements.
5000ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore		 *
5010ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore		 * Note: technically, this is an error, from ACPI spec: "It is an error
5020ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore		 * for NumElements to be less than the number of elements in the
5037d5d05d0704127c9acd24090c14731c111bd0af1Bob Moore		 * PackageList". However, we just print a message and
504e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore		 * no exception is returned. This provides Windows compatibility. Some
505e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore		 * BIOSs will alter the num_elements on the fly, creating this type
506e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore		 * of ill-formed package object.
5070ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore		 */
5080ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore		while (arg) {
509e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore			/*
510e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore			 * We must delete any package elements that were created earlier
511e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore			 * and are not going to be used because of the package truncation.
512e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore			 */
513e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore			if (arg->common.node) {
514e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore				acpi_ut_remove_reference(ACPI_CAST_PTR
515e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore							 (union
516e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore							  acpi_operand_object,
517e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore							  arg->common.node));
518e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore				arg->common.node = NULL;
519e3fe0913b8e732ae636cf23afca76cf2c30718e5Bob Moore			}
5200ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore
5210ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore			/* Find out how many elements there really are */
5220ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore
5230ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore			i++;
5240ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore			arg = arg->common.next;
5250ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore		}
5260ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore
5277d5d05d0704127c9acd24090c14731c111bd0af1Bob Moore		ACPI_INFO((AE_INFO,
528f6a22b0bc417042e83117f52ab1a03696af185abBob Moore			   "Actual Package length (%u) is larger than NumElements field (%u), truncated\n",
5297d5d05d0704127c9acd24090c14731c111bd0af1Bob Moore			   i, element_count));
5300ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore	} else if (i < element_count) {
5310ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore		/*
5320ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore		 * Arg list (elements) was exhausted, but we did not reach num_elements count.
5330ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore		 * Note: this is not an error, the package is padded out with NULLs.
5340ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore		 */
5358f9337c88335846b01801b1047a4caf10527a320Bob Moore		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
536f6a22b0bc417042e83117f52ab1a03696af185abBob Moore				  "Package List length (%u) smaller than NumElements count (%u), padded with null elements\n",
5370ba7d25c70699cdd3e06fc049d8884ee54b9d5dbBob Moore				  i, element_count));
5388f9337c88335846b01801b1047a4caf10527a320Bob Moore	}
5398f9337c88335846b01801b1047a4caf10527a320Bob Moore
5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	obj_desc->package.flags |= AOPOBJ_DATA_VALID;
5418f9337c88335846b01801b1047a4caf10527a320Bob Moore	op->common.node = ACPI_CAST_PTR(struct acpi_namespace_node, obj_desc);
5424be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(status);
5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ds_create_node
5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  walk_state      - Current walk state
5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Node            - NS Node to be initialized
5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Op              - Parser object to be translated
5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Create the object to be associated with a namespace node
5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
55744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status
5604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ds_create_node(struct acpi_walk_state *walk_state,
5614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    struct acpi_namespace_node *node,
5624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    union acpi_parse_object *op)
5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5644be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status;
5654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *obj_desc;
5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
567b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore	ACPI_FUNCTION_TRACE_PTR(ds_create_node, op);
5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Because of the execution pass through the non-control-method
5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * parts of the table, we can arrive here twice.  Only init
5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * the named object node the first time through
5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
5744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (acpi_ns_get_attached_object(node)) {
5754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(AE_OK);
5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!op->common.value.arg) {
57952fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore
5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* No arguments, there is nothing to do */
5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(AE_OK);
5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Build an internal object for the argument(s) */
5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5874be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	status = acpi_ds_build_internal_object(walk_state, op->common.value.arg,
5884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					       &obj_desc);
5894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (ACPI_FAILURE(status)) {
5904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(status);
5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Re-type the object according to its argument */
5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5953371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore	node->type = obj_desc->common.type;
5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Attach obj to node */
5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	status = acpi_ns_attach_object(node, obj_desc, node->type);
6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Remove local reference to the object */
6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_ut_remove_reference(obj_desc);
6044be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(status);
6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6074be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown#endif				/* ACPI_NO_METHOD_EXECUTION */
6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/*******************************************************************************
6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ds_init_object_from_op
6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  walk_state      - Current walk state
6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Op              - Parser op used to init the internal object
6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              Opcode          - AML opcode associated with the object
6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              ret_obj_desc    - Namespace object to be initialized
6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Initialize a namespace object from a parser Op and its
6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              associated arguments.  The namespace object is a more compact
6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              representation of the Op and its arguments.
6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
62444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore ******************************************************************************/
6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status
6274be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
6284be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    union acpi_parse_object *op,
6294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    u16 opcode,
6304be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    union acpi_operand_object **ret_obj_desc)
6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
6324be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	const struct acpi_opcode_info *op_info;
6334be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *obj_desc;
6344be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status = AE_OK;
6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
636b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore	ACPI_FUNCTION_TRACE(ds_init_object_from_op);
6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	obj_desc = *ret_obj_desc;
6394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	op_info = acpi_ps_get_opcode_info(opcode);
6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (op_info->class == AML_CLASS_UNKNOWN) {
64152fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore
6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Unknown opcode */
6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(AE_TYPE);
6451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Perform per-object initialization */
6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6493371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore	switch (obj_desc->common.type) {
6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_BUFFER:
6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Defer evaluation of Buffer term_arg operand
6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
6558f9337c88335846b01801b1047a4caf10527a320Bob Moore		obj_desc->buffer.node =
6568f9337c88335846b01801b1047a4caf10527a320Bob Moore		    ACPI_CAST_PTR(struct acpi_namespace_node,
6578f9337c88335846b01801b1047a4caf10527a320Bob Moore				  walk_state->operands[0]);
6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		obj_desc->buffer.aml_start = op->named.data;
6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		obj_desc->buffer.aml_length = op->named.length;
6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_PACKAGE:
6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Defer evaluation of Package term_arg operand
6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
6678f9337c88335846b01801b1047a4caf10527a320Bob Moore		obj_desc->package.node =
6688f9337c88335846b01801b1047a4caf10527a320Bob Moore		    ACPI_CAST_PTR(struct acpi_namespace_node,
6698f9337c88335846b01801b1047a4caf10527a320Bob Moore				  walk_state->operands[0]);
6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		obj_desc->package.aml_start = op->named.data;
6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		obj_desc->package.aml_length = op->named.length;
6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_INTEGER:
6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (op_info->type) {
6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case AML_TYPE_CONSTANT:
6781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/*
6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 * Resolve AML Constants here - AND ONLY HERE!
6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 * All constants are integers.
68144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore			 * We mark the integer with a flag that indicates that it started
68244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore			 * life as a constant -- so that stores to constants will perform
68344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore			 * as expected (noop). zero_op is used as a placeholder for optional
68444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore			 * target operands.
6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 */
6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			obj_desc->common.flags = AOPOBJ_AML_CONSTANT;
6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (opcode) {
6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case AML_ZERO_OP:
6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				obj_desc->integer.value = 0;
6921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
6931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case AML_ONE_OP:
6951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				obj_desc->integer.value = 1;
6971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
6981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case AML_ONES_OP:
7001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7015df7e6cb42da36c7d878239bebc81907b15f3943Bob Moore				obj_desc->integer.value = ACPI_UINT64_MAX;
7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				/* Truncate value if we are executing from a 32-bit ACPI table */
7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef ACPI_NO_METHOD_EXECUTION
7064be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				acpi_ex_truncate_for32bit_table(obj_desc);
7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
7091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case AML_REVISION_OP:
7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				obj_desc->integer.value = ACPI_CA_VERSION;
7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			default:
7161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
717b8e4d89357fc434618a59c1047cac72641191805Bob Moore				ACPI_ERROR((AE_INFO,
718f6a22b0bc417042e83117f52ab1a03696af185abBob Moore					    "Unknown constant opcode 0x%X",
719b8e4d89357fc434618a59c1047cac72641191805Bob Moore					    opcode));
7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				status = AE_AML_OPERAND_TYPE;
7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
7221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
7241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case AML_TYPE_LITERAL:
7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			obj_desc->integer.value = op->common.value.integer;
7286f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore#ifndef ACPI_NO_METHOD_EXECUTION
7294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			acpi_ex_truncate_for32bit_table(obj_desc);
7306f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore#endif
7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
734f6a22b0bc417042e83117f52ab1a03696af185abBob Moore			ACPI_ERROR((AE_INFO, "Unknown Integer type 0x%X",
735b8e4d89357fc434618a59c1047cac72641191805Bob Moore				    op_info->type));
7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			status = AE_AML_OPERAND_TYPE;
7371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
7381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
7391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
7401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_STRING:
7421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		obj_desc->string.pointer = op->common.value.string;
7444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		obj_desc->string.length =
7454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    (u32) ACPI_STRLEN(op->common.value.string);
7461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
7481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * The string is contained in the ACPI table, don't ever try
7491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * to delete it
7501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
7511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		obj_desc->common.flags |= AOPOBJ_STATIC_POINTER;
7521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
7531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_METHOD:
7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
7561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_LOCAL_REFERENCE:
7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (op_info->type) {
7601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case AML_TYPE_LOCAL_VARIABLE:
7611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7621044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore			/* Local ID (0-7) is (AML opcode - base AML_LOCAL_OP) */
7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
764ba9c3f550e5792fbce2bbd7a429bf6f6d1f45fdaBob Moore			obj_desc->reference.value =
765ba9c3f550e5792fbce2bbd7a429bf6f6d1f45fdaBob Moore			    ((u32)opcode) - AML_LOCAL_OP;
7661044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore			obj_desc->reference.class = ACPI_REFCLASS_LOCAL;
7671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef ACPI_NO_METHOD_EXECUTION
7691044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore			status =
7701044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore			    acpi_ds_method_data_get_node(ACPI_REFCLASS_LOCAL,
7711044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore							 obj_desc->reference.
7721044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore							 value, walk_state,
7731044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore							 ACPI_CAST_INDIRECT_PTR
7741044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore							 (struct
7751044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore							  acpi_namespace_node,
7761044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore							  &obj_desc->reference.
7771044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore							  object));
7781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case AML_TYPE_METHOD_ARGUMENT:
7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7831044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore			/* Arg ID (0-6) is (AML opcode - base AML_ARG_OP) */
7841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
785ba9c3f550e5792fbce2bbd7a429bf6f6d1f45fdaBob Moore			obj_desc->reference.value = ((u32)opcode) - AML_ARG_OP;
7861044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore			obj_desc->reference.class = ACPI_REFCLASS_ARG;
7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef ACPI_NO_METHOD_EXECUTION
7891044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore			status = acpi_ds_method_data_get_node(ACPI_REFCLASS_ARG,
7904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							      obj_desc->
7911044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore							      reference.value,
7924be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							      walk_state,
79357e664cfd968ec8e4b0bfd80a5e8f903307e598bBob Moore							      ACPI_CAST_INDIRECT_PTR
7944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							      (struct
79557e664cfd968ec8e4b0bfd80a5e8f903307e598bBob Moore							       acpi_namespace_node,
79657e664cfd968ec8e4b0bfd80a5e8f903307e598bBob Moore							       &obj_desc->
79757e664cfd968ec8e4b0bfd80a5e8f903307e598bBob Moore							       reference.
79857e664cfd968ec8e4b0bfd80a5e8f903307e598bBob Moore							       object));
7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8021044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore		default:	/* Object name or Debug object */
8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8041044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore			switch (op->common.aml_opcode) {
8051044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore			case AML_INT_NAMEPATH_OP:
80652fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore
8071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				/* Node was saved in Op */
8081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				obj_desc->reference.node = op->common.node;
8109e41d93c975d403380b7debe05517d630c8e2836Bob Moore				obj_desc->reference.object =
8119e41d93c975d403380b7debe05517d630c8e2836Bob Moore				    op->common.node->object;
8121044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore				obj_desc->reference.class = ACPI_REFCLASS_NAME;
8131044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore				break;
8141044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore
8151044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore			case AML_DEBUG_OP:
8161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8171044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore				obj_desc->reference.class = ACPI_REFCLASS_DEBUG;
8181044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore				break;
8191044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore
8201044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore			default:
8211044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore
8221044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore				ACPI_ERROR((AE_INFO,
823f6a22b0bc417042e83117f52ab1a03696af185abBob Moore					    "Unimplemented reference type for AML opcode: 0x%4.4X",
8241044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore					    opcode));
8251044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore				return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
8261044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore			}
8271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
8281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
8291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
8301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
8321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
833f6a22b0bc417042e83117f52ab1a03696af185abBob Moore		ACPI_ERROR((AE_INFO, "Unimplemented data type: 0x%X",
8343371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore			    obj_desc->common.type));
8351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		status = AE_AML_OPERAND_TYPE;
8371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
8381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
8391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(status);
8411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
842