utobject.c revision 25f044e64568dd83de34c16c837a96bbb2b0cecb
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: 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* All others have no secondary object */ 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Save the object type in the object descriptor */ 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds object->common.type = (u8) type; 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Init the reference count */ 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds object->common.reference_count = 1; 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Any per-type initialization should go here */ 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(object); 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1516287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * FUNCTION: acpi_ut_create_package_object 1526287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * 153ba494beeaa69bc0fb01eb89464ad5d57d26e3901Bob Moore * PARAMETERS: count - Number of package elements 1546287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * 1556287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * RETURN: Pointer to a new Package object, null on failure 1566287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * 1576287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * DESCRIPTION: Create a fully initialized package object 1586287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * 1596287ee32952b502c23d54f12895c3895ddbe5013Bob Moore ******************************************************************************/ 1606287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 1616287ee32952b502c23d54f12895c3895ddbe5013Bob Mooreunion acpi_operand_object *acpi_ut_create_package_object(u32 count) 1626287ee32952b502c23d54f12895c3895ddbe5013Bob Moore{ 1636287ee32952b502c23d54f12895c3895ddbe5013Bob Moore union acpi_operand_object *package_desc; 1646287ee32952b502c23d54f12895c3895ddbe5013Bob Moore union acpi_operand_object **package_elements; 1656287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 1666287ee32952b502c23d54f12895c3895ddbe5013Bob Moore ACPI_FUNCTION_TRACE_U32(ut_create_package_object, count); 1676287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 1686287ee32952b502c23d54f12895c3895ddbe5013Bob Moore /* Create a new Package object */ 1696287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 1706287ee32952b502c23d54f12895c3895ddbe5013Bob Moore package_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE); 1716287ee32952b502c23d54f12895c3895ddbe5013Bob Moore if (!package_desc) { 1726287ee32952b502c23d54f12895c3895ddbe5013Bob Moore return_PTR(NULL); 1736287ee32952b502c23d54f12895c3895ddbe5013Bob Moore } 1746287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 1756287ee32952b502c23d54f12895c3895ddbe5013Bob Moore /* 1766287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * Create the element array. Count+1 allows the array to be null 1776287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * terminated. 1786287ee32952b502c23d54f12895c3895ddbe5013Bob Moore */ 17967a119f990063f5662574f6d6414fe9bc5ece86aBob Moore package_elements = ACPI_ALLOCATE_ZEROED(((acpi_size) count + 18067a119f990063f5662574f6d6414fe9bc5ece86aBob Moore 1) * sizeof(void *)); 1816287ee32952b502c23d54f12895c3895ddbe5013Bob Moore if (!package_elements) { 18283dd4504456d4b5e464d6ec4a7665e2c922db67fMyron Stowe acpi_ut_remove_reference(package_desc); 1836287ee32952b502c23d54f12895c3895ddbe5013Bob Moore return_PTR(NULL); 1846287ee32952b502c23d54f12895c3895ddbe5013Bob Moore } 1856287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 1866287ee32952b502c23d54f12895c3895ddbe5013Bob Moore package_desc->package.count = count; 1876287ee32952b502c23d54f12895c3895ddbe5013Bob Moore package_desc->package.elements = package_elements; 1886287ee32952b502c23d54f12895c3895ddbe5013Bob Moore return_PTR(package_desc); 1896287ee32952b502c23d54f12895c3895ddbe5013Bob Moore} 1906287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 1916287ee32952b502c23d54f12895c3895ddbe5013Bob Moore/******************************************************************************* 1926287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * 193502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * FUNCTION: acpi_ut_create_integer_object 194502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * 195502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * PARAMETERS: initial_value - Initial value for the integer 196502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * 197502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * RETURN: Pointer to a new Integer object, null on failure 198502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * 199502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * DESCRIPTION: Create an initialized integer object 200502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * 201502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore ******************************************************************************/ 202502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore 203502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Mooreunion acpi_operand_object *acpi_ut_create_integer_object(u64 initial_value) 204502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore{ 205502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore union acpi_operand_object *integer_desc; 206502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore 207502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore ACPI_FUNCTION_TRACE(ut_create_integer_object); 208502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore 209502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore /* Create and initialize a new integer object */ 210502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore 211502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore integer_desc = acpi_ut_create_internal_object(ACPI_TYPE_INTEGER); 212502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore if (!integer_desc) { 213502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore return_PTR(NULL); 214502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore } 215502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore 216502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore integer_desc->integer.value = initial_value; 217502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore return_PTR(integer_desc); 218502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore} 219502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore 220502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore/******************************************************************************* 221502f7efa6ae7c3f6d93dac417af521af1f56bcc7Bob Moore * 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_create_buffer_object 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: buffer_size - Size of buffer to be created 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 22644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * RETURN: Pointer to a new Buffer object, null on failure 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Create a fully initialized buffer object 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2324be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownunion acpi_operand_object *acpi_ut_create_buffer_object(acpi_size buffer_size) 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2344be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *buffer_desc; 2354be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u8 *buffer = NULL; 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 237b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_U32(ut_create_buffer_object, buffer_size); 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Create a new Buffer object */ 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2414be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown buffer_desc = acpi_ut_create_internal_object(ACPI_TYPE_BUFFER); 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!buffer_desc) { 2434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(NULL); 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Create an actual buffer only if size > 0 */ 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (buffer_size > 0) { 24952fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Allocate the actual buffer */ 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2528313524a0d466f451a62709aaedf988d8257b21cBob Moore buffer = ACPI_ALLOCATE_ZEROED(buffer_size); 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!buffer) { 254f6a22b0bc417042e83117f52ab1a03696af185abBob Moore ACPI_ERROR((AE_INFO, "Could not allocate size %u", 255b8e4d89357fc434618a59c1047cac72641191805Bob Moore (u32) buffer_size)); 2564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_remove_reference(buffer_desc); 2574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(NULL); 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Complete buffer object initialization */ 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buffer_desc->buffer.flags |= AOPOBJ_DATA_VALID; 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buffer_desc->buffer.pointer = buffer; 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buffer_desc->buffer.length = (u32) buffer_size; 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Return the new buffer descriptor */ 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(buffer_desc); 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_create_string_object 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 27644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: string_size - Size of string to be created. Does not 27744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * include NULL terminator, this is added 27844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * automatically. 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Pointer to a new String object 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Create a fully initialized string object 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownunion acpi_operand_object *acpi_ut_create_string_object(acpi_size string_size) 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *string_desc; 2894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown char *string; 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 291b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_U32(ut_create_string_object, string_size); 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Create a new String object */ 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown string_desc = acpi_ut_create_internal_object(ACPI_TYPE_STRING); 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!string_desc) { 2974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(NULL); 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Allocate the actual string buffer -- (Size + 1) for NULL terminator. 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NOTE: Zero-length strings are NULL terminated 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3048313524a0d466f451a62709aaedf988d8257b21cBob Moore string = ACPI_ALLOCATE_ZEROED(string_size + 1); 3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!string) { 306f6a22b0bc417042e83117f52ab1a03696af185abBob Moore ACPI_ERROR((AE_INFO, "Could not allocate size %u", 307b8e4d89357fc434618a59c1047cac72641191805Bob Moore (u32) string_size)); 3084be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_remove_reference(string_desc); 3094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(NULL); 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Complete string object initialization */ 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds string_desc->string.pointer = string; 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds string_desc->string.length = (u32) string_size; 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Return the new string descriptor */ 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3194be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(string_desc); 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_valid_internal_object 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 326ba494beeaa69bc0fb01eb89464ad5d57d26e3901Bob Moore * PARAMETERS: object - Object to be validated 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 32844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * RETURN: TRUE if object is valid, FALSE otherwise 32944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * 330cf48958e84abb3b2dbb4202d0edbfce6aff65ce7Bob Moore * DESCRIPTION: Validate a pointer to be of type union acpi_operand_object 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3344be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownu8 acpi_ut_valid_internal_object(void *object) 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 337b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_NAME(ut_valid_internal_object); 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Check for a null pointer */ 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!object) { 3427bcc06e845479bde939059bafa088bf25ede9dbfBob Moore ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "**** Null Object Ptr\n")); 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (FALSE); 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Check the descriptor type field */ 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown switch (ACPI_GET_DESCRIPTOR_TYPE(object)) { 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_DESC_TYPE_OPERAND: 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 351cf48958e84abb3b2dbb4202d0edbfce6aff65ce7Bob Moore /* The object appears to be a valid union acpi_operand_object */ 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (TRUE); 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 3567bcc06e845479bde939059bafa088bf25ede9dbfBob Moore ACPI_DEBUG_PRINT((ACPI_DB_EXEC, 3574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown "%p is not not an ACPI operand obj [%s]\n", 3584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown object, acpi_ut_get_descriptor_name(object))); 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (FALSE); 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_allocate_object_desc_dbg 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: module_name - Caller's module name (for error output) 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * line_number - Caller's line number (for error output) 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * component_id - Caller's component ID (for error output) 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 37373a3090a2160fb01317f5a44af6ee5a064a29625Bob Moore * RETURN: Pointer to newly allocated object descriptor. Null on error 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 37573a3090a2160fb01317f5a44af6ee5a064a29625Bob Moore * DESCRIPTION: Allocate a new object descriptor. Gracefully handle 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * error conditions. 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3804b8ed631679070c183c8ae7519d2bdb9df124ae4Bob Moorevoid *acpi_ut_allocate_object_desc_dbg(const char *module_name, 3814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 line_number, u32 component_id) 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *object; 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 385b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(ut_allocate_object_desc_dbg); 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3874be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown object = acpi_os_acquire_object(acpi_gbl_operand_cache); 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!object) { 389b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((module_name, line_number, 390b8e4d89357fc434618a59c1047cac72641191805Bob Moore "Could not allocate an object descriptor")); 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3924be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(NULL); 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Mark the descriptor type */ 3968313524a0d466f451a62709aaedf988d8257b21cBob Moore 39773459f73e5d1602c59ebec114fc45185521353c1Robert Moore memset(object, 0, sizeof(union acpi_operand_object)); 3984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_SET_DESCRIPTOR_TYPE(object, ACPI_DESC_TYPE_OPERAND); 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "%p Size %X\n", 4014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown object, (u32) sizeof(union acpi_operand_object))); 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_PTR(object); 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_delete_object_desc 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 410ba494beeaa69bc0fb01eb89464ad5d57d26e3901Bob Moore * PARAMETERS: object - An Acpi internal object to be deleted 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: None. 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Free an ACPI object descriptor or add it to the object cache 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4184be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownvoid acpi_ut_delete_object_desc(union acpi_operand_object *object) 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 420b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_PTR(ut_delete_object_desc, object); 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 42275c8044fb38051713000e0d151852f5f9614f77bLv Zheng /* Object must be of type union acpi_operand_object */ 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4244be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_GET_DESCRIPTOR_TYPE(object) != ACPI_DESC_TYPE_OPERAND) { 425b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((AE_INFO, 426b8e4d89357fc434618a59c1047cac72641191805Bob Moore "%p is not an ACPI Operand object [%s]", object, 427b8e4d89357fc434618a59c1047cac72641191805Bob Moore acpi_ut_get_descriptor_name(object))); 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return_VOID; 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4314be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (void)acpi_os_release_object(acpi_gbl_operand_cache, object); 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return_VOID; 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_get_simple_object_size 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 43944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: internal_object - An ACPI operand object 44044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * obj_length - Where the length is returned 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to determine the space required to 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * contain a simple object for return to an external user. 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The length includes the object structure plus any additional 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * needed space. 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 45244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 4534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_get_simple_object_size(union acpi_operand_object *internal_object, 4544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_size * obj_length) 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_size length; 4573c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore acpi_size size; 4584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 460b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_PTR(ut_get_simple_object_size, internal_object); 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 46244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore /* 46344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * Handle a null object (Could be a uninitialized package 46444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * element -- which is legal) 46544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore */ 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!internal_object) { 467c8d16e27a3601d1cbcdfe657eb4ff5e762019e8dLin Ming *obj_length = sizeof(union acpi_object); 4684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_OK); 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Start with the length of the Acpi object */ 4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4734be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown length = sizeof(union acpi_object); 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_GET_DESCRIPTOR_TYPE(internal_object) == ACPI_DESC_TYPE_NAMED) { 47652fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Object is a named object (reference), just return the length */ 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4794be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown *obj_length = ACPI_ROUND_UP_TO_NATIVE_WORD(length); 4804be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The final length depends on the object type 4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Strings and Buffers are packed right up against the parent object and 4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * must be accessed bytewise or there may be alignment problems on 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * certain processors 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4893371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore switch (internal_object->common.type) { 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_STRING: 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds length += (acpi_size) internal_object->string.length + 1; 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_BUFFER: 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds length += (acpi_size) internal_object->buffer.length; 4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_INTEGER: 5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_PROCESSOR: 5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_POWER: 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5047a5bb9964512c5313af19310c6a3002ec54f7336Lin Ming /* No extra data for these types */ 5057a5bb9964512c5313af19310c6a3002ec54f7336Lin Ming 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_LOCAL_REFERENCE: 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5101044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore switch (internal_object->reference.class) { 5111044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore case ACPI_REFCLASS_NAME: 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Get the actual length of the full pathname to this object. 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The reference will be converted to the pathname to the object 5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5173c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore size = 5183c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore acpi_ns_get_pathname_length(internal_object-> 5193c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore reference.node); 5203c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore if (!size) { 5213c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore return_ACPI_STATUS(AE_BAD_PARAMETER); 5223c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore } 5233c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore 5243c7db22a194d3b53584047425af82b4e1e03d9f7Bob Moore length += ACPI_ROUND_UP_TO_NATIVE_WORD(size); 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * No other reference opcodes are supported. 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Notably, Locals and Args are not supported, but this may be 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * required eventually. 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 534b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((AE_INFO, 535c2de3a49454cdc9ca42bbd5d742913421d049f59Bob Moore "Cannot convert to external object - " 536f6a22b0bc417042e83117f52ab1a03696af185abBob Moore "unsupported Reference Class [%s] 0x%X in object %p", 537c2de3a49454cdc9ca42bbd5d742913421d049f59Bob Moore acpi_ut_get_reference_name(internal_object), 5381044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore internal_object->reference.class, 539b8e4d89357fc434618a59c1047cac72641191805Bob Moore internal_object)); 5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds status = AE_TYPE; 5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 547c2de3a49454cdc9ca42bbd5d742913421d049f59Bob Moore ACPI_ERROR((AE_INFO, "Cannot convert to external object - " 548f6a22b0bc417042e83117f52ab1a03696af185abBob Moore "unsupported type [%s] 0x%X in object %p", 549c2de3a49454cdc9ca42bbd5d742913421d049f59Bob Moore acpi_ut_get_object_type_name(internal_object), 5503371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore internal_object->common.type, internal_object)); 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds status = AE_TYPE; 5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Account for the space required by the object rounded up to the next 55773a3090a2160fb01317f5a44af6ee5a064a29625Bob Moore * multiple of the machine word size. This keeps each object aligned 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * on a machine word boundary. (preventing alignment faults on some 5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * machines.) 5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown *obj_length = ACPI_ROUND_UP_TO_NATIVE_WORD(length); 5624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_get_element_length 5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: acpi_pkg_callback 5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Get the length of one package element. 5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 57744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 5784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_get_element_length(u8 object_type, 5794be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *source_object, 5804be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state *state, void *context) 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 5834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_pkg_info *info = (struct acpi_pkg_info *)context; 5844be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_size object_space; 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (object_type) { 5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_COPY_TYPE_SIMPLE: 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Simple object - just get the size (Null object/entry is handled 5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * here also) and sum it into the running package length 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5934be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 5944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_get_simple_object_size(source_object, 5954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &object_space); 5964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (status); 5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info->length += object_space; 6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_COPY_TYPE_PACKAGE: 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Package object - nothing much to do here, let the walk handle it */ 6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info->num_packages++; 6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds state->pkg.this_target_obj = NULL; 6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* No other types allowed */ 6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_BAD_PARAMETER); 6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (status); 6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_get_package_object_size 6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 62544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: internal_object - An ACPI internal object 62644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * obj_length - Where the length is returned 6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to determine the space required to 6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * contain a package object for return to an external user. 6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This is moderately complex since a package contains other 6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * objects including packages. 6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 63844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 6394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_get_package_object_size(union acpi_operand_object *internal_object, 6404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_size * obj_length) 6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6424be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 6434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_pkg_info info; 6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 645b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE_PTR(ut_get_package_object_size, internal_object); 6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info.length = 0; 6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.object_space = 0; 6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.num_packages = 1; 6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_walk_package_tree(internal_object, NULL, 6524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_get_element_length, &info); 6534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 6544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We have handled all of the objects in all levels of the package. 6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * just add the length of the package objects themselves. 6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Round up to the next machine word. 6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info.length += ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object)) * 6634be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (acpi_size) info.num_packages; 6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Return the total package length */ 6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *obj_length = info.length; 6684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_get_object_size 6741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 67544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: internal_object - An ACPI internal object 67644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * obj_length - Where the length will be returned 6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to determine the space required to 6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * contain an object for return to an API user. 6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 6864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_get_object_size(union acpi_operand_object *internal_object, 6874be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_size * obj_length) 6881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 6904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown 6914be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_ENTRY(); 6924be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown 6934be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if ((ACPI_GET_DESCRIPTOR_TYPE(internal_object) == 6944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DESC_TYPE_OPERAND) 6953371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore && (internal_object->common.type == ACPI_TYPE_PACKAGE)) { 6964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 6974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_get_package_object_size(internal_object, 6984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown obj_length); 6994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 7004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 7014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_get_simple_object_size(internal_object, obj_length); 7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (status); 7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 706