1207340Sjkim
2207340Sjkim/******************************************************************************
3207340Sjkim *
4207340Sjkim * Module Name: aslrestype2e - Large Extended address resource descriptors
5207340Sjkim *
6207340Sjkim *****************************************************************************/
7207340Sjkim
8217365Sjkim/*
9217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp.
10207340Sjkim * All rights reserved.
11207340Sjkim *
12217365Sjkim * Redistribution and use in source and binary forms, with or without
13217365Sjkim * modification, are permitted provided that the following conditions
14217365Sjkim * are met:
15217365Sjkim * 1. Redistributions of source code must retain the above copyright
16217365Sjkim *    notice, this list of conditions, and the following disclaimer,
17217365Sjkim *    without modification.
18217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
20217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
21217365Sjkim *    including a substantially similar Disclaimer requirement for further
22217365Sjkim *    binary redistribution.
23217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
24217365Sjkim *    of any contributors may be used to endorse or promote products derived
25217365Sjkim *    from this software without specific prior written permission.
26207340Sjkim *
27217365Sjkim * Alternatively, this software may be distributed under the terms of the
28217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
29217365Sjkim * Software Foundation.
30207340Sjkim *
31217365Sjkim * NO WARRANTY
32217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
43217365Sjkim */
44207340Sjkim
45207340Sjkim
46207344Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
47207340Sjkim
48207340Sjkim#define _COMPONENT          ACPI_COMPILER
49207340Sjkim        ACPI_MODULE_NAME    ("aslrestype2e")
50207340Sjkim
51207340Sjkim/*
52207340Sjkim * This module contains the Extended (64-bit) address space descriptors:
53207340Sjkim *
54207340Sjkim * ExtendedIO
55207340Sjkim * ExtendedMemory
56207340Sjkim * ExtendedSpace
57207340Sjkim */
58207340Sjkim
59207340Sjkim/*******************************************************************************
60207340Sjkim *
61207340Sjkim * FUNCTION:    RsDoExtendedIoDescriptor
62207340Sjkim *
63207340Sjkim * PARAMETERS:  Op                  - Parent resource descriptor parse node
64207340Sjkim *              CurrentByteOffset   - Offset into the resource template AML
65207340Sjkim *                                    buffer (to track references to the desc)
66207340Sjkim *
67207340Sjkim * RETURN:      Completed resource node
68207340Sjkim *
69207340Sjkim * DESCRIPTION: Construct a long "ExtendedIO" descriptor
70207340Sjkim *
71207340Sjkim ******************************************************************************/
72207340Sjkim
73207340SjkimASL_RESOURCE_NODE *
74207340SjkimRsDoExtendedIoDescriptor (
75207340Sjkim    ACPI_PARSE_OBJECT       *Op,
76207340Sjkim    UINT32                  CurrentByteOffset)
77207340Sjkim{
78207340Sjkim    AML_RESOURCE            *Descriptor;
79207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
80207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
81207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
82207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
83207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
84207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
85207340Sjkim    UINT16                  StringLength = 0;
86207340Sjkim    UINT32                  i;
87207340Sjkim
88207340Sjkim
89207340Sjkim    InitializerOp = Op->Asl.Child;
90207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
91207340Sjkim
92207340Sjkim    Rnode = RsAllocateResourceNode (
93207340Sjkim                sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
94207340Sjkim
95207340Sjkim    Descriptor = Rnode->Buffer;
96207340Sjkim    Descriptor->ExtAddress64.DescriptorType  = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
97207340Sjkim    Descriptor->ExtAddress64.ResourceType    = ACPI_ADDRESS_TYPE_IO_RANGE;
98207340Sjkim    Descriptor->ExtAddress64.RevisionID      = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
99207340Sjkim
100207340Sjkim    Descriptor->ExtAddress64.ResourceLength  = (UINT16)
101207340Sjkim        (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
102207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
103207340Sjkim
104207340Sjkim    /* Process all child initialization nodes */
105207340Sjkim
106207340Sjkim    for (i = 0; InitializerOp; i++)
107207340Sjkim    {
108207340Sjkim        switch (i)
109207340Sjkim        {
110207340Sjkim        case 0: /* Resource Usage */
111207340Sjkim
112207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
113207340Sjkim            break;
114207340Sjkim
115207340Sjkim        case 1: /* MinType */
116207340Sjkim
117207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
118207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
119207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
120207340Sjkim            break;
121207340Sjkim
122207340Sjkim        case 2: /* MaxType */
123207340Sjkim
124207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
125207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
126207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
127207340Sjkim            break;
128207340Sjkim
129207340Sjkim        case 3: /* DecodeType */
130207340Sjkim
131207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
132207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
133207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
134207340Sjkim            break;
135207340Sjkim
136207340Sjkim        case 4: /* Range Type */
137207340Sjkim
138207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 3);
139207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
140207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0);
141207340Sjkim            break;
142207340Sjkim
143207340Sjkim        case 5: /* Address Granularity */
144207340Sjkim
145207340Sjkim            Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
146207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
147207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
148207340Sjkim            GranOp = InitializerOp;
149207340Sjkim           break;
150207340Sjkim
151207340Sjkim        case 6: /* Address Min */
152207340Sjkim
153207340Sjkim            Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
154207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
155207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
156207340Sjkim            MinOp = InitializerOp;
157207340Sjkim            break;
158207340Sjkim
159207340Sjkim        case 7: /* Address Max */
160207340Sjkim
161207340Sjkim            Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
162207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
163207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
164207340Sjkim            MaxOp = InitializerOp;
165207340Sjkim            break;
166207340Sjkim
167207340Sjkim        case 8: /* Translation Offset */
168207340Sjkim
169207340Sjkim            Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
170207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
171207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
172207340Sjkim            break;
173207340Sjkim
174207340Sjkim        case 9: /* Address Length */
175207340Sjkim
176207340Sjkim            Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
177207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
178207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
179207340Sjkim            LengthOp = InitializerOp;
180207340Sjkim            break;
181207340Sjkim
182207340Sjkim        case 10: /* Type-Specific Attributes */
183207340Sjkim
184207340Sjkim            Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
185207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
186207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
187207340Sjkim            break;
188207340Sjkim
189207340Sjkim        case 11: /* ResourceTag */
190207340Sjkim
191207340Sjkim            UtAttachNamepathToOwner (Op, InitializerOp);
192207340Sjkim            break;
193207340Sjkim
194207340Sjkim        case 12: /* Type */
195207340Sjkim
196207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 4, 0);
197207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
198207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 4);
199207340Sjkim            break;
200207340Sjkim
201207340Sjkim        case 13: /* Translation Type */
202207340Sjkim
203207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0);
204207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
205207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5);
206207340Sjkim            break;
207207340Sjkim
208207340Sjkim        default:
209207340Sjkim
210207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
211207340Sjkim            break;
212207340Sjkim        }
213207340Sjkim
214207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
215207340Sjkim    }
216207340Sjkim
217207340Sjkim    /* Validate the Min/Max/Len/Gran values */
218207340Sjkim
219207340Sjkim    RsLargeAddressCheck (
220207340Sjkim        Descriptor->ExtAddress64.Minimum,
221207340Sjkim        Descriptor->ExtAddress64.Maximum,
222207340Sjkim        Descriptor->ExtAddress64.AddressLength,
223207340Sjkim        Descriptor->ExtAddress64.Granularity,
224207340Sjkim        Descriptor->ExtAddress64.Flags,
225213806Sjkim        MinOp, MaxOp, LengthOp, GranOp, Op);
226207340Sjkim
227207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
228207340Sjkim    return (Rnode);
229207340Sjkim}
230207340Sjkim
231207340Sjkim
232207340Sjkim/*******************************************************************************
233207340Sjkim *
234207340Sjkim * FUNCTION:    RsDoExtendedMemoryDescriptor
235207340Sjkim *
236207340Sjkim * PARAMETERS:  Op                  - Parent resource descriptor parse node
237207340Sjkim *              CurrentByteOffset   - Offset into the resource template AML
238207340Sjkim *                                    buffer (to track references to the desc)
239207340Sjkim *
240207340Sjkim * RETURN:      Completed resource node
241207340Sjkim *
242207340Sjkim * DESCRIPTION: Construct a long "ExtendedMemory" descriptor
243207340Sjkim *
244207340Sjkim ******************************************************************************/
245207340Sjkim
246207340SjkimASL_RESOURCE_NODE *
247207340SjkimRsDoExtendedMemoryDescriptor (
248207340Sjkim    ACPI_PARSE_OBJECT       *Op,
249207340Sjkim    UINT32                  CurrentByteOffset)
250207340Sjkim{
251207340Sjkim    AML_RESOURCE            *Descriptor;
252207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
253207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
254207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
255207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
256207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
257207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
258207340Sjkim    UINT16                  StringLength = 0;
259207340Sjkim    UINT32                  i;
260207340Sjkim
261207340Sjkim
262207340Sjkim    InitializerOp = Op->Asl.Child;
263207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
264207340Sjkim
265207340Sjkim    Rnode = RsAllocateResourceNode (
266207340Sjkim                sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
267207340Sjkim
268207340Sjkim    Descriptor = Rnode->Buffer;
269207340Sjkim    Descriptor->ExtAddress64.DescriptorType  = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
270207340Sjkim    Descriptor->ExtAddress64.ResourceType    = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
271207340Sjkim    Descriptor->ExtAddress64.RevisionID      = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
272207340Sjkim
273207340Sjkim    Descriptor->ExtAddress64.ResourceLength  = (UINT16)
274207340Sjkim        (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
275207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
276207340Sjkim
277207340Sjkim    /* Process all child initialization nodes */
278207340Sjkim
279207340Sjkim    for (i = 0; InitializerOp; i++)
280207340Sjkim    {
281207340Sjkim        switch (i)
282207340Sjkim        {
283207340Sjkim        case 0: /* Resource Usage */
284207340Sjkim
285207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
286207340Sjkim            break;
287207340Sjkim
288207340Sjkim        case 1: /* DecodeType */
289207340Sjkim
290207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
291207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
292207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
293207340Sjkim            break;
294207340Sjkim
295207340Sjkim        case 2: /* MinType */
296207340Sjkim
297207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
298207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
299207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
300207340Sjkim            break;
301207340Sjkim
302207340Sjkim        case 3: /* MaxType */
303207340Sjkim
304207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
305207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
306207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
307207340Sjkim            break;
308207340Sjkim
309207340Sjkim        case 4: /* Memory Type */
310207340Sjkim
311207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 1, 0);
312207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
313207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 1);
314207340Sjkim            break;
315207340Sjkim
316207340Sjkim        case 5: /* Read/Write Type */
317207340Sjkim
318207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 1);
319207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
320207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0);
321207340Sjkim            break;
322207340Sjkim
323207340Sjkim        case 6: /* Address Granularity */
324207340Sjkim
325207340Sjkim            Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
326207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
327207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
328207340Sjkim            GranOp = InitializerOp;
329207340Sjkim            break;
330207340Sjkim
331207340Sjkim        case 7: /* Min Address */
332207340Sjkim
333207340Sjkim            Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
334207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
335207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
336207340Sjkim            MinOp = InitializerOp;
337207340Sjkim            break;
338207340Sjkim
339207340Sjkim        case 8: /* Max Address */
340207340Sjkim
341207340Sjkim            Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
342207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
343207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
344207340Sjkim            MaxOp = InitializerOp;
345207340Sjkim            break;
346207340Sjkim
347207340Sjkim        case 9: /* Translation Offset */
348207340Sjkim
349207340Sjkim            Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
350207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
351207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
352207340Sjkim            break;
353207340Sjkim
354207340Sjkim        case 10: /* Address Length */
355207340Sjkim
356207340Sjkim            Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
357207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
358207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
359207340Sjkim            LengthOp = InitializerOp;
360207340Sjkim            break;
361207340Sjkim
362207340Sjkim        case 11: /* Type-Specific Attributes */
363207340Sjkim
364207340Sjkim            Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
365207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
366207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
367207340Sjkim            break;
368207340Sjkim
369207340Sjkim        case 12: /* ResourceTag */
370207340Sjkim
371207340Sjkim            UtAttachNamepathToOwner (Op, InitializerOp);
372207340Sjkim            break;
373207340Sjkim
374207340Sjkim
375207340Sjkim        case 13: /* Address Range */
376207340Sjkim
377207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 3, 0);
378207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
379207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 3);
380207340Sjkim            break;
381207340Sjkim
382207340Sjkim        case 14: /* Type */
383207340Sjkim
384207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0);
385207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
386207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5);
387207340Sjkim            break;
388207340Sjkim
389207340Sjkim        default:
390207340Sjkim
391207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
392207340Sjkim            break;
393207340Sjkim        }
394207340Sjkim
395207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
396207340Sjkim    }
397207340Sjkim
398207340Sjkim    /* Validate the Min/Max/Len/Gran values */
399207340Sjkim
400207340Sjkim    RsLargeAddressCheck (
401207340Sjkim        Descriptor->ExtAddress64.Minimum,
402207340Sjkim        Descriptor->ExtAddress64.Maximum,
403207340Sjkim        Descriptor->ExtAddress64.AddressLength,
404207340Sjkim        Descriptor->ExtAddress64.Granularity,
405207340Sjkim        Descriptor->ExtAddress64.Flags,
406213806Sjkim        MinOp, MaxOp, LengthOp, GranOp, Op);
407207340Sjkim
408207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
409207340Sjkim    return (Rnode);
410207340Sjkim}
411207340Sjkim
412207340Sjkim
413207340Sjkim/*******************************************************************************
414207340Sjkim *
415207340Sjkim * FUNCTION:    RsDoExtendedSpaceDescriptor
416207340Sjkim *
417207340Sjkim * PARAMETERS:  Op                  - Parent resource descriptor parse node
418207340Sjkim *              CurrentByteOffset   - Offset into the resource template AML
419207340Sjkim *                                    buffer (to track references to the desc)
420207340Sjkim *
421207340Sjkim * RETURN:      Completed resource node
422207340Sjkim *
423207340Sjkim * DESCRIPTION: Construct a long "ExtendedSpace" descriptor
424207340Sjkim *
425207340Sjkim ******************************************************************************/
426207340Sjkim
427207340SjkimASL_RESOURCE_NODE *
428207340SjkimRsDoExtendedSpaceDescriptor (
429207340Sjkim    ACPI_PARSE_OBJECT       *Op,
430207340Sjkim    UINT32                  CurrentByteOffset)
431207340Sjkim{
432207340Sjkim    AML_RESOURCE            *Descriptor;
433207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
434207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
435207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
436207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
437207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
438207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
439207340Sjkim    UINT16                  StringLength = 0;
440207340Sjkim    UINT32                  i;
441207340Sjkim
442207340Sjkim
443207340Sjkim    InitializerOp = Op->Asl.Child;
444207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
445207340Sjkim
446207340Sjkim    Rnode = RsAllocateResourceNode (
447207340Sjkim                sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
448207340Sjkim
449207340Sjkim    Descriptor = Rnode->Buffer;
450207340Sjkim    Descriptor->ExtAddress64.DescriptorType  = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
451207340Sjkim    Descriptor->ExtAddress64.RevisionID      = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
452207340Sjkim
453207340Sjkim    Descriptor->ExtAddress64.ResourceLength  = (UINT16)
454207340Sjkim        (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
455207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
456207340Sjkim
457207340Sjkim    /* Process all child initialization nodes */
458207340Sjkim
459207340Sjkim    for (i = 0; InitializerOp; i++)
460207340Sjkim    {
461207340Sjkim        switch (i)
462207340Sjkim        {
463207340Sjkim        case 0: /* Resource Type */
464207340Sjkim
465207340Sjkim            Descriptor->ExtAddress64.ResourceType =
466207340Sjkim                (UINT8) InitializerOp->Asl.Value.Integer;
467207340Sjkim            break;
468207340Sjkim
469207340Sjkim        case 1: /* Resource Usage */
470207340Sjkim
471207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
472207340Sjkim            break;
473207340Sjkim
474207340Sjkim        case 2: /* DecodeType */
475207340Sjkim
476207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
477207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
478207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
479207340Sjkim            break;
480207340Sjkim
481207340Sjkim        case 3: /* MinType */
482207340Sjkim
483207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
484207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
485207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
486207340Sjkim            break;
487207340Sjkim
488207340Sjkim        case 4: /* MaxType */
489207340Sjkim
490207340Sjkim            RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
491207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
492207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
493207340Sjkim            break;
494207340Sjkim
495207340Sjkim        case 5: /* Type-Specific flags */
496207340Sjkim
497207340Sjkim            Descriptor->ExtAddress64.SpecificFlags =
498207340Sjkim                (UINT8) InitializerOp->Asl.Value.Integer;
499207340Sjkim            break;
500207340Sjkim
501207340Sjkim        case 6: /* Address Granularity */
502207340Sjkim
503207340Sjkim            Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
504207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
505207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
506207340Sjkim            GranOp = InitializerOp;
507207340Sjkim            break;
508207340Sjkim
509207340Sjkim        case 7: /* Min Address */
510207340Sjkim
511207340Sjkim            Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
512207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
513207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
514207340Sjkim            MinOp = InitializerOp;
515207340Sjkim            break;
516207340Sjkim
517207340Sjkim        case 8: /* Max Address */
518207340Sjkim
519207340Sjkim            Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
520207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
521207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
522207340Sjkim            MaxOp = InitializerOp;
523207340Sjkim            break;
524207340Sjkim
525207340Sjkim        case 9: /* Translation Offset */
526207340Sjkim
527207340Sjkim            Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
528207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
529207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
530207340Sjkim            break;
531207340Sjkim
532207340Sjkim        case 10: /* Address Length */
533207340Sjkim
534207340Sjkim            Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
535207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
536207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
537207340Sjkim            LengthOp = InitializerOp;
538207340Sjkim            break;
539207340Sjkim
540207340Sjkim        case 11: /* Type-Specific Attributes */
541207340Sjkim
542207340Sjkim            Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
543207340Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
544207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
545207340Sjkim            break;
546207340Sjkim
547207340Sjkim        case 12: /* ResourceTag */
548207340Sjkim
549207340Sjkim            UtAttachNamepathToOwner (Op, InitializerOp);
550207340Sjkim            break;
551207340Sjkim
552207340Sjkim        default:
553207340Sjkim
554207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
555207340Sjkim            break;
556207340Sjkim        }
557207340Sjkim
558207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
559207340Sjkim    }
560207340Sjkim
561207340Sjkim    /* Validate the Min/Max/Len/Gran values */
562207340Sjkim
563207340Sjkim    RsLargeAddressCheck (
564207340Sjkim        Descriptor->ExtAddress64.Minimum,
565207340Sjkim        Descriptor->ExtAddress64.Maximum,
566207340Sjkim        Descriptor->ExtAddress64.AddressLength,
567207340Sjkim        Descriptor->ExtAddress64.Granularity,
568207340Sjkim        Descriptor->ExtAddress64.Flags,
569213806Sjkim        MinOp, MaxOp, LengthOp, GranOp, Op);
570207340Sjkim
571207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
572207340Sjkim    return (Rnode);
573207340Sjkim}
574