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