aslrestype1i.c revision 217365
1168404Spjd
2168404Spjd/******************************************************************************
3168404Spjd *
4168404Spjd * Module Name: aslrestype1i - Small I/O-related resource descriptors
5168404Spjd *
6168404Spjd *****************************************************************************/
7168404Spjd
8168404Spjd/*
9168404Spjd * Copyright (C) 2000 - 2011, Intel Corp.
10168404Spjd * All rights reserved.
11168404Spjd *
12168404Spjd * Redistribution and use in source and binary forms, with or without
13168404Spjd * modification, are permitted provided that the following conditions
14168404Spjd * are met:
15168404Spjd * 1. Redistributions of source code must retain the above copyright
16168404Spjd *    notice, this list of conditions, and the following disclaimer,
17168404Spjd *    without modification.
18168404Spjd * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19168404Spjd *    substantially similar to the "NO WARRANTY" disclaimer below
20168404Spjd *    ("Disclaimer") and any redistribution must be conditioned upon
21168404Spjd *    including a substantially similar Disclaimer requirement for further
22219089Spjd *    binary redistribution.
23289562Smav * 3. Neither the names of the above-listed copyright holders nor the names
24264669Sdelphij *    of any contributors may be used to endorse or promote products derived
25168404Spjd *    from this software without specific prior written permission.
26168404Spjd *
27168404Spjd * Alternatively, this software may be distributed under the terms of the
28168404Spjd * GNU General Public License ("GPL") version 2 as published by the Free
29168404Spjd * Software Foundation.
30168404Spjd *
31168404Spjd * NO WARRANTY
32168404Spjd * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33168404Spjd * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34268084Sdelphij * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35168404Spjd * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36168404Spjd * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37168404Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38168404Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39248571Smm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40168404Spjd * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41168498Spjd * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42219089Spjd * POSSIBILITY OF SUCH DAMAGES.
43168404Spjd */
44168404Spjd
45168404Spjd
46168404Spjd#include <contrib/dev/acpica/compiler/aslcompiler.h>
47168404Spjd#include "aslcompiler.y.h"
48288340Savg
49219089Spjd#define _COMPONENT          ACPI_COMPILER
50288340Savg        ACPI_MODULE_NAME    ("aslrestype1i")
51168404Spjd
52168404Spjd/*
53219089Spjd * This module contains the I/O-related small resource descriptors:
54247265Smm *
55247265Smm * DMA
56247265Smm * FixedIO
57168404Spjd * IO
58268084Sdelphij * IRQ
59268084Sdelphij * IRQNoFlags
60268084Sdelphij */
61168498Spjd
62168498Spjd/*******************************************************************************
63168498Spjd *
64168498Spjd * FUNCTION:    RsDoDmaDescriptor
65219089Spjd *
66219089Spjd * PARAMETERS:  Op                  - Parent resource descriptor parse node
67219089Spjd *              CurrentByteOffset   - Offset into the resource template AML
68168404Spjd *                                    buffer (to track references to the desc)
69168404Spjd *
70168404Spjd * RETURN:      Completed resource node
71168404Spjd *
72168404Spjd * DESCRIPTION: Construct a short "DMA" descriptor
73168404Spjd *
74168404Spjd ******************************************************************************/
75168404Spjd
76168404SpjdASL_RESOURCE_NODE *
77168404SpjdRsDoDmaDescriptor (
78168404Spjd    ACPI_PARSE_OBJECT       *Op,
79168404Spjd    UINT32                  CurrentByteOffset)
80168404Spjd{
81168404Spjd    AML_RESOURCE            *Descriptor;
82168404Spjd    ACPI_PARSE_OBJECT       *InitializerOp;
83168404Spjd    ASL_RESOURCE_NODE       *Rnode;
84168404Spjd    UINT32                  i;
85168404Spjd    UINT8                   DmaChannelMask = 0;
86168404Spjd    UINT8                   DmaChannels = 0;
87168404Spjd
88168404Spjd
89168404Spjd    InitializerOp = Op->Asl.Child;
90168404Spjd    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_DMA));
91168404Spjd
92168404Spjd    Descriptor = Rnode->Buffer;
93168404Spjd    Descriptor->Dma.DescriptorType  = ACPI_RESOURCE_NAME_DMA |
94168404Spjd                                        ASL_RDESC_DMA_SIZE;
95168404Spjd
96168404Spjd    /* Process all child initialization nodes */
97168404Spjd
98168404Spjd    for (i = 0; InitializerOp; i++)
99168404Spjd    {
100321529Smav        switch (i)
101321529Smav        {
102321529Smav        case 0: /* DMA type */
103321529Smav
104321529Smav            RsSetFlagBits (&Descriptor->Dma.Flags, InitializerOp, 5, 0);
105168404Spjd            RsCreateBitField (InitializerOp, ACPI_RESTAG_DMATYPE,
106168404Spjd                CurrentByteOffset + ASL_RESDESC_OFFSET (Dma.Flags), 5);
107168404Spjd            break;
108168404Spjd
109168404Spjd        case 1: /* Bus Master */
110168404Spjd
111168404Spjd            RsSetFlagBits (&Descriptor->Dma.Flags, InitializerOp, 2, 0);
112168404Spjd            RsCreateBitField (InitializerOp, ACPI_RESTAG_BUSMASTER,
113168404Spjd                CurrentByteOffset + ASL_RESDESC_OFFSET (Dma.Flags), 2);
114168404Spjd            break;
115168404Spjd
116168404Spjd        case 2: /* Xfer Type (transfer width) */
117168404Spjd
118168404Spjd            RsSetFlagBits (&Descriptor->Dma.Flags, InitializerOp, 0, 0);
119168404Spjd            RsCreateBitField (InitializerOp, ACPI_RESTAG_XFERTYPE,
120168404Spjd                CurrentByteOffset + ASL_RESDESC_OFFSET (Dma.Flags), 0);
121168404Spjd            break;
122185029Spjd
123168404Spjd        case 3: /* Name */
124168404Spjd
125168404Spjd            UtAttachNamepathToOwner (Op, InitializerOp);
126168404Spjd            break;
127168404Spjd
128168404Spjd        default:
129185029Spjd
130168404Spjd            /* All DMA channel bytes are handled here, after flags and name */
131168404Spjd
132168404Spjd            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
133185029Spjd            {
134168404Spjd                /* Up to 8 channels can be specified in the list */
135168404Spjd
136195515Spjd                DmaChannels++;
137195515Spjd                if (DmaChannels > 8)
138195515Spjd                {
139195515Spjd                    AslError (ASL_ERROR, ASL_MSG_DMA_LIST,
140195515Spjd                        InitializerOp, NULL);
141195515Spjd                    return (Rnode);
142195515Spjd                }
143195515Spjd
144168404Spjd                /* Only DMA channels 0-7 are allowed (mask is 8 bits) */
145168404Spjd
146168404Spjd                if (InitializerOp->Asl.Value.Integer > 7)
147185029Spjd                {
148168404Spjd                    AslError (ASL_ERROR, ASL_MSG_DMA_CHANNEL,
149168404Spjd                        InitializerOp, NULL);
150168404Spjd                }
151168404Spjd
152168404Spjd                /* Build the mask */
153168404Spjd
154168404Spjd                DmaChannelMask |=
155168404Spjd                    (1 << ((UINT8) InitializerOp->Asl.Value.Integer));
156168404Spjd            }
157168404Spjd
158185029Spjd            if (i == 4) /* case 4: First DMA byte */
159168404Spjd            {
160219089Spjd                /* Check now for duplicates in list */
161168404Spjd
162168404Spjd                RsCheckListForDuplicates (InitializerOp);
163168404Spjd
164168404Spjd                /* Create a named field at the start of the list */
165168404Spjd
166168404Spjd                RsCreateByteField (InitializerOp, ACPI_RESTAG_DMA,
167168404Spjd                    CurrentByteOffset +
168168404Spjd                    ASL_RESDESC_OFFSET (Dma.DmaChannelMask));
169168404Spjd            }
170168404Spjd            break;
171168404Spjd        }
172185029Spjd
173219089Spjd        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
174168404Spjd    }
175168404Spjd
176168404Spjd    /* Now we can set the channel mask */
177168404Spjd
178168404Spjd    Descriptor->Dma.DmaChannelMask = DmaChannelMask;
179168404Spjd    return (Rnode);
180168404Spjd}
181185029Spjd
182168404Spjd
183168404Spjd/*******************************************************************************
184168404Spjd *
185168404Spjd * FUNCTION:    RsDoFixedIoDescriptor
186168404Spjd *
187168404Spjd * PARAMETERS:  Op                  - Parent resource descriptor parse node
188168404Spjd *              CurrentByteOffset   - Offset into the resource template AML
189168404Spjd *                                    buffer (to track references to the desc)
190168404Spjd *
191168404Spjd * RETURN:      Completed resource node
192168404Spjd *
193168404Spjd * DESCRIPTION: Construct a short "FixedIO" descriptor
194168404Spjd *
195168404Spjd ******************************************************************************/
196185029Spjd
197210044SpjdASL_RESOURCE_NODE *
198168404SpjdRsDoFixedIoDescriptor (
199168404Spjd    ACPI_PARSE_OBJECT       *Op,
200168404Spjd    UINT32                  CurrentByteOffset)
201168404Spjd{
202168404Spjd    AML_RESOURCE            *Descriptor;
203210044Spjd    ACPI_PARSE_OBJECT       *InitializerOp;
204168404Spjd    ACPI_PARSE_OBJECT       *AddressOp = NULL;
205168404Spjd    ASL_RESOURCE_NODE       *Rnode;
206185029Spjd    UINT32                  i;
207168404Spjd
208168404Spjd
209168404Spjd    InitializerOp = Op->Asl.Child;
210168404Spjd    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_FIXED_IO));
211168404Spjd
212168404Spjd    Descriptor = Rnode->Buffer;
213185029Spjd    Descriptor->Io.DescriptorType  = ACPI_RESOURCE_NAME_FIXED_IO |
214168404Spjd                                      ASL_RDESC_FIXED_IO_SIZE;
215168404Spjd
216168404Spjd    /* Process all child initialization nodes */
217168404Spjd
218185029Spjd    for (i = 0; InitializerOp; i++)
219168404Spjd    {
220168404Spjd        switch (i)
221168404Spjd        {
222185029Spjd        case 0: /* Base Address */
223168404Spjd
224168404Spjd            Descriptor->FixedIo.Address =
225168404Spjd                (UINT16) InitializerOp->Asl.Value.Integer;
226168404Spjd            RsCreateByteField (InitializerOp, ACPI_RESTAG_BASEADDRESS,
227168404Spjd                CurrentByteOffset + ASL_RESDESC_OFFSET (FixedIo.Address));
228168404Spjd            AddressOp = InitializerOp;
229168404Spjd            break;
230168404Spjd
231168404Spjd        case 1: /* Length */
232185029Spjd
233168404Spjd            Descriptor->FixedIo.AddressLength =
234168404Spjd                (UINT8) InitializerOp->Asl.Value.Integer;
235168404Spjd            RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
236168404Spjd                CurrentByteOffset + ASL_RESDESC_OFFSET (FixedIo.AddressLength));
237168404Spjd            break;
238168404Spjd
239168404Spjd        case 2: /* Name */
240168404Spjd
241168404Spjd            UtAttachNamepathToOwner (Op, InitializerOp);
242168404Spjd            break;
243168404Spjd
244168404Spjd        default:
245185029Spjd
246168404Spjd            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
247168404Spjd            break;
248168404Spjd        }
249168404Spjd
250168404Spjd        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
251168404Spjd    }
252168404Spjd
253185029Spjd    /* Error checks */
254168404Spjd
255168404Spjd    if (Descriptor->FixedIo.Address > 0x03FF)
256168404Spjd    {
257168404Spjd        AslError (ASL_WARNING, ASL_MSG_ISA_ADDRESS, AddressOp, NULL);
258168404Spjd    }
259168404Spjd
260168404Spjd    return (Rnode);
261168404Spjd}
262168404Spjd
263168404Spjd
264168404Spjd/*******************************************************************************
265168404Spjd *
266168404Spjd * FUNCTION:    RsDoIoDescriptor
267168404Spjd *
268168404Spjd * PARAMETERS:  Op                  - Parent resource descriptor parse node
269168404Spjd *              CurrentByteOffset   - Offset into the resource template AML
270168404Spjd *                                    buffer (to track references to the desc)
271168404Spjd *
272168404Spjd * RETURN:      Completed resource node
273168404Spjd *
274168404Spjd * DESCRIPTION: Construct a short "IO" descriptor
275168404Spjd *
276168404Spjd ******************************************************************************/
277168404Spjd
278168404SpjdASL_RESOURCE_NODE *
279168404SpjdRsDoIoDescriptor (
280168404Spjd    ACPI_PARSE_OBJECT       *Op,
281168404Spjd    UINT32                  CurrentByteOffset)
282185029Spjd{
283168404Spjd    AML_RESOURCE            *Descriptor;
284168404Spjd    ACPI_PARSE_OBJECT       *InitializerOp;
285168404Spjd    ACPI_PARSE_OBJECT       *MinOp = NULL;
286168404Spjd    ACPI_PARSE_OBJECT       *MaxOp = NULL;
287168404Spjd    ACPI_PARSE_OBJECT       *LengthOp = NULL;
288168404Spjd    ACPI_PARSE_OBJECT       *AlignOp = NULL;
289168404Spjd    ASL_RESOURCE_NODE       *Rnode;
290168404Spjd    UINT32                  i;
291168404Spjd
292168404Spjd
293168404Spjd    InitializerOp = Op->Asl.Child;
294168404Spjd    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IO));
295168404Spjd
296168404Spjd    Descriptor = Rnode->Buffer;
297168404Spjd    Descriptor->Io.DescriptorType  = ACPI_RESOURCE_NAME_IO |
298168404Spjd                                      ASL_RDESC_IO_SIZE;
299168404Spjd
300168404Spjd    /* Process all child initialization nodes */
301168404Spjd
302168404Spjd    for (i = 0; InitializerOp; i++)
303168404Spjd    {
304168404Spjd        switch (i)
305168404Spjd        {
306168404Spjd        case 0: /* Decode size */
307168404Spjd
308168404Spjd            RsSetFlagBits (&Descriptor->Io.Flags, InitializerOp, 0, 1);
309168404Spjd            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
310168404Spjd                CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Flags), 0);
311168404Spjd            break;
312168404Spjd
313168404Spjd        case 1:  /* Min Address */
314168404Spjd
315168404Spjd            Descriptor->Io.Minimum =
316168404Spjd                (UINT16) InitializerOp->Asl.Value.Integer;
317168404Spjd            RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
318168404Spjd                CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Minimum));
319168404Spjd            MinOp = InitializerOp;
320168404Spjd            break;
321168404Spjd
322168404Spjd        case 2: /* Max Address */
323168404Spjd
324168404Spjd            Descriptor->Io.Maximum =
325168404Spjd                (UINT16) InitializerOp->Asl.Value.Integer;
326168404Spjd            RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
327168404Spjd                CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Maximum));
328168404Spjd            MaxOp = InitializerOp;
329168404Spjd            break;
330168404Spjd
331219089Spjd        case 3: /* Alignment */
332168404Spjd
333219089Spjd            Descriptor->Io.Alignment =
334168404Spjd                (UINT8) InitializerOp->Asl.Value.Integer;
335168404Spjd            RsCreateByteField (InitializerOp, ACPI_RESTAG_ALIGNMENT,
336168404Spjd                CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Alignment));
337168404Spjd            AlignOp = InitializerOp;
338168404Spjd            break;
339168404Spjd
340168404Spjd        case 4: /* Length */
341168404Spjd
342168404Spjd            Descriptor->Io.AddressLength =
343168404Spjd                (UINT8) InitializerOp->Asl.Value.Integer;
344214622Spjd            RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
345168404Spjd                CurrentByteOffset + ASL_RESDESC_OFFSET (Io.AddressLength));
346168404Spjd            LengthOp = InitializerOp;
347168404Spjd            break;
348168404Spjd
349168404Spjd        case 5: /* Name */
350168404Spjd
351168404Spjd            UtAttachNamepathToOwner (Op, InitializerOp);
352168404Spjd            break;
353168404Spjd
354168404Spjd        default:
355168404Spjd
356168404Spjd            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
357168404Spjd            break;
358168404Spjd        }
359168404Spjd
360168404Spjd        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
361168404Spjd    }
362168404Spjd
363168404Spjd    /* Validate the Min/Max/Len/Align values */
364168404Spjd
365255437Sdelphij    RsSmallAddressCheck (ACPI_RESOURCE_NAME_IO,
366255437Sdelphij        Descriptor->Io.Minimum,
367255437Sdelphij        Descriptor->Io.Maximum,
368255437Sdelphij        Descriptor->Io.AddressLength,
369255437Sdelphij        Descriptor->Io.Alignment,
370255437Sdelphij        MinOp, MaxOp, LengthOp, AlignOp, Op);
371318909Smav
372255437Sdelphij    return (Rnode);
373255437Sdelphij}
374297508Smav
375255437Sdelphij
376255437Sdelphij/*******************************************************************************
377297508Smav *
378297508Smav * FUNCTION:    RsDoIrqDescriptor
379297508Smav *
380297508Smav * PARAMETERS:  Op                  - Parent resource descriptor parse node
381255437Sdelphij *              CurrentByteOffset   - Offset into the resource template AML
382255437Sdelphij *                                    buffer (to track references to the desc)
383255437Sdelphij *
384318909Smav * RETURN:      Completed resource node
385318909Smav *
386318909Smav * DESCRIPTION: Construct a short "IRQ" descriptor
387318909Smav *
388318909Smav ******************************************************************************/
389318909Smav
390318909SmavASL_RESOURCE_NODE *
391255437SdelphijRsDoIrqDescriptor (
392255437Sdelphij    ACPI_PARSE_OBJECT       *Op,
393255437Sdelphij    UINT32                  CurrentByteOffset)
394255437Sdelphij{
395255437Sdelphij    AML_RESOURCE            *Descriptor;
396255437Sdelphij    ACPI_PARSE_OBJECT       *InitializerOp;
397255437Sdelphij    ASL_RESOURCE_NODE       *Rnode;
398255437Sdelphij    UINT32                  Interrupts = 0;
399255437Sdelphij    UINT16                  IrqMask = 0;
400255437Sdelphij    UINT32                  i;
401255437Sdelphij
402255437Sdelphij
403255437Sdelphij    InitializerOp = Op->Asl.Child;
404255437Sdelphij    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IRQ));
405255437Sdelphij
406255437Sdelphij    /* Length = 3 (with flag byte) */
407255437Sdelphij
408168404Spjd    Descriptor = Rnode->Buffer;
409168404Spjd    Descriptor->Irq.DescriptorType  = ACPI_RESOURCE_NAME_IRQ |
410168404Spjd                                      (ASL_RDESC_IRQ_SIZE + 0x01);
411168404Spjd
412168404Spjd    /* Process all child initialization nodes */
413168404Spjd
414168404Spjd    for (i = 0; InitializerOp; i++)
415168404Spjd    {
416168404Spjd        switch (i)
417168404Spjd        {
418168404Spjd        case 0: /* Interrupt Type (or Mode - edge/level) */
419168404Spjd
420168404Spjd            RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 0, 1);
421168404Spjd            RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTTYPE,
422168404Spjd                CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 0);
423168404Spjd            break;
424168404Spjd
425168404Spjd        case 1: /* Interrupt Level (or Polarity - Active high/low) */
426168404Spjd
427168404Spjd            RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 3, 0);
428168404Spjd            RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTLEVEL,
429168404Spjd                CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 3);
430168404Spjd            break;
431168404Spjd
432168404Spjd        case 2: /* Share Type - Default: exclusive (0) */
433168404Spjd
434168404Spjd            RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 4, 0);
435168404Spjd            RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
436168404Spjd                CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 4);
437268084Sdelphij            break;
438168404Spjd
439168404Spjd        case 3: /* Name */
440168404Spjd
441168404Spjd            UtAttachNamepathToOwner (Op, InitializerOp);
442168404Spjd            break;
443168404Spjd
444168404Spjd        default:
445168404Spjd
446168404Spjd            /* All IRQ bytes are handled here, after the flags and name */
447168404Spjd
448168404Spjd            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
449168404Spjd            {
450168404Spjd                /* Up to 16 interrupts can be specified in the list */
451168404Spjd
452168404Spjd                Interrupts++;
453168404Spjd                if (Interrupts > 16)
454168404Spjd                {
455168404Spjd                    AslError (ASL_ERROR, ASL_MSG_INTERRUPT_LIST,
456168404Spjd                        InitializerOp, NULL);
457168404Spjd                    return (Rnode);
458168404Spjd                }
459168404Spjd
460168404Spjd                /* Only interrupts 0-15 are allowed (mask is 16 bits) */
461168404Spjd
462168404Spjd                if (InitializerOp->Asl.Value.Integer > 15)
463168404Spjd                {
464168404Spjd                    AslError (ASL_ERROR, ASL_MSG_INTERRUPT_NUMBER,
465168404Spjd                        InitializerOp, NULL);
466168404Spjd                }
467168404Spjd                else
468168404Spjd                {
469168404Spjd                    IrqMask |= (1 << (UINT8) InitializerOp->Asl.Value.Integer);
470168404Spjd                }
471168404Spjd            }
472168404Spjd
473168404Spjd            /* Case 4: First IRQ value in list */
474168404Spjd
475168404Spjd            if (i == 4)
476168404Spjd            {
477168404Spjd                /* Check now for duplicates in list */
478168404Spjd
479168404Spjd                RsCheckListForDuplicates (InitializerOp);
480168404Spjd
481168404Spjd                /* Create a named field at the start of the list */
482168404Spjd
483168404Spjd                RsCreateByteField (InitializerOp, ACPI_RESTAG_INTERRUPT,
484168404Spjd                    CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.IrqMask));
485168404Spjd            }
486268084Sdelphij            break;
487268084Sdelphij        }
488268084Sdelphij
489268084Sdelphij        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
490268084Sdelphij    }
491268084Sdelphij
492268084Sdelphij    /* Now we can set the channel mask */
493268084Sdelphij
494268084Sdelphij    Descriptor->Irq.IrqMask = IrqMask;
495268084Sdelphij    return (Rnode);
496268084Sdelphij}
497168404Spjd
498168404Spjd
499168404Spjd/*******************************************************************************
500168404Spjd *
501168404Spjd * FUNCTION:    RsDoIrqNoFlagsDescriptor
502168404Spjd *
503168404Spjd * PARAMETERS:  Op                  - Parent resource descriptor parse node
504168404Spjd *              CurrentByteOffset   - Offset into the resource template AML
505168404Spjd *                                    buffer (to track references to the desc)
506168404Spjd *
507168404Spjd * RETURN:      Completed resource node
508168404Spjd *
509168404Spjd * DESCRIPTION: Construct a short "IRQNoFlags" descriptor
510219089Spjd *
511168404Spjd ******************************************************************************/
512268084Sdelphij
513168404SpjdASL_RESOURCE_NODE *
514168404SpjdRsDoIrqNoFlagsDescriptor (
515168404Spjd    ACPI_PARSE_OBJECT       *Op,
516168404Spjd    UINT32                  CurrentByteOffset)
517185029Spjd{
518168404Spjd    AML_RESOURCE            *Descriptor;
519168404Spjd    ACPI_PARSE_OBJECT       *InitializerOp;
520185029Spjd    ASL_RESOURCE_NODE       *Rnode;
521168404Spjd    UINT16                  IrqMask = 0;
522168404Spjd    UINT32                  Interrupts = 0;
523168404Spjd    UINT32                  i;
524168404Spjd
525168404Spjd
526168404Spjd    InitializerOp = Op->Asl.Child;
527168404Spjd    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IRQ_NOFLAGS));
528185029Spjd
529168404Spjd    Descriptor = Rnode->Buffer;
530168404Spjd    Descriptor->Irq.DescriptorType  = ACPI_RESOURCE_NAME_IRQ |
531168404Spjd                                      ASL_RDESC_IRQ_SIZE;
532168404Spjd
533168404Spjd    /* Process all child initialization nodes */
534168404Spjd
535168404Spjd    for (i = 0; InitializerOp; i++)
536168404Spjd    {
537168404Spjd        switch (i)
538168404Spjd        {
539289562Smav        case 0: /* Name */
540168404Spjd
541168404Spjd            UtAttachNamepathToOwner (Op, InitializerOp);
542168404Spjd            break;
543168404Spjd
544168404Spjd        default:
545268084Sdelphij
546268084Sdelphij            /* IRQ bytes are handled here, after the flags and name */
547268084Sdelphij
548268084Sdelphij            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
549268084Sdelphij            {
550168404Spjd                /* Up to 16 interrupts can be specified in the list */
551168404Spjd
552168404Spjd                Interrupts++;
553168404Spjd                if (Interrupts > 16)
554168404Spjd                {
555236884Smm                    AslError (ASL_ERROR, ASL_MSG_INTERRUPT_LIST,
556236884Smm                        InitializerOp, NULL);
557236884Smm                    return (Rnode);
558168404Spjd                }
559168404Spjd
560168404Spjd                /* Only interrupts 0-15 are allowed (mask is 16 bits) */
561168404Spjd
562168404Spjd                if (InitializerOp->Asl.Value.Integer > 15)
563168404Spjd                {
564168404Spjd                    AslError (ASL_ERROR, ASL_MSG_INTERRUPT_NUMBER,
565168404Spjd                        InitializerOp, NULL);
566168404Spjd                }
567168404Spjd                else
568168404Spjd                {
569168404Spjd                    IrqMask |= (1 << ((UINT8) InitializerOp->Asl.Value.Integer));
570168404Spjd                }
571168404Spjd            }
572168404Spjd
573185029Spjd            /* Case 1: First IRQ value in list */
574168404Spjd
575168404Spjd            if (i == 1)
576268084Sdelphij            {
577268084Sdelphij                /* Check now for duplicates in list */
578168404Spjd
579168404Spjd                RsCheckListForDuplicates (InitializerOp);
580168404Spjd
581168404Spjd                /* Create a named field at the start of the list */
582219089Spjd
583219089Spjd                RsCreateByteField (InitializerOp, ACPI_RESTAG_INTERRUPT,
584219089Spjd                    CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.IrqMask));
585219089Spjd            }
586219089Spjd            break;
587219089Spjd        }
588219089Spjd
589219089Spjd        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
590219089Spjd    }
591219089Spjd
592219089Spjd    /* Now we can set the interrupt mask */
593219089Spjd
594219089Spjd    Descriptor->Irq.IrqMask = IrqMask;
595219089Spjd    return (Rnode);
596219089Spjd}
597219089Spjd