xref: /illumos-gate/usr/src/uts/intel/sys/acpi/amlresrc.h (revision e8d80663e4f91871f843bb8ad9108dc0b76dfcf3)
1 
2 /******************************************************************************
3  *
4  * Module Name: amlresrc.h - AML resource descriptors
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 /* acpisrc:StructDefs -- for acpisrc conversion */
46 
47 #ifndef __AMLRESRC_H
48 #define __AMLRESRC_H
49 
50 
51 /*
52  * Resource descriptor tags, as defined in the ACPI specification.
53  * Used to symbolically reference fields within a descriptor.
54  */
55 #define ACPI_RESTAG_ADDRESS                     "_ADR"
56 #define ACPI_RESTAG_ALIGNMENT                   "_ALN"
57 #define ACPI_RESTAG_ADDRESSSPACE                "_ASI"
58 #define ACPI_RESTAG_ACCESSSIZE                  "_ASZ"
59 #define ACPI_RESTAG_TYPESPECIFICATTRIBUTES      "_ATT"
60 #define ACPI_RESTAG_BASEADDRESS                 "_BAS"
61 #define ACPI_RESTAG_BUSMASTER                   "_BM_"  /* Master(1), Slave(0) */
62 #define ACPI_RESTAG_DECODE                      "_DEC"
63 #define ACPI_RESTAG_DMA                         "_DMA"
64 #define ACPI_RESTAG_DMATYPE                     "_TYP"  /* Compatible(0), A(1), B(2), F(3) */
65 #define ACPI_RESTAG_GRANULARITY                 "_GRA"
66 #define ACPI_RESTAG_INTERRUPT                   "_INT"
67 #define ACPI_RESTAG_INTERRUPTLEVEL              "_LL_"  /* ActiveLo(1), ActiveHi(0) */
68 #define ACPI_RESTAG_INTERRUPTSHARE              "_SHR"  /* Shareable(1), NoShare(0) */
69 #define ACPI_RESTAG_INTERRUPTTYPE               "_HE_"  /* Edge(1), Level(0) */
70 #define ACPI_RESTAG_LENGTH                      "_LEN"
71 #define ACPI_RESTAG_MEMATTRIBUTES               "_MTP"  /* Memory(0), Reserved(1), ACPI(2), NVS(3) */
72 #define ACPI_RESTAG_MEMTYPE                     "_MEM"  /* NonCache(0), Cacheable(1) Cache+combine(2), Cache+prefetch(3) */
73 #define ACPI_RESTAG_MAXADDR                     "_MAX"
74 #define ACPI_RESTAG_MINADDR                     "_MIN"
75 #define ACPI_RESTAG_MAXTYPE                     "_MAF"
76 #define ACPI_RESTAG_MINTYPE                     "_MIF"
77 #define ACPI_RESTAG_REGISTERBITOFFSET           "_RBO"
78 #define ACPI_RESTAG_REGISTERBITWIDTH            "_RBW"
79 #define ACPI_RESTAG_RANGETYPE                   "_RNG"
80 #define ACPI_RESTAG_READWRITETYPE               "_RW_"  /* ReadOnly(0), Writeable (1) */
81 #define ACPI_RESTAG_TRANSLATION                 "_TRA"
82 #define ACPI_RESTAG_TRANSTYPE                   "_TRS"  /* Sparse(1), Dense(0) */
83 #define ACPI_RESTAG_TYPE                        "_TTP"  /* Translation(1), Static (0) */
84 #define ACPI_RESTAG_XFERTYPE                    "_SIZ"  /* 8(0), 8And16(1), 16(2) */
85 
86 
87 /* Default sizes for "small" resource descriptors */
88 
89 #define ASL_RDESC_IRQ_SIZE                      0x02
90 #define ASL_RDESC_DMA_SIZE                      0x02
91 #define ASL_RDESC_ST_DEPEND_SIZE                0x00
92 #define ASL_RDESC_END_DEPEND_SIZE               0x00
93 #define ASL_RDESC_IO_SIZE                       0x07
94 #define ASL_RDESC_FIXED_IO_SIZE                 0x03
95 #define ASL_RDESC_END_TAG_SIZE                  0x01
96 
97 
98 typedef struct asl_resource_node
99 {
100     UINT32                          BufferLength;
101     void                            *Buffer;
102     struct asl_resource_node        *Next;
103 
104 } ASL_RESOURCE_NODE;
105 
106 
107 /* Macros used to generate AML resource length fields */
108 
109 #define ACPI_AML_SIZE_LARGE(r)      (sizeof (r) - sizeof (AML_RESOURCE_LARGE_HEADER))
110 #define ACPI_AML_SIZE_SMALL(r)      (sizeof (r) - sizeof (AML_RESOURCE_SMALL_HEADER))
111 
112 /*
113  * Resource descriptors defined in the ACPI specification.
114  *
115  * Packing/alignment must be BYTE because these descriptors
116  * are used to overlay the raw AML byte stream.
117  */
118 #pragma pack(1)
119 
120 /*
121  * SMALL descriptors
122  */
123 #define AML_RESOURCE_SMALL_HEADER_COMMON \
124     UINT8                           DescriptorType;
125 
126 typedef struct aml_resource_small_header
127 {
128     AML_RESOURCE_SMALL_HEADER_COMMON
129 
130 } AML_RESOURCE_SMALL_HEADER;
131 
132 
133 typedef struct aml_resource_irq
134 {
135     AML_RESOURCE_SMALL_HEADER_COMMON
136     UINT16                          IrqMask;
137     UINT8                           Flags;
138 
139 } AML_RESOURCE_IRQ;
140 
141 
142 typedef struct aml_resource_irq_noflags
143 {
144     AML_RESOURCE_SMALL_HEADER_COMMON
145     UINT16                          IrqMask;
146 
147 } AML_RESOURCE_IRQ_NOFLAGS;
148 
149 
150 typedef struct aml_resource_dma
151 {
152     AML_RESOURCE_SMALL_HEADER_COMMON
153     UINT8                           DmaChannelMask;
154     UINT8                           Flags;
155 
156 } AML_RESOURCE_DMA;
157 
158 
159 typedef struct aml_resource_start_dependent
160 {
161     AML_RESOURCE_SMALL_HEADER_COMMON
162     UINT8                           Flags;
163 
164 } AML_RESOURCE_START_DEPENDENT;
165 
166 
167 typedef struct aml_resource_start_dependent_noprio
168 {
169     AML_RESOURCE_SMALL_HEADER_COMMON
170 
171 } AML_RESOURCE_START_DEPENDENT_NOPRIO;
172 
173 
174 typedef struct aml_resource_end_dependent
175 {
176     AML_RESOURCE_SMALL_HEADER_COMMON
177 
178 } AML_RESOURCE_END_DEPENDENT;
179 
180 
181 typedef struct aml_resource_io
182 {
183     AML_RESOURCE_SMALL_HEADER_COMMON
184     UINT8                           Flags;
185     UINT16                          Minimum;
186     UINT16                          Maximum;
187     UINT8                           Alignment;
188     UINT8                           AddressLength;
189 
190 } AML_RESOURCE_IO;
191 
192 
193 typedef struct aml_resource_fixed_io
194 {
195     AML_RESOURCE_SMALL_HEADER_COMMON
196     UINT16                          Address;
197     UINT8                           AddressLength;
198 
199 } AML_RESOURCE_FIXED_IO;
200 
201 
202 typedef struct aml_resource_vendor_small
203 {
204     AML_RESOURCE_SMALL_HEADER_COMMON
205 
206 } AML_RESOURCE_VENDOR_SMALL;
207 
208 
209 typedef struct aml_resource_end_tag
210 {
211     AML_RESOURCE_SMALL_HEADER_COMMON
212     UINT8                           Checksum;
213 
214 } AML_RESOURCE_END_TAG;
215 
216 
217 /*
218  * LARGE descriptors
219  */
220 #define AML_RESOURCE_LARGE_HEADER_COMMON \
221     UINT8                           DescriptorType;\
222     UINT16                          ResourceLength;
223 
224 typedef struct aml_resource_large_header
225 {
226     AML_RESOURCE_LARGE_HEADER_COMMON
227 
228 } AML_RESOURCE_LARGE_HEADER;
229 
230 
231 /* General Flags for address space resource descriptors */
232 
233 #define ACPI_RESOURCE_FLAG_DEC      2
234 #define ACPI_RESOURCE_FLAG_MIF      4
235 #define ACPI_RESOURCE_FLAG_MAF      8
236 
237 typedef struct aml_resource_memory24
238 {
239     AML_RESOURCE_LARGE_HEADER_COMMON
240     UINT8                           Flags;
241     UINT16                          Minimum;
242     UINT16                          Maximum;
243     UINT16                          Alignment;
244     UINT16                          AddressLength;
245 
246 } AML_RESOURCE_MEMORY24;
247 
248 
249 typedef struct aml_resource_vendor_large
250 {
251     AML_RESOURCE_LARGE_HEADER_COMMON
252 
253 } AML_RESOURCE_VENDOR_LARGE;
254 
255 
256 typedef struct aml_resource_memory32
257 {
258     AML_RESOURCE_LARGE_HEADER_COMMON
259     UINT8                           Flags;
260     UINT32                          Minimum;
261     UINT32                          Maximum;
262     UINT32                          Alignment;
263     UINT32                          AddressLength;
264 
265 } AML_RESOURCE_MEMORY32;
266 
267 
268 typedef struct aml_resource_fixed_memory32
269 {
270     AML_RESOURCE_LARGE_HEADER_COMMON
271     UINT8                           Flags;
272     UINT32                          Address;
273     UINT32                          AddressLength;
274 
275 } AML_RESOURCE_FIXED_MEMORY32;
276 
277 
278 #define AML_RESOURCE_ADDRESS_COMMON \
279     UINT8                           ResourceType; \
280     UINT8                           Flags; \
281     UINT8                           SpecificFlags;
282 
283 
284 typedef struct aml_resource_address
285 {
286     AML_RESOURCE_LARGE_HEADER_COMMON
287     AML_RESOURCE_ADDRESS_COMMON
288 
289 } AML_RESOURCE_ADDRESS;
290 
291 
292 typedef struct aml_resource_extended_address64
293 {
294     AML_RESOURCE_LARGE_HEADER_COMMON
295     AML_RESOURCE_ADDRESS_COMMON
296     UINT8                           RevisionID;
297     UINT8                           Reserved;
298     UINT64                          Granularity;
299     UINT64                          Minimum;
300     UINT64                          Maximum;
301     UINT64                          TranslationOffset;
302     UINT64                          AddressLength;
303     UINT64                          TypeSpecific;
304 
305 } AML_RESOURCE_EXTENDED_ADDRESS64;
306 
307 #define AML_RESOURCE_EXTENDED_ADDRESS_REVISION          1       /* ACPI 3.0 */
308 
309 
310 typedef struct aml_resource_address64
311 {
312     AML_RESOURCE_LARGE_HEADER_COMMON
313     AML_RESOURCE_ADDRESS_COMMON
314     UINT64                          Granularity;
315     UINT64                          Minimum;
316     UINT64                          Maximum;
317     UINT64                          TranslationOffset;
318     UINT64                          AddressLength;
319 
320 } AML_RESOURCE_ADDRESS64;
321 
322 
323 typedef struct aml_resource_address32
324 {
325     AML_RESOURCE_LARGE_HEADER_COMMON
326     AML_RESOURCE_ADDRESS_COMMON
327     UINT32                          Granularity;
328     UINT32                          Minimum;
329     UINT32                          Maximum;
330     UINT32                          TranslationOffset;
331     UINT32                          AddressLength;
332 
333 } AML_RESOURCE_ADDRESS32;
334 
335 
336 typedef struct aml_resource_address16
337 {
338     AML_RESOURCE_LARGE_HEADER_COMMON
339     AML_RESOURCE_ADDRESS_COMMON
340     UINT16                          Granularity;
341     UINT16                          Minimum;
342     UINT16                          Maximum;
343     UINT16                          TranslationOffset;
344     UINT16                          AddressLength;
345 
346 } AML_RESOURCE_ADDRESS16;
347 
348 
349 typedef struct aml_resource_extended_irq
350 {
351     AML_RESOURCE_LARGE_HEADER_COMMON
352     UINT8                           Flags;
353     UINT8                           InterruptCount;
354     UINT32                          Interrupts[1];
355     /* ResSourceIndex, ResSource optional fields follow */
356 
357 } AML_RESOURCE_EXTENDED_IRQ;
358 
359 
360 typedef struct aml_resource_generic_register
361 {
362     AML_RESOURCE_LARGE_HEADER_COMMON
363     UINT8                           AddressSpaceId;
364     UINT8                           BitWidth;
365     UINT8                           BitOffset;
366     UINT8                           AccessSize; /* ACPI 3.0, was previously Reserved */
367     UINT64                          Address;
368 
369 } AML_RESOURCE_GENERIC_REGISTER;
370 
371 /* restore default alignment */
372 
373 #pragma pack()
374 
375 /* Union of all resource descriptors, so we can allocate the worst case */
376 
377 typedef union aml_resource
378 {
379     /* Descriptor headers */
380 
381     UINT8                                   DescriptorType;
382     AML_RESOURCE_SMALL_HEADER               SmallHeader;
383     AML_RESOURCE_LARGE_HEADER               LargeHeader;
384 
385     /* Small resource descriptors */
386 
387     AML_RESOURCE_IRQ                        Irq;
388     AML_RESOURCE_DMA                        Dma;
389     AML_RESOURCE_START_DEPENDENT            StartDpf;
390     AML_RESOURCE_END_DEPENDENT              EndDpf;
391     AML_RESOURCE_IO                         Io;
392     AML_RESOURCE_FIXED_IO                   FixedIo;
393     AML_RESOURCE_VENDOR_SMALL               VendorSmall;
394     AML_RESOURCE_END_TAG                    EndTag;
395 
396     /* Large resource descriptors */
397 
398     AML_RESOURCE_MEMORY24                   Memory24;
399     AML_RESOURCE_GENERIC_REGISTER           GenericReg;
400     AML_RESOURCE_VENDOR_LARGE               VendorLarge;
401     AML_RESOURCE_MEMORY32                   Memory32;
402     AML_RESOURCE_FIXED_MEMORY32             FixedMemory32;
403     AML_RESOURCE_ADDRESS16                  Address16;
404     AML_RESOURCE_ADDRESS32                  Address32;
405     AML_RESOURCE_ADDRESS64                  Address64;
406     AML_RESOURCE_EXTENDED_ADDRESS64         ExtAddress64;
407     AML_RESOURCE_EXTENDED_IRQ               ExtendedIrq;
408 
409     /* Utility overlays */
410 
411     AML_RESOURCE_ADDRESS                    Address;
412     UINT32                                  DwordItem;
413     UINT16                                  WordItem;
414     UINT8                                   ByteItem;
415 
416 } AML_RESOURCE;
417 
418 #endif
419 
420