[go: nahoru, domu]

11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module Name: uteval - Object evaluation
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *****************************************************************************/
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
8fbb7a2dc2be493c87399550bdc2ddaa510cdf450Bob Moore * Copyright (C) 2000 - 2014, 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
71b6872ff9a4785a790f9647ee2076e7e616a3bb0eBob Mooreacpi_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;
9029a241cc02110b8b2259fd72719b8cadc03909beBob Moore	info->relative_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:
1261d1ea1b723d9f239f736b8cf284327cbbf9d15d1Chao Guan
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return_btype = ACPI_BTYPE_INTEGER;
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_BUFFER:
1311d1ea1b723d9f239f736b8cf284327cbbf9d15d1Chao Guan
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return_btype = ACPI_BTYPE_BUFFER;
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_STRING:
1361d1ea1b723d9f239f736b8cf284327cbbf9d15d1Chao Guan
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return_btype = ACPI_BTYPE_STRING;
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ACPI_TYPE_PACKAGE:
1411d1ea1b723d9f239f736b8cf284327cbbf9d15d1Chao Guan
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return_btype = ACPI_BTYPE_PACKAGE;
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
1461d1ea1b723d9f239f736b8cf284327cbbf9d15d1Chao Guan
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return_btype = 0;
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1514be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if ((acpi_gbl_enable_interpreter_slack) && (!expected_return_btypes)) {
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/*
15315b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		 * We received a return object, but one was not expected. This can
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * happen frequently if the "implicit return" feature is enabled.
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 * Just delete the return object and return AE_OK.
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 */
1574119532c95547821dbe72d6916dfa1b2148475b3Bob Moore		acpi_ut_remove_reference(info->return_object);
1584119532c95547821dbe72d6916dfa1b2148475b3Bob Moore		goto cleanup;
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Is the return object one of the expected types? */
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!(expected_return_btypes & return_btype)) {
164b8e4d89357fc434618a59c1047cac72641191805Bob Moore		ACPI_ERROR_METHOD("Return object type is incorrect",
165b8e4d89357fc434618a59c1047cac72641191805Bob Moore				  prefix_node, path, AE_TYPE);
166b8e4d89357fc434618a59c1047cac72641191805Bob Moore
167b8e4d89357fc434618a59c1047cac72641191805Bob Moore		ACPI_ERROR((AE_INFO,
168f6a22b0bc417042e83117f52ab1a03696af185abBob Moore			    "Type returned from %s was incorrect: %s, expected Btypes: 0x%X",
169b8e4d89357fc434618a59c1047cac72641191805Bob Moore			    path,
1704119532c95547821dbe72d6916dfa1b2148475b3Bob Moore			    acpi_ut_get_object_type_name(info->return_object),
171b8e4d89357fc434618a59c1047cac72641191805Bob Moore			    expected_return_btypes));
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* On error exit, we must delete the return object */
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1754119532c95547821dbe72d6916dfa1b2148475b3Bob Moore		acpi_ut_remove_reference(info->return_object);
1764119532c95547821dbe72d6916dfa1b2148475b3Bob Moore		status = AE_TYPE;
1774119532c95547821dbe72d6916dfa1b2148475b3Bob Moore		goto cleanup;
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Object type is OK, return it */
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1824119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	*return_desc = info->return_object;
1834119532c95547821dbe72d6916dfa1b2148475b3Bob Moore
18410622bf8ce432e6a53fd3c37163e99e99c9e43eeLv Zhengcleanup:
1854119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	ACPI_FREE(info);
1864119532c95547821dbe72d6916dfa1b2148475b3Bob Moore	return_ACPI_STATUS(status);
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_evaluate_numeric_object
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
19344f6c01242da4e162f28d8e1216a8c7a91174605Robert Moore * PARAMETERS:  object_name         - Object name to be evaluated
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              device_node         - Node for the device
195ba494beeaa69bc0fb01eb89464ad5d57d26e3901Bob Moore *              value               - Where the value is returned
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Evaluates a numeric namespace object for a selected device
20015b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore *              and stores result in *Value.
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              NOTE: Internal function, no parameter validation
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status
2074be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_evaluate_numeric_object(char *object_name,
2084be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown				struct acpi_namespace_node *device_node,
2095df7e6cb42da36c7d878239bebc81907b15f3943Bob Moore				u64 *value)
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *obj_desc;
2124be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status;
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
214b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore	ACPI_FUNCTION_TRACE(ut_evaluate_numeric_object);
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2164be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	status = acpi_ut_evaluate_object(device_node, object_name,
2174be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					 ACPI_BTYPE_INTEGER, &obj_desc);
2184be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (ACPI_FAILURE(status)) {
2194be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(status);
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Get the returned Integer */
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
22415b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore	*value = obj_desc->integer.value;
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* On exit, we must delete the return object */
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2284be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_ut_remove_reference(obj_desc);
2294be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(status);
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION:    acpi_ut_execute_STA
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  device_node         - Node for the device
237ba494beeaa69bc0fb01eb89464ad5d57d26e3901Bob Moore *              flags               - Where the status flags are returned
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN:      Status
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Executes _STA for selected device and stores results in
242a7d5caf6d21814a855422df75c2d8c093cb2019aBob Moore *              *Flags. If _STA does not exist, then the device is assumed
243a7d5caf6d21814a855422df75c2d8c093cb2019aBob Moore *              to be present/functional/enabled (as per the ACPI spec).
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              NOTE: Internal function, no parameter validation
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status
2504be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brownacpi_ut_execute_STA(struct acpi_namespace_node *device_node, u32 * flags)
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *obj_desc;
2534be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status;
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
255b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore	ACPI_FUNCTION_TRACE(ut_execute_STA);
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2574be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	status = acpi_ut_evaluate_object(device_node, METHOD_NAME__STA,
2584be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					 ACPI_BTYPE_INTEGER, &obj_desc);
2594be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	if (ACPI_FAILURE(status)) {
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (AE_NOT_FOUND == status) {
261a7d5caf6d21814a855422df75c2d8c093cb2019aBob Moore			/*
262a7d5caf6d21814a855422df75c2d8c093cb2019aBob Moore			 * if _STA does not exist, then (as per the ACPI specification),
263a7d5caf6d21814a855422df75c2d8c093cb2019aBob Moore			 * the returned flags will indicate that the device is present,
264a7d5caf6d21814a855422df75c2d8c093cb2019aBob Moore			 * functional, and enabled.
265a7d5caf6d21814a855422df75c2d8c093cb2019aBob Moore			 */
2664be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
2674be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					  "_STA on %4.4s was not found, assuming device is present\n",
2684be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown					  acpi_ut_get_node_name(device_node)));
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
270defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore			*flags = ACPI_UINT32_MAX;
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			status = AE_OK;
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2744be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		return_ACPI_STATUS(status);
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Extract the status flags */
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*flags = (u32) obj_desc->integer.value;
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* On exit, we must delete the return object */
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2834be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_ut_remove_reference(obj_desc);
2844be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	return_ACPI_STATUS(status);
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
28915b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * FUNCTION:    acpi_ut_execute_power_methods
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS:  device_node         - Node for the device
29215b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore *              method_names        - Array of power method names
29315b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore *              method_count        - Number of methods to execute
29415b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore *              out_values          - Where the power method values are returned
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
29615b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * RETURN:      Status, out_values
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
29815b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore * DESCRIPTION: Executes the specified power methods for the device and returns
29915b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore *              the result(s).
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              NOTE: Internal function, no parameter validation
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
30315b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore******************************************************************************/
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status
30615b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Mooreacpi_ut_execute_power_methods(struct acpi_namespace_node *device_node,
30715b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore			      const char **method_names,
30815b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore			      u8 method_count, u8 *out_values)
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3104be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	union acpi_operand_object *obj_desc;
3114be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	acpi_status status;
31215b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore	acpi_status final_status = AE_NOT_FOUND;
3134be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown	u32 i;
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31515b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore	ACPI_FUNCTION_TRACE(ut_execute_power_methods);
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31715b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore	for (i = 0; i < method_count; i++) {
31815b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		/*
31915b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		 * Execute the power method (_sx_d or _sx_w). The only allowable
32015b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		 * return type is an Integer.
32115b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		 */
3224be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown		status = acpi_ut_evaluate_object(device_node,
323defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore						 ACPI_CAST_PTR(char,
32415b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore							       method_names[i]),
325defba1d8f233c0d5cf3e1ea6aeb898eca7231860Bob Moore						 ACPI_BTYPE_INTEGER, &obj_desc);
32615b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		if (ACPI_SUCCESS(status)) {
32715b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore			out_values[i] = (u8)obj_desc->integer.value;
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* Delete the return object */
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3314be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown			acpi_ut_remove_reference(obj_desc);
33215b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore			final_status = AE_OK;	/* At least one value is valid */
33315b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore			continue;
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
33515b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore
33615b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		out_values[i] = ACPI_UINT8_MAX;
33715b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		if (status == AE_NOT_FOUND) {
33815b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore			continue;	/* Ignore if not found */
33915b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		}
34015b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore
34115b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore		ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
34215b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore				  "Failed %s on Device %4.4s, %s\n",
34315b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore				  ACPI_CAST_PTR(char, method_names[i]),
34415b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore				  acpi_ut_get_node_name(device_node),
34515b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore				  acpi_format_exception(status)));
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34815b8dd53f5ffaf8e2d9095c423f713423f576c0fBob Moore	return_ACPI_STATUS(final_status);
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
350