1207340Sjkim/******************************************************************************
2207340Sjkim *
3207340Sjkim * Module Name: aslrestype2e - Large Extended 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
47207340Sjkim#define _COMPONENT          ACPI_COMPILER
48207340Sjkim        ACPI_MODULE_NAME    ("aslrestype2e")
49207340Sjkim
50207340Sjkim/*
51207340Sjkim * This module contains the Extended (64-bit) address space descriptors:
52207340Sjkim *
53207340Sjkim * ExtendedIO
54207340Sjkim * ExtendedMemory
55207340Sjkim * ExtendedSpace
56207340Sjkim */
57207340Sjkim
58207340Sjkim/*******************************************************************************
59207340Sjkim *
60207340Sjkim * FUNCTION:    RsDoExtendedIoDescriptor
61207340Sjkim *
62207340Sjkim * PARAMETERS:  Op                  - Parent resource descriptor parse node
63207340Sjkim *              CurrentByteOffset   - Offset into the resource template AML
64207340Sjkim *                                    buffer (to track references to the desc)
65207340Sjkim *
66207340Sjkim * RETURN:      Completed resource node
67207340Sjkim *
68207340Sjkim * DESCRIPTION: Construct a long "ExtendedIO" descriptor
69207340Sjkim *
70207340Sjkim ******************************************************************************/
71207340Sjkim
72207340SjkimASL_RESOURCE_NODE *
73207340SjkimRsDoExtendedIoDescriptor (
74207340Sjkim    ACPI_PARSE_OBJECT       *Op,
75207340Sjkim    UINT32                  CurrentByteOffset)
76207340Sjkim{
77207340Sjkim    AML_RESOURCE            *Descriptor;
78207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
79207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
80207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
81207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
82207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
83207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
84207340Sjkim    UINT16                  StringLength = 0;
85207340Sjkim    UINT32                  i;
86207340Sjkim
87207340Sjkim
88207340Sjkim    InitializerOp = Op->Asl.Child;
89207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
90207340Sjkim
91207340Sjkim    Rnode = RsAllocateResourceNode (
92207340Sjkim                sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
93207340Sjkim
94207340Sjkim    Descriptor = Rnode->Buffer;
95207340Sjkim    Descriptor->ExtAddress64.DescriptorType  = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
96207340Sjkim    Descriptor->ExtAddress64.ResourceType    = ACPI_ADDRESS_TYPE_IO_RANGE;
97207340Sjkim    Descriptor->ExtAddress64.RevisionID      = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
98207340Sjkim
99207340Sjkim    Descriptor->ExtAddress64.ResourceLength  = (UINT16)
100207340Sjkim        (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
101207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
102207340Sjkim
103207340Sjkim    /* Process all child initialization nodes */
104207340Sjkim
105207340Sjkim    for (i = 0; InitializerOp; i++)
106207340Sjkim    {
107207340Sjkim        switch (i)
108207340Sjkim        {
109207340Sjkim        case 0: /* Resource Usage */
110207340Sjkim
111207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
112207340Sjkim            break;
113207340Sjkim
114207340Sjkim        case 1: /* MinType */
115207340Sjkim
116207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
117207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
118207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
119207340Sjkim            break;
120207340Sjkim
121207340Sjkim        case 2: /* MaxType */
122207340Sjkim
123207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
124207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
125207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
126207340Sjkim            break;
127207340Sjkim
128207340Sjkim        case 3: /* DecodeType */
129207340Sjkim
130207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
131207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
132207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
133207340Sjkim            break;
134207340Sjkim
135207340Sjkim        case 4: /* Range Type */
136207340Sjkim
137207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 3);
138228110Sjkim            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
139228110Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0, 2);
140207340Sjkim            break;
141207340Sjkim
142207340Sjkim        case 5: /* Address Granularity */
143207340Sjkim
144207340Sjkim            Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
145228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
146207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
147207340Sjkim            GranOp = InitializerOp;
148207340Sjkim           break;
149207340Sjkim
150207340Sjkim        case 6: /* Address Min */
151207340Sjkim
152207340Sjkim            Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
153228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
154207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
155207340Sjkim            MinOp = InitializerOp;
156207340Sjkim            break;
157207340Sjkim
158207340Sjkim        case 7: /* Address Max */
159207340Sjkim
160207340Sjkim            Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
161228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
162207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
163207340Sjkim            MaxOp = InitializerOp;
164207340Sjkim            break;
165207340Sjkim
166207340Sjkim        case 8: /* Translation Offset */
167207340Sjkim
168207340Sjkim            Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
169228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
170207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
171207340Sjkim            break;
172207340Sjkim
173207340Sjkim        case 9: /* Address Length */
174207340Sjkim
175207340Sjkim            Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
176228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
177207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
178207340Sjkim            LengthOp = InitializerOp;
179207340Sjkim            break;
180207340Sjkim
181207340Sjkim        case 10: /* Type-Specific Attributes */
182207340Sjkim
183207340Sjkim            Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
184228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
185207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
186207340Sjkim            break;
187207340Sjkim
188207340Sjkim        case 11: /* ResourceTag */
189207340Sjkim
190207340Sjkim            UtAttachNamepathToOwner (Op, InitializerOp);
191207340Sjkim            break;
192207340Sjkim
193207340Sjkim        case 12: /* Type */
194207340Sjkim
195207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 4, 0);
196207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
197207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 4);
198207340Sjkim            break;
199207340Sjkim
200207340Sjkim        case 13: /* Translation Type */
201207340Sjkim
202207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0);
203207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
204207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5);
205207340Sjkim            break;
206207340Sjkim
207207340Sjkim        default:
208207340Sjkim
209207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
210207340Sjkim            break;
211207340Sjkim        }
212207340Sjkim
213207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
214207340Sjkim    }
215207340Sjkim
216207340Sjkim    /* Validate the Min/Max/Len/Gran values */
217207340Sjkim
218207340Sjkim    RsLargeAddressCheck (
219207340Sjkim        Descriptor->ExtAddress64.Minimum,
220207340Sjkim        Descriptor->ExtAddress64.Maximum,
221207340Sjkim        Descriptor->ExtAddress64.AddressLength,
222207340Sjkim        Descriptor->ExtAddress64.Granularity,
223207340Sjkim        Descriptor->ExtAddress64.Flags,
224213806Sjkim        MinOp, MaxOp, LengthOp, GranOp, Op);
225207340Sjkim
226207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
227207340Sjkim    return (Rnode);
228207340Sjkim}
229207340Sjkim
230207340Sjkim
231207340Sjkim/*******************************************************************************
232207340Sjkim *
233207340Sjkim * FUNCTION:    RsDoExtendedMemoryDescriptor
234207340Sjkim *
235207340Sjkim * PARAMETERS:  Op                  - Parent resource descriptor parse node
236207340Sjkim *              CurrentByteOffset   - Offset into the resource template AML
237207340Sjkim *                                    buffer (to track references to the desc)
238207340Sjkim *
239207340Sjkim * RETURN:      Completed resource node
240207340Sjkim *
241207340Sjkim * DESCRIPTION: Construct a long "ExtendedMemory" descriptor
242207340Sjkim *
243207340Sjkim ******************************************************************************/
244207340Sjkim
245207340SjkimASL_RESOURCE_NODE *
246207340SjkimRsDoExtendedMemoryDescriptor (
247207340Sjkim    ACPI_PARSE_OBJECT       *Op,
248207340Sjkim    UINT32                  CurrentByteOffset)
249207340Sjkim{
250207340Sjkim    AML_RESOURCE            *Descriptor;
251207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
252207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
253207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
254207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
255207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
256207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
257207340Sjkim    UINT16                  StringLength = 0;
258207340Sjkim    UINT32                  i;
259207340Sjkim
260207340Sjkim
261207340Sjkim    InitializerOp = Op->Asl.Child;
262207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
263207340Sjkim
264207340Sjkim    Rnode = RsAllocateResourceNode (
265207340Sjkim                sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
266207340Sjkim
267207340Sjkim    Descriptor = Rnode->Buffer;
268207340Sjkim    Descriptor->ExtAddress64.DescriptorType  = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
269207340Sjkim    Descriptor->ExtAddress64.ResourceType    = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
270207340Sjkim    Descriptor->ExtAddress64.RevisionID      = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
271207340Sjkim
272207340Sjkim    Descriptor->ExtAddress64.ResourceLength  = (UINT16)
273207340Sjkim        (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
274207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
275207340Sjkim
276207340Sjkim    /* Process all child initialization nodes */
277207340Sjkim
278207340Sjkim    for (i = 0; InitializerOp; i++)
279207340Sjkim    {
280207340Sjkim        switch (i)
281207340Sjkim        {
282207340Sjkim        case 0: /* Resource Usage */
283207340Sjkim
284207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
285207340Sjkim            break;
286207340Sjkim
287207340Sjkim        case 1: /* DecodeType */
288207340Sjkim
289207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
290207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
291207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
292207340Sjkim            break;
293207340Sjkim
294207340Sjkim        case 2: /* MinType */
295207340Sjkim
296207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
297207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
298207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
299207340Sjkim            break;
300207340Sjkim
301207340Sjkim        case 3: /* MaxType */
302207340Sjkim
303207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
304207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
305207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
306207340Sjkim            break;
307207340Sjkim
308207340Sjkim        case 4: /* Memory Type */
309207340Sjkim
310207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 1, 0);
311228110Sjkim            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
312228110Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 1, 2);
313207340Sjkim            break;
314207340Sjkim
315207340Sjkim        case 5: /* Read/Write Type */
316207340Sjkim
317207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 1);
318207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
319207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0);
320207340Sjkim            break;
321207340Sjkim
322207340Sjkim        case 6: /* Address Granularity */
323207340Sjkim
324207340Sjkim            Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
325228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
326207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
327207340Sjkim            GranOp = InitializerOp;
328207340Sjkim            break;
329207340Sjkim
330207340Sjkim        case 7: /* Min Address */
331207340Sjkim
332207340Sjkim            Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
333228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
334207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
335207340Sjkim            MinOp = InitializerOp;
336207340Sjkim            break;
337207340Sjkim
338207340Sjkim        case 8: /* Max Address */
339207340Sjkim
340207340Sjkim            Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
341228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
342207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
343207340Sjkim            MaxOp = InitializerOp;
344207340Sjkim            break;
345207340Sjkim
346207340Sjkim        case 9: /* Translation Offset */
347207340Sjkim
348207340Sjkim            Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
349228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
350207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
351207340Sjkim            break;
352207340Sjkim
353207340Sjkim        case 10: /* Address Length */
354207340Sjkim
355207340Sjkim            Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
356228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
357207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
358207340Sjkim            LengthOp = InitializerOp;
359207340Sjkim            break;
360207340Sjkim
361207340Sjkim        case 11: /* Type-Specific Attributes */
362207340Sjkim
363207340Sjkim            Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
364228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
365207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
366207340Sjkim            break;
367207340Sjkim
368207340Sjkim        case 12: /* ResourceTag */
369207340Sjkim
370207340Sjkim            UtAttachNamepathToOwner (Op, InitializerOp);
371207340Sjkim            break;
372207340Sjkim
373207340Sjkim
374207340Sjkim        case 13: /* Address Range */
375207340Sjkim
376207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 3, 0);
377228110Sjkim            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
378228110Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 3, 2);
379207340Sjkim            break;
380207340Sjkim
381207340Sjkim        case 14: /* Type */
382207340Sjkim
383207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0);
384207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
385207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5);
386207340Sjkim            break;
387207340Sjkim
388207340Sjkim        default:
389207340Sjkim
390207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
391207340Sjkim            break;
392207340Sjkim        }
393207340Sjkim
394207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
395207340Sjkim    }
396207340Sjkim
397207340Sjkim    /* Validate the Min/Max/Len/Gran values */
398207340Sjkim
399207340Sjkim    RsLargeAddressCheck (
400207340Sjkim        Descriptor->ExtAddress64.Minimum,
401207340Sjkim        Descriptor->ExtAddress64.Maximum,
402207340Sjkim        Descriptor->ExtAddress64.AddressLength,
403207340Sjkim        Descriptor->ExtAddress64.Granularity,
404207340Sjkim        Descriptor->ExtAddress64.Flags,
405213806Sjkim        MinOp, MaxOp, LengthOp, GranOp, Op);
406207340Sjkim
407207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
408207340Sjkim    return (Rnode);
409207340Sjkim}
410207340Sjkim
411207340Sjkim
412207340Sjkim/*******************************************************************************
413207340Sjkim *
414207340Sjkim * FUNCTION:    RsDoExtendedSpaceDescriptor
415207340Sjkim *
416207340Sjkim * PARAMETERS:  Op                  - Parent resource descriptor parse node
417207340Sjkim *              CurrentByteOffset   - Offset into the resource template AML
418207340Sjkim *                                    buffer (to track references to the desc)
419207340Sjkim *
420207340Sjkim * RETURN:      Completed resource node
421207340Sjkim *
422207340Sjkim * DESCRIPTION: Construct a long "ExtendedSpace" descriptor
423207340Sjkim *
424207340Sjkim ******************************************************************************/
425207340Sjkim
426207340SjkimASL_RESOURCE_NODE *
427207340SjkimRsDoExtendedSpaceDescriptor (
428207340Sjkim    ACPI_PARSE_OBJECT       *Op,
429207340Sjkim    UINT32                  CurrentByteOffset)
430207340Sjkim{
431207340Sjkim    AML_RESOURCE            *Descriptor;
432207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
433207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
434207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
435207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
436207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
437207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
438207340Sjkim    UINT16                  StringLength = 0;
439207340Sjkim    UINT32                  i;
440207340Sjkim
441207340Sjkim
442207340Sjkim    InitializerOp = Op->Asl.Child;
443207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
444207340Sjkim
445207340Sjkim    Rnode = RsAllocateResourceNode (
446207340Sjkim                sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
447207340Sjkim
448207340Sjkim    Descriptor = Rnode->Buffer;
449207340Sjkim    Descriptor->ExtAddress64.DescriptorType  = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
450207340Sjkim    Descriptor->ExtAddress64.RevisionID      = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
451207340Sjkim
452207340Sjkim    Descriptor->ExtAddress64.ResourceLength  = (UINT16)
453207340Sjkim        (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
454207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
455207340Sjkim
456207340Sjkim    /* Process all child initialization nodes */
457207340Sjkim
458207340Sjkim    for (i = 0; InitializerOp; i++)
459207340Sjkim    {
460207340Sjkim        switch (i)
461207340Sjkim        {
462207340Sjkim        case 0: /* Resource Type */
463207340Sjkim
464207340Sjkim            Descriptor->ExtAddress64.ResourceType =
465207340Sjkim                (UINT8) InitializerOp->Asl.Value.Integer;
466207340Sjkim            break;
467207340Sjkim
468207340Sjkim        case 1: /* Resource Usage */
469207340Sjkim
470207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
471207340Sjkim            break;
472207340Sjkim
473207340Sjkim        case 2: /* DecodeType */
474207340Sjkim
475207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
476207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
477207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
478207340Sjkim            break;
479207340Sjkim
480207340Sjkim        case 3: /* MinType */
481207340Sjkim
482207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
483207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
484207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
485207340Sjkim            break;
486207340Sjkim
487207340Sjkim        case 4: /* MaxType */
488207340Sjkim
489207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
490207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
491207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
492207340Sjkim            break;
493207340Sjkim
494207340Sjkim        case 5: /* Type-Specific flags */
495207340Sjkim
496207340Sjkim            Descriptor->ExtAddress64.SpecificFlags =
497207340Sjkim                (UINT8) InitializerOp->Asl.Value.Integer;
498207340Sjkim            break;
499207340Sjkim
500207340Sjkim        case 6: /* Address Granularity */
501207340Sjkim
502207340Sjkim            Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
503228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
504207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
505207340Sjkim            GranOp = InitializerOp;
506207340Sjkim            break;
507207340Sjkim
508207340Sjkim        case 7: /* Min Address */
509207340Sjkim
510207340Sjkim            Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
511228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
512207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
513207340Sjkim            MinOp = InitializerOp;
514207340Sjkim            break;
515207340Sjkim
516207340Sjkim        case 8: /* Max Address */
517207340Sjkim
518207340Sjkim            Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
519228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
520207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
521207340Sjkim            MaxOp = InitializerOp;
522207340Sjkim            break;
523207340Sjkim
524207340Sjkim        case 9: /* Translation Offset */
525207340Sjkim
526207340Sjkim            Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
527228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
528207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
529207340Sjkim            break;
530207340Sjkim
531207340Sjkim        case 10: /* Address Length */
532207340Sjkim
533207340Sjkim            Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
534228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
535207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
536207340Sjkim            LengthOp = InitializerOp;
537207340Sjkim            break;
538207340Sjkim
539207340Sjkim        case 11: /* Type-Specific Attributes */
540207340Sjkim
541207340Sjkim            Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
542228110Sjkim            RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
543207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
544207340Sjkim            break;
545207340Sjkim
546207340Sjkim        case 12: /* ResourceTag */
547207340Sjkim
548207340Sjkim            UtAttachNamepathToOwner (Op, InitializerOp);
549207340Sjkim            break;
550207340Sjkim
551207340Sjkim        default:
552207340Sjkim
553207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
554207340Sjkim            break;
555207340Sjkim        }
556207340Sjkim
557207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
558207340Sjkim    }
559207340Sjkim
560207340Sjkim    /* Validate the Min/Max/Len/Gran values */
561207340Sjkim
562207340Sjkim    RsLargeAddressCheck (
563207340Sjkim        Descriptor->ExtAddress64.Minimum,
564207340Sjkim        Descriptor->ExtAddress64.Maximum,
565207340Sjkim        Descriptor->ExtAddress64.AddressLength,
566207340Sjkim        Descriptor->ExtAddress64.Granularity,
567207340Sjkim        Descriptor->ExtAddress64.Flags,
568213806Sjkim        MinOp, MaxOp, LengthOp, GranOp, Op);
569207340Sjkim
570207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
571207340Sjkim    return (Rnode);
572207340Sjkim}
573