1 /******************************************************************************
3 * Module Name: aslrestype2e - Large Extended address resource descriptors
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2013, Intel Corp.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
45 #include <contrib/dev/acpica/compiler/aslcompiler.h>
47 #define _COMPONENT ACPI_COMPILER
48 ACPI_MODULE_NAME ("aslrestype2e")
51 * This module contains the Extended (64-bit) address space descriptors:
58 /*******************************************************************************
60 * FUNCTION: RsDoExtendedIoDescriptor
62 * PARAMETERS: Op - Parent resource descriptor parse node
63 * CurrentByteOffset - Offset into the resource template AML
64 * buffer (to track references to the desc)
66 * RETURN: Completed resource node
68 * DESCRIPTION: Construct a long "ExtendedIO" descriptor
70 ******************************************************************************/
73 RsDoExtendedIoDescriptor (
74 ACPI_PARSE_OBJECT *Op,
75 UINT32 CurrentByteOffset)
77 AML_RESOURCE *Descriptor;
78 ACPI_PARSE_OBJECT *InitializerOp;
79 ACPI_PARSE_OBJECT *MinOp = NULL;
80 ACPI_PARSE_OBJECT *MaxOp = NULL;
81 ACPI_PARSE_OBJECT *LengthOp = NULL;
82 ACPI_PARSE_OBJECT *GranOp = NULL;
83 ASL_RESOURCE_NODE *Rnode;
84 UINT16 StringLength = 0;
88 InitializerOp = Op->Asl.Child;
89 StringLength = RsGetStringDataLength (InitializerOp);
91 Rnode = RsAllocateResourceNode (
92 sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
94 Descriptor = Rnode->Buffer;
95 Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
96 Descriptor->ExtAddress64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE;
97 Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
99 Descriptor->ExtAddress64.ResourceLength = (UINT16)
100 (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
101 sizeof (AML_RESOURCE_LARGE_HEADER));
103 /* Process all child initialization nodes */
105 for (i = 0; InitializerOp; i++)
109 case 0: /* Resource Usage */
111 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
114 case 1: /* MinType */
116 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
117 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
118 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
121 case 2: /* MaxType */
123 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
124 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
125 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
128 case 3: /* DecodeType */
130 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
131 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
132 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
135 case 4: /* Range Type */
137 RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 3);
138 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
139 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0, 2);
142 case 5: /* Address Granularity */
144 Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
145 RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
146 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
147 GranOp = InitializerOp;
150 case 6: /* Address Min */
152 Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
153 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
154 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
155 MinOp = InitializerOp;
158 case 7: /* Address Max */
160 Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
161 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
162 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
163 MaxOp = InitializerOp;
166 case 8: /* Translation Offset */
168 Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
169 RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
170 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
173 case 9: /* Address Length */
175 Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
176 RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
177 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
178 LengthOp = InitializerOp;
181 case 10: /* Type-Specific Attributes */
183 Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
184 RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
185 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
188 case 11: /* ResourceTag */
190 UtAttachNamepathToOwner (Op, InitializerOp);
195 RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 4, 0);
196 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
197 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 4);
200 case 13: /* Translation Type */
202 RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0);
203 RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
204 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5);
209 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
213 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
216 /* Validate the Min/Max/Len/Gran values */
218 RsLargeAddressCheck (
219 Descriptor->ExtAddress64.Minimum,
220 Descriptor->ExtAddress64.Maximum,
221 Descriptor->ExtAddress64.AddressLength,
222 Descriptor->ExtAddress64.Granularity,
223 Descriptor->ExtAddress64.Flags,
224 MinOp, MaxOp, LengthOp, GranOp, Op);
226 Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
231 /*******************************************************************************
233 * FUNCTION: RsDoExtendedMemoryDescriptor
235 * PARAMETERS: Op - Parent resource descriptor parse node
236 * CurrentByteOffset - Offset into the resource template AML
237 * buffer (to track references to the desc)
239 * RETURN: Completed resource node
241 * DESCRIPTION: Construct a long "ExtendedMemory" descriptor
243 ******************************************************************************/
246 RsDoExtendedMemoryDescriptor (
247 ACPI_PARSE_OBJECT *Op,
248 UINT32 CurrentByteOffset)
250 AML_RESOURCE *Descriptor;
251 ACPI_PARSE_OBJECT *InitializerOp;
252 ACPI_PARSE_OBJECT *MinOp = NULL;
253 ACPI_PARSE_OBJECT *MaxOp = NULL;
254 ACPI_PARSE_OBJECT *LengthOp = NULL;
255 ACPI_PARSE_OBJECT *GranOp = NULL;
256 ASL_RESOURCE_NODE *Rnode;
257 UINT16 StringLength = 0;
261 InitializerOp = Op->Asl.Child;
262 StringLength = RsGetStringDataLength (InitializerOp);
264 Rnode = RsAllocateResourceNode (
265 sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
267 Descriptor = Rnode->Buffer;
268 Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
269 Descriptor->ExtAddress64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
270 Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
272 Descriptor->ExtAddress64.ResourceLength = (UINT16)
273 (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
274 sizeof (AML_RESOURCE_LARGE_HEADER));
276 /* Process all child initialization nodes */
278 for (i = 0; InitializerOp; i++)
282 case 0: /* Resource Usage */
284 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
287 case 1: /* DecodeType */
289 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
290 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
291 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
294 case 2: /* MinType */
296 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
297 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
298 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
301 case 3: /* MaxType */
303 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
304 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
305 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
308 case 4: /* Memory Type */
310 RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 1, 0);
311 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
312 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 1, 2);
315 case 5: /* Read/Write Type */
317 RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 1);
318 RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
319 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0);
322 case 6: /* Address Granularity */
324 Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
325 RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
326 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
327 GranOp = InitializerOp;
330 case 7: /* Min Address */
332 Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
333 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
334 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
335 MinOp = InitializerOp;
338 case 8: /* Max Address */
340 Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
341 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
342 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
343 MaxOp = InitializerOp;
346 case 9: /* Translation Offset */
348 Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
349 RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
350 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
353 case 10: /* Address Length */
355 Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
356 RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
357 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
358 LengthOp = InitializerOp;
361 case 11: /* Type-Specific Attributes */
363 Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
364 RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
365 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
368 case 12: /* ResourceTag */
370 UtAttachNamepathToOwner (Op, InitializerOp);
374 case 13: /* Address Range */
376 RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 3, 0);
377 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
378 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 3, 2);
383 RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0);
384 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
385 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5);
390 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
394 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
397 /* Validate the Min/Max/Len/Gran values */
399 RsLargeAddressCheck (
400 Descriptor->ExtAddress64.Minimum,
401 Descriptor->ExtAddress64.Maximum,
402 Descriptor->ExtAddress64.AddressLength,
403 Descriptor->ExtAddress64.Granularity,
404 Descriptor->ExtAddress64.Flags,
405 MinOp, MaxOp, LengthOp, GranOp, Op);
407 Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
412 /*******************************************************************************
414 * FUNCTION: RsDoExtendedSpaceDescriptor
416 * PARAMETERS: Op - Parent resource descriptor parse node
417 * CurrentByteOffset - Offset into the resource template AML
418 * buffer (to track references to the desc)
420 * RETURN: Completed resource node
422 * DESCRIPTION: Construct a long "ExtendedSpace" descriptor
424 ******************************************************************************/
427 RsDoExtendedSpaceDescriptor (
428 ACPI_PARSE_OBJECT *Op,
429 UINT32 CurrentByteOffset)
431 AML_RESOURCE *Descriptor;
432 ACPI_PARSE_OBJECT *InitializerOp;
433 ACPI_PARSE_OBJECT *MinOp = NULL;
434 ACPI_PARSE_OBJECT *MaxOp = NULL;
435 ACPI_PARSE_OBJECT *LengthOp = NULL;
436 ACPI_PARSE_OBJECT *GranOp = NULL;
437 ASL_RESOURCE_NODE *Rnode;
438 UINT16 StringLength = 0;
442 InitializerOp = Op->Asl.Child;
443 StringLength = RsGetStringDataLength (InitializerOp);
445 Rnode = RsAllocateResourceNode (
446 sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
448 Descriptor = Rnode->Buffer;
449 Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
450 Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
452 Descriptor->ExtAddress64.ResourceLength = (UINT16)
453 (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
454 sizeof (AML_RESOURCE_LARGE_HEADER));
456 /* Process all child initialization nodes */
458 for (i = 0; InitializerOp; i++)
462 case 0: /* Resource Type */
464 Descriptor->ExtAddress64.ResourceType =
465 (UINT8) InitializerOp->Asl.Value.Integer;
468 case 1: /* Resource Usage */
470 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
473 case 2: /* DecodeType */
475 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
476 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
477 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
480 case 3: /* MinType */
482 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
483 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
484 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
487 case 4: /* MaxType */
489 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
490 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
491 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
494 case 5: /* Type-Specific flags */
496 Descriptor->ExtAddress64.SpecificFlags =
497 (UINT8) InitializerOp->Asl.Value.Integer;
500 case 6: /* Address Granularity */
502 Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
503 RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
504 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
505 GranOp = InitializerOp;
508 case 7: /* Min Address */
510 Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
511 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
512 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
513 MinOp = InitializerOp;
516 case 8: /* Max Address */
518 Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
519 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
520 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
521 MaxOp = InitializerOp;
524 case 9: /* Translation Offset */
526 Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
527 RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
528 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
531 case 10: /* Address Length */
533 Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
534 RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
535 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
536 LengthOp = InitializerOp;
539 case 11: /* Type-Specific Attributes */
541 Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
542 RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
543 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
546 case 12: /* ResourceTag */
548 UtAttachNamepathToOwner (Op, InitializerOp);
553 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
557 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
560 /* Validate the Min/Max/Len/Gran values */
562 RsLargeAddressCheck (
563 Descriptor->ExtAddress64.Minimum,
564 Descriptor->ExtAddress64.Maximum,
565 Descriptor->ExtAddress64.AddressLength,
566 Descriptor->ExtAddress64.Granularity,
567 Descriptor->ExtAddress64.Flags,
568 MinOp, MaxOp, LengthOp, GranOp, Op);
570 Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;