2005-04-16 15:20:36 -07:00
/*******************************************************************************
*
* Module Name : nsxfobj - Public interfaces to the ACPI subsystem
* ACPI Object oriented interfaces
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
2016-01-15 08:17:03 +08:00
* Copyright ( C ) 2000 - 2016 , Intel Corp .
2005-04-16 15:20:36 -07: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 .
*/
2013-10-29 09:29:51 +08:00
# define EXPORT_ACPI_INTERFACES
2005-04-16 15:20:36 -07:00
# include <acpi/acpi.h>
2009-01-09 00:30:03 -05:00
# include "accommon.h"
# include "acnamesp.h"
2005-04-16 15:20:36 -07:00
# define _COMPONENT ACPI_NAMESPACE
2005-08-05 00:44:28 -04:00
ACPI_MODULE_NAME ( " nsxfobj " )
2005-04-16 15:20:36 -07:00
/*******************************************************************************
*
* FUNCTION : acpi_get_type
*
2012-07-12 09:40:10 +08:00
* PARAMETERS : handle - Handle of object whose type is desired
2005-04-18 22:49:35 -04:00
* ret_type - Where the type will be placed
2005-04-16 15:20:36 -07:00
*
* RETURN : Status
*
* DESCRIPTION : This routine returns the type associatd with a particular handle
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2016-05-05 12:57:53 +08:00
acpi_status acpi_get_type ( acpi_handle handle , acpi_object_type * ret_type )
2005-04-16 15:20:36 -07:00
{
2005-08-05 00:44:28 -04:00
struct acpi_namespace_node * node ;
acpi_status status ;
2005-04-16 15:20:36 -07:00
/* Parameter Validation */
if ( ! ret_type ) {
return ( AE_BAD_PARAMETER ) ;
}
2015-12-29 13:54:36 +08:00
/* Special case for the predefined Root Node (return type ANY) */
2005-04-16 15:20:36 -07:00
if ( handle = = ACPI_ROOT_OBJECT ) {
* ret_type = ACPI_TYPE_ANY ;
return ( AE_OK ) ;
}
2005-08-05 00:44:28 -04:00
status = acpi_ut_acquire_mutex ( ACPI_MTX_NAMESPACE ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-16 15:20:36 -07:00
return ( status ) ;
}
/* Convert and validate the handle */
2009-12-11 14:57:00 +08:00
node = acpi_ns_validate_handle ( handle ) ;
2005-04-16 15:20:36 -07:00
if ( ! node ) {
2005-08-05 00:44:28 -04:00
( void ) acpi_ut_release_mutex ( ACPI_MTX_NAMESPACE ) ;
2005-04-16 15:20:36 -07:00
return ( AE_BAD_PARAMETER ) ;
}
* ret_type = node - > type ;
2005-08-05 00:44:28 -04:00
status = acpi_ut_release_mutex ( ACPI_MTX_NAMESPACE ) ;
2005-04-16 15:20:36 -07:00
return ( status ) ;
}
2006-10-03 00:00:00 -04:00
ACPI_EXPORT_SYMBOL ( acpi_get_type )
2005-04-16 15:20:36 -07:00
/*******************************************************************************
*
* FUNCTION : acpi_get_parent
*
2012-07-12 09:40:10 +08:00
* PARAMETERS : handle - Handle of object whose parent is desired
2005-04-16 15:20:36 -07:00
* ret_handle - Where the parent handle will be placed
*
* RETURN : Status
*
* DESCRIPTION : Returns a handle to the parent of the object represented by
* Handle .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2016-05-05 12:57:53 +08:00
acpi_status acpi_get_parent ( acpi_handle handle , acpi_handle * ret_handle )
2005-04-16 15:20:36 -07:00
{
2005-08-05 00:44:28 -04:00
struct acpi_namespace_node * node ;
2009-05-21 10:59:15 +08:00
struct acpi_namespace_node * parent_node ;
2005-08-05 00:44:28 -04:00
acpi_status status ;
2005-04-16 15:20:36 -07:00
if ( ! ret_handle ) {
return ( AE_BAD_PARAMETER ) ;
}
/* Special case for the predefined Root Node (no parent) */
if ( handle = = ACPI_ROOT_OBJECT ) {
return ( AE_NULL_ENTRY ) ;
}
2005-08-05 00:44:28 -04:00
status = acpi_ut_acquire_mutex ( ACPI_MTX_NAMESPACE ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-16 15:20:36 -07:00
return ( status ) ;
}
/* Convert and validate the handle */
2009-12-11 14:57:00 +08:00
node = acpi_ns_validate_handle ( handle ) ;
2005-04-16 15:20:36 -07:00
if ( ! node ) {
status = AE_BAD_PARAMETER ;
goto unlock_and_exit ;
}
/* Get the parent entry */
2010-05-26 11:53:07 +08:00
parent_node = node - > parent ;
2009-12-11 14:57:00 +08:00
* ret_handle = ACPI_CAST_PTR ( acpi_handle , parent_node ) ;
2005-04-16 15:20:36 -07:00
/* Return exception if parent is null */
2009-05-21 10:59:15 +08:00
if ( ! parent_node ) {
2005-04-16 15:20:36 -07:00
status = AE_NULL_ENTRY ;
}
2013-10-29 09:30:02 +08:00
unlock_and_exit :
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
( void ) acpi_ut_release_mutex ( ACPI_MTX_NAMESPACE ) ;
2005-04-16 15:20:36 -07:00
return ( status ) ;
}
2006-10-03 00:00:00 -04:00
ACPI_EXPORT_SYMBOL ( acpi_get_parent )
2005-04-16 15:20:36 -07:00
/*******************************************************************************
*
* FUNCTION : acpi_get_next_object
*
2012-07-12 09:40:10 +08:00
* PARAMETERS : type - Type of object to be searched for
* parent - Parent object whose children we are getting
2005-04-16 15:20:36 -07:00
* last_child - Previous child that was found .
* The NEXT child will be returned
* ret_handle - Where handle to the next object is placed
*
* RETURN : Status
*
2012-10-31 02:26:55 +00:00
* DESCRIPTION : Return the next peer object within the namespace . If Handle is
* valid , Scope is ignored . Otherwise , the first object within
2005-04-16 15:20:36 -07:00
* Scope is returned .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status
2005-08-05 00:44:28 -04:00
acpi_get_next_object ( acpi_object_type type ,
acpi_handle parent ,
2016-05-05 12:57:53 +08:00
acpi_handle child , acpi_handle * ret_handle )
2005-04-16 15:20:36 -07:00
{
2005-08-05 00:44:28 -04:00
acpi_status status ;
struct acpi_namespace_node * node ;
struct acpi_namespace_node * parent_node = NULL ;
struct acpi_namespace_node * child_node = NULL ;
2005-04-16 15:20:36 -07:00
/* Parameter validation */
if ( type > ACPI_TYPE_EXTERNAL_MAX ) {
return ( AE_BAD_PARAMETER ) ;
}
2005-08-05 00:44:28 -04:00
status = acpi_ut_acquire_mutex ( ACPI_MTX_NAMESPACE ) ;
if ( ACPI_FAILURE ( status ) ) {
2005-04-16 15:20:36 -07:00
return ( status ) ;
}
/* If null handle, use the parent */
if ( ! child ) {
2006-10-02 00:00:00 -04:00
2005-04-16 15:20:36 -07:00
/* Start search at the beginning of the specified scope */
2009-12-11 14:57:00 +08:00
parent_node = acpi_ns_validate_handle ( parent ) ;
2005-04-16 15:20:36 -07:00
if ( ! parent_node ) {
status = AE_BAD_PARAMETER ;
goto unlock_and_exit ;
}
2005-08-05 00:44:28 -04:00
} else {
2005-04-16 15:20:36 -07:00
/* Non-null handle, ignore the parent */
/* Convert and validate the handle */
2009-12-11 14:57:00 +08:00
child_node = acpi_ns_validate_handle ( child ) ;
2005-04-16 15:20:36 -07:00
if ( ! child_node ) {
status = AE_BAD_PARAMETER ;
goto unlock_and_exit ;
}
}
/* Internal function does the real work */
2009-05-21 10:27:51 +08:00
node = acpi_ns_get_next_node_typed ( type , parent_node , child_node ) ;
2005-04-16 15:20:36 -07:00
if ( ! node ) {
status = AE_NOT_FOUND ;
goto unlock_and_exit ;
}
if ( ret_handle ) {
2009-12-11 14:57:00 +08:00
* ret_handle = ACPI_CAST_PTR ( acpi_handle , node ) ;
2005-04-16 15:20:36 -07:00
}
2013-10-29 09:30:02 +08:00
unlock_and_exit :
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
( void ) acpi_ut_release_mutex ( ACPI_MTX_NAMESPACE ) ;
2005-04-16 15:20:36 -07:00
return ( status ) ;
}
2006-10-03 00:00:00 -04:00
ACPI_EXPORT_SYMBOL ( acpi_get_next_object )