Home | History | Annotate | Line # | Download | only in compiler
      1 /******************************************************************************
      2  *
      3  * Module Name: aslrestype1i - Small I/O-related 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    ("aslrestype1i")
     49 
     50 /*
     51  * This module contains the I/O-related small resource descriptors:
     52  *
     53  * DMA
     54  * FixedDMA
     55  * FixedIO
     56  * IO
     57  * IRQ
     58  * IRQNoFlags
     59  */
     60 
     61 /*******************************************************************************
     62  *
     63  * FUNCTION:    RsDoDmaDescriptor
     64  *
     65  * PARAMETERS:  Info                - Parse Op and resource template offset
     66  *
     67  * RETURN:      Completed resource node
     68  *
     69  * DESCRIPTION: Construct a short "DMA" descriptor
     70  *
     71  ******************************************************************************/
     72 
     73 ASL_RESOURCE_NODE *
     74 RsDoDmaDescriptor (
     75     ASL_RESOURCE_INFO       *Info)
     76 {
     77     AML_RESOURCE            *Descriptor;
     78     ACPI_PARSE_OBJECT       *InitializerOp;
     79     ASL_RESOURCE_NODE       *Rnode;
     80     UINT32                  CurrentByteOffset;
     81     UINT32                  i;
     82     UINT8                   DmaChannelMask = 0;
     83     UINT8                   DmaChannels = 0;
     84 
     85 
     86     InitializerOp = Info->DescriptorTypeOp->Asl.Child;
     87     CurrentByteOffset = Info->CurrentByteOffset;
     88     Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_DMA));
     89 
     90     Descriptor = Rnode->Buffer;
     91     Descriptor->Dma.DescriptorType =
     92         ACPI_RESOURCE_NAME_DMA | ASL_RDESC_DMA_SIZE;
     93 
     94     /* Process all child initialization nodes */
     95 
     96     for (i = 0; InitializerOp; i++)
     97     {
     98         switch (i)
     99         {
    100         case 0: /* DMA type */
    101 
    102             RsSetFlagBits (&Descriptor->Dma.Flags, InitializerOp, 5, 0);
    103             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_DMATYPE,
    104                 CurrentByteOffset + ASL_RESDESC_OFFSET (Dma.Flags), 5, 2);
    105             break;
    106 
    107         case 1: /* Bus Master */
    108 
    109             RsSetFlagBits (&Descriptor->Dma.Flags, InitializerOp, 2, 0);
    110             RsCreateBitField (InitializerOp, ACPI_RESTAG_BUSMASTER,
    111                 CurrentByteOffset + ASL_RESDESC_OFFSET (Dma.Flags), 2);
    112             break;
    113 
    114         case 2: /* Xfer Type (transfer width) */
    115 
    116             RsSetFlagBits (&Descriptor->Dma.Flags, InitializerOp, 0, 0);
    117             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_XFERTYPE,
    118                 CurrentByteOffset + ASL_RESDESC_OFFSET (Dma.Flags), 0, 2);
    119             break;
    120 
    121         case 3: /* Name */
    122 
    123             UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
    124             break;
    125 
    126         default:
    127 
    128             /* All DMA channel bytes are handled here, after flags and name */
    129 
    130             if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
    131             {
    132                 /* Up to 8 channels can be specified in the list */
    133 
    134                 DmaChannels++;
    135                 if (DmaChannels > 8)
    136                 {
    137                     AslError (ASL_ERROR, ASL_MSG_DMA_LIST,
    138                         InitializerOp, NULL);
    139                     return (Rnode);
    140                 }
    141 
    142                 /* Only DMA channels 0-7 are allowed (mask is 8 bits) */
    143 
    144                 if (InitializerOp->Asl.Value.Integer > 7)
    145                 {
    146                     AslError (ASL_ERROR, ASL_MSG_DMA_CHANNEL,
    147                         InitializerOp, NULL);
    148                 }
    149 
    150                 /* Build the mask */
    151 
    152                 DmaChannelMask |=
    153                     (1 << ((UINT8) InitializerOp->Asl.Value.Integer));
    154             }
    155 
    156             if (i == 4) /* case 4: First DMA byte */
    157             {
    158                 /* Check now for duplicates in list */
    159 
    160                 RsCheckListForDuplicates (InitializerOp);
    161 
    162                 /* Create a named field at the start of the list */
    163 
    164                 RsCreateByteField (InitializerOp, ACPI_RESTAG_DMA,
    165                     CurrentByteOffset +
    166                     ASL_RESDESC_OFFSET (Dma.DmaChannelMask));
    167             }
    168             break;
    169         }
    170 
    171         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
    172     }
    173 
    174     /* Now we can set the channel mask */
    175 
    176     Descriptor->Dma.DmaChannelMask = DmaChannelMask;
    177     return (Rnode);
    178 }
    179 
    180 
    181 /*******************************************************************************
    182  *
    183  * FUNCTION:    RsDoFixedDmaDescriptor
    184  *
    185  * PARAMETERS:  Info                - Parse Op and resource template offset
    186  *
    187  * RETURN:      Completed resource node
    188  *
    189  * DESCRIPTION: Construct a short "FixedDMA" descriptor
    190  *
    191  ******************************************************************************/
    192 
    193 ASL_RESOURCE_NODE *
    194 RsDoFixedDmaDescriptor (
    195     ASL_RESOURCE_INFO       *Info)
    196 {
    197     AML_RESOURCE            *Descriptor;
    198     ACPI_PARSE_OBJECT       *InitializerOp;
    199     ASL_RESOURCE_NODE       *Rnode;
    200     UINT32                  CurrentByteOffset;
    201     UINT32                  i;
    202 
    203 
    204     InitializerOp = Info->DescriptorTypeOp->Asl.Child;
    205     CurrentByteOffset = Info->CurrentByteOffset;
    206     Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_FIXED_DMA));
    207 
    208     Descriptor = Rnode->Buffer;
    209     Descriptor->FixedDma.DescriptorType =
    210         ACPI_RESOURCE_NAME_FIXED_DMA | ASL_RDESC_FIXED_DMA_SIZE;
    211 
    212     /* Process all child initialization nodes */
    213 
    214     for (i = 0; InitializerOp; i++)
    215     {
    216         switch (i)
    217         {
    218         case 0: /* DMA Request Lines [WORD] (_DMA) */
    219 
    220             Descriptor->FixedDma.RequestLines = (UINT16) InitializerOp->Asl.Value.Integer;
    221             RsCreateWordField (InitializerOp, ACPI_RESTAG_DMA,
    222                 CurrentByteOffset + ASL_RESDESC_OFFSET (FixedDma.RequestLines));
    223             break;
    224 
    225         case 1: /* DMA Channel [WORD] (_TYP) */
    226 
    227             Descriptor->FixedDma.Channels = (UINT16) InitializerOp->Asl.Value.Integer;
    228             RsCreateWordField (InitializerOp, ACPI_RESTAG_DMATYPE,
    229                 CurrentByteOffset + ASL_RESDESC_OFFSET (FixedDma.Channels));
    230             break;
    231 
    232         case 2: /* Transfer Width [BYTE] (_SIZ) */
    233 
    234             Descriptor->FixedDma.Width = (UINT8) InitializerOp->Asl.Value.Integer;
    235             RsCreateByteField (InitializerOp, ACPI_RESTAG_XFERTYPE,
    236                 CurrentByteOffset + ASL_RESDESC_OFFSET (FixedDma.Width));
    237             break;
    238 
    239         case 3: /* Descriptor Name (optional) */
    240 
    241             UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
    242             break;
    243 
    244         default:    /* Ignore any extra nodes */
    245 
    246             break;
    247         }
    248 
    249         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
    250     }
    251 
    252     return (Rnode);
    253 }
    254 
    255 
    256 /*******************************************************************************
    257  *
    258  * FUNCTION:    RsDoFixedIoDescriptor
    259  *
    260  * PARAMETERS:  Info                - Parse Op and resource template offset
    261  *
    262  * RETURN:      Completed resource node
    263  *
    264  * DESCRIPTION: Construct a short "FixedIO" descriptor
    265  *
    266  ******************************************************************************/
    267 
    268 ASL_RESOURCE_NODE *
    269 RsDoFixedIoDescriptor (
    270     ASL_RESOURCE_INFO       *Info)
    271 {
    272     AML_RESOURCE            *Descriptor;
    273     ACPI_PARSE_OBJECT       *InitializerOp;
    274     ACPI_PARSE_OBJECT       *AddressOp = NULL;
    275     ASL_RESOURCE_NODE       *Rnode;
    276     UINT32                  CurrentByteOffset;
    277     UINT32                  i;
    278 
    279 
    280     InitializerOp = Info->DescriptorTypeOp->Asl.Child;
    281     CurrentByteOffset = Info->CurrentByteOffset;
    282     Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_FIXED_IO));
    283 
    284     Descriptor = Rnode->Buffer;
    285     Descriptor->Io.DescriptorType =
    286         ACPI_RESOURCE_NAME_FIXED_IO | ASL_RDESC_FIXED_IO_SIZE;
    287 
    288     /* Process all child initialization nodes */
    289 
    290     for (i = 0; InitializerOp; i++)
    291     {
    292         switch (i)
    293         {
    294         case 0: /* Base Address */
    295 
    296             Descriptor->FixedIo.Address =
    297                 (UINT16) InitializerOp->Asl.Value.Integer;
    298             RsCreateWordField (InitializerOp, ACPI_RESTAG_BASEADDRESS,
    299                 CurrentByteOffset + ASL_RESDESC_OFFSET (FixedIo.Address));
    300             AddressOp = InitializerOp;
    301             break;
    302 
    303         case 1: /* Length */
    304 
    305             Descriptor->FixedIo.AddressLength =
    306                 (UINT8) InitializerOp->Asl.Value.Integer;
    307             RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
    308                 CurrentByteOffset + ASL_RESDESC_OFFSET (FixedIo.AddressLength));
    309             break;
    310 
    311         case 2: /* Name */
    312 
    313             UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
    314             break;
    315 
    316         default:
    317 
    318             AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
    319             break;
    320         }
    321 
    322         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
    323     }
    324 
    325     /* Error checks */
    326 
    327     if (Descriptor->FixedIo.Address > 0x03FF)
    328     {
    329         AslError (ASL_WARNING, ASL_MSG_ISA_ADDRESS, AddressOp, NULL);
    330     }
    331 
    332     return (Rnode);
    333 }
    334 
    335 
    336 /*******************************************************************************
    337  *
    338  * FUNCTION:    RsDoIoDescriptor
    339  *
    340  * PARAMETERS:  Info                - Parse Op and resource template offset
    341  *
    342  * RETURN:      Completed resource node
    343  *
    344  * DESCRIPTION: Construct a short "IO" descriptor
    345  *
    346  ******************************************************************************/
    347 
    348 ASL_RESOURCE_NODE *
    349 RsDoIoDescriptor (
    350     ASL_RESOURCE_INFO       *Info)
    351 {
    352     AML_RESOURCE            *Descriptor;
    353     ACPI_PARSE_OBJECT       *InitializerOp;
    354     ACPI_PARSE_OBJECT       *MinOp = NULL;
    355     ACPI_PARSE_OBJECT       *MaxOp = NULL;
    356     ACPI_PARSE_OBJECT       *LengthOp = NULL;
    357     ACPI_PARSE_OBJECT       *AlignOp = NULL;
    358     ASL_RESOURCE_NODE       *Rnode;
    359     UINT32                  CurrentByteOffset;
    360     UINT32                  i;
    361 
    362 
    363     InitializerOp = Info->DescriptorTypeOp->Asl.Child;
    364     CurrentByteOffset = Info->CurrentByteOffset;
    365     Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IO));
    366 
    367     Descriptor = Rnode->Buffer;
    368     Descriptor->Io.DescriptorType =
    369         ACPI_RESOURCE_NAME_IO | ASL_RDESC_IO_SIZE;
    370 
    371     /* Process all child initialization nodes */
    372 
    373     for (i = 0; InitializerOp; i++)
    374     {
    375         switch (i)
    376         {
    377         case 0: /* Decode size */
    378 
    379             RsSetFlagBits (&Descriptor->Io.Flags, InitializerOp, 0, 1);
    380             RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
    381                 CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Flags), 0);
    382             break;
    383 
    384         case 1:  /* Min Address */
    385 
    386             Descriptor->Io.Minimum =
    387                 (UINT16) InitializerOp->Asl.Value.Integer;
    388             RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR,
    389                 CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Minimum));
    390             MinOp = InitializerOp;
    391             break;
    392 
    393         case 2: /* Max Address */
    394 
    395             Descriptor->Io.Maximum =
    396                 (UINT16) InitializerOp->Asl.Value.Integer;
    397             RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR,
    398                 CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Maximum));
    399             MaxOp = InitializerOp;
    400             break;
    401 
    402         case 3: /* Alignment */
    403 
    404             Descriptor->Io.Alignment =
    405                 (UINT8) InitializerOp->Asl.Value.Integer;
    406             RsCreateByteField (InitializerOp, ACPI_RESTAG_ALIGNMENT,
    407                 CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Alignment));
    408             AlignOp = InitializerOp;
    409             break;
    410 
    411         case 4: /* Length */
    412 
    413             Descriptor->Io.AddressLength =
    414                 (UINT8) InitializerOp->Asl.Value.Integer;
    415             RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
    416                 CurrentByteOffset + ASL_RESDESC_OFFSET (Io.AddressLength));
    417             LengthOp = InitializerOp;
    418             break;
    419 
    420         case 5: /* Name */
    421 
    422             UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
    423             break;
    424 
    425         default:
    426 
    427             AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
    428             break;
    429         }
    430 
    431         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
    432     }
    433 
    434     /* Validate the Min/Max/Len/Align values */
    435 
    436     RsSmallAddressCheck (ACPI_RESOURCE_NAME_IO,
    437         Descriptor->Io.Minimum,
    438         Descriptor->Io.Maximum,
    439         Descriptor->Io.AddressLength,
    440         Descriptor->Io.Alignment,
    441         MinOp, MaxOp, LengthOp, AlignOp, Info->DescriptorTypeOp);
    442 
    443     return (Rnode);
    444 }
    445 
    446 
    447 /*******************************************************************************
    448  *
    449  * FUNCTION:    RsDoIrqDescriptor
    450  *
    451  * PARAMETERS:  Info                - Parse Op and resource template offset
    452  *
    453  * RETURN:      Completed resource node
    454  *
    455  * DESCRIPTION: Construct a short "IRQ" descriptor
    456  *
    457  ******************************************************************************/
    458 
    459 ASL_RESOURCE_NODE *
    460 RsDoIrqDescriptor (
    461     ASL_RESOURCE_INFO       *Info)
    462 {
    463     AML_RESOURCE            *Descriptor;
    464     ACPI_PARSE_OBJECT       *InitializerOp;
    465     ASL_RESOURCE_NODE       *Rnode;
    466     UINT32                  Interrupts = 0;
    467     UINT16                  IrqMask = 0;
    468     UINT32                  CurrentByteOffset;
    469     UINT32                  i;
    470 
    471 
    472     InitializerOp = Info->DescriptorTypeOp->Asl.Child;
    473     CurrentByteOffset = Info->CurrentByteOffset;
    474     Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IRQ));
    475 
    476     /* Length = 3 (with flag byte) */
    477 
    478     Descriptor = Rnode->Buffer;
    479     Descriptor->Irq.DescriptorType =
    480         ACPI_RESOURCE_NAME_IRQ | (ASL_RDESC_IRQ_SIZE + 0x01);
    481 
    482     /* Process all child initialization nodes */
    483 
    484     for (i = 0; InitializerOp; i++)
    485     {
    486         switch (i)
    487         {
    488         case 0: /* Interrupt Type (or Mode - edge/level) */
    489 
    490             RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 0, 1);
    491             RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTTYPE,
    492                 CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 0);
    493             break;
    494 
    495         case 1: /* Interrupt Level (or Polarity - Active high/low) */
    496 
    497             RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 3, 0);
    498             RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTLEVEL,
    499                 CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 3);
    500             break;
    501 
    502         case 2: /* Share Type - Default: exclusive (0) */
    503 
    504             RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 4, 0);
    505             RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
    506                 CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 4);
    507             break;
    508 
    509         case 3: /* Name */
    510 
    511             UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
    512             break;
    513 
    514         default:
    515 
    516             /* All IRQ bytes are handled here, after the flags and name */
    517 
    518             if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
    519             {
    520                 /* Up to 16 interrupts can be specified in the list */
    521 
    522                 Interrupts++;
    523                 if (Interrupts > 16)
    524                 {
    525                     AslError (ASL_ERROR, ASL_MSG_INTERRUPT_LIST,
    526                         InitializerOp, NULL);
    527                     return (Rnode);
    528                 }
    529 
    530                 /* Only interrupts 0-15 are allowed (mask is 16 bits) */
    531 
    532                 if (InitializerOp->Asl.Value.Integer > 15)
    533                 {
    534                     AslError (ASL_ERROR, ASL_MSG_INTERRUPT_NUMBER,
    535                         InitializerOp, NULL);
    536                 }
    537                 else
    538                 {
    539                     IrqMask |= (1 << (UINT8) InitializerOp->Asl.Value.Integer);
    540                 }
    541             }
    542 
    543             /* Case 4: First IRQ value in list */
    544 
    545             if (i == 4)
    546             {
    547                 /* Check now for duplicates in list */
    548 
    549                 RsCheckListForDuplicates (InitializerOp);
    550 
    551                 /* Create a named field at the start of the list */
    552 
    553                 RsCreateWordField (InitializerOp, ACPI_RESTAG_INTERRUPT,
    554                     CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.IrqMask));
    555             }
    556             break;
    557         }
    558 
    559         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
    560     }
    561 
    562     /* Now we can set the channel mask */
    563 
    564     Descriptor->Irq.IrqMask = IrqMask;
    565     return (Rnode);
    566 }
    567 
    568 
    569 /*******************************************************************************
    570  *
    571  * FUNCTION:    RsDoIrqNoFlagsDescriptor
    572  *
    573  * PARAMETERS:  Info                - Parse Op and resource template offset
    574  *
    575  * RETURN:      Completed resource node
    576  *
    577  * DESCRIPTION: Construct a short "IRQNoFlags" descriptor
    578  *
    579  ******************************************************************************/
    580 
    581 ASL_RESOURCE_NODE *
    582 RsDoIrqNoFlagsDescriptor (
    583     ASL_RESOURCE_INFO       *Info)
    584 {
    585     AML_RESOURCE            *Descriptor;
    586     ACPI_PARSE_OBJECT       *InitializerOp;
    587     ASL_RESOURCE_NODE       *Rnode;
    588     UINT16                  IrqMask = 0;
    589     UINT32                  Interrupts = 0;
    590     UINT32                  CurrentByteOffset;
    591     UINT32                  i;
    592 
    593 
    594     InitializerOp = Info->DescriptorTypeOp->Asl.Child;
    595     CurrentByteOffset = Info->CurrentByteOffset;
    596     Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IRQ_NOFLAGS));
    597 
    598     Descriptor = Rnode->Buffer;
    599     Descriptor->Irq.DescriptorType =
    600         ACPI_RESOURCE_NAME_IRQ | ASL_RDESC_IRQ_SIZE;
    601 
    602     /* Process all child initialization nodes */
    603 
    604     for (i = 0; InitializerOp; i++)
    605     {
    606         switch (i)
    607         {
    608         case 0: /* Name */
    609 
    610             UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
    611             break;
    612 
    613         default:
    614 
    615             /* IRQ bytes are handled here, after the flags and name */
    616 
    617             if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
    618             {
    619                 /* Up to 16 interrupts can be specified in the list */
    620 
    621                 Interrupts++;
    622                 if (Interrupts > 16)
    623                 {
    624                     AslError (ASL_ERROR, ASL_MSG_INTERRUPT_LIST,
    625                         InitializerOp, NULL);
    626                     return (Rnode);
    627                 }
    628 
    629                 /* Only interrupts 0-15 are allowed (mask is 16 bits) */
    630 
    631                 if (InitializerOp->Asl.Value.Integer > 15)
    632                 {
    633                     AslError (ASL_ERROR, ASL_MSG_INTERRUPT_NUMBER,
    634                         InitializerOp, NULL);
    635                 }
    636                 else
    637                 {
    638                     IrqMask |= (1 << ((UINT8) InitializerOp->Asl.Value.Integer));
    639                 }
    640             }
    641 
    642             /* Case 1: First IRQ value in list */
    643 
    644             if (i == 1)
    645             {
    646                 /* Check now for duplicates in list */
    647 
    648                 RsCheckListForDuplicates (InitializerOp);
    649 
    650                 /* Create a named field at the start of the list */
    651 
    652                 RsCreateWordField (InitializerOp, ACPI_RESTAG_INTERRUPT,
    653                     CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.IrqMask));
    654             }
    655             break;
    656         }
    657 
    658         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
    659     }
    660 
    661     /* Now we can set the interrupt mask */
    662 
    663     Descriptor->Irq.IrqMask = IrqMask;
    664     return (Rnode);
    665 }
    666