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