2 /******************************************************************************
4 * Module Name: aslrestype2 - Long (type2) resource templates and descriptors
7 *****************************************************************************/
9 /******************************************************************************
13 * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
14 * All rights reserved.
18 * 2.1. This is your license from Intel Corp. under its intellectual property
19 * rights. You may have additional license terms from the party that provided
20 * you this software, covering your right to use that party's intellectual
23 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
24 * copy of the source code appearing in this file ("Covered Code") an
25 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
26 * base code distributed originally by Intel ("Original Intel Code") to copy,
27 * make derivatives, distribute, use and display any portion of the Covered
28 * Code in any form, with the right to sublicense such rights; and
30 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
31 * license (with the right to sublicense), under only those claims of Intel
32 * patents that are infringed by the Original Intel Code, to make, use, sell,
33 * offer to sell, and import the Covered Code and derivative works thereof
34 * solely to the minimum extent necessary to exercise the above copyright
35 * license, and in no event shall the patent license extend to any additions
36 * to or modifications of the Original Intel Code. No other license or right
37 * is granted directly or by implication, estoppel or otherwise;
39 * The above copyright and patent license is granted only if the following
44 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
45 * Redistribution of source code of any substantial portion of the Covered
46 * Code or modification with rights to further distribute source must include
47 * the above Copyright Notice, the above License, this list of Conditions,
48 * and the following Disclaimer and Export Compliance provision. In addition,
49 * Licensee must cause all Covered Code to which Licensee contributes to
50 * contain a file documenting the changes Licensee made to create that Covered
51 * Code and the date of any change. Licensee must include in that file the
52 * documentation of any changes made by any predecessor Licensee. Licensee
53 * must include a prominent statement that the modification is derived,
54 * directly or indirectly, from Original Intel Code.
56 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
57 * Redistribution of source code of any substantial portion of the Covered
58 * Code or modification without rights to further distribute source must
59 * include the following Disclaimer and Export Compliance provision in the
60 * documentation and/or other materials provided with distribution. In
61 * addition, Licensee may not authorize further sublicense of source of any
62 * portion of the Covered Code, and must include terms to the effect that the
63 * license from Licensee to its licensee is limited to the intellectual
64 * property embodied in the software Licensee provides to its licensee, and
65 * not to intellectual property embodied in modifications its licensee may
68 * 3.3. Redistribution of Executable. Redistribution in executable form of any
69 * substantial portion of the Covered Code or modification must reproduce the
70 * above Copyright Notice, and the following Disclaimer and Export Compliance
71 * provision in the documentation and/or other materials provided with the
74 * 3.4. Intel retains all right, title, and interest in and to the Original
77 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
78 * Intel shall be used in advertising or otherwise to promote the sale, use or
79 * other dealings in products derived from or relating to the Covered Code
80 * without prior written authorization from Intel.
82 * 4. Disclaimer and Export Compliance
84 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
85 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
86 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
87 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
88 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
89 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
92 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
93 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
94 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
95 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
96 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
97 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
98 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
101 * 4.3. Licensee shall not export, either directly or indirectly, any of this
102 * software or system incorporating such software without first obtaining any
103 * required license or other approval from the U. S. Department of Commerce or
104 * any other agency or department of the United States Government. In the
105 * event Licensee exports any such software from the United States or
106 * re-exports any such software from a foreign destination, Licensee shall
107 * ensure that the distribution and export/re-export of the software is in
108 * compliance with all laws, regulations, orders, or other restrictions of the
109 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
110 * any of its subsidiaries will export/re-export any technical data, process,
111 * software, or service, directly or indirectly, to any country for which the
112 * United States government or any agency thereof requires an export license,
113 * other governmental approval, or letter of assurance, without first obtaining
114 * such license, approval or letter.
116 *****************************************************************************/
119 #include <contrib/dev/acpica/compiler/aslcompiler.h>
120 #include "aslcompiler.y.h"
122 #define _COMPONENT ACPI_COMPILER
123 ACPI_MODULE_NAME ("aslrestype2")
125 /* Local prototypes */
128 RsGetStringDataLength (
129 ACPI_PARSE_OBJECT *InitializerOp);
132 /*******************************************************************************
134 * FUNCTION: RsGetStringDataLength
136 * PARAMETERS: InitializerOp - Start of a subtree of init nodes
138 * RETURN: Valid string length if a string node is found (otherwise 0)
140 * DESCRIPTION: In a list of peer nodes, find the first one that contains a
141 * string and return the length of the string.
143 ******************************************************************************/
146 RsGetStringDataLength (
147 ACPI_PARSE_OBJECT *InitializerOp)
150 while (InitializerOp)
152 if (InitializerOp->Asl.ParseOpcode == PARSEOP_STRING_LITERAL)
154 return ((UINT16) (strlen (InitializerOp->Asl.Value.String) + 1));
156 InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
163 /*******************************************************************************
165 * FUNCTION: RsDoDwordIoDescriptor
167 * PARAMETERS: Op - Parent resource descriptor parse node
168 * CurrentByteOffset - Offset into the resource template AML
169 * buffer (to track references to the desc)
171 * RETURN: Completed resource node
173 * DESCRIPTION: Construct a long "DwordIO" descriptor
175 ******************************************************************************/
178 RsDoDwordIoDescriptor (
179 ACPI_PARSE_OBJECT *Op,
180 UINT32 CurrentByteOffset)
182 AML_RESOURCE *Descriptor;
183 ACPI_PARSE_OBJECT *InitializerOp;
184 ASL_RESOURCE_NODE *Rnode;
185 UINT16 StringLength = 0;
186 UINT32 OptionIndex = 0;
187 UINT8 *OptionalFields;
189 BOOLEAN ResSourceIndex = FALSE;
192 InitializerOp = Op->Asl.Child;
193 StringLength = RsGetStringDataLength (InitializerOp);
195 Rnode = RsAllocateResourceNode (
196 sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength);
198 Descriptor = Rnode->Buffer;
199 Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32;
200 Descriptor->Address32.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE;
203 * Initial descriptor length -- may be enlarged if there are
204 * optional fields present
206 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
207 Descriptor->Address32.ResourceLength = (UINT16)
208 (sizeof (AML_RESOURCE_ADDRESS32) -
209 sizeof (AML_RESOURCE_LARGE_HEADER));
211 /* Process all child initialization nodes */
213 for (i = 0; InitializerOp; i++)
217 case 0: /* Resource Usage */
219 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1);
222 case 1: /* MinType */
224 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0);
225 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
226 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2);
229 case 2: /* MaxType */
231 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0);
232 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
233 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3);
236 case 3: /* DecodeType */
238 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0);
239 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
240 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1);
243 case 4: /* Range Type */
245 RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 0, 3);
246 RsCreateBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
247 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 0);
250 case 5: /* Address Granularity */
252 Descriptor->Address32.Granularity =
253 (UINT32) InitializerOp->Asl.Value.Integer;
254 RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
255 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
258 case 6: /* Address Min */
260 Descriptor->Address32.Minimum =
261 (UINT32) InitializerOp->Asl.Value.Integer;
262 RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
263 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
266 case 7: /* Address Max */
268 Descriptor->Address32.Maximum =
269 (UINT32) InitializerOp->Asl.Value.Integer;
270 RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
271 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
274 case 8: /* Translation Offset */
276 Descriptor->Address32.TranslationOffset =
277 (UINT32) InitializerOp->Asl.Value.Integer;
278 RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
279 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
282 case 9: /* Address Length */
284 Descriptor->Address32.AddressLength =
285 (UINT32) InitializerOp->Asl.Value.Integer;
286 RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
287 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
290 case 10: /* ResSourceIndex [Optional Field - BYTE] */
292 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
294 /* Found a valid ResourceSourceIndex */
296 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
298 Descriptor->Address32.ResourceLength++;
299 ResSourceIndex = TRUE;
303 case 11: /* ResSource [Optional Field - STRING] */
305 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
306 (InitializerOp->Asl.Value.String))
310 /* Found a valid ResourceSource */
312 Descriptor->Address32.ResourceLength = (UINT16)
313 (Descriptor->Address32.ResourceLength + StringLength);
316 &OptionalFields[OptionIndex],
317 InitializerOp->Asl.Value.String);
319 /* ResourceSourceIndex must also be valid */
323 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
324 InitializerOp, NULL);
331 * Not a valid ResourceSource, ResourceSourceIndex must also
334 else if (ResSourceIndex)
336 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
337 InitializerOp, NULL);
342 case 12: /* ResourceTag */
344 UtAttachNamepathToOwner (Op, InitializerOp);
349 RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 4, 0);
350 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
351 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 4);
354 case 14: /* Translation Type */
356 RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 5, 0);
357 RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
358 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 5);
363 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
367 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
370 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
371 OptionIndex + StringLength;
376 /*******************************************************************************
378 * FUNCTION: RsDoDwordMemoryDescriptor
380 * PARAMETERS: Op - Parent resource descriptor parse node
381 * CurrentByteOffset - Offset into the resource template AML
382 * buffer (to track references to the desc)
384 * RETURN: Completed resource node
386 * DESCRIPTION: Construct a long "DwordMemory" descriptor
388 ******************************************************************************/
391 RsDoDwordMemoryDescriptor (
392 ACPI_PARSE_OBJECT *Op,
393 UINT32 CurrentByteOffset)
395 AML_RESOURCE *Descriptor;
396 ACPI_PARSE_OBJECT *InitializerOp;
397 ASL_RESOURCE_NODE *Rnode;
398 UINT8 *OptionalFields;
399 UINT16 StringLength = 0;
400 UINT32 OptionIndex = 0;
402 BOOLEAN ResSourceIndex = FALSE;
405 InitializerOp = Op->Asl.Child;
406 StringLength = RsGetStringDataLength (InitializerOp);
408 Rnode = RsAllocateResourceNode (
409 sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength);
411 Descriptor = Rnode->Buffer;
412 Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32;
413 Descriptor->Address32.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
416 * Initial descriptor length -- may be enlarged if there are
417 * optional fields present
419 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
420 Descriptor->Address32.ResourceLength = (UINT16)
421 (sizeof (AML_RESOURCE_ADDRESS32) -
422 sizeof (AML_RESOURCE_LARGE_HEADER));
425 /* Process all child initialization nodes */
427 for (i = 0; InitializerOp; i++)
431 case 0: /* Resource Usage */
433 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1);
436 case 1: /* DecodeType */
438 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0);
439 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
440 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1);
443 case 2: /* MinType */
445 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0);
446 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
447 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2);
450 case 3: /* MaxType */
452 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0);
453 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
454 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3);
457 case 4: /* Memory Type */
459 RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 1, 0);
460 RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
461 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 1);
464 case 5: /* Read/Write Type */
466 RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 0, 1);
467 RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
468 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 0);
471 case 6: /* Address Granularity */
473 Descriptor->Address32.Granularity =
474 (UINT32) InitializerOp->Asl.Value.Integer;
475 RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
476 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
479 case 7: /* Min Address */
481 Descriptor->Address32.Minimum =
482 (UINT32) InitializerOp->Asl.Value.Integer;
483 RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
484 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
487 case 8: /* Max Address */
489 Descriptor->Address32.Maximum =
490 (UINT32) InitializerOp->Asl.Value.Integer;
491 RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
492 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
495 case 9: /* Translation Offset */
497 Descriptor->Address32.TranslationOffset =
498 (UINT32) InitializerOp->Asl.Value.Integer;
499 RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
500 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
503 case 10: /* Address Length */
505 Descriptor->Address32.AddressLength =
506 (UINT32) InitializerOp->Asl.Value.Integer;
507 RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
508 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
511 case 11: /* ResSourceIndex [Optional Field - BYTE] */
513 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
515 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
517 Descriptor->Address32.ResourceLength++;
518 ResSourceIndex = TRUE;
522 case 12: /* ResSource [Optional Field - STRING] */
524 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
525 (InitializerOp->Asl.Value.String))
529 Descriptor->Address32.ResourceLength = (UINT16)
530 (Descriptor->Address32.ResourceLength + StringLength);
533 &OptionalFields[OptionIndex],
534 InitializerOp->Asl.Value.String);
536 /* ResourceSourceIndex must also be valid */
540 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
541 InitializerOp, NULL);
548 * Not a valid ResourceSource, ResourceSourceIndex must also
551 else if (ResSourceIndex)
553 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
554 InitializerOp, NULL);
559 case 13: /* ResourceTag */
561 UtAttachNamepathToOwner (Op, InitializerOp);
565 case 14: /* Address Range */
567 RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 3, 0);
568 RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
569 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 3);
574 RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 5, 0);
575 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
576 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 5);
581 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
585 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
588 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
589 OptionIndex + StringLength;
594 /*******************************************************************************
596 * FUNCTION: RsDoDwordSpaceDescriptor
598 * PARAMETERS: Op - Parent resource descriptor parse node
599 * CurrentByteOffset - Offset into the resource template AML
600 * buffer (to track references to the desc)
602 * RETURN: Completed resource node
604 * DESCRIPTION: Construct a long "DwordSpace" descriptor
606 ******************************************************************************/
609 RsDoDwordSpaceDescriptor (
610 ACPI_PARSE_OBJECT *Op,
611 UINT32 CurrentByteOffset)
613 AML_RESOURCE *Descriptor;
614 ACPI_PARSE_OBJECT *InitializerOp;
615 ASL_RESOURCE_NODE *Rnode;
616 UINT8 *OptionalFields;
617 UINT16 StringLength = 0;
618 UINT32 OptionIndex = 0;
620 BOOLEAN ResSourceIndex = FALSE;
623 InitializerOp = Op->Asl.Child;
624 StringLength = RsGetStringDataLength (InitializerOp);
626 Rnode = RsAllocateResourceNode (
627 sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength);
629 Descriptor = Rnode->Buffer;
630 Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32;
633 * Initial descriptor length -- may be enlarged if there are
634 * optional fields present
636 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
637 Descriptor->Address32.ResourceLength = (UINT16)
638 (sizeof (AML_RESOURCE_ADDRESS32) -
639 sizeof (AML_RESOURCE_LARGE_HEADER));
641 /* Process all child initialization nodes */
643 for (i = 0; InitializerOp; i++)
647 case 0: /* Resource Type */
649 Descriptor->Address32.ResourceType =
650 (UINT8) InitializerOp->Asl.Value.Integer;
653 case 1: /* Resource Usage */
655 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1);
658 case 2: /* DecodeType */
660 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0);
661 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
662 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1);
665 case 3: /* MinType */
667 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0);
668 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
669 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2);
672 case 4: /* MaxType */
674 RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0);
675 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
676 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3);
679 case 5: /* Type-Specific flags */
681 Descriptor->Address32.SpecificFlags =
682 (UINT8) InitializerOp->Asl.Value.Integer;
685 case 6: /* Address Granularity */
687 Descriptor->Address32.Granularity =
688 (UINT32) InitializerOp->Asl.Value.Integer;
689 RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
690 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
693 case 7: /* Min Address */
695 Descriptor->Address32.Minimum =
696 (UINT32) InitializerOp->Asl.Value.Integer;
697 RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
698 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
701 case 8: /* Max Address */
703 Descriptor->Address32.Maximum =
704 (UINT32) InitializerOp->Asl.Value.Integer;
705 RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
706 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
709 case 9: /* Translation Offset */
711 Descriptor->Address32.TranslationOffset =
712 (UINT32) InitializerOp->Asl.Value.Integer;
713 RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
714 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
717 case 10: /* Address Length */
719 Descriptor->Address32.AddressLength =
720 (UINT32) InitializerOp->Asl.Value.Integer;
721 RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
722 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
725 case 11: /* ResSourceIndex [Optional Field - BYTE] */
727 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
729 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
731 Descriptor->Address32.ResourceLength++;
732 ResSourceIndex = TRUE;
736 case 12: /* ResSource [Optional Field - STRING] */
738 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
739 (InitializerOp->Asl.Value.String))
743 Descriptor->Address32.ResourceLength = (UINT16)
744 (Descriptor->Address32.ResourceLength + StringLength);
747 &OptionalFields[OptionIndex],
748 InitializerOp->Asl.Value.String);
750 /* ResourceSourceIndex must also be valid */
754 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
755 InitializerOp, NULL);
762 * Not a valid ResourceSource, ResourceSourceIndex must also
765 else if (ResSourceIndex)
767 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
768 InitializerOp, NULL);
773 case 13: /* ResourceTag */
775 UtAttachNamepathToOwner (Op, InitializerOp);
780 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST,
781 InitializerOp, NULL);
785 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
788 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
789 OptionIndex + StringLength;
794 /*******************************************************************************
796 * FUNCTION: RsDoExtendedIoDescriptor
798 * PARAMETERS: Op - Parent resource descriptor parse node
799 * CurrentByteOffset - Offset into the resource template AML
800 * buffer (to track references to the desc)
802 * RETURN: Completed resource node
804 * DESCRIPTION: Construct a long "ExtendedIO" descriptor
806 ******************************************************************************/
809 RsDoExtendedIoDescriptor (
810 ACPI_PARSE_OBJECT *Op,
811 UINT32 CurrentByteOffset)
813 AML_RESOURCE *Descriptor;
814 ACPI_PARSE_OBJECT *InitializerOp;
815 ASL_RESOURCE_NODE *Rnode;
816 UINT16 StringLength = 0;
820 InitializerOp = Op->Asl.Child;
821 StringLength = RsGetStringDataLength (InitializerOp);
823 Rnode = RsAllocateResourceNode (
824 sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
826 Descriptor = Rnode->Buffer;
827 Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
828 Descriptor->ExtAddress64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE;
829 Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
831 Descriptor->ExtAddress64.ResourceLength = (UINT16)
832 (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
833 sizeof (AML_RESOURCE_LARGE_HEADER));
835 /* Process all child initialization nodes */
837 for (i = 0; InitializerOp; i++)
841 case 0: /* Resource Usage */
843 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
846 case 1: /* MinType */
848 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
849 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
850 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
853 case 2: /* MaxType */
855 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
856 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
857 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
860 case 3: /* DecodeType */
862 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
863 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
864 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
867 case 4: /* Range Type */
869 RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 3);
870 RsCreateBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
871 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0);
874 case 5: /* Address Granularity */
876 Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
877 RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
878 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
881 case 6: /* Address Min */
883 Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
884 RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
885 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
888 case 7: /* Address Max */
890 Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
891 RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
892 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
895 case 8: /* Translation Offset */
897 Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
898 RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
899 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
902 case 9: /* Address Length */
904 Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
905 RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
906 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
909 case 10: /* Type-Specific Attributes */
911 Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
912 RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
913 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
916 case 11: /* ResourceTag */
918 UtAttachNamepathToOwner (Op, InitializerOp);
923 RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 4, 0);
924 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
925 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 4);
928 case 13: /* Translation Type */
930 RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0);
931 RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
932 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5);
937 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
941 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
944 Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
949 /*******************************************************************************
951 * FUNCTION: RsDoExtendedMemoryDescriptor
953 * PARAMETERS: Op - Parent resource descriptor parse node
954 * CurrentByteOffset - Offset into the resource template AML
955 * buffer (to track references to the desc)
957 * RETURN: Completed resource node
959 * DESCRIPTION: Construct a long "ExtendedMemory" descriptor
961 ******************************************************************************/
964 RsDoExtendedMemoryDescriptor (
965 ACPI_PARSE_OBJECT *Op,
966 UINT32 CurrentByteOffset)
968 AML_RESOURCE *Descriptor;
969 ACPI_PARSE_OBJECT *InitializerOp;
970 ASL_RESOURCE_NODE *Rnode;
971 UINT16 StringLength = 0;
975 InitializerOp = Op->Asl.Child;
976 StringLength = RsGetStringDataLength (InitializerOp);
978 Rnode = RsAllocateResourceNode (
979 sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
981 Descriptor = Rnode->Buffer;
982 Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
983 Descriptor->ExtAddress64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
984 Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
986 Descriptor->ExtAddress64.ResourceLength = (UINT16)
987 (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
988 sizeof (AML_RESOURCE_LARGE_HEADER));
990 /* Process all child initialization nodes */
992 for (i = 0; InitializerOp; i++)
996 case 0: /* Resource Usage */
998 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
1001 case 1: /* DecodeType */
1003 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
1004 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
1005 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
1008 case 2: /* MinType */
1010 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
1011 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
1012 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
1015 case 3: /* MaxType */
1017 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
1018 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
1019 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
1022 case 4: /* Memory Type */
1024 RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 1, 0);
1025 RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
1026 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 1);
1029 case 5: /* Read/Write Type */
1031 RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 1);
1032 RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
1033 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0);
1036 case 6: /* Address Granularity */
1038 Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
1039 RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
1040 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
1043 case 7: /* Min Address */
1045 Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
1046 RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
1047 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
1050 case 8: /* Max Address */
1052 Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
1053 RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
1054 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
1057 case 9: /* Translation Offset */
1059 Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
1060 RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
1061 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
1064 case 10: /* Address Length */
1066 Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
1067 RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
1068 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
1071 case 11: /* Type-Specific Attributes */
1073 Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
1074 RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
1075 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
1078 case 12: /* ResourceTag */
1080 UtAttachNamepathToOwner (Op, InitializerOp);
1084 case 13: /* Address Range */
1086 RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 3, 0);
1087 RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
1088 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 3);
1093 RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0);
1094 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
1095 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5);
1100 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
1104 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
1107 Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
1112 /*******************************************************************************
1114 * FUNCTION: RsDoExtendedSpaceDescriptor
1116 * PARAMETERS: Op - Parent resource descriptor parse node
1117 * CurrentByteOffset - Offset into the resource template AML
1118 * buffer (to track references to the desc)
1120 * RETURN: Completed resource node
1122 * DESCRIPTION: Construct a long "ExtendedSpace" descriptor
1124 ******************************************************************************/
1127 RsDoExtendedSpaceDescriptor (
1128 ACPI_PARSE_OBJECT *Op,
1129 UINT32 CurrentByteOffset)
1131 AML_RESOURCE *Descriptor;
1132 ACPI_PARSE_OBJECT *InitializerOp;
1133 ASL_RESOURCE_NODE *Rnode;
1134 UINT16 StringLength = 0;
1138 InitializerOp = Op->Asl.Child;
1139 StringLength = RsGetStringDataLength (InitializerOp);
1141 Rnode = RsAllocateResourceNode (
1142 sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
1144 Descriptor = Rnode->Buffer;
1145 Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
1146 Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
1148 Descriptor->ExtAddress64.ResourceLength = (UINT16)
1149 (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
1150 sizeof (AML_RESOURCE_LARGE_HEADER));
1152 /* Process all child initialization nodes */
1154 for (i = 0; InitializerOp; i++)
1158 case 0: /* Resource Type */
1160 Descriptor->ExtAddress64.ResourceType =
1161 (UINT8) InitializerOp->Asl.Value.Integer;
1164 case 1: /* Resource Usage */
1166 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
1169 case 2: /* DecodeType */
1171 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
1172 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
1173 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
1176 case 3: /* MinType */
1178 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
1179 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
1180 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
1183 case 4: /* MaxType */
1185 RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
1186 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
1187 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
1190 case 5: /* Type-Specific flags */
1192 Descriptor->ExtAddress64.SpecificFlags =
1193 (UINT8) InitializerOp->Asl.Value.Integer;
1196 case 6: /* Address Granularity */
1198 Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
1199 RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
1200 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
1203 case 7: /* Min Address */
1205 Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
1206 RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
1207 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
1210 case 8: /* Max Address */
1212 Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
1213 RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
1214 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
1217 case 9: /* Translation Offset */
1219 Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
1220 RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
1221 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
1224 case 10: /* Address Length */
1226 Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
1227 RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
1228 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
1231 case 11: /* Type-Specific Attributes */
1233 Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
1234 RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
1235 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
1238 case 12: /* ResourceTag */
1240 UtAttachNamepathToOwner (Op, InitializerOp);
1245 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
1249 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
1252 Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
1257 /*******************************************************************************
1259 * FUNCTION: RsDoQwordIoDescriptor
1261 * PARAMETERS: Op - Parent resource descriptor parse node
1262 * CurrentByteOffset - Offset into the resource template AML
1263 * buffer (to track references to the desc)
1265 * RETURN: Completed resource node
1267 * DESCRIPTION: Construct a long "QwordIO" descriptor
1269 ******************************************************************************/
1272 RsDoQwordIoDescriptor (
1273 ACPI_PARSE_OBJECT *Op,
1274 UINT32 CurrentByteOffset)
1276 AML_RESOURCE *Descriptor;
1277 ACPI_PARSE_OBJECT *InitializerOp;
1278 ASL_RESOURCE_NODE *Rnode;
1279 UINT8 *OptionalFields;
1280 UINT16 StringLength = 0;
1281 UINT32 OptionIndex = 0;
1283 BOOLEAN ResSourceIndex = FALSE;
1286 InitializerOp = Op->Asl.Child;
1287 StringLength = RsGetStringDataLength (InitializerOp);
1289 Rnode = RsAllocateResourceNode (
1290 sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
1292 Descriptor = Rnode->Buffer;
1293 Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
1294 Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE;
1297 * Initial descriptor length -- may be enlarged if there are
1298 * optional fields present
1300 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
1301 Descriptor->Address64.ResourceLength = (UINT16)
1302 (sizeof (AML_RESOURCE_ADDRESS64) -
1303 sizeof (AML_RESOURCE_LARGE_HEADER));
1305 /* Process all child initialization nodes */
1307 for (i = 0; InitializerOp; i++)
1311 case 0: /* Resource Usage */
1313 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
1316 case 1: /* MinType */
1318 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
1319 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
1320 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
1323 case 2: /* MaxType */
1325 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
1326 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
1327 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
1330 case 3: /* DecodeType */
1332 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
1333 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
1334 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
1337 case 4: /* Range Type */
1339 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 3);
1340 RsCreateBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
1341 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0);
1344 case 5: /* Address Granularity */
1346 Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
1347 RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
1348 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
1351 case 6: /* Address Min */
1353 Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
1354 RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
1355 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
1358 case 7: /* Address Max */
1360 Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
1361 RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
1362 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
1365 case 8: /* Translation Offset */
1367 Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
1368 RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
1369 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
1372 case 9: /* Address Length */
1374 Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
1375 RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
1376 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
1379 case 10: /* ResSourceIndex [Optional Field - BYTE] */
1381 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
1383 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
1385 Descriptor->Address64.ResourceLength++;
1386 ResSourceIndex = TRUE;
1390 case 11: /* ResSource [Optional Field - STRING] */
1392 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
1393 (InitializerOp->Asl.Value.String))
1397 Descriptor->Address64.ResourceLength = (UINT16)
1398 (Descriptor->Address64.ResourceLength + StringLength);
1401 &OptionalFields[OptionIndex],
1402 InitializerOp->Asl.Value.String);
1404 /* ResourceSourceIndex must also be valid */
1406 if (!ResSourceIndex)
1408 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
1409 InitializerOp, NULL);
1416 * Not a valid ResourceSource, ResourceSourceIndex must also
1419 else if (ResSourceIndex)
1421 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
1422 InitializerOp, NULL);
1427 case 12: /* ResourceTag */
1429 UtAttachNamepathToOwner (Op, InitializerOp);
1434 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 4, 0);
1435 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
1436 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 4);
1439 case 14: /* Translation Type */
1441 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0);
1442 RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
1443 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5);
1448 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
1452 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
1455 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
1456 OptionIndex + StringLength;
1461 /*******************************************************************************
1463 * FUNCTION: RsDoQwordMemoryDescriptor
1465 * PARAMETERS: Op - Parent resource descriptor parse node
1466 * CurrentByteOffset - Offset into the resource template AML
1467 * buffer (to track references to the desc)
1469 * RETURN: Completed resource node
1471 * DESCRIPTION: Construct a long "QwordMemory" descriptor
1473 ******************************************************************************/
1476 RsDoQwordMemoryDescriptor (
1477 ACPI_PARSE_OBJECT *Op,
1478 UINT32 CurrentByteOffset)
1480 AML_RESOURCE *Descriptor;
1481 ACPI_PARSE_OBJECT *InitializerOp;
1482 ASL_RESOURCE_NODE *Rnode;
1483 UINT8 *OptionalFields;
1484 UINT16 StringLength = 0;
1485 UINT32 OptionIndex = 0;
1487 BOOLEAN ResSourceIndex = FALSE;
1490 InitializerOp = Op->Asl.Child;
1491 StringLength = RsGetStringDataLength (InitializerOp);
1493 Rnode = RsAllocateResourceNode (
1494 sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
1496 Descriptor = Rnode->Buffer;
1497 Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
1498 Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
1501 * Initial descriptor length -- may be enlarged if there are
1502 * optional fields present
1504 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
1505 Descriptor->Address64.ResourceLength = (UINT16)
1506 (sizeof (AML_RESOURCE_ADDRESS64) -
1507 sizeof (AML_RESOURCE_LARGE_HEADER));
1509 /* Process all child initialization nodes */
1511 for (i = 0; InitializerOp; i++)
1515 case 0: /* Resource Usage */
1517 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
1520 case 1: /* DecodeType */
1522 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
1523 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
1524 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
1527 case 2: /* MinType */
1529 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
1530 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
1531 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
1534 case 3: /* MaxType */
1536 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
1537 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
1538 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
1541 case 4: /* Memory Type */
1543 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 1, 0);
1544 RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
1545 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 1);
1548 case 5: /* Read/Write Type */
1550 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 1);
1551 RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
1552 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0);
1555 case 6: /* Address Granularity */
1557 Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
1558 RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
1559 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
1562 case 7: /* Min Address */
1564 Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
1565 RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
1566 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
1569 case 8: /* Max Address */
1571 Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
1572 RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
1573 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
1576 case 9: /* Translation Offset */
1578 Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
1579 RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
1580 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
1583 case 10: /* Address Length */
1585 Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
1586 RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
1587 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
1590 case 11: /* ResSourceIndex [Optional Field - BYTE] */
1592 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
1594 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
1596 Descriptor->Address64.ResourceLength++;
1597 ResSourceIndex = TRUE;
1601 case 12: /* ResSource [Optional Field - STRING] */
1603 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
1604 (InitializerOp->Asl.Value.String))
1608 Descriptor->Address64.ResourceLength = (UINT16)
1609 (Descriptor->Address64.ResourceLength + StringLength);
1612 &OptionalFields[OptionIndex],
1613 InitializerOp->Asl.Value.String);
1615 /* ResourceSourceIndex must also be valid */
1617 if (!ResSourceIndex)
1619 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
1620 InitializerOp, NULL);
1627 * Not a valid ResourceSource, ResourceSourceIndex must also
1630 else if (ResSourceIndex)
1632 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
1633 InitializerOp, NULL);
1638 case 13: /* ResourceTag */
1640 UtAttachNamepathToOwner (Op, InitializerOp);
1644 case 14: /* Address Range */
1646 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 3, 0);
1647 RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
1648 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 3);
1653 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0);
1654 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
1655 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5);
1660 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
1664 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
1667 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
1668 OptionIndex + StringLength;
1673 /*******************************************************************************
1675 * FUNCTION: RsDoQwordSpaceDescriptor
1677 * PARAMETERS: Op - Parent resource descriptor parse node
1678 * CurrentByteOffset - Offset into the resource template AML
1679 * buffer (to track references to the desc)
1681 * RETURN: Completed resource node
1683 * DESCRIPTION: Construct a long "QwordSpace" descriptor
1685 ******************************************************************************/
1688 RsDoQwordSpaceDescriptor (
1689 ACPI_PARSE_OBJECT *Op,
1690 UINT32 CurrentByteOffset)
1692 AML_RESOURCE *Descriptor;
1693 ACPI_PARSE_OBJECT *InitializerOp;
1694 ASL_RESOURCE_NODE *Rnode;
1695 UINT8 *OptionalFields;
1696 UINT16 StringLength = 0;
1697 UINT32 OptionIndex = 0;
1699 BOOLEAN ResSourceIndex = FALSE;
1702 InitializerOp = Op->Asl.Child;
1703 StringLength = RsGetStringDataLength (InitializerOp);
1705 Rnode = RsAllocateResourceNode (
1706 sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
1708 Descriptor = Rnode->Buffer;
1709 Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
1712 * Initial descriptor length -- may be enlarged if there are
1713 * optional fields present
1715 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
1716 Descriptor->Address64.ResourceLength = (UINT16)
1717 (sizeof (AML_RESOURCE_ADDRESS64) -
1718 sizeof (AML_RESOURCE_LARGE_HEADER));
1720 /* Process all child initialization nodes */
1722 for (i = 0; InitializerOp; i++)
1726 case 0: /* Resource Type */
1728 Descriptor->Address64.ResourceType =
1729 (UINT8) InitializerOp->Asl.Value.Integer;
1732 case 1: /* Resource Usage */
1734 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
1737 case 2: /* DecodeType */
1739 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
1740 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
1741 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
1744 case 3: /* MinType */
1746 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
1747 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
1748 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
1751 case 4: /* MaxType */
1753 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
1754 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
1755 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
1758 case 5: /* Type-Specific flags */
1760 Descriptor->Address64.SpecificFlags =
1761 (UINT8) InitializerOp->Asl.Value.Integer;
1764 case 6: /* Address Granularity */
1766 Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
1767 RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
1768 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
1771 case 7: /* Min Address */
1773 Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
1774 RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
1775 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
1778 case 8: /* Max Address */
1780 Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
1781 RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
1782 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
1785 case 9: /* Translation Offset */
1787 Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
1788 RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
1789 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
1792 case 10: /* Address Length */
1794 Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
1795 RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
1796 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
1799 case 11: /* ResSourceIndex [Optional Field - BYTE] */
1801 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
1803 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
1805 Descriptor->Address64.ResourceLength++;
1806 ResSourceIndex = TRUE;
1810 case 12: /* ResSource [Optional Field - STRING] */
1812 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
1813 (InitializerOp->Asl.Value.String))
1817 Descriptor->Address64.ResourceLength = (UINT16)
1818 (Descriptor->Address64.ResourceLength + StringLength);
1821 &OptionalFields[OptionIndex],
1822 InitializerOp->Asl.Value.String);
1824 /* ResourceSourceIndex must also be valid */
1826 if (!ResSourceIndex)
1828 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
1829 InitializerOp, NULL);
1836 * Not a valid ResourceSource, ResourceSourceIndex must also
1839 else if (ResSourceIndex)
1841 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
1842 InitializerOp, NULL);
1847 case 13: /* ResourceTag */
1849 UtAttachNamepathToOwner (Op, InitializerOp);
1854 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
1858 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
1861 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
1862 OptionIndex + StringLength;
1867 /*******************************************************************************
1869 * FUNCTION: RsDoWordIoDescriptor
1871 * PARAMETERS: Op - Parent resource descriptor parse node
1872 * CurrentByteOffset - Offset into the resource template AML
1873 * buffer (to track references to the desc)
1875 * RETURN: Completed resource node
1877 * DESCRIPTION: Construct a long "WordIO" descriptor
1879 ******************************************************************************/
1882 RsDoWordIoDescriptor (
1883 ACPI_PARSE_OBJECT *Op,
1884 UINT32 CurrentByteOffset)
1886 AML_RESOURCE *Descriptor;
1887 ACPI_PARSE_OBJECT *InitializerOp;
1888 ASL_RESOURCE_NODE *Rnode;
1889 UINT8 *OptionalFields;
1890 UINT16 StringLength = 0;
1891 UINT32 OptionIndex = 0;
1893 BOOLEAN ResSourceIndex = FALSE;
1896 InitializerOp = Op->Asl.Child;
1897 StringLength = RsGetStringDataLength (InitializerOp);
1899 Rnode = RsAllocateResourceNode (
1900 sizeof (AML_RESOURCE_ADDRESS16) + 1 + StringLength);
1902 Descriptor = Rnode->Buffer;
1903 Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16;
1904 Descriptor->Address16.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE;
1907 * Initial descriptor length -- may be enlarged if there are
1908 * optional fields present
1910 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16);
1911 Descriptor->Address16.ResourceLength = (UINT16)
1912 (sizeof (AML_RESOURCE_ADDRESS16) -
1913 sizeof (AML_RESOURCE_LARGE_HEADER));
1915 /* Process all child initialization nodes */
1917 for (i = 0; InitializerOp; i++)
1921 case 0: /* Resource Usage */
1923 RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 0, 1);
1926 case 1: /* MinType */
1928 RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0);
1929 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
1930 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2);
1933 case 2: /* MaxType */
1935 RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0);
1936 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
1937 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3);
1940 case 3: /* DecodeType */
1942 RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0);
1943 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
1944 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1);
1947 case 4: /* Range Type */
1949 RsSetFlagBits (&Descriptor->Address16.SpecificFlags, InitializerOp, 0, 3);
1950 RsCreateBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
1951 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.SpecificFlags), 0);
1954 case 5: /* Address Granularity */
1956 Descriptor->Address16.Granularity = (UINT16) InitializerOp->Asl.Value.Integer;
1957 RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
1958 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
1961 case 6: /* Address Min */
1963 Descriptor->Address16.Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
1964 RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
1965 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
1968 case 7: /* Address Max */
1970 Descriptor->Address16.Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
1971 RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
1972 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
1975 case 8: /* Translation Offset */
1977 Descriptor->Address16.TranslationOffset = (UINT16) InitializerOp->Asl.Value.Integer;
1978 RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
1979 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
1982 case 9: /* Address Length */
1984 Descriptor->Address16.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;
1985 RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
1986 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength));
1989 case 10: /* ResSourceIndex [Optional Field - BYTE] */
1991 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
1993 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
1995 Descriptor->Address16.ResourceLength++;
1996 ResSourceIndex = TRUE;
2000 case 11: /* ResSource [Optional Field - STRING] */
2002 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
2003 (InitializerOp->Asl.Value.String))
2007 Descriptor->Address16.ResourceLength = (UINT16)
2008 (Descriptor->Address16.ResourceLength + StringLength);
2011 &OptionalFields[OptionIndex],
2012 InitializerOp->Asl.Value.String);
2014 /* ResourceSourceIndex must also be valid */
2016 if (!ResSourceIndex)
2018 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
2019 InitializerOp, NULL);
2026 * Not a valid ResourceSource, ResourceSourceIndex must also
2029 else if (ResSourceIndex)
2031 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
2032 InitializerOp, NULL);
2037 case 12: /* ResourceTag */
2039 UtAttachNamepathToOwner (Op, InitializerOp);
2044 RsSetFlagBits (&Descriptor->Address16.SpecificFlags, InitializerOp, 4, 0);
2045 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
2046 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.SpecificFlags), 4);
2049 case 14: /* Translation Type */
2051 RsSetFlagBits (&Descriptor->Address16.SpecificFlags, InitializerOp, 5, 0);
2052 RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
2053 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.SpecificFlags), 5);
2058 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
2062 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
2065 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
2066 OptionIndex + StringLength;
2071 /*******************************************************************************
2073 * FUNCTION: RsDoWordBusNumberDescriptor
2075 * PARAMETERS: Op - Parent resource descriptor parse node
2076 * CurrentByteOffset - Offset into the resource template AML
2077 * buffer (to track references to the desc)
2079 * RETURN: Completed resource node
2081 * DESCRIPTION: Construct a long "WordBusNumber" descriptor
2083 ******************************************************************************/
2086 RsDoWordBusNumberDescriptor (
2087 ACPI_PARSE_OBJECT *Op,
2088 UINT32 CurrentByteOffset)
2090 AML_RESOURCE *Descriptor;
2091 ACPI_PARSE_OBJECT *InitializerOp;
2092 ASL_RESOURCE_NODE *Rnode;
2093 UINT8 *OptionalFields;
2094 UINT16 StringLength = 0;
2095 UINT32 OptionIndex = 0;
2097 BOOLEAN ResSourceIndex = FALSE;
2100 InitializerOp = Op->Asl.Child;
2101 StringLength = RsGetStringDataLength (InitializerOp);
2103 Rnode = RsAllocateResourceNode (
2104 sizeof (AML_RESOURCE_ADDRESS16) + 1 + StringLength);
2106 Descriptor = Rnode->Buffer;
2107 Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16;
2108 Descriptor->Address16.ResourceType = ACPI_ADDRESS_TYPE_BUS_NUMBER_RANGE;
2111 * Initial descriptor length -- may be enlarged if there are
2112 * optional fields present
2114 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16);
2115 Descriptor->Address16.ResourceLength = (UINT16)
2116 (sizeof (AML_RESOURCE_ADDRESS16) -
2117 sizeof (AML_RESOURCE_LARGE_HEADER));
2119 /* Process all child initialization nodes */
2121 for (i = 0; InitializerOp; i++)
2125 case 0: /* Resource Usage */
2127 RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 0, 1);
2130 case 1: /* MinType */
2132 RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0);
2133 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
2134 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2);
2137 case 2: /* MaxType */
2139 RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0);
2140 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
2141 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3);
2144 case 3: /* DecodeType */
2146 RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0);
2147 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
2148 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1);
2151 case 4: /* Address Granularity */
2153 Descriptor->Address16.Granularity =
2154 (UINT16) InitializerOp->Asl.Value.Integer;
2155 RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
2156 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
2159 case 5: /* Min Address */
2161 Descriptor->Address16.Minimum =
2162 (UINT16) InitializerOp->Asl.Value.Integer;
2163 RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
2164 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
2167 case 6: /* Max Address */
2169 Descriptor->Address16.Maximum =
2170 (UINT16) InitializerOp->Asl.Value.Integer;
2171 RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
2172 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
2175 case 7: /* Translation Offset */
2177 Descriptor->Address16.TranslationOffset =
2178 (UINT16) InitializerOp->Asl.Value.Integer;
2179 RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
2180 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
2183 case 8: /* Address Length */
2185 Descriptor->Address16.AddressLength =
2186 (UINT16) InitializerOp->Asl.Value.Integer;
2187 RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
2188 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength));
2191 case 9: /* ResSourceIndex [Optional Field - BYTE] */
2193 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
2195 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
2197 Descriptor->Address16.ResourceLength++;
2198 ResSourceIndex = TRUE;
2202 case 10: /* ResSource [Optional Field - STRING] */
2204 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
2205 (InitializerOp->Asl.Value.String))
2209 Descriptor->Address16.ResourceLength = (UINT16)
2210 (Descriptor->Address16.ResourceLength + StringLength);
2213 &OptionalFields[OptionIndex],
2214 InitializerOp->Asl.Value.String);
2216 /* ResourceSourceIndex must also be valid */
2218 if (!ResSourceIndex)
2220 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
2221 InitializerOp, NULL);
2228 * Not a valid ResourceSource, ResourceSourceIndex must also
2231 else if (ResSourceIndex)
2233 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
2234 InitializerOp, NULL);
2239 case 11: /* ResourceTag */
2241 UtAttachNamepathToOwner (Op, InitializerOp);
2246 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
2250 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
2253 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
2254 OptionIndex + StringLength;
2259 /*******************************************************************************
2261 * FUNCTION: RsDoWordSpaceDescriptor
2263 * PARAMETERS: Op - Parent resource descriptor parse node
2264 * CurrentByteOffset - Offset into the resource template AML
2265 * buffer (to track references to the desc)
2267 * RETURN: Completed resource node
2269 * DESCRIPTION: Construct a long "WordSpace" descriptor
2271 ******************************************************************************/
2274 RsDoWordSpaceDescriptor (
2275 ACPI_PARSE_OBJECT *Op,
2276 UINT32 CurrentByteOffset)
2278 AML_RESOURCE *Descriptor;
2279 ACPI_PARSE_OBJECT *InitializerOp;
2280 ASL_RESOURCE_NODE *Rnode;
2281 UINT8 *OptionalFields;
2282 UINT16 StringLength = 0;
2283 UINT32 OptionIndex = 0;
2285 BOOLEAN ResSourceIndex = FALSE;
2288 InitializerOp = Op->Asl.Child;
2289 StringLength = RsGetStringDataLength (InitializerOp);
2291 Rnode = RsAllocateResourceNode (
2292 sizeof (AML_RESOURCE_ADDRESS16) + 1 + StringLength);
2294 Descriptor = Rnode->Buffer;
2295 Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16;
2298 * Initial descriptor length -- may be enlarged if there are
2299 * optional fields present
2301 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16);
2302 Descriptor->Address16.ResourceLength = (UINT16)
2303 (sizeof (AML_RESOURCE_ADDRESS16) -
2304 sizeof (AML_RESOURCE_LARGE_HEADER));
2306 /* Process all child initialization nodes */
2308 for (i = 0; InitializerOp; i++)
2312 case 0: /* Resource Type */
2314 Descriptor->Address16.ResourceType =
2315 (UINT8) InitializerOp->Asl.Value.Integer;
2318 case 1: /* Resource Usage */
2320 RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 0, 1);
2323 case 2: /* DecodeType */
2325 RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0);
2326 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
2327 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1);
2330 case 3: /* MinType */
2332 RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0);
2333 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
2334 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2);
2337 case 4: /* MaxType */
2339 RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0);
2340 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
2341 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3);
2344 case 5: /* Type-Specific flags */
2346 Descriptor->Address16.SpecificFlags =
2347 (UINT8) InitializerOp->Asl.Value.Integer;
2350 case 6: /* Address Granularity */
2352 Descriptor->Address16.Granularity =
2353 (UINT16) InitializerOp->Asl.Value.Integer;
2354 RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
2355 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
2358 case 7: /* Min Address */
2360 Descriptor->Address16.Minimum =
2361 (UINT16) InitializerOp->Asl.Value.Integer;
2362 RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
2363 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
2366 case 8: /* Max Address */
2368 Descriptor->Address16.Maximum =
2369 (UINT16) InitializerOp->Asl.Value.Integer;
2370 RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
2371 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
2374 case 9: /* Translation Offset */
2376 Descriptor->Address16.TranslationOffset =
2377 (UINT16) InitializerOp->Asl.Value.Integer;
2378 RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
2379 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
2382 case 10: /* Address Length */
2384 Descriptor->Address16.AddressLength =
2385 (UINT16) InitializerOp->Asl.Value.Integer;
2386 RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
2387 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength));
2390 case 11: /* ResSourceIndex [Optional Field - BYTE] */
2392 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
2394 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
2396 Descriptor->Address16.ResourceLength++;
2397 ResSourceIndex = TRUE;
2401 case 12: /* ResSource [Optional Field - STRING] */
2403 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
2404 (InitializerOp->Asl.Value.String))
2408 Descriptor->Address16.ResourceLength = (UINT16)
2409 (Descriptor->Address16.ResourceLength + StringLength);
2412 &OptionalFields[OptionIndex],
2413 InitializerOp->Asl.Value.String);
2415 /* ResourceSourceIndex must also be valid */
2417 if (!ResSourceIndex)
2419 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
2420 InitializerOp, NULL);
2427 * Not a valid ResourceSource, ResourceSourceIndex must also
2430 else if (ResSourceIndex)
2432 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
2433 InitializerOp, NULL);
2438 case 13: /* ResourceTag */
2440 UtAttachNamepathToOwner (Op, InitializerOp);
2445 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
2449 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
2452 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
2453 OptionIndex + StringLength;
2458 /*******************************************************************************
2460 * FUNCTION: RsDoInterruptDescriptor
2462 * PARAMETERS: Op - Parent resource descriptor parse node
2463 * CurrentByteOffset - Offset into the resource template AML
2464 * buffer (to track references to the desc)
2466 * RETURN: Completed resource node
2468 * DESCRIPTION: Construct a long "Interrupt" descriptor
2470 ******************************************************************************/
2473 RsDoInterruptDescriptor (
2474 ACPI_PARSE_OBJECT *Op,
2475 UINT32 CurrentByteOffset)
2477 AML_RESOURCE *Descriptor;
2478 AML_RESOURCE *Rover = NULL;
2479 ACPI_PARSE_OBJECT *InitializerOp;
2480 ASL_RESOURCE_NODE *Rnode;
2481 UINT16 StringLength = 0;
2482 UINT32 OptionIndex = 0;
2484 BOOLEAN HasResSourceIndex = FALSE;
2485 UINT8 ResSourceIndex = 0;
2486 UINT8 *ResSourceString = NULL;
2489 InitializerOp = Op->Asl.Child;
2490 StringLength = RsGetStringDataLength (InitializerOp);
2493 /* Make room for the ResourceSourceIndex */
2498 /* Count the interrupt numbers */
2500 for (i = 0; InitializerOp; i++)
2502 InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
2511 InitializerOp = Op->Asl.Child;
2512 Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_EXTENDED_IRQ) +
2513 1 + OptionIndex + StringLength);
2515 Descriptor = Rnode->Buffer;
2516 Descriptor->ExtendedIrq.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_IRQ;
2519 * Initial descriptor length -- may be enlarged if there are
2520 * optional fields present
2522 Descriptor->ExtendedIrq.ResourceLength = 2; /* Flags and table length byte */
2523 Descriptor->ExtendedIrq.InterruptCount = 0;
2525 Rover = ACPI_CAST_PTR (AML_RESOURCE,
2526 (&(Descriptor->ExtendedIrq.Interrupts[0])));
2528 /* Process all child initialization nodes */
2530 for (i = 0; InitializerOp; i++)
2534 case 0: /* Resource Usage (Default: consumer (1) */
2536 RsSetFlagBits (&Descriptor->ExtendedIrq.Flags, InitializerOp, 0, 1);
2539 case 1: /* Interrupt Type (or Mode - edge/level) */
2541 RsSetFlagBits (&Descriptor->ExtendedIrq.Flags, InitializerOp, 1, 0);
2542 RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTTYPE,
2543 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtendedIrq.Flags), 1);
2546 case 2: /* Interrupt Level (or Polarity - Active high/low) */
2548 RsSetFlagBits (&Descriptor->ExtendedIrq.Flags, InitializerOp, 2, 0);
2549 RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTLEVEL,
2550 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtendedIrq.Flags), 2);
2553 case 3: /* Share Type - Default: exclusive (0) */
2555 RsSetFlagBits (&Descriptor->ExtendedIrq.Flags, InitializerOp, 3, 0);
2556 RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
2557 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtendedIrq.Flags), 3);
2560 case 4: /* ResSourceIndex [Optional Field - BYTE] */
2562 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
2564 HasResSourceIndex = TRUE;
2565 ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
2569 case 5: /* ResSource [Optional Field - STRING] */
2571 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
2572 (InitializerOp->Asl.Value.String))
2576 ResSourceString = (UINT8 *) InitializerOp->Asl.Value.String;
2579 /* ResourceSourceIndex must also be valid */
2581 if (!HasResSourceIndex)
2583 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
2584 InitializerOp, NULL);
2590 * Not a valid ResourceSource, ResourceSourceIndex must also
2593 else if (HasResSourceIndex)
2595 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
2596 InitializerOp, NULL);
2601 case 6: /* ResourceTag */
2603 UtAttachNamepathToOwner (Op, InitializerOp);
2608 * Interrupt Numbers come through here, repeatedly
2611 /* Maximum 255 interrupts allowed for this descriptor */
2613 if (Descriptor->ExtendedIrq.InterruptCount == 255)
2615 AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_LIST,
2616 InitializerOp, NULL);
2620 /* Each interrupt number must be a 32-bit value */
2622 if (InitializerOp->Asl.Value.Integer > ACPI_UINT32_MAX)
2624 AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_NUMBER,
2625 InitializerOp, NULL);
2628 /* Save the integer and move pointer to the next one */
2630 Rover->DwordItem = (UINT32) InitializerOp->Asl.Value.Integer;
2631 Rover = ACPI_ADD_PTR (AML_RESOURCE, &(Rover->DwordItem), 4);
2632 Descriptor->ExtendedIrq.InterruptCount++;
2633 Descriptor->ExtendedIrq.ResourceLength += 4;
2635 /* Case 7: First interrupt number in list */
2639 /* Check now for duplicates in list */
2641 RsCheckListForDuplicates (InitializerOp);
2643 /* Create a named field at the start of the list */
2645 RsCreateByteField (InitializerOp, ACPI_RESTAG_INTERRUPT,
2647 ASL_RESDESC_OFFSET (ExtendedIrq.Interrupts[0]));
2651 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
2655 /* Add optional ResSourceIndex if present */
2657 if (HasResSourceIndex)
2659 Rover->ByteItem = ResSourceIndex;
2660 Rover = ACPI_ADD_PTR (AML_RESOURCE, &(Rover->ByteItem), 1);
2661 Descriptor->ExtendedIrq.ResourceLength += 1;
2664 /* Add optional ResSource string if present */
2666 if (StringLength && ResSourceString)
2669 strcpy ((char *) Rover, (char *) ResSourceString);
2670 Rover = ACPI_ADD_PTR (
2671 AML_RESOURCE, &(Rover->ByteItem), StringLength);
2673 Descriptor->ExtendedIrq.ResourceLength = (UINT16)
2674 (Descriptor->ExtendedIrq.ResourceLength + StringLength);
2677 Rnode->BufferLength = (ASL_RESDESC_OFFSET (ExtendedIrq.Interrupts[0]) -
2678 ASL_RESDESC_OFFSET (ExtendedIrq.DescriptorType))
2679 + OptionIndex + StringLength;
2684 /*******************************************************************************
2686 * FUNCTION: RsDoVendorLargeDescriptor
2688 * PARAMETERS: Op - Parent resource descriptor parse node
2689 * CurrentByteOffset - Offset into the resource template AML
2690 * buffer (to track references to the desc)
2692 * RETURN: Completed resource node
2694 * DESCRIPTION: Construct a long "VendorLong" descriptor
2696 ******************************************************************************/
2699 RsDoVendorLargeDescriptor (
2700 ACPI_PARSE_OBJECT *Op,
2701 UINT32 CurrentByteOffset)
2703 AML_RESOURCE *Descriptor;
2704 ACPI_PARSE_OBJECT *InitializerOp;
2705 ASL_RESOURCE_NODE *Rnode;
2710 /* Count the number of data bytes */
2712 InitializerOp = Op->Asl.Child;
2713 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
2715 for (i = 0; InitializerOp; i++)
2717 if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
2721 InitializerOp = InitializerOp->Asl.Next;
2724 InitializerOp = Op->Asl.Child;
2725 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
2726 Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_VENDOR_LARGE) + i);
2728 Descriptor = Rnode->Buffer;
2729 Descriptor->VendorLarge.DescriptorType = ACPI_RESOURCE_NAME_VENDOR_LARGE;
2730 Descriptor->VendorLarge.ResourceLength = (UINT16) i;
2732 /* Point to end-of-descriptor for vendor data */
2734 VendorData = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_LARGE_HEADER);
2736 /* Process all child initialization nodes */
2738 for (i = 0; InitializerOp; i++)
2740 if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
2745 VendorData[i] = (UINT8) InitializerOp->Asl.Value.Integer;
2746 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
2753 /*******************************************************************************
2755 * FUNCTION: RsDoGeneralRegisterDescriptor
2757 * PARAMETERS: Op - Parent resource descriptor parse node
2758 * CurrentByteOffset - Offset into the resource template AML
2759 * buffer (to track references to the desc)
2761 * RETURN: Completed resource node
2763 * DESCRIPTION: Construct a long "Register" descriptor
2765 ******************************************************************************/
2768 RsDoGeneralRegisterDescriptor (
2769 ACPI_PARSE_OBJECT *Op,
2770 UINT32 CurrentByteOffset)
2772 AML_RESOURCE *Descriptor;
2773 ACPI_PARSE_OBJECT *InitializerOp;
2774 ASL_RESOURCE_NODE *Rnode;
2778 InitializerOp = Op->Asl.Child;
2779 Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_GENERIC_REGISTER));
2781 Descriptor = Rnode->Buffer;
2782 Descriptor->GenericReg.DescriptorType = ACPI_RESOURCE_NAME_GENERIC_REGISTER;
2783 Descriptor->GenericReg.ResourceLength = 12;
2785 /* Process all child initialization nodes */
2787 for (i = 0; InitializerOp; i++)
2791 case 0: /* Address space */
2793 Descriptor->GenericReg.AddressSpaceId = (UINT8) InitializerOp->Asl.Value.Integer;
2794 RsCreateByteField (InitializerOp, ACPI_RESTAG_ADDRESSSPACE,
2795 CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.AddressSpaceId));
2798 case 1: /* Register Bit Width */
2800 Descriptor->GenericReg.BitWidth = (UINT8) InitializerOp->Asl.Value.Integer;
2801 RsCreateByteField (InitializerOp, ACPI_RESTAG_REGISTERBITWIDTH,
2802 CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.BitWidth));
2805 case 2: /* Register Bit Offset */
2807 Descriptor->GenericReg.BitOffset = (UINT8) InitializerOp->Asl.Value.Integer;
2808 RsCreateByteField (InitializerOp, ACPI_RESTAG_REGISTERBITOFFSET,
2809 CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.BitOffset));
2812 case 3: /* Register Address */
2814 Descriptor->GenericReg.Address = InitializerOp->Asl.Value.Integer;
2815 RsCreateByteField (InitializerOp, ACPI_RESTAG_ADDRESS,
2816 CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.Address));
2819 case 4: /* Access Size (ACPI 3.0) */
2821 Descriptor->GenericReg.AccessSize = (UINT8) InitializerOp->Asl.Value.Integer;
2822 RsCreateByteField (InitializerOp, ACPI_RESTAG_ACCESSSIZE,
2823 CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.AccessSize));
2826 case 5: /* ResourceTag (ACPI 3.0b) */
2828 UtAttachNamepathToOwner (Op, InitializerOp);
2833 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
2837 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);