Home | History | Annotate | Line # | Download | only in compiler
      1 /******************************************************************************
      2  *
      3  * Module Name: aslrestype2w - Large Word 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    ("aslrestype2w")
     49 
     50 /*
     51  * This module contains the Word (16-bit) address space descriptors:
     52  *
     53  * WordIO
     54  * WordMemory
     55  * WordPcc
     56  * WordSpace
     57  */
     58 
     59 /*******************************************************************************
     60  *
     61  * FUNCTION:    RsDoWordIoDescriptor
     62  *
     63  * PARAMETERS:  Info                - Parse Op and resource template offset
     64  *
     65  * RETURN:      Completed resource node
     66  *
     67  * DESCRIPTION: Construct a long "WordIO" descriptor
     68  *
     69  ******************************************************************************/
     70 
     71 ASL_RESOURCE_NODE *
     72 RsDoWordIoDescriptor (
     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_ADDRESS16) + 1 + StringLength);
     96 
     97     Descriptor = Rnode->Buffer;
     98     Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16;
     99     Descriptor->Address16.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_ADDRESS16);
    106     Descriptor->Address16.ResourceLength = (UINT16)
    107         (sizeof (AML_RESOURCE_ADDRESS16) -
    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->Address16.Flags, InitializerOp, 0, 1);
    119             break;
    120 
    121         case 1: /* MinType */
    122 
    123             RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0);
    124             RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
    125                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2);
    126             break;
    127 
    128         case 2: /* MaxType */
    129 
    130             RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0);
    131             RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
    132                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3);
    133             break;
    134 
    135         case 3: /* DecodeType */
    136 
    137             RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0);
    138             RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
    139                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1);
    140             break;
    141 
    142         case 4: /* Range Type */
    143 
    144             RsSetFlagBits (&Descriptor->Address16.SpecificFlags, InitializerOp, 0, 3);
    145             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
    146                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.SpecificFlags), 0, 2);
    147             break;
    148 
    149         case 5: /* Address Granularity */
    150 
    151             Descriptor->Address16.Granularity = (UINT16) InitializerOp->Asl.Value.Integer;
    152             RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
    153                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
    154             GranOp = InitializerOp;
    155             break;
    156 
    157         case 6: /* Address Min */
    158 
    159             Descriptor->Address16.Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
    160             RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR,
    161                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
    162             MinOp = InitializerOp;
    163             break;
    164 
    165         case 7: /* Address Max */
    166 
    167             Descriptor->Address16.Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
    168             RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR,
    169                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
    170             MaxOp = InitializerOp;
    171             break;
    172 
    173         case 8: /* Translation Offset */
    174 
    175             Descriptor->Address16.TranslationOffset = (UINT16) InitializerOp->Asl.Value.Integer;
    176             RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
    177                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
    178             break;
    179 
    180         case 9: /* Address Length */
    181 
    182             Descriptor->Address16.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;
    183             RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH,
    184                  CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.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->Address16.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->Address16.ResourceLength = (UINT16)
    207                         (Descriptor->Address16.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->Address16.SpecificFlags, InitializerOp, 4, 0);
    244             RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
    245                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.SpecificFlags), 4);
    246             break;
    247 
    248         case 14: /* Translation Type */
    249 
    250             RsSetFlagBits (&Descriptor->Address16.SpecificFlags, InitializerOp, 5, 0);
    251             RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
    252                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.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         (UINT64) Descriptor->Address16.Minimum,
    268         (UINT64) Descriptor->Address16.Maximum,
    269         (UINT64) Descriptor->Address16.AddressLength,
    270         (UINT64) Descriptor->Address16.Granularity,
    271         Descriptor->Address16.Flags,
    272         MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp);
    273 
    274     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
    275         OptionIndex + StringLength;
    276     return (Rnode);
    277 }
    278 
    279 
    280 /*******************************************************************************
    281  *
    282  * FUNCTION:    RsDoWordBusNumberDescriptor
    283  *
    284  * PARAMETERS:  Info                - Parse Op and resource template offset
    285  *
    286  * RETURN:      Completed resource node
    287  *
    288  * DESCRIPTION: Construct a long "WordBusNumber" descriptor
    289  *
    290  ******************************************************************************/
    291 
    292 ASL_RESOURCE_NODE *
    293 RsDoWordBusNumberDescriptor (
    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_ADDRESS16) + 1 + StringLength);
    317 
    318     Descriptor = Rnode->Buffer;
    319     Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16;
    320     Descriptor->Address16.ResourceType = ACPI_ADDRESS_TYPE_BUS_NUMBER_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_ADDRESS16);
    327     Descriptor->Address16.ResourceLength = (UINT16)
    328         (sizeof (AML_RESOURCE_ADDRESS16) -
    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->Address16.Flags, InitializerOp, 0, 1);
    340             break;
    341 
    342         case 1: /* MinType */
    343 
    344             RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0);
    345             RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
    346                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2);
    347             break;
    348 
    349         case 2: /* MaxType */
    350 
    351             RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0);
    352             RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
    353                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3);
    354             break;
    355 
    356         case 3: /* DecodeType */
    357 
    358             RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0);
    359             RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
    360                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1);
    361             break;
    362 
    363         case 4: /* Address Granularity */
    364 
    365             Descriptor->Address16.Granularity =
    366                 (UINT16) InitializerOp->Asl.Value.Integer;
    367             RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
    368                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
    369             GranOp = InitializerOp;
    370             break;
    371 
    372         case 5: /* Min Address */
    373 
    374             Descriptor->Address16.Minimum =
    375                 (UINT16) InitializerOp->Asl.Value.Integer;
    376             RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR,
    377                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
    378             MinOp = InitializerOp;
    379             break;
    380 
    381         case 6: /* Max Address */
    382 
    383             Descriptor->Address16.Maximum =
    384                 (UINT16) InitializerOp->Asl.Value.Integer;
    385             RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR,
    386                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
    387             MaxOp = InitializerOp;
    388             break;
    389 
    390         case 7: /* Translation Offset */
    391 
    392             Descriptor->Address16.TranslationOffset =
    393                 (UINT16) InitializerOp->Asl.Value.Integer;
    394             RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
    395                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
    396             break;
    397 
    398         case 8: /* Address Length */
    399 
    400             Descriptor->Address16.AddressLength =
    401                 (UINT16) InitializerOp->Asl.Value.Integer;
    402             RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH,
    403                  CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength));
    404             LengthOp = InitializerOp;
    405             break;
    406 
    407         case 9: /* ResSourceIndex [Optional Field - BYTE] */
    408 
    409             if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
    410             {
    411                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
    412                 OptionIndex++;
    413                 Descriptor->Address16.ResourceLength++;
    414                 ResSourceIndex = TRUE;
    415             }
    416             break;
    417 
    418         case 10: /* ResSource [Optional Field - STRING] */
    419 
    420             if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
    421                 (InitializerOp->Asl.Value.String))
    422             {
    423                 if (StringLength)
    424                 {
    425                     Descriptor->Address16.ResourceLength = (UINT16)
    426                         (Descriptor->Address16.ResourceLength + StringLength);
    427 
    428                     strcpy ((char *)
    429                         &OptionalFields[OptionIndex],
    430                         InitializerOp->Asl.Value.String);
    431 
    432                     /* ResourceSourceIndex must also be valid */
    433 
    434                     if (!ResSourceIndex)
    435                     {
    436                         AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
    437                             InitializerOp, NULL);
    438                     }
    439                 }
    440             }
    441 
    442 #if 0
    443             /*
    444              * Not a valid ResourceSource, ResourceSourceIndex must also
    445              * be invalid
    446              */
    447             else if (ResSourceIndex)
    448             {
    449                 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
    450                     InitializerOp, NULL);
    451             }
    452 #endif
    453             break;
    454 
    455         case 11: /* ResourceTag */
    456 
    457             UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
    458             break;
    459 
    460         default:
    461 
    462             AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
    463             break;
    464         }
    465 
    466         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
    467     }
    468 
    469     /* Validate the Min/Max/Len/Gran values */
    470 
    471     RsLargeAddressCheck (
    472         (UINT64) Descriptor->Address16.Minimum,
    473         (UINT64) Descriptor->Address16.Maximum,
    474         (UINT64) Descriptor->Address16.AddressLength,
    475         (UINT64) Descriptor->Address16.Granularity,
    476         Descriptor->Address16.Flags,
    477         MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp);
    478 
    479     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
    480         OptionIndex + StringLength;
    481     return (Rnode);
    482 }
    483 
    484 
    485 /*******************************************************************************
    486  *
    487  * FUNCTION:    RsDoWordPccDescriptor
    488  *
    489  * PARAMETERS:  Info                - Parse Op and resource template offset
    490  *
    491  * RETURN:      Completed resource node
    492  *
    493  * DESCRIPTION: Construct a long "WordPcc" descriptor
    494  *
    495  ******************************************************************************/
    496 
    497 ASL_RESOURCE_NODE *
    498 RsDoWordPccDescriptor (
    499     ASL_RESOURCE_INFO       *Info)
    500 {
    501     AML_RESOURCE            *Descriptor;
    502     ACPI_PARSE_OBJECT       *InitializerOp;
    503     ACPI_PARSE_OBJECT       *MinOp = NULL;
    504     ACPI_PARSE_OBJECT       *MaxOp = NULL;
    505     ACPI_PARSE_OBJECT       *LengthOp = NULL;
    506     ACPI_PARSE_OBJECT       *GranOp = NULL;
    507     ASL_RESOURCE_NODE       *Rnode;
    508     UINT16                  StringLength = 0;
    509     UINT32                  OptionIndex = 0;
    510     UINT8                   *OptionalFields;
    511     UINT32                  i;
    512     BOOLEAN                 ResSourceIndex = FALSE;
    513 
    514 
    515     InitializerOp = Info->DescriptorTypeOp->Asl.Child;
    516     StringLength = RsGetStringDataLength (InitializerOp);
    517 
    518     Rnode = RsAllocateResourceNode (
    519         sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength);
    520 
    521     Descriptor = Rnode->Buffer;
    522     Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32;
    523     Descriptor->Address32.ResourceType  = ACPI_ADDRESS_TYPE_PCC_NUMBER;
    524 
    525     /*
    526      * Initial descriptor length -- may be enlarged if there are
    527      * optional fields present
    528      */
    529     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
    530     Descriptor->Address32.ResourceLength = (UINT16)
    531         (sizeof (AML_RESOURCE_ADDRESS32) -
    532          sizeof (AML_RESOURCE_LARGE_HEADER));
    533 
    534 
    535     /*
    536     * Bit [3] Max Address Fixed, _MAF: 1 (max address is fixed)
    537     * Bit [2] Min Address Fixed,_MIF: 1 (min address is fixed)
    538     * Bit [1] Decode Type, _DEC: 0 (do not care)
    539     * BIT [0] Ignored (must be zero)
    540     */
    541     Descriptor->Address32.Flags = 0b1100;
    542 
    543     // No type specific flags. Set to 0.
    544     Descriptor->Address32.SpecificFlags = 0;
    545 
    546     // must be set to zero if _MAX == _MIN.
    547     Descriptor->Address32.Granularity = 0x0;
    548     /* Process all child initialization nodes */
    549 
    550     // No translation offset.
    551     Descriptor->Address32.TranslationOffset = 0;
    552 
    553     // Pcc is unique address.
    554     Descriptor->Address32.AddressLength = 1;
    555 
    556     for (i = 0; InitializerOp; i++)
    557     {
    558         switch (i)
    559         {
    560 
    561         case 0: /* Address Min = Max */
    562 
    563             Descriptor->Address32.Minimum =
    564                 (UINT32) InitializerOp->Asl.Value.Integer;
    565             Descriptor->Address32.Maximum =
    566                 (UINT32) InitializerOp->Asl.Value.Integer;
    567 
    568             break;
    569 
    570         case 1: /* ResSourceIndex [Optional Field - BYTE] */
    571 
    572             if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
    573             {
    574                 /* Found a valid ResourceSourceIndex */
    575 
    576                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
    577                 OptionIndex++;
    578                 Descriptor->Address32.ResourceLength++;
    579                 ResSourceIndex = TRUE;
    580             }
    581             break;
    582 
    583         case 2: /* ResSource [Optional Field - STRING] */
    584 
    585             if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
    586                 (InitializerOp->Asl.Value.String))
    587             {
    588                 if (StringLength)
    589                 {
    590                     /* Found a valid ResourceSource */
    591 
    592                     Descriptor->Address32.ResourceLength = (UINT16)
    593                         (Descriptor->Address32.ResourceLength + StringLength);
    594 
    595                     strcpy ((char *)
    596                         &OptionalFields[OptionIndex],
    597                         InitializerOp->Asl.Value.String);
    598 
    599                     /* ResourceSourceIndex must also be valid */
    600 
    601                     if (!ResSourceIndex)
    602                     {
    603                         AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
    604                             InitializerOp, NULL);
    605                     }
    606                 }
    607             }
    608 
    609             break;
    610 
    611         case 3: // DescriptorName
    612             UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
    613             break;
    614 
    615         default:
    616 
    617             AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
    618             break;
    619         }
    620 
    621         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
    622     }
    623 
    624     /* Validate the Min/Max/Len/Gran values */
    625 
    626     RsLargeAddressCheck (
    627         (UINT64) Descriptor->Address32.Minimum,
    628         (UINT64) Descriptor->Address32.Maximum,
    629         (UINT64) Descriptor->Address32.AddressLength,
    630         (UINT64) Descriptor->Address32.Granularity,
    631         Descriptor->Address32.Flags,
    632         MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp);
    633 
    634     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
    635         OptionIndex + StringLength;
    636     return (Rnode);
    637 }
    638 
    639 
    640 /*******************************************************************************
    641  *
    642  * FUNCTION:    RsDoWordSpaceDescriptor
    643  *
    644  * PARAMETERS:  Info                - Parse Op and resource template offset
    645  *
    646  * RETURN:      Completed resource node
    647  *
    648  * DESCRIPTION: Construct a long "WordSpace" descriptor
    649  *
    650  ******************************************************************************/
    651 
    652 ASL_RESOURCE_NODE *
    653 RsDoWordSpaceDescriptor (
    654     ASL_RESOURCE_INFO       *Info)
    655 {
    656     AML_RESOURCE            *Descriptor;
    657     ACPI_PARSE_OBJECT       *InitializerOp;
    658     ACPI_PARSE_OBJECT       *MinOp = NULL;
    659     ACPI_PARSE_OBJECT       *MaxOp = NULL;
    660     ACPI_PARSE_OBJECT       *LengthOp = NULL;
    661     ACPI_PARSE_OBJECT       *GranOp = NULL;
    662     ASL_RESOURCE_NODE       *Rnode;
    663     UINT8                   *OptionalFields;
    664     UINT16                  StringLength = 0;
    665     UINT32                  OptionIndex = 0;
    666     UINT32                  CurrentByteOffset;
    667     UINT32                  i;
    668     BOOLEAN                 ResSourceIndex = FALSE;
    669 
    670 
    671     InitializerOp = Info->DescriptorTypeOp->Asl.Child;
    672     StringLength = RsGetStringDataLength (InitializerOp);
    673     CurrentByteOffset = Info->CurrentByteOffset;
    674 
    675     Rnode = RsAllocateResourceNode (
    676         sizeof (AML_RESOURCE_ADDRESS16) + 1 + StringLength);
    677 
    678     Descriptor = Rnode->Buffer;
    679     Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16;
    680 
    681     /*
    682      * Initial descriptor length -- may be enlarged if there are
    683      * optional fields present
    684      */
    685     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16);
    686     Descriptor->Address16.ResourceLength = (UINT16)
    687         (sizeof (AML_RESOURCE_ADDRESS16) -
    688          sizeof (AML_RESOURCE_LARGE_HEADER));
    689 
    690     /* Process all child initialization nodes */
    691 
    692     for (i = 0; InitializerOp; i++)
    693     {
    694         switch (i)
    695         {
    696         case 0: /* Resource Type */
    697 
    698             Descriptor->Address16.ResourceType =
    699                 (UINT8) InitializerOp->Asl.Value.Integer;
    700             break;
    701 
    702         case 1: /* Resource Usage */
    703 
    704             RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 0, 1);
    705             break;
    706 
    707         case 2: /* DecodeType */
    708 
    709             RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0);
    710             RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
    711                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1);
    712             break;
    713 
    714         case 3: /* MinType */
    715 
    716             RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0);
    717             RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
    718                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2);
    719             break;
    720 
    721         case 4: /* MaxType */
    722 
    723             RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0);
    724             RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
    725                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3);
    726             break;
    727 
    728         case 5: /* Type-Specific flags */
    729 
    730             Descriptor->Address16.SpecificFlags =
    731                 (UINT8) InitializerOp->Asl.Value.Integer;
    732             break;
    733 
    734         case 6: /* Address Granularity */
    735 
    736             Descriptor->Address16.Granularity =
    737                 (UINT16) InitializerOp->Asl.Value.Integer;
    738             RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
    739                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
    740             GranOp = InitializerOp;
    741             break;
    742 
    743         case 7: /* Min Address */
    744 
    745             Descriptor->Address16.Minimum =
    746                 (UINT16) InitializerOp->Asl.Value.Integer;
    747             RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR,
    748                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
    749             MinOp = InitializerOp;
    750             break;
    751 
    752         case 8: /* Max Address */
    753 
    754             Descriptor->Address16.Maximum =
    755                 (UINT16) InitializerOp->Asl.Value.Integer;
    756             RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR,
    757                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
    758             MaxOp = InitializerOp;
    759             break;
    760 
    761         case 9: /* Translation Offset */
    762 
    763             Descriptor->Address16.TranslationOffset =
    764                 (UINT16) InitializerOp->Asl.Value.Integer;
    765             RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
    766                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
    767             break;
    768 
    769         case 10: /* Address Length */
    770 
    771             Descriptor->Address16.AddressLength =
    772                 (UINT16) InitializerOp->Asl.Value.Integer;
    773             RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH,
    774                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength));
    775             LengthOp = InitializerOp;
    776             break;
    777 
    778         case 11: /* ResSourceIndex [Optional Field - BYTE] */
    779 
    780             if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
    781             {
    782                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
    783                 OptionIndex++;
    784                 Descriptor->Address16.ResourceLength++;
    785                 ResSourceIndex = TRUE;
    786             }
    787             break;
    788 
    789         case 12: /* ResSource [Optional Field - STRING] */
    790 
    791             if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
    792                 (InitializerOp->Asl.Value.String))
    793             {
    794                 if (StringLength)
    795                 {
    796                     Descriptor->Address16.ResourceLength = (UINT16)
    797                         (Descriptor->Address16.ResourceLength + StringLength);
    798 
    799                     strcpy ((char *)
    800                         &OptionalFields[OptionIndex],
    801                         InitializerOp->Asl.Value.String);
    802 
    803                     /* ResourceSourceIndex must also be valid */
    804 
    805                     if (!ResSourceIndex)
    806                     {
    807                         AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
    808                             InitializerOp, NULL);
    809                     }
    810                 }
    811             }
    812 
    813 #if 0
    814             /*
    815              * Not a valid ResourceSource, ResourceSourceIndex must also
    816              * be invalid
    817              */
    818             else if (ResSourceIndex)
    819             {
    820                 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
    821                     InitializerOp, NULL);
    822             }
    823 #endif
    824             break;
    825 
    826         case 13: /* ResourceTag */
    827 
    828             UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
    829             break;
    830 
    831         default:
    832 
    833             AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
    834             break;
    835         }
    836 
    837         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
    838     }
    839 
    840     /* Validate the Min/Max/Len/Gran values */
    841 
    842     RsLargeAddressCheck (
    843         (UINT64) Descriptor->Address16.Minimum,
    844         (UINT64) Descriptor->Address16.Maximum,
    845         (UINT64) Descriptor->Address16.AddressLength,
    846         (UINT64) Descriptor->Address16.Granularity,
    847         Descriptor->Address16.Flags,
    848         MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp);
    849 
    850     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
    851         OptionIndex + StringLength;
    852     return (Rnode);
    853 }
    854