1207340Sjkim/******************************************************************************
2207340Sjkim *
3207340Sjkim * Module Name: aslrestype2q - Large QWord 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    ("aslrestype2q")
50207340Sjkim
51207340Sjkim/*
52207340Sjkim * This module contains the QWord (64-bit) address space descriptors:
53207340Sjkim *
54207340Sjkim * QWordIO
55207340Sjkim * QWordMemory
56207340Sjkim * QWordSpace
57207340Sjkim */
58207340Sjkim
59207340Sjkim/*******************************************************************************
60207340Sjkim *
61207340Sjkim * FUNCTION:    RsDoQwordIoDescriptor
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 "QwordIO" descriptor
70207340Sjkim *
71207340Sjkim ******************************************************************************/
72207340Sjkim
73207340SjkimASL_RESOURCE_NODE *
74207340SjkimRsDoQwordIoDescriptor (
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    UINT8                   *OptionalFields;
86207340Sjkim    UINT16                  StringLength = 0;
87207340Sjkim    UINT32                  OptionIndex = 0;
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_ADDRESS64) + 1 + StringLength);
97207340Sjkim
98207340Sjkim    Descriptor = Rnode->Buffer;
99207340Sjkim    Descriptor->Address64.DescriptorType  = ACPI_RESOURCE_NAME_ADDRESS64;
100207340Sjkim    Descriptor->Address64.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_ADDRESS64);
107207340Sjkim    Descriptor->Address64.ResourceLength = (UINT16)
108207340Sjkim        (sizeof (AML_RESOURCE_ADDRESS64) -
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->Address64.Flags, InitializerOp, 0, 1);
120207340Sjkim            break;
121207340Sjkim
122207340Sjkim        case 1: /* MinType */
123207340Sjkim
124207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
125207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
126207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
127207340Sjkim            break;
128207340Sjkim
129207340Sjkim        case 2: /* MaxType */
130207340Sjkim
131207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
132207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
133207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
134207340Sjkim            break;
135207340Sjkim
136207340Sjkim        case 3: /* DecodeType */
137207340Sjkim
138207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
139207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
140207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
141207340Sjkim            break;
142207340Sjkim
143207340Sjkim        case 4: /* Range Type */
144207340Sjkim
145207340Sjkim            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 3);
146228110Sjkim            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
147228110Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0, 2);
148207340Sjkim            break;
149207340Sjkim
150207340Sjkim        case 5: /* Address Granularity */
151207340Sjkim
152207340Sjkim            Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
153228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
154207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
155207340Sjkim            GranOp = InitializerOp;
156207340Sjkim            break;
157207340Sjkim
158207340Sjkim        case 6: /* Address Min */
159207340Sjkim
160207340Sjkim            Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
161228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
162207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
163207340Sjkim            MinOp = InitializerOp;
164207340Sjkim            break;
165207340Sjkim
166207340Sjkim        case 7: /* Address Max */
167207340Sjkim
168207340Sjkim            Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
169228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
170207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
171207340Sjkim            MaxOp = InitializerOp;
172207340Sjkim            break;
173207340Sjkim
174207340Sjkim        case 8: /* Translation Offset */
175207340Sjkim
176207340Sjkim            Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
177207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
178207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
179207340Sjkim            break;
180207340Sjkim
181207340Sjkim        case 9: /* Address Length */
182207340Sjkim
183207340Sjkim            Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
184228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
185207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
186207340Sjkim            LengthOp = InitializerOp;
187207340Sjkim            break;
188207340Sjkim
189207340Sjkim        case 10: /* ResSourceIndex [Optional Field - BYTE] */
190207340Sjkim
191207340Sjkim            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
192207340Sjkim            {
193207340Sjkim                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
194207340Sjkim                OptionIndex++;
195207340Sjkim                Descriptor->Address64.ResourceLength++;
196207340Sjkim                ResSourceIndex = TRUE;
197207340Sjkim            }
198207340Sjkim            break;
199207340Sjkim
200207340Sjkim        case 11: /* ResSource [Optional Field - STRING] */
201207340Sjkim
202207340Sjkim            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
203207340Sjkim                (InitializerOp->Asl.Value.String))
204207340Sjkim            {
205207340Sjkim                if (StringLength)
206207340Sjkim                {
207207340Sjkim                    Descriptor->Address64.ResourceLength = (UINT16)
208207340Sjkim                        (Descriptor->Address64.ResourceLength + StringLength);
209207340Sjkim
210207340Sjkim                    strcpy ((char *)
211207340Sjkim                        &OptionalFields[OptionIndex],
212207340Sjkim                        InitializerOp->Asl.Value.String);
213207340Sjkim
214207340Sjkim                    /* ResourceSourceIndex must also be valid */
215207340Sjkim
216207340Sjkim                    if (!ResSourceIndex)
217207340Sjkim                    {
218207340Sjkim                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
219207340Sjkim                            InitializerOp, NULL);
220207340Sjkim                    }
221207340Sjkim                }
222207340Sjkim            }
223207340Sjkim
224207340Sjkim#if 0
225207340Sjkim            /*
226207340Sjkim             * Not a valid ResourceSource, ResourceSourceIndex must also
227207340Sjkim             * be invalid
228207340Sjkim             */
229207340Sjkim            else if (ResSourceIndex)
230207340Sjkim            {
231207340Sjkim                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
232207340Sjkim                    InitializerOp, NULL);
233207340Sjkim            }
234207340Sjkim#endif
235207340Sjkim            break;
236207340Sjkim
237207340Sjkim        case 12: /* ResourceTag */
238207340Sjkim
239207340Sjkim            UtAttachNamepathToOwner (Op, InitializerOp);
240207340Sjkim            break;
241207340Sjkim
242207340Sjkim        case 13: /* Type */
243207340Sjkim
244207340Sjkim            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 4, 0);
245207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
246207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 4);
247207340Sjkim            break;
248207340Sjkim
249207340Sjkim        case 14: /* Translation Type */
250207340Sjkim
251207340Sjkim            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0);
252207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
253207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5);
254207340Sjkim            break;
255207340Sjkim
256207340Sjkim        default:
257207340Sjkim
258207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
259207340Sjkim            break;
260207340Sjkim        }
261207340Sjkim
262207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
263207340Sjkim    }
264207340Sjkim
265207340Sjkim    /* Validate the Min/Max/Len/Gran values */
266207340Sjkim
267207340Sjkim    RsLargeAddressCheck (
268207340Sjkim        Descriptor->Address64.Minimum,
269207340Sjkim        Descriptor->Address64.Maximum,
270207340Sjkim        Descriptor->Address64.AddressLength,
271207340Sjkim        Descriptor->Address64.Granularity,
272207340Sjkim        Descriptor->Address64.Flags,
273213806Sjkim        MinOp, MaxOp, LengthOp, GranOp, Op);
274207340Sjkim
275207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
276207340Sjkim                            OptionIndex + StringLength;
277207340Sjkim    return (Rnode);
278207340Sjkim}
279207340Sjkim
280207340Sjkim
281207340Sjkim/*******************************************************************************
282207340Sjkim *
283207340Sjkim * FUNCTION:    RsDoQwordMemoryDescriptor
284207340Sjkim *
285207340Sjkim * PARAMETERS:  Op                  - Parent resource descriptor parse node
286207340Sjkim *              CurrentByteOffset   - Offset into the resource template AML
287207340Sjkim *                                    buffer (to track references to the desc)
288207340Sjkim *
289207340Sjkim * RETURN:      Completed resource node
290207340Sjkim *
291207340Sjkim * DESCRIPTION: Construct a long "QwordMemory" descriptor
292207340Sjkim *
293207340Sjkim ******************************************************************************/
294207340Sjkim
295207340SjkimASL_RESOURCE_NODE *
296207340SjkimRsDoQwordMemoryDescriptor (
297207340Sjkim    ACPI_PARSE_OBJECT       *Op,
298207340Sjkim    UINT32                  CurrentByteOffset)
299207340Sjkim{
300207340Sjkim    AML_RESOURCE            *Descriptor;
301207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
302207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
303207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
304207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
305207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
306207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
307207340Sjkim    UINT8                   *OptionalFields;
308207340Sjkim    UINT16                  StringLength = 0;
309207340Sjkim    UINT32                  OptionIndex = 0;
310207340Sjkim    UINT32                  i;
311207340Sjkim    BOOLEAN                 ResSourceIndex = FALSE;
312207340Sjkim
313207340Sjkim
314207340Sjkim    InitializerOp = Op->Asl.Child;
315207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
316207340Sjkim
317207340Sjkim    Rnode = RsAllocateResourceNode (
318207340Sjkim                sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
319207340Sjkim
320207340Sjkim    Descriptor = Rnode->Buffer;
321207340Sjkim    Descriptor->Address64.DescriptorType  = ACPI_RESOURCE_NAME_ADDRESS64;
322207340Sjkim    Descriptor->Address64.ResourceType    = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
323207340Sjkim
324207340Sjkim    /*
325207340Sjkim     * Initial descriptor length -- may be enlarged if there are
326207340Sjkim     * optional fields present
327207340Sjkim     */
328207340Sjkim    OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
329207340Sjkim    Descriptor->Address64.ResourceLength = (UINT16)
330207340Sjkim        (sizeof (AML_RESOURCE_ADDRESS64) -
331207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
332207340Sjkim
333207340Sjkim    /* Process all child initialization nodes */
334207340Sjkim
335207340Sjkim    for (i = 0; InitializerOp; i++)
336207340Sjkim    {
337207340Sjkim        switch (i)
338207340Sjkim        {
339207340Sjkim        case 0: /* Resource Usage */
340207340Sjkim
341207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
342207340Sjkim            break;
343207340Sjkim
344207340Sjkim        case 1: /* DecodeType */
345207340Sjkim
346207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
347207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
348207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
349207340Sjkim            break;
350207340Sjkim
351207340Sjkim        case 2: /* MinType */
352207340Sjkim
353207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
354207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
355207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
356207340Sjkim            break;
357207340Sjkim
358207340Sjkim        case 3: /* MaxType */
359207340Sjkim
360207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
361207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
362207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
363207340Sjkim            break;
364207340Sjkim
365207340Sjkim        case 4: /* Memory Type */
366207340Sjkim
367207340Sjkim            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 1, 0);
368228110Sjkim            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
369228110Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 1, 2);
370207340Sjkim            break;
371207340Sjkim
372207340Sjkim        case 5: /* Read/Write Type */
373207340Sjkim
374207340Sjkim            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 1);
375207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
376207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0);
377207340Sjkim            break;
378207340Sjkim
379207340Sjkim        case 6: /* Address Granularity */
380207340Sjkim
381207340Sjkim            Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
382228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
383207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
384207340Sjkim            GranOp = InitializerOp;
385207340Sjkim            break;
386207340Sjkim
387207340Sjkim        case 7: /* Min Address */
388207340Sjkim
389207340Sjkim            Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
390228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
391207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
392207340Sjkim            MinOp = InitializerOp;
393207340Sjkim            break;
394207340Sjkim
395207340Sjkim        case 8: /* Max Address */
396207340Sjkim
397207340Sjkim            Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
398228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
399207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
400207340Sjkim            MaxOp = InitializerOp;
401207340Sjkim            break;
402207340Sjkim
403207340Sjkim        case 9: /* Translation Offset */
404207340Sjkim
405207340Sjkim            Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
406228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
407207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
408207340Sjkim            break;
409207340Sjkim
410207340Sjkim        case 10: /* Address Length */
411207340Sjkim
412207340Sjkim            Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
413228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
414207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
415207340Sjkim            LengthOp = InitializerOp;
416207340Sjkim            break;
417207340Sjkim
418207340Sjkim        case 11: /* ResSourceIndex [Optional Field - BYTE] */
419207340Sjkim
420207340Sjkim            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
421207340Sjkim            {
422207340Sjkim                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
423207340Sjkim                OptionIndex++;
424207340Sjkim                Descriptor->Address64.ResourceLength++;
425207340Sjkim                ResSourceIndex = TRUE;
426207340Sjkim            }
427207340Sjkim            break;
428207340Sjkim
429207340Sjkim        case 12: /* ResSource [Optional Field - STRING] */
430207340Sjkim
431207340Sjkim            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
432207340Sjkim                (InitializerOp->Asl.Value.String))
433207340Sjkim            {
434207340Sjkim                if (StringLength)
435207340Sjkim                {
436207340Sjkim                    Descriptor->Address64.ResourceLength = (UINT16)
437207340Sjkim                        (Descriptor->Address64.ResourceLength + StringLength);
438207340Sjkim
439207340Sjkim                    strcpy ((char *)
440207340Sjkim                        &OptionalFields[OptionIndex],
441207340Sjkim                        InitializerOp->Asl.Value.String);
442207340Sjkim
443207340Sjkim                    /* ResourceSourceIndex must also be valid */
444207340Sjkim
445207340Sjkim                    if (!ResSourceIndex)
446207340Sjkim                    {
447207340Sjkim                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
448207340Sjkim                            InitializerOp, NULL);
449207340Sjkim                    }
450207340Sjkim                }
451207340Sjkim            }
452207340Sjkim
453207340Sjkim#if 0
454207340Sjkim            /*
455207340Sjkim             * Not a valid ResourceSource, ResourceSourceIndex must also
456207340Sjkim             * be invalid
457207340Sjkim             */
458207340Sjkim            else if (ResSourceIndex)
459207340Sjkim            {
460207340Sjkim                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
461207340Sjkim                    InitializerOp, NULL);
462207340Sjkim            }
463207340Sjkim#endif
464207340Sjkim            break;
465207340Sjkim
466207340Sjkim        case 13: /* ResourceTag */
467207340Sjkim
468207340Sjkim            UtAttachNamepathToOwner (Op, InitializerOp);
469207340Sjkim            break;
470207340Sjkim
471207340Sjkim
472207340Sjkim        case 14: /* Address Range */
473207340Sjkim
474207340Sjkim            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 3, 0);
475228110Sjkim            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
476228110Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 3, 2);
477207340Sjkim            break;
478207340Sjkim
479207340Sjkim        case 15: /* Type */
480207340Sjkim
481207340Sjkim            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0);
482207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
483207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5);
484207340Sjkim            break;
485207340Sjkim
486207340Sjkim        default:
487207340Sjkim
488207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
489207340Sjkim            break;
490207340Sjkim        }
491207340Sjkim
492207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
493207340Sjkim    }
494207340Sjkim
495207340Sjkim    /* Validate the Min/Max/Len/Gran values */
496207340Sjkim
497207340Sjkim    RsLargeAddressCheck (
498207340Sjkim        Descriptor->Address64.Minimum,
499207340Sjkim        Descriptor->Address64.Maximum,
500207340Sjkim        Descriptor->Address64.AddressLength,
501207340Sjkim        Descriptor->Address64.Granularity,
502207340Sjkim        Descriptor->Address64.Flags,
503213806Sjkim        MinOp, MaxOp, LengthOp, GranOp, Op);
504207340Sjkim
505207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
506207340Sjkim                            OptionIndex + StringLength;
507207340Sjkim    return (Rnode);
508207340Sjkim}
509207340Sjkim
510207340Sjkim
511207340Sjkim/*******************************************************************************
512207340Sjkim *
513207340Sjkim * FUNCTION:    RsDoQwordSpaceDescriptor
514207340Sjkim *
515207340Sjkim * PARAMETERS:  Op                  - Parent resource descriptor parse node
516207340Sjkim *              CurrentByteOffset   - Offset into the resource template AML
517207340Sjkim *                                    buffer (to track references to the desc)
518207340Sjkim *
519207340Sjkim * RETURN:      Completed resource node
520207340Sjkim *
521207340Sjkim * DESCRIPTION: Construct a long "QwordSpace" descriptor
522207340Sjkim *
523207340Sjkim ******************************************************************************/
524207340Sjkim
525207340SjkimASL_RESOURCE_NODE *
526207340SjkimRsDoQwordSpaceDescriptor (
527207340Sjkim    ACPI_PARSE_OBJECT       *Op,
528207340Sjkim    UINT32                  CurrentByteOffset)
529207340Sjkim{
530207340Sjkim    AML_RESOURCE            *Descriptor;
531207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
532207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
533207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
534207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
535207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
536207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
537207340Sjkim    UINT8                   *OptionalFields;
538207340Sjkim    UINT16                  StringLength = 0;
539207340Sjkim    UINT32                  OptionIndex = 0;
540207340Sjkim    UINT32                  i;
541207340Sjkim    BOOLEAN                 ResSourceIndex = FALSE;
542207340Sjkim
543207340Sjkim
544207340Sjkim    InitializerOp = Op->Asl.Child;
545207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
546207340Sjkim
547207340Sjkim    Rnode = RsAllocateResourceNode (
548207340Sjkim                sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
549207340Sjkim
550207340Sjkim    Descriptor = Rnode->Buffer;
551207340Sjkim    Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
552207340Sjkim
553207340Sjkim    /*
554207340Sjkim     * Initial descriptor length -- may be enlarged if there are
555207340Sjkim     * optional fields present
556207340Sjkim     */
557207340Sjkim    OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
558207340Sjkim    Descriptor->Address64.ResourceLength = (UINT16)
559207340Sjkim        (sizeof (AML_RESOURCE_ADDRESS64) -
560207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
561207340Sjkim
562207340Sjkim    /* Process all child initialization nodes */
563207340Sjkim
564207340Sjkim    for (i = 0; InitializerOp; i++)
565207340Sjkim    {
566207340Sjkim        switch (i)
567207340Sjkim        {
568207340Sjkim        case 0: /* Resource Type */
569207340Sjkim
570207340Sjkim            Descriptor->Address64.ResourceType =
571207340Sjkim                (UINT8) InitializerOp->Asl.Value.Integer;
572207340Sjkim            break;
573207340Sjkim
574207340Sjkim        case 1: /* Resource Usage */
575207340Sjkim
576207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
577207340Sjkim            break;
578207340Sjkim
579207340Sjkim        case 2: /* DecodeType */
580207340Sjkim
581207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
582207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
583207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
584207340Sjkim            break;
585207340Sjkim
586207340Sjkim        case 3: /* MinType */
587207340Sjkim
588207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
589207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
590207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
591207340Sjkim            break;
592207340Sjkim
593207340Sjkim        case 4: /* MaxType */
594207340Sjkim
595207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
596207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
597207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
598207340Sjkim            break;
599207340Sjkim
600207340Sjkim        case 5: /* Type-Specific flags */
601207340Sjkim
602207340Sjkim            Descriptor->Address64.SpecificFlags =
603207340Sjkim                (UINT8) InitializerOp->Asl.Value.Integer;
604207340Sjkim            break;
605207340Sjkim
606207340Sjkim        case 6: /* Address Granularity */
607207340Sjkim
608207340Sjkim            Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
609228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
610207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
611207340Sjkim            GranOp = InitializerOp;
612207340Sjkim            break;
613207340Sjkim
614207340Sjkim        case 7: /* Min Address */
615207340Sjkim
616207340Sjkim            Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
617228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
618207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
619207340Sjkim            MinOp = InitializerOp;
620207340Sjkim            break;
621207340Sjkim
622207340Sjkim        case 8: /* Max Address */
623207340Sjkim
624207340Sjkim            Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
625228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
626207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
627207340Sjkim            MaxOp = InitializerOp;
628207340Sjkim            break;
629207340Sjkim
630207340Sjkim        case 9: /* Translation Offset */
631207340Sjkim
632207340Sjkim            Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
633228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
634207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
635207340Sjkim            break;
636207340Sjkim
637207340Sjkim        case 10: /* Address Length */
638207340Sjkim
639207340Sjkim            Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
640228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
641207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
642207340Sjkim            LengthOp = InitializerOp;
643207340Sjkim            break;
644207340Sjkim
645207340Sjkim        case 11: /* ResSourceIndex [Optional Field - BYTE] */
646207340Sjkim
647207340Sjkim            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
648207340Sjkim            {
649207340Sjkim                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
650207340Sjkim                OptionIndex++;
651207340Sjkim                Descriptor->Address64.ResourceLength++;
652207340Sjkim                ResSourceIndex = TRUE;
653207340Sjkim            }
654207340Sjkim            break;
655207340Sjkim
656207340Sjkim        case 12: /* ResSource [Optional Field - STRING] */
657207340Sjkim
658207340Sjkim            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
659207340Sjkim                (InitializerOp->Asl.Value.String))
660207340Sjkim            {
661207340Sjkim                if (StringLength)
662207340Sjkim                {
663207340Sjkim                    Descriptor->Address64.ResourceLength = (UINT16)
664207340Sjkim                        (Descriptor->Address64.ResourceLength + StringLength);
665207340Sjkim
666207340Sjkim                    strcpy ((char *)
667207340Sjkim                        &OptionalFields[OptionIndex],
668207340Sjkim                        InitializerOp->Asl.Value.String);
669207340Sjkim
670207340Sjkim                    /* ResourceSourceIndex must also be valid */
671207340Sjkim
672207340Sjkim                    if (!ResSourceIndex)
673207340Sjkim                    {
674207340Sjkim                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
675207340Sjkim                            InitializerOp, NULL);
676207340Sjkim                    }
677207340Sjkim                }
678207340Sjkim            }
679207340Sjkim
680207340Sjkim#if 0
681207340Sjkim            /*
682207340Sjkim             * Not a valid ResourceSource, ResourceSourceIndex must also
683207340Sjkim             * be invalid
684207340Sjkim             */
685207340Sjkim            else if (ResSourceIndex)
686207340Sjkim            {
687207340Sjkim                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
688207340Sjkim                    InitializerOp, NULL);
689207340Sjkim            }
690207340Sjkim#endif
691207340Sjkim            break;
692207340Sjkim
693207340Sjkim        case 13: /* ResourceTag */
694207340Sjkim
695207340Sjkim            UtAttachNamepathToOwner (Op, InitializerOp);
696207340Sjkim            break;
697207340Sjkim
698207340Sjkim        default:
699207340Sjkim
700207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
701207340Sjkim            break;
702207340Sjkim        }
703207340Sjkim
704207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
705207340Sjkim    }
706207340Sjkim
707207340Sjkim    /* Validate the Min/Max/Len/Gran values */
708207340Sjkim
709207340Sjkim    RsLargeAddressCheck (
710207340Sjkim        Descriptor->Address64.Minimum,
711207340Sjkim        Descriptor->Address64.Maximum,
712207340Sjkim        Descriptor->Address64.AddressLength,
713207340Sjkim        Descriptor->Address64.Granularity,
714207340Sjkim        Descriptor->Address64.Flags,
715213806Sjkim        MinOp, MaxOp, LengthOp, GranOp, Op);
716207340Sjkim
717207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
718207340Sjkim                            OptionIndex + StringLength;
719207340Sjkim    return (Rnode);
720207340Sjkim}
721