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