xref: /OK3568_Linux_fs/kernel/drivers/acpi/acpica/acobject.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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