[go: nahoru, domu]

uteval.c revision ba494beeaa69bc0fb01eb89464ad5d57d26e3901
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module Name: uteval - Object evaluation
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"
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPONENT          ACPI_UTILITIES
494be44fcd3bf648b782f4460fd06dfae6c42ded4bLen BrownACPI_MODULE_NAME("uteval")
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51ae00d812436dc968f4a5dea7757b6a94910b6dc4Len Brown/*******************************************************************************
52ae00d812436dc968f4a5dea7757b6a94910b6dc4Len Brown *
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_evaluate_object
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  prefix_node         - Starting node
56ba494beeaa69bc0fb01eb89464ad5d57d26e3901Bob Moore *              path                - Path to object from starting node
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              expected_return_types - Bitmap of allowed return types
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              return_desc         - Where a return value is stored
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Evaluates a namespace object and verifies the type of the
6315b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore *              return object. Common code that simplifies accessing objects
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              that have required return objects of fixed types.
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              NOTE: Internal function, no parameter validation
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status
714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			char *path,
734be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			u32 expected_return_btypes,
744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			union acpi_operand_object **return_desc)
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
764119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	struct acpi_evaluate_info *info;
774be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status;
784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	u32 return_btype;
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
80b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore	ACPI_FUNCTION_TRACE(ut_evaluate_object);
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
824119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	/* Allocate the evaluation information block */
834119532c95547821dbe72d6916dfa1b2148475b3Bob Moore
844119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
854119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	if (!info) {
864119532c95547821dbe72d6916dfa1b2148475b3Bob Moore		return_ACPI_STATUS(AE_NO_MEMORY);
874119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	}
884119532c95547821dbe72d6916dfa1b2148475b3Bob Moore
894119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	info->prefix_node = prefix_node;
904119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	info->pathname = path;
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Evaluate the object/method */
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
944119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	status = acpi_ns_evaluate(info);
954be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (ACPI_FAILURE(status)) {
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (status == AE_NOT_FOUND) {
974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					  "[%4.4s.%s] was not found\n",
994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					  acpi_ut_get_node_name(prefix_node),
1004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					  path));
1014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		} else {
102b8e4d89357fc434618a59c1047cac72641191805Bob Moore			ACPI_ERROR_METHOD("Method execution failed",
103b8e4d89357fc434618a59c1047cac72641191805Bob Moore					  prefix_node, path, status);
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1064119532c95547821dbe72d6916dfa1b2148475b3Bob Moore		goto cleanup;
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Did we get a return object? */
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1114119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	if (!info->return_object) {
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (expected_return_btypes) {
113b8e4d89357fc434618a59c1047cac72641191805Bob Moore			ACPI_ERROR_METHOD("No object was returned from",
114b8e4d89357fc434618a59c1047cac72641191805Bob Moore					  prefix_node, path, AE_NOT_EXIST);
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1164119532c95547821dbe72d6916dfa1b2148475b3Bob Moore			status = AE_NOT_EXIST;
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1194119532c95547821dbe72d6916dfa1b2148475b3Bob Moore		goto cleanup;
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Map the return object type to the bitmapped type */
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1243371c19c294a4cb3649aa4e84606be8a1d999e61Bob Moore	switch ((info->return_object)->common.type) {
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_INTEGER:
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return_btype = ACPI_BTYPE_INTEGER;
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_BUFFER:
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return_btype = ACPI_BTYPE_BUFFER;
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_STRING:
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return_btype = ACPI_BTYPE_STRING;
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_PACKAGE:
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return_btype = ACPI_BTYPE_PACKAGE;
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return_btype = 0;
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if ((acpi_gbl_enable_interpreter_slack) && (!expected_return_btypes)) {
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
14815b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		 * We received a return object, but one was not expected. This can
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * happen frequently if the "implicit return" feature is enabled.
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Just delete the return object and return AE_OK.
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
1524119532c95547821dbe72d6916dfa1b2148475b3Bob Moore		acpi_ut_remove_reference(info->return_object);
1534119532c95547821dbe72d6916dfa1b2148475b3Bob Moore		goto cleanup;
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Is the return object one of the expected types? */
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!(expected_return_btypes & return_btype)) {
159b8e4d89357fc434618a59c1047cac72641191805Bob Moore		ACPI_ERROR_METHOD("Return object type is incorrect",
160b8e4d89357fc434618a59c1047cac72641191805Bob Moore				  prefix_node, path, AE_TYPE);
161b8e4d89357fc434618a59c1047cac72641191805Bob Moore
162b8e4d89357fc434618a59c1047cac72641191805Bob Moore		ACPI_ERROR((AE_INFO,
163f6a22b0bc417042e83117f52ab1a03696af185abBob Moore			    "Type returned from %s was incorrect: %s, expected Btypes: 0x%X",
164b8e4d89357fc434618a59c1047cac72641191805Bob Moore			    path,
1654119532c95547821dbe72d6916dfa1b2148475b3Bob Moore			    acpi_ut_get_object_type_name(info->return_object),
166b8e4d89357fc434618a59c1047cac72641191805Bob Moore			    expected_return_btypes));
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* On error exit, we must delete the return object */
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1704119532c95547821dbe72d6916dfa1b2148475b3Bob Moore		acpi_ut_remove_reference(info->return_object);
1714119532c95547821dbe72d6916dfa1b2148475b3Bob Moore		status = AE_TYPE;
1724119532c95547821dbe72d6916dfa1b2148475b3Bob Moore		goto cleanup;
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Object type is OK, return it */
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1774119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	*return_desc = info->return_object;
1784119532c95547821dbe72d6916dfa1b2148475b3Bob Moore
1794119532c95547821dbe72d6916dfa1b2148475b3Bob Moore      cleanup:
1804119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	ACPI_FREE(info);
1814119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	return_ACPI_STATUS(status);
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_evaluate_numeric_object
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
18844f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS:  object_name         - Object name to be evaluated
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              device_node         - Node for the device
190ba494beeaa69bc0fb01eb89464ad5d57d26e3901Bob Moore *              value               - Where the value is returned
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Evaluates a numeric namespace object for a selected device
19515b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore *              and stores result in *Value.
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              NOTE: Internal function, no parameter validation
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status
2024be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_evaluate_numeric_object(char *object_name,
2034be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				struct acpi_namespace_node *device_node,
2045df7e6cb42da36c7d878239bebc81907b15f3943Bob Moore				u64 *value)
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2064be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *obj_desc;
2074be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status;
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
209b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore	ACPI_FUNCTION_TRACE(ut_evaluate_numeric_object);
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	status = acpi_ut_evaluate_object(device_node, object_name,
2124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					 ACPI_BTYPE_INTEGER, &obj_desc);
2134be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (ACPI_FAILURE(status)) {
2144be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(status);
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Get the returned Integer */
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21915b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore	*value = obj_desc->integer.value;
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* On exit, we must delete the return object */
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2234be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_ut_remove_reference(obj_desc);
2244be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(status);
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_execute_STA
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  device_node         - Node for the device
232ba494beeaa69bc0fb01eb89464ad5d57d26e3901Bob Moore *              flags               - Where the status flags are returned
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Executes _STA for selected device and stores results in
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              *Flags.
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              NOTE: Internal function, no parameter validation
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status
2444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_execute_STA(struct acpi_namespace_node *device_node, u32 * flags)
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2464be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *obj_desc;
2474be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status;
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
249b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore	ACPI_FUNCTION_TRACE(ut_execute_STA);
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	status = acpi_ut_evaluate_object(device_node, METHOD_NAME__STA,
2524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					 ACPI_BTYPE_INTEGER, &obj_desc);
2534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (ACPI_FAILURE(status)) {
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (AE_NOT_FOUND == status) {
2554be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
2564be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					  "_STA on %4.4s was not found, assuming device is present\n",
2574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					  acpi_ut_get_node_name(device_node)));
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
259defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore			*flags = ACPI_UINT32_MAX;
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			status = AE_OK;
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2634be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(status);
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Extract the status flags */
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*flags = (u32) obj_desc->integer.value;
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* On exit, we must delete the return object */
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_ut_remove_reference(obj_desc);
2734be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(status);
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
27815b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * FUNCTION:    acpi_ut_execute_power_methods
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  device_node         - Node for the device
28115b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore *              method_names        - Array of power method names
28215b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore *              method_count        - Number of methods to execute
28315b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore *              out_values          - Where the power method values are returned
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
28515b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * RETURN:      Status, out_values
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
28715b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * DESCRIPTION: Executes the specified power methods for the device and returns
28815b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore *              the result(s).
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              NOTE: Internal function, no parameter validation
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
29215b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore******************************************************************************/
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status
29515b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Mooreacpi_ut_execute_power_methods(struct acpi_namespace_node *device_node,
29615b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore			      const char **method_names,
29715b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore			      u8 method_count, u8 *out_values)
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2994be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *obj_desc;
3004be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status;
30115b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore	acpi_status final_status = AE_NOT_FOUND;
3024be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	u32 i;
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30415b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore	ACPI_FUNCTION_TRACE(ut_execute_power_methods);
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30615b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore	for (i = 0; i < method_count; i++) {
30715b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		/*
30815b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		 * Execute the power method (_sx_d or _sx_w). The only allowable
30915b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		 * return type is an Integer.
31015b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		 */
3114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		status = acpi_ut_evaluate_object(device_node,
312defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore						 ACPI_CAST_PTR(char,
31315b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore							       method_names[i]),
314defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore						 ACPI_BTYPE_INTEGER, &obj_desc);
31515b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		if (ACPI_SUCCESS(status)) {
31615b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore			out_values[i] = (u8)obj_desc->integer.value;
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* Delete the return object */
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			acpi_ut_remove_reference(obj_desc);
32115b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore			final_status = AE_OK;	/* At least one value is valid */
32215b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore			continue;
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
32415b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore
32515b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		out_values[i] = ACPI_UINT8_MAX;
32615b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		if (status == AE_NOT_FOUND) {
32715b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore			continue;	/* Ignore if not found */
32815b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		}
32915b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore
33015b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
33115b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore				  "Failed %s on Device %4.4s, %s\n",
33215b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore				  ACPI_CAST_PTR(char, method_names[i]),
33315b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore				  acpi_ut_get_node_name(device_node),
33415b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore				  acpi_format_exception(status)));
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33715b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore	return_ACPI_STATUS(final_status);
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
339