brintos

brintos / linux-shallow public Read only

0
0
Text · 16.1 KiB · 8fc0294 Raw
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