2005-04-16 15:20:36 -07:00
/******************************************************************************
*
2013-04-12 00:24:53 +00:00
* Module Name : tbxface - ACPI table - oriented external interfaces
2005-04-16 15:20:36 -07:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
2013-01-25 05:38:56 +00:00
* Copyright ( C ) 2000 - 2013 , 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 .
*/
2011-10-26 16:22:14 -04:00
# include <linux/export.h>
2005-04-16 15:20:36 -07:00
# include <acpi/acpi.h>
2009-01-09 00:30:03 -05:00
# include "accommon.h"
# include "actables.h"
2005-04-16 15:20:36 -07:00
# define _COMPONENT ACPI_TABLES
2005-08-05 00:44:28 -04:00
ACPI_MODULE_NAME ( " tbxface " )
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:20 +03:00
/*******************************************************************************
*
* FUNCTION : acpi_allocate_root_table
*
* PARAMETERS : initial_table_count - Size of initial_table_array , in number of
* struct acpi_table_desc structures
*
* RETURN : Status
*
2012-07-12 09:40:10 +08:00
* DESCRIPTION : Allocate a root table array . Used by iASL compiler and
2007-02-02 19:48:20 +03:00
* acpi_initialize_tables .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status acpi_allocate_root_table ( u32 initial_table_count )
{
2010-04-27 11:16:14 +08:00
acpi_gbl_root_table_list . max_table_count = initial_table_count ;
2007-02-02 19:48:20 +03:00
acpi_gbl_root_table_list . flags = ACPI_ROOT_ALLOW_RESIZE ;
return ( acpi_tb_resize_root_table_list ( ) ) ;
}
2005-04-16 15:20:36 -07:00
/*******************************************************************************
*
2007-02-02 19:48:18 +03:00
* FUNCTION : acpi_initialize_tables
2005-04-16 15:20:36 -07:00
*
2007-02-02 19:48:18 +03:00
* PARAMETERS : initial_table_array - Pointer to an array of pre - allocated
* struct acpi_table_desc structures . If NULL , the
* array is dynamically allocated .
* initial_table_count - Size of initial_table_array , in number of
* struct acpi_table_desc structures
2013-04-12 00:24:53 +00:00
* allow_resize - Flag to tell Table Manager if resize of
2007-02-02 19:48:18 +03:00
* pre - allocated array is allowed . Ignored
* if initial_table_array is NULL .
2005-04-16 15:20:36 -07:00
*
* RETURN : Status
*
2007-02-02 19:48:18 +03:00
* DESCRIPTION : Initialize the table manager , get the RSDP and RSDT / XSDT .
*
* NOTE : Allows static allocation of the initial table array in order
* to avoid the use of dynamic memory in confined environments
* such as the kernel boot sequence where it may not be available .
*
* If the host OS memory managers are initialized , use NULL for
* initial_table_array , and the table will be dynamically allocated .
2005-04-16 15:20:36 -07:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-02-02 19:48:18 +03:00
2007-02-02 19:48:19 +03:00
acpi_status __init
2007-02-02 19:48:20 +03:00
acpi_initialize_tables ( struct acpi_table_desc * initial_table_array ,
2007-02-02 19:48:18 +03:00
u32 initial_table_count , u8 allow_resize )
2005-04-16 15:20:36 -07:00
{
2007-02-02 19:48:19 +03:00
acpi_physical_address rsdp_address ;
2005-08-05 00:44:28 -04:00
acpi_status status ;
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:18 +03:00
ACPI_FUNCTION_TRACE ( acpi_initialize_tables ) ;
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:18 +03:00
/*
2013-04-12 00:24:53 +00:00
* Setup the Root Table Array and allocate the table array
* if requested
2007-02-02 19:48:18 +03:00
*/
if ( ! initial_table_array ) {
2007-02-02 19:48:20 +03:00
status = acpi_allocate_root_table ( initial_table_count ) ;
2007-02-02 19:48:18 +03:00
if ( ACPI_FAILURE ( status ) ) {
return_ACPI_STATUS ( status ) ;
}
} else {
/* Root Table Array has been statically allocated by the host */
2007-02-02 19:48:19 +03:00
ACPI_MEMSET ( initial_table_array , 0 ,
2008-06-10 13:42:13 +08:00
( acpi_size ) initial_table_count *
2007-02-02 19:48:19 +03:00
sizeof ( struct acpi_table_desc ) ) ;
2007-02-02 19:48:19 +03:00
2007-02-02 19:48:18 +03:00
acpi_gbl_root_table_list . tables = initial_table_array ;
2010-04-27 11:16:14 +08:00
acpi_gbl_root_table_list . max_table_count = initial_table_count ;
2007-02-02 19:48:19 +03:00
acpi_gbl_root_table_list . flags = ACPI_ROOT_ORIGIN_UNKNOWN ;
2007-02-02 19:48:18 +03:00
if ( allow_resize ) {
2007-02-02 19:48:19 +03:00
acpi_gbl_root_table_list . flags | =
ACPI_ROOT_ALLOW_RESIZE ;
2007-02-02 19:48:18 +03:00
}
2005-04-16 15:20:36 -07:00
}
2007-02-02 19:48:19 +03:00
/* Get the address of the RSDP */
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:19 +03:00
rsdp_address = acpi_os_get_root_pointer ( ) ;
if ( ! rsdp_address ) {
2007-02-02 19:48:18 +03:00
return_ACPI_STATUS ( AE_NOT_FOUND ) ;
}
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:18 +03:00
/*
* Get the root table ( RSDT or XSDT ) and extract all entries to the local
* Root Table Array . This array contains the information of the RSDT / XSDT
* in a common , more useable format .
*/
2009-02-03 14:41:03 +08:00
status = acpi_tb_parse_root_table ( rsdp_address ) ;
2007-02-02 19:48:18 +03:00
return_ACPI_STATUS ( status ) ;
}
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:18 +03:00
/*******************************************************************************
*
* FUNCTION : acpi_reallocate_root_table
*
* PARAMETERS : None
*
* RETURN : Status
*
* DESCRIPTION : Reallocate Root Table List into dynamic memory . Copies the
* root list from the previously provided scratch area . Should
* be called once dynamic memory allocation is available in the
2012-09-13 09:29:06 -07:00
* kernel .
2007-02-02 19:48:18 +03:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status acpi_reallocate_root_table ( void )
{
2012-09-13 09:29:06 -07:00
acpi_status status ;
2007-02-02 19:48:18 +03:00
ACPI_FUNCTION_TRACE ( acpi_reallocate_root_table ) ;
/*
* Only reallocate the root table if the host provided a static buffer
* for the table array in the call to acpi_initialize_tables .
*/
2007-02-02 19:48:19 +03:00
if ( acpi_gbl_root_table_list . flags & ACPI_ROOT_ORIGIN_ALLOCATED ) {
2007-02-02 19:48:18 +03:00
return_ACPI_STATUS ( AE_SUPPORT ) ;
2005-04-16 15:20:36 -07:00
}
2012-09-13 09:29:06 -07:00
acpi_gbl_root_table_list . flags | = ACPI_ROOT_ALLOW_RESIZE ;
2005-04-16 15:20:36 -07:00
2012-09-13 09:29:06 -07:00
status = acpi_tb_resize_root_table_list ( ) ;
return_ACPI_STATUS ( status ) ;
2007-02-02 19:48:18 +03:00
}
2007-05-09 23:34:35 -04:00
2009-02-18 15:03:30 +08:00
/*******************************************************************************
2007-02-02 19:48:18 +03:00
*
* FUNCTION : acpi_get_table_header
*
2012-07-12 09:40:10 +08:00
* PARAMETERS : signature - ACPI signature of needed table
* instance - Which instance ( for SSDTs )
2007-02-02 19:48:22 +03:00
* out_table_header - The pointer to the table header to fill
2007-02-02 19:48:18 +03:00
*
* RETURN : Status and pointer to mapped table header
*
* DESCRIPTION : Finds an ACPI table header .
*
* NOTE : Caller is responsible in unmapping the header with
* acpi_os_unmap_memory
*
2009-02-18 15:03:30 +08:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-02-02 19:48:18 +03:00
acpi_status
acpi_get_table_header ( char * signature ,
2008-06-10 13:42:13 +08:00
u32 instance , struct acpi_table_header * out_table_header )
2007-02-02 19:48:18 +03:00
{
2008-06-10 13:42:13 +08:00
u32 i ;
u32 j ;
2007-02-02 19:48:22 +03:00
struct acpi_table_header * header ;
2005-07-29 15:15:00 -07:00
2007-02-02 19:48:19 +03:00
/* Parameter validation */
if ( ! signature | | ! out_table_header ) {
return ( AE_BAD_PARAMETER ) ;
}
2009-02-18 15:03:30 +08:00
/* Walk the root table list */
2010-04-27 11:16:14 +08:00
for ( i = 0 , j = 0 ; i < acpi_gbl_root_table_list . current_table_count ;
i + + ) {
2007-02-02 19:48:18 +03:00
if ( ! ACPI_COMPARE_NAME
( & ( acpi_gbl_root_table_list . tables [ i ] . signature ) ,
signature ) ) {
continue ;
2005-07-29 15:15:00 -07:00
}
2007-02-02 19:48:18 +03:00
if ( + + j < instance ) {
continue ;
}
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:22 +03:00
if ( ! acpi_gbl_root_table_list . tables [ i ] . pointer ) {
2009-02-18 15:03:30 +08:00
if ( ( acpi_gbl_root_table_list . tables [ i ] . flags &
ACPI_TABLE_ORIGIN_MASK ) = =
2007-02-02 19:48:22 +03:00
ACPI_TABLE_ORIGIN_MAPPED ) {
header =
acpi_os_map_memory ( acpi_gbl_root_table_list .
tables [ i ] . address ,
sizeof ( struct
acpi_table_header ) ) ;
if ( ! header ) {
2012-10-31 02:26:01 +00:00
return ( AE_NO_MEMORY ) ;
2007-02-02 19:48:22 +03:00
}
ACPI_MEMCPY ( out_table_header , header ,
sizeof ( struct acpi_table_header ) ) ;
acpi_os_unmap_memory ( header ,
sizeof ( struct
acpi_table_header ) ) ;
} else {
2012-10-31 02:26:01 +00:00
return ( AE_NOT_FOUND ) ;
2007-02-02 19:48:22 +03:00
}
} else {
ACPI_MEMCPY ( out_table_header ,
acpi_gbl_root_table_list . tables [ i ] . pointer ,
sizeof ( struct acpi_table_header ) ) ;
2007-02-02 19:48:18 +03:00
}
return ( AE_OK ) ;
2005-04-16 15:20:36 -07:00
}
2007-02-02 19:48:18 +03:00
return ( AE_NOT_FOUND ) ;
2005-04-16 15:20:36 -07:00
}
2007-02-02 19:48:18 +03:00
ACPI_EXPORT_SYMBOL ( acpi_get_table_header )
2006-10-03 00:00:00 -04:00
2009-02-18 15:03:30 +08:00
/*******************************************************************************
2006-12-19 12:56:19 -08:00
*
* FUNCTION : acpi_unload_table_id
*
2007-02-02 19:48:18 +03:00
* PARAMETERS : id - Owner ID of the table to be removed .
2006-12-19 12:56:19 -08:00
*
* RETURN : Status
*
* DESCRIPTION : This routine is used to force the unload of a table ( by id )
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-02-02 19:48:18 +03:00
acpi_status acpi_unload_table_id ( acpi_owner_id id )
2006-12-19 12:56:19 -08:00
{
2007-02-02 19:48:18 +03:00
int i ;
acpi_status status = AE_NOT_EXIST ;
2006-12-19 12:56:19 -08:00
2007-02-15 14:08:30 -06:00
ACPI_FUNCTION_TRACE ( acpi_unload_table_id ) ;
2006-12-19 12:56:19 -08:00
2007-02-15 14:08:30 -06:00
/* Find table in the global table list */
2010-04-27 11:16:14 +08:00
for ( i = 0 ; i < acpi_gbl_root_table_list . current_table_count ; + + i ) {
2007-02-02 19:48:18 +03:00
if ( id ! = acpi_gbl_root_table_list . tables [ i ] . owner_id ) {
continue ;
}
/*
2007-05-09 23:34:35 -04:00
* Delete all namespace objects owned by this table . Note that these
* objects can appear anywhere in the namespace by virtue of the AML
* " Scope " operator . Thus , we need to track ownership by an ID , not
* simply a position within the hierarchy
*/
2007-02-02 19:48:18 +03:00
acpi_tb_delete_namespace_by_owner ( i ) ;
2007-02-15 14:08:30 -06:00
status = acpi_tb_release_owner_id ( i ) ;
2007-02-02 19:48:18 +03:00
acpi_tb_set_table_loaded_flag ( i , FALSE ) ;
2007-02-15 14:08:30 -06:00
break ;
2007-02-02 19:48:18 +03:00
}
return_ACPI_STATUS ( status ) ;
2006-12-19 12:56:19 -08:00
}
ACPI_EXPORT_SYMBOL ( acpi_unload_table_id )
2005-04-16 15:20:36 -07:00
/*******************************************************************************
*
2009-02-07 15:39:41 -08:00
* FUNCTION : acpi_get_table_with_size
2005-04-16 15:20:36 -07:00
*
2012-07-12 09:40:10 +08:00
* PARAMETERS : signature - ACPI signature of needed table
* instance - Which instance ( for SSDTs )
2007-02-02 19:48:18 +03:00
* out_table - Where the pointer to the table is returned
2005-04-16 15:20:36 -07:00
*
2013-04-12 00:24:53 +00:00
* RETURN : Status and pointer to the requested table
2005-04-16 15:20:36 -07:00
*
2013-04-12 00:24:53 +00:00
* DESCRIPTION : Finds and verifies an ACPI table . Table must be in the
* RSDT / XSDT .
2005-04-16 15:20:36 -07:00
*
2009-02-18 15:03:30 +08:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-02-02 19:48:18 +03:00
acpi_status
2009-02-07 15:39:41 -08:00
acpi_get_table_with_size ( char * signature ,
u32 instance , struct acpi_table_header * * out_table ,
acpi_size * tbl_size )
2005-04-16 15:20:36 -07:00
{
2008-06-10 13:42:13 +08:00
u32 i ;
u32 j ;
2007-02-02 19:48:18 +03:00
acpi_status status ;
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:19 +03:00
/* Parameter validation */
if ( ! signature | | ! out_table ) {
return ( AE_BAD_PARAMETER ) ;
}
2009-02-18 15:03:30 +08:00
/* Walk the root table list */
2010-04-27 11:16:14 +08:00
for ( i = 0 , j = 0 ; i < acpi_gbl_root_table_list . current_table_count ;
i + + ) {
2007-02-02 19:48:18 +03:00
if ( ! ACPI_COMPARE_NAME
( & ( acpi_gbl_root_table_list . tables [ i ] . signature ) ,
signature ) ) {
continue ;
}
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:18 +03:00
if ( + + j < instance ) {
continue ;
}
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:18 +03:00
status =
acpi_tb_verify_table ( & acpi_gbl_root_table_list . tables [ i ] ) ;
if ( ACPI_SUCCESS ( status ) ) {
* out_table = acpi_gbl_root_table_list . tables [ i ] . pointer ;
2009-02-07 15:39:41 -08:00
* tbl_size = acpi_gbl_root_table_list . tables [ i ] . length ;
2007-02-02 19:48:18 +03:00
}
2006-07-07 20:44:38 -04:00
2007-02-02 19:48:19 +03:00
if ( ! acpi_gbl_permanent_mmap ) {
2007-02-13 16:11:36 -08:00
acpi_gbl_root_table_list . tables [ i ] . pointer = NULL ;
2007-02-02 19:48:19 +03:00
}
2007-02-02 19:48:18 +03:00
return ( status ) ;
2005-04-16 15:20:36 -07:00
}
2007-02-02 19:48:18 +03:00
return ( AE_NOT_FOUND ) ;
2005-04-16 15:20:36 -07:00
}
2012-08-20 10:57:22 -04:00
ACPI_EXPORT_SYMBOL ( acpi_get_table_with_size )
2005-04-16 15:20:36 -07:00
2009-02-07 15:39:41 -08:00
acpi_status
acpi_get_table ( char * signature ,
u32 instance , struct acpi_table_header * * out_table )
{
acpi_size tbl_size ;
return acpi_get_table_with_size ( signature ,
instance , out_table , & tbl_size ) ;
}
2007-02-02 19:48:18 +03:00
ACPI_EXPORT_SYMBOL ( acpi_get_table )
2006-10-03 00:00:00 -04:00
2005-04-16 15:20:36 -07:00
/*******************************************************************************
*
2007-02-02 19:48:18 +03:00
* FUNCTION : acpi_get_table_by_index
2005-04-16 15:20:36 -07:00
*
2007-02-02 19:48:18 +03:00
* PARAMETERS : table_index - Table index
2012-07-12 09:40:10 +08:00
* table - Where the pointer to the table is returned
2005-04-16 15:20:36 -07:00
*
2013-04-12 00:24:53 +00:00
* RETURN : Status and pointer to the requested table
2005-04-16 15:20:36 -07:00
*
2013-04-12 00:24:53 +00:00
* DESCRIPTION : Obtain a table by an index into the global table list . Used
* internally also .
2005-04-16 15:20:36 -07:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status
2008-06-10 13:42:13 +08:00
acpi_get_table_by_index ( u32 table_index , struct acpi_table_header * * table )
2005-04-16 15:20:36 -07:00
{
2005-08-05 00:44:28 -04:00
acpi_status status ;
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:18 +03:00
ACPI_FUNCTION_TRACE ( acpi_get_table_by_index ) ;
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:19 +03:00
/* Parameter validation */
if ( ! table ) {
return_ACPI_STATUS ( AE_BAD_PARAMETER ) ;
}
2007-02-02 19:48:18 +03:00
( void ) acpi_ut_acquire_mutex ( ACPI_MTX_TABLES ) ;
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:18 +03:00
/* Validate index */
2005-04-16 15:20:36 -07:00
2010-04-27 11:16:14 +08:00
if ( table_index > = acpi_gbl_root_table_list . current_table_count ) {
2007-02-02 19:48:18 +03:00
( void ) acpi_ut_release_mutex ( ACPI_MTX_TABLES ) ;
2005-08-05 00:44:28 -04:00
return_ACPI_STATUS ( AE_BAD_PARAMETER ) ;
2005-04-16 15:20:36 -07:00
}
2007-02-02 19:48:18 +03:00
if ( ! acpi_gbl_root_table_list . tables [ table_index ] . pointer ) {
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:18 +03:00
/* Table is not mapped, map it */
2005-04-16 15:20:36 -07:00
2007-02-02 19:48:18 +03:00
status =
acpi_tb_verify_table ( & acpi_gbl_root_table_list .
tables [ table_index ] ) ;
if ( ACPI_FAILURE ( status ) ) {
( void ) acpi_ut_release_mutex ( ACPI_MTX_TABLES ) ;
return_ACPI_STATUS ( status ) ;
}
2005-04-16 15:20:36 -07:00
}
2007-02-02 19:48:18 +03:00
* table = acpi_gbl_root_table_list . tables [ table_index ] . pointer ;
( void ) acpi_ut_release_mutex ( ACPI_MTX_TABLES ) ;
return_ACPI_STATUS ( AE_OK ) ;
2005-04-16 15:20:36 -07:00
}
2007-02-02 19:48:18 +03:00
ACPI_EXPORT_SYMBOL ( acpi_get_table_by_index )
2005-04-16 15:20:36 -07:00
2007-07-26 00:50:06 -04:00
2008-04-10 19:06:38 +04:00
/*******************************************************************************
*
* FUNCTION : acpi_install_table_handler
*
2012-07-12 09:40:10 +08:00
* PARAMETERS : handler - Table event handler
* context - Value passed to the handler on each event
2008-04-10 19:06:38 +04:00
*
* RETURN : Status
*
2013-04-12 00:24:53 +00:00
* DESCRIPTION : Install a global table event handler .
2008-04-10 19:06:38 +04:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
acpi_status
2013-01-12 15:29:38 +00:00
acpi_install_table_handler ( acpi_table_handler handler , void * context )
2008-04-10 19:06:38 +04:00
{
acpi_status status ;
ACPI_FUNCTION_TRACE ( acpi_install_table_handler ) ;
if ( ! handler ) {
return_ACPI_STATUS ( AE_BAD_PARAMETER ) ;
}
status = acpi_ut_acquire_mutex ( ACPI_MTX_EVENTS ) ;
if ( ACPI_FAILURE ( status ) ) {
return_ACPI_STATUS ( status ) ;
}
/* Don't allow more than one handler */
if ( acpi_gbl_table_handler ) {
status = AE_ALREADY_EXISTS ;
goto cleanup ;
}
/* Install the handler */
acpi_gbl_table_handler = handler ;
acpi_gbl_table_handler_context = context ;
cleanup :
( void ) acpi_ut_release_mutex ( ACPI_MTX_EVENTS ) ;
return_ACPI_STATUS ( status ) ;
}
ACPI_EXPORT_SYMBOL ( acpi_install_table_handler )
/*******************************************************************************
*
* FUNCTION : acpi_remove_table_handler
*
2012-07-12 09:40:10 +08:00
* PARAMETERS : handler - Table event handler that was installed
2008-04-10 19:06:38 +04:00
* previously .
*
* RETURN : Status
*
2013-04-12 00:24:53 +00:00
* DESCRIPTION : Remove a table event handler
2008-04-10 19:06:38 +04:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2013-01-12 15:29:38 +00:00
acpi_status acpi_remove_table_handler ( acpi_table_handler handler )
2008-04-10 19:06:38 +04:00
{
acpi_status status ;
ACPI_FUNCTION_TRACE ( acpi_remove_table_handler ) ;
status = acpi_ut_acquire_mutex ( ACPI_MTX_EVENTS ) ;
if ( ACPI_FAILURE ( status ) ) {
return_ACPI_STATUS ( status ) ;
}
/* Make sure that the installed handler is the same */
if ( ! handler | | handler ! = acpi_gbl_table_handler ) {
status = AE_BAD_PARAMETER ;
goto cleanup ;
}
/* Remove the handler */
acpi_gbl_table_handler = NULL ;
cleanup :
( void ) acpi_ut_release_mutex ( ACPI_MTX_EVENTS ) ;
return_ACPI_STATUS ( status ) ;
}
ACPI_EXPORT_SYMBOL ( acpi_remove_table_handler )