acobject.h revision 238381
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 initialized 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
127 * pointer 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       *NotifyList[2];     /* Handlers for system/device notifies */\
250    union acpi_operand_object       *Handler;           /* Handler for Address space */
251
252
253typedef struct acpi_object_notify_common    /* COMMON NOTIFY for POWER, PROCESSOR, DEVICE, and THERMAL */
254{
255    ACPI_OBJECT_COMMON_HEADER
256    ACPI_COMMON_NOTIFY_INFO
257
258} ACPI_OBJECT_NOTIFY_COMMON;
259
260
261typedef struct acpi_object_device
262{
263    ACPI_OBJECT_COMMON_HEADER
264    ACPI_COMMON_NOTIFY_INFO
265    ACPI_GPE_BLOCK_INFO             *GpeBlock;
266
267} ACPI_OBJECT_DEVICE;
268
269
270typedef struct acpi_object_power_resource
271{
272    ACPI_OBJECT_COMMON_HEADER
273    ACPI_COMMON_NOTIFY_INFO
274    UINT32                          SystemLevel;
275    UINT32                          ResourceOrder;
276
277} ACPI_OBJECT_POWER_RESOURCE;
278
279
280typedef struct acpi_object_processor
281{
282    ACPI_OBJECT_COMMON_HEADER
283
284    /* The next two fields take advantage of the 3-byte space before NOTIFY_INFO */
285
286    UINT8                           ProcId;
287    UINT8                           Length;
288    ACPI_COMMON_NOTIFY_INFO
289    ACPI_IO_ADDRESS                 Address;
290
291} ACPI_OBJECT_PROCESSOR;
292
293
294typedef struct acpi_object_thermal_zone
295{
296    ACPI_OBJECT_COMMON_HEADER
297    ACPI_COMMON_NOTIFY_INFO
298
299} ACPI_OBJECT_THERMAL_ZONE;
300
301
302/******************************************************************************
303 *
304 * Fields.  All share a common header/info field.
305 *
306 *****************************************************************************/
307
308/*
309 * Common bitfield for the field objects
310 * "Field Datum"  -- a datum from the actual field object
311 * "Buffer Datum" -- a datum from a user buffer, read from or to be written to the field
312 */
313#define ACPI_COMMON_FIELD_INFO \
314    UINT8                           FieldFlags;         /* Access, update, and lock bits */\
315    UINT8                           Attribute;          /* From AccessAs keyword */\
316    UINT8                           AccessByteWidth;    /* Read/Write size in bytes */\
317    ACPI_NAMESPACE_NODE             *Node;              /* Link back to parent node */\
318    UINT32                          BitLength;          /* Length of field in bits */\
319    UINT32                          BaseByteOffset;     /* Byte offset within containing object */\
320    UINT32                          Value;              /* Value to store into the Bank or Index register */\
321    UINT8                           StartFieldBitOffset;/* Bit offset within first field datum (0-63) */\
322    UINT8                           AccessLength;       /* For serial regions/fields */
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    UINT16                          ResourceLength;
339    union acpi_operand_object       *RegionObj;         /* Containing OpRegion object */
340    UINT8                           *ResourceBuffer;    /* ResourceTemplate for serial regions/fields */
341
342} ACPI_OBJECT_REGION_FIELD;
343
344
345typedef struct acpi_object_bank_field
346{
347    ACPI_OBJECT_COMMON_HEADER
348    ACPI_COMMON_FIELD_INFO
349    union acpi_operand_object       *RegionObj;         /* Containing OpRegion object */
350    union acpi_operand_object       *BankObj;           /* BankSelect Register object */
351
352} ACPI_OBJECT_BANK_FIELD;
353
354
355typedef struct acpi_object_index_field
356{
357    ACPI_OBJECT_COMMON_HEADER
358    ACPI_COMMON_FIELD_INFO
359
360    /*
361     * No "RegionObj" pointer needed since the Index and Data registers
362     * are each field definitions unto themselves.
363     */
364    union acpi_operand_object       *IndexObj;          /* Index register */
365    union acpi_operand_object       *DataObj;           /* Data register */
366
367} ACPI_OBJECT_INDEX_FIELD;
368
369
370/* The BufferField is different in that it is part of a Buffer, not an OpRegion */
371
372typedef struct acpi_object_buffer_field
373{
374    ACPI_OBJECT_COMMON_HEADER
375    ACPI_COMMON_FIELD_INFO
376    union acpi_operand_object       *BufferObj;         /* Containing Buffer object */
377
378} ACPI_OBJECT_BUFFER_FIELD;
379
380
381/******************************************************************************
382 *
383 * Objects for handlers
384 *
385 *****************************************************************************/
386
387typedef struct acpi_object_notify_handler
388{
389    ACPI_OBJECT_COMMON_HEADER
390    ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
391    UINT32                          HandlerType;        /* Type: Device/System/Both */
392    ACPI_NOTIFY_HANDLER             Handler;            /* Handler address */
393    void                            *Context;
394    union acpi_operand_object       *Next[2];           /* Device and System handler lists */
395
396} ACPI_OBJECT_NOTIFY_HANDLER;
397
398
399typedef struct acpi_object_addr_handler
400{
401    ACPI_OBJECT_COMMON_HEADER
402    UINT8                           SpaceId;
403    UINT8                           HandlerFlags;
404    ACPI_ADR_SPACE_HANDLER          Handler;
405    ACPI_NAMESPACE_NODE             *Node;              /* Parent device */
406    void                            *Context;
407    ACPI_ADR_SPACE_SETUP            Setup;
408    union acpi_operand_object       *RegionList;        /* Regions using this handler */
409    union acpi_operand_object       *Next;
410
411} ACPI_OBJECT_ADDR_HANDLER;
412
413/* Flags for address handler (HandlerFlags) */
414
415#define ACPI_ADDR_HANDLER_DEFAULT_INSTALLED  0x01
416
417
418/******************************************************************************
419 *
420 * Special internal objects
421 *
422 *****************************************************************************/
423
424/*
425 * The Reference object is used for these opcodes:
426 * Arg[0-6], Local[0-7], IndexOp, NameOp, RefOfOp, LoadOp, LoadTableOp, DebugOp
427 * The Reference.Class differentiates these types.
428 */
429typedef struct acpi_object_reference
430{
431    ACPI_OBJECT_COMMON_HEADER
432     UINT8                           Class;              /* Reference Class */
433     UINT8                           TargetType;         /* Used for Index Op */
434     UINT8                           Reserved;
435     void                            *Object;            /* NameOp=>HANDLE to obj, IndexOp=>ACPI_OPERAND_OBJECT */
436     ACPI_NAMESPACE_NODE             *Node;              /* RefOf or Namepath */
437     union acpi_operand_object       **Where;            /* Target of Index */
438     UINT32                          Value;              /* Used for Local/Arg/Index/DdbHandle */
439
440} ACPI_OBJECT_REFERENCE;
441
442/* Values for Reference.Class above */
443
444typedef enum
445{
446    ACPI_REFCLASS_LOCAL             = 0,        /* Method local */
447    ACPI_REFCLASS_ARG               = 1,        /* Method argument */
448    ACPI_REFCLASS_REFOF             = 2,        /* Result of RefOf() TBD: Split to Ref/Node and Ref/OperandObj? */
449    ACPI_REFCLASS_INDEX             = 3,        /* Result of Index() */
450    ACPI_REFCLASS_TABLE             = 4,        /* DdbHandle - Load(), LoadTable() */
451    ACPI_REFCLASS_NAME              = 5,        /* Reference to a named object */
452    ACPI_REFCLASS_DEBUG             = 6,        /* Debug object */
453
454    ACPI_REFCLASS_MAX               = 6
455
456} ACPI_REFERENCE_CLASSES;
457
458
459/*
460 * Extra object is used as additional storage for types that
461 * have AML code in their declarations (TermArgs) that must be
462 * evaluated at run time.
463 *
464 * Currently: Region and FieldUnit types
465 */
466typedef struct acpi_object_extra
467{
468    ACPI_OBJECT_COMMON_HEADER
469    ACPI_NAMESPACE_NODE             *Method_REG;        /* _REG method for this region (if any) */
470    ACPI_NAMESPACE_NODE             *ScopeNode;
471    void                            *RegionContext;     /* Region-specific data */
472    UINT8                           *AmlStart;
473    UINT32                          AmlLength;
474
475} ACPI_OBJECT_EXTRA;
476
477
478/* Additional data that can be attached to namespace nodes */
479
480typedef struct acpi_object_data
481{
482    ACPI_OBJECT_COMMON_HEADER
483    ACPI_OBJECT_HANDLER             Handler;
484    void                            *Pointer;
485
486} ACPI_OBJECT_DATA;
487
488
489/* Structure used when objects are cached for reuse */
490
491typedef struct acpi_object_cache_list
492{
493    ACPI_OBJECT_COMMON_HEADER
494    union acpi_operand_object       *Next;              /* Link for object cache and internal lists*/
495
496} ACPI_OBJECT_CACHE_LIST;
497
498
499/******************************************************************************
500 *
501 * ACPI_OPERAND_OBJECT Descriptor - a giant union of all of the above
502 *
503 *****************************************************************************/
504
505typedef union acpi_operand_object
506{
507    ACPI_OBJECT_COMMON                  Common;
508    ACPI_OBJECT_INTEGER                 Integer;
509    ACPI_OBJECT_STRING                  String;
510    ACPI_OBJECT_BUFFER                  Buffer;
511    ACPI_OBJECT_PACKAGE                 Package;
512    ACPI_OBJECT_EVENT                   Event;
513    ACPI_OBJECT_METHOD                  Method;
514    ACPI_OBJECT_MUTEX                   Mutex;
515    ACPI_OBJECT_REGION                  Region;
516    ACPI_OBJECT_NOTIFY_COMMON           CommonNotify;
517    ACPI_OBJECT_DEVICE                  Device;
518    ACPI_OBJECT_POWER_RESOURCE          PowerResource;
519    ACPI_OBJECT_PROCESSOR               Processor;
520    ACPI_OBJECT_THERMAL_ZONE            ThermalZone;
521    ACPI_OBJECT_FIELD_COMMON            CommonField;
522    ACPI_OBJECT_REGION_FIELD            Field;
523    ACPI_OBJECT_BUFFER_FIELD            BufferField;
524    ACPI_OBJECT_BANK_FIELD              BankField;
525    ACPI_OBJECT_INDEX_FIELD             IndexField;
526    ACPI_OBJECT_NOTIFY_HANDLER          Notify;
527    ACPI_OBJECT_ADDR_HANDLER            AddressSpace;
528    ACPI_OBJECT_REFERENCE               Reference;
529    ACPI_OBJECT_EXTRA                   Extra;
530    ACPI_OBJECT_DATA                    Data;
531    ACPI_OBJECT_CACHE_LIST              Cache;
532
533    /*
534     * Add namespace node to union in order to simplify code that accepts both
535     * ACPI_OPERAND_OBJECTs and ACPI_NAMESPACE_NODEs. The structures share
536     * a common DescriptorType field in order to differentiate them.
537     */
538    ACPI_NAMESPACE_NODE                 Node;
539
540} ACPI_OPERAND_OBJECT;
541
542
543/******************************************************************************
544 *
545 * ACPI_DESCRIPTOR - objects that share a common descriptor identifier
546 *
547 *****************************************************************************/
548
549/* Object descriptor types */
550
551#define ACPI_DESC_TYPE_CACHED           0x01        /* Used only when object is cached */
552#define ACPI_DESC_TYPE_STATE            0x02
553#define ACPI_DESC_TYPE_STATE_UPDATE     0x03
554#define ACPI_DESC_TYPE_STATE_PACKAGE    0x04
555#define ACPI_DESC_TYPE_STATE_CONTROL    0x05
556#define ACPI_DESC_TYPE_STATE_RPSCOPE    0x06
557#define ACPI_DESC_TYPE_STATE_PSCOPE     0x07
558#define ACPI_DESC_TYPE_STATE_WSCOPE     0x08
559#define ACPI_DESC_TYPE_STATE_RESULT     0x09
560#define ACPI_DESC_TYPE_STATE_NOTIFY     0x0A
561#define ACPI_DESC_TYPE_STATE_THREAD     0x0B
562#define ACPI_DESC_TYPE_WALK             0x0C
563#define ACPI_DESC_TYPE_PARSER           0x0D
564#define ACPI_DESC_TYPE_OPERAND          0x0E
565#define ACPI_DESC_TYPE_NAMED            0x0F
566#define ACPI_DESC_TYPE_MAX              0x0F
567
568
569typedef struct acpi_common_descriptor
570{
571    void                            *CommonPointer;
572    UINT8                           DescriptorType; /* To differentiate various internal objs */
573
574} ACPI_COMMON_DESCRIPTOR;
575
576typedef union acpi_descriptor
577{
578    ACPI_COMMON_DESCRIPTOR          Common;
579    ACPI_OPERAND_OBJECT             Object;
580    ACPI_NAMESPACE_NODE             Node;
581    ACPI_PARSE_OBJECT               Op;
582
583} ACPI_DESCRIPTOR;
584
585#pragma pack()
586
587#endif /* _ACOBJECT_H */
588