1207340Sjkim/******************************************************************************
2207340Sjkim *
3207340Sjkim * Module Name: aslrestype2w - Large Word address resource descriptors
4207340Sjkim *
5207340Sjkim *****************************************************************************/
6207340Sjkim
7217365Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp.
9207340Sjkim * All rights reserved.
10207340Sjkim *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25207340Sjkim *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29207340Sjkim *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43207340Sjkim
44207344Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
45207340Sjkim#include "aslcompiler.y.h"
46207340Sjkim
47207340Sjkim#define _COMPONENT          ACPI_COMPILER
48207340Sjkim        ACPI_MODULE_NAME    ("aslrestype2w")
49207340Sjkim
50207340Sjkim/*
51207340Sjkim * This module contains the Word (16-bit) address space descriptors:
52207340Sjkim *
53207340Sjkim * WordIO
54207340Sjkim * WordMemory
55207340Sjkim * WordSpace
56207340Sjkim */
57207340Sjkim
58207340Sjkim/*******************************************************************************
59207340Sjkim *
60207340Sjkim * FUNCTION:    RsDoWordIoDescriptor
61207340Sjkim *
62281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
63207340Sjkim *
64207340Sjkim * RETURN:      Completed resource node
65207340Sjkim *
66207340Sjkim * DESCRIPTION: Construct a long "WordIO" descriptor
67207340Sjkim *
68207340Sjkim ******************************************************************************/
69207340Sjkim
70207340SjkimASL_RESOURCE_NODE *
71207340SjkimRsDoWordIoDescriptor (
72281075Sdim    ASL_RESOURCE_INFO       *Info)
73207340Sjkim{
74207340Sjkim    AML_RESOURCE            *Descriptor;
75207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
76207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
77207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
78207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
79207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
80207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
81207340Sjkim    UINT8                   *OptionalFields;
82207340Sjkim    UINT16                  StringLength = 0;
83207340Sjkim    UINT32                  OptionIndex = 0;
84281075Sdim    UINT32                  CurrentByteOffset;
85207340Sjkim    UINT32                  i;
86207340Sjkim    BOOLEAN                 ResSourceIndex = FALSE;
87207340Sjkim
88207340Sjkim
89281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
90207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
91281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
92207340Sjkim
93207340Sjkim    Rnode = RsAllocateResourceNode (
94306536Sjkim        sizeof (AML_RESOURCE_ADDRESS16) + 1 + StringLength);
95207340Sjkim
96207340Sjkim    Descriptor = Rnode->Buffer;
97306536Sjkim    Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16;
98306536Sjkim    Descriptor->Address16.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE;
99207340Sjkim
100207340Sjkim    /*
101207340Sjkim     * Initial descriptor length -- may be enlarged if there are
102207340Sjkim     * optional fields present
103207340Sjkim     */
104207340Sjkim    OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16);
105207340Sjkim    Descriptor->Address16.ResourceLength = (UINT16)
106207340Sjkim        (sizeof (AML_RESOURCE_ADDRESS16) -
107207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
108207340Sjkim
109207340Sjkim    /* Process all child initialization nodes */
110207340Sjkim
111207340Sjkim    for (i = 0; InitializerOp; i++)
112207340Sjkim    {
113207340Sjkim        switch (i)
114207340Sjkim        {
115207340Sjkim        case 0: /* Resource Usage */
116207340Sjkim
117207340Sjkim            RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 0, 1);
118207340Sjkim            break;
119207340Sjkim
120207340Sjkim        case 1: /* MinType */
121207340Sjkim
122207340Sjkim            RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0);
123207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
124207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2);
125207340Sjkim            break;
126207340Sjkim
127207340Sjkim        case 2: /* MaxType */
128207340Sjkim
129207340Sjkim            RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0);
130207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
131207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3);
132207340Sjkim            break;
133207340Sjkim
134207340Sjkim        case 3: /* DecodeType */
135207340Sjkim
136207340Sjkim            RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0);
137207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
138207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1);
139207340Sjkim            break;
140207340Sjkim
141207340Sjkim        case 4: /* Range Type */
142207340Sjkim
143207340Sjkim            RsSetFlagBits (&Descriptor->Address16.SpecificFlags, InitializerOp, 0, 3);
144228110Sjkim            RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
145228110Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.SpecificFlags), 0, 2);
146207340Sjkim            break;
147207340Sjkim
148207340Sjkim        case 5: /* Address Granularity */
149207340Sjkim
150207340Sjkim            Descriptor->Address16.Granularity = (UINT16) InitializerOp->Asl.Value.Integer;
151228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
152207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
153207340Sjkim            GranOp = InitializerOp;
154207340Sjkim            break;
155207340Sjkim
156207340Sjkim        case 6: /* Address Min */
157207340Sjkim
158207340Sjkim            Descriptor->Address16.Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
159228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR,
160207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
161207340Sjkim            MinOp = InitializerOp;
162207340Sjkim            break;
163207340Sjkim
164207340Sjkim        case 7: /* Address Max */
165207340Sjkim
166207340Sjkim            Descriptor->Address16.Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
167228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR,
168207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
169207340Sjkim            MaxOp = InitializerOp;
170207340Sjkim            break;
171207340Sjkim
172207340Sjkim        case 8: /* Translation Offset */
173207340Sjkim
174207340Sjkim            Descriptor->Address16.TranslationOffset = (UINT16) InitializerOp->Asl.Value.Integer;
175228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
176207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
177207340Sjkim            break;
178207340Sjkim
179207340Sjkim        case 9: /* Address Length */
180207340Sjkim
181207340Sjkim            Descriptor->Address16.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;
182228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH,
183207340Sjkim                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength));
184207340Sjkim            LengthOp = InitializerOp;
185207340Sjkim            break;
186207340Sjkim
187207340Sjkim        case 10: /* ResSourceIndex [Optional Field - BYTE] */
188207340Sjkim
189207340Sjkim            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
190207340Sjkim            {
191207340Sjkim                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
192207340Sjkim                OptionIndex++;
193207340Sjkim                Descriptor->Address16.ResourceLength++;
194207340Sjkim                ResSourceIndex = TRUE;
195207340Sjkim            }
196207340Sjkim            break;
197207340Sjkim
198207340Sjkim        case 11: /* ResSource [Optional Field - STRING] */
199207340Sjkim
200207340Sjkim            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
201207340Sjkim                (InitializerOp->Asl.Value.String))
202207340Sjkim            {
203207340Sjkim                if (StringLength)
204207340Sjkim                {
205207340Sjkim                    Descriptor->Address16.ResourceLength = (UINT16)
206207340Sjkim                        (Descriptor->Address16.ResourceLength + StringLength);
207207340Sjkim
208207340Sjkim                    strcpy ((char *)
209207340Sjkim                        &OptionalFields[OptionIndex],
210207340Sjkim                        InitializerOp->Asl.Value.String);
211207340Sjkim
212207340Sjkim                    /* ResourceSourceIndex must also be valid */
213207340Sjkim
214207340Sjkim                    if (!ResSourceIndex)
215207340Sjkim                    {
216207340Sjkim                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
217207340Sjkim                            InitializerOp, NULL);
218207340Sjkim                    }
219207340Sjkim                }
220207340Sjkim            }
221207340Sjkim
222207340Sjkim#if 0
223207340Sjkim            /*
224207340Sjkim             * Not a valid ResourceSource, ResourceSourceIndex must also
225207340Sjkim             * be invalid
226207340Sjkim             */
227207340Sjkim            else if (ResSourceIndex)
228207340Sjkim            {
229207340Sjkim                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
230207340Sjkim                    InitializerOp, NULL);
231207340Sjkim            }
232207340Sjkim#endif
233207340Sjkim            break;
234207340Sjkim
235207340Sjkim        case 12: /* ResourceTag */
236207340Sjkim
237281075Sdim            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
238207340Sjkim            break;
239207340Sjkim
240207340Sjkim        case 13: /* Type */
241207340Sjkim
242207340Sjkim            RsSetFlagBits (&Descriptor->Address16.SpecificFlags, InitializerOp, 4, 0);
243207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
244207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.SpecificFlags), 4);
245207340Sjkim            break;
246207340Sjkim
247207340Sjkim        case 14: /* Translation Type */
248207340Sjkim
249207340Sjkim            RsSetFlagBits (&Descriptor->Address16.SpecificFlags, InitializerOp, 5, 0);
250207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
251207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.SpecificFlags), 5);
252207340Sjkim            break;
253207340Sjkim
254207340Sjkim        default:
255207340Sjkim
256207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
257207340Sjkim            break;
258207340Sjkim        }
259207340Sjkim
260207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
261207340Sjkim    }
262207340Sjkim
263207340Sjkim    /* Validate the Min/Max/Len/Gran values */
264207340Sjkim
265207340Sjkim    RsLargeAddressCheck (
266212761Sjkim        (UINT64) Descriptor->Address16.Minimum,
267212761Sjkim        (UINT64) Descriptor->Address16.Maximum,
268212761Sjkim        (UINT64) Descriptor->Address16.AddressLength,
269212761Sjkim        (UINT64) Descriptor->Address16.Granularity,
270207340Sjkim        Descriptor->Address16.Flags,
271281075Sdim        MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp);
272207340Sjkim
273207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
274281075Sdim        OptionIndex + StringLength;
275207340Sjkim    return (Rnode);
276207340Sjkim}
277207340Sjkim
278207340Sjkim
279207340Sjkim/*******************************************************************************
280207340Sjkim *
281207340Sjkim * FUNCTION:    RsDoWordBusNumberDescriptor
282207340Sjkim *
283281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
284207340Sjkim *
285207340Sjkim * RETURN:      Completed resource node
286207340Sjkim *
287207340Sjkim * DESCRIPTION: Construct a long "WordBusNumber" descriptor
288207340Sjkim *
289207340Sjkim ******************************************************************************/
290207340Sjkim
291207340SjkimASL_RESOURCE_NODE *
292207340SjkimRsDoWordBusNumberDescriptor (
293281075Sdim    ASL_RESOURCE_INFO       *Info)
294207340Sjkim{
295207340Sjkim    AML_RESOURCE            *Descriptor;
296207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
297207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
298207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
299207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
300207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
301207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
302207340Sjkim    UINT8                   *OptionalFields;
303207340Sjkim    UINT16                  StringLength = 0;
304207340Sjkim    UINT32                  OptionIndex = 0;
305281075Sdim    UINT32                  CurrentByteOffset;
306207340Sjkim    UINT32                  i;
307207340Sjkim    BOOLEAN                 ResSourceIndex = FALSE;
308207340Sjkim
309207340Sjkim
310281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
311207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
312281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
313207340Sjkim
314207340Sjkim    Rnode = RsAllocateResourceNode (
315306536Sjkim        sizeof (AML_RESOURCE_ADDRESS16) + 1 + StringLength);
316207340Sjkim
317207340Sjkim    Descriptor = Rnode->Buffer;
318306536Sjkim    Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16;
319306536Sjkim    Descriptor->Address16.ResourceType = ACPI_ADDRESS_TYPE_BUS_NUMBER_RANGE;
320207340Sjkim
321207340Sjkim    /*
322207340Sjkim     * Initial descriptor length -- may be enlarged if there are
323207340Sjkim     * optional fields present
324207340Sjkim     */
325207340Sjkim    OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16);
326207340Sjkim    Descriptor->Address16.ResourceLength = (UINT16)
327207340Sjkim        (sizeof (AML_RESOURCE_ADDRESS16) -
328207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
329207340Sjkim
330207340Sjkim    /* Process all child initialization nodes */
331207340Sjkim
332207340Sjkim    for (i = 0; InitializerOp; i++)
333207340Sjkim    {
334207340Sjkim        switch (i)
335207340Sjkim        {
336207340Sjkim        case 0: /* Resource Usage */
337207340Sjkim
338207340Sjkim            RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 0, 1);
339207340Sjkim            break;
340207340Sjkim
341207340Sjkim        case 1: /* MinType */
342207340Sjkim
343207340Sjkim            RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0);
344207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
345207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2);
346207340Sjkim            break;
347207340Sjkim
348207340Sjkim        case 2: /* MaxType */
349207340Sjkim
350207340Sjkim            RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0);
351207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
352207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3);
353207340Sjkim            break;
354207340Sjkim
355207340Sjkim        case 3: /* DecodeType */
356207340Sjkim
357207340Sjkim            RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0);
358207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
359207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1);
360207340Sjkim            break;
361207340Sjkim
362207340Sjkim        case 4: /* Address Granularity */
363207340Sjkim
364207340Sjkim            Descriptor->Address16.Granularity =
365207340Sjkim                (UINT16) InitializerOp->Asl.Value.Integer;
366228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
367207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
368207340Sjkim            GranOp = InitializerOp;
369207340Sjkim            break;
370207340Sjkim
371207340Sjkim        case 5: /* Min Address */
372207340Sjkim
373207340Sjkim            Descriptor->Address16.Minimum =
374207340Sjkim                (UINT16) InitializerOp->Asl.Value.Integer;
375228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR,
376207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
377207340Sjkim            MinOp = InitializerOp;
378207340Sjkim            break;
379207340Sjkim
380207340Sjkim        case 6: /* Max Address */
381207340Sjkim
382207340Sjkim            Descriptor->Address16.Maximum =
383207340Sjkim                (UINT16) InitializerOp->Asl.Value.Integer;
384228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR,
385207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
386207340Sjkim            MaxOp = InitializerOp;
387207340Sjkim            break;
388207340Sjkim
389207340Sjkim        case 7: /* Translation Offset */
390207340Sjkim
391207340Sjkim            Descriptor->Address16.TranslationOffset =
392207340Sjkim                (UINT16) InitializerOp->Asl.Value.Integer;
393228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
394207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
395207340Sjkim            break;
396207340Sjkim
397207340Sjkim        case 8: /* Address Length */
398207340Sjkim
399207340Sjkim            Descriptor->Address16.AddressLength =
400207340Sjkim                (UINT16) InitializerOp->Asl.Value.Integer;
401228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH,
402207340Sjkim                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength));
403207340Sjkim            LengthOp = InitializerOp;
404207340Sjkim            break;
405207340Sjkim
406207340Sjkim        case 9: /* ResSourceIndex [Optional Field - BYTE] */
407207340Sjkim
408207340Sjkim            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
409207340Sjkim            {
410207340Sjkim                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
411207340Sjkim                OptionIndex++;
412207340Sjkim                Descriptor->Address16.ResourceLength++;
413207340Sjkim                ResSourceIndex = TRUE;
414207340Sjkim            }
415207340Sjkim            break;
416207340Sjkim
417207340Sjkim        case 10: /* ResSource [Optional Field - STRING] */
418207340Sjkim
419207340Sjkim            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
420207340Sjkim                (InitializerOp->Asl.Value.String))
421207340Sjkim            {
422207340Sjkim                if (StringLength)
423207340Sjkim                {
424207340Sjkim                    Descriptor->Address16.ResourceLength = (UINT16)
425207340Sjkim                        (Descriptor->Address16.ResourceLength + StringLength);
426207340Sjkim
427207340Sjkim                    strcpy ((char *)
428207340Sjkim                        &OptionalFields[OptionIndex],
429207340Sjkim                        InitializerOp->Asl.Value.String);
430207340Sjkim
431207340Sjkim                    /* ResourceSourceIndex must also be valid */
432207340Sjkim
433207340Sjkim                    if (!ResSourceIndex)
434207340Sjkim                    {
435207340Sjkim                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
436207340Sjkim                            InitializerOp, NULL);
437207340Sjkim                    }
438207340Sjkim                }
439207340Sjkim            }
440207340Sjkim
441207340Sjkim#if 0
442207340Sjkim            /*
443207340Sjkim             * Not a valid ResourceSource, ResourceSourceIndex must also
444207340Sjkim             * be invalid
445207340Sjkim             */
446207340Sjkim            else if (ResSourceIndex)
447207340Sjkim            {
448207340Sjkim                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
449207340Sjkim                    InitializerOp, NULL);
450207340Sjkim            }
451207340Sjkim#endif
452207340Sjkim            break;
453207340Sjkim
454207340Sjkim        case 11: /* ResourceTag */
455207340Sjkim
456281075Sdim            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
457207340Sjkim            break;
458207340Sjkim
459207340Sjkim        default:
460207340Sjkim
461207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
462207340Sjkim            break;
463207340Sjkim        }
464207340Sjkim
465207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
466207340Sjkim    }
467207340Sjkim
468207340Sjkim    /* Validate the Min/Max/Len/Gran values */
469207340Sjkim
470207340Sjkim    RsLargeAddressCheck (
471212761Sjkim        (UINT64) Descriptor->Address16.Minimum,
472212761Sjkim        (UINT64) Descriptor->Address16.Maximum,
473212761Sjkim        (UINT64) Descriptor->Address16.AddressLength,
474212761Sjkim        (UINT64) Descriptor->Address16.Granularity,
475207340Sjkim        Descriptor->Address16.Flags,
476281075Sdim        MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp);
477207340Sjkim
478207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
479281075Sdim        OptionIndex + StringLength;
480207340Sjkim    return (Rnode);
481207340Sjkim}
482207340Sjkim
483207340Sjkim
484207340Sjkim/*******************************************************************************
485207340Sjkim *
486207340Sjkim * FUNCTION:    RsDoWordSpaceDescriptor
487207340Sjkim *
488281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
489207340Sjkim *
490207340Sjkim * RETURN:      Completed resource node
491207340Sjkim *
492207340Sjkim * DESCRIPTION: Construct a long "WordSpace" descriptor
493207340Sjkim *
494207340Sjkim ******************************************************************************/
495207340Sjkim
496207340SjkimASL_RESOURCE_NODE *
497207340SjkimRsDoWordSpaceDescriptor (
498281075Sdim    ASL_RESOURCE_INFO       *Info)
499207340Sjkim{
500207340Sjkim    AML_RESOURCE            *Descriptor;
501207340Sjkim    ACPI_PARSE_OBJECT       *InitializerOp;
502207340Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
503207340Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
504207340Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
505207340Sjkim    ACPI_PARSE_OBJECT       *GranOp = NULL;
506207340Sjkim    ASL_RESOURCE_NODE       *Rnode;
507207340Sjkim    UINT8                   *OptionalFields;
508207340Sjkim    UINT16                  StringLength = 0;
509207340Sjkim    UINT32                  OptionIndex = 0;
510281075Sdim    UINT32                  CurrentByteOffset;
511207340Sjkim    UINT32                  i;
512207340Sjkim    BOOLEAN                 ResSourceIndex = FALSE;
513207340Sjkim
514207340Sjkim
515281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
516207340Sjkim    StringLength = RsGetStringDataLength (InitializerOp);
517281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
518207340Sjkim
519207340Sjkim    Rnode = RsAllocateResourceNode (
520306536Sjkim        sizeof (AML_RESOURCE_ADDRESS16) + 1 + StringLength);
521207340Sjkim
522207340Sjkim    Descriptor = Rnode->Buffer;
523306536Sjkim    Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16;
524207340Sjkim
525207340Sjkim    /*
526207340Sjkim     * Initial descriptor length -- may be enlarged if there are
527207340Sjkim     * optional fields present
528207340Sjkim     */
529207340Sjkim    OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16);
530207340Sjkim    Descriptor->Address16.ResourceLength = (UINT16)
531207340Sjkim        (sizeof (AML_RESOURCE_ADDRESS16) -
532207340Sjkim         sizeof (AML_RESOURCE_LARGE_HEADER));
533207340Sjkim
534207340Sjkim    /* Process all child initialization nodes */
535207340Sjkim
536207340Sjkim    for (i = 0; InitializerOp; i++)
537207340Sjkim    {
538207340Sjkim        switch (i)
539207340Sjkim        {
540207340Sjkim        case 0: /* Resource Type */
541207340Sjkim
542207340Sjkim            Descriptor->Address16.ResourceType =
543207340Sjkim                (UINT8) InitializerOp->Asl.Value.Integer;
544207340Sjkim            break;
545207340Sjkim
546207340Sjkim        case 1: /* Resource Usage */
547207340Sjkim
548207340Sjkim            RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 0, 1);
549207340Sjkim            break;
550207340Sjkim
551207340Sjkim        case 2: /* DecodeType */
552207340Sjkim
553207340Sjkim            RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0);
554207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
555207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1);
556207340Sjkim            break;
557207340Sjkim
558207340Sjkim        case 3: /* MinType */
559207340Sjkim
560207340Sjkim            RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0);
561207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
562207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2);
563207340Sjkim            break;
564207340Sjkim
565207340Sjkim        case 4: /* MaxType */
566207340Sjkim
567207340Sjkim            RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0);
568207340Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
569207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3);
570207340Sjkim            break;
571207340Sjkim
572207340Sjkim        case 5: /* Type-Specific flags */
573207340Sjkim
574207340Sjkim            Descriptor->Address16.SpecificFlags =
575207340Sjkim                (UINT8) InitializerOp->Asl.Value.Integer;
576207340Sjkim            break;
577207340Sjkim
578207340Sjkim        case 6: /* Address Granularity */
579207340Sjkim
580207340Sjkim            Descriptor->Address16.Granularity =
581207340Sjkim                (UINT16) InitializerOp->Asl.Value.Integer;
582228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
583207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
584207340Sjkim            GranOp = InitializerOp;
585207340Sjkim            break;
586207340Sjkim
587207340Sjkim        case 7: /* Min Address */
588207340Sjkim
589207340Sjkim            Descriptor->Address16.Minimum =
590207340Sjkim                (UINT16) InitializerOp->Asl.Value.Integer;
591228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR,
592207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
593207340Sjkim            MinOp = InitializerOp;
594207340Sjkim            break;
595207340Sjkim
596207340Sjkim        case 8: /* Max Address */
597207340Sjkim
598207340Sjkim            Descriptor->Address16.Maximum =
599207340Sjkim                (UINT16) InitializerOp->Asl.Value.Integer;
600228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR,
601207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
602207340Sjkim            MaxOp = InitializerOp;
603207340Sjkim            break;
604207340Sjkim
605207340Sjkim        case 9: /* Translation Offset */
606207340Sjkim
607207340Sjkim            Descriptor->Address16.TranslationOffset =
608207340Sjkim                (UINT16) InitializerOp->Asl.Value.Integer;
609228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
610207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
611207340Sjkim            break;
612207340Sjkim
613207340Sjkim        case 10: /* Address Length */
614207340Sjkim
615207340Sjkim            Descriptor->Address16.AddressLength =
616207340Sjkim                (UINT16) InitializerOp->Asl.Value.Integer;
617228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH,
618207340Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength));
619207340Sjkim            LengthOp = InitializerOp;
620207340Sjkim            break;
621207340Sjkim
622207340Sjkim        case 11: /* ResSourceIndex [Optional Field - BYTE] */
623207340Sjkim
624207340Sjkim            if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
625207340Sjkim            {
626207340Sjkim                OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
627207340Sjkim                OptionIndex++;
628207340Sjkim                Descriptor->Address16.ResourceLength++;
629207340Sjkim                ResSourceIndex = TRUE;
630207340Sjkim            }
631207340Sjkim            break;
632207340Sjkim
633207340Sjkim        case 12: /* ResSource [Optional Field - STRING] */
634207340Sjkim
635207340Sjkim            if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
636207340Sjkim                (InitializerOp->Asl.Value.String))
637207340Sjkim            {
638207340Sjkim                if (StringLength)
639207340Sjkim                {
640207340Sjkim                    Descriptor->Address16.ResourceLength = (UINT16)
641207340Sjkim                        (Descriptor->Address16.ResourceLength + StringLength);
642207340Sjkim
643207340Sjkim                    strcpy ((char *)
644207340Sjkim                        &OptionalFields[OptionIndex],
645207340Sjkim                        InitializerOp->Asl.Value.String);
646207340Sjkim
647207340Sjkim                    /* ResourceSourceIndex must also be valid */
648207340Sjkim
649207340Sjkim                    if (!ResSourceIndex)
650207340Sjkim                    {
651207340Sjkim                        AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
652207340Sjkim                            InitializerOp, NULL);
653207340Sjkim                    }
654207340Sjkim                }
655207340Sjkim            }
656207340Sjkim
657207340Sjkim#if 0
658207340Sjkim            /*
659207340Sjkim             * Not a valid ResourceSource, ResourceSourceIndex must also
660207340Sjkim             * be invalid
661207340Sjkim             */
662207340Sjkim            else if (ResSourceIndex)
663207340Sjkim            {
664207340Sjkim                AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
665207340Sjkim                    InitializerOp, NULL);
666207340Sjkim            }
667207340Sjkim#endif
668207340Sjkim            break;
669207340Sjkim
670207340Sjkim        case 13: /* ResourceTag */
671207340Sjkim
672281075Sdim            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
673207340Sjkim            break;
674207340Sjkim
675207340Sjkim        default:
676207340Sjkim
677207340Sjkim            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
678207340Sjkim            break;
679207340Sjkim        }
680207340Sjkim
681207340Sjkim        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
682207340Sjkim    }
683207340Sjkim
684207340Sjkim    /* Validate the Min/Max/Len/Gran values */
685207340Sjkim
686207340Sjkim    RsLargeAddressCheck (
687212761Sjkim        (UINT64) Descriptor->Address16.Minimum,
688212761Sjkim        (UINT64) Descriptor->Address16.Maximum,
689212761Sjkim        (UINT64) Descriptor->Address16.AddressLength,
690212761Sjkim        (UINT64) Descriptor->Address16.Granularity,
691207340Sjkim        Descriptor->Address16.Flags,
692281075Sdim        MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp);
693207340Sjkim
694207340Sjkim    Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
695281075Sdim        OptionIndex + StringLength;
696207340Sjkim    return (Rnode);
697207340Sjkim}
698