1207340Sjkim/******************************************************************************
2207340Sjkim *
3207340Sjkim * Module Name: aslrestype2q - Large QWord address resource descriptors
4207340Sjkim *
5207340Sjkim *****************************************************************************/
6207340Sjkim
7217365Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, 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
44207344Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
45207340Sjkim#include "aslcompiler.y.h"
46207340Sjkim
47207340Sjkim#define _COMPONENT          ACPI_COMPILER
48207340Sjkim        ACPI_MODULE_NAME    ("aslrestype2q")
49207340Sjkim
50207340Sjkim/*
51207340Sjkim * This module contains the QWord (64-bit) address space descriptors:
52207340Sjkim *
53207340Sjkim * QWordIO
54207340Sjkim * QWordMemory
55207340Sjkim * QWordSpace
56207340Sjkim */
57207340Sjkim
58207340Sjkim/*******************************************************************************
59207340Sjkim *
60207340Sjkim * FUNCTION:    RsDoQwordIoDescriptor
61207340Sjkim *
62281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
63207340Sjkim *
64207340Sjkim * RETURN:      Completed resource node
65207340Sjkim *
66207340Sjkim * DESCRIPTION: Construct a long "QwordIO" descriptor
67207340Sjkim *
68207340Sjkim ******************************************************************************/
69207340Sjkim
70207340SjkimASL_RESOURCE_NODE *
71207340SjkimRsDoQwordIoDescriptor (
72281075Sdim    ASL_RESOURCE_INFO       *Info)
73207340Sjkim{
74207340Sjkim    AML_RESOURCE            *Descriptor;
75207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
76207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
77207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
78207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
79207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
80207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
81207340Sjkim    UINT8                   *OptionalFields;
82207340Sjkim    UINT16                  StringLength = 0;
83207340Sjkim    UINT32                  OptionIndex = 0;
84281075Sdim    UINT32                  CurrentByteOffset;
85207340Sjkim    UINT32                  i;
86207340Sjkim    BOOLEAN                 ResSourceIndex = FALSE;
87207340Sjkim
88207340Sjkim
89281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
90207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
91281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
92207340Sjkim
93207340Sjkim    Rnode = RsAllocateResourceNode (
94306536Sjkim        sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
95207340Sjkim
96207340Sjkim    Descriptor = Rnode->Buffer;
97306536Sjkim    Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
98306536Sjkim    Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE;
99207340Sjkim
100207340Sjkim    /*
101207340Sjkim     * Initial descriptor length -- may be enlarged if there are
102207340Sjkim     * optional fields present
103207340Sjkim     */
104207340Sjkim    OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
105207340Sjkim    Descriptor->Address64.ResourceLength = (UINT16)
106207340Sjkim        (sizeof (AML_RESOURCE_ADDRESS64) -
107207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
108207340Sjkim
109207340Sjkim    /* Process all child initialization nodes */
110207340Sjkim
111207340Sjkim    for (i = 0; InitializerOp; i++)
112207340Sjkim    {
113207340Sjkim        switch (i)
114207340Sjkim        {
115207340Sjkim        case 0: /* Resource Usage */
116207340Sjkim
117207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
118207340Sjkim            break;
119207340Sjkim
120207340Sjkim        case 1: /* MinType */
121207340Sjkim
122207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
123207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
124207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
125207340Sjkim            break;
126207340Sjkim
127207340Sjkim        case 2: /* MaxType */
128207340Sjkim
129207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
130207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
131207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
132207340Sjkim            break;
133207340Sjkim
134207340Sjkim        case 3: /* DecodeType */
135207340Sjkim
136207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
137207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
138207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
139207340Sjkim            break;
140207340Sjkim
141207340Sjkim        case 4: /* Range Type */
142207340Sjkim
143207340Sjkim            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 3);
144228110Sjkim            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
145228110Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0, 2);
146207340Sjkim            break;
147207340Sjkim
148207340Sjkim        case 5: /* Address Granularity */
149207340Sjkim
150207340Sjkim            Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
151228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
152207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
153207340Sjkim            GranOp = InitializerOp;
154207340Sjkim            break;
155207340Sjkim
156207340Sjkim        case 6: /* Address Min */
157207340Sjkim
158207340Sjkim            Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
159228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
160207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
161207340Sjkim            MinOp = InitializerOp;
162207340Sjkim            break;
163207340Sjkim
164207340Sjkim        case 7: /* Address Max */
165207340Sjkim
166207340Sjkim            Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
167228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
168207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
169207340Sjkim            MaxOp = InitializerOp;
170207340Sjkim            break;
171207340Sjkim
172207340Sjkim        case 8: /* Translation Offset */
173207340Sjkim
174207340Sjkim            Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
175207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
176207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
177207340Sjkim            break;
178207340Sjkim
179207340Sjkim        case 9: /* Address Length */
180207340Sjkim
181207340Sjkim            Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
182228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
183207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
184207340Sjkim            LengthOp = InitializerOp;
185207340Sjkim            break;
186207340Sjkim
187207340Sjkim        case 10: /* ResSourceIndex [Optional Field - BYTE] */
188207340Sjkim
189207340Sjkim            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
190207340Sjkim            {
191207340Sjkim                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
192207340Sjkim                OptionIndex++;
193207340Sjkim                Descriptor->Address64.ResourceLength++;
194207340Sjkim                ResSourceIndex = TRUE;
195207340Sjkim            }
196207340Sjkim            break;
197207340Sjkim
198207340Sjkim        case 11: /* ResSource [Optional Field - STRING] */
199207340Sjkim
200207340Sjkim            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
201207340Sjkim                (InitializerOp->Asl.Value.String))
202207340Sjkim            {
203207340Sjkim                if (StringLength)
204207340Sjkim                {
205207340Sjkim                    Descriptor->Address64.ResourceLength = (UINT16)
206207340Sjkim                        (Descriptor->Address64.ResourceLength + StringLength);
207207340Sjkim
208207340Sjkim                    strcpy ((char *)
209207340Sjkim                        &OptionalFields[OptionIndex],
210207340Sjkim                        InitializerOp->Asl.Value.String);
211207340Sjkim
212207340Sjkim                    /* ResourceSourceIndex must also be valid */
213207340Sjkim
214207340Sjkim                    if (!ResSourceIndex)
215207340Sjkim                    {
216207340Sjkim                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
217207340Sjkim                            InitializerOp, NULL);
218207340Sjkim                    }
219207340Sjkim                }
220207340Sjkim            }
221207340Sjkim
222207340Sjkim#if 0
223207340Sjkim            /*
224207340Sjkim             * Not a valid ResourceSource, ResourceSourceIndex must also
225207340Sjkim             * be invalid
226207340Sjkim             */
227207340Sjkim            else if (ResSourceIndex)
228207340Sjkim            {
229207340Sjkim                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
230207340Sjkim                    InitializerOp, NULL);
231207340Sjkim            }
232207340Sjkim#endif
233207340Sjkim            break;
234207340Sjkim
235207340Sjkim        case 12: /* ResourceTag */
236207340Sjkim
237281075Sdim            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
238207340Sjkim            break;
239207340Sjkim
240207340Sjkim        case 13: /* Type */
241207340Sjkim
242207340Sjkim            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 4, 0);
243207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
244207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 4);
245207340Sjkim            break;
246207340Sjkim
247207340Sjkim        case 14: /* Translation Type */
248207340Sjkim
249207340Sjkim            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0);
250207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
251207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5);
252207340Sjkim            break;
253207340Sjkim
254207340Sjkim        default:
255207340Sjkim
256207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
257207340Sjkim            break;
258207340Sjkim        }
259207340Sjkim
260207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
261207340Sjkim    }
262207340Sjkim
263207340Sjkim    /* Validate the Min/Max/Len/Gran values */
264207340Sjkim
265207340Sjkim    RsLargeAddressCheck (
266207340Sjkim        Descriptor->Address64.Minimum,
267207340Sjkim        Descriptor->Address64.Maximum,
268207340Sjkim        Descriptor->Address64.AddressLength,
269207340Sjkim        Descriptor->Address64.Granularity,
270207340Sjkim        Descriptor->Address64.Flags,
271281075Sdim        MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp);
272207340Sjkim
273207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
274281075Sdim        OptionIndex + StringLength;
275207340Sjkim    return (Rnode);
276207340Sjkim}
277207340Sjkim
278207340Sjkim
279207340Sjkim/*******************************************************************************
280207340Sjkim *
281207340Sjkim * FUNCTION:    RsDoQwordMemoryDescriptor
282207340Sjkim *
283281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
284207340Sjkim *
285207340Sjkim * RETURN:      Completed resource node
286207340Sjkim *
287207340Sjkim * DESCRIPTION: Construct a long "QwordMemory" descriptor
288207340Sjkim *
289207340Sjkim ******************************************************************************/
290207340Sjkim
291207340SjkimASL_RESOURCE_NODE *
292207340SjkimRsDoQwordMemoryDescriptor (
293281075Sdim    ASL_RESOURCE_INFO       *Info)
294207340Sjkim{
295207340Sjkim    AML_RESOURCE            *Descriptor;
296207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
297207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
298207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
299207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
300207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
301207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
302207340Sjkim    UINT8                   *OptionalFields;
303207340Sjkim    UINT16                  StringLength = 0;
304207340Sjkim    UINT32                  OptionIndex = 0;
305281075Sdim    UINT32                  CurrentByteOffset;
306207340Sjkim    UINT32                  i;
307207340Sjkim    BOOLEAN                 ResSourceIndex = FALSE;
308207340Sjkim
309207340Sjkim
310281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
311207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
312281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
313207340Sjkim
314207340Sjkim    Rnode = RsAllocateResourceNode (
315306536Sjkim        sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
316207340Sjkim
317207340Sjkim    Descriptor = Rnode->Buffer;
318306536Sjkim    Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
319306536Sjkim    Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
320207340Sjkim
321207340Sjkim    /*
322207340Sjkim     * Initial descriptor length -- may be enlarged if there are
323207340Sjkim     * optional fields present
324207340Sjkim     */
325207340Sjkim    OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
326207340Sjkim    Descriptor->Address64.ResourceLength = (UINT16)
327207340Sjkim        (sizeof (AML_RESOURCE_ADDRESS64) -
328207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
329207340Sjkim
330207340Sjkim    /* Process all child initialization nodes */
331207340Sjkim
332207340Sjkim    for (i = 0; InitializerOp; i++)
333207340Sjkim    {
334207340Sjkim        switch (i)
335207340Sjkim        {
336207340Sjkim        case 0: /* Resource Usage */
337207340Sjkim
338207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
339207340Sjkim            break;
340207340Sjkim
341207340Sjkim        case 1: /* DecodeType */
342207340Sjkim
343207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
344207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
345207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
346207340Sjkim            break;
347207340Sjkim
348207340Sjkim        case 2: /* MinType */
349207340Sjkim
350207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
351207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
352207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
353207340Sjkim            break;
354207340Sjkim
355207340Sjkim        case 3: /* MaxType */
356207340Sjkim
357207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
358207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
359207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
360207340Sjkim            break;
361207340Sjkim
362207340Sjkim        case 4: /* Memory Type */
363207340Sjkim
364207340Sjkim            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 1, 0);
365228110Sjkim            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
366228110Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 1, 2);
367207340Sjkim            break;
368207340Sjkim
369207340Sjkim        case 5: /* Read/Write Type */
370207340Sjkim
371207340Sjkim            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 1);
372207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
373207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0);
374207340Sjkim            break;
375207340Sjkim
376207340Sjkim        case 6: /* Address Granularity */
377207340Sjkim
378207340Sjkim            Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
379228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
380207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
381207340Sjkim            GranOp = InitializerOp;
382207340Sjkim            break;
383207340Sjkim
384207340Sjkim        case 7: /* Min Address */
385207340Sjkim
386207340Sjkim            Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
387228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
388207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
389207340Sjkim            MinOp = InitializerOp;
390207340Sjkim            break;
391207340Sjkim
392207340Sjkim        case 8: /* Max Address */
393207340Sjkim
394207340Sjkim            Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
395228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
396207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
397207340Sjkim            MaxOp = InitializerOp;
398207340Sjkim            break;
399207340Sjkim
400207340Sjkim        case 9: /* Translation Offset */
401207340Sjkim
402207340Sjkim            Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
403228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
404207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
405207340Sjkim            break;
406207340Sjkim
407207340Sjkim        case 10: /* Address Length */
408207340Sjkim
409207340Sjkim            Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
410228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
411207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
412207340Sjkim            LengthOp = InitializerOp;
413207340Sjkim            break;
414207340Sjkim
415207340Sjkim        case 11: /* ResSourceIndex [Optional Field - BYTE] */
416207340Sjkim
417207340Sjkim            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
418207340Sjkim            {
419207340Sjkim                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
420207340Sjkim                OptionIndex++;
421207340Sjkim                Descriptor->Address64.ResourceLength++;
422207340Sjkim                ResSourceIndex = TRUE;
423207340Sjkim            }
424207340Sjkim            break;
425207340Sjkim
426207340Sjkim        case 12: /* ResSource [Optional Field - STRING] */
427207340Sjkim
428207340Sjkim            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
429207340Sjkim                (InitializerOp->Asl.Value.String))
430207340Sjkim            {
431207340Sjkim                if (StringLength)
432207340Sjkim                {
433207340Sjkim                    Descriptor->Address64.ResourceLength = (UINT16)
434207340Sjkim                        (Descriptor->Address64.ResourceLength + StringLength);
435207340Sjkim
436207340Sjkim                    strcpy ((char *)
437207340Sjkim                        &OptionalFields[OptionIndex],
438207340Sjkim                        InitializerOp->Asl.Value.String);
439207340Sjkim
440207340Sjkim                    /* ResourceSourceIndex must also be valid */
441207340Sjkim
442207340Sjkim                    if (!ResSourceIndex)
443207340Sjkim                    {
444207340Sjkim                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
445207340Sjkim                            InitializerOp, NULL);
446207340Sjkim                    }
447207340Sjkim                }
448207340Sjkim            }
449207340Sjkim
450207340Sjkim#if 0
451207340Sjkim            /*
452207340Sjkim             * Not a valid ResourceSource, ResourceSourceIndex must also
453207340Sjkim             * be invalid
454207340Sjkim             */
455207340Sjkim            else if (ResSourceIndex)
456207340Sjkim            {
457207340Sjkim                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
458207340Sjkim                    InitializerOp, NULL);
459207340Sjkim            }
460207340Sjkim#endif
461207340Sjkim            break;
462207340Sjkim
463207340Sjkim        case 13: /* ResourceTag */
464207340Sjkim
465281075Sdim            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
466207340Sjkim            break;
467207340Sjkim
468207340Sjkim
469207340Sjkim        case 14: /* Address Range */
470207340Sjkim
471207340Sjkim            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 3, 0);
472228110Sjkim            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
473228110Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 3, 2);
474207340Sjkim            break;
475207340Sjkim
476207340Sjkim        case 15: /* Type */
477207340Sjkim
478207340Sjkim            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0);
479207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
480207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5);
481207340Sjkim            break;
482207340Sjkim
483207340Sjkim        default:
484207340Sjkim
485207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
486207340Sjkim            break;
487207340Sjkim        }
488207340Sjkim
489207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
490207340Sjkim    }
491207340Sjkim
492207340Sjkim    /* Validate the Min/Max/Len/Gran values */
493207340Sjkim
494207340Sjkim    RsLargeAddressCheck (
495207340Sjkim        Descriptor->Address64.Minimum,
496207340Sjkim        Descriptor->Address64.Maximum,
497207340Sjkim        Descriptor->Address64.AddressLength,
498207340Sjkim        Descriptor->Address64.Granularity,
499207340Sjkim        Descriptor->Address64.Flags,
500281075Sdim        MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp);
501207340Sjkim
502207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
503281075Sdim        OptionIndex + StringLength;
504207340Sjkim    return (Rnode);
505207340Sjkim}
506207340Sjkim
507207340Sjkim
508207340Sjkim/*******************************************************************************
509207340Sjkim *
510207340Sjkim * FUNCTION:    RsDoQwordSpaceDescriptor
511207340Sjkim *
512281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
513207340Sjkim *
514207340Sjkim * RETURN:      Completed resource node
515207340Sjkim *
516207340Sjkim * DESCRIPTION: Construct a long "QwordSpace" descriptor
517207340Sjkim *
518207340Sjkim ******************************************************************************/
519207340Sjkim
520207340SjkimASL_RESOURCE_NODE *
521207340SjkimRsDoQwordSpaceDescriptor (
522281075Sdim    ASL_RESOURCE_INFO       *Info)
523207340Sjkim{
524207340Sjkim    AML_RESOURCE            *Descriptor;
525207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
526207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
527207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
528207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
529207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
530207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
531207340Sjkim    UINT8                   *OptionalFields;
532207340Sjkim    UINT16                  StringLength = 0;
533207340Sjkim    UINT32                  OptionIndex = 0;
534281075Sdim    UINT32                  CurrentByteOffset;
535207340Sjkim    UINT32                  i;
536207340Sjkim    BOOLEAN                 ResSourceIndex = FALSE;
537207340Sjkim
538207340Sjkim
539281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
540207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
541281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
542207340Sjkim
543207340Sjkim    Rnode = RsAllocateResourceNode (
544306536Sjkim        sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
545207340Sjkim
546207340Sjkim    Descriptor = Rnode->Buffer;
547207340Sjkim    Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
548207340Sjkim
549207340Sjkim    /*
550207340Sjkim     * Initial descriptor length -- may be enlarged if there are
551207340Sjkim     * optional fields present
552207340Sjkim     */
553207340Sjkim    OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
554207340Sjkim    Descriptor->Address64.ResourceLength = (UINT16)
555207340Sjkim        (sizeof (AML_RESOURCE_ADDRESS64) -
556207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
557207340Sjkim
558207340Sjkim    /* Process all child initialization nodes */
559207340Sjkim
560207340Sjkim    for (i = 0; InitializerOp; i++)
561207340Sjkim    {
562207340Sjkim        switch (i)
563207340Sjkim        {
564207340Sjkim        case 0: /* Resource Type */
565207340Sjkim
566207340Sjkim            Descriptor->Address64.ResourceType =
567207340Sjkim                (UINT8) InitializerOp->Asl.Value.Integer;
568207340Sjkim            break;
569207340Sjkim
570207340Sjkim        case 1: /* Resource Usage */
571207340Sjkim
572207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
573207340Sjkim            break;
574207340Sjkim
575207340Sjkim        case 2: /* DecodeType */
576207340Sjkim
577207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
578207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
579207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
580207340Sjkim            break;
581207340Sjkim
582207340Sjkim        case 3: /* MinType */
583207340Sjkim
584207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
585207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
586207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
587207340Sjkim            break;
588207340Sjkim
589207340Sjkim        case 4: /* MaxType */
590207340Sjkim
591207340Sjkim            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
592207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
593207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
594207340Sjkim            break;
595207340Sjkim
596207340Sjkim        case 5: /* Type-Specific flags */
597207340Sjkim
598207340Sjkim            Descriptor->Address64.SpecificFlags =
599207340Sjkim                (UINT8) InitializerOp->Asl.Value.Integer;
600207340Sjkim            break;
601207340Sjkim
602207340Sjkim        case 6: /* Address Granularity */
603207340Sjkim
604207340Sjkim            Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
605228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
606207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
607207340Sjkim            GranOp = InitializerOp;
608207340Sjkim            break;
609207340Sjkim
610207340Sjkim        case 7: /* Min Address */
611207340Sjkim
612207340Sjkim            Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
613228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
614207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
615207340Sjkim            MinOp = InitializerOp;
616207340Sjkim            break;
617207340Sjkim
618207340Sjkim        case 8: /* Max Address */
619207340Sjkim
620207340Sjkim            Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
621228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
622207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
623207340Sjkim            MaxOp = InitializerOp;
624207340Sjkim            break;
625207340Sjkim
626207340Sjkim        case 9: /* Translation Offset */
627207340Sjkim
628207340Sjkim            Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
629228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
630207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
631207340Sjkim            break;
632207340Sjkim
633207340Sjkim        case 10: /* Address Length */
634207340Sjkim
635207340Sjkim            Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
636228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
637207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
638207340Sjkim            LengthOp = InitializerOp;
639207340Sjkim            break;
640207340Sjkim
641207340Sjkim        case 11: /* ResSourceIndex [Optional Field - BYTE] */
642207340Sjkim
643207340Sjkim            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
644207340Sjkim            {
645207340Sjkim                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
646207340Sjkim                OptionIndex++;
647207340Sjkim                Descriptor->Address64.ResourceLength++;
648207340Sjkim                ResSourceIndex = TRUE;
649207340Sjkim            }
650207340Sjkim            break;
651207340Sjkim
652207340Sjkim        case 12: /* ResSource [Optional Field - STRING] */
653207340Sjkim
654207340Sjkim            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
655207340Sjkim                (InitializerOp->Asl.Value.String))
656207340Sjkim            {
657207340Sjkim                if (StringLength)
658207340Sjkim                {
659207340Sjkim                    Descriptor->Address64.ResourceLength = (UINT16)
660207340Sjkim                        (Descriptor->Address64.ResourceLength + StringLength);
661207340Sjkim
662207340Sjkim                    strcpy ((char *)
663207340Sjkim                        &OptionalFields[OptionIndex],
664207340Sjkim                        InitializerOp->Asl.Value.String);
665207340Sjkim
666207340Sjkim                    /* ResourceSourceIndex must also be valid */
667207340Sjkim
668207340Sjkim                    if (!ResSourceIndex)
669207340Sjkim                    {
670207340Sjkim                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
671207340Sjkim                            InitializerOp, NULL);
672207340Sjkim                    }
673207340Sjkim                }
674207340Sjkim            }
675207340Sjkim
676207340Sjkim#if 0
677207340Sjkim            /*
678207340Sjkim             * Not a valid ResourceSource, ResourceSourceIndex must also
679207340Sjkim             * be invalid
680207340Sjkim             */
681207340Sjkim            else if (ResSourceIndex)
682207340Sjkim            {
683207340Sjkim                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
684207340Sjkim                    InitializerOp, NULL);
685207340Sjkim            }
686207340Sjkim#endif
687207340Sjkim            break;
688207340Sjkim
689207340Sjkim        case 13: /* ResourceTag */
690207340Sjkim
691281075Sdim            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
692207340Sjkim            break;
693207340Sjkim
694207340Sjkim        default:
695207340Sjkim
696207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
697207340Sjkim            break;
698207340Sjkim        }
699207340Sjkim
700207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
701207340Sjkim    }
702207340Sjkim
703207340Sjkim    /* Validate the Min/Max/Len/Gran values */
704207340Sjkim
705207340Sjkim    RsLargeAddressCheck (
706207340Sjkim        Descriptor->Address64.Minimum,
707207340Sjkim        Descriptor->Address64.Maximum,
708207340Sjkim        Descriptor->Address64.AddressLength,
709207340Sjkim        Descriptor->Address64.Granularity,
710207340Sjkim        Descriptor->Address64.Flags,
711281075Sdim        MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp);
712207340Sjkim
713207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
714281075Sdim        OptionIndex + StringLength;
715207340Sjkim    return (Rnode);
716207340Sjkim}
717