2005-04-17 00:20:36 +02:00
/******************************************************************************
*
* Module Name : uteval - Object evaluation
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
2006-01-13 22:22:00 +01:00
* Copyright ( C ) 2000 - 2006 , R . Byron Moore
2005-04-17 00:20:36 +02:00
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions , and the following disclaimer ,
* without modification .
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
* substantially similar to the " NO WARRANTY " disclaimer below
* ( " Disclaimer " ) and any redistribution must be conditioned upon
* including a substantially similar Disclaimer requirement for further
* binary redistribution .
* 3. Neither the names of the above - listed copyright holders nor the names
* of any contributors may be used to endorse or promote products derived
* from this software without specific prior written permission .
*
* Alternatively , this software may be distributed under the terms of the
* GNU General Public License ( " GPL " ) version 2 as published by the Free
* Software Foundation .
*
* NO WARRANTY
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
* DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION )
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT ,
* STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES .
*/
# include <acpi/acpi.h>
# include <acpi/acnamesp.h>
# include <acpi/acinterp.h>
# define _COMPONENT ACPI_UTILITIES
2005-08-05 06:44:28 +02:00
ACPI_MODULE_NAME ( " uteval " )
2005-04-17 00:20:36 +02:00
2005-04-19 04:49:35 +02:00
/* Local prototypes */
static void
2005-08-05 06:44:28 +02:00
acpi_ut_copy_id_string ( char * destination , char * source , acpi_size max_length ) ;
2005-04-19 04:49:35 +02:00
static acpi_status
2005-08-05 06:44:28 +02:00
acpi_ut_translate_one_cid ( union acpi_operand_object * obj_desc ,
struct acpi_compatible_id * one_cid ) ;
2005-04-17 00:20:36 +02:00
/*******************************************************************************
*
* FUNCTION : acpi_ut_osi_implementation
*
* PARAMETERS : walk_state - Current walk state
*
* RETURN : Status
*
* DESCRIPTION : Implementation of _OSI predefined control method
* Supported = _OSI ( String )
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 06:44:28 +02:00
acpi_status acpi_ut_osi_implementation ( struct acpi_walk_state * walk_state )
2005-04-17 00:20:36 +02:00
{
2005-08-05 06:44:28 +02:00
union acpi_operand_object * string_desc ;
union acpi_operand_object * return_desc ;
acpi_native_uint i ;
2005-04-17 00:20:36 +02:00
2005-08-05 06:44:28 +02:00
ACPI_FUNCTION_TRACE ( " ut_osi_implementation " ) ;
2005-04-17 00:20:36 +02:00
/* Validate the string input argument */
string_desc = walk_state - > arguments [ 0 ] . object ;
if ( ! string_desc | | ( string_desc - > common . type ! = ACPI_TYPE_STRING ) ) {
2005-08-05 06:44:28 +02:00
return_ACPI_STATUS ( AE_TYPE ) ;
2005-04-17 00:20:36 +02:00
}
/* Create a return object (Default value = 0) */
2005-08-05 06:44:28 +02:00
return_desc = acpi_ut_create_internal_object ( ACPI_TYPE_INTEGER ) ;
2005-04-17 00:20:36 +02:00
if ( ! return_desc ) {
2005-08-05 06:44:28 +02:00
return_ACPI_STATUS ( AE_NO_MEMORY ) ;
2005-04-17 00:20:36 +02:00
}
/* Compare input string to table of supported strings */
for ( i = 0 ; i < ACPI_NUM_OSI_STRINGS ; i + + ) {
2005-08-05 06:44:28 +02:00
if ( ! ACPI_STRCMP ( string_desc - > string . pointer ,
2005-12-16 23:05:00 +01:00
ACPI_CAST_PTR ( char ,
acpi_gbl_valid_osi_strings [ i ] ) ) )
{
2005-04-17 00:20:36 +02:00
/* This string is supported */
return_desc - > integer . value = 0xFFFFFFFF ;
break ;
}
}
walk_state - > return_desc = return_desc ;
2005-08-05 06:44:28 +02:00
return_ACPI_STATUS ( AE_CTRL_TERMINATE ) ;
2005-04-17 00:20:36 +02:00
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_evaluate_object
*
* PARAMETERS : prefix_node - Starting node
* Path - Path to object from starting node
* expected_return_types - Bitmap of allowed return types
* return_desc - Where a return value is stored
*
* RETURN : Status
*
* DESCRIPTION : Evaluates a namespace object and verifies the type of the
* return object . Common code that simplifies accessing objects
* that have required return objects of fixed types .
*
* NOTE : Internal function , no parameter validation
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status
2005-08-05 06:44:28 +02:00
acpi_ut_evaluate_object ( struct acpi_namespace_node * prefix_node ,
char * path ,
u32 expected_return_btypes ,
union acpi_operand_object * * return_desc )
2005-04-17 00:20:36 +02:00
{
2005-08-05 06:44:28 +02:00
struct acpi_parameter_info info ;
acpi_status status ;
u32 return_btype ;
2005-04-17 00:20:36 +02:00
2005-08-05 06:44:28 +02:00
ACPI_FUNCTION_TRACE ( " ut_evaluate_object " ) ;
2005-04-17 00:20:36 +02:00
info . node = prefix_node ;
info . parameters = NULL ;
info . parameter_type = ACPI_PARAM_ARGS ;
/* Evaluate the object/method */
2005-08-05 06:44:28 +02:00
status = acpi_ns_evaluate_relative ( path , & info ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-17 00:20:36 +02:00
if ( status = = AE_NOT_FOUND ) {
2005-08-05 06:44:28 +02:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_EXEC ,
" [%4.4s.%s] was not found \n " ,
acpi_ut_get_node_name ( prefix_node ) ,
path ) ) ;
} else {
2006-01-13 22:22:00 +01:00
ACPI_REPORT_MTERROR ( " Method execution failed " ,
prefix_node , path , status ) ;
2005-04-17 00:20:36 +02:00
}
2005-08-05 06:44:28 +02:00
return_ACPI_STATUS ( status ) ;
2005-04-17 00:20:36 +02:00
}
/* Did we get a return object? */
if ( ! info . return_object ) {
if ( expected_return_btypes ) {
2006-01-13 22:22:00 +01:00
ACPI_REPORT_MTERROR ( " No object was returned from " ,
prefix_node , path , AE_NOT_EXIST ) ;
2005-04-17 00:20:36 +02:00
2005-08-05 06:44:28 +02:00
return_ACPI_STATUS ( AE_NOT_EXIST ) ;
2005-04-17 00:20:36 +02:00
}
2005-08-05 06:44:28 +02:00
return_ACPI_STATUS ( AE_OK ) ;
2005-04-17 00:20:36 +02:00
}
/* Map the return object type to the bitmapped type */
2005-08-05 06:44:28 +02:00
switch ( ACPI_GET_OBJECT_TYPE ( info . return_object ) ) {
2005-04-17 00:20:36 +02:00
case ACPI_TYPE_INTEGER :
return_btype = ACPI_BTYPE_INTEGER ;
break ;
case ACPI_TYPE_BUFFER :
return_btype = ACPI_BTYPE_BUFFER ;
break ;
case ACPI_TYPE_STRING :
return_btype = ACPI_BTYPE_STRING ;
break ;
case ACPI_TYPE_PACKAGE :
return_btype = ACPI_BTYPE_PACKAGE ;
break ;
default :
return_btype = 0 ;
break ;
}
2005-08-05 06:44:28 +02:00
if ( ( acpi_gbl_enable_interpreter_slack ) & & ( ! expected_return_btypes ) ) {
2005-04-17 00:20:36 +02:00
/*
* We received a return object , but one was not expected . This can
* happen frequently if the " implicit return " feature is enabled .
* Just delete the return object and return AE_OK .
*/
2005-08-05 06:44:28 +02:00
acpi_ut_remove_reference ( info . return_object ) ;
return_ACPI_STATUS ( AE_OK ) ;
2005-04-17 00:20:36 +02:00
}
/* Is the return object one of the expected types? */
if ( ! ( expected_return_btypes & return_btype ) ) {
2006-01-13 22:22:00 +01:00
ACPI_REPORT_MTERROR ( " Return object type is incorrect " ,
prefix_node , path , AE_TYPE ) ;
ACPI_REPORT_ERROR ( ( " Type returned from %s was incorrect: %s, expected Btypes: %X \n " , path , acpi_ut_get_object_type_name ( info . return_object ) , expected_return_btypes ) ) ;
2005-04-17 00:20:36 +02:00
/* On error exit, we must delete the return object */
2005-08-05 06:44:28 +02:00
acpi_ut_remove_reference ( info . return_object ) ;
return_ACPI_STATUS ( AE_TYPE ) ;
2005-04-17 00:20:36 +02:00
}
/* Object type is OK, return it */
* return_desc = info . return_object ;
2005-08-05 06:44:28 +02:00
return_ACPI_STATUS ( AE_OK ) ;
2005-04-17 00:20:36 +02:00
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_evaluate_numeric_object
*
2005-04-19 04:49:35 +02:00
* PARAMETERS : object_name - Object name to be evaluated
2005-04-17 00:20:36 +02:00
* device_node - Node for the device
2005-04-19 04:49:35 +02:00
* Address - Where the value is returned
2005-04-17 00:20:36 +02:00
*
* RETURN : Status
*
* DESCRIPTION : Evaluates a numeric namespace object for a selected device
* and stores result in * Address .
*
* NOTE : Internal function , no parameter validation
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status
2005-08-05 06:44:28 +02:00
acpi_ut_evaluate_numeric_object ( char * object_name ,
struct acpi_namespace_node * device_node ,
acpi_integer * address )
2005-04-17 00:20:36 +02:00
{
2005-08-05 06:44:28 +02:00
union acpi_operand_object * obj_desc ;
acpi_status status ;
2005-04-17 00:20:36 +02:00
2005-08-05 06:44:28 +02:00
ACPI_FUNCTION_TRACE ( " ut_evaluate_numeric_object " ) ;
2005-04-17 00:20:36 +02:00
2005-08-05 06:44:28 +02:00
status = acpi_ut_evaluate_object ( device_node , object_name ,
ACPI_BTYPE_INTEGER , & obj_desc ) ;
if ( ACPI_FAILURE ( status ) ) {
return_ACPI_STATUS ( status ) ;
2005-04-17 00:20:36 +02:00
}
/* Get the returned Integer */
* address = obj_desc - > integer . value ;
/* On exit, we must delete the return object */
2005-08-05 06:44:28 +02:00
acpi_ut_remove_reference ( obj_desc ) ;
return_ACPI_STATUS ( status ) ;
2005-04-17 00:20:36 +02:00
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_copy_id_string
*
* PARAMETERS : Destination - Where to copy the string
* Source - Source string
* max_length - Length of the destination buffer
*
* RETURN : None
*
* DESCRIPTION : Copies an ID string for the _HID , _CID , and _UID methods .
* Performs removal of a leading asterisk if present - - workaround
* for a known issue on a bunch of machines .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void
2005-08-05 06:44:28 +02:00
acpi_ut_copy_id_string ( char * destination , char * source , acpi_size max_length )
2005-04-17 00:20:36 +02:00
{
/*
* Workaround for ID strings that have a leading asterisk . This construct
* is not allowed by the ACPI specification ( ID strings must be
* alphanumeric ) , but enough existing machines have this embedded in their
* ID strings that the following code is useful .
*/
if ( * source = = ' * ' ) {
source + + ;
}
/* Do the actual copy */
2005-08-05 06:44:28 +02:00
ACPI_STRNCPY ( destination , source , max_length ) ;
2005-04-17 00:20:36 +02:00
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_execute_HID
*
* PARAMETERS : device_node - Node for the device
2005-04-19 04:49:35 +02:00
* Hid - Where the HID is returned
2005-04-17 00:20:36 +02:00
*
* RETURN : Status
*
* DESCRIPTION : Executes the _HID control method that returns the hardware
* ID of the device .
*
* NOTE : Internal function , no parameter validation
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status
2005-08-05 06:44:28 +02:00
acpi_ut_execute_HID ( struct acpi_namespace_node * device_node ,
struct acpi_device_id * hid )
2005-04-17 00:20:36 +02:00
{
2005-08-05 06:44:28 +02:00
union acpi_operand_object * obj_desc ;
acpi_status status ;
2005-04-17 00:20:36 +02:00
2005-08-05 06:44:28 +02:00
ACPI_FUNCTION_TRACE ( " ut_execute_HID " ) ;
2005-04-17 00:20:36 +02:00
2005-08-05 06:44:28 +02:00
status = acpi_ut_evaluate_object ( device_node , METHOD_NAME__HID ,
ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING ,
& obj_desc ) ;
if ( ACPI_FAILURE ( status ) ) {
return_ACPI_STATUS ( status ) ;
2005-04-17 00:20:36 +02:00
}
2005-08-05 06:44:28 +02:00
if ( ACPI_GET_OBJECT_TYPE ( obj_desc ) = = ACPI_TYPE_INTEGER ) {
2005-04-17 00:20:36 +02:00
/* Convert the Numeric HID to string */
2005-08-05 06:44:28 +02:00
acpi_ex_eisa_id_to_string ( ( u32 ) obj_desc - > integer . value ,
hid - > value ) ;
} else {
2005-04-17 00:20:36 +02:00
/* Copy the String HID from the returned object */
2005-08-05 06:44:28 +02:00
acpi_ut_copy_id_string ( hid - > value , obj_desc - > string . pointer ,
sizeof ( hid - > value ) ) ;
2005-04-17 00:20:36 +02:00
}
/* On exit, we must delete the return object */
2005-08-05 06:44:28 +02:00
acpi_ut_remove_reference ( obj_desc ) ;
return_ACPI_STATUS ( status ) ;
2005-04-17 00:20:36 +02:00
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_translate_one_cid
*
* PARAMETERS : obj_desc - _CID object , must be integer or string
* one_cid - Where the CID string is returned
*
* RETURN : Status
*
* DESCRIPTION : Return a numeric or string _CID value as a string .
* ( Compatible ID )
*
* NOTE : Assumes a maximum _CID string length of
* ACPI_MAX_CID_LENGTH .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static acpi_status
2005-08-05 06:44:28 +02:00
acpi_ut_translate_one_cid ( union acpi_operand_object * obj_desc ,
struct acpi_compatible_id * one_cid )
2005-04-17 00:20:36 +02:00
{
2005-08-05 06:44:28 +02:00
switch ( ACPI_GET_OBJECT_TYPE ( obj_desc ) ) {
2005-04-17 00:20:36 +02:00
case ACPI_TYPE_INTEGER :
/* Convert the Numeric CID to string */
2005-08-05 06:44:28 +02:00
acpi_ex_eisa_id_to_string ( ( u32 ) obj_desc - > integer . value ,
one_cid - > value ) ;
2005-04-17 00:20:36 +02:00
return ( AE_OK ) ;
case ACPI_TYPE_STRING :
if ( obj_desc - > string . length > ACPI_MAX_CID_LENGTH ) {
return ( AE_AML_STRING_LIMIT ) ;
}
/* Copy the String CID from the returned object */
2005-08-05 06:44:28 +02:00
acpi_ut_copy_id_string ( one_cid - > value , obj_desc - > string . pointer ,
ACPI_MAX_CID_LENGTH ) ;
2005-04-17 00:20:36 +02:00
return ( AE_OK ) ;
default :
return ( AE_TYPE ) ;
}
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_execute_CID
*
* PARAMETERS : device_node - Node for the device
2005-04-19 04:49:35 +02:00
* return_cid_list - Where the CID list is returned
2005-04-17 00:20:36 +02:00
*
* RETURN : Status
*
* DESCRIPTION : Executes the _CID control method that returns one or more
* compatible hardware IDs for the device .
*
* NOTE : Internal function , no parameter validation
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status
2005-08-05 06:44:28 +02:00
acpi_ut_execute_CID ( struct acpi_namespace_node * device_node ,
struct acpi_compatible_id_list * * return_cid_list )
2005-04-17 00:20:36 +02:00
{
2005-08-05 06:44:28 +02:00
union acpi_operand_object * obj_desc ;
acpi_status status ;
u32 count ;
u32 size ;
2005-04-17 00:20:36 +02:00
struct acpi_compatible_id_list * cid_list ;
2005-08-05 06:44:28 +02:00
acpi_native_uint i ;
2005-04-17 00:20:36 +02:00
2005-08-05 06:44:28 +02:00
ACPI_FUNCTION_TRACE ( " ut_execute_CID " ) ;
2005-04-17 00:20:36 +02:00
/* Evaluate the _CID method for this device */
2005-08-05 06:44:28 +02:00
status = acpi_ut_evaluate_object ( device_node , METHOD_NAME__CID ,
ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING
| ACPI_BTYPE_PACKAGE , & obj_desc ) ;
if ( ACPI_FAILURE ( status ) ) {
return_ACPI_STATUS ( status ) ;
2005-04-17 00:20:36 +02:00
}
/* Get the number of _CIDs returned */
count = 1 ;
2005-08-05 06:44:28 +02:00
if ( ACPI_GET_OBJECT_TYPE ( obj_desc ) = = ACPI_TYPE_PACKAGE ) {
2005-04-17 00:20:36 +02:00
count = obj_desc - > package . count ;
}
/* Allocate a worst-case buffer for the _CIDs */
2005-08-05 06:44:28 +02:00
size = ( ( ( count - 1 ) * sizeof ( struct acpi_compatible_id ) ) +
sizeof ( struct acpi_compatible_id_list ) ) ;
2005-04-17 00:20:36 +02:00
2005-08-05 06:44:28 +02:00
cid_list = ACPI_MEM_CALLOCATE ( ( acpi_size ) size ) ;
2005-04-17 00:20:36 +02:00
if ( ! cid_list ) {
2005-08-05 06:44:28 +02:00
return_ACPI_STATUS ( AE_NO_MEMORY ) ;
2005-04-17 00:20:36 +02:00
}
/* Init CID list */
cid_list - > count = count ;
cid_list - > size = size ;
/*
2005-04-19 04:49:35 +02:00
* A _CID can return either a single compatible ID or a package of
* compatible IDs . Each compatible ID can be one of the following :
* 1 ) Integer ( 32 bit compressed EISA ID ) or
* 2 ) String ( PCI ID format , e . g . " PCI \ VEN_vvvv&DEV_dddd&SUBSYS_ssssssss " )
2005-04-17 00:20:36 +02:00
*/
/* The _CID object can be either a single CID or a package (list) of CIDs */
2005-08-05 06:44:28 +02:00
if ( ACPI_GET_OBJECT_TYPE ( obj_desc ) = = ACPI_TYPE_PACKAGE ) {
2005-04-17 00:20:36 +02:00
/* Translate each package element */
for ( i = 0 ; i < count ; i + + ) {
2005-08-05 06:44:28 +02:00
status =
acpi_ut_translate_one_cid ( obj_desc - > package .
elements [ i ] ,
& cid_list - > id [ i ] ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-17 00:20:36 +02:00
break ;
}
}
2005-08-05 06:44:28 +02:00
} else {
2005-04-17 00:20:36 +02:00
/* Only one CID, translate to a string */
2005-08-05 06:44:28 +02:00
status = acpi_ut_translate_one_cid ( obj_desc , cid_list - > id ) ;
2005-04-17 00:20:36 +02:00
}
/* Cleanup on error */
2005-08-05 06:44:28 +02:00
if ( ACPI_FAILURE ( status ) ) {
ACPI_MEM_FREE ( cid_list ) ;
} else {
2005-04-17 00:20:36 +02:00
* return_cid_list = cid_list ;
}
/* On exit, we must delete the _CID return object */
2005-08-05 06:44:28 +02:00
acpi_ut_remove_reference ( obj_desc ) ;
return_ACPI_STATUS ( status ) ;
2005-04-17 00:20:36 +02:00
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_execute_UID
*
* PARAMETERS : device_node - Node for the device
2005-04-19 04:49:35 +02:00
* Uid - Where the UID is returned
2005-04-17 00:20:36 +02:00
*
* RETURN : Status
*
* DESCRIPTION : Executes the _UID control method that returns the hardware
* ID of the device .
*
* NOTE : Internal function , no parameter validation
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status
2005-08-05 06:44:28 +02:00
acpi_ut_execute_UID ( struct acpi_namespace_node * device_node ,
struct acpi_device_id * uid )
2005-04-17 00:20:36 +02:00
{
2005-08-05 06:44:28 +02:00
union acpi_operand_object * obj_desc ;
acpi_status status ;
2005-04-17 00:20:36 +02:00
2005-08-05 06:44:28 +02:00
ACPI_FUNCTION_TRACE ( " ut_execute_UID " ) ;
2005-04-17 00:20:36 +02:00
2005-08-05 06:44:28 +02:00
status = acpi_ut_evaluate_object ( device_node , METHOD_NAME__UID ,
ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING ,
& obj_desc ) ;
if ( ACPI_FAILURE ( status ) ) {
return_ACPI_STATUS ( status ) ;
2005-04-17 00:20:36 +02:00
}
2005-08-05 06:44:28 +02:00
if ( ACPI_GET_OBJECT_TYPE ( obj_desc ) = = ACPI_TYPE_INTEGER ) {
2005-04-17 00:20:36 +02:00
/* Convert the Numeric UID to string */
2005-08-05 06:44:28 +02:00
acpi_ex_unsigned_integer_to_string ( obj_desc - > integer . value ,
uid - > value ) ;
} else {
2005-04-17 00:20:36 +02:00
/* Copy the String UID from the returned object */
2005-08-05 06:44:28 +02:00
acpi_ut_copy_id_string ( uid - > value , obj_desc - > string . pointer ,
sizeof ( uid - > value ) ) ;
2005-04-17 00:20:36 +02:00
}
/* On exit, we must delete the return object */
2005-08-05 06:44:28 +02:00
acpi_ut_remove_reference ( obj_desc ) ;
return_ACPI_STATUS ( status ) ;
2005-04-17 00:20:36 +02:00
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_execute_STA
*
* PARAMETERS : device_node - Node for the device
2005-04-19 04:49:35 +02:00
* Flags - Where the status flags are returned
2005-04-17 00:20:36 +02:00
*
* RETURN : Status
*
* DESCRIPTION : Executes _STA for selected device and stores results in
* * Flags .
*
* NOTE : Internal function , no parameter validation
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status
2005-08-05 06:44:28 +02:00
acpi_ut_execute_STA ( struct acpi_namespace_node * device_node , u32 * flags )
2005-04-17 00:20:36 +02:00
{
2005-08-05 06:44:28 +02:00
union acpi_operand_object * obj_desc ;
acpi_status status ;
2005-04-17 00:20:36 +02:00
2005-08-05 06:44:28 +02:00
ACPI_FUNCTION_TRACE ( " ut_execute_STA " ) ;
2005-04-17 00:20:36 +02:00
2005-08-05 06:44:28 +02:00
status = acpi_ut_evaluate_object ( device_node , METHOD_NAME__STA ,
ACPI_BTYPE_INTEGER , & obj_desc ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-17 00:20:36 +02:00
if ( AE_NOT_FOUND = = status ) {
2005-08-05 06:44:28 +02:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_EXEC ,
" _STA on %4.4s was not found, assuming device is present \n " ,
acpi_ut_get_node_name ( device_node ) ) ) ;
2005-04-17 00:20:36 +02:00
2005-12-16 23:05:00 +01:00
* flags = ACPI_UINT32_MAX ;
2005-04-17 00:20:36 +02:00
status = AE_OK ;
}
2005-08-05 06:44:28 +02:00
return_ACPI_STATUS ( status ) ;
2005-04-17 00:20:36 +02:00
}
/* Extract the status flags */
* flags = ( u32 ) obj_desc - > integer . value ;
/* On exit, we must delete the return object */
2005-08-05 06:44:28 +02:00
acpi_ut_remove_reference ( obj_desc ) ;
return_ACPI_STATUS ( status ) ;
2005-04-17 00:20:36 +02:00
}
/*******************************************************************************
*
* FUNCTION : acpi_ut_execute_Sxds
*
* PARAMETERS : device_node - Node for the device
2005-04-19 04:49:35 +02:00
* Flags - Where the status flags are returned
2005-04-17 00:20:36 +02:00
*
* RETURN : Status
*
* DESCRIPTION : Executes _STA for selected device and stores results in
* * Flags .
*
* NOTE : Internal function , no parameter validation
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status
2005-08-05 06:44:28 +02:00
acpi_ut_execute_sxds ( struct acpi_namespace_node * device_node , u8 * highest )
2005-04-17 00:20:36 +02:00
{
2005-08-05 06:44:28 +02:00
union acpi_operand_object * obj_desc ;
acpi_status status ;
u32 i ;
2005-04-17 00:20:36 +02:00
2005-08-05 06:44:28 +02:00
ACPI_FUNCTION_TRACE ( " ut_execute_Sxds " ) ;
2005-04-17 00:20:36 +02:00
for ( i = 0 ; i < 4 ; i + + ) {
highest [ i ] = 0xFF ;
2005-08-05 06:44:28 +02:00
status = acpi_ut_evaluate_object ( device_node ,
2005-12-16 23:05:00 +01:00
ACPI_CAST_PTR ( char ,
acpi_gbl_highest_dstate_names
[ i ] ) ,
ACPI_BTYPE_INTEGER , & obj_desc ) ;
2005-08-05 06:44:28 +02:00
if ( ACPI_FAILURE ( status ) ) {
2005-04-17 00:20:36 +02:00
if ( status ! = AE_NOT_FOUND ) {
2005-08-05 06:44:28 +02:00
ACPI_DEBUG_PRINT ( ( ACPI_DB_EXEC ,
" %s on Device %4.4s, %s \n " ,
2005-12-16 23:05:00 +01:00
ACPI_CAST_PTR ( char ,
acpi_gbl_highest_dstate_names
[ i ] ) ,
2005-08-05 06:44:28 +02:00
acpi_ut_get_node_name
( device_node ) ,
acpi_format_exception
( status ) ) ) ;
return_ACPI_STATUS ( status ) ;
2005-04-17 00:20:36 +02:00
}
2005-08-05 06:44:28 +02:00
} else {
2005-04-17 00:20:36 +02:00
/* Extract the Dstate value */
highest [ i ] = ( u8 ) obj_desc - > integer . value ;
/* Delete the return object */
2005-08-05 06:44:28 +02:00
acpi_ut_remove_reference ( obj_desc ) ;
2005-04-17 00:20:36 +02:00
}
}
2005-08-05 06:44:28 +02:00
return_ACPI_STATUS ( AE_OK ) ;
2005-04-17 00:20:36 +02:00
}