11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/****************************************************************************** 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module Name: utcopy - Internal to external object translation utilities 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *****************************************************************************/ 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 877848130e53b06c22fe37a7b6acbb82bb3e9bfbaBob Moore * Copyright (C) 2000 - 2012, Intel Corp. 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * All rights reserved. 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Redistribution and use in source and binary forms, with or without 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modification, are permitted provided that the following conditions 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are met: 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1. Redistributions of source code must retain the above copyright 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * notice, this list of conditions, and the following disclaimer, 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * without modification. 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2. Redistributions in binary form must reproduce at minimum a disclaimer 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * substantially similar to the "NO WARRANTY" disclaimer below 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ("Disclaimer") and any redistribution must be conditioned upon 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * including a substantially similar Disclaimer requirement for further 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * binary redistribution. 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3. Neither the names of the above-listed copyright holders nor the names 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of any contributors may be used to endorse or promote products derived 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * from this software without specific prior written permission. 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Alternatively, this software may be distributed under the terms of the 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License ("GPL") version 2 as published by the Free 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Software Foundation. 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NO WARRANTY 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * POSSIBILITY OF SUCH DAMAGES. 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <acpi/acpi.h> 45e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "accommon.h" 46e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acnamesp.h" 47cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPONENT ACPI_UTILITIES 504be44fcd3bf648b782f4460fd06dfae6c42ded4bLen BrownACPI_MODULE_NAME("utcopy") 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/* Local prototypes */ 5344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object, 554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_object *external_object, 564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u8 * data_space, acpi_size * buffer_space_used); 5744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 5844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ielement_to_ielement(u8 object_type, 604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *source_object, 614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state *state, 624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown void *context); 6344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 6444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ipackage_to_epackage(union acpi_operand_object *internal_object, 664be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u8 * buffer, acpi_size * space_used); 6744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 6844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_esimple_to_isimple(union acpi_object *user_obj, 704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object **return_obj); 7144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 7244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 736287ee32952b502c23d54f12895c3895ddbe5013Bob Mooreacpi_ut_copy_epackage_to_ipackage(union acpi_object *external_object, 746287ee32952b502c23d54f12895c3895ddbe5013Bob Moore union acpi_operand_object **internal_object); 756287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 766287ee32952b502c23d54f12895c3895ddbe5013Bob Moorestatic acpi_status 774be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_simple_object(union acpi_operand_object *source_desc, 784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *dest_desc); 7944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 8044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ielement_to_eelement(u8 object_type, 824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *source_object, 834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state *state, 844be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown void *context); 8544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore 8644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 874be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ipackage_to_ipackage(union acpi_operand_object *source_obj, 884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *dest_obj, 894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_walk_state *walk_state); 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_isimple_to_esimple 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: internal_object - Source object to be copied 9644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * external_object - Where to return the copied object 9744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * data_space - Where object data is returned (such as 9844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * buffer and string data) 9944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * buffer_space_used - Length of data_space that was used 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 10344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * DESCRIPTION: This function is called to copy a simple internal object to 10444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * an external object. 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 10644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * The data_space buffer is assumed to have sufficient space for 10744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * the object. 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic acpi_status 1124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object, 1134be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_object *external_object, 1144be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u8 * data_space, acpi_size * buffer_space_used) 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1164be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 118b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(ut_copy_isimple_to_esimple); 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *buffer_space_used = 0; 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Check for NULL object case (could be an uninitialized 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * package element) 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!internal_object) { 1274be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_OK); 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Always clear the external object */ 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1324be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMSET(external_object, 0, sizeof(union acpi_object)); 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * In general, the external object will be the same type as 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the internal object 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1383371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore external_object->type = internal_object->common.type; 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* However, only a limited number of external types are supported */ 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1423371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore switch (internal_object->common.type) { 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_STRING: 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->string.pointer = (char *)data_space; 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds external_object->string.length = internal_object->string.length; 1474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown *buffer_space_used = ACPI_ROUND_UP_TO_NATIVE_WORD((acpi_size) 1484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object-> 1494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown string. 1504be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown length + 1); 1514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown 1524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMCPY((void *)data_space, 1534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (void *)internal_object->string.pointer, 1544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (acpi_size) internal_object->string.length + 1); 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_BUFFER: 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds external_object->buffer.pointer = data_space; 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds external_object->buffer.length = internal_object->buffer.length; 1614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown *buffer_space_used = 1624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_ROUND_UP_TO_NATIVE_WORD(internal_object->string. 1634be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown length); 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1654be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMCPY((void *)data_space, 1664be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (void *)internal_object->buffer.pointer, 1674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->buffer.length); 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_INTEGER: 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds external_object->integer.value = internal_object->integer.value; 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_LOCAL_REFERENCE: 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 177cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore /* This is an object reference. */ 178cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore 1791044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore switch (internal_object->reference.class) { 1801044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore case ACPI_REFCLASS_NAME: 181cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore 1821044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore /* 1831044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore * For namepath, return the object handle ("reference") 1841044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore * We are referring to the namespace node 1851044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore */ 1864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->reference.handle = 1874be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->reference.node; 188cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore external_object->reference.actual_type = 189cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore acpi_ns_get_type(internal_object->reference.node); 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1911044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore 1921044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore default: 1931044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore 1941044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore /* All other reference types are unsupported */ 1951044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore 1961044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore return_ACPI_STATUS(AE_TYPE); 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_PROCESSOR: 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2024be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->processor.proc_id = 2034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->processor.proc_id; 2044be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->processor.pblk_address = 2054be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->processor.address; 2064be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->processor.pblk_length = 2074be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->processor.length; 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_POWER: 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds external_object->power_resource.system_level = 2134be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->power_resource.system_level; 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds external_object->power_resource.resource_order = 2164be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->power_resource.resource_order; 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * There is no corresponding external object type 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 223b1dd9096fef08642eb509fbf2a40b3c7734dce1cBob Moore ACPI_ERROR((AE_INFO, 224b1dd9096fef08642eb509fbf2a40b3c7734dce1cBob Moore "Unsupported object type, cannot convert to external object: %s", 2253371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore acpi_ut_get_type_name(internal_object->common. 2263371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore type))); 227b1dd9096fef08642eb509fbf2a40b3c7734dce1cBob Moore 2284be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_SUPPORT); 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2314be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_ielement_to_eelement 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: acpi_pkg_callback 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Copy one package element to another package element 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 24644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 2474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ielement_to_eelement(u8 object_type, 2484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *source_object, 2494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state *state, 2504be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown void *context) 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 2534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_pkg_info *info = (struct acpi_pkg_info *)context; 2544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_size object_space; 2554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 this_index; 2564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_object *target_object; 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_ENTRY(); 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown this_index = state->pkg.index; 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds target_object = (union acpi_object *) 2624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &((union acpi_object *)(state->pkg.dest_object))->package. 2634be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown elements[this_index]; 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (object_type) { 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_COPY_TYPE_SIMPLE: 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This is a simple or null object 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_copy_isimple_to_esimple(source_object, 2724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown target_object, 2734be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info->free_space, 2744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &object_space); 2754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (status); 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_COPY_TYPE_PACKAGE: 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Build the package object 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2854be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown target_object->type = ACPI_TYPE_PACKAGE; 2864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown target_object->package.count = source_object->package.count; 28744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore target_object->package.elements = 2884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_CAST_PTR(union acpi_object, info->free_space); 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Pass the new package object back to the package walk routine 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds state->pkg.this_target_obj = target_object; 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Save space for the array of objects (Package elements) 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * update the buffer length counter 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown object_space = ACPI_ROUND_UP_TO_NATIVE_WORD((acpi_size) 3004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown target_object-> 3014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown package.count * 3024be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown sizeof(union 3034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_object)); 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_BAD_PARAMETER); 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info->free_space += object_space; 3114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info->length += object_space; 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (status); 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_ipackage_to_epackage 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 31944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: internal_object - Pointer to the object we are returning 32044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * Buffer - Where the object is returned 32144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * space_used - Where the object length is returned 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to place a package object in a user 32690434c1c7c61ce7dd349f17f003b8813421aeadcBob Moore * buffer. A package object by definition contains other objects. 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The buffer is assumed to have sufficient space for the object. 32990434c1c7c61ce7dd349f17f003b8813421aeadcBob Moore * The caller must have verified the buffer length needed using 33090434c1c7c61ce7dd349f17f003b8813421aeadcBob Moore * the acpi_ut_get_object_size function before calling this function. 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic acpi_status 3354be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ipackage_to_epackage(union acpi_operand_object *internal_object, 3364be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u8 * buffer, acpi_size * space_used) 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3384be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_object *external_object; 3394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 3404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_pkg_info info; 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 342b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(ut_copy_ipackage_to_epackage); 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * First package at head of the buffer 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object = ACPI_CAST_PTR(union acpi_object, buffer); 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Free space begins right after the first package 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info.length = ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object)); 3534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info.free_space = 3544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown buffer + ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object)); 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.object_space = 0; 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.num_packages = 1; 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3583371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore external_object->type = internal_object->common.type; 3594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->package.count = internal_object->package.count; 3604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->package.elements = ACPI_CAST_PTR(union acpi_object, 3614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info.free_space); 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Leave room for an array of ACPI_OBJECTS in the buffer 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and move the free space past it 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown info.length += (acpi_size) external_object->package.count * 3684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object)); 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info.free_space += external_object->package.count * 3704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object)); 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_walk_package_tree(internal_object, external_object, 3734be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_copy_ielement_to_eelement, 3744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &info); 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *space_used = info.length; 3774be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_iobject_to_eobject 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 38444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: internal_object - The internal object to be converted 38590434c1c7c61ce7dd349f17f003b8813421aeadcBob Moore * ret_buffer - Where the object is returned 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 38990434c1c7c61ce7dd349f17f003b8813421aeadcBob Moore * DESCRIPTION: This function is called to build an API object to be returned 39090434c1c7c61ce7dd349f17f003b8813421aeadcBob Moore * to the caller. 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 3954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_iobject_to_eobject(union acpi_operand_object *internal_object, 3964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_buffer *ret_buffer) 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 400b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(ut_copy_iobject_to_eobject); 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4023371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore if (internal_object->common.type == ACPI_TYPE_PACKAGE) { 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Package object: Copy all subobjects (including 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * nested packages) 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4074be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_copy_ipackage_to_epackage(internal_object, 4084be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ret_buffer->pointer, 4094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &ret_buffer->length); 4104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Build a simple object (no nested objects) 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4144be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_copy_isimple_to_esimple(internal_object, 415c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore ACPI_CAST_PTR(union 416c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore acpi_object, 417c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore ret_buffer-> 418c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore pointer), 419c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore ACPI_ADD_PTR(u8, 420c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore ret_buffer-> 421c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore pointer, 422c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore ACPI_ROUND_UP_TO_NATIVE_WORD 423c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore (sizeof 424c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore (union 425c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore acpi_object))), 4264be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &ret_buffer->length); 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * build simple does not include the object size in the length 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * so we add it in here 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4314be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ret_buffer->length += sizeof(union acpi_object); 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4344be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_esimple_to_isimple 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 44144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS: external_object - The external object to be converted 44244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * ret_internal_object - Where the internal object is returned 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function copies an external object to an internal one. 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NOTE: Pointers can be copied, we don't need to copy data. 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (The pointers have to be valid in our address space no matter 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * what we do with them!) 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 45344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 4544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_esimple_to_isimple(union acpi_object *external_object, 4554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object **ret_internal_object) 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *internal_object; 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 459b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(ut_copy_esimple_to_isimple); 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Simple types supported are: String, Buffer, Integer 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (external_object->type) { 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_STRING: 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_BUFFER: 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_INTEGER: 468cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore case ACPI_TYPE_LOCAL_REFERENCE: 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object = acpi_ut_create_internal_object((u8) 4714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object-> 4724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown type); 4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!internal_object) { 4744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 478cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore case ACPI_TYPE_ANY: /* This is the case for a NULL object */ 479cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore 480cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore *ret_internal_object = NULL; 481cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore return_ACPI_STATUS(AE_OK); 482cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* All other types are not supported */ 4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 486b1dd9096fef08642eb509fbf2a40b3c7734dce1cBob Moore ACPI_ERROR((AE_INFO, 487b1dd9096fef08642eb509fbf2a40b3c7734dce1cBob Moore "Unsupported object type, cannot convert to internal object: %s", 488b1dd9096fef08642eb509fbf2a40b3c7734dce1cBob Moore acpi_ut_get_type_name(external_object->type))); 489b1dd9096fef08642eb509fbf2a40b3c7734dce1cBob Moore 4904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_SUPPORT); 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Must COPY string and buffer contents */ 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (external_object->type) { 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_STRING: 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds internal_object->string.pointer = 499ec41f193eadb6301f3c052b5e0dbc0b5636982e8Bob Moore ACPI_ALLOCATE_ZEROED((acpi_size) 500ec41f193eadb6301f3c052b5e0dbc0b5636982e8Bob Moore external_object->string.length + 1); 501ec41f193eadb6301f3c052b5e0dbc0b5636982e8Bob Moore 5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!internal_object->string.pointer) { 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto error_exit; 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5064be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMCPY(internal_object->string.pointer, 5074be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->string.pointer, 5084be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->string.length); 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds internal_object->string.length = external_object->string.length; 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_BUFFER: 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds internal_object->buffer.pointer = 5168313524a0d466f451a62709aaedf988d8257b21cBob Moore ACPI_ALLOCATE_ZEROED(external_object->buffer.length); 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!internal_object->buffer.pointer) { 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto error_exit; 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5214be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMCPY(internal_object->buffer.pointer, 5224be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->buffer.pointer, 5234be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown external_object->buffer.length); 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds internal_object->buffer.length = external_object->buffer.length; 52624a3157a90ddf851a0880c0b8963bc43481cd85bBob Moore 52724a3157a90ddf851a0880c0b8963bc43481cd85bBob Moore /* Mark buffer data valid */ 52824a3157a90ddf851a0880c0b8963bc43481cd85bBob Moore 52924a3157a90ddf851a0880c0b8963bc43481cd85bBob Moore internal_object->buffer.flags |= AOPOBJ_DATA_VALID; 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_INTEGER: 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5344be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object->integer.value = external_object->integer.value; 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 537cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore case ACPI_TYPE_LOCAL_REFERENCE: 538cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore 539cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore /* TBD: should validate incoming handle */ 540cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore 5411044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore internal_object->reference.class = ACPI_REFCLASS_NAME; 542cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore internal_object->reference.node = 543cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore external_object->reference.handle; 544cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore break; 545cd0b2248241f4146152fb04a6bf4bccb6ce0478aBob Moore 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Other types can't get here */ 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *ret_internal_object = internal_object; 5524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_OK); 5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown error_exit: 5554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_remove_reference(internal_object); 5564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_epackage_to_ipackage 5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5636287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * PARAMETERS: external_object - The external object to be converted 5646287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * internal_object - Where the internal object is returned 5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5686287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * DESCRIPTION: Copy an external package object to an internal package. 5696287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * Handles nested packages. 5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic acpi_status 5746287ee32952b502c23d54f12895c3895ddbe5013Bob Mooreacpi_ut_copy_epackage_to_ipackage(union acpi_object *external_object, 5756287ee32952b502c23d54f12895c3895ddbe5013Bob Moore union acpi_operand_object **internal_object) 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 5776287ee32952b502c23d54f12895c3895ddbe5013Bob Moore acpi_status status = AE_OK; 5786287ee32952b502c23d54f12895c3895ddbe5013Bob Moore union acpi_operand_object *package_object; 5796287ee32952b502c23d54f12895c3895ddbe5013Bob Moore union acpi_operand_object **package_elements; 58067a119f990063f5662574f6d6414fe9bc5ece86aBob Moore u32 i; 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 582b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(ut_copy_epackage_to_ipackage); 5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5846287ee32952b502c23d54f12895c3895ddbe5013Bob Moore /* Create the package object */ 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5866287ee32952b502c23d54f12895c3895ddbe5013Bob Moore package_object = 5876287ee32952b502c23d54f12895c3895ddbe5013Bob Moore acpi_ut_create_package_object(external_object->package.count); 5886287ee32952b502c23d54f12895c3895ddbe5013Bob Moore if (!package_object) { 5896287ee32952b502c23d54f12895c3895ddbe5013Bob Moore return_ACPI_STATUS(AE_NO_MEMORY); 5906287ee32952b502c23d54f12895c3895ddbe5013Bob Moore } 5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5926287ee32952b502c23d54f12895c3895ddbe5013Bob Moore package_elements = package_object->package.elements; 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5956287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * Recursive implementation. Probably ok, since nested external packages 5966287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * as parameters should be very rare. 5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5986287ee32952b502c23d54f12895c3895ddbe5013Bob Moore for (i = 0; i < external_object->package.count; i++) { 5996287ee32952b502c23d54f12895c3895ddbe5013Bob Moore status = 6006287ee32952b502c23d54f12895c3895ddbe5013Bob Moore acpi_ut_copy_eobject_to_iobject(&external_object->package. 6016287ee32952b502c23d54f12895c3895ddbe5013Bob Moore elements[i], 6026287ee32952b502c23d54f12895c3895ddbe5013Bob Moore &package_elements[i]); 6036287ee32952b502c23d54f12895c3895ddbe5013Bob Moore if (ACPI_FAILURE(status)) { 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6056287ee32952b502c23d54f12895c3895ddbe5013Bob Moore /* Truncate package and delete it */ 6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 60767a119f990063f5662574f6d6414fe9bc5ece86aBob Moore package_object->package.count = i; 6086287ee32952b502c23d54f12895c3895ddbe5013Bob Moore package_elements[i] = NULL; 6096287ee32952b502c23d54f12895c3895ddbe5013Bob Moore acpi_ut_remove_reference(package_object); 6106287ee32952b502c23d54f12895c3895ddbe5013Bob Moore return_ACPI_STATUS(status); 6116287ee32952b502c23d54f12895c3895ddbe5013Bob Moore } 6126287ee32952b502c23d54f12895c3895ddbe5013Bob Moore } 6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 61424a3157a90ddf851a0880c0b8963bc43481cd85bBob Moore /* Mark package data valid */ 61524a3157a90ddf851a0880c0b8963bc43481cd85bBob Moore 61624a3157a90ddf851a0880c0b8963bc43481cd85bBob Moore package_object->package.flags |= AOPOBJ_DATA_VALID; 61724a3157a90ddf851a0880c0b8963bc43481cd85bBob Moore 6186287ee32952b502c23d54f12895c3895ddbe5013Bob Moore *internal_object = package_object; 6196287ee32952b502c23d54f12895c3895ddbe5013Bob Moore return_ACPI_STATUS(status); 6206287ee32952b502c23d54f12895c3895ddbe5013Bob Moore} 6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_eobject_to_iobject 6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6266287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * PARAMETERS: external_object - The external object to be converted 6276287ee32952b502c23d54f12895c3895ddbe5013Bob Moore * internal_object - Where the internal object is returned 6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 62990434c1c7c61ce7dd349f17f003b8813421aeadcBob Moore * RETURN: Status 6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Converts an external object to an internal object. 6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 6364be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_eobject_to_iobject(union acpi_object *external_object, 6374be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object **internal_object) 6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 641b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(ut_copy_eobject_to_iobject); 6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (external_object->type == ACPI_TYPE_PACKAGE) { 6446287ee32952b502c23d54f12895c3895ddbe5013Bob Moore status = 6456287ee32952b502c23d54f12895c3895ddbe5013Bob Moore acpi_ut_copy_epackage_to_ipackage(external_object, 6466287ee32952b502c23d54f12895c3895ddbe5013Bob Moore internal_object); 6476287ee32952b502c23d54f12895c3895ddbe5013Bob Moore } else { 6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Build a simple object (no nested objects) 6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 6524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_copy_esimple_to_isimple(external_object, 6534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown internal_object); 6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_simple_object 6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: source_desc - The internal object to be copied 6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * dest_desc - New target object 6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 66890434c1c7c61ce7dd349f17f003b8813421aeadcBob Moore * DESCRIPTION: Simple copy of one internal object to another. Reference count 6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of the destination object is preserved. 6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 67344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 6744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_simple_object(union acpi_operand_object *source_desc, 6754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *dest_desc) 6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 6774be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u16 reference_count; 6784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *next_object; 67933a1d461d294722dd15ffe17651bdd48b5763883Bob Moore acpi_status status; 68017b82327f3e7ab5a068f8019768008ee82d912beLin Ming acpi_size copy_size; 6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Save fields from destination that we don't want to overwrite */ 6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds reference_count = dest_desc->common.reference_count; 6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds next_object = dest_desc->common.next_object; 6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 68717b82327f3e7ab5a068f8019768008ee82d912beLin Ming /* 68817b82327f3e7ab5a068f8019768008ee82d912beLin Ming * Copy the entire source object over the destination object. 68917b82327f3e7ab5a068f8019768008ee82d912beLin Ming * Note: Source can be either an operand object or namespace node. 69017b82327f3e7ab5a068f8019768008ee82d912beLin Ming */ 69117b82327f3e7ab5a068f8019768008ee82d912beLin Ming copy_size = sizeof(union acpi_operand_object); 69217b82327f3e7ab5a068f8019768008ee82d912beLin Ming if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_NAMED) { 69317b82327f3e7ab5a068f8019768008ee82d912beLin Ming copy_size = sizeof(struct acpi_namespace_node); 69417b82327f3e7ab5a068f8019768008ee82d912beLin Ming } 6951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 69617b82327f3e7ab5a068f8019768008ee82d912beLin Ming ACPI_MEMCPY(ACPI_CAST_PTR(char, dest_desc), 69717b82327f3e7ab5a068f8019768008ee82d912beLin Ming ACPI_CAST_PTR(char, source_desc), copy_size); 6981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Restore the saved fields */ 7001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dest_desc->common.reference_count = reference_count; 7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dest_desc->common.next_object = next_object; 7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7046f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore /* New object is not static, regardless of source */ 7056f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore 7066f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore dest_desc->common.flags &= ~AOPOBJ_STATIC_POINTER; 7076f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore 7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Handle the objects with extra data */ 7091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7103371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore switch (dest_desc->common.type) { 7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_BUFFER: 7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Allocate and copy the actual buffer if and only if: 7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1) There is a valid buffer pointer 7156f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore * 2) The buffer has a length > 0 7161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((source_desc->buffer.pointer) && 7184be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (source_desc->buffer.length)) { 7196f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore dest_desc->buffer.pointer = 7208313524a0d466f451a62709aaedf988d8257b21cBob Moore ACPI_ALLOCATE(source_desc->buffer.length); 7216f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore if (!dest_desc->buffer.pointer) { 7226f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore return (AE_NO_MEMORY); 7236f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore } 7241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7256f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore /* Copy the actual buffer data */ 7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7274be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMCPY(dest_desc->buffer.pointer, 7284be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown source_desc->buffer.pointer, 7294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown source_desc->buffer.length); 7301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_STRING: 7341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Allocate and copy the actual string if and only if: 7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1) There is a valid string pointer 7376f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore * (Pointer to a NULL string is allowed) 7381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7396f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore if (source_desc->string.pointer) { 7401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dest_desc->string.pointer = 7418313524a0d466f451a62709aaedf988d8257b21cBob Moore ACPI_ALLOCATE((acpi_size) source_desc->string. 7428313524a0d466f451a62709aaedf988d8257b21cBob Moore length + 1); 7431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!dest_desc->string.pointer) { 7441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_NO_MEMORY); 7451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7476f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore /* Copy the actual string data */ 7486f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore 7494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_MEMCPY(dest_desc->string.pointer, 7504be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown source_desc->string.pointer, 7514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown (acpi_size) source_desc->string.length + 1); 7521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_TYPE_LOCAL_REFERENCE: 7561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 7571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We copied the reference object, so we now must add a reference 7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to the object pointed to by the reference 759bc7a36ab74e09da7bb63e2477b0740ac992b290eLin Ming * 7601044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore * DDBHandle reference (from Load/load_table) is a special reference, 7611044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore * it does not have a Reference.Object, so does not need to 762bc7a36ab74e09da7bb63e2477b0740ac992b290eLin Ming * increase the reference count 7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7641044f1f65b7df2aae979e397904c4985eeb99ba2Bob Moore if (source_desc->reference.class == ACPI_REFCLASS_TABLE) { 765bc7a36ab74e09da7bb63e2477b0740ac992b290eLin Ming break; 766bc7a36ab74e09da7bb63e2477b0740ac992b290eLin Ming } 767bc7a36ab74e09da7bb63e2477b0740ac992b290eLin Ming 7684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_add_reference(source_desc->reference.object); 7691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 7701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7716b366e2fe1b68bd9af55caf166eaaf0609ba18a9Fiodor Suietov case ACPI_TYPE_REGION: 7726b366e2fe1b68bd9af55caf166eaaf0609ba18a9Fiodor Suietov /* 7736b366e2fe1b68bd9af55caf166eaaf0609ba18a9Fiodor Suietov * We copied the Region Handler, so we now must add a reference 7746b366e2fe1b68bd9af55caf166eaaf0609ba18a9Fiodor Suietov */ 7756b366e2fe1b68bd9af55caf166eaaf0609ba18a9Fiodor Suietov if (dest_desc->region.handler) { 7766b366e2fe1b68bd9af55caf166eaaf0609ba18a9Fiodor Suietov acpi_ut_add_reference(dest_desc->region.handler); 7776b366e2fe1b68bd9af55caf166eaaf0609ba18a9Fiodor Suietov } 7786b366e2fe1b68bd9af55caf166eaaf0609ba18a9Fiodor Suietov break; 7796b366e2fe1b68bd9af55caf166eaaf0609ba18a9Fiodor Suietov 78033a1d461d294722dd15ffe17651bdd48b5763883Bob Moore /* 78133a1d461d294722dd15ffe17651bdd48b5763883Bob Moore * For Mutex and Event objects, we cannot simply copy the underlying 78233a1d461d294722dd15ffe17651bdd48b5763883Bob Moore * OS object. We must create a new one. 78333a1d461d294722dd15ffe17651bdd48b5763883Bob Moore */ 78433a1d461d294722dd15ffe17651bdd48b5763883Bob Moore case ACPI_TYPE_MUTEX: 78533a1d461d294722dd15ffe17651bdd48b5763883Bob Moore 78633a1d461d294722dd15ffe17651bdd48b5763883Bob Moore status = acpi_os_create_mutex(&dest_desc->mutex.os_mutex); 78733a1d461d294722dd15ffe17651bdd48b5763883Bob Moore if (ACPI_FAILURE(status)) { 78833a1d461d294722dd15ffe17651bdd48b5763883Bob Moore return status; 78933a1d461d294722dd15ffe17651bdd48b5763883Bob Moore } 79033a1d461d294722dd15ffe17651bdd48b5763883Bob Moore break; 79133a1d461d294722dd15ffe17651bdd48b5763883Bob Moore 79233a1d461d294722dd15ffe17651bdd48b5763883Bob Moore case ACPI_TYPE_EVENT: 79333a1d461d294722dd15ffe17651bdd48b5763883Bob Moore 79433a1d461d294722dd15ffe17651bdd48b5763883Bob Moore status = acpi_os_create_semaphore(ACPI_NO_UNIT_LIMIT, 0, 79533a1d461d294722dd15ffe17651bdd48b5763883Bob Moore &dest_desc->event. 79633a1d461d294722dd15ffe17651bdd48b5763883Bob Moore os_semaphore); 79733a1d461d294722dd15ffe17651bdd48b5763883Bob Moore if (ACPI_FAILURE(status)) { 79833a1d461d294722dd15ffe17651bdd48b5763883Bob Moore return status; 79933a1d461d294722dd15ffe17651bdd48b5763883Bob Moore } 80033a1d461d294722dd15ffe17651bdd48b5763883Bob Moore break; 80133a1d461d294722dd15ffe17651bdd48b5763883Bob Moore 8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Nothing to do for other simple objects */ 8041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 8051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_OK); 8081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 8111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_ielement_to_ielement 8131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: acpi_pkg_callback 8151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Copy one package element to another package element 8191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 8211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 82244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 8234be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ielement_to_ielement(u8 object_type, 8244be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *source_object, 8254be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_generic_state *state, 8264be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown void *context) 8271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8284be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 8294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown u32 this_index; 8304be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object **this_target_ptr; 8314be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *target_object; 8321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8334be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_FUNCTION_ENTRY(); 8341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8354be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown this_index = state->pkg.index; 8361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds this_target_ptr = (union acpi_operand_object **) 8374be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown &state->pkg.dest_object->package.elements[this_index]; 8381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (object_type) { 8401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_COPY_TYPE_SIMPLE: 8411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* A null source object indicates a (legal) null package element */ 8431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (source_object) { 8451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 8461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This is a simple object, just copy it 8471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown target_object = 8493371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore acpi_ut_create_internal_object(source_object-> 8503371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore common.type); 8511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!target_object) { 8521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_NO_MEMORY); 8531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 8564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_copy_simple_object(source_object, 8574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown target_object); 8584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 8591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto error_exit; 8601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *this_target_ptr = target_object; 8634be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 8641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Pass through a null element */ 8651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *this_target_ptr = NULL; 8671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 8691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case ACPI_COPY_TYPE_PACKAGE: 8711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 8731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This object is a package - go down another nesting level 8741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Create and build the package object 8751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8764be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown target_object = 8776287ee32952b502c23d54f12895c3895ddbe5013Bob Moore acpi_ut_create_package_object(source_object->package.count); 8781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!target_object) { 8791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_NO_MEMORY); 8801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds target_object->common.flags = source_object->common.flags; 8831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8846287ee32952b502c23d54f12895c3895ddbe5013Bob Moore /* Pass the new package object back to the package walk routine */ 8851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds state->pkg.this_target_obj = target_object; 8871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8886287ee32952b502c23d54f12895c3895ddbe5013Bob Moore /* Store the object pointer in the parent package object */ 8896287ee32952b502c23d54f12895c3895ddbe5013Bob Moore 8901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *this_target_ptr = target_object; 8911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 8921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 8941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (AE_BAD_PARAMETER); 8951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (status); 8981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown error_exit: 9004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_remove_reference(target_object); 9011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (status); 9021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 9031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 9051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_ipackage_to_ipackage 9071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 90890434c1c7c61ce7dd349f17f003b8813421aeadcBob Moore * PARAMETERS: source_obj - Pointer to the source package object 90990434c1c7c61ce7dd349f17f003b8813421aeadcBob Moore * dest_obj - Where the internal object is returned 91090434c1c7c61ce7dd349f17f003b8813421aeadcBob Moore * walk_state - Current Walk state descriptor 9111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 91290434c1c7c61ce7dd349f17f003b8813421aeadcBob Moore * RETURN: Status 9131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to copy an internal package object 9151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * into another internal package object. 9161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 9181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 91944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status 9204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ipackage_to_ipackage(union acpi_operand_object *source_obj, 9214be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object *dest_obj, 9224be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_walk_state *walk_state) 9231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 9244be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 9251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 926b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(ut_copy_ipackage_to_ipackage); 9271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9283371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore dest_obj->common.type = source_obj->common.type; 9294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown dest_obj->common.flags = source_obj->common.flags; 9301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dest_obj->package.count = source_obj->package.count; 9311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 9331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Create the object array and walk the source package tree 9341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9358313524a0d466f451a62709aaedf988d8257b21cBob Moore dest_obj->package.elements = ACPI_ALLOCATE_ZEROED(((acpi_size) 9368313524a0d466f451a62709aaedf988d8257b21cBob Moore source_obj->package. 9378313524a0d466f451a62709aaedf988d8257b21cBob Moore count + 9388313524a0d466f451a62709aaedf988d8257b21cBob Moore 1) * sizeof(void *)); 9391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!dest_obj->package.elements) { 940b8e4d89357fc434618a59c1047cac72641191805Bob Moore ACPI_ERROR((AE_INFO, "Package allocation failure")); 9414be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 9421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 9451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copy the package element-by-element by walking the package "tree". 9461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This handles nested packages of arbitrary depth. 9471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_walk_package_tree(source_obj, dest_obj, 9494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_copy_ielement_to_ielement, 9504be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state); 9514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 95252fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore 9531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* On failure, delete the destination package object */ 9541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_remove_reference(dest_obj); 9561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 9591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 9601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 9621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ut_copy_iobject_to_iobject 9641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 96590434c1c7c61ce7dd349f17f003b8813421aeadcBob Moore * PARAMETERS: source_desc - The internal object to be copied 9661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * dest_desc - Where the copied object is returned 96790434c1c7c61ce7dd349f17f003b8813421aeadcBob Moore * walk_state - Current walk state 9681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 9701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Copy an internal object to a new internal object 9721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 9741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 9764be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_iobject_to_iobject(union acpi_operand_object *source_desc, 9774be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_operand_object **dest_desc, 9784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_walk_state *walk_state) 9791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 9804be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status = AE_OK; 9811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 982b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(ut_copy_iobject_to_iobject); 9831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Create the top level object */ 9851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9863371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore *dest_desc = acpi_ut_create_internal_object(source_desc->common.type); 9871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!*dest_desc) { 9884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 9891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Copy the object and possible subobjects */ 9921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9933371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore if (source_desc->common.type == ACPI_TYPE_PACKAGE) { 9944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = 9954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ut_copy_ipackage_to_ipackage(source_desc, *dest_desc, 9964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown walk_state); 9974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown } else { 9984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ut_copy_simple_object(source_desc, *dest_desc); 9991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 10021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1003