Home | History | Annotate | Line # | Download | only in compiler
      1 /******************************************************************************
      2  *
      3  * Module Name: aslrestype2q - Large QWord address resource descriptors
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2025, Intel Corp.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions, and the following disclaimer,
     16  *    without modification.
     17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  *    including a substantially similar Disclaimer requirement for further
     21  *    binary redistribution.
     22  * 3. Neither the names of the above-listed copyright holders nor the names
     23  *    of any contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * Alternatively, this software may be distributed under the terms of the
     27  * GNU General Public License ("GPL") version 2 as published by the Free
     28  * Software Foundation.
     29  *
     30  * NO WARRANTY
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  * POSSIBILITY OF SUCH DAMAGES.
     42  */
     43 
     44 #include "aslcompiler.h"
     45 #include "aslcompiler.y.h"
     46 
     47 #define _COMPONENT          ACPI_COMPILER
     48         ACPI_MODULE_NAME    ("aslrestype2q")
     49 
     50 /*
     51  * This module contains the QWord (64-bit) address space descriptors:
     52  *
     53  * QWordIO
     54  * QWordMemory
     55  * QwordPcc
     56  * QWordSpace
     57  */
     58 
     59 /*******************************************************************************
     60  *
     61  * FUNCTION:    RsDoQwordIoDescriptor
     62  *
     63  * PARAMETERS:  Info                - Parse Op and resource template offset
     64  *
     65  * RETURN:      Completed resource node
     66  *
     67  * DESCRIPTION: Construct a long "QwordIO" descriptor
     68  *
     69  ******************************************************************************/
     70 
     71 ASL_RESOURCE_NODE *
     72 RsDoQwordIoDescriptor (
     73     ASL_RESOURCE_INFO       *Info)
     74 {
     75     AML_RESOURCE            *Descriptor;
     76     ACPI_PARSE_OBJECT       *InitializerOp;
     77     ACPI_PARSE_OBJECT       *MinOp = NULL;
     78     ACPI_PARSE_OBJECT       *MaxOp = NULL;
     79     ACPI_PARSE_OBJECT       *LengthOp = NULL;
     80     ACPI_PARSE_OBJECT       *GranOp = NULL;
     81     ASL_RESOURCE_NODE       *Rnode;
     82     UINT8                   *OptionalFields;
     83     UINT16                  StringLength = 0;
     84     UINT32                  OptionIndex = 0;
     85     UINT32                  CurrentByteOffset;
     86     UINT32                  i;
     87     BOOLEAN                 ResSourceIndex = FALSE;
     88 
     89 
     90     InitializerOp = Info->DescriptorTypeOp->Asl.Child;
     91     StringLength = RsGetStringDataLength (InitializerOp);
     92     CurrentByteOffset = Info->CurrentByteOffset;
     93 
     94     Rnode = RsAllocateResourceNode (
     95         sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
     96 
     97     Descriptor = Rnode->Buffer;
     98     Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
     99     Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE;
    100 
    101     /*
    102      * Initial descriptor length -- may be enlarged if there are
    103      * optional fields present
    104      */
    105     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
    106     Descriptor->Address64.ResourceLength = (UINT16)
    107         (sizeof (AML_RESOURCE_ADDRESS64) -
    108          sizeof (AML_RESOURCE_LARGE_HEADER));
    109 
    110     /* Process all child initialization nodes */
    111 
    112     for (i = 0; InitializerOp; i++)
    113     {
    114         switch (i)
    115         {
    116         case 0: /* Resource Usage */
    117 
    118             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
    119             break;
    120 
    121         case 1: /* MinType */
    122 
    123             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
    124             RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
    125                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
    126             break;
    127 
    128         case 2: /* MaxType */
    129 
    130             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
    131             RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
    132                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
    133             break;
    134 
    135         case 3: /* DecodeType */
    136 
    137             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
    138             RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
    139                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
    140             break;
    141 
    142         case 4: /* Range Type */
    143 
    144             RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 3);
    145             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
    146                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0, 2);
    147             break;
    148 
    149         case 5: /* Address Granularity */
    150 
    151             Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
    152             RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
    153                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
    154             GranOp = InitializerOp;
    155             break;
    156 
    157         case 6: /* Address Min */
    158 
    159             Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
    160             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
    161                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
    162             MinOp = InitializerOp;
    163             break;
    164 
    165         case 7: /* Address Max */
    166 
    167             Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
    168             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
    169                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
    170             MaxOp = InitializerOp;
    171             break;
    172 
    173         case 8: /* Translation Offset */
    174 
    175             Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
    176             RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
    177                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
    178             break;
    179 
    180         case 9: /* Address Length */
    181 
    182             Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
    183             RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
    184                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
    185             LengthOp = InitializerOp;
    186             break;
    187 
    188         case 10: /* ResSourceIndex [Optional Field - BYTE] */
    189 
    190             if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
    191             {
    192                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
    193                 OptionIndex++;
    194                 Descriptor->Address64.ResourceLength++;
    195                 ResSourceIndex = TRUE;
    196             }
    197             break;
    198 
    199         case 11: /* ResSource [Optional Field - STRING] */
    200 
    201             if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
    202                 (InitializerOp->Asl.Value.String))
    203             {
    204                 if (StringLength)
    205                 {
    206                     Descriptor->Address64.ResourceLength = (UINT16)
    207                         (Descriptor->Address64.ResourceLength + StringLength);
    208 
    209                     strcpy ((char *)
    210                         &OptionalFields[OptionIndex],
    211                         InitializerOp->Asl.Value.String);
    212 
    213                     /* ResourceSourceIndex must also be valid */
    214 
    215                     if (!ResSourceIndex)
    216                     {
    217                         AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
    218                             InitializerOp, NULL);
    219                     }
    220                 }
    221             }
    222 
    223 #if 0
    224             /*
    225              * Not a valid ResourceSource, ResourceSourceIndex must also
    226              * be invalid
    227              */
    228             else if (ResSourceIndex)
    229             {
    230                 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
    231                     InitializerOp, NULL);
    232             }
    233 #endif
    234             break;
    235 
    236         case 12: /* ResourceTag */
    237 
    238             UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
    239             break;
    240 
    241         case 13: /* Type */
    242 
    243             RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 4, 0);
    244             RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
    245                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 4);
    246             break;
    247 
    248         case 14: /* Translation Type */
    249 
    250             RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0);
    251             RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
    252                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5);
    253             break;
    254 
    255         default:
    256 
    257             AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
    258             break;
    259         }
    260 
    261         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
    262     }
    263 
    264     /* Validate the Min/Max/Len/Gran values */
    265 
    266     RsLargeAddressCheck (
    267         Descriptor->Address64.Minimum,
    268         Descriptor->Address64.Maximum,
    269         Descriptor->Address64.AddressLength,
    270         Descriptor->Address64.Granularity,
    271         Descriptor->Address64.Flags,
    272         MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp);
    273 
    274     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
    275         OptionIndex + StringLength;
    276     return (Rnode);
    277 }
    278 
    279 
    280 /*******************************************************************************
    281  *
    282  * FUNCTION:    RsDoQwordMemoryDescriptor
    283  *
    284  * PARAMETERS:  Info                - Parse Op and resource template offset
    285  *
    286  * RETURN:      Completed resource node
    287  *
    288  * DESCRIPTION: Construct a long "QwordMemory" descriptor
    289  *
    290  ******************************************************************************/
    291 
    292 ASL_RESOURCE_NODE *
    293 RsDoQwordMemoryDescriptor (
    294     ASL_RESOURCE_INFO       *Info)
    295 {
    296     AML_RESOURCE            *Descriptor;
    297     ACPI_PARSE_OBJECT       *InitializerOp;
    298     ACPI_PARSE_OBJECT       *MinOp = NULL;
    299     ACPI_PARSE_OBJECT       *MaxOp = NULL;
    300     ACPI_PARSE_OBJECT       *LengthOp = NULL;
    301     ACPI_PARSE_OBJECT       *GranOp = NULL;
    302     ASL_RESOURCE_NODE       *Rnode;
    303     UINT8                   *OptionalFields;
    304     UINT16                  StringLength = 0;
    305     UINT32                  OptionIndex = 0;
    306     UINT32                  CurrentByteOffset;
    307     UINT32                  i;
    308     BOOLEAN                 ResSourceIndex = FALSE;
    309 
    310 
    311     InitializerOp = Info->DescriptorTypeOp->Asl.Child;
    312     StringLength = RsGetStringDataLength (InitializerOp);
    313     CurrentByteOffset = Info->CurrentByteOffset;
    314 
    315     Rnode = RsAllocateResourceNode (
    316         sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
    317 
    318     Descriptor = Rnode->Buffer;
    319     Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
    320     Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
    321 
    322     /*
    323      * Initial descriptor length -- may be enlarged if there are
    324      * optional fields present
    325      */
    326     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
    327     Descriptor->Address64.ResourceLength = (UINT16)
    328         (sizeof (AML_RESOURCE_ADDRESS64) -
    329          sizeof (AML_RESOURCE_LARGE_HEADER));
    330 
    331     /* Process all child initialization nodes */
    332 
    333     for (i = 0; InitializerOp; i++)
    334     {
    335         switch (i)
    336         {
    337         case 0: /* Resource Usage */
    338 
    339             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
    340             break;
    341 
    342         case 1: /* DecodeType */
    343 
    344             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
    345             RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
    346                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
    347             break;
    348 
    349         case 2: /* MinType */
    350 
    351             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
    352             RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
    353                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
    354             break;
    355 
    356         case 3: /* MaxType */
    357 
    358             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
    359             RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
    360                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
    361             break;
    362 
    363         case 4: /* Memory Type */
    364 
    365             RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 1, 0);
    366             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
    367                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 1, 2);
    368             break;
    369 
    370         case 5: /* Read/Write Type */
    371 
    372             RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 1);
    373             RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
    374                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0);
    375             break;
    376 
    377         case 6: /* Address Granularity */
    378 
    379             Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
    380             RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
    381                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
    382             GranOp = InitializerOp;
    383             break;
    384 
    385         case 7: /* Min Address */
    386 
    387             Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
    388             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
    389                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
    390             MinOp = InitializerOp;
    391             break;
    392 
    393         case 8: /* Max Address */
    394 
    395             Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
    396             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
    397                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
    398             MaxOp = InitializerOp;
    399             break;
    400 
    401         case 9: /* Translation Offset */
    402 
    403             Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
    404             RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
    405                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
    406             break;
    407 
    408         case 10: /* Address Length */
    409 
    410             Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
    411             RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
    412                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
    413             LengthOp = InitializerOp;
    414             break;
    415 
    416         case 11: /* ResSourceIndex [Optional Field - BYTE] */
    417 
    418             if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
    419             {
    420                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
    421                 OptionIndex++;
    422                 Descriptor->Address64.ResourceLength++;
    423                 ResSourceIndex = TRUE;
    424             }
    425             break;
    426 
    427         case 12: /* ResSource [Optional Field - STRING] */
    428 
    429             if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
    430                 (InitializerOp->Asl.Value.String))
    431             {
    432                 if (StringLength)
    433                 {
    434                     Descriptor->Address64.ResourceLength = (UINT16)
    435                         (Descriptor->Address64.ResourceLength + StringLength);
    436 
    437                     strcpy ((char *)
    438                         &OptionalFields[OptionIndex],
    439                         InitializerOp->Asl.Value.String);
    440 
    441                     /* ResourceSourceIndex must also be valid */
    442 
    443                     if (!ResSourceIndex)
    444                     {
    445                         AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
    446                             InitializerOp, NULL);
    447                     }
    448                 }
    449             }
    450 
    451 #if 0
    452             /*
    453              * Not a valid ResourceSource, ResourceSourceIndex must also
    454              * be invalid
    455              */
    456             else if (ResSourceIndex)
    457             {
    458                 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
    459                     InitializerOp, NULL);
    460             }
    461 #endif
    462             break;
    463 
    464         case 13: /* ResourceTag */
    465 
    466             UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
    467             break;
    468 
    469 
    470         case 14: /* Address Range */
    471 
    472             RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 3, 0);
    473             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
    474                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 3, 2);
    475             break;
    476 
    477         case 15: /* Type */
    478 
    479             RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0);
    480             RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
    481                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5);
    482             break;
    483 
    484         default:
    485 
    486             AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
    487             break;
    488         }
    489 
    490         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
    491     }
    492 
    493     /* Validate the Min/Max/Len/Gran values */
    494 
    495     RsLargeAddressCheck (
    496         Descriptor->Address64.Minimum,
    497         Descriptor->Address64.Maximum,
    498         Descriptor->Address64.AddressLength,
    499         Descriptor->Address64.Granularity,
    500         Descriptor->Address64.Flags,
    501         MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp);
    502 
    503     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
    504         OptionIndex + StringLength;
    505     return (Rnode);
    506 }
    507 
    508 
    509 /*******************************************************************************
    510  *
    511  * FUNCTION:    RsDoQwordPccDescriptor
    512  *
    513  * PARAMETERS:  Info                - Parse Op and resource template offset
    514  *
    515  * RETURN:      Completed resource node
    516  *
    517  * DESCRIPTION: Construct a long "QWordPcc" descriptor
    518  *
    519  ******************************************************************************/
    520 
    521 ASL_RESOURCE_NODE *
    522 RsDoQwordPccDescriptor (
    523     ASL_RESOURCE_INFO       *Info)
    524 {
    525     AML_RESOURCE            *Descriptor;
    526     ACPI_PARSE_OBJECT       *InitializerOp;
    527     ACPI_PARSE_OBJECT       *MinOp = NULL;
    528     ACPI_PARSE_OBJECT       *MaxOp = NULL;
    529     ACPI_PARSE_OBJECT       *LengthOp = NULL;
    530     ACPI_PARSE_OBJECT       *GranOp = NULL;
    531     ASL_RESOURCE_NODE       *Rnode;
    532     UINT16                  StringLength = 0;
    533     UINT32                  OptionIndex = 0;
    534     UINT8                   *OptionalFields;
    535     UINT32                  i;
    536     BOOLEAN                 ResSourceIndex = FALSE;
    537 
    538 
    539     InitializerOp = Info->DescriptorTypeOp->Asl.Child;
    540     StringLength = RsGetStringDataLength (InitializerOp);
    541 
    542     Rnode = RsAllocateResourceNode (
    543         sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength);
    544 
    545     Descriptor = Rnode->Buffer;
    546     Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32;
    547     Descriptor->Address32.ResourceType  = ACPI_ADDRESS_TYPE_PCC_NUMBER;
    548 
    549     /*
    550      * Initial descriptor length -- may be enlarged if there are
    551      * optional fields present
    552      */
    553     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
    554     Descriptor->Address32.ResourceLength = (UINT16)
    555         (sizeof (AML_RESOURCE_ADDRESS32) -
    556          sizeof (AML_RESOURCE_LARGE_HEADER));
    557 
    558 
    559     /*
    560     * Bit [3] Max Address Fixed, _MAF: 1 (max address is fixed)
    561     * Bit [2] Min Address Fixed,_MIF: 1 (min address is fixed)
    562     * Bit [1] Decode Type, _DEC: 0 (do not care)
    563     * BIT [0] Ignored (must be zero)
    564     */
    565     Descriptor->Address32.Flags = 0b1100;
    566 
    567     // No type specific flags. Set to 0.
    568     Descriptor->Address32.SpecificFlags = 0;
    569 
    570     // must be set to zero if _MAX == _MIN.
    571     Descriptor->Address32.Granularity = 0x0;
    572     /* Process all child initialization nodes */
    573 
    574     // No translation offset.
    575     Descriptor->Address32.TranslationOffset = 0;
    576 
    577     // Pcc is unique address.
    578     Descriptor->Address32.AddressLength = 1;
    579 
    580     for (i = 0; InitializerOp; i++)
    581     {
    582         switch (i)
    583         {
    584 
    585         case 0: /* Address Min = Max */
    586 
    587             Descriptor->Address32.Minimum =
    588                 (UINT32) InitializerOp->Asl.Value.Integer;
    589             Descriptor->Address32.Maximum =
    590                 (UINT32) InitializerOp->Asl.Value.Integer;
    591 
    592             break;
    593 
    594         case 1: /* ResSourceIndex [Optional Field - BYTE] */
    595 
    596             if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
    597             {
    598                 /* Found a valid ResourceSourceIndex */
    599 
    600                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
    601                 OptionIndex++;
    602                 Descriptor->Address32.ResourceLength++;
    603                 ResSourceIndex = TRUE;
    604             }
    605             break;
    606 
    607         case 2: /* ResSource [Optional Field - STRING] */
    608 
    609             if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
    610                 (InitializerOp->Asl.Value.String))
    611             {
    612                 if (StringLength)
    613                 {
    614                     /* Found a valid ResourceSource */
    615 
    616                     Descriptor->Address32.ResourceLength = (UINT16)
    617                         (Descriptor->Address32.ResourceLength + StringLength);
    618 
    619                     strcpy ((char *)
    620                         &OptionalFields[OptionIndex],
    621                         InitializerOp->Asl.Value.String);
    622 
    623                     /* ResourceSourceIndex must also be valid */
    624 
    625                     if (!ResSourceIndex)
    626                     {
    627                         AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
    628                             InitializerOp, NULL);
    629                     }
    630                 }
    631             }
    632 
    633             break;
    634 
    635         case 3: // DescriptorName
    636             UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
    637             break;
    638 
    639         default:
    640 
    641             AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
    642             break;
    643         }
    644 
    645         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
    646     }
    647 
    648     /* Validate the Min/Max/Len/Gran values */
    649 
    650     RsLargeAddressCheck (
    651         (UINT64) Descriptor->Address32.Minimum,
    652         (UINT64) Descriptor->Address32.Maximum,
    653         (UINT64) Descriptor->Address32.AddressLength,
    654         (UINT64) Descriptor->Address32.Granularity,
    655         Descriptor->Address32.Flags,
    656         MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp);
    657 
    658     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
    659         OptionIndex + StringLength;
    660     return (Rnode);
    661 }
    662 
    663 
    664 /*******************************************************************************
    665  *
    666  * FUNCTION:    RsDoQwordSpaceDescriptor
    667  *
    668  * PARAMETERS:  Info                - Parse Op and resource template offset
    669  *
    670  * RETURN:      Completed resource node
    671  *
    672  * DESCRIPTION: Construct a long "QwordSpace" descriptor
    673  *
    674  ******************************************************************************/
    675 
    676 ASL_RESOURCE_NODE *
    677 RsDoQwordSpaceDescriptor (
    678     ASL_RESOURCE_INFO       *Info)
    679 {
    680     AML_RESOURCE            *Descriptor;
    681     ACPI_PARSE_OBJECT       *InitializerOp;
    682     ACPI_PARSE_OBJECT       *MinOp = NULL;
    683     ACPI_PARSE_OBJECT       *MaxOp = NULL;
    684     ACPI_PARSE_OBJECT       *LengthOp = NULL;
    685     ACPI_PARSE_OBJECT       *GranOp = NULL;
    686     ASL_RESOURCE_NODE       *Rnode;
    687     UINT8                   *OptionalFields;
    688     UINT16                  StringLength = 0;
    689     UINT32                  OptionIndex = 0;
    690     UINT32                  CurrentByteOffset;
    691     UINT32                  i;
    692     BOOLEAN                 ResSourceIndex = FALSE;
    693 
    694 
    695     InitializerOp = Info->DescriptorTypeOp->Asl.Child;
    696     StringLength = RsGetStringDataLength (InitializerOp);
    697     CurrentByteOffset = Info->CurrentByteOffset;
    698 
    699     Rnode = RsAllocateResourceNode (
    700         sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
    701 
    702     Descriptor = Rnode->Buffer;
    703     Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
    704 
    705     /*
    706      * Initial descriptor length -- may be enlarged if there are
    707      * optional fields present
    708      */
    709     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
    710     Descriptor->Address64.ResourceLength = (UINT16)
    711         (sizeof (AML_RESOURCE_ADDRESS64) -
    712          sizeof (AML_RESOURCE_LARGE_HEADER));
    713 
    714     /* Process all child initialization nodes */
    715 
    716     for (i = 0; InitializerOp; i++)
    717     {
    718         switch (i)
    719         {
    720         case 0: /* Resource Type */
    721 
    722             Descriptor->Address64.ResourceType =
    723                 (UINT8) InitializerOp->Asl.Value.Integer;
    724             break;
    725 
    726         case 1: /* Resource Usage */
    727 
    728             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
    729             break;
    730 
    731         case 2: /* DecodeType */
    732 
    733             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
    734             RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
    735                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
    736             break;
    737 
    738         case 3: /* MinType */
    739 
    740             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
    741             RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
    742                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
    743             break;
    744 
    745         case 4: /* MaxType */
    746 
    747             RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
    748             RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
    749                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
    750             break;
    751 
    752         case 5: /* Type-Specific flags */
    753 
    754             Descriptor->Address64.SpecificFlags =
    755                 (UINT8) InitializerOp->Asl.Value.Integer;
    756             break;
    757 
    758         case 6: /* Address Granularity */
    759 
    760             Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
    761             RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
    762                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
    763             GranOp = InitializerOp;
    764             break;
    765 
    766         case 7: /* Min Address */
    767 
    768             Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
    769             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
    770                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
    771             MinOp = InitializerOp;
    772             break;
    773 
    774         case 8: /* Max Address */
    775 
    776             Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
    777             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
    778                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
    779             MaxOp = InitializerOp;
    780             break;
    781 
    782         case 9: /* Translation Offset */
    783 
    784             Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
    785             RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
    786                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
    787             break;
    788 
    789         case 10: /* Address Length */
    790 
    791             Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
    792             RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
    793                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
    794             LengthOp = InitializerOp;
    795             break;
    796 
    797         case 11: /* ResSourceIndex [Optional Field - BYTE] */
    798 
    799             if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
    800             {
    801                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
    802                 OptionIndex++;
    803                 Descriptor->Address64.ResourceLength++;
    804                 ResSourceIndex = TRUE;
    805             }
    806             break;
    807 
    808         case 12: /* ResSource [Optional Field - STRING] */
    809 
    810             if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
    811                 (InitializerOp->Asl.Value.String))
    812             {
    813                 if (StringLength)
    814                 {
    815                     Descriptor->Address64.ResourceLength = (UINT16)
    816                         (Descriptor->Address64.ResourceLength + StringLength);
    817 
    818                     strcpy ((char *)
    819                         &OptionalFields[OptionIndex],
    820                         InitializerOp->Asl.Value.String);
    821 
    822                     /* ResourceSourceIndex must also be valid */
    823 
    824                     if (!ResSourceIndex)
    825                     {
    826                         AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
    827                             InitializerOp, NULL);
    828                     }
    829                 }
    830             }
    831 
    832 #if 0
    833             /*
    834              * Not a valid ResourceSource, ResourceSourceIndex must also
    835              * be invalid
    836              */
    837             else if (ResSourceIndex)
    838             {
    839                 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
    840                     InitializerOp, NULL);
    841             }
    842 #endif
    843             break;
    844 
    845         case 13: /* ResourceTag */
    846 
    847             UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
    848             break;
    849 
    850         default:
    851 
    852             AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
    853             break;
    854         }
    855 
    856         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
    857     }
    858 
    859     /* Validate the Min/Max/Len/Gran values */
    860 
    861     RsLargeAddressCheck (
    862         Descriptor->Address64.Minimum,
    863         Descriptor->Address64.Maximum,
    864         Descriptor->Address64.AddressLength,
    865         Descriptor->Address64.Granularity,
    866         Descriptor->Address64.Flags,
    867         MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp);
    868 
    869     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
    870         OptionIndex + StringLength;
    871     return (Rnode);
    872 }
    873