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