utcopy.c revision 52fc0b026e99b5d5d585095148d997d5634bbc25
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module Name: utcopy - Internal to external object translation utilities
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *****************************************************************************/
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
84a90c7e86202f46fa9af011bdbcdf36e355d1721Bob Moore * Copyright (C) 2000 - 2006, R. Byron Moore
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>
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <acpi/amlcode.h>
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPONENT          ACPI_UTILITIES
484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen BrownACPI_MODULE_NAME("utcopy")
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore/* Local prototypes */
5144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status
524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object,
534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				union acpi_object *external_object,
544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				u8 * data_space, acpi_size * buffer_space_used);
5544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore
5644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status
574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ielement_to_ielement(u8 object_type,
584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  union acpi_operand_object *source_object,
594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  union acpi_generic_state *state,
604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  void *context);
6144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore
6244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status
634be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ipackage_to_epackage(union acpi_operand_object *internal_object,
644be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  u8 * buffer, acpi_size * space_used);
6544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore
6644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status
674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_esimple_to_isimple(union acpi_object *user_obj,
684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				union acpi_operand_object **return_obj);
6944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore
7044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status
714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_simple_object(union acpi_operand_object *source_desc,
724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			   union acpi_operand_object *dest_desc);
7344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore
7444f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status
754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ielement_to_eelement(u8 object_type,
764be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  union acpi_operand_object *source_object,
774be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  union acpi_generic_state *state,
784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  void *context);
7944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore
8044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status
814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ipackage_to_ipackage(union acpi_operand_object *source_obj,
824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  union acpi_operand_object *dest_obj,
834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  struct acpi_walk_state *walk_state);
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_copy_isimple_to_esimple
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
8944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS:  internal_object     - Source object to be copied
9044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore *              external_object     - Where to return the copied object
9144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore *              data_space          - Where object data is returned (such as
9244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore *                                    buffer and string data)
9344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore *              buffer_space_used   - Length of data_space that was used
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
9744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * DESCRIPTION: This function is called to copy a simple internal object to
9844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore *              an external object.
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
10044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore *              The data_space buffer is assumed to have sufficient space for
10144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore *              the object.
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic acpi_status
1064be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object,
1074be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				union acpi_object *external_object,
1084be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				u8 * data_space, acpi_size * buffer_space_used)
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status = AE_OK;
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	ACPI_FUNCTION_TRACE("ut_copy_isimple_to_esimple");
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*buffer_space_used = 0;
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Check for NULL object case (could be an uninitialized
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * package element)
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!internal_object) {
1214be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(AE_OK);
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Always clear the external object */
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1264be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	ACPI_MEMSET(external_object, 0, sizeof(union acpi_object));
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * In general, the external object will be the same type as
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * the internal object
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
1324be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	external_object->type = ACPI_GET_OBJECT_TYPE(internal_object);
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* However, only a limited number of external types are supported */
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1364be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	switch (ACPI_GET_OBJECT_TYPE(internal_object)) {
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_STRING:
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		external_object->string.pointer = (char *)data_space;
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		external_object->string.length = internal_object->string.length;
1414be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		*buffer_space_used = ACPI_ROUND_UP_TO_NATIVE_WORD((acpi_size)
1424be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown								  internal_object->
1434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown								  string.
1444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown								  length + 1);
1454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown
1464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		ACPI_MEMCPY((void *)data_space,
1474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    (void *)internal_object->string.pointer,
1484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    (acpi_size) internal_object->string.length + 1);
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_BUFFER:
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		external_object->buffer.pointer = data_space;
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		external_object->buffer.length = internal_object->buffer.length;
1554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		*buffer_space_used =
1564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    ACPI_ROUND_UP_TO_NATIVE_WORD(internal_object->string.
1574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown						 length);
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		ACPI_MEMCPY((void *)data_space,
1604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    (void *)internal_object->buffer.pointer,
1614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    internal_object->buffer.length);
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_INTEGER:
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		external_object->integer.value = internal_object->integer.value;
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_LOCAL_REFERENCE:
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * This is an object reference.  Attempt to dereference it.
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (internal_object->reference.opcode) {
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case AML_INT_NAMEPATH_OP:
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* For namepath, return the object handle ("reference") */
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/*
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 * Use the object type of "Any" to indicate a reference
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 * to object containing a handle to an ACPI named object.
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 */
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			external_object->type = ACPI_TYPE_ANY;
1854be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			external_object->reference.handle =
1864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    internal_object->reference.node;
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_PROCESSOR:
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1934be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		external_object->processor.proc_id =
1944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    internal_object->processor.proc_id;
1954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		external_object->processor.pblk_address =
1964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    internal_object->processor.address;
1974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		external_object->processor.pblk_length =
1984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    internal_object->processor.length;
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_POWER:
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		external_object->power_resource.system_level =
2044be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    internal_object->power_resource.system_level;
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		external_object->power_resource.resource_order =
2074be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    internal_object->power_resource.resource_order;
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * There is no corresponding external object type
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
2144be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(AE_SUPPORT);
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2174be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(status);
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_copy_ielement_to_eelement
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  acpi_pkg_callback
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Copy one package element to another package element
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status
2334be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ielement_to_eelement(u8 object_type,
2344be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  union acpi_operand_object *source_object,
2354be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  union acpi_generic_state *state,
2364be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  void *context)
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2384be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status = AE_OK;
2394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	struct acpi_pkg_info *info = (struct acpi_pkg_info *)context;
2404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_size object_space;
2414be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	u32 this_index;
2424be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_object *target_object;
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	ACPI_FUNCTION_ENTRY();
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	this_index = state->pkg.index;
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	target_object = (union acpi_object *)
2484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	    &((union acpi_object *)(state->pkg.dest_object))->package.
2494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	    elements[this_index];
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (object_type) {
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_COPY_TYPE_SIMPLE:
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * This is a simple or null object
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
2574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		status = acpi_ut_copy_isimple_to_esimple(source_object,
2584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							 target_object,
2594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							 info->free_space,
2604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							 &object_space);
2614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		if (ACPI_FAILURE(status)) {
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return (status);
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_COPY_TYPE_PACKAGE:
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Build the package object
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
2714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		target_object->type = ACPI_TYPE_PACKAGE;
2724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		target_object->package.count = source_object->package.count;
27344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore		target_object->package.elements =
2744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    ACPI_CAST_PTR(union acpi_object, info->free_space);
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Pass the new package object back to the package walk routine
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		state->pkg.this_target_obj = target_object;
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Save space for the array of objects (Package elements)
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * update the buffer length counter
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
2854be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		object_space = ACPI_ROUND_UP_TO_NATIVE_WORD((acpi_size)
2864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							    target_object->
2874be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							    package.count *
2884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							    sizeof(union
2894be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown								   acpi_object));
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return (AE_BAD_PARAMETER);
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	info->free_space += object_space;
2974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	info->length += object_space;
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (status);
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_copy_ipackage_to_epackage
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
30544f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS:  internal_object     - Pointer to the object we are returning
30644f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore *              Buffer              - Where the object is returned
30744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore *              space_used          - Where the object length is returned
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to place a package object in a user
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              buffer.  A package object by definition contains other objects.
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              The buffer is assumed to have sufficient space for the object.
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              The caller must have verified the buffer length needed using the
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              acpi_ut_get_object_size function before calling this function.
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic acpi_status
3214be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ipackage_to_epackage(union acpi_operand_object *internal_object,
3224be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  u8 * buffer, acpi_size * space_used)
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3244be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_object *external_object;
3254be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status;
3264be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	struct acpi_pkg_info info;
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3284be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	ACPI_FUNCTION_TRACE("ut_copy_ipackage_to_epackage");
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * First package at head of the buffer
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
3334be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	external_object = ACPI_CAST_PTR(union acpi_object, buffer);
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Free space begins right after the first package
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
3384be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	info.length = ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object));
3394be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	info.free_space =
3404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	    buffer + ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object));
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	info.object_space = 0;
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	info.num_packages = 1;
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	external_object->type = ACPI_GET_OBJECT_TYPE(internal_object);
3454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	external_object->package.count = internal_object->package.count;
3464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	external_object->package.elements = ACPI_CAST_PTR(union acpi_object,
3474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							  info.free_space);
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Leave room for an array of ACPI_OBJECTS in the buffer
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * and move the free space past it
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
3534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	info.length += (acpi_size) external_object->package.count *
3544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	    ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object));
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	info.free_space += external_object->package.count *
3564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	    ACPI_ROUND_UP_TO_NATIVE_WORD(sizeof(union acpi_object));
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	status = acpi_ut_walk_package_tree(internal_object, external_object,
3594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					   acpi_ut_copy_ielement_to_eelement,
3604be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					   &info);
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*space_used = info.length;
3634be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(status);
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_copy_iobject_to_eobject
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
37044f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS:  internal_object     - The internal object to be converted
37144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore *              buffer_ptr          - Where the object is returned
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to build an API object to be returned to
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              the caller.
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status
3814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_iobject_to_eobject(union acpi_operand_object *internal_object,
3824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				struct acpi_buffer *ret_buffer)
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3844be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status;
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	ACPI_FUNCTION_TRACE("ut_copy_iobject_to_eobject");
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (ACPI_GET_OBJECT_TYPE(internal_object) == ACPI_TYPE_PACKAGE) {
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Package object:  Copy all subobjects (including
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * nested packages)
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
3934be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		status = acpi_ut_copy_ipackage_to_epackage(internal_object,
3944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							   ret_buffer->pointer,
3954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							   &ret_buffer->length);
3964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	} else {
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Build a simple object (no nested objects)
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
4004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		status = acpi_ut_copy_isimple_to_esimple(internal_object,
401c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore							 ACPI_CAST_PTR(union
402c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore								       acpi_object,
403c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore								       ret_buffer->
404c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore								       pointer),
405c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore							 ACPI_ADD_PTR(u8,
406c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore								      ret_buffer->
407c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore								      pointer,
408c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore								      ACPI_ROUND_UP_TO_NATIVE_WORD
409c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore								      (sizeof
410c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore								       (union
411c51a4de85de720670f2fbc592a6f8040af72ad87Bob Moore									acpi_object))),
4124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							 &ret_buffer->length);
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * build simple does not include the object size in the length
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * so we add it in here
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
4174be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		ret_buffer->length += sizeof(union acpi_object);
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(status);
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_copy_esimple_to_isimple
4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
42744f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS:  external_object     - The external object to be converted
42844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore *              ret_internal_object - Where the internal object is returned
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function copies an external object to an internal one.
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              NOTE: Pointers can be copied, we don't need to copy data.
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              (The pointers have to be valid in our address space no matter
4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              what we do with them!)
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
43944f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status
4404be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_esimple_to_isimple(union acpi_object *external_object,
4414be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				union acpi_operand_object **ret_internal_object)
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *internal_object;
4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	ACPI_FUNCTION_TRACE("ut_copy_esimple_to_isimple");
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Simple types supported are: String, Buffer, Integer
4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (external_object->type) {
4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_STRING:
4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_BUFFER:
4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_INTEGER:
4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		internal_object = acpi_ut_create_internal_object((u8)
4564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown								 external_object->
4574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown								 type);
4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!internal_object) {
4594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			return_ACPI_STATUS(AE_NO_MEMORY);
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* All other types are not supported */
4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4664be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(AE_SUPPORT);
4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Must COPY string and buffer contents */
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (external_object->type) {
4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_STRING:
4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		internal_object->string.pointer =
4754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    ACPI_MEM_CALLOCATE((acpi_size) external_object->string.
4764be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				       length + 1);
4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!internal_object->string.pointer) {
4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			goto error_exit;
4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		ACPI_MEMCPY(internal_object->string.pointer,
4824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    external_object->string.pointer,
4834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    external_object->string.length);
4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		internal_object->string.length = external_object->string.length;
4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_BUFFER:
4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		internal_object->buffer.pointer =
4914be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    ACPI_MEM_CALLOCATE(external_object->buffer.length);
4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!internal_object->buffer.pointer) {
4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			goto error_exit;
4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		ACPI_MEMCPY(internal_object->buffer.pointer,
4974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    external_object->buffer.pointer,
4984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    external_object->buffer.length);
4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		internal_object->buffer.length = external_object->buffer.length;
5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_INTEGER:
5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5054be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		internal_object->integer.value = external_object->integer.value;
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Other types can't get here */
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*ret_internal_object = internal_object;
5144be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(AE_OK);
5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5164be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown      error_exit:
5174be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_ut_remove_reference(internal_object);
5184be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(AE_NO_MEMORY);
5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef ACPI_FUTURE_IMPLEMENTATION
5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Code to convert packages that are parameters to control methods */
5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_copy_epackage_to_ipackage
5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  *internal_object   - Pointer to the object we are returning
5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              *Buffer            - Where the object is returned
5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              *space_used        - Where the length of the object is returned
5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to place a package object in a user
5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              buffer.  A package object by definition contains other objects.
5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              The buffer is assumed to have sufficient space for the object.
5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              The caller must have verified the buffer length needed using the
5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              acpi_ut_get_object_size function before calling this function.
5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic acpi_status
5444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_epackage_to_ipackage(union acpi_operand_object *internal_object,
5454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  u8 * buffer, u32 * space_used)
5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	u8 *free_space;
5484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_object *external_object;
5494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	u32 length = 0;
5504be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	u32 this_index;
5514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	u32 object_space = 0;
5524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *this_internal_obj;
5534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_object *this_external_obj;
5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	ACPI_FUNCTION_TRACE("ut_copy_epackage_to_ipackage");
5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * First package at head of the buffer
5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	external_object = (union acpi_object *)buffer;
5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Free space begins right after the first package
5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	free_space = buffer + sizeof(union acpi_object);
5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	external_object->type = ACPI_GET_OBJECT_TYPE(internal_object);
5684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	external_object->package.count = internal_object->package.count;
5694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	external_object->package.elements = (union acpi_object *)free_space;
5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Build an array of ACPI_OBJECTS in the buffer
5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * and move the free space past it
5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
5754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	free_space +=
5764be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	    external_object->package.count * sizeof(union acpi_object);
5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Call walk_package */
5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown#endif				/* Future implementation */
5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_copy_eobject_to_iobject
5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  *internal_object   - The external object to be converted
5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              *buffer_ptr     - Where the internal object is returned
5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status          - the status of the call
5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Converts an external object to an internal object.
5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status
5984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_eobject_to_iobject(union acpi_object *external_object,
5994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				union acpi_operand_object **internal_object)
6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
6014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status;
6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	ACPI_FUNCTION_TRACE("ut_copy_eobject_to_iobject");
6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (external_object->type == ACPI_TYPE_PACKAGE) {
6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Packages as external input to control methods are not supported,
6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
609b8e4d89357fc434618a59c1047cac72641191805Bob Moore		ACPI_ERROR((AE_INFO,
610b8e4d89357fc434618a59c1047cac72641191805Bob Moore			    "Packages as parameters not implemented!"));
6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else {
6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Build a simple object (no nested objects)
6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
6194be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		status =
6204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    acpi_ut_copy_esimple_to_isimple(external_object,
6214be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown						    internal_object);
6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6244be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(status);
6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_copy_simple_object
6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  source_desc         - The internal object to be copied
6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              dest_desc           - New target object
6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Simple copy of one internal object to another.  Reference count
6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              of the destination object is preserved.
6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
64144f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status
6424be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_simple_object(union acpi_operand_object *source_desc,
6434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			   union acpi_operand_object *dest_desc)
6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
6454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	u16 reference_count;
6464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *next_object;
6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Save fields from destination that we don't want to overwrite */
6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	reference_count = dest_desc->common.reference_count;
6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	next_object = dest_desc->common.next_object;
6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	/* Copy the entire source object over the destination object */
6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	ACPI_MEMCPY((char *)dest_desc, (char *)source_desc,
6564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    sizeof(union acpi_operand_object));
6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Restore the saved fields */
6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dest_desc->common.reference_count = reference_count;
6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dest_desc->common.next_object = next_object;
6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6636f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore	/* New object is not static, regardless of source */
6646f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore
6656f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore	dest_desc->common.flags &= ~AOPOBJ_STATIC_POINTER;
6666f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore
6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Handle the objects with extra data */
6681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	switch (ACPI_GET_OBJECT_TYPE(dest_desc)) {
6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_BUFFER:
6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Allocate and copy the actual buffer if and only if:
6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * 1) There is a valid buffer pointer
6746f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore		 * 2) The buffer has a length > 0
6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if ((source_desc->buffer.pointer) &&
6774be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    (source_desc->buffer.length)) {
6786f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore			dest_desc->buffer.pointer =
6794be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    ACPI_MEM_ALLOCATE(source_desc->buffer.length);
6806f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore			if (!dest_desc->buffer.pointer) {
6816f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore				return (AE_NO_MEMORY);
6826f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore			}
6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6846f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore			/* Copy the actual buffer data */
6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6864be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			ACPI_MEMCPY(dest_desc->buffer.pointer,
6874be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				    source_desc->buffer.pointer,
6884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				    source_desc->buffer.length);
6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
6911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_STRING:
6931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
6941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Allocate and copy the actual string if and only if:
6951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * 1) There is a valid string pointer
6966f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore		 * (Pointer to a NULL string is allowed)
6971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
6986f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore		if (source_desc->string.pointer) {
6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			dest_desc->string.pointer =
7004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    ACPI_MEM_ALLOCATE((acpi_size) source_desc->string.
7014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					      length + 1);
7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!dest_desc->string.pointer) {
7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return (AE_NO_MEMORY);
7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7066f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore			/* Copy the actual string data */
7076f42ccf2fc50ecee8ea170040627f268430c1648Robert Moore
7084be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			ACPI_MEMCPY(dest_desc->string.pointer,
7094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				    source_desc->string.pointer,
7104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				    (acpi_size) source_desc->string.length + 1);
7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_LOCAL_REFERENCE:
7151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
7161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * We copied the reference object, so we now must add a reference
7171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * to the object pointed to by the reference
7181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
7194be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		acpi_ut_add_reference(source_desc->reference.object);
7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Nothing to do for other simple objects */
7241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
7251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (AE_OK);
7281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
7291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_copy_ielement_to_ielement
7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
7341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  acpi_pkg_callback
7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
7371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
7381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Copy one package element to another package element
7391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
7401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
7411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
74244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status
7434be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ielement_to_ielement(u8 object_type,
7444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  union acpi_operand_object *source_object,
7454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  union acpi_generic_state *state,
7464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  void *context)
7471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
7484be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status = AE_OK;
7494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	u32 this_index;
7504be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object **this_target_ptr;
7514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *target_object;
7521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	ACPI_FUNCTION_ENTRY();
7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	this_index = state->pkg.index;
7561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	this_target_ptr = (union acpi_operand_object **)
7574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	    &state->pkg.dest_object->package.elements[this_index];
7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (object_type) {
7601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_COPY_TYPE_SIMPLE:
7611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* A null source object indicates a (legal) null package element */
7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (source_object) {
7651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/*
7661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 * This is a simple object, just copy it
7671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 */
7684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			target_object =
7694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    acpi_ut_create_internal_object(ACPI_GET_OBJECT_TYPE
7704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							   (source_object));
7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!target_object) {
7721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return (AE_NO_MEMORY);
7731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
7741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			status =
7764be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			    acpi_ut_copy_simple_object(source_object,
7774be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown						       target_object);
7784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			if (ACPI_FAILURE(status)) {
7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				goto error_exit;
7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			*this_target_ptr = target_object;
7834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		} else {
7841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* Pass through a null element */
7851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			*this_target_ptr = NULL;
7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
7881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
7891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_COPY_TYPE_PACKAGE:
7911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
7931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * This object is a package - go down another nesting level
7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Create and build the package object
7951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
7964be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		target_object =
7974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE);
7981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!target_object) {
7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return (AE_NO_MEMORY);
8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		target_object->package.count = source_object->package.count;
8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		target_object->common.flags = source_object->common.flags;
8041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
8061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Create the object array
8071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
8081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		target_object->package.elements =
8094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    ACPI_MEM_CALLOCATE(((acpi_size) source_object->package.
8104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					count + 1) * sizeof(void *));
8111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!target_object->package.elements) {
8121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			status = AE_NO_MEMORY;
8131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			goto error_exit;
8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
8151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Pass the new package object back to the package walk routine
8181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
8191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		state->pkg.this_target_obj = target_object;
8201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
8221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Store the object pointer in the parent package object
8231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
8241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*this_target_ptr = target_object;
8251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
8261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
8281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return (AE_BAD_PARAMETER);
8291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
8301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (status);
8321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8334be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown      error_exit:
8344be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_ut_remove_reference(target_object);
8351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (status);
8361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
8371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
8391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
8401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_copy_ipackage_to_ipackage
8411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
8421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  *source_obj     - Pointer to the source package object
8431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              *dest_obj       - Where the internal object is returned
8441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
8451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status          - the status of the call
8461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
8471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: This function is called to copy an internal package object
8481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              into another internal package object.
8491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
8501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
8511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
85244f6c01242da4e162f28d8e1216a8c7a91174605Robert Moorestatic acpi_status
8534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_ipackage_to_ipackage(union acpi_operand_object *source_obj,
8544be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  union acpi_operand_object *dest_obj,
8554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				  struct acpi_walk_state *walk_state)
8561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
8574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status = AE_OK;
8581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	ACPI_FUNCTION_TRACE("ut_copy_ipackage_to_ipackage");
8601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8614be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	dest_obj->common.type = ACPI_GET_OBJECT_TYPE(source_obj);
8624be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	dest_obj->common.flags = source_obj->common.flags;
8631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dest_obj->package.count = source_obj->package.count;
8641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
8661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Create the object array and walk the source package tree
8671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
8684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	dest_obj->package.elements = ACPI_MEM_CALLOCATE(((acpi_size)
8694be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							 source_obj->package.
8704be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							 count +
8714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown							 1) * sizeof(void *));
8721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!dest_obj->package.elements) {
873b8e4d89357fc434618a59c1047cac72641191805Bob Moore		ACPI_ERROR((AE_INFO, "Package allocation failure"));
8744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(AE_NO_MEMORY);
8751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
8761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
8781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * Copy the package element-by-element by walking the package "tree".
8791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * This handles nested packages of arbitrary depth.
8801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
8814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	status = acpi_ut_walk_package_tree(source_obj, dest_obj,
8824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					   acpi_ut_copy_ielement_to_ielement,
8834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					   walk_state);
8844be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (ACPI_FAILURE(status)) {
88552fc0b026e99b5d5d585095148d997d5634bbc25Bob Moore
8861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* On failure, delete the destination package object */
8871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		acpi_ut_remove_reference(dest_obj);
8891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
8901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8914be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(status);
8921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
8931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
8951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
8961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_copy_iobject_to_iobject
8971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
8981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  walk_state          - Current walk state
8991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              source_desc         - The internal object to be copied
9001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              dest_desc           - Where the copied object is returned
9011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
9021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
9031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
9041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Copy an internal object to a new internal object
9051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
9061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
9071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status
9094be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_copy_iobject_to_iobject(union acpi_operand_object *source_desc,
9104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				union acpi_operand_object **dest_desc,
9114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				struct acpi_walk_state *walk_state)
9121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
9134be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status = AE_OK;
9141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9154be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	ACPI_FUNCTION_TRACE("ut_copy_iobject_to_iobject");
9161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Create the top level object */
9181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9194be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	*dest_desc =
9204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	    acpi_ut_create_internal_object(ACPI_GET_OBJECT_TYPE(source_desc));
9211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!*dest_desc) {
9224be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(AE_NO_MEMORY);
9231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
9241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Copy the object and possible subobjects */
9261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9274be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (ACPI_GET_OBJECT_TYPE(source_desc) == ACPI_TYPE_PACKAGE) {
9284be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		status =
9294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		    acpi_ut_copy_ipackage_to_ipackage(source_desc, *dest_desc,
9304be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown						      walk_state);
9314be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	} else {
9324be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		status = acpi_ut_copy_simple_object(source_desc, *dest_desc);
9331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
9341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9354be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(status);
9361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
937