utobject.c revision bd48d677670bb35548718a1fd54c2c114a449973
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/****************************************************************************** 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module Name: utobject - ACPI object create/delete/size/cache routines 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *****************************************************************************/ 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 825f044e64568dd83de34c16c837a96bbb2b0cecbBob Moore * Copyright (C) 2000 - 2013, 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 "acnamesp.h" 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPONENT ACPI_UTILITIES 494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen BrownACPI_MODULE_NAME("utobject") 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/* Local prototypes */ 5244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_get_simple_object_size(union acpi_operand_object *obj, 544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_size * obj_length); 5544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 5644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_get_package_object_size(union acpi_operand_object *obj, 584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_size * obj_length); 5944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 6044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_get_element_length(u8 object_type, 624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *source_object, 634be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state *state, void *context); 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_create_internal_object_dbg 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: module_name - Source file name of caller 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * line_number - Line number of caller 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * component_id - Component type of caller 72ba494beeaa69bc0fb01eb89464ad5d57d26e3901Bob Moore * type - ACPI Type of the new object 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 7444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * RETURN: A new internal object, null on failure 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Create and initialize a new internal object. 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NOTE: We always allocate the worst-case object descriptor because 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * these objects are cached, and we want them to be 8073a3090a2160fb01317f5a44af6ee5a064a29625Bob Moore * one-size-satisifies-any-request. This in itself may not be 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the most memory efficient, but the efficiency of the object 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * cache should more than make up for this! 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 864b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Mooreunion acpi_operand_object *acpi_ut_create_internal_object_dbg(const char 874b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moore *module_name, 884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 line_number, 894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 component_id, 904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_object_type 914be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown type) 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 934be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *object; 944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *second_object; 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 96b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_STR(ut_create_internal_object_dbg, 974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_get_type_name(type)); 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Allocate the raw object descriptor */ 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown object = 1024be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_allocate_object_desc_dbg(module_name, line_number, 1034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown component_id); 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!object) { 1054be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(NULL); 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (type) { 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_REGION: 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_BUFFER_FIELD: 111ef805d956320ffa36d068673d5c5eb2a7d13209bLin Ming case ACPI_TYPE_LOCAL_BANK_FIELD: 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* These types require a secondary object */ 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1154be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown second_object = acpi_ut_allocate_object_desc_dbg(module_name, 1164be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown line_number, 1174be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown component_id); 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!second_object) { 1194be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_delete_object_desc(object); 1204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(NULL); 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds second_object->common.type = ACPI_TYPE_LOCAL_EXTRA; 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds second_object->common.reference_count = 1; 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Link the second object to the first */ 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds object->common.next_object = second_object; 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 1321d1ea1b723d9f239f736b8cf284327cbbf9d15d1Chao Guan 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* All others have no secondary object */ 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Save the object type in the object descriptor */ 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds object->common.type = (u8) type; 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Init the reference count */ 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds object->common.reference_count = 1; 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Any per-type initialization should go here */ 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(object); 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1526287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * FUNCTION: acpi_ut_create_package_object 1536287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * 154ba494beeaa69bc0fb01eb89464ad5d57d26e3901Bob Moore * PARAMETERS: count - Number of package elements 1556287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * 1566287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * RETURN: Pointer to a new Package object, null on failure 1576287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * 1586287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * DESCRIPTION: Create a fully initialized package object 1596287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * 1606287ee32952b502c23d54f12895c3895ddbe5013Bob Moore ******************************************************************************/ 1616287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 1626287ee32952b502c23d54f12895c3895ddbe5013Bob Mooreunion acpi_operand_object *acpi_ut_create_package_object(u32 count) 1636287ee32952b502c23d54f12895c3895ddbe5013Bob Moore{ 1646287ee32952b502c23d54f12895c3895ddbe5013Bob Moore union acpi_operand_object *package_desc; 1656287ee32952b502c23d54f12895c3895ddbe5013Bob Moore union acpi_operand_object **package_elements; 1666287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 1676287ee32952b502c23d54f12895c3895ddbe5013Bob Moore ACPI_FUNCTION_TRACE_U32(ut_create_package_object, count); 1686287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 1696287ee32952b502c23d54f12895c3895ddbe5013Bob Moore /* Create a new Package object */ 1706287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 1716287ee32952b502c23d54f12895c3895ddbe5013Bob Moore package_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE); 1726287ee32952b502c23d54f12895c3895ddbe5013Bob Moore if (!package_desc) { 1736287ee32952b502c23d54f12895c3895ddbe5013Bob Moore return_PTR(NULL); 1746287ee32952b502c23d54f12895c3895ddbe5013Bob Moore } 1756287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 1766287ee32952b502c23d54f12895c3895ddbe5013Bob Moore /* 1776287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * Create the element array. Count+1 allows the array to be null 1786287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * terminated. 1796287ee32952b502c23d54f12895c3895ddbe5013Bob Moore */ 18067a119f990063f5662574f6d6414fe9bc5ece86aBob Moore package_elements = ACPI_ALLOCATE_ZEROED(((acpi_size) count + 18167a119f990063f5662574f6d6414fe9bc5ece86aBob Moore 1) * sizeof(void *)); 1826287ee32952b502c23d54f12895c3895ddbe5013Bob Moore if (!package_elements) { 183bd48d677670bb35548718a1fd54c2c114a449973Lv Zheng ACPI_FREE(package_desc); 1846287ee32952b502c23d54f12895c3895ddbe5013Bob Moore return_PTR(NULL); 1856287ee32952b502c23d54f12895c3895ddbe5013Bob Moore } 1866287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 1876287ee32952b502c23d54f12895c3895ddbe5013Bob Moore package_desc->package.count = count; 1886287ee32952b502c23d54f12895c3895ddbe5013Bob Moore package_desc->package.elements = package_elements; 1896287ee32952b502c23d54f12895c3895ddbe5013Bob Moore return_PTR(package_desc); 1906287ee32952b502c23d54f12895c3895ddbe5013Bob Moore} 1916287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 1926287ee32952b502c23d54f12895c3895ddbe5013Bob Moore/******************************************************************************* 1936287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * 194502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * FUNCTION: acpi_ut_create_integer_object 195502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * 196502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * PARAMETERS: initial_value - Initial value for the integer 197502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * 198502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * RETURN: Pointer to a new Integer object, null on failure 199502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * 200502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * DESCRIPTION: Create an initialized integer object 201502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * 202502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore ******************************************************************************/ 203502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore 204502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Mooreunion acpi_operand_object *acpi_ut_create_integer_object(u64 initial_value) 205502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore{ 206502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore union acpi_operand_object *integer_desc; 207502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore 208502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore ACPI_FUNCTION_TRACE(ut_create_integer_object); 209502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore 210502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore /* Create and initialize a new integer object */ 211502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore 212502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore integer_desc = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER); 213502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore if (!integer_desc) { 214502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore return_PTR(NULL); 215502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore } 216502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore 217502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore integer_desc->integer.value = initial_value; 218502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore return_PTR(integer_desc); 219502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore} 220502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore 221502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore/******************************************************************************* 222502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_create_buffer_object 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: buffer_size - Size of buffer to be created 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 22744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * RETURN: Pointer to a new Buffer object, null on failure 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Create a fully initialized buffer object 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2334be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownunion acpi_operand_object *acpi_ut_create_buffer_object(acpi_size buffer_size) 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2354be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *buffer_desc; 2364be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u8 *buffer = NULL; 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 238b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_U32(ut_create_buffer_object, buffer_size); 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Create a new Buffer object */ 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2424be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown buffer_desc = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER); 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!buffer_desc) { 2444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(NULL); 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Create an actual buffer only if size > 0 */ 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (buffer_size > 0) { 25052fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Allocate the actual buffer */ 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2538313524a0d466f451a62709aaedf988d8257b21cBob Moore buffer = ACPI_ALLOCATE_ZEROED(buffer_size); 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!buffer) { 255f6a22b0bc417042e83117f52ab1a03696af185abBob Moore ACPI_ERROR((AE_INFO, "Could not allocate size %u", 256b8e4d89357fc434618a59c1047cac72641191805Bob Moore (u32) buffer_size)); 2574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_remove_reference(buffer_desc); 2584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(NULL); 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Complete buffer object initialization */ 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buffer_desc->buffer.flags |= AOPOBJ_DATA_VALID; 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buffer_desc->buffer.pointer = buffer; 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buffer_desc->buffer.length = (u32) buffer_size; 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Return the new buffer descriptor */ 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(buffer_desc); 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_create_string_object 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 27744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: string_size - Size of string to be created. Does not 27844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * include NULL terminator, this is added 27944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * automatically. 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Pointer to a new String object 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Create a fully initialized string object 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2874be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownunion acpi_operand_object *acpi_ut_create_string_object(acpi_size string_size) 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *string_desc; 2904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown char *string; 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 292b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_U32(ut_create_string_object, string_size); 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Create a new String object */ 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown string_desc = acpi_ut_create_internal_object(ACPI_TYPE_STRING); 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!string_desc) { 2984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(NULL); 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Allocate the actual string buffer -- (Size + 1) for NULL terminator. 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NOTE: Zero-length strings are NULL terminated 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3058313524a0d466f451a62709aaedf988d8257b21cBob Moore string = ACPI_ALLOCATE_ZEROED(string_size + 1); 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!string) { 307f6a22b0bc417042e83117f52ab1a03696af185abBob Moore ACPI_ERROR((AE_INFO, "Could not allocate size %u", 308b8e4d89357fc434618a59c1047cac72641191805Bob Moore (u32) string_size)); 3094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_remove_reference(string_desc); 3104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(NULL); 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Complete string object initialization */ 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds string_desc->string.pointer = string; 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds string_desc->string.length = (u32) string_size; 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Return the new string descriptor */ 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(string_desc); 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_valid_internal_object 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 327ba494beeaa69bc0fb01eb89464ad5d57d26e3901Bob Moore * PARAMETERS: object - Object to be validated 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 32944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * RETURN: TRUE if object is valid, FALSE otherwise 33044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * 331cf48958e84abb3b2dbb4202d0edbfce6aff65ce7Bob Moore * DESCRIPTION: Validate a pointer to be of type union acpi_operand_object 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3354be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownu8 acpi_ut_valid_internal_object(void *object) 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 338b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_NAME(ut_valid_internal_object); 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Check for a null pointer */ 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!object) { 3437bcc06e845479bde939059bafa088bf25ede9dbfBob Moore ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "**** Null Object Ptr\n")); 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (FALSE); 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Check the descriptor type field */ 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown switch (ACPI_GET_DESCRIPTOR_TYPE(object)) { 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_DESC_TYPE_OPERAND: 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 352cf48958e84abb3b2dbb4202d0edbfce6aff65ce7Bob Moore /* The object appears to be a valid union acpi_operand_object */ 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (TRUE); 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 3571d1ea1b723d9f239f736b8cf284327cbbf9d15d1Chao Guan 3587bcc06e845479bde939059bafa088bf25ede9dbfBob Moore ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 3594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown "%p is not not an ACPI operand obj [%s]\n", 3604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown object, acpi_ut_get_descriptor_name(object))); 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (FALSE); 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_allocate_object_desc_dbg 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: module_name - Caller's module name (for error output) 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * line_number - Caller's line number (for error output) 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * component_id - Caller's component ID (for error output) 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 37573a3090a2160fb01317f5a44af6ee5a064a29625Bob Moore * RETURN: Pointer to newly allocated object descriptor. Null on error 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 37773a3090a2160fb01317f5a44af6ee5a064a29625Bob Moore * DESCRIPTION: Allocate a new object descriptor. Gracefully handle 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * error conditions. 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3824b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moorevoid *acpi_ut_allocate_object_desc_dbg(const char *module_name, 3834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 line_number, u32 component_id) 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3854be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *object; 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 387b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(ut_allocate_object_desc_dbg); 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown object = acpi_os_acquire_object(acpi_gbl_operand_cache); 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!object) { 391b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((module_name, line_number, 392b8e4d89357fc434618a59c1047cac72641191805Bob Moore "Could not allocate an object descriptor")); 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(NULL); 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Mark the descriptor type */ 3988313524a0d466f451a62709aaedf988d8257b21cBob Moore 39973459f73e5d1602c59ebec114fc45185521353c1Robert Moore memset(object, 0, sizeof(union acpi_operand_object)); 4004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_SET_DESCRIPTOR_TYPE(object, ACPI_DESC_TYPE_OPERAND); 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4024be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "%p Size %X\n", 4034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown object, (u32) sizeof(union acpi_operand_object))); 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4054be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(object); 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_delete_object_desc 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 412ba494beeaa69bc0fb01eb89464ad5d57d26e3901Bob Moore * PARAMETERS: object - An Acpi internal object to be deleted 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: None. 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Free an ACPI object descriptor or add it to the object cache 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownvoid acpi_ut_delete_object_desc(union acpi_operand_object *object) 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 422b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_PTR(ut_delete_object_desc, object); 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 42475c8044fb38051713000e0d151852f5f9614f77bLv Zheng /* Object must be of type union acpi_operand_object */ 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4264be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_GET_DESCRIPTOR_TYPE(object) != ACPI_DESC_TYPE_OPERAND) { 427b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((AE_INFO, 428b8e4d89357fc434618a59c1047cac72641191805Bob Moore "%p is not an ACPI Operand object [%s]", object, 429b8e4d89357fc434618a59c1047cac72641191805Bob Moore acpi_ut_get_descriptor_name(object))); 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return_VOID; 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4334be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (void)acpi_os_release_object(acpi_gbl_operand_cache, object); 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return_VOID; 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_get_simple_object_size 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 44144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: internal_object - An ACPI operand object 44244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * obj_length - Where the length is returned 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to determine the space required to 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * contain a simple object for return to an external user. 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The length includes the object structure plus any additional 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * needed space. 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 45444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 4554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_get_simple_object_size(union acpi_operand_object *internal_object, 4564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_size * obj_length) 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_size length; 4593c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore acpi_size size; 4604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 462b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_PTR(ut_get_simple_object_size, internal_object); 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 464130797a6c3f1421c10880a1681d6a9c57b80ef17Lv Zheng /* Start with the length of the (external) Acpi object */ 465130797a6c3f1421c10880a1681d6a9c57b80ef17Lv Zheng 466130797a6c3f1421c10880a1681d6a9c57b80ef17Lv Zheng length = sizeof(union acpi_object); 467130797a6c3f1421c10880a1681d6a9c57b80ef17Lv Zheng 468130797a6c3f1421c10880a1681d6a9c57b80ef17Lv Zheng /* A NULL object is allowed, can be a legal uninitialized package element */ 469130797a6c3f1421c10880a1681d6a9c57b80ef17Lv Zheng 470130797a6c3f1421c10880a1681d6a9c57b80ef17Lv Zheng if (!internal_object) { 47144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore /* 472130797a6c3f1421c10880a1681d6a9c57b80ef17Lv Zheng * Object is NULL, just return the length of union acpi_object 473130797a6c3f1421c10880a1681d6a9c57b80ef17Lv Zheng * (A NULL union acpi_object is an object of all zeroes.) 47444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore */ 475130797a6c3f1421c10880a1681d6a9c57b80ef17Lv Zheng *obj_length = ACPI_ROUND_UP_TO_NATIVE_WORD(length); 4764be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_OK); 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 479130797a6c3f1421c10880a1681d6a9c57b80ef17Lv Zheng /* A Namespace Node should never appear here */ 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_GET_DESCRIPTOR_TYPE(internal_object) == ACPI_DESC_TYPE_NAMED) { 48252fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 483130797a6c3f1421c10880a1681d6a9c57b80ef17Lv Zheng /* A namespace node should never get here */ 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 485130797a6c3f1421c10880a1681d6a9c57b80ef17Lv Zheng return_ACPI_STATUS(AE_AML_INTERNAL); 4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The final length depends on the object type 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Strings and Buffers are packed right up against the parent object and 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * must be accessed bytewise or there may be alignment problems on 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * certain processors 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4943371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore switch (internal_object->common.type) { 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_STRING: 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds length += (acpi_size) internal_object->string.length + 1; 4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_BUFFER: 5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds length += (acpi_size) internal_object->buffer.length; 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_INTEGER: 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_PROCESSOR: 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_POWER: 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5097a5bb9964512c5313af19310c6a3002ec54f7336Lin Ming /* No extra data for these types */ 5107a5bb9964512c5313af19310c6a3002ec54f7336Lin Ming 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_LOCAL_REFERENCE: 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5151044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore switch (internal_object->reference.class) { 5161044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore case ACPI_REFCLASS_NAME: 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Get the actual length of the full pathname to this object. 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The reference will be converted to the pathname to the object 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5213c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore size = 5223c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore acpi_ns_get_pathname_length(internal_object-> 5233c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore reference.node); 5243c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore if (!size) { 5253c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore return_ACPI_STATUS(AE_BAD_PARAMETER); 5263c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore } 5273c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore 5283c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore length += ACPI_ROUND_UP_TO_NATIVE_WORD(size); 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * No other reference opcodes are supported. 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Notably, Locals and Args are not supported, but this may be 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * required eventually. 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 537b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((AE_INFO, 538c2de3a49454cdc9ca42bbd5d742913421d049f59Bob Moore "Cannot convert to external object - " 539f6a22b0bc417042e83117f52ab1a03696af185abBob Moore "unsupported Reference Class [%s] 0x%X in object %p", 540c2de3a49454cdc9ca42bbd5d742913421d049f59Bob Moore acpi_ut_get_reference_name(internal_object), 5411044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore internal_object->reference.class, 542b8e4d89357fc434618a59c1047cac72641191805Bob Moore internal_object)); 5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds status = AE_TYPE; 5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 550c2de3a49454cdc9ca42bbd5d742913421d049f59Bob Moore ACPI_ERROR((AE_INFO, "Cannot convert to external object - " 551f6a22b0bc417042e83117f52ab1a03696af185abBob Moore "unsupported type [%s] 0x%X in object %p", 552c2de3a49454cdc9ca42bbd5d742913421d049f59Bob Moore acpi_ut_get_object_type_name(internal_object), 5533371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore internal_object->common.type, internal_object)); 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds status = AE_TYPE; 5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Account for the space required by the object rounded up to the next 56073a3090a2160fb01317f5a44af6ee5a064a29625Bob Moore * multiple of the machine word size. This keeps each object aligned 5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * on a machine word boundary. (preventing alignment faults on some 5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * machines.) 5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5644be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown *obj_length = ACPI_ROUND_UP_TO_NATIVE_WORD(length); 5654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_get_element_length 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: acpi_pkg_callback 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Get the length of one package element. 5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 58044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 5814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_get_element_length(u8 object_type, 5824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *source_object, 5834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state *state, void *context) 5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5854be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 5864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_pkg_info *info = (struct acpi_pkg_info *)context; 5874be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_size object_space; 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (object_type) { 5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_COPY_TYPE_SIMPLE: 5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Simple object - just get the size (Null object/entry is handled 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * here also) and sum it into the running package length 5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 5964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_get_simple_object_size(source_object, 5974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &object_space); 5984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (status); 6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info->length += object_space; 6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_COPY_TYPE_PACKAGE: 6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Package object - nothing much to do here, let the walk handle it */ 6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info->num_packages++; 6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds state->pkg.this_target_obj = NULL; 6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* No other types allowed */ 6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_BAD_PARAMETER); 6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (status); 6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_get_package_object_size 6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 62744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: internal_object - An ACPI internal object 62844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * obj_length - Where the length is returned 6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to determine the space required to 6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * contain a package object for return to an external user. 6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This is moderately complex since a package contains other 6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * objects including packages. 6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 64044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 6414be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_get_package_object_size(union acpi_operand_object *internal_object, 6424be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_size * obj_length) 6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 6454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_pkg_info info; 6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 647b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_PTR(ut_get_package_object_size, internal_object); 6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info.length = 0; 6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.object_space = 0; 6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.num_packages = 1; 6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_walk_package_tree(internal_object, NULL, 6544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_get_element_length, &info); 6554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 6564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We have handled all of the objects in all levels of the package. 6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * just add the length of the package objects themselves. 6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Round up to the next machine word. 6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6644be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info.length += ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object)) * 6654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (acpi_size) info.num_packages; 6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Return the total package length */ 6681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *obj_length = info.length; 6704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 6741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_get_object_size 6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 67744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: internal_object - An ACPI internal object 67844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * obj_length - Where the length will be returned 6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to determine the space required to 6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * contain an object for return to an API user. 6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 6884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_get_object_size(union acpi_operand_object *internal_object, 6894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_size * obj_length) 6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6914be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 6924be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown 6934be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_ENTRY(); 6944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown 6954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if ((ACPI_GET_DESCRIPTOR_TYPE(internal_object) == 6964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DESC_TYPE_OPERAND) 6973371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore && (internal_object->common.type == ACPI_TYPE_PACKAGE)) { 6984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 6994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_get_package_object_size(internal_object, 7004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown obj_length); 7014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 7024be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 7034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_get_simple_object_size(internal_object, obj_length); 7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (status); 7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 708