2005-04-16 15:20:36 -07:00
/******************************************************************************
*
* Name : acobject . h - Definition of union acpi_operand_object ( Internal object only )
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* Copyright ( C ) 2000 - 2005 , R . Byron Moore
* 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 .
*/
# ifndef _ACOBJECT_H
# define _ACOBJECT_H
/*
* The union acpi_operand_object is used to pass AML operands from the dispatcher
* to the interpreter , and to keep track of the various handlers such as
* address space handlers and notify handlers . The object is a constant
* size in order to allow it to be cached and reused .
*/
/*******************************************************************************
*
* Common Descriptors
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* Common area for all objects .
*
* data_type is used to differentiate between internal descriptors , and MUST
* be the first byte in this structure .
*/
# define ACPI_OBJECT_COMMON_HEADER /* SIZE/ALIGNMENT: 32 bits, one ptr plus trailing 8-bit flag */ \
u8 descriptor ; /* To differentiate various internal objs */ \
u8 type ; /* acpi_object_type */ \
u16 reference_count ; /* For object deletion management */ \
union acpi_operand_object * next_object ; /* Objects linked to parent NS node */ \
u8 flags ; \
/* Values for flag byte above */
# define AOPOBJ_AML_CONSTANT 0x01
# define AOPOBJ_STATIC_POINTER 0x02
# define AOPOBJ_DATA_VALID 0x04
# define AOPOBJ_OBJECT_INITIALIZED 0x08
# define AOPOBJ_SETUP_COMPLETE 0x10
# define AOPOBJ_SINGLE_DATUM 0x20
/*
* Common bitfield for the field objects
* " Field Datum " - - a datum from the actual field object
* " Buffer Datum " - - a datum from a user buffer , read from or to be written to the field
*/
# define ACPI_COMMON_FIELD_INFO /* SIZE/ALIGNMENT: 24 bits + three 32-bit values */ \
u8 field_flags ; /* Access, update, and lock bits */ \
u8 attribute ; /* From access_as keyword */ \
u8 access_byte_width ; /* Read/Write size in bytes */ \
u32 bit_length ; /* Length of field in bits */ \
u32 base_byte_offset ; /* Byte offset within containing object */ \
u8 start_field_bit_offset ; /* Bit offset within first field datum (0-63) */ \
u8 access_bit_width ; /* Read/Write size in bits (8-64) */ \
u32 value ; /* Value to store into the Bank or Index register */ \
2005-08-05 00:44:28 -04:00
struct acpi_namespace_node * node ; /* Link back to parent node */
2005-04-16 15:20:36 -07:00
/*
* Fields common to both Strings and Buffers
*/
# define ACPI_COMMON_BUFFER_INFO \
u32 length ;
/*
* Common fields for objects that support ASL notifications
*/
# define ACPI_COMMON_NOTIFY_INFO \
union acpi_operand_object * system_notify ; /* Handler for system notifies */ \
union acpi_operand_object * device_notify ; /* Handler for driver notifies */ \
2005-08-05 00:44:28 -04:00
union acpi_operand_object * handler ; /* Handler for Address space */
2005-04-16 15:20:36 -07:00
/******************************************************************************
*
* Basic data types
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 00:44:28 -04:00
struct acpi_object_common {
ACPI_OBJECT_COMMON_HEADER } ;
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
struct acpi_object_integer {
ACPI_OBJECT_COMMON_HEADER acpi_integer value ;
2005-04-16 15:20:36 -07:00
} ;
/*
* Note : The String and Buffer object must be identical through the Pointer
* element . There is code that depends on this .
*/
2005-08-05 00:44:28 -04:00
struct acpi_object_string { /* Null terminated, ASCII characters only */
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO char * pointer ; /* String in AML stream or allocated string */
2005-04-16 15:20:36 -07:00
} ;
2005-08-05 00:44:28 -04:00
struct acpi_object_buffer {
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO u8 * pointer ; /* Buffer in AML stream or allocated buffer */
struct acpi_namespace_node * node ; /* Link back to parent node */
u8 * aml_start ;
u32 aml_length ;
2005-04-16 15:20:36 -07:00
} ;
2005-08-05 00:44:28 -04:00
struct acpi_object_package {
ACPI_OBJECT_COMMON_HEADER u32 count ; /* # of elements in package */
u32 aml_length ;
u8 * aml_start ;
struct acpi_namespace_node * node ; /* Link back to parent node */
union acpi_operand_object * * elements ; /* Array of pointers to acpi_objects */
2005-04-16 15:20:36 -07:00
} ;
/******************************************************************************
*
* Complex data types
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 00:44:28 -04:00
struct acpi_object_event {
ACPI_OBJECT_COMMON_HEADER void * semaphore ;
2005-04-16 15:20:36 -07:00
} ;
# define ACPI_INFINITE_CONCURRENCY 0xFF
typedef
2005-08-05 00:44:28 -04:00
acpi_status ( * ACPI_INTERNAL_METHOD ) ( struct acpi_walk_state * walk_state ) ;
struct acpi_object_method {
ACPI_OBJECT_COMMON_HEADER u8 method_flags ;
u8 param_count ;
u32 aml_length ;
void * semaphore ;
u8 * aml_start ;
ACPI_INTERNAL_METHOD implementation ;
u8 concurrency ;
u8 thread_count ;
acpi_owner_id owner_id ;
2005-04-16 15:20:36 -07:00
} ;
2005-08-05 00:44:28 -04:00
struct acpi_object_mutex {
ACPI_OBJECT_COMMON_HEADER u8 sync_level ; /* 0-15, specified in Mutex() call */
u16 acquisition_depth ; /* Allow multiple Acquires, same thread */
struct acpi_thread_state * owner_thread ; /* Current owner of the mutex */
void * semaphore ; /* Actual OS synchronization object */
union acpi_operand_object * prev ; /* Link for list of acquired mutexes */
union acpi_operand_object * next ; /* Link for list of acquired mutexes */
struct acpi_namespace_node * node ; /* Containing namespace node */
u8 original_sync_level ; /* Owner's original sync level (0-15) */
2005-04-16 15:20:36 -07:00
} ;
2005-08-05 00:44:28 -04:00
struct acpi_object_region {
ACPI_OBJECT_COMMON_HEADER u8 space_id ;
union acpi_operand_object * handler ; /* Handler for region access */
struct acpi_namespace_node * node ; /* Containing namespace node */
union acpi_operand_object * next ;
u32 length ;
acpi_physical_address address ;
2005-04-16 15:20:36 -07:00
} ;
/******************************************************************************
*
* Objects that can be notified . All share a common notify_info area .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 00:44:28 -04:00
struct acpi_object_notify_common { /* COMMON NOTIFY for POWER, PROCESSOR, DEVICE, and THERMAL */
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO } ;
2005-04-16 15:20:36 -07:00
2005-08-05 00:44:28 -04:00
struct acpi_object_device {
2005-04-16 15:20:36 -07:00
ACPI_OBJECT_COMMON_HEADER
2005-08-05 00:44:28 -04:00
ACPI_COMMON_NOTIFY_INFO struct acpi_gpe_block_info * gpe_block ;
2005-04-16 15:20:36 -07:00
} ;
2005-08-05 00:44:28 -04:00
struct acpi_object_power_resource {
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO u32 system_level ;
u32 resource_order ;
2005-04-16 15:20:36 -07:00
} ;
2005-08-05 00:44:28 -04:00
struct acpi_object_processor {
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO u32 proc_id ;
u32 length ;
acpi_io_address address ;
2005-04-16 15:20:36 -07:00
} ;
2005-08-05 00:44:28 -04:00
struct acpi_object_thermal_zone {
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO } ;
2005-04-16 15:20:36 -07:00
/******************************************************************************
*
* Fields . All share a common header / info field .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 00:44:28 -04:00
struct acpi_object_field_common { /* COMMON FIELD (for BUFFER, REGION, BANK, and INDEX fields) */
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object * region_obj ; /* Containing Operation Region object */
/* (REGION/BANK fields only) */
2005-04-16 15:20:36 -07:00
} ;
2005-08-05 00:44:28 -04:00
struct acpi_object_region_field {
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object * region_obj ; /* Containing op_region object */
2005-04-16 15:20:36 -07:00
} ;
2005-08-05 00:44:28 -04:00
struct acpi_object_bank_field {
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object * region_obj ; /* Containing op_region object */
union acpi_operand_object * bank_obj ; /* bank_select Register object */
2005-04-16 15:20:36 -07:00
} ;
2005-08-05 00:44:28 -04:00
struct acpi_object_index_field {
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO
/*
* No " region_obj " pointer needed since the Index and Data registers
* are each field definitions unto themselves .
*/
union acpi_operand_object * index_obj ; /* Index register */
union acpi_operand_object * data_obj ; /* Data register */
2005-04-16 15:20:36 -07:00
} ;
/* The buffer_field is different in that it is part of a Buffer, not an op_region */
2005-08-05 00:44:28 -04:00
struct acpi_object_buffer_field {
ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object * buffer_obj ; /* Containing Buffer object */
2005-04-16 15:20:36 -07:00
} ;
/******************************************************************************
*
* Objects for handlers
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 00:44:28 -04:00
struct acpi_object_notify_handler {
ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node * node ; /* Parent device */
acpi_notify_handler handler ;
void * context ;
2005-04-16 15:20:36 -07:00
} ;
/* Flags for address handler */
# define ACPI_ADDR_HANDLER_DEFAULT_INSTALLED 0x1
2005-08-05 00:44:28 -04:00
struct acpi_object_addr_handler {
ACPI_OBJECT_COMMON_HEADER u8 space_id ;
u16 hflags ;
acpi_adr_space_handler handler ;
struct acpi_namespace_node * node ; /* Parent device */
void * context ;
acpi_adr_space_setup setup ;
union acpi_operand_object * region_list ; /* regions using this handler */
union acpi_operand_object * next ;
2005-04-16 15:20:36 -07:00
} ;
/******************************************************************************
*
* Special internal objects
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* The Reference object type is used for these opcodes :
* Arg [ 0 - 6 ] , Local [ 0 - 7 ] , index_op , name_op , zero_op , one_op , ones_op , debug_op
*/
2005-08-05 00:44:28 -04:00
struct acpi_object_reference {
ACPI_OBJECT_COMMON_HEADER u8 target_type ; /* Used for index_op */
u16 opcode ;
u32 offset ; /* Used for arg_op, local_op, and index_op */
void * object ; /* name_op=>HANDLE to obj, index_op=>union acpi_operand_object */
struct acpi_namespace_node * node ;
union acpi_operand_object * * where ;
2005-04-16 15:20:36 -07:00
} ;
/*
* Extra object is used as additional storage for types that
* have AML code in their declarations ( term_args ) that must be
* evaluated at run time .
*
* Currently : Region and field_unit types
*/
2005-08-05 00:44:28 -04:00
struct acpi_object_extra {
ACPI_OBJECT_COMMON_HEADER u8 byte_fill1 ;
u16 word_fill1 ;
u32 aml_length ;
u8 * aml_start ;
struct acpi_namespace_node * method_REG ; /* _REG method for this region (if any) */
void * region_context ; /* Region-specific data */
2005-04-16 15:20:36 -07:00
} ;
/* Additional data that can be attached to namespace nodes */
2005-08-05 00:44:28 -04:00
struct acpi_object_data {
ACPI_OBJECT_COMMON_HEADER acpi_object_handler handler ;
void * pointer ;
2005-04-16 15:20:36 -07:00
} ;
/* Structure used when objects are cached for reuse */
2005-08-05 00:44:28 -04:00
struct acpi_object_cache_list {
ACPI_OBJECT_COMMON_HEADER union acpi_operand_object * next ; /* Link for object cache and internal lists */
2005-04-16 15:20:36 -07:00
} ;
/******************************************************************************
*
* union acpi_operand_object Descriptor - a giant union of all of the above
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-08-05 00:44:28 -04:00
union acpi_operand_object {
struct acpi_object_common common ;
struct acpi_object_integer integer ;
struct acpi_object_string string ;
struct acpi_object_buffer buffer ;
struct acpi_object_package package ;
struct acpi_object_event event ;
struct acpi_object_method method ;
struct acpi_object_mutex mutex ;
struct acpi_object_region region ;
struct acpi_object_notify_common common_notify ;
struct acpi_object_device device ;
struct acpi_object_power_resource power_resource ;
struct acpi_object_processor processor ;
struct acpi_object_thermal_zone thermal_zone ;
struct acpi_object_field_common common_field ;
struct acpi_object_region_field field ;
struct acpi_object_buffer_field buffer_field ;
struct acpi_object_bank_field bank_field ;
struct acpi_object_index_field index_field ;
struct acpi_object_notify_handler notify ;
struct acpi_object_addr_handler address_space ;
struct acpi_object_reference reference ;
struct acpi_object_extra extra ;
struct acpi_object_data data ;
struct acpi_object_cache_list cache ;
2005-04-16 15:20:36 -07:00
} ;
/******************************************************************************
*
* union acpi_descriptor - objects that share a common descriptor identifier
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Object descriptor types */
2005-08-05 00:44:28 -04:00
# define ACPI_DESC_TYPE_CACHED 0x01 /* Used only when object is cached */
2005-04-16 15:20:36 -07:00
# define ACPI_DESC_TYPE_STATE 0x02
# define ACPI_DESC_TYPE_STATE_UPDATE 0x03
# define ACPI_DESC_TYPE_STATE_PACKAGE 0x04
# define ACPI_DESC_TYPE_STATE_CONTROL 0x05
# define ACPI_DESC_TYPE_STATE_RPSCOPE 0x06
# define ACPI_DESC_TYPE_STATE_PSCOPE 0x07
# define ACPI_DESC_TYPE_STATE_WSCOPE 0x08
# define ACPI_DESC_TYPE_STATE_RESULT 0x09
# define ACPI_DESC_TYPE_STATE_NOTIFY 0x0A
# define ACPI_DESC_TYPE_STATE_THREAD 0x0B
# define ACPI_DESC_TYPE_WALK 0x0C
# define ACPI_DESC_TYPE_PARSER 0x0D
# define ACPI_DESC_TYPE_OPERAND 0x0E
# define ACPI_DESC_TYPE_NAMED 0x0F
# define ACPI_DESC_TYPE_MAX 0x0F
2005-08-05 00:44:28 -04:00
union acpi_descriptor {
u8 descriptor_id ; /* To differentiate various internal objs */
union acpi_operand_object object ;
struct acpi_namespace_node node ;
union acpi_parse_object op ;
2005-04-16 15:20:36 -07:00
} ;
2005-08-05 00:44:28 -04:00
# endif /* _ACOBJECT_H */