aslrestype2d.c revision 217365
1207340Sjkim
2207340Sjkim/******************************************************************************
3207340Sjkim *
4207340Sjkim * Module Name: aslrestype2d - Large DWord address resource descriptors
5207340Sjkim *
6207340Sjkim *****************************************************************************/
7207340Sjkim
8217365Sjkim/*
9217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp.
10207340Sjkim * All rights reserved.
11207340Sjkim *
12217365Sjkim * Redistribution and use in source and binary forms, with or without
13217365Sjkim * modification, are permitted provided that the following conditions
14217365Sjkim * are met:
15217365Sjkim * 1. Redistributions of source code must retain the above copyright
16217365Sjkim *    notice, this list of conditions, and the following disclaimer,
17217365Sjkim *    without modification.
18217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
20217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
21217365Sjkim *    including a substantially similar Disclaimer requirement for further
22217365Sjkim *    binary redistribution.
23217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
24217365Sjkim *    of any contributors may be used to endorse or promote products derived
25217365Sjkim *    from this software without specific prior written permission.
26207340Sjkim *
27217365Sjkim * Alternatively, this software may be distributed under the terms of the
28217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
29217365Sjkim * Software Foundation.
30207340Sjkim *
31217365Sjkim * NO WARRANTY
32217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
43217365Sjkim */
44207340Sjkim
45207340Sjkim
46207344Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
47207340Sjkim#include "aslcompiler.y.h"
48207340Sjkim
49207340Sjkim#define _COMPONENT          ACPI_COMPILER
50207340Sjkim        ACPI_MODULE_NAME    ("aslrestype2d")
51207340Sjkim
52207340Sjkim/*
53207340Sjkim * This module contains the Dword (32-bit) address space descriptors:
54207340Sjkim *
55207340Sjkim * DwordIO
56207340Sjkim * DwordMemory
57207340Sjkim * DwordSpace
58207340Sjkim */
59207340Sjkim
60207340Sjkim/*******************************************************************************
61207340Sjkim *
62207340Sjkim * FUNCTION:    RsDoDwordIoDescriptor
63207340Sjkim *
64207340Sjkim * PARAMETERS:  Op                  - Parent resource descriptor parse node
65207340Sjkim *              CurrentByteOffset   - Offset into the resource template AML
66207340Sjkim *                                    buffer (to track references to the desc)
67207340Sjkim *
68207340Sjkim * RETURN:      Completed resource node
69207340Sjkim *
70207340Sjkim * DESCRIPTION: Construct a long "DwordIO" descriptor
71207340Sjkim *
72207340Sjkim ******************************************************************************/
73207340Sjkim
74207340SjkimASL_RESOURCE_NODE *
75207340SjkimRsDoDwordIoDescriptor (
76207340Sjkim    ACPI_PARSE_OBJECT       *Op,
77207340Sjkim    UINT32                  CurrentByteOffset)
78207340Sjkim{
79207340Sjkim    AML_RESOURCE            *Descriptor;
80207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
81207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
82207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
83207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
84207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
85207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
86207340Sjkim    UINT16                  StringLength = 0;
87207340Sjkim    UINT32                  OptionIndex = 0;
88207340Sjkim    UINT8                   *OptionalFields;
89207340Sjkim    UINT32                  i;
90207340Sjkim    BOOLEAN                 ResSourceIndex = FALSE;
91207340Sjkim
92207340Sjkim
93207340Sjkim    InitializerOp = Op->Asl.Child;
94207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
95207340Sjkim
96207340Sjkim    Rnode = RsAllocateResourceNode (
97207340Sjkim                sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength);
98207340Sjkim
99207340Sjkim    Descriptor = Rnode->Buffer;
100207340Sjkim    Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32;
101207340Sjkim    Descriptor->Address32.ResourceType   = ACPI_ADDRESS_TYPE_IO_RANGE;
102207340Sjkim
103207340Sjkim    /*
104207340Sjkim     * Initial descriptor length -- may be enlarged if there are
105207340Sjkim     * optional fields present
106207340Sjkim     */
107207340Sjkim    OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
108207340Sjkim    Descriptor->Address32.ResourceLength = (UINT16)
109207340Sjkim        (sizeof (AML_RESOURCE_ADDRESS32) -
110207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
111207340Sjkim
112207340Sjkim    /* Process all child initialization nodes */
113207340Sjkim
114207340Sjkim    for (i = 0; InitializerOp; i++)
115207340Sjkim    {
116207340Sjkim        switch (i)
117207340Sjkim        {
118207340Sjkim        case 0: /* Resource Usage */
119207340Sjkim
120207340Sjkim            RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1);
121207340Sjkim            break;
122207340Sjkim
123207340Sjkim        case 1: /* MinType */
124207340Sjkim
125207340Sjkim            RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0);
126207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
127207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2);
128207340Sjkim            break;
129207340Sjkim
130207340Sjkim        case 2: /* MaxType */
131207340Sjkim
132207340Sjkim            RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0);
133207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
134207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3);
135207340Sjkim            break;
136207340Sjkim
137207340Sjkim        case 3: /* DecodeType */
138207340Sjkim
139207340Sjkim            RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0);
140207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
141207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1);
142207340Sjkim            break;
143207340Sjkim
144207340Sjkim        case 4: /* Range Type */
145207340Sjkim
146207340Sjkim            RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 0, 3);
147207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
148207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 0);
149207340Sjkim            break;
150207340Sjkim
151207340Sjkim        case 5: /* Address Granularity */
152207340Sjkim
153207340Sjkim            Descriptor->Address32.Granularity =
154207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
155207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
156207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
157207340Sjkim            GranOp = InitializerOp;
158207340Sjkim            break;
159207340Sjkim
160207340Sjkim        case 6: /* Address Min */
161207340Sjkim
162207340Sjkim            Descriptor->Address32.Minimum =
163207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
164207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
165207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
166207340Sjkim            MinOp = InitializerOp;
167207340Sjkim            break;
168207340Sjkim
169207340Sjkim        case 7: /* Address Max */
170207340Sjkim
171207340Sjkim            Descriptor->Address32.Maximum =
172207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
173207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
174207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
175207340Sjkim            MaxOp = InitializerOp;
176207340Sjkim            break;
177207340Sjkim
178207340Sjkim        case 8: /* Translation Offset */
179207340Sjkim
180207340Sjkim            Descriptor->Address32.TranslationOffset =
181207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
182207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
183207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
184207340Sjkim            break;
185207340Sjkim
186207340Sjkim        case 9: /* Address Length */
187207340Sjkim
188207340Sjkim            Descriptor->Address32.AddressLength =
189207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
190207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
191207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
192207340Sjkim            LengthOp = InitializerOp;
193207340Sjkim            break;
194207340Sjkim
195207340Sjkim        case 10: /* ResSourceIndex [Optional Field - BYTE] */
196207340Sjkim
197207340Sjkim            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
198207340Sjkim            {
199207340Sjkim                /* Found a valid ResourceSourceIndex */
200207340Sjkim
201207340Sjkim                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
202207340Sjkim                OptionIndex++;
203207340Sjkim                Descriptor->Address32.ResourceLength++;
204207340Sjkim                ResSourceIndex = TRUE;
205207340Sjkim            }
206207340Sjkim            break;
207207340Sjkim
208207340Sjkim        case 11: /* ResSource [Optional Field - STRING] */
209207340Sjkim
210207340Sjkim            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
211207340Sjkim                (InitializerOp->Asl.Value.String))
212207340Sjkim            {
213207340Sjkim                if (StringLength)
214207340Sjkim                {
215207340Sjkim                    /* Found a valid ResourceSource */
216207340Sjkim
217207340Sjkim                    Descriptor->Address32.ResourceLength = (UINT16)
218207340Sjkim                        (Descriptor->Address32.ResourceLength + StringLength);
219207340Sjkim
220207340Sjkim                    strcpy ((char *)
221207340Sjkim                        &OptionalFields[OptionIndex],
222207340Sjkim                        InitializerOp->Asl.Value.String);
223207340Sjkim
224207340Sjkim                    /* ResourceSourceIndex must also be valid */
225207340Sjkim
226207340Sjkim                    if (!ResSourceIndex)
227207340Sjkim                    {
228207340Sjkim                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
229207340Sjkim                            InitializerOp, NULL);
230207340Sjkim                    }
231207340Sjkim                }
232207340Sjkim            }
233207340Sjkim
234207340Sjkim#if 0
235207340Sjkim            /*
236207340Sjkim             * Not a valid ResourceSource, ResourceSourceIndex must also
237207340Sjkim             * be invalid
238207340Sjkim             */
239207340Sjkim            else if (ResSourceIndex)
240207340Sjkim            {
241207340Sjkim                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
242207340Sjkim                    InitializerOp, NULL);
243207340Sjkim            }
244207340Sjkim#endif
245207340Sjkim            break;
246207340Sjkim
247207340Sjkim        case 12: /* ResourceTag */
248207340Sjkim
249207340Sjkim            UtAttachNamepathToOwner (Op, InitializerOp);
250207340Sjkim            break;
251207340Sjkim
252207340Sjkim        case 13: /* Type */
253207340Sjkim
254207340Sjkim            RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 4, 0);
255207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
256207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 4);
257207340Sjkim            break;
258207340Sjkim
259207340Sjkim        case 14: /* Translation Type */
260207340Sjkim
261207340Sjkim            RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 5, 0);
262207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
263207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 5);
264207340Sjkim            break;
265207340Sjkim
266207340Sjkim        default:
267207340Sjkim
268207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
269207340Sjkim            break;
270207340Sjkim        }
271207340Sjkim
272207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
273207340Sjkim    }
274207340Sjkim
275207340Sjkim    /* Validate the Min/Max/Len/Gran values */
276207340Sjkim
277207340Sjkim    RsLargeAddressCheck (
278212761Sjkim        (UINT64) Descriptor->Address32.Minimum,
279212761Sjkim        (UINT64) Descriptor->Address32.Maximum,
280212761Sjkim        (UINT64) Descriptor->Address32.AddressLength,
281212761Sjkim        (UINT64) Descriptor->Address32.Granularity,
282207340Sjkim        Descriptor->Address32.Flags,
283213806Sjkim        MinOp, MaxOp, LengthOp, GranOp, Op);
284207340Sjkim
285207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
286207340Sjkim                            OptionIndex + StringLength;
287207340Sjkim    return (Rnode);
288207340Sjkim}
289207340Sjkim
290207340Sjkim
291207340Sjkim/*******************************************************************************
292207340Sjkim *
293207340Sjkim * FUNCTION:    RsDoDwordMemoryDescriptor
294207340Sjkim *
295207340Sjkim * PARAMETERS:  Op                  - Parent resource descriptor parse node
296207340Sjkim *              CurrentByteOffset   - Offset into the resource template AML
297207340Sjkim *                                    buffer (to track references to the desc)
298207340Sjkim *
299207340Sjkim * RETURN:      Completed resource node
300207340Sjkim *
301207340Sjkim * DESCRIPTION: Construct a long "DwordMemory" descriptor
302207340Sjkim *
303207340Sjkim ******************************************************************************/
304207340Sjkim
305207340SjkimASL_RESOURCE_NODE *
306207340SjkimRsDoDwordMemoryDescriptor (
307207340Sjkim    ACPI_PARSE_OBJECT       *Op,
308207340Sjkim    UINT32                  CurrentByteOffset)
309207340Sjkim{
310207340Sjkim    AML_RESOURCE            *Descriptor;
311207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
312207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
313207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
314207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
315207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
316207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
317207340Sjkim    UINT8                   *OptionalFields;
318207340Sjkim    UINT16                  StringLength = 0;
319207340Sjkim    UINT32                  OptionIndex = 0;
320207340Sjkim    UINT32                  i;
321207340Sjkim    BOOLEAN                 ResSourceIndex = FALSE;
322207340Sjkim
323207340Sjkim
324207340Sjkim    InitializerOp = Op->Asl.Child;
325207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
326207340Sjkim
327207340Sjkim    Rnode = RsAllocateResourceNode (
328207340Sjkim                sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength);
329207340Sjkim
330207340Sjkim    Descriptor = Rnode->Buffer;
331207340Sjkim    Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32;
332207340Sjkim    Descriptor->Address32.ResourceType   = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
333207340Sjkim
334207340Sjkim    /*
335207340Sjkim     * Initial descriptor length -- may be enlarged if there are
336207340Sjkim     * optional fields present
337207340Sjkim     */
338207340Sjkim    OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
339207340Sjkim    Descriptor->Address32.ResourceLength = (UINT16)
340207340Sjkim        (sizeof (AML_RESOURCE_ADDRESS32) -
341207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
342207340Sjkim
343207340Sjkim
344207340Sjkim    /* Process all child initialization nodes */
345207340Sjkim
346207340Sjkim    for (i = 0; InitializerOp; i++)
347207340Sjkim    {
348207340Sjkim        switch (i)
349207340Sjkim        {
350207340Sjkim        case 0: /* Resource Usage */
351207340Sjkim
352207340Sjkim            RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1);
353207340Sjkim            break;
354207340Sjkim
355207340Sjkim        case 1: /* DecodeType */
356207340Sjkim
357207340Sjkim            RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0);
358207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
359207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1);
360207340Sjkim            break;
361207340Sjkim
362207340Sjkim        case 2: /* MinType */
363207340Sjkim
364207340Sjkim            RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0);
365207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
366207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2);
367207340Sjkim            break;
368207340Sjkim
369207340Sjkim        case 3: /* MaxType */
370207340Sjkim
371207340Sjkim            RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0);
372207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
373207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3);
374207340Sjkim            break;
375207340Sjkim
376207340Sjkim        case 4: /* Memory Type */
377207340Sjkim
378207340Sjkim            RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 1, 0);
379207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
380207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 1);
381207340Sjkim            break;
382207340Sjkim
383207340Sjkim        case 5: /* Read/Write Type */
384207340Sjkim
385207340Sjkim            RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 0, 1);
386207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
387207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 0);
388207340Sjkim            break;
389207340Sjkim
390207340Sjkim        case 6: /* Address Granularity */
391207340Sjkim
392207340Sjkim            Descriptor->Address32.Granularity =
393207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
394207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
395207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
396207340Sjkim            GranOp = InitializerOp;
397207340Sjkim            break;
398207340Sjkim
399207340Sjkim        case 7: /* Min Address */
400207340Sjkim
401207340Sjkim            Descriptor->Address32.Minimum =
402207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
403207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
404207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
405207340Sjkim            MinOp = InitializerOp;
406207340Sjkim            break;
407207340Sjkim
408207340Sjkim        case 8: /* Max Address */
409207340Sjkim
410207340Sjkim            Descriptor->Address32.Maximum =
411207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
412207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
413207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
414207340Sjkim            MaxOp = InitializerOp;
415207340Sjkim            break;
416207340Sjkim
417207340Sjkim        case 9: /* Translation Offset */
418207340Sjkim
419207340Sjkim            Descriptor->Address32.TranslationOffset =
420207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
421207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
422207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
423207340Sjkim            break;
424207340Sjkim
425207340Sjkim        case 10: /* Address Length */
426207340Sjkim
427207340Sjkim            Descriptor->Address32.AddressLength =
428207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
429207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
430207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
431207340Sjkim            LengthOp = InitializerOp;
432207340Sjkim            break;
433207340Sjkim
434207340Sjkim        case 11: /* ResSourceIndex [Optional Field - BYTE] */
435207340Sjkim
436207340Sjkim            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
437207340Sjkim            {
438207340Sjkim                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
439207340Sjkim                OptionIndex++;
440207340Sjkim                Descriptor->Address32.ResourceLength++;
441207340Sjkim                ResSourceIndex = TRUE;
442207340Sjkim            }
443207340Sjkim            break;
444207340Sjkim
445207340Sjkim        case 12: /* ResSource [Optional Field - STRING] */
446207340Sjkim
447207340Sjkim            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
448207340Sjkim                (InitializerOp->Asl.Value.String))
449207340Sjkim            {
450207340Sjkim                if (StringLength)
451207340Sjkim                {
452207340Sjkim                    Descriptor->Address32.ResourceLength = (UINT16)
453207340Sjkim                        (Descriptor->Address32.ResourceLength + StringLength);
454207340Sjkim
455207340Sjkim                    strcpy ((char *)
456207340Sjkim                        &OptionalFields[OptionIndex],
457207340Sjkim                        InitializerOp->Asl.Value.String);
458207340Sjkim
459207340Sjkim                    /* ResourceSourceIndex must also be valid */
460207340Sjkim
461207340Sjkim                    if (!ResSourceIndex)
462207340Sjkim                    {
463207340Sjkim                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
464207340Sjkim                            InitializerOp, NULL);
465207340Sjkim                    }
466207340Sjkim                }
467207340Sjkim            }
468207340Sjkim
469207340Sjkim#if 0
470207340Sjkim            /*
471207340Sjkim             * Not a valid ResourceSource, ResourceSourceIndex must also
472207340Sjkim             * be invalid
473207340Sjkim             */
474207340Sjkim            else if (ResSourceIndex)
475207340Sjkim            {
476207340Sjkim                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
477207340Sjkim                    InitializerOp, NULL);
478207340Sjkim            }
479207340Sjkim#endif
480207340Sjkim            break;
481207340Sjkim
482207340Sjkim        case 13: /* ResourceTag */
483207340Sjkim
484207340Sjkim            UtAttachNamepathToOwner (Op, InitializerOp);
485207340Sjkim            break;
486207340Sjkim
487207340Sjkim
488207340Sjkim        case 14: /* Address Range */
489207340Sjkim
490207340Sjkim            RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 3, 0);
491207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
492207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 3);
493207340Sjkim            break;
494207340Sjkim
495207340Sjkim        case 15: /* Type */
496207340Sjkim
497207340Sjkim            RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 5, 0);
498207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
499207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 5);
500207340Sjkim            break;
501207340Sjkim
502207340Sjkim        default:
503207340Sjkim
504207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
505207340Sjkim            break;
506207340Sjkim        }
507207340Sjkim
508207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
509207340Sjkim    }
510207340Sjkim
511207340Sjkim    /* Validate the Min/Max/Len/Gran values */
512207340Sjkim
513207340Sjkim    RsLargeAddressCheck (
514212761Sjkim        (UINT64) Descriptor->Address32.Minimum,
515212761Sjkim        (UINT64) Descriptor->Address32.Maximum,
516212761Sjkim        (UINT64) Descriptor->Address32.AddressLength,
517212761Sjkim        (UINT64) Descriptor->Address32.Granularity,
518207340Sjkim        Descriptor->Address32.Flags,
519213806Sjkim        MinOp, MaxOp, LengthOp, GranOp, Op);
520207340Sjkim
521207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
522207340Sjkim                            OptionIndex + StringLength;
523207340Sjkim    return (Rnode);
524207340Sjkim}
525207340Sjkim
526207340Sjkim
527207340Sjkim/*******************************************************************************
528207340Sjkim *
529207340Sjkim * FUNCTION:    RsDoDwordSpaceDescriptor
530207340Sjkim *
531207340Sjkim * PARAMETERS:  Op                  - Parent resource descriptor parse node
532207340Sjkim *              CurrentByteOffset   - Offset into the resource template AML
533207340Sjkim *                                    buffer (to track references to the desc)
534207340Sjkim *
535207340Sjkim * RETURN:      Completed resource node
536207340Sjkim *
537207340Sjkim * DESCRIPTION: Construct a long "DwordSpace" descriptor
538207340Sjkim *
539207340Sjkim ******************************************************************************/
540207340Sjkim
541207340SjkimASL_RESOURCE_NODE *
542207340SjkimRsDoDwordSpaceDescriptor (
543207340Sjkim    ACPI_PARSE_OBJECT       *Op,
544207340Sjkim    UINT32                  CurrentByteOffset)
545207340Sjkim{
546207340Sjkim    AML_RESOURCE            *Descriptor;
547207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
548207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
549207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
550207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
551207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
552207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
553207340Sjkim    UINT8                   *OptionalFields;
554207340Sjkim    UINT16                  StringLength = 0;
555207340Sjkim    UINT32                  OptionIndex = 0;
556207340Sjkim    UINT32                  i;
557207340Sjkim    BOOLEAN                 ResSourceIndex = FALSE;
558207340Sjkim
559207340Sjkim
560207340Sjkim    InitializerOp = Op->Asl.Child;
561207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
562207340Sjkim
563207340Sjkim    Rnode = RsAllocateResourceNode (
564207340Sjkim                sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength);
565207340Sjkim
566207340Sjkim    Descriptor = Rnode->Buffer;
567207340Sjkim    Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32;
568207340Sjkim
569207340Sjkim    /*
570207340Sjkim     * Initial descriptor length -- may be enlarged if there are
571207340Sjkim     * optional fields present
572207340Sjkim     */
573207340Sjkim    OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
574207340Sjkim    Descriptor->Address32.ResourceLength = (UINT16)
575207340Sjkim        (sizeof (AML_RESOURCE_ADDRESS32) -
576207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
577207340Sjkim
578207340Sjkim    /* Process all child initialization nodes */
579207340Sjkim
580207340Sjkim    for (i = 0; InitializerOp; i++)
581207340Sjkim    {
582207340Sjkim        switch (i)
583207340Sjkim        {
584207340Sjkim        case 0: /* Resource Type */
585207340Sjkim
586207340Sjkim            Descriptor->Address32.ResourceType =
587207340Sjkim                (UINT8) InitializerOp->Asl.Value.Integer;
588207340Sjkim            break;
589207340Sjkim
590207340Sjkim        case 1: /* Resource Usage */
591207340Sjkim
592207340Sjkim            RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1);
593207340Sjkim            break;
594207340Sjkim
595207340Sjkim        case 2: /* DecodeType */
596207340Sjkim
597207340Sjkim            RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0);
598207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
599207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1);
600207340Sjkim            break;
601207340Sjkim
602207340Sjkim        case 3: /* MinType */
603207340Sjkim
604207340Sjkim            RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0);
605207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
606207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2);
607207340Sjkim            break;
608207340Sjkim
609207340Sjkim        case 4: /* MaxType */
610207340Sjkim
611207340Sjkim            RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0);
612207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
613207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3);
614207340Sjkim            break;
615207340Sjkim
616207340Sjkim        case 5: /* Type-Specific flags */
617207340Sjkim
618207340Sjkim            Descriptor->Address32.SpecificFlags =
619207340Sjkim                (UINT8) InitializerOp->Asl.Value.Integer;
620207340Sjkim            break;
621207340Sjkim
622207340Sjkim        case 6: /* Address Granularity */
623207340Sjkim
624207340Sjkim            Descriptor->Address32.Granularity =
625207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
626207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
627207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
628207340Sjkim            GranOp = InitializerOp;
629207340Sjkim            break;
630207340Sjkim
631207340Sjkim        case 7: /* Min Address */
632207340Sjkim
633207340Sjkim            Descriptor->Address32.Minimum =
634207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
635207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
636207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
637207340Sjkim            MinOp = InitializerOp;
638207340Sjkim            break;
639207340Sjkim
640207340Sjkim        case 8: /* Max Address */
641207340Sjkim
642207340Sjkim            Descriptor->Address32.Maximum =
643207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
644207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
645207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
646207340Sjkim            MaxOp = InitializerOp;
647207340Sjkim            break;
648207340Sjkim
649207340Sjkim        case 9: /* Translation Offset */
650207340Sjkim
651207340Sjkim            Descriptor->Address32.TranslationOffset =
652207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
653207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
654207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
655207340Sjkim            break;
656207340Sjkim
657207340Sjkim        case 10: /* Address Length */
658207340Sjkim
659207340Sjkim            Descriptor->Address32.AddressLength =
660207340Sjkim                (UINT32) InitializerOp->Asl.Value.Integer;
661207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
662207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
663207340Sjkim            LengthOp = InitializerOp;
664207340Sjkim            break;
665207340Sjkim
666207340Sjkim        case 11: /* ResSourceIndex [Optional Field - BYTE] */
667207340Sjkim
668207340Sjkim            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
669207340Sjkim            {
670207340Sjkim                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
671207340Sjkim                OptionIndex++;
672207340Sjkim                Descriptor->Address32.ResourceLength++;
673207340Sjkim                ResSourceIndex = TRUE;
674207340Sjkim            }
675207340Sjkim            break;
676207340Sjkim
677207340Sjkim        case 12: /* ResSource [Optional Field - STRING] */
678207340Sjkim
679207340Sjkim            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
680207340Sjkim                (InitializerOp->Asl.Value.String))
681207340Sjkim            {
682207340Sjkim                if (StringLength)
683207340Sjkim                {
684207340Sjkim                    Descriptor->Address32.ResourceLength = (UINT16)
685207340Sjkim                        (Descriptor->Address32.ResourceLength + StringLength);
686207340Sjkim
687207340Sjkim                    strcpy ((char *)
688207340Sjkim                        &OptionalFields[OptionIndex],
689207340Sjkim                        InitializerOp->Asl.Value.String);
690207340Sjkim
691207340Sjkim                    /* ResourceSourceIndex must also be valid */
692207340Sjkim
693207340Sjkim                    if (!ResSourceIndex)
694207340Sjkim                    {
695207340Sjkim                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
696207340Sjkim                            InitializerOp, NULL);
697207340Sjkim                    }
698207340Sjkim                }
699207340Sjkim            }
700207340Sjkim
701207340Sjkim#if 0
702207340Sjkim            /*
703207340Sjkim             * Not a valid ResourceSource, ResourceSourceIndex must also
704207340Sjkim             * be invalid
705207340Sjkim             */
706207340Sjkim            else if (ResSourceIndex)
707207340Sjkim            {
708207340Sjkim                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
709207340Sjkim                    InitializerOp, NULL);
710207340Sjkim            }
711207340Sjkim#endif
712207340Sjkim            break;
713207340Sjkim
714207340Sjkim        case 13: /* ResourceTag */
715207340Sjkim
716207340Sjkim            UtAttachNamepathToOwner (Op, InitializerOp);
717207340Sjkim            break;
718207340Sjkim
719207340Sjkim        default:
720207340Sjkim
721207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST,
722207340Sjkim                InitializerOp, NULL);
723207340Sjkim            break;
724207340Sjkim        }
725207340Sjkim
726207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
727207340Sjkim    }
728207340Sjkim
729207340Sjkim    /* Validate the Min/Max/Len/Gran values */
730207340Sjkim
731207340Sjkim    RsLargeAddressCheck (
732212761Sjkim        (UINT64) Descriptor->Address32.Minimum,
733212761Sjkim        (UINT64) Descriptor->Address32.Maximum,
734212761Sjkim        (UINT64) Descriptor->Address32.AddressLength,
735212761Sjkim        (UINT64) Descriptor->Address32.Granularity,
736207340Sjkim        Descriptor->Address32.Flags,
737213806Sjkim        MinOp, MaxOp, LengthOp, GranOp, Op);
738207340Sjkim
739207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
740207340Sjkim                            OptionIndex + StringLength;
741207340Sjkim    return (Rnode);
742207340Sjkim}
743