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