1*4882a593Smuzhiyun /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 2*4882a593Smuzhiyun /****************************************************************************** 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Name: acobject.h - Definition of union acpi_operand_object (Internal object only) 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) 2000 - 2020, Intel Corp. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun *****************************************************************************/ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef _ACOBJECT_H 11*4882a593Smuzhiyun #define _ACOBJECT_H 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* acpisrc:struct_defs -- for acpisrc conversion */ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* 16*4882a593Smuzhiyun * The union acpi_operand_object is used to pass AML operands from the dispatcher 17*4882a593Smuzhiyun * to the interpreter, and to keep track of the various handlers such as 18*4882a593Smuzhiyun * address space handlers and notify handlers. The object is a constant 19*4882a593Smuzhiyun * size in order to allow it to be cached and reused. 20*4882a593Smuzhiyun * 21*4882a593Smuzhiyun * Note: The object is optimized to be aligned and will not work if it is 22*4882a593Smuzhiyun * byte-packed. 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun #if ACPI_MACHINE_WIDTH == 64 25*4882a593Smuzhiyun #pragma pack(8) 26*4882a593Smuzhiyun #else 27*4882a593Smuzhiyun #pragma pack(4) 28*4882a593Smuzhiyun #endif 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /******************************************************************************* 31*4882a593Smuzhiyun * 32*4882a593Smuzhiyun * Common Descriptors 33*4882a593Smuzhiyun * 34*4882a593Smuzhiyun ******************************************************************************/ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* 37*4882a593Smuzhiyun * Common area for all objects. 38*4882a593Smuzhiyun * 39*4882a593Smuzhiyun * descriptor_type is used to differentiate between internal descriptors, and 40*4882a593Smuzhiyun * must be in the same place across all descriptors 41*4882a593Smuzhiyun * 42*4882a593Smuzhiyun * Note: The descriptor_type and Type fields must appear in the identical 43*4882a593Smuzhiyun * position in both the struct acpi_namespace_node and union acpi_operand_object 44*4882a593Smuzhiyun * structures. 45*4882a593Smuzhiyun */ 46*4882a593Smuzhiyun #define ACPI_OBJECT_COMMON_HEADER \ 47*4882a593Smuzhiyun union acpi_operand_object *next_object; /* Objects linked to parent NS node */\ 48*4882a593Smuzhiyun u8 descriptor_type; /* To differentiate various internal objs */\ 49*4882a593Smuzhiyun u8 type; /* acpi_object_type */\ 50*4882a593Smuzhiyun u16 reference_count; /* For object deletion management */\ 51*4882a593Smuzhiyun u8 flags; 52*4882a593Smuzhiyun /* 53*4882a593Smuzhiyun * Note: There are 3 bytes available here before the 54*4882a593Smuzhiyun * next natural alignment boundary (for both 32/64 cases) 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /* Values for Flag byte above */ 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #define AOPOBJ_AML_CONSTANT 0x01 /* Integer is an AML constant */ 60*4882a593Smuzhiyun #define AOPOBJ_STATIC_POINTER 0x02 /* Data is part of an ACPI table, don't delete */ 61*4882a593Smuzhiyun #define AOPOBJ_DATA_VALID 0x04 /* Object is initialized and data is valid */ 62*4882a593Smuzhiyun #define AOPOBJ_OBJECT_INITIALIZED 0x08 /* Region is initialized */ 63*4882a593Smuzhiyun #define AOPOBJ_REG_CONNECTED 0x10 /* _REG was run */ 64*4882a593Smuzhiyun #define AOPOBJ_SETUP_COMPLETE 0x20 /* Region setup is complete */ 65*4882a593Smuzhiyun #define AOPOBJ_INVALID 0x40 /* Host OS won't allow a Region address */ 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /****************************************************************************** 68*4882a593Smuzhiyun * 69*4882a593Smuzhiyun * Basic data types 70*4882a593Smuzhiyun * 71*4882a593Smuzhiyun *****************************************************************************/ 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun struct acpi_object_common { 74*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER}; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun struct acpi_object_integer { 77*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER u8 fill[3]; /* Prevent warning on some compilers */ 78*4882a593Smuzhiyun u64 value; 79*4882a593Smuzhiyun }; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /* 82*4882a593Smuzhiyun * Note: The String and Buffer object must be identical through the 83*4882a593Smuzhiyun * pointer and length elements. There is code that depends on this. 84*4882a593Smuzhiyun * 85*4882a593Smuzhiyun * Fields common to both Strings and Buffers 86*4882a593Smuzhiyun */ 87*4882a593Smuzhiyun #define ACPI_COMMON_BUFFER_INFO(_type) \ 88*4882a593Smuzhiyun _type *pointer; \ 89*4882a593Smuzhiyun u32 length; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* Null terminated, ASCII characters only */ 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun struct acpi_object_string { 94*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO(char) /* String in AML stream or allocated string */ 95*4882a593Smuzhiyun }; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun struct acpi_object_buffer { 98*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO(u8) /* Buffer in AML stream or allocated buffer */ 99*4882a593Smuzhiyun u32 aml_length; 100*4882a593Smuzhiyun u8 *aml_start; 101*4882a593Smuzhiyun struct acpi_namespace_node *node; /* Link back to parent node */ 102*4882a593Smuzhiyun }; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun struct acpi_object_package { 105*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *node; /* Link back to parent node */ 106*4882a593Smuzhiyun union acpi_operand_object **elements; /* Array of pointers to acpi_objects */ 107*4882a593Smuzhiyun u8 *aml_start; 108*4882a593Smuzhiyun u32 aml_length; 109*4882a593Smuzhiyun u32 count; /* # of elements in package */ 110*4882a593Smuzhiyun }; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun /****************************************************************************** 113*4882a593Smuzhiyun * 114*4882a593Smuzhiyun * Complex data types 115*4882a593Smuzhiyun * 116*4882a593Smuzhiyun *****************************************************************************/ 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun struct acpi_object_event { 119*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER acpi_semaphore os_semaphore; /* Actual OS synchronization object */ 120*4882a593Smuzhiyun }; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun struct acpi_object_mutex { 123*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER u8 sync_level; /* 0-15, specified in Mutex() call */ 124*4882a593Smuzhiyun u16 acquisition_depth; /* Allow multiple Acquires, same thread */ 125*4882a593Smuzhiyun acpi_mutex os_mutex; /* Actual OS synchronization object */ 126*4882a593Smuzhiyun acpi_thread_id thread_id; /* Current owner of the mutex */ 127*4882a593Smuzhiyun struct acpi_thread_state *owner_thread; /* Current owner of the mutex */ 128*4882a593Smuzhiyun union acpi_operand_object *prev; /* Link for list of acquired mutexes */ 129*4882a593Smuzhiyun union acpi_operand_object *next; /* Link for list of acquired mutexes */ 130*4882a593Smuzhiyun struct acpi_namespace_node *node; /* Containing namespace node */ 131*4882a593Smuzhiyun u8 original_sync_level; /* Owner's original sync level (0-15) */ 132*4882a593Smuzhiyun }; 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun struct acpi_object_region { 135*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER u8 space_id; 136*4882a593Smuzhiyun struct acpi_namespace_node *node; /* Containing namespace node */ 137*4882a593Smuzhiyun union acpi_operand_object *handler; /* Handler for region access */ 138*4882a593Smuzhiyun union acpi_operand_object *next; 139*4882a593Smuzhiyun acpi_physical_address address; 140*4882a593Smuzhiyun u32 length; 141*4882a593Smuzhiyun }; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun struct acpi_object_method { 144*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER u8 info_flags; 145*4882a593Smuzhiyun u8 param_count; 146*4882a593Smuzhiyun u8 sync_level; 147*4882a593Smuzhiyun union acpi_operand_object *mutex; 148*4882a593Smuzhiyun union acpi_operand_object *node; 149*4882a593Smuzhiyun u8 *aml_start; 150*4882a593Smuzhiyun union { 151*4882a593Smuzhiyun acpi_internal_method implementation; 152*4882a593Smuzhiyun union acpi_operand_object *handler; 153*4882a593Smuzhiyun } dispatch; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun u32 aml_length; 156*4882a593Smuzhiyun acpi_owner_id owner_id; 157*4882a593Smuzhiyun u8 thread_count; 158*4882a593Smuzhiyun }; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* Flags for info_flags field above */ 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun #define ACPI_METHOD_MODULE_LEVEL 0x01 /* Method is actually module-level code */ 163*4882a593Smuzhiyun #define ACPI_METHOD_INTERNAL_ONLY 0x02 /* Method is implemented internally (_OSI) */ 164*4882a593Smuzhiyun #define ACPI_METHOD_SERIALIZED 0x04 /* Method is serialized */ 165*4882a593Smuzhiyun #define ACPI_METHOD_SERIALIZED_PENDING 0x08 /* Method is to be marked serialized */ 166*4882a593Smuzhiyun #define ACPI_METHOD_IGNORE_SYNC_LEVEL 0x10 /* Method was auto-serialized at table load time */ 167*4882a593Smuzhiyun #define ACPI_METHOD_MODIFIED_NAMESPACE 0x20 /* Method modified the namespace */ 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun /****************************************************************************** 170*4882a593Smuzhiyun * 171*4882a593Smuzhiyun * Objects that can be notified. All share a common notify_info area. 172*4882a593Smuzhiyun * 173*4882a593Smuzhiyun *****************************************************************************/ 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun /* 176*4882a593Smuzhiyun * Common fields for objects that support ASL notifications 177*4882a593Smuzhiyun */ 178*4882a593Smuzhiyun #define ACPI_COMMON_NOTIFY_INFO \ 179*4882a593Smuzhiyun union acpi_operand_object *notify_list[2]; /* Handlers for system/device notifies */\ 180*4882a593Smuzhiyun union acpi_operand_object *handler; /* Handler for Address space */ 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun /* COMMON NOTIFY for POWER, PROCESSOR, DEVICE, and THERMAL */ 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun struct acpi_object_notify_common { 185*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO}; 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun struct acpi_object_device { 188*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER 189*4882a593Smuzhiyun ACPI_COMMON_NOTIFY_INFO struct acpi_gpe_block_info *gpe_block; 190*4882a593Smuzhiyun }; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun struct acpi_object_power_resource { 193*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO u32 system_level; 194*4882a593Smuzhiyun u32 resource_order; 195*4882a593Smuzhiyun }; 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun struct acpi_object_processor { 198*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER 199*4882a593Smuzhiyun /* The next two fields take advantage of the 3-byte space before NOTIFY_INFO */ 200*4882a593Smuzhiyun u8 proc_id; 201*4882a593Smuzhiyun u8 length; 202*4882a593Smuzhiyun ACPI_COMMON_NOTIFY_INFO acpi_io_address address; 203*4882a593Smuzhiyun }; 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun struct acpi_object_thermal_zone { 206*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO}; 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun /****************************************************************************** 209*4882a593Smuzhiyun * 210*4882a593Smuzhiyun * Fields. All share a common header/info field. 211*4882a593Smuzhiyun * 212*4882a593Smuzhiyun *****************************************************************************/ 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun /* 215*4882a593Smuzhiyun * Common bitfield for the field objects 216*4882a593Smuzhiyun * "Field Datum" -- a datum from the actual field object 217*4882a593Smuzhiyun * "Buffer Datum" -- a datum from a user buffer, read from or to be written to the field 218*4882a593Smuzhiyun */ 219*4882a593Smuzhiyun #define ACPI_COMMON_FIELD_INFO \ 220*4882a593Smuzhiyun u8 field_flags; /* Access, update, and lock bits */\ 221*4882a593Smuzhiyun u8 attribute; /* From access_as keyword */\ 222*4882a593Smuzhiyun u8 access_byte_width; /* Read/Write size in bytes */\ 223*4882a593Smuzhiyun struct acpi_namespace_node *node; /* Link back to parent node */\ 224*4882a593Smuzhiyun u32 bit_length; /* Length of field in bits */\ 225*4882a593Smuzhiyun u32 base_byte_offset; /* Byte offset within containing object */\ 226*4882a593Smuzhiyun u32 value; /* Value to store into the Bank or Index register */\ 227*4882a593Smuzhiyun u8 start_field_bit_offset;/* Bit offset within first field datum (0-63) */\ 228*4882a593Smuzhiyun u8 access_length; /* For serial regions/fields */ 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /* COMMON FIELD (for BUFFER, REGION, BANK, and INDEX fields) */ 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun struct acpi_object_field_common { 234*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Parent Operation Region object (REGION/BANK fields only) */ 235*4882a593Smuzhiyun }; 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun struct acpi_object_region_field { 238*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO u16 resource_length; 239*4882a593Smuzhiyun union acpi_operand_object *region_obj; /* Containing op_region object */ 240*4882a593Smuzhiyun u8 *resource_buffer; /* resource_template for serial regions/fields */ 241*4882a593Smuzhiyun u16 pin_number_index; /* Index relative to previous Connection/Template */ 242*4882a593Smuzhiyun u8 *internal_pcc_buffer; /* Internal buffer for fields associated with PCC */ 243*4882a593Smuzhiyun }; 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun struct acpi_object_bank_field { 246*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Containing op_region object */ 247*4882a593Smuzhiyun union acpi_operand_object *bank_obj; /* bank_select Register object */ 248*4882a593Smuzhiyun }; 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun struct acpi_object_index_field { 251*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO 252*4882a593Smuzhiyun /* 253*4882a593Smuzhiyun * No "RegionObj" pointer needed since the Index and Data registers 254*4882a593Smuzhiyun * are each field definitions unto themselves. 255*4882a593Smuzhiyun */ 256*4882a593Smuzhiyun union acpi_operand_object *index_obj; /* Index register */ 257*4882a593Smuzhiyun union acpi_operand_object *data_obj; /* Data register */ 258*4882a593Smuzhiyun }; 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun /* The buffer_field is different in that it is part of a Buffer, not an op_region */ 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun struct acpi_object_buffer_field { 263*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO u8 is_create_field; /* Special case for objects created by create_field() */ 264*4882a593Smuzhiyun union acpi_operand_object *buffer_obj; /* Containing Buffer object */ 265*4882a593Smuzhiyun }; 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun /****************************************************************************** 268*4882a593Smuzhiyun * 269*4882a593Smuzhiyun * Objects for handlers 270*4882a593Smuzhiyun * 271*4882a593Smuzhiyun *****************************************************************************/ 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun struct acpi_object_notify_handler { 274*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *node; /* Parent device */ 275*4882a593Smuzhiyun u32 handler_type; /* Type: Device/System/Both */ 276*4882a593Smuzhiyun acpi_notify_handler handler; /* Handler address */ 277*4882a593Smuzhiyun void *context; 278*4882a593Smuzhiyun union acpi_operand_object *next[2]; /* Device and System handler lists */ 279*4882a593Smuzhiyun }; 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun struct acpi_object_addr_handler { 282*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER u8 space_id; 283*4882a593Smuzhiyun u8 handler_flags; 284*4882a593Smuzhiyun acpi_adr_space_handler handler; 285*4882a593Smuzhiyun struct acpi_namespace_node *node; /* Parent device */ 286*4882a593Smuzhiyun void *context; 287*4882a593Smuzhiyun acpi_mutex context_mutex; 288*4882a593Smuzhiyun acpi_adr_space_setup setup; 289*4882a593Smuzhiyun union acpi_operand_object *region_list; /* Regions using this handler */ 290*4882a593Smuzhiyun union acpi_operand_object *next; 291*4882a593Smuzhiyun }; 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun /* Flags for address handler (handler_flags) */ 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun #define ACPI_ADDR_HANDLER_DEFAULT_INSTALLED 0x01 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun /****************************************************************************** 298*4882a593Smuzhiyun * 299*4882a593Smuzhiyun * Special internal objects 300*4882a593Smuzhiyun * 301*4882a593Smuzhiyun *****************************************************************************/ 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun /* 304*4882a593Smuzhiyun * The Reference object is used for these opcodes: 305*4882a593Smuzhiyun * Arg[0-6], Local[0-7], index_op, name_op, ref_of_op, load_op, load_table_op, debug_op 306*4882a593Smuzhiyun * The Reference.Class differentiates these types. 307*4882a593Smuzhiyun */ 308*4882a593Smuzhiyun struct acpi_object_reference { 309*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER u8 class; /* Reference Class */ 310*4882a593Smuzhiyun u8 target_type; /* Used for Index Op */ 311*4882a593Smuzhiyun u8 resolved; /* Reference has been resolved to a value */ 312*4882a593Smuzhiyun void *object; /* name_op=>HANDLE to obj, index_op=>union acpi_operand_object */ 313*4882a593Smuzhiyun struct acpi_namespace_node *node; /* ref_of or Namepath */ 314*4882a593Smuzhiyun union acpi_operand_object **where; /* Target of Index */ 315*4882a593Smuzhiyun u8 *index_pointer; /* Used for Buffers and Strings */ 316*4882a593Smuzhiyun u8 *aml; /* Used for deferred resolution of the ref */ 317*4882a593Smuzhiyun u32 value; /* Used for Local/Arg/Index/ddb_handle */ 318*4882a593Smuzhiyun }; 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun /* Values for Reference.Class above */ 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun typedef enum { 323*4882a593Smuzhiyun ACPI_REFCLASS_LOCAL = 0, /* Method local */ 324*4882a593Smuzhiyun ACPI_REFCLASS_ARG = 1, /* Method argument */ 325*4882a593Smuzhiyun ACPI_REFCLASS_REFOF = 2, /* Result of ref_of() TBD: Split to Ref/Node and Ref/operand_obj? */ 326*4882a593Smuzhiyun ACPI_REFCLASS_INDEX = 3, /* Result of Index() */ 327*4882a593Smuzhiyun ACPI_REFCLASS_TABLE = 4, /* ddb_handle - Load(), load_table() */ 328*4882a593Smuzhiyun ACPI_REFCLASS_NAME = 5, /* Reference to a named object */ 329*4882a593Smuzhiyun ACPI_REFCLASS_DEBUG = 6, /* Debug object */ 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun ACPI_REFCLASS_MAX = 6 332*4882a593Smuzhiyun } ACPI_REFERENCE_CLASSES; 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun /* 335*4882a593Smuzhiyun * Extra object is used as additional storage for types that 336*4882a593Smuzhiyun * have AML code in their declarations (term_args) that must be 337*4882a593Smuzhiyun * evaluated at run time. 338*4882a593Smuzhiyun * 339*4882a593Smuzhiyun * Currently: Region and field_unit types 340*4882a593Smuzhiyun */ 341*4882a593Smuzhiyun struct acpi_object_extra { 342*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *method_REG; /* _REG method for this region (if any) */ 343*4882a593Smuzhiyun struct acpi_namespace_node *scope_node; 344*4882a593Smuzhiyun void *region_context; /* Region-specific data */ 345*4882a593Smuzhiyun u8 *aml_start; 346*4882a593Smuzhiyun u32 aml_length; 347*4882a593Smuzhiyun }; 348*4882a593Smuzhiyun 349*4882a593Smuzhiyun /* Additional data that can be attached to namespace nodes */ 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun struct acpi_object_data { 352*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER acpi_object_handler handler; 353*4882a593Smuzhiyun void *pointer; 354*4882a593Smuzhiyun }; 355*4882a593Smuzhiyun 356*4882a593Smuzhiyun /* Structure used when objects are cached for reuse */ 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun struct acpi_object_cache_list { 359*4882a593Smuzhiyun ACPI_OBJECT_COMMON_HEADER union acpi_operand_object *next; /* Link for object cache and internal lists */ 360*4882a593Smuzhiyun }; 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun /****************************************************************************** 363*4882a593Smuzhiyun * 364*4882a593Smuzhiyun * union acpi_operand_object descriptor - a giant union of all of the above 365*4882a593Smuzhiyun * 366*4882a593Smuzhiyun *****************************************************************************/ 367*4882a593Smuzhiyun 368*4882a593Smuzhiyun union acpi_operand_object { 369*4882a593Smuzhiyun struct acpi_object_common common; 370*4882a593Smuzhiyun struct acpi_object_integer integer; 371*4882a593Smuzhiyun struct acpi_object_string string; 372*4882a593Smuzhiyun struct acpi_object_buffer buffer; 373*4882a593Smuzhiyun struct acpi_object_package package; 374*4882a593Smuzhiyun struct acpi_object_event event; 375*4882a593Smuzhiyun struct acpi_object_method method; 376*4882a593Smuzhiyun struct acpi_object_mutex mutex; 377*4882a593Smuzhiyun struct acpi_object_region region; 378*4882a593Smuzhiyun struct acpi_object_notify_common common_notify; 379*4882a593Smuzhiyun struct acpi_object_device device; 380*4882a593Smuzhiyun struct acpi_object_power_resource power_resource; 381*4882a593Smuzhiyun struct acpi_object_processor processor; 382*4882a593Smuzhiyun struct acpi_object_thermal_zone thermal_zone; 383*4882a593Smuzhiyun struct acpi_object_field_common common_field; 384*4882a593Smuzhiyun struct acpi_object_region_field field; 385*4882a593Smuzhiyun struct acpi_object_buffer_field buffer_field; 386*4882a593Smuzhiyun struct acpi_object_bank_field bank_field; 387*4882a593Smuzhiyun struct acpi_object_index_field index_field; 388*4882a593Smuzhiyun struct acpi_object_notify_handler notify; 389*4882a593Smuzhiyun struct acpi_object_addr_handler address_space; 390*4882a593Smuzhiyun struct acpi_object_reference reference; 391*4882a593Smuzhiyun struct acpi_object_extra extra; 392*4882a593Smuzhiyun struct acpi_object_data data; 393*4882a593Smuzhiyun struct acpi_object_cache_list cache; 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun /* 396*4882a593Smuzhiyun * Add namespace node to union in order to simplify code that accepts both 397*4882a593Smuzhiyun * ACPI_OPERAND_OBJECTs and ACPI_NAMESPACE_NODEs. The structures share 398*4882a593Smuzhiyun * a common descriptor_type field in order to differentiate them. 399*4882a593Smuzhiyun */ 400*4882a593Smuzhiyun struct acpi_namespace_node node; 401*4882a593Smuzhiyun }; 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun /****************************************************************************** 404*4882a593Smuzhiyun * 405*4882a593Smuzhiyun * union acpi_descriptor - objects that share a common descriptor identifier 406*4882a593Smuzhiyun * 407*4882a593Smuzhiyun *****************************************************************************/ 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun /* Object descriptor types */ 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun #define ACPI_DESC_TYPE_CACHED 0x01 /* Used only when object is cached */ 412*4882a593Smuzhiyun #define ACPI_DESC_TYPE_STATE 0x02 413*4882a593Smuzhiyun #define ACPI_DESC_TYPE_STATE_UPDATE 0x03 414*4882a593Smuzhiyun #define ACPI_DESC_TYPE_STATE_PACKAGE 0x04 415*4882a593Smuzhiyun #define ACPI_DESC_TYPE_STATE_CONTROL 0x05 416*4882a593Smuzhiyun #define ACPI_DESC_TYPE_STATE_RPSCOPE 0x06 417*4882a593Smuzhiyun #define ACPI_DESC_TYPE_STATE_PSCOPE 0x07 418*4882a593Smuzhiyun #define ACPI_DESC_TYPE_STATE_WSCOPE 0x08 419*4882a593Smuzhiyun #define ACPI_DESC_TYPE_STATE_RESULT 0x09 420*4882a593Smuzhiyun #define ACPI_DESC_TYPE_STATE_NOTIFY 0x0A 421*4882a593Smuzhiyun #define ACPI_DESC_TYPE_STATE_THREAD 0x0B 422*4882a593Smuzhiyun #define ACPI_DESC_TYPE_WALK 0x0C 423*4882a593Smuzhiyun #define ACPI_DESC_TYPE_PARSER 0x0D 424*4882a593Smuzhiyun #define ACPI_DESC_TYPE_OPERAND 0x0E 425*4882a593Smuzhiyun #define ACPI_DESC_TYPE_NAMED 0x0F 426*4882a593Smuzhiyun #define ACPI_DESC_TYPE_MAX 0x0F 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun struct acpi_common_descriptor { 429*4882a593Smuzhiyun void *common_pointer; 430*4882a593Smuzhiyun u8 descriptor_type; /* To differentiate various internal objs */ 431*4882a593Smuzhiyun }; 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun union acpi_descriptor { 434*4882a593Smuzhiyun struct acpi_common_descriptor common; 435*4882a593Smuzhiyun union acpi_operand_object object; 436*4882a593Smuzhiyun struct acpi_namespace_node node; 437*4882a593Smuzhiyun union acpi_parse_object op; 438*4882a593Smuzhiyun }; 439*4882a593Smuzhiyun 440*4882a593Smuzhiyun #pragma pack() 441*4882a593Smuzhiyun 442*4882a593Smuzhiyun #endif /* _ACOBJECT_H */ 443