acobject.h revision 229989
1
2/******************************************************************************
3 *
4 * Name: acobject.h - Definition of ACPI_OPERAND_OBJECT  (Internal object only)
5 *
6 *****************************************************************************/
7
8/*
9 * Copyright (C) 2000 - 2012, Intel Corp.
10 * All rights reserved.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 *    notice, this list of conditions, and the following disclaimer,
17 *    without modification.
18 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19 *    substantially similar to the "NO WARRANTY" disclaimer below
20 *    ("Disclaimer") and any redistribution must be conditioned upon
21 *    including a substantially similar Disclaimer requirement for further
22 *    binary redistribution.
23 * 3. Neither the names of the above-listed copyright holders nor the names
24 *    of any contributors may be used to endorse or promote products derived
25 *    from this software without specific prior written permission.
26 *
27 * Alternatively, this software may be distributed under the terms of the
28 * GNU General Public License ("GPL") version 2 as published by the Free
29 * Software Foundation.
30 *
31 * NO WARRANTY
32 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42 * POSSIBILITY OF SUCH DAMAGES.
43 */
44
45#ifndef _ACOBJECT_H
46#define _ACOBJECT_H
47
48/* acpisrc:StructDefs -- for acpisrc conversion */
49
50
51/*
52 * The ACPI_OPERAND_OBJECT is used to pass AML operands from the dispatcher
53 * to the interpreter, and to keep track of the various handlers such as
54 * address space handlers and notify handlers. The object is a constant
55 * size in order to allow it to be cached and reused.
56 *
57 * Note: The object is optimized to be aligned and will not work if it is
58 * byte-packed.
59 */
60#if ACPI_MACHINE_WIDTH == 64
61#pragma pack(8)
62#else
63#pragma pack(4)
64#endif
65
66/*******************************************************************************
67 *
68 * Common Descriptors
69 *
70 ******************************************************************************/
71
72/*
73 * Common area for all objects.
74 *
75 * DescriptorType is used to differentiate between internal descriptors, and
76 * must be in the same place across all descriptors
77 *
78 * Note: The DescriptorType and Type fields must appear in the identical
79 * position in both the ACPI_NAMESPACE_NODE and ACPI_OPERAND_OBJECT
80 * structures.
81 */
82#define ACPI_OBJECT_COMMON_HEADER \
83    union acpi_operand_object       *NextObject;        /* Objects linked to parent NS node */\
84    UINT8                           DescriptorType;     /* To differentiate various internal objs */\
85    UINT8                           Type;               /* ACPI_OBJECT_TYPE */\
86    UINT16                          ReferenceCount;     /* For object deletion management */\
87    UINT8                           Flags;
88    /*
89     * Note: There are 3 bytes available here before the
90     * next natural alignment boundary (for both 32/64 cases)
91     */
92
93/* Values for Flag byte above */
94
95#define AOPOBJ_AML_CONSTANT         0x01    /* Integer is an AML constant */
96#define AOPOBJ_STATIC_POINTER       0x02    /* Data is part of an ACPI table, don't delete */
97#define AOPOBJ_DATA_VALID           0x04    /* Object is intialized and data is valid */
98#define AOPOBJ_OBJECT_INITIALIZED   0x08    /* Region is initialized, _REG was run */
99#define AOPOBJ_SETUP_COMPLETE       0x10    /* Region setup is complete */
100#define AOPOBJ_INVALID              0x20    /* Host OS won't allow a Region address */
101
102
103/******************************************************************************
104 *
105 * Basic data types
106 *
107 *****************************************************************************/
108
109typedef struct acpi_object_common
110{
111    ACPI_OBJECT_COMMON_HEADER
112
113} ACPI_OBJECT_COMMON;
114
115
116typedef struct acpi_object_integer
117{
118    ACPI_OBJECT_COMMON_HEADER
119    UINT8                           Fill[3];            /* Prevent warning on some compilers */
120    UINT64                          Value;
121
122} ACPI_OBJECT_INTEGER;
123
124
125/*
126 * Note: The String and Buffer object must be identical through the Pointer
127 * and length elements.  There is code that depends on this.
128 *
129 * Fields common to both Strings and Buffers
130 */
131#define ACPI_COMMON_BUFFER_INFO(_Type) \
132    _Type                           *Pointer; \
133    UINT32                          Length;
134
135
136typedef struct acpi_object_string   /* Null terminated, ASCII characters only */
137{
138    ACPI_OBJECT_COMMON_HEADER
139    ACPI_COMMON_BUFFER_INFO         (char)              /* String in AML stream or allocated string */
140
141} ACPI_OBJECT_STRING;
142
143
144typedef struct acpi_object_buffer
145{
146    ACPI_OBJECT_COMMON_HEADER
147    ACPI_COMMON_BUFFER_INFO         (UINT8)             /* Buffer in AML stream or allocated buffer */
148    UINT32                          AmlLength;
149    UINT8                           *AmlStart;
150    ACPI_NAMESPACE_NODE             *Node;              /* Link back to parent node */
151
152} ACPI_OBJECT_BUFFER;
153
154
155typedef struct acpi_object_package
156{
157    ACPI_OBJECT_COMMON_HEADER
158    ACPI_NAMESPACE_NODE             *Node;              /* Link back to parent node */
159    union acpi_operand_object       **Elements;         /* Array of pointers to AcpiObjects */
160    UINT8                           *AmlStart;
161    UINT32                          AmlLength;
162    UINT32                          Count;              /* # of elements in package */
163
164} ACPI_OBJECT_PACKAGE;
165
166
167/******************************************************************************
168 *
169 * Complex data types
170 *
171 *****************************************************************************/
172
173typedef struct acpi_object_event
174{
175    ACPI_OBJECT_COMMON_HEADER
176    ACPI_SEMAPHORE                  OsSemaphore;        /* Actual OS synchronization object */
177
178} ACPI_OBJECT_EVENT;
179
180
181typedef struct acpi_object_mutex
182{
183    ACPI_OBJECT_COMMON_HEADER
184    UINT8                           SyncLevel;          /* 0-15, specified in Mutex() call */
185    UINT16                          AcquisitionDepth;   /* Allow multiple Acquires, same thread */
186    ACPI_MUTEX                      OsMutex;            /* Actual OS synchronization object */
187    ACPI_THREAD_ID                  ThreadId;           /* Current owner of the mutex */
188    struct acpi_thread_state        *OwnerThread;       /* Current owner of the mutex */
189    union acpi_operand_object       *Prev;              /* Link for list of acquired mutexes */
190    union acpi_operand_object       *Next;              /* Link for list of acquired mutexes */
191    ACPI_NAMESPACE_NODE             *Node;              /* Containing namespace node */
192    UINT8                           OriginalSyncLevel;  /* Owner's original sync level (0-15) */
193
194} ACPI_OBJECT_MUTEX;
195
196
197typedef struct acpi_object_region
198{
199    ACPI_OBJECT_COMMON_HEADER
200    UINT8                           SpaceId;
201    ACPI_NAMESPACE_NODE             *Node;              /* Containing namespace node */
202    union acpi_operand_object       *Handler;           /* Handler for region access */
203    union acpi_operand_object       *Next;
204    ACPI_PHYSICAL_ADDRESS           Address;
205    UINT32                          Length;
206
207} ACPI_OBJECT_REGION;
208
209
210typedef struct acpi_object_method
211{
212    ACPI_OBJECT_COMMON_HEADER
213    UINT8                           InfoFlags;
214    UINT8                           ParamCount;
215    UINT8                           SyncLevel;
216    union acpi_operand_object       *Mutex;
217    UINT8                           *AmlStart;
218    union
219    {
220        ACPI_INTERNAL_METHOD            Implementation;
221        union acpi_operand_object       *Handler;
222    } Dispatch;
223
224    UINT32                          AmlLength;
225    UINT8                           ThreadCount;
226    ACPI_OWNER_ID                   OwnerId;
227
228} ACPI_OBJECT_METHOD;
229
230/* Flags for InfoFlags field above */
231
232#define ACPI_METHOD_MODULE_LEVEL        0x01    /* Method is actually module-level code */
233#define ACPI_METHOD_INTERNAL_ONLY       0x02    /* Method is implemented internally (_OSI) */
234#define ACPI_METHOD_SERIALIZED          0x04    /* Method is serialized */
235#define ACPI_METHOD_SERIALIZED_PENDING  0x08    /* Method is to be marked serialized */
236#define ACPI_METHOD_MODIFIED_NAMESPACE  0x10    /* Method modified the namespace */
237
238
239/******************************************************************************
240 *
241 * Objects that can be notified.  All share a common NotifyInfo area.
242 *
243 *****************************************************************************/
244
245/*
246 * Common fields for objects that support ASL notifications
247 */
248#define ACPI_COMMON_NOTIFY_INFO \
249    union acpi_operand_object       *SystemNotify;      /* Handler for system notifies */\
250    union acpi_operand_object       *DeviceNotify;      /* Handler for driver notifies */\
251    union acpi_operand_object       *Handler;           /* Handler for Address space */
252
253
254typedef struct acpi_object_notify_common    /* COMMON NOTIFY for POWER, PROCESSOR, DEVICE, and THERMAL */
255{
256    ACPI_OBJECT_COMMON_HEADER
257    ACPI_COMMON_NOTIFY_INFO
258
259} ACPI_OBJECT_NOTIFY_COMMON;
260
261
262typedef struct acpi_object_device
263{
264    ACPI_OBJECT_COMMON_HEADER
265    ACPI_COMMON_NOTIFY_INFO
266    ACPI_GPE_BLOCK_INFO             *GpeBlock;
267
268} ACPI_OBJECT_DEVICE;
269
270
271typedef struct acpi_object_power_resource
272{
273    ACPI_OBJECT_COMMON_HEADER
274    ACPI_COMMON_NOTIFY_INFO
275    UINT32                          SystemLevel;
276    UINT32                          ResourceOrder;
277
278} ACPI_OBJECT_POWER_RESOURCE;
279
280
281typedef struct acpi_object_processor
282{
283    ACPI_OBJECT_COMMON_HEADER
284
285    /* The next two fields take advantage of the 3-byte space before NOTIFY_INFO */
286
287    UINT8                           ProcId;
288    UINT8                           Length;
289    ACPI_COMMON_NOTIFY_INFO
290    ACPI_IO_ADDRESS                 Address;
291
292} ACPI_OBJECT_PROCESSOR;
293
294
295typedef struct acpi_object_thermal_zone
296{
297    ACPI_OBJECT_COMMON_HEADER
298    ACPI_COMMON_NOTIFY_INFO
299
300} ACPI_OBJECT_THERMAL_ZONE;
301
302
303/******************************************************************************
304 *
305 * Fields.  All share a common header/info field.
306 *
307 *****************************************************************************/
308
309/*
310 * Common bitfield for the field objects
311 * "Field Datum"  -- a datum from the actual field object
312 * "Buffer Datum" -- a datum from a user buffer, read from or to be written to the field
313 */
314#define ACPI_COMMON_FIELD_INFO \
315    UINT8                           FieldFlags;         /* Access, update, and lock bits */\
316    UINT8                           Attribute;          /* From AccessAs keyword */\
317    UINT8                           AccessByteWidth;    /* Read/Write size in bytes */\
318    ACPI_NAMESPACE_NODE             *Node;              /* Link back to parent node */\
319    UINT32                          BitLength;          /* Length of field in bits */\
320    UINT32                          BaseByteOffset;     /* Byte offset within containing object */\
321    UINT32                          Value;              /* Value to store into the Bank or Index register */\
322    UINT8                           StartFieldBitOffset;/* Bit offset within first field datum (0-63) */\
323    UINT8                           AccessLength;       /* For serial regions/fields */
324
325
326typedef struct acpi_object_field_common                 /* COMMON FIELD (for BUFFER, REGION, BANK, and INDEX fields) */
327{
328    ACPI_OBJECT_COMMON_HEADER
329    ACPI_COMMON_FIELD_INFO
330    union acpi_operand_object       *RegionObj;         /* Parent Operation Region object (REGION/BANK fields only) */
331
332} ACPI_OBJECT_FIELD_COMMON;
333
334
335typedef struct acpi_object_region_field
336{
337    ACPI_OBJECT_COMMON_HEADER
338    ACPI_COMMON_FIELD_INFO
339    UINT16                          ResourceLength;
340    union acpi_operand_object       *RegionObj;         /* Containing OpRegion object */
341    UINT8                           *ResourceBuffer;    /* ResourceTemplate for serial regions/fields */
342
343} ACPI_OBJECT_REGION_FIELD;
344
345
346typedef struct acpi_object_bank_field
347{
348    ACPI_OBJECT_COMMON_HEADER
349    ACPI_COMMON_FIELD_INFO
350    union acpi_operand_object       *RegionObj;         /* Containing OpRegion object */
351    union acpi_operand_object       *BankObj;           /* BankSelect Register object */
352
353} ACPI_OBJECT_BANK_FIELD;
354
355
356typedef struct acpi_object_index_field
357{
358    ACPI_OBJECT_COMMON_HEADER
359    ACPI_COMMON_FIELD_INFO
360
361    /*
362     * No "RegionObj" pointer needed since the Index and Data registers
363     * are each field definitions unto themselves.
364     */
365    union acpi_operand_object       *IndexObj;          /* Index register */
366    union acpi_operand_object       *DataObj;           /* Data register */
367
368} ACPI_OBJECT_INDEX_FIELD;
369
370
371/* The BufferField is different in that it is part of a Buffer, not an OpRegion */
372
373typedef struct acpi_object_buffer_field
374{
375    ACPI_OBJECT_COMMON_HEADER
376    ACPI_COMMON_FIELD_INFO
377    union acpi_operand_object       *BufferObj;         /* Containing Buffer object */
378
379} ACPI_OBJECT_BUFFER_FIELD;
380
381
382/******************************************************************************
383 *
384 * Objects for handlers
385 *
386 *****************************************************************************/
387
388typedef struct acpi_object_notify_handler
389{
390    ACPI_OBJECT_COMMON_HEADER
391    ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
392    ACPI_NOTIFY_HANDLER             Handler;
393    void                            *Context;
394
395} ACPI_OBJECT_NOTIFY_HANDLER;
396
397
398typedef struct acpi_object_addr_handler
399{
400    ACPI_OBJECT_COMMON_HEADER
401    UINT8                           SpaceId;
402    UINT8                           HandlerFlags;
403    ACPI_ADR_SPACE_HANDLER          Handler;
404    ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
405    void                            *Context;
406    ACPI_ADR_SPACE_SETUP            Setup;
407    union acpi_operand_object       *RegionList;        /* regions using this handler */
408    union acpi_operand_object       *Next;
409
410} ACPI_OBJECT_ADDR_HANDLER;
411
412/* Flags for address handler (HandlerFlags) */
413
414#define ACPI_ADDR_HANDLER_DEFAULT_INSTALLED  0x01
415
416
417/******************************************************************************
418 *
419 * Special internal objects
420 *
421 *****************************************************************************/
422
423/*
424 * The Reference object is used for these opcodes:
425 * Arg[0-6], Local[0-7], IndexOp, NameOp, RefOfOp, LoadOp, LoadTableOp, DebugOp
426 * The Reference.Class differentiates these types.
427 */
428typedef struct acpi_object_reference
429{
430    ACPI_OBJECT_COMMON_HEADER
431     UINT8                           Class;              /* Reference Class */
432     UINT8                           TargetType;         /* Used for Index Op */
433     UINT8                           Reserved;
434     void                            *Object;            /* NameOp=>HANDLE to obj, IndexOp=>ACPI_OPERAND_OBJECT */
435     ACPI_NAMESPACE_NODE             *Node;              /* RefOf or Namepath */
436     union acpi_operand_object       **Where;            /* Target of Index */
437     UINT32                          Value;              /* Used for Local/Arg/Index/DdbHandle */
438
439} ACPI_OBJECT_REFERENCE;
440
441/* Values for Reference.Class above */
442
443typedef enum
444{
445    ACPI_REFCLASS_LOCAL             = 0,        /* Method local */
446    ACPI_REFCLASS_ARG               = 1,        /* Method argument */
447    ACPI_REFCLASS_REFOF             = 2,        /* Result of RefOf() TBD: Split to Ref/Node and Ref/OperandObj? */
448    ACPI_REFCLASS_INDEX             = 3,        /* Result of Index() */
449    ACPI_REFCLASS_TABLE             = 4,        /* DdbHandle - Load(), LoadTable() */
450    ACPI_REFCLASS_NAME              = 5,        /* Reference to a named object */
451    ACPI_REFCLASS_DEBUG             = 6,        /* Debug object */
452
453    ACPI_REFCLASS_MAX               = 6
454
455} ACPI_REFERENCE_CLASSES;
456
457
458/*
459 * Extra object is used as additional storage for types that
460 * have AML code in their declarations (TermArgs) that must be
461 * evaluated at run time.
462 *
463 * Currently: Region and FieldUnit types
464 */
465typedef struct acpi_object_extra
466{
467    ACPI_OBJECT_COMMON_HEADER
468    ACPI_NAMESPACE_NODE             *Method_REG;        /* _REG method for this region (if any) */
469    ACPI_NAMESPACE_NODE             *ScopeNode;
470    void                            *RegionContext;     /* Region-specific data */
471    UINT8                           *AmlStart;
472    UINT32                          AmlLength;
473
474} ACPI_OBJECT_EXTRA;
475
476
477/* Additional data that can be attached to namespace nodes */
478
479typedef struct acpi_object_data
480{
481    ACPI_OBJECT_COMMON_HEADER
482    ACPI_OBJECT_HANDLER             Handler;
483    void                            *Pointer;
484
485} ACPI_OBJECT_DATA;
486
487
488/* Structure used when objects are cached for reuse */
489
490typedef struct acpi_object_cache_list
491{
492    ACPI_OBJECT_COMMON_HEADER
493    union acpi_operand_object       *Next;              /* Link for object cache and internal lists*/
494
495} ACPI_OBJECT_CACHE_LIST;
496
497
498/******************************************************************************
499 *
500 * ACPI_OPERAND_OBJECT Descriptor - a giant union of all of the above
501 *
502 *****************************************************************************/
503
504typedef union acpi_operand_object
505{
506    ACPI_OBJECT_COMMON                  Common;
507    ACPI_OBJECT_INTEGER                 Integer;
508    ACPI_OBJECT_STRING                  String;
509    ACPI_OBJECT_BUFFER                  Buffer;
510    ACPI_OBJECT_PACKAGE                 Package;
511    ACPI_OBJECT_EVENT                   Event;
512    ACPI_OBJECT_METHOD                  Method;
513    ACPI_OBJECT_MUTEX                   Mutex;
514    ACPI_OBJECT_REGION                  Region;
515    ACPI_OBJECT_NOTIFY_COMMON           CommonNotify;
516    ACPI_OBJECT_DEVICE                  Device;
517    ACPI_OBJECT_POWER_RESOURCE          PowerResource;
518    ACPI_OBJECT_PROCESSOR               Processor;
519    ACPI_OBJECT_THERMAL_ZONE            ThermalZone;
520    ACPI_OBJECT_FIELD_COMMON            CommonField;
521    ACPI_OBJECT_REGION_FIELD            Field;
522    ACPI_OBJECT_BUFFER_FIELD            BufferField;
523    ACPI_OBJECT_BANK_FIELD              BankField;
524    ACPI_OBJECT_INDEX_FIELD             IndexField;
525    ACPI_OBJECT_NOTIFY_HANDLER          Notify;
526    ACPI_OBJECT_ADDR_HANDLER            AddressSpace;
527    ACPI_OBJECT_REFERENCE               Reference;
528    ACPI_OBJECT_EXTRA                   Extra;
529    ACPI_OBJECT_DATA                    Data;
530    ACPI_OBJECT_CACHE_LIST              Cache;
531
532    /*
533     * Add namespace node to union in order to simplify code that accepts both
534     * ACPI_OPERAND_OBJECTs and ACPI_NAMESPACE_NODEs. The structures share
535     * a common DescriptorType field in order to differentiate them.
536     */
537    ACPI_NAMESPACE_NODE                 Node;
538
539} ACPI_OPERAND_OBJECT;
540
541
542/******************************************************************************
543 *
544 * ACPI_DESCRIPTOR - objects that share a common descriptor identifier
545 *
546 *****************************************************************************/
547
548/* Object descriptor types */
549
550#define ACPI_DESC_TYPE_CACHED           0x01        /* Used only when object is cached */
551#define ACPI_DESC_TYPE_STATE            0x02
552#define ACPI_DESC_TYPE_STATE_UPDATE     0x03
553#define ACPI_DESC_TYPE_STATE_PACKAGE    0x04
554#define ACPI_DESC_TYPE_STATE_CONTROL    0x05
555#define ACPI_DESC_TYPE_STATE_RPSCOPE    0x06
556#define ACPI_DESC_TYPE_STATE_PSCOPE     0x07
557#define ACPI_DESC_TYPE_STATE_WSCOPE     0x08
558#define ACPI_DESC_TYPE_STATE_RESULT     0x09
559#define ACPI_DESC_TYPE_STATE_NOTIFY     0x0A
560#define ACPI_DESC_TYPE_STATE_THREAD     0x0B
561#define ACPI_DESC_TYPE_WALK             0x0C
562#define ACPI_DESC_TYPE_PARSER           0x0D
563#define ACPI_DESC_TYPE_OPERAND          0x0E
564#define ACPI_DESC_TYPE_NAMED            0x0F
565#define ACPI_DESC_TYPE_MAX              0x0F
566
567
568typedef struct acpi_common_descriptor
569{
570    void                            *CommonPointer;
571    UINT8                           DescriptorType; /* To differentiate various internal objs */
572
573} ACPI_COMMON_DESCRIPTOR;
574
575typedef union acpi_descriptor
576{
577    ACPI_COMMON_DESCRIPTOR          Common;
578    ACPI_OPERAND_OBJECT             Object;
579    ACPI_NAMESPACE_NODE             Node;
580    ACPI_PARSE_OBJECT               Op;
581
582} ACPI_DESCRIPTOR;
583
584#pragma pack()
585
586#endif /* _ACOBJECT_H */
587