162306a36Sopenharmony_ci/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 262306a36Sopenharmony_ci/****************************************************************************** 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Name: acobject.h - Definition of union acpi_operand_object (Internal object only) 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2000 - 2023, Intel Corp. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci *****************************************************************************/ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef _ACOBJECT_H 1162306a36Sopenharmony_ci#define _ACOBJECT_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* acpisrc:struct_defs -- for acpisrc conversion */ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* 1662306a36Sopenharmony_ci * The union acpi_operand_object is used to pass AML operands from the dispatcher 1762306a36Sopenharmony_ci * to the interpreter, and to keep track of the various handlers such as 1862306a36Sopenharmony_ci * address space handlers and notify handlers. The object is a constant 1962306a36Sopenharmony_ci * size in order to allow it to be cached and reused. 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * Note: The object is optimized to be aligned and will not work if it is 2262306a36Sopenharmony_ci * byte-packed. 2362306a36Sopenharmony_ci */ 2462306a36Sopenharmony_ci#if ACPI_MACHINE_WIDTH == 64 2562306a36Sopenharmony_ci#pragma pack(8) 2662306a36Sopenharmony_ci#else 2762306a36Sopenharmony_ci#pragma pack(4) 2862306a36Sopenharmony_ci#endif 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci/******************************************************************************* 3162306a36Sopenharmony_ci * 3262306a36Sopenharmony_ci * Common Descriptors 3362306a36Sopenharmony_ci * 3462306a36Sopenharmony_ci ******************************************************************************/ 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* 3762306a36Sopenharmony_ci * Common area for all objects. 3862306a36Sopenharmony_ci * 3962306a36Sopenharmony_ci * descriptor_type is used to differentiate between internal descriptors, and 4062306a36Sopenharmony_ci * must be in the same place across all descriptors 4162306a36Sopenharmony_ci * 4262306a36Sopenharmony_ci * Note: The descriptor_type and Type fields must appear in the identical 4362306a36Sopenharmony_ci * position in both the struct acpi_namespace_node and union acpi_operand_object 4462306a36Sopenharmony_ci * structures. 4562306a36Sopenharmony_ci */ 4662306a36Sopenharmony_ci#define ACPI_OBJECT_COMMON_HEADER \ 4762306a36Sopenharmony_ci union acpi_operand_object *next_object; /* Objects linked to parent NS node */\ 4862306a36Sopenharmony_ci u8 descriptor_type; /* To differentiate various internal objs */\ 4962306a36Sopenharmony_ci u8 type; /* acpi_object_type */\ 5062306a36Sopenharmony_ci u16 reference_count; /* For object deletion management */\ 5162306a36Sopenharmony_ci u8 flags; 5262306a36Sopenharmony_ci /* 5362306a36Sopenharmony_ci * Note: There are 3 bytes available here before the 5462306a36Sopenharmony_ci * next natural alignment boundary (for both 32/64 cases) 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* Values for Flag byte above */ 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci#define AOPOBJ_AML_CONSTANT 0x01 /* Integer is an AML constant */ 6062306a36Sopenharmony_ci#define AOPOBJ_STATIC_POINTER 0x02 /* Data is part of an ACPI table, don't delete */ 6162306a36Sopenharmony_ci#define AOPOBJ_DATA_VALID 0x04 /* Object is initialized and data is valid */ 6262306a36Sopenharmony_ci#define AOPOBJ_OBJECT_INITIALIZED 0x08 /* Region is initialized */ 6362306a36Sopenharmony_ci#define AOPOBJ_REG_CONNECTED 0x10 /* _REG was run */ 6462306a36Sopenharmony_ci#define AOPOBJ_SETUP_COMPLETE 0x20 /* Region setup is complete */ 6562306a36Sopenharmony_ci#define AOPOBJ_INVALID 0x40 /* Host OS won't allow a Region address */ 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci/****************************************************************************** 6862306a36Sopenharmony_ci * 6962306a36Sopenharmony_ci * Basic data types 7062306a36Sopenharmony_ci * 7162306a36Sopenharmony_ci *****************************************************************************/ 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cistruct acpi_object_common { 7462306a36Sopenharmony_ciACPI_OBJECT_COMMON_HEADER}; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistruct acpi_object_integer { 7762306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER u8 fill[3]; /* Prevent warning on some compilers */ 7862306a36Sopenharmony_ci u64 value; 7962306a36Sopenharmony_ci}; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci/* 8262306a36Sopenharmony_ci * Note: The String and Buffer object must be identical through the 8362306a36Sopenharmony_ci * pointer and length elements. There is code that depends on this. 8462306a36Sopenharmony_ci * 8562306a36Sopenharmony_ci * Fields common to both Strings and Buffers 8662306a36Sopenharmony_ci */ 8762306a36Sopenharmony_ci#define ACPI_COMMON_BUFFER_INFO(_type) \ 8862306a36Sopenharmony_ci _type *pointer; \ 8962306a36Sopenharmony_ci u32 length; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci/* Null terminated, ASCII characters only */ 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistruct acpi_object_string { 9462306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO(char) /* String in AML stream or allocated string */ 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistruct acpi_object_buffer { 9862306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_BUFFER_INFO(u8) /* Buffer in AML stream or allocated buffer */ 9962306a36Sopenharmony_ci u32 aml_length; 10062306a36Sopenharmony_ci u8 *aml_start; 10162306a36Sopenharmony_ci struct acpi_namespace_node *node; /* Link back to parent node */ 10262306a36Sopenharmony_ci}; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cistruct acpi_object_package { 10562306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *node; /* Link back to parent node */ 10662306a36Sopenharmony_ci union acpi_operand_object **elements; /* Array of pointers to acpi_objects */ 10762306a36Sopenharmony_ci u8 *aml_start; 10862306a36Sopenharmony_ci u32 aml_length; 10962306a36Sopenharmony_ci u32 count; /* # of elements in package */ 11062306a36Sopenharmony_ci}; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci/****************************************************************************** 11362306a36Sopenharmony_ci * 11462306a36Sopenharmony_ci * Complex data types 11562306a36Sopenharmony_ci * 11662306a36Sopenharmony_ci *****************************************************************************/ 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistruct acpi_object_event { 11962306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER acpi_semaphore os_semaphore; /* Actual OS synchronization object */ 12062306a36Sopenharmony_ci}; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cistruct acpi_object_mutex { 12362306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER u8 sync_level; /* 0-15, specified in Mutex() call */ 12462306a36Sopenharmony_ci u16 acquisition_depth; /* Allow multiple Acquires, same thread */ 12562306a36Sopenharmony_ci acpi_mutex os_mutex; /* Actual OS synchronization object */ 12662306a36Sopenharmony_ci acpi_thread_id thread_id; /* Current owner of the mutex */ 12762306a36Sopenharmony_ci struct acpi_thread_state *owner_thread; /* Current owner of the mutex */ 12862306a36Sopenharmony_ci union acpi_operand_object *prev; /* Link for list of acquired mutexes */ 12962306a36Sopenharmony_ci union acpi_operand_object *next; /* Link for list of acquired mutexes */ 13062306a36Sopenharmony_ci struct acpi_namespace_node *node; /* Containing namespace node */ 13162306a36Sopenharmony_ci u8 original_sync_level; /* Owner's original sync level (0-15) */ 13262306a36Sopenharmony_ci}; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_cistruct acpi_object_region { 13562306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER u8 space_id; 13662306a36Sopenharmony_ci struct acpi_namespace_node *node; /* Containing namespace node */ 13762306a36Sopenharmony_ci union acpi_operand_object *handler; /* Handler for region access */ 13862306a36Sopenharmony_ci union acpi_operand_object *next; 13962306a36Sopenharmony_ci acpi_physical_address address; 14062306a36Sopenharmony_ci u32 length; 14162306a36Sopenharmony_ci void *pointer; /* Only for data table regions */ 14262306a36Sopenharmony_ci}; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_cistruct acpi_object_method { 14562306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER u8 info_flags; 14662306a36Sopenharmony_ci u8 param_count; 14762306a36Sopenharmony_ci u8 sync_level; 14862306a36Sopenharmony_ci union acpi_operand_object *mutex; 14962306a36Sopenharmony_ci union acpi_operand_object *node; 15062306a36Sopenharmony_ci u8 *aml_start; 15162306a36Sopenharmony_ci union { 15262306a36Sopenharmony_ci acpi_internal_method implementation; 15362306a36Sopenharmony_ci union acpi_operand_object *handler; 15462306a36Sopenharmony_ci } dispatch; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci u32 aml_length; 15762306a36Sopenharmony_ci acpi_owner_id owner_id; 15862306a36Sopenharmony_ci u8 thread_count; 15962306a36Sopenharmony_ci}; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci/* Flags for info_flags field above */ 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci#define ACPI_METHOD_MODULE_LEVEL 0x01 /* Method is actually module-level code */ 16462306a36Sopenharmony_ci#define ACPI_METHOD_INTERNAL_ONLY 0x02 /* Method is implemented internally (_OSI) */ 16562306a36Sopenharmony_ci#define ACPI_METHOD_SERIALIZED 0x04 /* Method is serialized */ 16662306a36Sopenharmony_ci#define ACPI_METHOD_SERIALIZED_PENDING 0x08 /* Method is to be marked serialized */ 16762306a36Sopenharmony_ci#define ACPI_METHOD_IGNORE_SYNC_LEVEL 0x10 /* Method was auto-serialized at table load time */ 16862306a36Sopenharmony_ci#define ACPI_METHOD_MODIFIED_NAMESPACE 0x20 /* Method modified the namespace */ 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci/****************************************************************************** 17162306a36Sopenharmony_ci * 17262306a36Sopenharmony_ci * Objects that can be notified. All share a common notify_info area. 17362306a36Sopenharmony_ci * 17462306a36Sopenharmony_ci *****************************************************************************/ 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci/* 17762306a36Sopenharmony_ci * Common fields for objects that support ASL notifications 17862306a36Sopenharmony_ci */ 17962306a36Sopenharmony_ci#define ACPI_COMMON_NOTIFY_INFO \ 18062306a36Sopenharmony_ci union acpi_operand_object *notify_list[2]; /* Handlers for system/device notifies */\ 18162306a36Sopenharmony_ci union acpi_operand_object *handler; /* Handler for Address space */ 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci/* COMMON NOTIFY for POWER, PROCESSOR, DEVICE, and THERMAL */ 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_cistruct acpi_object_notify_common { 18662306a36Sopenharmony_ciACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO}; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_cistruct acpi_object_device { 18962306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER 19062306a36Sopenharmony_ci ACPI_COMMON_NOTIFY_INFO struct acpi_gpe_block_info *gpe_block; 19162306a36Sopenharmony_ci}; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_cistruct acpi_object_power_resource { 19462306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO u32 system_level; 19562306a36Sopenharmony_ci u32 resource_order; 19662306a36Sopenharmony_ci}; 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_cistruct acpi_object_processor { 19962306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER 20062306a36Sopenharmony_ci /* The next two fields take advantage of the 3-byte space before NOTIFY_INFO */ 20162306a36Sopenharmony_ci u8 proc_id; 20262306a36Sopenharmony_ci u8 length; 20362306a36Sopenharmony_ci ACPI_COMMON_NOTIFY_INFO acpi_io_address address; 20462306a36Sopenharmony_ci}; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_cistruct acpi_object_thermal_zone { 20762306a36Sopenharmony_ciACPI_OBJECT_COMMON_HEADER ACPI_COMMON_NOTIFY_INFO}; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci/****************************************************************************** 21062306a36Sopenharmony_ci * 21162306a36Sopenharmony_ci * Fields. All share a common header/info field. 21262306a36Sopenharmony_ci * 21362306a36Sopenharmony_ci *****************************************************************************/ 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci/* 21662306a36Sopenharmony_ci * Common bitfield for the field objects 21762306a36Sopenharmony_ci * "Field Datum" -- a datum from the actual field object 21862306a36Sopenharmony_ci * "Buffer Datum" -- a datum from a user buffer, read from or to be written to the field 21962306a36Sopenharmony_ci */ 22062306a36Sopenharmony_ci#define ACPI_COMMON_FIELD_INFO \ 22162306a36Sopenharmony_ci u8 field_flags; /* Access, update, and lock bits */\ 22262306a36Sopenharmony_ci u8 attribute; /* From access_as keyword */\ 22362306a36Sopenharmony_ci u8 access_byte_width; /* Read/Write size in bytes */\ 22462306a36Sopenharmony_ci struct acpi_namespace_node *node; /* Link back to parent node */\ 22562306a36Sopenharmony_ci u32 bit_length; /* Length of field in bits */\ 22662306a36Sopenharmony_ci u32 base_byte_offset; /* Byte offset within containing object */\ 22762306a36Sopenharmony_ci u32 value; /* Value to store into the Bank or Index register */\ 22862306a36Sopenharmony_ci u8 start_field_bit_offset;/* Bit offset within first field datum (0-63) */\ 22962306a36Sopenharmony_ci u8 access_length; /* For serial regions/fields */ 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci/* COMMON FIELD (for BUFFER, REGION, BANK, and INDEX fields) */ 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_cistruct acpi_object_field_common { 23562306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Parent Operation Region object (REGION/BANK fields only) */ 23662306a36Sopenharmony_ci}; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_cistruct acpi_object_region_field { 23962306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO u16 resource_length; 24062306a36Sopenharmony_ci union acpi_operand_object *region_obj; /* Containing op_region object */ 24162306a36Sopenharmony_ci u8 *resource_buffer; /* resource_template for serial regions/fields */ 24262306a36Sopenharmony_ci u16 pin_number_index; /* Index relative to previous Connection/Template */ 24362306a36Sopenharmony_ci u8 *internal_pcc_buffer; /* Internal buffer for fields associated with PCC */ 24462306a36Sopenharmony_ci}; 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_cistruct acpi_object_bank_field { 24762306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO union acpi_operand_object *region_obj; /* Containing op_region object */ 24862306a36Sopenharmony_ci union acpi_operand_object *bank_obj; /* bank_select Register object */ 24962306a36Sopenharmony_ci}; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistruct acpi_object_index_field { 25262306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO 25362306a36Sopenharmony_ci /* 25462306a36Sopenharmony_ci * No "RegionObj" pointer needed since the Index and Data registers 25562306a36Sopenharmony_ci * are each field definitions unto themselves. 25662306a36Sopenharmony_ci */ 25762306a36Sopenharmony_ci union acpi_operand_object *index_obj; /* Index register */ 25862306a36Sopenharmony_ci union acpi_operand_object *data_obj; /* Data register */ 25962306a36Sopenharmony_ci}; 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci/* The buffer_field is different in that it is part of a Buffer, not an op_region */ 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_cistruct acpi_object_buffer_field { 26462306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER ACPI_COMMON_FIELD_INFO u8 is_create_field; /* Special case for objects created by create_field() */ 26562306a36Sopenharmony_ci union acpi_operand_object *buffer_obj; /* Containing Buffer object */ 26662306a36Sopenharmony_ci}; 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci/****************************************************************************** 26962306a36Sopenharmony_ci * 27062306a36Sopenharmony_ci * Objects for handlers 27162306a36Sopenharmony_ci * 27262306a36Sopenharmony_ci *****************************************************************************/ 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistruct acpi_object_notify_handler { 27562306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *node; /* Parent device */ 27662306a36Sopenharmony_ci u32 handler_type; /* Type: Device/System/Both */ 27762306a36Sopenharmony_ci acpi_notify_handler handler; /* Handler address */ 27862306a36Sopenharmony_ci void *context; 27962306a36Sopenharmony_ci union acpi_operand_object *next[2]; /* Device and System handler lists */ 28062306a36Sopenharmony_ci}; 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_cistruct acpi_object_addr_handler { 28362306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER u8 space_id; 28462306a36Sopenharmony_ci u8 handler_flags; 28562306a36Sopenharmony_ci acpi_adr_space_handler handler; 28662306a36Sopenharmony_ci struct acpi_namespace_node *node; /* Parent device */ 28762306a36Sopenharmony_ci void *context; 28862306a36Sopenharmony_ci acpi_mutex context_mutex; 28962306a36Sopenharmony_ci acpi_adr_space_setup setup; 29062306a36Sopenharmony_ci union acpi_operand_object *region_list; /* Regions using this handler */ 29162306a36Sopenharmony_ci union acpi_operand_object *next; 29262306a36Sopenharmony_ci}; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci/* Flags for address handler (handler_flags) */ 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci#define ACPI_ADDR_HANDLER_DEFAULT_INSTALLED 0x01 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci/****************************************************************************** 29962306a36Sopenharmony_ci * 30062306a36Sopenharmony_ci * Special internal objects 30162306a36Sopenharmony_ci * 30262306a36Sopenharmony_ci *****************************************************************************/ 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci/* 30562306a36Sopenharmony_ci * The Reference object is used for these opcodes: 30662306a36Sopenharmony_ci * Arg[0-6], Local[0-7], index_op, name_op, ref_of_op, load_op, load_table_op, debug_op 30762306a36Sopenharmony_ci * The Reference.Class differentiates these types. 30862306a36Sopenharmony_ci */ 30962306a36Sopenharmony_cistruct acpi_object_reference { 31062306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER u8 class; /* Reference Class */ 31162306a36Sopenharmony_ci u8 target_type; /* Used for Index Op */ 31262306a36Sopenharmony_ci u8 resolved; /* Reference has been resolved to a value */ 31362306a36Sopenharmony_ci void *object; /* name_op=>HANDLE to obj, index_op=>union acpi_operand_object */ 31462306a36Sopenharmony_ci struct acpi_namespace_node *node; /* ref_of or Namepath */ 31562306a36Sopenharmony_ci union acpi_operand_object **where; /* Target of Index */ 31662306a36Sopenharmony_ci u8 *index_pointer; /* Used for Buffers and Strings */ 31762306a36Sopenharmony_ci u8 *aml; /* Used for deferred resolution of the ref */ 31862306a36Sopenharmony_ci u32 value; /* Used for Local/Arg/Index/ddb_handle */ 31962306a36Sopenharmony_ci}; 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci/* Values for Reference.Class above */ 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_citypedef enum { 32462306a36Sopenharmony_ci ACPI_REFCLASS_LOCAL = 0, /* Method local */ 32562306a36Sopenharmony_ci ACPI_REFCLASS_ARG = 1, /* Method argument */ 32662306a36Sopenharmony_ci ACPI_REFCLASS_REFOF = 2, /* Result of ref_of() TBD: Split to Ref/Node and Ref/operand_obj? */ 32762306a36Sopenharmony_ci ACPI_REFCLASS_INDEX = 3, /* Result of Index() */ 32862306a36Sopenharmony_ci ACPI_REFCLASS_TABLE = 4, /* ddb_handle - Load(), load_table() */ 32962306a36Sopenharmony_ci ACPI_REFCLASS_NAME = 5, /* Reference to a named object */ 33062306a36Sopenharmony_ci ACPI_REFCLASS_DEBUG = 6, /* Debug object */ 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci ACPI_REFCLASS_MAX = 6 33362306a36Sopenharmony_ci} ACPI_REFERENCE_CLASSES; 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci/* 33662306a36Sopenharmony_ci * Extra object is used as additional storage for types that 33762306a36Sopenharmony_ci * have AML code in their declarations (term_args) that must be 33862306a36Sopenharmony_ci * evaluated at run time. 33962306a36Sopenharmony_ci * 34062306a36Sopenharmony_ci * Currently: Region and field_unit types 34162306a36Sopenharmony_ci */ 34262306a36Sopenharmony_cistruct acpi_object_extra { 34362306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *method_REG; /* _REG method for this region (if any) */ 34462306a36Sopenharmony_ci struct acpi_namespace_node *scope_node; 34562306a36Sopenharmony_ci void *region_context; /* Region-specific data */ 34662306a36Sopenharmony_ci u8 *aml_start; 34762306a36Sopenharmony_ci u32 aml_length; 34862306a36Sopenharmony_ci}; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci/* Additional data that can be attached to namespace nodes */ 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_cistruct acpi_object_data { 35362306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER acpi_object_handler handler; 35462306a36Sopenharmony_ci void *pointer; 35562306a36Sopenharmony_ci}; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci/* Structure used when objects are cached for reuse */ 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_cistruct acpi_object_cache_list { 36062306a36Sopenharmony_ci ACPI_OBJECT_COMMON_HEADER union acpi_operand_object *next; /* Link for object cache and internal lists */ 36162306a36Sopenharmony_ci}; 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci/****************************************************************************** 36462306a36Sopenharmony_ci * 36562306a36Sopenharmony_ci * union acpi_operand_object descriptor - a giant union of all of the above 36662306a36Sopenharmony_ci * 36762306a36Sopenharmony_ci *****************************************************************************/ 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ciunion acpi_operand_object { 37062306a36Sopenharmony_ci struct acpi_object_common common; 37162306a36Sopenharmony_ci struct acpi_object_integer integer; 37262306a36Sopenharmony_ci struct acpi_object_string string; 37362306a36Sopenharmony_ci struct acpi_object_buffer buffer; 37462306a36Sopenharmony_ci struct acpi_object_package package; 37562306a36Sopenharmony_ci struct acpi_object_event event; 37662306a36Sopenharmony_ci struct acpi_object_method method; 37762306a36Sopenharmony_ci struct acpi_object_mutex mutex; 37862306a36Sopenharmony_ci struct acpi_object_region region; 37962306a36Sopenharmony_ci struct acpi_object_notify_common common_notify; 38062306a36Sopenharmony_ci struct acpi_object_device device; 38162306a36Sopenharmony_ci struct acpi_object_power_resource power_resource; 38262306a36Sopenharmony_ci struct acpi_object_processor processor; 38362306a36Sopenharmony_ci struct acpi_object_thermal_zone thermal_zone; 38462306a36Sopenharmony_ci struct acpi_object_field_common common_field; 38562306a36Sopenharmony_ci struct acpi_object_region_field field; 38662306a36Sopenharmony_ci struct acpi_object_buffer_field buffer_field; 38762306a36Sopenharmony_ci struct acpi_object_bank_field bank_field; 38862306a36Sopenharmony_ci struct acpi_object_index_field index_field; 38962306a36Sopenharmony_ci struct acpi_object_notify_handler notify; 39062306a36Sopenharmony_ci struct acpi_object_addr_handler address_space; 39162306a36Sopenharmony_ci struct acpi_object_reference reference; 39262306a36Sopenharmony_ci struct acpi_object_extra extra; 39362306a36Sopenharmony_ci struct acpi_object_data data; 39462306a36Sopenharmony_ci struct acpi_object_cache_list cache; 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci /* 39762306a36Sopenharmony_ci * Add namespace node to union in order to simplify code that accepts both 39862306a36Sopenharmony_ci * ACPI_OPERAND_OBJECTs and ACPI_NAMESPACE_NODEs. The structures share 39962306a36Sopenharmony_ci * a common descriptor_type field in order to differentiate them. 40062306a36Sopenharmony_ci */ 40162306a36Sopenharmony_ci struct acpi_namespace_node node; 40262306a36Sopenharmony_ci}; 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci/****************************************************************************** 40562306a36Sopenharmony_ci * 40662306a36Sopenharmony_ci * union acpi_descriptor - objects that share a common descriptor identifier 40762306a36Sopenharmony_ci * 40862306a36Sopenharmony_ci *****************************************************************************/ 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci/* Object descriptor types */ 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci#define ACPI_DESC_TYPE_CACHED 0x01 /* Used only when object is cached */ 41362306a36Sopenharmony_ci#define ACPI_DESC_TYPE_STATE 0x02 41462306a36Sopenharmony_ci#define ACPI_DESC_TYPE_STATE_UPDATE 0x03 41562306a36Sopenharmony_ci#define ACPI_DESC_TYPE_STATE_PACKAGE 0x04 41662306a36Sopenharmony_ci#define ACPI_DESC_TYPE_STATE_CONTROL 0x05 41762306a36Sopenharmony_ci#define ACPI_DESC_TYPE_STATE_RPSCOPE 0x06 41862306a36Sopenharmony_ci#define ACPI_DESC_TYPE_STATE_PSCOPE 0x07 41962306a36Sopenharmony_ci#define ACPI_DESC_TYPE_STATE_WSCOPE 0x08 42062306a36Sopenharmony_ci#define ACPI_DESC_TYPE_STATE_RESULT 0x09 42162306a36Sopenharmony_ci#define ACPI_DESC_TYPE_STATE_NOTIFY 0x0A 42262306a36Sopenharmony_ci#define ACPI_DESC_TYPE_STATE_THREAD 0x0B 42362306a36Sopenharmony_ci#define ACPI_DESC_TYPE_WALK 0x0C 42462306a36Sopenharmony_ci#define ACPI_DESC_TYPE_PARSER 0x0D 42562306a36Sopenharmony_ci#define ACPI_DESC_TYPE_OPERAND 0x0E 42662306a36Sopenharmony_ci#define ACPI_DESC_TYPE_NAMED 0x0F 42762306a36Sopenharmony_ci#define ACPI_DESC_TYPE_MAX 0x0F 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_cistruct acpi_common_descriptor { 43062306a36Sopenharmony_ci void *common_pointer; 43162306a36Sopenharmony_ci u8 descriptor_type; /* To differentiate various internal objs */ 43262306a36Sopenharmony_ci}; 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ciunion acpi_descriptor { 43562306a36Sopenharmony_ci struct acpi_common_descriptor common; 43662306a36Sopenharmony_ci union acpi_operand_object object; 43762306a36Sopenharmony_ci struct acpi_namespace_node node; 43862306a36Sopenharmony_ci union acpi_parse_object op; 43962306a36Sopenharmony_ci}; 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_ci#pragma pack() 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci#endif /* _ACOBJECT_H */ 444