aslrestype2q.c revision 228110
1247738Sbapt
2247738Sbapt/******************************************************************************
3247738Sbapt *
4247738Sbapt * Module Name: aslrestype2q - Large QWord address resource descriptors
5247738Sbapt *
6247738Sbapt *****************************************************************************/
7247738Sbapt
8247738Sbapt/*
9247738Sbapt * Copyright (C) 2000 - 2011, Intel Corp.
10247738Sbapt * All rights reserved.
11247738Sbapt *
12247738Sbapt * Redistribution and use in source and binary forms, with or without
13247738Sbapt * modification, are permitted provided that the following conditions
14247738Sbapt * are met:
15247738Sbapt * 1. Redistributions of source code must retain the above copyright
16247738Sbapt *    notice, this list of conditions, and the following disclaimer,
17247738Sbapt *    without modification.
18247738Sbapt * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19247738Sbapt *    substantially similar to the "NO WARRANTY" disclaimer below
20247738Sbapt *    ("Disclaimer") and any redistribution must be conditioned upon
21247738Sbapt *    including a substantially similar Disclaimer requirement for further
22247738Sbapt *    binary redistribution.
23247738Sbapt * 3. Neither the names of the above-listed copyright holders nor the names
24247738Sbapt *    of any contributors may be used to endorse or promote products derived
25247738Sbapt *    from this software without specific prior written permission.
26247738Sbapt *
27247738Sbapt * Alternatively, this software may be distributed under the terms of the
28247738Sbapt * GNU General Public License ("GPL") version 2 as published by the Free
29247738Sbapt * Software Foundation.
30247738Sbapt *
31247738Sbapt * NO WARRANTY
32247738Sbapt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33247738Sbapt * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34247738Sbapt * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35247738Sbapt * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36247738Sbapt * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37247738Sbapt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38247738Sbapt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39247738Sbapt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40247738Sbapt * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41247738Sbapt * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42247738Sbapt * POSSIBILITY OF SUCH DAMAGES.
43247738Sbapt */
44247738Sbapt
45247738Sbapt
46247738Sbapt#include <contrib/dev/acpica/compiler/aslcompiler.h>
47247738Sbapt#include "aslcompiler.y.h"
48247738Sbapt
49247738Sbapt#define _COMPONENT          ACPI_COMPILER
50247738Sbapt        ACPI_MODULE_NAME    ("aslrestype2q")
51247738Sbapt
52247738Sbapt/*
53247738Sbapt * This module contains the QWord (64-bit) address space descriptors:
54247738Sbapt *
55247738Sbapt * QWordIO
56247738Sbapt * QWordMemory
57247738Sbapt * QWordSpace
58247738Sbapt */
59247738Sbapt
60247738Sbapt/*******************************************************************************
61247738Sbapt *
62247738Sbapt * FUNCTION:    RsDoQwordIoDescriptor
63247738Sbapt *
64247738Sbapt * PARAMETERS:  Op                  - Parent resource descriptor parse node
65247738Sbapt *              CurrentByteOffset   - Offset into the resource template AML
66247738Sbapt *                                    buffer (to track references to the desc)
67247738Sbapt *
68247738Sbapt * RETURN:      Completed resource node
69247738Sbapt *
70247738Sbapt * DESCRIPTION: Construct a long "QwordIO" descriptor
71247738Sbapt *
72247738Sbapt ******************************************************************************/
73247738Sbapt
74247738SbaptASL_RESOURCE_NODE *
75247738SbaptRsDoQwordIoDescriptor (
76247738Sbapt    ACPI_PARSE_OBJECT       *Op,
77247738Sbapt    UINT32                  CurrentByteOffset)
78247738Sbapt{
79247738Sbapt    AML_RESOURCE            *Descriptor;
80247738Sbapt    ACPI_PARSE_OBJECT       *InitializerOp;
81247738Sbapt    ACPI_PARSE_OBJECT       *MinOp = NULL;
82247738Sbapt    ACPI_PARSE_OBJECT       *MaxOp = NULL;
83247738Sbapt    ACPI_PARSE_OBJECT       *LengthOp = NULL;
84247738Sbapt    ACPI_PARSE_OBJECT       *GranOp = NULL;
85247738Sbapt    ASL_RESOURCE_NODE       *Rnode;
86247738Sbapt    UINT8                   *OptionalFields;
87247738Sbapt    UINT16                  StringLength = 0;
88247738Sbapt    UINT32                  OptionIndex = 0;
89247738Sbapt    UINT32                  i;
90247738Sbapt    BOOLEAN                 ResSourceIndex = FALSE;
91247738Sbapt
92247738Sbapt
93247738Sbapt    InitializerOp = Op->Asl.Child;
94247738Sbapt    StringLength = RsGetStringDataLength (InitializerOp);
95247738Sbapt
96247738Sbapt    Rnode = RsAllocateResourceNode (
97247738Sbapt                sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
98247738Sbapt
99247738Sbapt    Descriptor = Rnode->Buffer;
100247738Sbapt    Descriptor->Address64.DescriptorType  = ACPI_RESOURCE_NAME_ADDRESS64;
101247738Sbapt    Descriptor->Address64.ResourceType    = ACPI_ADDRESS_TYPE_IO_RANGE;
102247738Sbapt
103247738Sbapt    /*
104247738Sbapt     * Initial descriptor length -- may be enlarged if there are
105247738Sbapt     * optional fields present
106247738Sbapt     */
107247738Sbapt    OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
108247738Sbapt    Descriptor->Address64.ResourceLength = (UINT16)
109247738Sbapt        (sizeof (AML_RESOURCE_ADDRESS64) -
110247738Sbapt         sizeof (AML_RESOURCE_LARGE_HEADER));
111247738Sbapt
112247738Sbapt    /* Process all child initialization nodes */
113247738Sbapt
114247738Sbapt    for (i = 0; InitializerOp; i++)
115247738Sbapt    {
116247738Sbapt        switch (i)
117247738Sbapt        {
118247738Sbapt        case 0: /* Resource Usage */
119247738Sbapt
120247738Sbapt            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
121247738Sbapt            break;
122247738Sbapt
123247738Sbapt        case 1: /* MinType */
124247738Sbapt
125247738Sbapt            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
126247738Sbapt            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
127247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
128247738Sbapt            break;
129247738Sbapt
130247738Sbapt        case 2: /* MaxType */
131247738Sbapt
132247738Sbapt            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
133247738Sbapt            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
134247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
135247738Sbapt            break;
136247738Sbapt
137247738Sbapt        case 3: /* DecodeType */
138247738Sbapt
139247738Sbapt            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
140247738Sbapt            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
141247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
142247738Sbapt            break;
143247738Sbapt
144247738Sbapt        case 4: /* Range Type */
145247738Sbapt
146247738Sbapt            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 3);
147247738Sbapt            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
148247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0, 2);
149247738Sbapt            break;
150247738Sbapt
151247738Sbapt        case 5: /* Address Granularity */
152247738Sbapt
153247738Sbapt            Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
154247738Sbapt            RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
155247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
156247738Sbapt            GranOp = InitializerOp;
157247738Sbapt            break;
158247738Sbapt
159247738Sbapt        case 6: /* Address Min */
160247738Sbapt
161247738Sbapt            Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
162247738Sbapt            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
163247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
164247738Sbapt            MinOp = InitializerOp;
165247738Sbapt            break;
166247738Sbapt
167247738Sbapt        case 7: /* Address Max */
168247738Sbapt
169247738Sbapt            Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
170247738Sbapt            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
171247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
172247738Sbapt            MaxOp = InitializerOp;
173247738Sbapt            break;
174247738Sbapt
175247738Sbapt        case 8: /* Translation Offset */
176247738Sbapt
177247738Sbapt            Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
178247738Sbapt            RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
179247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
180247738Sbapt            break;
181247738Sbapt
182247738Sbapt        case 9: /* Address Length */
183247738Sbapt
184247738Sbapt            Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
185247738Sbapt            RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
186247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
187247738Sbapt            LengthOp = InitializerOp;
188247738Sbapt            break;
189247738Sbapt
190247738Sbapt        case 10: /* ResSourceIndex [Optional Field - BYTE] */
191247738Sbapt
192247738Sbapt            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
193247738Sbapt            {
194247738Sbapt                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
195247738Sbapt                OptionIndex++;
196247738Sbapt                Descriptor->Address64.ResourceLength++;
197247738Sbapt                ResSourceIndex = TRUE;
198247738Sbapt            }
199247738Sbapt            break;
200247738Sbapt
201247738Sbapt        case 11: /* ResSource [Optional Field - STRING] */
202247738Sbapt
203247738Sbapt            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
204247738Sbapt                (InitializerOp->Asl.Value.String))
205247738Sbapt            {
206247738Sbapt                if (StringLength)
207247738Sbapt                {
208247738Sbapt                    Descriptor->Address64.ResourceLength = (UINT16)
209247738Sbapt                        (Descriptor->Address64.ResourceLength + StringLength);
210247738Sbapt
211247738Sbapt                    strcpy ((char *)
212247738Sbapt                        &OptionalFields[OptionIndex],
213247738Sbapt                        InitializerOp->Asl.Value.String);
214247738Sbapt
215247738Sbapt                    /* ResourceSourceIndex must also be valid */
216247738Sbapt
217247738Sbapt                    if (!ResSourceIndex)
218247738Sbapt                    {
219247738Sbapt                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
220247738Sbapt                            InitializerOp, NULL);
221247738Sbapt                    }
222247738Sbapt                }
223247738Sbapt            }
224247738Sbapt
225247738Sbapt#if 0
226247738Sbapt            /*
227247738Sbapt             * Not a valid ResourceSource, ResourceSourceIndex must also
228247738Sbapt             * be invalid
229247738Sbapt             */
230247738Sbapt            else if (ResSourceIndex)
231247738Sbapt            {
232247738Sbapt                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
233247738Sbapt                    InitializerOp, NULL);
234247738Sbapt            }
235247738Sbapt#endif
236247738Sbapt            break;
237247738Sbapt
238247738Sbapt        case 12: /* ResourceTag */
239247738Sbapt
240247738Sbapt            UtAttachNamepathToOwner (Op, InitializerOp);
241247738Sbapt            break;
242247738Sbapt
243247738Sbapt        case 13: /* Type */
244247738Sbapt
245247738Sbapt            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 4, 0);
246247738Sbapt            RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
247247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 4);
248247738Sbapt            break;
249247738Sbapt
250247738Sbapt        case 14: /* Translation Type */
251247738Sbapt
252247738Sbapt            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0);
253247738Sbapt            RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
254247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5);
255247738Sbapt            break;
256247738Sbapt
257247738Sbapt        default:
258247738Sbapt
259247738Sbapt            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
260247738Sbapt            break;
261247738Sbapt        }
262247738Sbapt
263247738Sbapt        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
264247738Sbapt    }
265247738Sbapt
266247738Sbapt    /* Validate the Min/Max/Len/Gran values */
267247738Sbapt
268247738Sbapt    RsLargeAddressCheck (
269247738Sbapt        Descriptor->Address64.Minimum,
270247738Sbapt        Descriptor->Address64.Maximum,
271247738Sbapt        Descriptor->Address64.AddressLength,
272247738Sbapt        Descriptor->Address64.Granularity,
273247738Sbapt        Descriptor->Address64.Flags,
274247738Sbapt        MinOp, MaxOp, LengthOp, GranOp, Op);
275247738Sbapt
276247738Sbapt    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
277247738Sbapt                            OptionIndex + StringLength;
278247738Sbapt    return (Rnode);
279247738Sbapt}
280247738Sbapt
281247738Sbapt
282247738Sbapt/*******************************************************************************
283247738Sbapt *
284247738Sbapt * FUNCTION:    RsDoQwordMemoryDescriptor
285247738Sbapt *
286247738Sbapt * PARAMETERS:  Op                  - Parent resource descriptor parse node
287247738Sbapt *              CurrentByteOffset   - Offset into the resource template AML
288247738Sbapt *                                    buffer (to track references to the desc)
289247738Sbapt *
290247738Sbapt * RETURN:      Completed resource node
291247738Sbapt *
292247738Sbapt * DESCRIPTION: Construct a long "QwordMemory" descriptor
293247738Sbapt *
294247738Sbapt ******************************************************************************/
295247738Sbapt
296247738SbaptASL_RESOURCE_NODE *
297247738SbaptRsDoQwordMemoryDescriptor (
298247738Sbapt    ACPI_PARSE_OBJECT       *Op,
299247738Sbapt    UINT32                  CurrentByteOffset)
300247738Sbapt{
301247738Sbapt    AML_RESOURCE            *Descriptor;
302247738Sbapt    ACPI_PARSE_OBJECT       *InitializerOp;
303247738Sbapt    ACPI_PARSE_OBJECT       *MinOp = NULL;
304247738Sbapt    ACPI_PARSE_OBJECT       *MaxOp = NULL;
305247738Sbapt    ACPI_PARSE_OBJECT       *LengthOp = NULL;
306247738Sbapt    ACPI_PARSE_OBJECT       *GranOp = NULL;
307247738Sbapt    ASL_RESOURCE_NODE       *Rnode;
308247738Sbapt    UINT8                   *OptionalFields;
309247738Sbapt    UINT16                  StringLength = 0;
310247738Sbapt    UINT32                  OptionIndex = 0;
311247738Sbapt    UINT32                  i;
312247738Sbapt    BOOLEAN                 ResSourceIndex = FALSE;
313247738Sbapt
314247738Sbapt
315247738Sbapt    InitializerOp = Op->Asl.Child;
316247738Sbapt    StringLength = RsGetStringDataLength (InitializerOp);
317247738Sbapt
318247738Sbapt    Rnode = RsAllocateResourceNode (
319247738Sbapt                sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
320247738Sbapt
321247738Sbapt    Descriptor = Rnode->Buffer;
322247738Sbapt    Descriptor->Address64.DescriptorType  = ACPI_RESOURCE_NAME_ADDRESS64;
323247738Sbapt    Descriptor->Address64.ResourceType    = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
324247738Sbapt
325247738Sbapt    /*
326247738Sbapt     * Initial descriptor length -- may be enlarged if there are
327247738Sbapt     * optional fields present
328247738Sbapt     */
329247738Sbapt    OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
330247738Sbapt    Descriptor->Address64.ResourceLength = (UINT16)
331247738Sbapt        (sizeof (AML_RESOURCE_ADDRESS64) -
332247738Sbapt         sizeof (AML_RESOURCE_LARGE_HEADER));
333247738Sbapt
334247738Sbapt    /* Process all child initialization nodes */
335247738Sbapt
336247738Sbapt    for (i = 0; InitializerOp; i++)
337247738Sbapt    {
338247738Sbapt        switch (i)
339247738Sbapt        {
340247738Sbapt        case 0: /* Resource Usage */
341247738Sbapt
342247738Sbapt            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
343247738Sbapt            break;
344247738Sbapt
345247738Sbapt        case 1: /* DecodeType */
346247738Sbapt
347247738Sbapt            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
348247738Sbapt            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
349247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
350247738Sbapt            break;
351247738Sbapt
352247738Sbapt        case 2: /* MinType */
353247738Sbapt
354247738Sbapt            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
355247738Sbapt            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
356247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
357247738Sbapt            break;
358247738Sbapt
359247738Sbapt        case 3: /* MaxType */
360247738Sbapt
361247738Sbapt            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
362247738Sbapt            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
363247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
364247738Sbapt            break;
365247738Sbapt
366247738Sbapt        case 4: /* Memory Type */
367247738Sbapt
368247738Sbapt            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 1, 0);
369247738Sbapt            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
370247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 1, 2);
371247738Sbapt            break;
372247738Sbapt
373247738Sbapt        case 5: /* Read/Write Type */
374247738Sbapt
375247738Sbapt            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 1);
376247738Sbapt            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
377247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0);
378247738Sbapt            break;
379247738Sbapt
380247738Sbapt        case 6: /* Address Granularity */
381247738Sbapt
382247738Sbapt            Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
383247738Sbapt            RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
384247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
385247738Sbapt            GranOp = InitializerOp;
386247738Sbapt            break;
387247738Sbapt
388247738Sbapt        case 7: /* Min Address */
389247738Sbapt
390247738Sbapt            Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
391247738Sbapt            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
392247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
393247738Sbapt            MinOp = InitializerOp;
394247738Sbapt            break;
395247738Sbapt
396247738Sbapt        case 8: /* Max Address */
397247738Sbapt
398247738Sbapt            Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
399247738Sbapt            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
400247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
401247738Sbapt            MaxOp = InitializerOp;
402247738Sbapt            break;
403247738Sbapt
404247738Sbapt        case 9: /* Translation Offset */
405247738Sbapt
406247738Sbapt            Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
407247738Sbapt            RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
408247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
409247738Sbapt            break;
410247738Sbapt
411247738Sbapt        case 10: /* Address Length */
412247738Sbapt
413247738Sbapt            Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
414247738Sbapt            RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
415247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
416247738Sbapt            LengthOp = InitializerOp;
417247738Sbapt            break;
418247738Sbapt
419247738Sbapt        case 11: /* ResSourceIndex [Optional Field - BYTE] */
420247738Sbapt
421247738Sbapt            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
422247738Sbapt            {
423247738Sbapt                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
424247738Sbapt                OptionIndex++;
425247738Sbapt                Descriptor->Address64.ResourceLength++;
426247738Sbapt                ResSourceIndex = TRUE;
427247738Sbapt            }
428247738Sbapt            break;
429247738Sbapt
430247738Sbapt        case 12: /* ResSource [Optional Field - STRING] */
431247738Sbapt
432247738Sbapt            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
433247738Sbapt                (InitializerOp->Asl.Value.String))
434247738Sbapt            {
435247738Sbapt                if (StringLength)
436247738Sbapt                {
437247738Sbapt                    Descriptor->Address64.ResourceLength = (UINT16)
438247738Sbapt                        (Descriptor->Address64.ResourceLength + StringLength);
439247738Sbapt
440247738Sbapt                    strcpy ((char *)
441247738Sbapt                        &OptionalFields[OptionIndex],
442247738Sbapt                        InitializerOp->Asl.Value.String);
443247738Sbapt
444247738Sbapt                    /* ResourceSourceIndex must also be valid */
445247738Sbapt
446247738Sbapt                    if (!ResSourceIndex)
447247738Sbapt                    {
448247738Sbapt                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
449247738Sbapt                            InitializerOp, NULL);
450247738Sbapt                    }
451247738Sbapt                }
452247738Sbapt            }
453247738Sbapt
454247738Sbapt#if 0
455247738Sbapt            /*
456247738Sbapt             * Not a valid ResourceSource, ResourceSourceIndex must also
457247738Sbapt             * be invalid
458247738Sbapt             */
459247738Sbapt            else if (ResSourceIndex)
460247738Sbapt            {
461247738Sbapt                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
462247738Sbapt                    InitializerOp, NULL);
463247738Sbapt            }
464247738Sbapt#endif
465247738Sbapt            break;
466247738Sbapt
467247738Sbapt        case 13: /* ResourceTag */
468247738Sbapt
469247738Sbapt            UtAttachNamepathToOwner (Op, InitializerOp);
470247738Sbapt            break;
471247738Sbapt
472247738Sbapt
473247738Sbapt        case 14: /* Address Range */
474247738Sbapt
475247738Sbapt            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 3, 0);
476247738Sbapt            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
477247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 3, 2);
478247738Sbapt            break;
479247738Sbapt
480247738Sbapt        case 15: /* Type */
481247738Sbapt
482247738Sbapt            RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0);
483247738Sbapt            RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
484247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5);
485247738Sbapt            break;
486247738Sbapt
487247738Sbapt        default:
488247738Sbapt
489247738Sbapt            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
490247738Sbapt            break;
491247738Sbapt        }
492247738Sbapt
493247738Sbapt        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
494247738Sbapt    }
495247738Sbapt
496247738Sbapt    /* Validate the Min/Max/Len/Gran values */
497247738Sbapt
498247738Sbapt    RsLargeAddressCheck (
499247738Sbapt        Descriptor->Address64.Minimum,
500247738Sbapt        Descriptor->Address64.Maximum,
501247738Sbapt        Descriptor->Address64.AddressLength,
502247738Sbapt        Descriptor->Address64.Granularity,
503247738Sbapt        Descriptor->Address64.Flags,
504247738Sbapt        MinOp, MaxOp, LengthOp, GranOp, Op);
505247738Sbapt
506247738Sbapt    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
507247738Sbapt                            OptionIndex + StringLength;
508247738Sbapt    return (Rnode);
509247738Sbapt}
510247738Sbapt
511247738Sbapt
512247738Sbapt/*******************************************************************************
513247738Sbapt *
514247738Sbapt * FUNCTION:    RsDoQwordSpaceDescriptor
515247738Sbapt *
516247738Sbapt * PARAMETERS:  Op                  - Parent resource descriptor parse node
517247738Sbapt *              CurrentByteOffset   - Offset into the resource template AML
518247738Sbapt *                                    buffer (to track references to the desc)
519247738Sbapt *
520247738Sbapt * RETURN:      Completed resource node
521247738Sbapt *
522247738Sbapt * DESCRIPTION: Construct a long "QwordSpace" descriptor
523247738Sbapt *
524247738Sbapt ******************************************************************************/
525247738Sbapt
526247738SbaptASL_RESOURCE_NODE *
527247738SbaptRsDoQwordSpaceDescriptor (
528247738Sbapt    ACPI_PARSE_OBJECT       *Op,
529247738Sbapt    UINT32                  CurrentByteOffset)
530247738Sbapt{
531247738Sbapt    AML_RESOURCE            *Descriptor;
532247738Sbapt    ACPI_PARSE_OBJECT       *InitializerOp;
533247738Sbapt    ACPI_PARSE_OBJECT       *MinOp = NULL;
534247738Sbapt    ACPI_PARSE_OBJECT       *MaxOp = NULL;
535247738Sbapt    ACPI_PARSE_OBJECT       *LengthOp = NULL;
536247738Sbapt    ACPI_PARSE_OBJECT       *GranOp = NULL;
537247738Sbapt    ASL_RESOURCE_NODE       *Rnode;
538247738Sbapt    UINT8                   *OptionalFields;
539247738Sbapt    UINT16                  StringLength = 0;
540247738Sbapt    UINT32                  OptionIndex = 0;
541247738Sbapt    UINT32                  i;
542247738Sbapt    BOOLEAN                 ResSourceIndex = FALSE;
543247738Sbapt
544247738Sbapt
545247738Sbapt    InitializerOp = Op->Asl.Child;
546247738Sbapt    StringLength = RsGetStringDataLength (InitializerOp);
547247738Sbapt
548247738Sbapt    Rnode = RsAllocateResourceNode (
549247738Sbapt                sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
550247738Sbapt
551247738Sbapt    Descriptor = Rnode->Buffer;
552247738Sbapt    Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
553247738Sbapt
554247738Sbapt    /*
555247738Sbapt     * Initial descriptor length -- may be enlarged if there are
556247738Sbapt     * optional fields present
557247738Sbapt     */
558247738Sbapt    OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
559247738Sbapt    Descriptor->Address64.ResourceLength = (UINT16)
560247738Sbapt        (sizeof (AML_RESOURCE_ADDRESS64) -
561247738Sbapt         sizeof (AML_RESOURCE_LARGE_HEADER));
562247738Sbapt
563247738Sbapt    /* Process all child initialization nodes */
564247738Sbapt
565247738Sbapt    for (i = 0; InitializerOp; i++)
566247738Sbapt    {
567247738Sbapt        switch (i)
568247738Sbapt        {
569247738Sbapt        case 0: /* Resource Type */
570247738Sbapt
571247738Sbapt            Descriptor->Address64.ResourceType =
572247738Sbapt                (UINT8) InitializerOp->Asl.Value.Integer;
573247738Sbapt            break;
574247738Sbapt
575247738Sbapt        case 1: /* Resource Usage */
576247738Sbapt
577247738Sbapt            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
578247738Sbapt            break;
579247738Sbapt
580247738Sbapt        case 2: /* DecodeType */
581247738Sbapt
582247738Sbapt            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
583247738Sbapt            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
584247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
585247738Sbapt            break;
586247738Sbapt
587247738Sbapt        case 3: /* MinType */
588247738Sbapt
589247738Sbapt            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
590247738Sbapt            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
591247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
592247738Sbapt            break;
593247738Sbapt
594247738Sbapt        case 4: /* MaxType */
595247738Sbapt
596247738Sbapt            RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
597247738Sbapt            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
598247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
599247738Sbapt            break;
600247738Sbapt
601247738Sbapt        case 5: /* Type-Specific flags */
602247738Sbapt
603247738Sbapt            Descriptor->Address64.SpecificFlags =
604247738Sbapt                (UINT8) InitializerOp->Asl.Value.Integer;
605247738Sbapt            break;
606247738Sbapt
607247738Sbapt        case 6: /* Address Granularity */
608247738Sbapt
609247738Sbapt            Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
610247738Sbapt            RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
611247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
612247738Sbapt            GranOp = InitializerOp;
613247738Sbapt            break;
614247738Sbapt
615247738Sbapt        case 7: /* Min Address */
616247738Sbapt
617247738Sbapt            Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
618247738Sbapt            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
619247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
620247738Sbapt            MinOp = InitializerOp;
621247738Sbapt            break;
622247738Sbapt
623247738Sbapt        case 8: /* Max Address */
624247738Sbapt
625247738Sbapt            Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
626247738Sbapt            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
627247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
628247738Sbapt            MaxOp = InitializerOp;
629247738Sbapt            break;
630247738Sbapt
631247738Sbapt        case 9: /* Translation Offset */
632247738Sbapt
633247738Sbapt            Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
634247738Sbapt            RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
635247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
636247738Sbapt            break;
637247738Sbapt
638247738Sbapt        case 10: /* Address Length */
639247738Sbapt
640247738Sbapt            Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
641247738Sbapt            RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
642247738Sbapt                CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
643247738Sbapt            LengthOp = InitializerOp;
644247738Sbapt            break;
645247738Sbapt
646247738Sbapt        case 11: /* ResSourceIndex [Optional Field - BYTE] */
647247738Sbapt
648247738Sbapt            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
649247738Sbapt            {
650247738Sbapt                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
651247738Sbapt                OptionIndex++;
652247738Sbapt                Descriptor->Address64.ResourceLength++;
653247738Sbapt                ResSourceIndex = TRUE;
654247738Sbapt            }
655247738Sbapt            break;
656247738Sbapt
657247738Sbapt        case 12: /* ResSource [Optional Field - STRING] */
658247738Sbapt
659247738Sbapt            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
660247738Sbapt                (InitializerOp->Asl.Value.String))
661247738Sbapt            {
662247738Sbapt                if (StringLength)
663247738Sbapt                {
664247738Sbapt                    Descriptor->Address64.ResourceLength = (UINT16)
665247738Sbapt                        (Descriptor->Address64.ResourceLength + StringLength);
666247738Sbapt
667247738Sbapt                    strcpy ((char *)
668247738Sbapt                        &OptionalFields[OptionIndex],
669247738Sbapt                        InitializerOp->Asl.Value.String);
670247738Sbapt
671247738Sbapt                    /* ResourceSourceIndex must also be valid */
672247738Sbapt
673                    if (!ResSourceIndex)
674                    {
675                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
676                            InitializerOp, NULL);
677                    }
678                }
679            }
680
681#if 0
682            /*
683             * Not a valid ResourceSource, ResourceSourceIndex must also
684             * be invalid
685             */
686            else if (ResSourceIndex)
687            {
688                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
689                    InitializerOp, NULL);
690            }
691#endif
692            break;
693
694        case 13: /* ResourceTag */
695
696            UtAttachNamepathToOwner (Op, InitializerOp);
697            break;
698
699        default:
700
701            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
702            break;
703        }
704
705        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
706    }
707
708    /* Validate the Min/Max/Len/Gran values */
709
710    RsLargeAddressCheck (
711        Descriptor->Address64.Minimum,
712        Descriptor->Address64.Maximum,
713        Descriptor->Address64.AddressLength,
714        Descriptor->Address64.Granularity,
715        Descriptor->Address64.Flags,
716        MinOp, MaxOp, LengthOp, GranOp, Op);
717
718    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
719                            OptionIndex + StringLength;
720    return (Rnode);
721}
722