1 /******************************************************************************
3 * Module Name: aslrestype2d - Large DWord 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>
46 #include "aslcompiler.y.h"
48 #define _COMPONENT ACPI_COMPILER
49 ACPI_MODULE_NAME ("aslrestype2d")
52 * This module contains the Dword (32-bit) address space descriptors:
59 /*******************************************************************************
61 * FUNCTION: RsDoDwordIoDescriptor
63 * PARAMETERS: Op - Parent resource descriptor parse node
64 * CurrentByteOffset - Offset into the resource template AML
65 * buffer (to track references to the desc)
67 * RETURN: Completed resource node
69 * DESCRIPTION: Construct a long "DwordIO" descriptor
71 ******************************************************************************/
74 RsDoDwordIoDescriptor (
75 ACPI_PARSE_OBJECT *Op,
76 UINT32 CurrentByteOffset)
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 UINT16 StringLength = 0;
86 UINT32 OptionIndex = 0;
87 UINT8 *OptionalFields;
89 BOOLEAN ResSourceIndex = FALSE;
92 InitializerOp = Op->Asl.Child;
93 StringLength = RsGetStringDataLength (InitializerOp);
95 Rnode = RsAllocateResourceNode (
96 sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength);
98 Descriptor = Rnode->Buffer;
99 Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32;
100 Descriptor->Address32.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE;
103 * Initial descriptor length -- may be enlarged if there are
104 * optional fields present
106 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
107 Descriptor->Address32.ResourceLength = (UINT16)
108 (sizeof (AML_RESOURCE_ADDRESS32) -
109 sizeof (AML_RESOURCE_LARGE_HEADER));
111 /* Process all child initialization nodes */
113 for (i = 0; InitializerOp; i++)
117 case 0: /* Resource Usage */
119 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1);
122 case 1: /* MinType */
124 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0);
125 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
126 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2);
129 case 2: /* MaxType */
131 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0);
132 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
133 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3);
136 case 3: /* DecodeType */
138 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0);
139 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
140 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1);
143 case 4: /* Range Type */
145 RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 0, 3);
146 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
147 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 0, 2);
150 case 5: /* Address Granularity */
152 Descriptor->Address32.Granularity =
153 (UINT32) InitializerOp->Asl.Value.Integer;
154 RsCreateDwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
155 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
156 GranOp = InitializerOp;
159 case 6: /* Address Min */
161 Descriptor->Address32.Minimum =
162 (UINT32) InitializerOp->Asl.Value.Integer;
163 RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR,
164 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
165 MinOp = InitializerOp;
168 case 7: /* Address Max */
170 Descriptor->Address32.Maximum =
171 (UINT32) InitializerOp->Asl.Value.Integer;
172 RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
173 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
174 MaxOp = InitializerOp;
177 case 8: /* Translation Offset */
179 Descriptor->Address32.TranslationOffset =
180 (UINT32) InitializerOp->Asl.Value.Integer;
181 RsCreateDwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
182 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
185 case 9: /* Address Length */
187 Descriptor->Address32.AddressLength =
188 (UINT32) InitializerOp->Asl.Value.Integer;
189 RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH,
190 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
191 LengthOp = InitializerOp;
194 case 10: /* ResSourceIndex [Optional Field - BYTE] */
196 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
198 /* Found a valid ResourceSourceIndex */
200 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
202 Descriptor->Address32.ResourceLength++;
203 ResSourceIndex = TRUE;
207 case 11: /* ResSource [Optional Field - STRING] */
209 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
210 (InitializerOp->Asl.Value.String))
214 /* Found a valid ResourceSource */
216 Descriptor->Address32.ResourceLength = (UINT16)
217 (Descriptor->Address32.ResourceLength + StringLength);
220 &OptionalFields[OptionIndex],
221 InitializerOp->Asl.Value.String);
223 /* ResourceSourceIndex must also be valid */
227 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
228 InitializerOp, NULL);
235 * Not a valid ResourceSource, ResourceSourceIndex must also
238 else if (ResSourceIndex)
240 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
241 InitializerOp, NULL);
246 case 12: /* ResourceTag */
248 UtAttachNamepathToOwner (Op, InitializerOp);
253 RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 4, 0);
254 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
255 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 4);
258 case 14: /* Translation Type */
260 RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 5, 0);
261 RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
262 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 5);
267 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
271 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
274 /* Validate the Min/Max/Len/Gran values */
276 RsLargeAddressCheck (
277 (UINT64) Descriptor->Address32.Minimum,
278 (UINT64) Descriptor->Address32.Maximum,
279 (UINT64) Descriptor->Address32.AddressLength,
280 (UINT64) Descriptor->Address32.Granularity,
281 Descriptor->Address32.Flags,
282 MinOp, MaxOp, LengthOp, GranOp, Op);
284 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
285 OptionIndex + StringLength;
290 /*******************************************************************************
292 * FUNCTION: RsDoDwordMemoryDescriptor
294 * PARAMETERS: Op - Parent resource descriptor parse node
295 * CurrentByteOffset - Offset into the resource template AML
296 * buffer (to track references to the desc)
298 * RETURN: Completed resource node
300 * DESCRIPTION: Construct a long "DwordMemory" descriptor
302 ******************************************************************************/
305 RsDoDwordMemoryDescriptor (
306 ACPI_PARSE_OBJECT *Op,
307 UINT32 CurrentByteOffset)
309 AML_RESOURCE *Descriptor;
310 ACPI_PARSE_OBJECT *InitializerOp;
311 ACPI_PARSE_OBJECT *MinOp = NULL;
312 ACPI_PARSE_OBJECT *MaxOp = NULL;
313 ACPI_PARSE_OBJECT *LengthOp = NULL;
314 ACPI_PARSE_OBJECT *GranOp = NULL;
315 ASL_RESOURCE_NODE *Rnode;
316 UINT8 *OptionalFields;
317 UINT16 StringLength = 0;
318 UINT32 OptionIndex = 0;
320 BOOLEAN ResSourceIndex = FALSE;
323 InitializerOp = Op->Asl.Child;
324 StringLength = RsGetStringDataLength (InitializerOp);
326 Rnode = RsAllocateResourceNode (
327 sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength);
329 Descriptor = Rnode->Buffer;
330 Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32;
331 Descriptor->Address32.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
334 * Initial descriptor length -- may be enlarged if there are
335 * optional fields present
337 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
338 Descriptor->Address32.ResourceLength = (UINT16)
339 (sizeof (AML_RESOURCE_ADDRESS32) -
340 sizeof (AML_RESOURCE_LARGE_HEADER));
343 /* Process all child initialization nodes */
345 for (i = 0; InitializerOp; i++)
349 case 0: /* Resource Usage */
351 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1);
354 case 1: /* DecodeType */
356 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0);
357 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
358 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1);
361 case 2: /* MinType */
363 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0);
364 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
365 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2);
368 case 3: /* MaxType */
370 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0);
371 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
372 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3);
375 case 4: /* Memory Type */
377 RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 1, 0);
378 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
379 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 1, 2);
382 case 5: /* Read/Write Type */
384 RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 0, 1);
385 RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
386 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 0);
389 case 6: /* Address Granularity */
391 Descriptor->Address32.Granularity =
392 (UINT32) InitializerOp->Asl.Value.Integer;
393 RsCreateDwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
394 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
395 GranOp = InitializerOp;
398 case 7: /* Min Address */
400 Descriptor->Address32.Minimum =
401 (UINT32) InitializerOp->Asl.Value.Integer;
402 RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR,
403 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
404 MinOp = InitializerOp;
407 case 8: /* Max Address */
409 Descriptor->Address32.Maximum =
410 (UINT32) InitializerOp->Asl.Value.Integer;
411 RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
412 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
413 MaxOp = InitializerOp;
416 case 9: /* Translation Offset */
418 Descriptor->Address32.TranslationOffset =
419 (UINT32) InitializerOp->Asl.Value.Integer;
420 RsCreateDwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
421 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
424 case 10: /* Address Length */
426 Descriptor->Address32.AddressLength =
427 (UINT32) InitializerOp->Asl.Value.Integer;
428 RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH,
429 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
430 LengthOp = InitializerOp;
433 case 11: /* ResSourceIndex [Optional Field - BYTE] */
435 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
437 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
439 Descriptor->Address32.ResourceLength++;
440 ResSourceIndex = TRUE;
444 case 12: /* ResSource [Optional Field - STRING] */
446 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
447 (InitializerOp->Asl.Value.String))
451 Descriptor->Address32.ResourceLength = (UINT16)
452 (Descriptor->Address32.ResourceLength + StringLength);
455 &OptionalFields[OptionIndex],
456 InitializerOp->Asl.Value.String);
458 /* ResourceSourceIndex must also be valid */
462 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
463 InitializerOp, NULL);
470 * Not a valid ResourceSource, ResourceSourceIndex must also
473 else if (ResSourceIndex)
475 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
476 InitializerOp, NULL);
481 case 13: /* ResourceTag */
483 UtAttachNamepathToOwner (Op, InitializerOp);
487 case 14: /* Address Range */
489 RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 3, 0);
490 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
491 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 3, 2);
496 RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 5, 0);
497 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
498 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 5);
503 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
507 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
510 /* Validate the Min/Max/Len/Gran values */
512 RsLargeAddressCheck (
513 (UINT64) Descriptor->Address32.Minimum,
514 (UINT64) Descriptor->Address32.Maximum,
515 (UINT64) Descriptor->Address32.AddressLength,
516 (UINT64) Descriptor->Address32.Granularity,
517 Descriptor->Address32.Flags,
518 MinOp, MaxOp, LengthOp, GranOp, Op);
520 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
521 OptionIndex + StringLength;
526 /*******************************************************************************
528 * FUNCTION: RsDoDwordSpaceDescriptor
530 * PARAMETERS: Op - Parent resource descriptor parse node
531 * CurrentByteOffset - Offset into the resource template AML
532 * buffer (to track references to the desc)
534 * RETURN: Completed resource node
536 * DESCRIPTION: Construct a long "DwordSpace" descriptor
538 ******************************************************************************/
541 RsDoDwordSpaceDescriptor (
542 ACPI_PARSE_OBJECT *Op,
543 UINT32 CurrentByteOffset)
545 AML_RESOURCE *Descriptor;
546 ACPI_PARSE_OBJECT *InitializerOp;
547 ACPI_PARSE_OBJECT *MinOp = NULL;
548 ACPI_PARSE_OBJECT *MaxOp = NULL;
549 ACPI_PARSE_OBJECT *LengthOp = NULL;
550 ACPI_PARSE_OBJECT *GranOp = NULL;
551 ASL_RESOURCE_NODE *Rnode;
552 UINT8 *OptionalFields;
553 UINT16 StringLength = 0;
554 UINT32 OptionIndex = 0;
556 BOOLEAN ResSourceIndex = FALSE;
559 InitializerOp = Op->Asl.Child;
560 StringLength = RsGetStringDataLength (InitializerOp);
562 Rnode = RsAllocateResourceNode (
563 sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength);
565 Descriptor = Rnode->Buffer;
566 Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32;
569 * Initial descriptor length -- may be enlarged if there are
570 * optional fields present
572 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
573 Descriptor->Address32.ResourceLength = (UINT16)
574 (sizeof (AML_RESOURCE_ADDRESS32) -
575 sizeof (AML_RESOURCE_LARGE_HEADER));
577 /* Process all child initialization nodes */
579 for (i = 0; InitializerOp; i++)
583 case 0: /* Resource Type */
585 Descriptor->Address32.ResourceType =
586 (UINT8) InitializerOp->Asl.Value.Integer;
589 case 1: /* Resource Usage */
591 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1);
594 case 2: /* DecodeType */
596 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0);
597 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
598 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1);
601 case 3: /* MinType */
603 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0);
604 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
605 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2);
608 case 4: /* MaxType */
610 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0);
611 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
612 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3);
615 case 5: /* Type-Specific flags */
617 Descriptor->Address32.SpecificFlags =
618 (UINT8) InitializerOp->Asl.Value.Integer;
621 case 6: /* Address Granularity */
623 Descriptor->Address32.Granularity =
624 (UINT32) InitializerOp->Asl.Value.Integer;
625 RsCreateDwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
626 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
627 GranOp = InitializerOp;
630 case 7: /* Min Address */
632 Descriptor->Address32.Minimum =
633 (UINT32) InitializerOp->Asl.Value.Integer;
634 RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR,
635 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
636 MinOp = InitializerOp;
639 case 8: /* Max Address */
641 Descriptor->Address32.Maximum =
642 (UINT32) InitializerOp->Asl.Value.Integer;
643 RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
644 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
645 MaxOp = InitializerOp;
648 case 9: /* Translation Offset */
650 Descriptor->Address32.TranslationOffset =
651 (UINT32) InitializerOp->Asl.Value.Integer;
652 RsCreateDwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
653 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
656 case 10: /* Address Length */
658 Descriptor->Address32.AddressLength =
659 (UINT32) InitializerOp->Asl.Value.Integer;
660 RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH,
661 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
662 LengthOp = InitializerOp;
665 case 11: /* ResSourceIndex [Optional Field - BYTE] */
667 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
669 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
671 Descriptor->Address32.ResourceLength++;
672 ResSourceIndex = TRUE;
676 case 12: /* ResSource [Optional Field - STRING] */
678 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
679 (InitializerOp->Asl.Value.String))
683 Descriptor->Address32.ResourceLength = (UINT16)
684 (Descriptor->Address32.ResourceLength + StringLength);
687 &OptionalFields[OptionIndex],
688 InitializerOp->Asl.Value.String);
690 /* ResourceSourceIndex must also be valid */
694 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
695 InitializerOp, NULL);
702 * Not a valid ResourceSource, ResourceSourceIndex must also
705 else if (ResSourceIndex)
707 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
708 InitializerOp, NULL);
713 case 13: /* ResourceTag */
715 UtAttachNamepathToOwner (Op, InitializerOp);
720 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST,
721 InitializerOp, NULL);
725 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
728 /* Validate the Min/Max/Len/Gran values */
730 RsLargeAddressCheck (
731 (UINT64) Descriptor->Address32.Minimum,
732 (UINT64) Descriptor->Address32.Maximum,
733 (UINT64) Descriptor->Address32.AddressLength,
734 (UINT64) Descriptor->Address32.Granularity,
735 Descriptor->Address32.Flags,
736 MinOp, MaxOp, LengthOp, GranOp, Op);
738 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
739 OptionIndex + StringLength;