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