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