1 /******************************************************************************
2  *
3  * Module Name: aslrestype2q - Large QWord address resource descriptors
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2014, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
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.
25  *
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.
29  *
30  * NO WARRANTY
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.
42  */
43 
44 
45 #include "aslcompiler.h"
46 #include "aslcompiler.y.h"
47 
48 #define _COMPONENT          ACPI_COMPILER
49         ACPI_MODULE_NAME    ("aslrestype2q")
50 
51 /*
52  * This module contains the QWord (64-bit) address space descriptors:
53  *
54  * QWordIO
55  * QWordMemory
56  * QWordSpace
57  */
58 
59 /*******************************************************************************
60  *
61  * FUNCTION:    RsDoQwordIoDescriptor
62  *
63  * PARAMETERS:  Op                  - Parent resource descriptor parse node
64  *              CurrentByteOffset   - Offset into the resource template AML
65  *                                    buffer (to track references to the desc)
66  *
67  * RETURN:      Completed resource node
68  *
69  * DESCRIPTION: Construct a long "QwordIO" descriptor
70  *
71  ******************************************************************************/
72 
73 ASL_RESOURCE_NODE *
74 RsDoQwordIoDescriptor (
75     ACPI_PARSE_OBJECT       *Op,
76     UINT32                  CurrentByteOffset)
77 {
78     AML_RESOURCE            *Descriptor;
79     ACPI_PARSE_OBJECT       *InitializerOp;
80     ACPI_PARSE_OBJECT       *MinOp = NULL;
81     ACPI_PARSE_OBJECT       *MaxOp = NULL;
82     ACPI_PARSE_OBJECT       *LengthOp = NULL;
83     ACPI_PARSE_OBJECT       *GranOp = NULL;
84     ASL_RESOURCE_NODE       *Rnode;
85     UINT8                   *OptionalFields;
86     UINT16                  StringLength = 0;
87     UINT32                  OptionIndex = 0;
88     UINT32                  i;
89     BOOLEAN                 ResSourceIndex = FALSE;
90 
91 
92     InitializerOp = Op->Asl.Child;
93     StringLength = RsGetStringDataLength (InitializerOp);
94 
95     Rnode = RsAllocateResourceNode (
96                 sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
97 
98     Descriptor = Rnode->Buffer;
99     Descriptor->Address64.DescriptorType  = ACPI_RESOURCE_NAME_ADDRESS64;
100     Descriptor->Address64.ResourceType    = ACPI_ADDRESS_TYPE_IO_RANGE;
101 
102     /*
103      * Initial descriptor length -- may be enlarged if there are
104      * optional fields present
105      */
106     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
107     Descriptor->Address64.ResourceLength = (UINT16)
108         (sizeof (AML_RESOURCE_ADDRESS64) -
109          sizeof (AML_RESOURCE_LARGE_HEADER));
110 
111     /* Process all child initialization nodes */
112 
113     for (i = 0; InitializerOp; i++)
114     {
115         switch (i)
116         {
117         case 0: /* Resource Usage */
118 
119             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
120             break;
121 
122         case 1: /* MinType */
123 
124             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
125             RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
126                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
127             break;
128 
129         case 2: /* MaxType */
130 
131             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
132             RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
133                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
134             break;
135 
136         case 3: /* DecodeType */
137 
138             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
139             RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
140                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
141             break;
142 
143         case 4: /* Range Type */
144 
145             RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 3);
146             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
147                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0, 2);
148             break;
149 
150         case 5: /* Address Granularity */
151 
152             Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
153             RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
154                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
155             GranOp = InitializerOp;
156             break;
157 
158         case 6: /* Address Min */
159 
160             Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
161             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
162                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
163             MinOp = InitializerOp;
164             break;
165 
166         case 7: /* Address Max */
167 
168             Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
169             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
170                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
171             MaxOp = InitializerOp;
172             break;
173 
174         case 8: /* Translation Offset */
175 
176             Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
177             RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
178                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
179             break;
180 
181         case 9: /* Address Length */
182 
183             Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
184             RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
185                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
186             LengthOp = InitializerOp;
187             break;
188 
189         case 10: /* ResSourceIndex [Optional Field - BYTE] */
190 
191             if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
192             {
193                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
194                 OptionIndex++;
195                 Descriptor->Address64.ResourceLength++;
196                 ResSourceIndex = TRUE;
197             }
198             break;
199 
200         case 11: /* ResSource [Optional Field - STRING] */
201 
202             if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
203                 (InitializerOp->Asl.Value.String))
204             {
205                 if (StringLength)
206                 {
207                     Descriptor->Address64.ResourceLength = (UINT16)
208                         (Descriptor->Address64.ResourceLength + StringLength);
209 
210                     strcpy ((char *)
211                         &OptionalFields[OptionIndex],
212                         InitializerOp->Asl.Value.String);
213 
214                     /* ResourceSourceIndex must also be valid */
215 
216                     if (!ResSourceIndex)
217                     {
218                         AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
219                             InitializerOp, NULL);
220                     }
221                 }
222             }
223 
224 #if 0
225             /*
226              * Not a valid ResourceSource, ResourceSourceIndex must also
227              * be invalid
228              */
229             else if (ResSourceIndex)
230             {
231                 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
232                     InitializerOp, NULL);
233             }
234 #endif
235             break;
236 
237         case 12: /* ResourceTag */
238 
239             UtAttachNamepathToOwner (Op, InitializerOp);
240             break;
241 
242         case 13: /* Type */
243 
244             RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 4, 0);
245             RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
246                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 4);
247             break;
248 
249         case 14: /* Translation Type */
250 
251             RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0);
252             RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
253                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5);
254             break;
255 
256         default:
257 
258             AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
259             break;
260         }
261 
262         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
263     }
264 
265     /* Validate the Min/Max/Len/Gran values */
266 
267     RsLargeAddressCheck (
268         Descriptor->Address64.Minimum,
269         Descriptor->Address64.Maximum,
270         Descriptor->Address64.AddressLength,
271         Descriptor->Address64.Granularity,
272         Descriptor->Address64.Flags,
273         MinOp, MaxOp, LengthOp, GranOp, Op);
274 
275     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
276                             OptionIndex + StringLength;
277     return (Rnode);
278 }
279 
280 
281 /*******************************************************************************
282  *
283  * FUNCTION:    RsDoQwordMemoryDescriptor
284  *
285  * PARAMETERS:  Op                  - Parent resource descriptor parse node
286  *              CurrentByteOffset   - Offset into the resource template AML
287  *                                    buffer (to track references to the desc)
288  *
289  * RETURN:      Completed resource node
290  *
291  * DESCRIPTION: Construct a long "QwordMemory" descriptor
292  *
293  ******************************************************************************/
294 
295 ASL_RESOURCE_NODE *
296 RsDoQwordMemoryDescriptor (
297     ACPI_PARSE_OBJECT       *Op,
298     UINT32                  CurrentByteOffset)
299 {
300     AML_RESOURCE            *Descriptor;
301     ACPI_PARSE_OBJECT       *InitializerOp;
302     ACPI_PARSE_OBJECT       *MinOp = NULL;
303     ACPI_PARSE_OBJECT       *MaxOp = NULL;
304     ACPI_PARSE_OBJECT       *LengthOp = NULL;
305     ACPI_PARSE_OBJECT       *GranOp = NULL;
306     ASL_RESOURCE_NODE       *Rnode;
307     UINT8                   *OptionalFields;
308     UINT16                  StringLength = 0;
309     UINT32                  OptionIndex = 0;
310     UINT32                  i;
311     BOOLEAN                 ResSourceIndex = FALSE;
312 
313 
314     InitializerOp = Op->Asl.Child;
315     StringLength = RsGetStringDataLength (InitializerOp);
316 
317     Rnode = RsAllocateResourceNode (
318                 sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
319 
320     Descriptor = Rnode->Buffer;
321     Descriptor->Address64.DescriptorType  = ACPI_RESOURCE_NAME_ADDRESS64;
322     Descriptor->Address64.ResourceType    = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
323 
324     /*
325      * Initial descriptor length -- may be enlarged if there are
326      * optional fields present
327      */
328     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
329     Descriptor->Address64.ResourceLength = (UINT16)
330         (sizeof (AML_RESOURCE_ADDRESS64) -
331          sizeof (AML_RESOURCE_LARGE_HEADER));
332 
333     /* Process all child initialization nodes */
334 
335     for (i = 0; InitializerOp; i++)
336     {
337         switch (i)
338         {
339         case 0: /* Resource Usage */
340 
341             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
342             break;
343 
344         case 1: /* DecodeType */
345 
346             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
347             RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
348                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
349             break;
350 
351         case 2: /* MinType */
352 
353             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
354             RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
355                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
356             break;
357 
358         case 3: /* MaxType */
359 
360             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
361             RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
362                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
363             break;
364 
365         case 4: /* Memory Type */
366 
367             RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 1, 0);
368             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
369                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 1, 2);
370             break;
371 
372         case 5: /* Read/Write Type */
373 
374             RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 1);
375             RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
376                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0);
377             break;
378 
379         case 6: /* Address Granularity */
380 
381             Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
382             RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
383                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
384             GranOp = InitializerOp;
385             break;
386 
387         case 7: /* Min Address */
388 
389             Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
390             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
391                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
392             MinOp = InitializerOp;
393             break;
394 
395         case 8: /* Max Address */
396 
397             Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
398             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
399                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
400             MaxOp = InitializerOp;
401             break;
402 
403         case 9: /* Translation Offset */
404 
405             Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
406             RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
407                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
408             break;
409 
410         case 10: /* Address Length */
411 
412             Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
413             RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
414                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
415             LengthOp = InitializerOp;
416             break;
417 
418         case 11: /* ResSourceIndex [Optional Field - BYTE] */
419 
420             if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
421             {
422                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
423                 OptionIndex++;
424                 Descriptor->Address64.ResourceLength++;
425                 ResSourceIndex = TRUE;
426             }
427             break;
428 
429         case 12: /* ResSource [Optional Field - STRING] */
430 
431             if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
432                 (InitializerOp->Asl.Value.String))
433             {
434                 if (StringLength)
435                 {
436                     Descriptor->Address64.ResourceLength = (UINT16)
437                         (Descriptor->Address64.ResourceLength + StringLength);
438 
439                     strcpy ((char *)
440                         &OptionalFields[OptionIndex],
441                         InitializerOp->Asl.Value.String);
442 
443                     /* ResourceSourceIndex must also be valid */
444 
445                     if (!ResSourceIndex)
446                     {
447                         AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
448                             InitializerOp, NULL);
449                     }
450                 }
451             }
452 
453 #if 0
454             /*
455              * Not a valid ResourceSource, ResourceSourceIndex must also
456              * be invalid
457              */
458             else if (ResSourceIndex)
459             {
460                 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
461                     InitializerOp, NULL);
462             }
463 #endif
464             break;
465 
466         case 13: /* ResourceTag */
467 
468             UtAttachNamepathToOwner (Op, InitializerOp);
469             break;
470 
471 
472         case 14: /* Address Range */
473 
474             RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 3, 0);
475             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
476                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 3, 2);
477             break;
478 
479         case 15: /* Type */
480 
481             RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0);
482             RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
483                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5);
484             break;
485 
486         default:
487 
488             AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
489             break;
490         }
491 
492         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
493     }
494 
495     /* Validate the Min/Max/Len/Gran values */
496 
497     RsLargeAddressCheck (
498         Descriptor->Address64.Minimum,
499         Descriptor->Address64.Maximum,
500         Descriptor->Address64.AddressLength,
501         Descriptor->Address64.Granularity,
502         Descriptor->Address64.Flags,
503         MinOp, MaxOp, LengthOp, GranOp, Op);
504 
505     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
506                             OptionIndex + StringLength;
507     return (Rnode);
508 }
509 
510 
511 /*******************************************************************************
512  *
513  * FUNCTION:    RsDoQwordSpaceDescriptor
514  *
515  * PARAMETERS:  Op                  - Parent resource descriptor parse node
516  *              CurrentByteOffset   - Offset into the resource template AML
517  *                                    buffer (to track references to the desc)
518  *
519  * RETURN:      Completed resource node
520  *
521  * DESCRIPTION: Construct a long "QwordSpace" descriptor
522  *
523  ******************************************************************************/
524 
525 ASL_RESOURCE_NODE *
526 RsDoQwordSpaceDescriptor (
527     ACPI_PARSE_OBJECT       *Op,
528     UINT32                  CurrentByteOffset)
529 {
530     AML_RESOURCE            *Descriptor;
531     ACPI_PARSE_OBJECT       *InitializerOp;
532     ACPI_PARSE_OBJECT       *MinOp = NULL;
533     ACPI_PARSE_OBJECT       *MaxOp = NULL;
534     ACPI_PARSE_OBJECT       *LengthOp = NULL;
535     ACPI_PARSE_OBJECT       *GranOp = NULL;
536     ASL_RESOURCE_NODE       *Rnode;
537     UINT8                   *OptionalFields;
538     UINT16                  StringLength = 0;
539     UINT32                  OptionIndex = 0;
540     UINT32                  i;
541     BOOLEAN                 ResSourceIndex = FALSE;
542 
543 
544     InitializerOp = Op->Asl.Child;
545     StringLength = RsGetStringDataLength (InitializerOp);
546 
547     Rnode = RsAllocateResourceNode (
548                 sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
549 
550     Descriptor = Rnode->Buffer;
551     Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
552 
553     /*
554      * Initial descriptor length -- may be enlarged if there are
555      * optional fields present
556      */
557     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
558     Descriptor->Address64.ResourceLength = (UINT16)
559         (sizeof (AML_RESOURCE_ADDRESS64) -
560          sizeof (AML_RESOURCE_LARGE_HEADER));
561 
562     /* Process all child initialization nodes */
563 
564     for (i = 0; InitializerOp; i++)
565     {
566         switch (i)
567         {
568         case 0: /* Resource Type */
569 
570             Descriptor->Address64.ResourceType =
571                 (UINT8) InitializerOp->Asl.Value.Integer;
572             break;
573 
574         case 1: /* Resource Usage */
575 
576             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
577             break;
578 
579         case 2: /* DecodeType */
580 
581             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
582             RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
583                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
584             break;
585 
586         case 3: /* MinType */
587 
588             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
589             RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
590                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
591             break;
592 
593         case 4: /* MaxType */
594 
595             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
596             RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
597                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
598             break;
599 
600         case 5: /* Type-Specific flags */
601 
602             Descriptor->Address64.SpecificFlags =
603                 (UINT8) InitializerOp->Asl.Value.Integer;
604             break;
605 
606         case 6: /* Address Granularity */
607 
608             Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
609             RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
610                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
611             GranOp = InitializerOp;
612             break;
613 
614         case 7: /* Min Address */
615 
616             Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
617             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
618                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
619             MinOp = InitializerOp;
620             break;
621 
622         case 8: /* Max Address */
623 
624             Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
625             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
626                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
627             MaxOp = InitializerOp;
628             break;
629 
630         case 9: /* Translation Offset */
631 
632             Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
633             RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
634                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
635             break;
636 
637         case 10: /* Address Length */
638 
639             Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
640             RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
641                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
642             LengthOp = InitializerOp;
643             break;
644 
645         case 11: /* ResSourceIndex [Optional Field - BYTE] */
646 
647             if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
648             {
649                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
650                 OptionIndex++;
651                 Descriptor->Address64.ResourceLength++;
652                 ResSourceIndex = TRUE;
653             }
654             break;
655 
656         case 12: /* ResSource [Optional Field - STRING] */
657 
658             if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
659                 (InitializerOp->Asl.Value.String))
660             {
661                 if (StringLength)
662                 {
663                     Descriptor->Address64.ResourceLength = (UINT16)
664                         (Descriptor->Address64.ResourceLength + StringLength);
665 
666                     strcpy ((char *)
667                         &OptionalFields[OptionIndex],
668                         InitializerOp->Asl.Value.String);
669 
670                     /* ResourceSourceIndex must also be valid */
671 
672                     if (!ResSourceIndex)
673                     {
674                         AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
675                             InitializerOp, NULL);
676                     }
677                 }
678             }
679 
680 #if 0
681             /*
682              * Not a valid ResourceSource, ResourceSourceIndex must also
683              * be invalid
684              */
685             else if (ResSourceIndex)
686             {
687                 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
688                     InitializerOp, NULL);
689             }
690 #endif
691             break;
692 
693         case 13: /* ResourceTag */
694 
695             UtAttachNamepathToOwner (Op, InitializerOp);
696             break;
697 
698         default:
699 
700             AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
701             break;
702         }
703 
704         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
705     }
706 
707     /* Validate the Min/Max/Len/Gran values */
708 
709     RsLargeAddressCheck (
710         Descriptor->Address64.Minimum,
711         Descriptor->Address64.Maximum,
712         Descriptor->Address64.AddressLength,
713         Descriptor->Address64.Granularity,
714         Descriptor->Address64.Flags,
715         MinOp, MaxOp, LengthOp, GranOp, Op);
716 
717     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
718                             OptionIndex + StringLength;
719     return (Rnode);
720 }
721