acobject.h revision 217365
1
2/******************************************************************************
3 *
4 * Name: acobject.h - Definition of ACPI_OPERAND_OBJECT  (Internal object only)
5 *
6 *****************************************************************************/
7
8/*
9 * Copyright (C) 2000 - 2011, 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
324
325typedef struct acpi_object_field_common                 /* COMMON FIELD (for BUFFER, REGION, BANK, and INDEX fields) */
326{
327    ACPI_OBJECT_COMMON_HEADER
328    ACPI_COMMON_FIELD_INFO
329    union acpi_operand_object       *RegionObj;         /* Parent Operation Region object (REGION/BANK fields only) */
330
331} ACPI_OBJECT_FIELD_COMMON;
332
333
334typedef struct acpi_object_region_field
335{
336    ACPI_OBJECT_COMMON_HEADER
337    ACPI_COMMON_FIELD_INFO
338    union acpi_operand_object       *RegionObj;         /* Containing OpRegion object */
339
340} ACPI_OBJECT_REGION_FIELD;
341
342
343typedef struct acpi_object_bank_field
344{
345    ACPI_OBJECT_COMMON_HEADER
346    ACPI_COMMON_FIELD_INFO
347    union acpi_operand_object       *RegionObj;         /* Containing OpRegion object */
348    union acpi_operand_object       *BankObj;           /* BankSelect Register object */
349
350} ACPI_OBJECT_BANK_FIELD;
351
352
353typedef struct acpi_object_index_field
354{
355    ACPI_OBJECT_COMMON_HEADER
356    ACPI_COMMON_FIELD_INFO
357
358    /*
359     * No "RegionObj" pointer needed since the Index and Data registers
360     * are each field definitions unto themselves.
361     */
362    union acpi_operand_object       *IndexObj;          /* Index register */
363    union acpi_operand_object       *DataObj;           /* Data register */
364
365} ACPI_OBJECT_INDEX_FIELD;
366
367
368/* The BufferField is different in that it is part of a Buffer, not an OpRegion */
369
370typedef struct acpi_object_buffer_field
371{
372    ACPI_OBJECT_COMMON_HEADER
373    ACPI_COMMON_FIELD_INFO
374    union acpi_operand_object       *BufferObj;         /* Containing Buffer object */
375
376} ACPI_OBJECT_BUFFER_FIELD;
377
378
379/******************************************************************************
380 *
381 * Objects for handlers
382 *
383 *****************************************************************************/
384
385typedef struct acpi_object_notify_handler
386{
387    ACPI_OBJECT_COMMON_HEADER
388    ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
389    ACPI_NOTIFY_HANDLER             Handler;
390    void                            *Context;
391
392} ACPI_OBJECT_NOTIFY_HANDLER;
393
394
395typedef struct acpi_object_addr_handler
396{
397    ACPI_OBJECT_COMMON_HEADER
398    UINT8                           SpaceId;
399    UINT8                           HandlerFlags;
400    ACPI_ADR_SPACE_HANDLER          Handler;
401    ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
402    void                            *Context;
403    ACPI_ADR_SPACE_SETUP            Setup;
404    union acpi_operand_object       *RegionList;        /* regions using this handler */
405    union acpi_operand_object       *Next;
406
407} ACPI_OBJECT_ADDR_HANDLER;
408
409/* Flags for address handler (HandlerFlags) */
410
411#define ACPI_ADDR_HANDLER_DEFAULT_INSTALLED  0x01
412
413
414/******************************************************************************
415 *
416 * Special internal objects
417 *
418 *****************************************************************************/
419
420/*
421 * The Reference object is used for these opcodes:
422 * Arg[0-6], Local[0-7], IndexOp, NameOp, RefOfOp, LoadOp, LoadTableOp, DebugOp
423 * The Reference.Class differentiates these types.
424 */
425typedef struct acpi_object_reference
426{
427    ACPI_OBJECT_COMMON_HEADER
428     UINT8                           Class;              /* Reference Class */
429     UINT8                           TargetType;         /* Used for Index Op */
430     UINT8                           Reserved;
431     void                            *Object;            /* NameOp=>HANDLE to obj, IndexOp=>ACPI_OPERAND_OBJECT */
432     ACPI_NAMESPACE_NODE             *Node;              /* RefOf or Namepath */
433     union acpi_operand_object       **Where;            /* Target of Index */
434     UINT32                          Value;              /* Used for Local/Arg/Index/DdbHandle */
435
436} ACPI_OBJECT_REFERENCE;
437
438/* Values for Reference.Class above */
439
440typedef enum
441{
442    ACPI_REFCLASS_LOCAL             = 0,        /* Method local */
443    ACPI_REFCLASS_ARG               = 1,        /* Method argument */
444    ACPI_REFCLASS_REFOF             = 2,        /* Result of RefOf() TBD: Split to Ref/Node and Ref/OperandObj? */
445    ACPI_REFCLASS_INDEX             = 3,        /* Result of Index() */
446    ACPI_REFCLASS_TABLE             = 4,        /* DdbHandle - Load(), LoadTable() */
447    ACPI_REFCLASS_NAME              = 5,        /* Reference to a named object */
448    ACPI_REFCLASS_DEBUG             = 6,        /* Debug object */
449
450    ACPI_REFCLASS_MAX               = 6
451
452} ACPI_REFERENCE_CLASSES;
453
454
455/*
456 * Extra object is used as additional storage for types that
457 * have AML code in their declarations (TermArgs) that must be
458 * evaluated at run time.
459 *
460 * Currently: Region and FieldUnit types
461 */
462typedef struct acpi_object_extra
463{
464    ACPI_OBJECT_COMMON_HEADER
465    ACPI_NAMESPACE_NODE             *Method_REG;        /* _REG method for this region (if any) */
466    void                            *RegionContext;     /* Region-specific data */
467    UINT8                           *AmlStart;
468    UINT32                          AmlLength;
469
470} ACPI_OBJECT_EXTRA;
471
472
473/* Additional data that can be attached to namespace nodes */
474
475typedef struct acpi_object_data
476{
477    ACPI_OBJECT_COMMON_HEADER
478    ACPI_OBJECT_HANDLER             Handler;
479    void                            *Pointer;
480
481} ACPI_OBJECT_DATA;
482
483
484/* Structure used when objects are cached for reuse */
485
486typedef struct acpi_object_cache_list
487{
488    ACPI_OBJECT_COMMON_HEADER
489    union acpi_operand_object       *Next;              /* Link for object cache and internal lists*/
490
491} ACPI_OBJECT_CACHE_LIST;
492
493
494/******************************************************************************
495 *
496 * ACPI_OPERAND_OBJECT Descriptor - a giant union of all of the above
497 *
498 *****************************************************************************/
499
500typedef union acpi_operand_object
501{
502    ACPI_OBJECT_COMMON                  Common;
503    ACPI_OBJECT_INTEGER                 Integer;
504    ACPI_OBJECT_STRING                  String;
505    ACPI_OBJECT_BUFFER                  Buffer;
506    ACPI_OBJECT_PACKAGE                 Package;
507    ACPI_OBJECT_EVENT                   Event;
508    ACPI_OBJECT_METHOD                  Method;
509    ACPI_OBJECT_MUTEX                   Mutex;
510    ACPI_OBJECT_REGION                  Region;
511    ACPI_OBJECT_NOTIFY_COMMON           CommonNotify;
512    ACPI_OBJECT_DEVICE                  Device;
513    ACPI_OBJECT_POWER_RESOURCE          PowerResource;
514    ACPI_OBJECT_PROCESSOR               Processor;
515    ACPI_OBJECT_THERMAL_ZONE            ThermalZone;
516    ACPI_OBJECT_FIELD_COMMON            CommonField;
517    ACPI_OBJECT_REGION_FIELD            Field;
518    ACPI_OBJECT_BUFFER_FIELD            BufferField;
519    ACPI_OBJECT_BANK_FIELD              BankField;
520    ACPI_OBJECT_INDEX_FIELD             IndexField;
521    ACPI_OBJECT_NOTIFY_HANDLER          Notify;
522    ACPI_OBJECT_ADDR_HANDLER            AddressSpace;
523    ACPI_OBJECT_REFERENCE               Reference;
524    ACPI_OBJECT_EXTRA                   Extra;
525    ACPI_OBJECT_DATA                    Data;
526    ACPI_OBJECT_CACHE_LIST              Cache;
527
528    /*
529     * Add namespace node to union in order to simplify code that accepts both
530     * ACPI_OPERAND_OBJECTs and ACPI_NAMESPACE_NODEs. The structures share
531     * a common DescriptorType field in order to differentiate them.
532     */
533    ACPI_NAMESPACE_NODE                 Node;
534
535} ACPI_OPERAND_OBJECT;
536
537
538/******************************************************************************
539 *
540 * ACPI_DESCRIPTOR - objects that share a common descriptor identifier
541 *
542 *****************************************************************************/
543
544/* Object descriptor types */
545
546#define ACPI_DESC_TYPE_CACHED           0x01        /* Used only when object is cached */
547#define ACPI_DESC_TYPE_STATE            0x02
548#define ACPI_DESC_TYPE_STATE_UPDATE     0x03
549#define ACPI_DESC_TYPE_STATE_PACKAGE    0x04
550#define ACPI_DESC_TYPE_STATE_CONTROL    0x05
551#define ACPI_DESC_TYPE_STATE_RPSCOPE    0x06
552#define ACPI_DESC_TYPE_STATE_PSCOPE     0x07
553#define ACPI_DESC_TYPE_STATE_WSCOPE     0x08
554#define ACPI_DESC_TYPE_STATE_RESULT     0x09
555#define ACPI_DESC_TYPE_STATE_NOTIFY     0x0A
556#define ACPI_DESC_TYPE_STATE_THREAD     0x0B
557#define ACPI_DESC_TYPE_WALK             0x0C
558#define ACPI_DESC_TYPE_PARSER           0x0D
559#define ACPI_DESC_TYPE_OPERAND          0x0E
560#define ACPI_DESC_TYPE_NAMED            0x0F
561#define ACPI_DESC_TYPE_MAX              0x0F
562
563
564typedef struct acpi_common_descriptor
565{
566    void                            *CommonPointer;
567    UINT8                           DescriptorType; /* To differentiate various internal objs */
568
569} ACPI_COMMON_DESCRIPTOR;
570
571typedef union acpi_descriptor
572{
573    ACPI_COMMON_DESCRIPTOR          Common;
574    ACPI_OPERAND_OBJECT             Object;
575    ACPI_NAMESPACE_NODE             Node;
576    ACPI_PARSE_OBJECT               Op;
577
578} ACPI_DESCRIPTOR;
579
580#pragma pack()
581
582#endif /* _ACOBJECT_H */
583