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