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