1118611Snjl/******************************************************************************
2118611Snjl *
3207344Sjkim * Module Name: aslrestype1 - Miscellaneous small resource descriptors
4118611Snjl *
5118611Snjl *****************************************************************************/
6118611Snjl
7217365Sjkim/*
8281075Sdim * Copyright (C) 2000 - 2015, Intel Corp.
9118611Snjl * All rights reserved.
10118611Snjl *
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.
25118611Snjl *
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.
29118611Snjl *
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 */
43118611Snjl
44151937Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
45118611Snjl#include "aslcompiler.y.h"
46118611Snjl
47118611Snjl#define _COMPONENT          ACPI_COMPILER
48118611Snjl        ACPI_MODULE_NAME    ("aslrestype1")
49118611Snjl
50207344Sjkim/*
51207344Sjkim * This module contains miscellaneous small resource descriptors:
52207344Sjkim *
53207344Sjkim * EndTag
54207344Sjkim * EndDependentFn
55207344Sjkim * Memory24
56207344Sjkim * Memory32
57207344Sjkim * Memory32Fixed
58207344Sjkim * StartDependentFn
59207344Sjkim * StartDependentFnNoPri
60207344Sjkim * VendorShort
61207344Sjkim */
62118611Snjl
63118611Snjl/*******************************************************************************
64118611Snjl *
65167802Sjkim * FUNCTION:    RsDoEndTagDescriptor
66167802Sjkim *
67281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
68167802Sjkim *
69167802Sjkim * RETURN:      Completed resource node
70167802Sjkim *
71167802Sjkim * DESCRIPTION: Construct a short "EndDependentFn" descriptor
72167802Sjkim *
73167802Sjkim ******************************************************************************/
74167802Sjkim
75167802SjkimASL_RESOURCE_NODE *
76167802SjkimRsDoEndTagDescriptor (
77281075Sdim    ASL_RESOURCE_INFO       *Info)
78167802Sjkim{
79167802Sjkim    AML_RESOURCE            *Descriptor;
80167802Sjkim    ASL_RESOURCE_NODE       *Rnode;
81167802Sjkim
82167802Sjkim
83167802Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_END_TAG));
84167802Sjkim
85167802Sjkim    Descriptor = Rnode->Buffer;
86167802Sjkim    Descriptor->EndTag.DescriptorType = ACPI_RESOURCE_NAME_END_TAG |
87167802Sjkim                                        ASL_RDESC_END_TAG_SIZE;
88167802Sjkim    Descriptor->EndTag.Checksum = 0;
89167802Sjkim
90167802Sjkim    return (Rnode);
91167802Sjkim}
92167802Sjkim
93167802Sjkim
94167802Sjkim/*******************************************************************************
95167802Sjkim *
96118611Snjl * FUNCTION:    RsDoEndDependentDescriptor
97118611Snjl *
98281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
99118611Snjl *
100118611Snjl * RETURN:      Completed resource node
101118611Snjl *
102118611Snjl * DESCRIPTION: Construct a short "EndDependentFn" descriptor
103118611Snjl *
104118611Snjl ******************************************************************************/
105118611Snjl
106118611SnjlASL_RESOURCE_NODE *
107118611SnjlRsDoEndDependentDescriptor (
108281075Sdim    ASL_RESOURCE_INFO       *Info)
109118611Snjl{
110151937Sjkim    AML_RESOURCE            *Descriptor;
111118611Snjl    ASL_RESOURCE_NODE       *Rnode;
112118611Snjl
113118611Snjl
114151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_END_DEPENDENT));
115118611Snjl
116118611Snjl    Descriptor = Rnode->Buffer;
117151937Sjkim    Descriptor->EndDpf.DescriptorType  = ACPI_RESOURCE_NAME_END_DEPENDENT |
118151937Sjkim                                      ASL_RDESC_END_DEPEND_SIZE;
119118611Snjl    return (Rnode);
120118611Snjl}
121118611Snjl
122118611Snjl
123118611Snjl/*******************************************************************************
124118611Snjl *
125118611Snjl * FUNCTION:    RsDoMemory24Descriptor
126118611Snjl *
127281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
128118611Snjl *
129118611Snjl * RETURN:      Completed resource node
130118611Snjl *
131118611Snjl * DESCRIPTION: Construct a short "Memory24" descriptor
132118611Snjl *
133118611Snjl ******************************************************************************/
134118611Snjl
135118611SnjlASL_RESOURCE_NODE *
136118611SnjlRsDoMemory24Descriptor (
137281075Sdim    ASL_RESOURCE_INFO       *Info)
138118611Snjl{
139151937Sjkim    AML_RESOURCE            *Descriptor;
140118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
141207344Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
142207344Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
143207344Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
144118611Snjl    ASL_RESOURCE_NODE       *Rnode;
145281075Sdim    UINT32                  CurrentByteOffset;
146118611Snjl    UINT32                  i;
147118611Snjl
148118611Snjl
149281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
150281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
151151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_MEMORY24));
152118611Snjl
153118611Snjl    Descriptor = Rnode->Buffer;
154151937Sjkim    Descriptor->Memory24.DescriptorType  = ACPI_RESOURCE_NAME_MEMORY24;
155151937Sjkim    Descriptor->Memory24.ResourceLength = 9;
156118611Snjl
157151937Sjkim    /* Process all child initialization nodes */
158151937Sjkim
159118611Snjl    for (i = 0; InitializerOp; i++)
160118611Snjl    {
161118611Snjl        switch (i)
162118611Snjl        {
163118611Snjl        case 0: /* Read/Write type */
164118611Snjl
165151937Sjkim            RsSetFlagBits (&Descriptor->Memory24.Flags, InitializerOp, 0, 1);
166167802Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
167151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Flags), 0);
168118611Snjl            break;
169118611Snjl
170118611Snjl        case 1: /* Min Address */
171118611Snjl
172151937Sjkim            Descriptor->Memory24.Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
173228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR,
174151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Minimum));
175207344Sjkim            MinOp = InitializerOp;
176118611Snjl            break;
177118611Snjl
178118611Snjl        case 2: /* Max Address */
179118611Snjl
180151937Sjkim            Descriptor->Memory24.Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
181228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR,
182151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Maximum));
183207344Sjkim            MaxOp = InitializerOp;
184118611Snjl            break;
185118611Snjl
186118611Snjl        case 3: /* Alignment */
187118611Snjl
188151937Sjkim            Descriptor->Memory24.Alignment = (UINT16) InitializerOp->Asl.Value.Integer;
189228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_ALIGNMENT,
190151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Alignment));
191118611Snjl            break;
192118611Snjl
193118611Snjl        case 4: /* Length */
194118611Snjl
195151937Sjkim            Descriptor->Memory24.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;
196228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH,
197151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.AddressLength));
198207344Sjkim            LengthOp = InitializerOp;
199118611Snjl            break;
200118611Snjl
201118611Snjl        case 5: /* Name */
202118611Snjl
203281075Sdim            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
204118611Snjl            break;
205118611Snjl
206118611Snjl        default:
207118611Snjl
208118611Snjl            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
209118611Snjl            break;
210118611Snjl        }
211118611Snjl
212118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
213118611Snjl    }
214118611Snjl
215207344Sjkim    /* Validate the Min/Max/Len/Align values (Alignment==0 means 64K) */
216207344Sjkim
217207344Sjkim    RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY24,
218207344Sjkim        Descriptor->Memory24.Minimum,
219207344Sjkim        Descriptor->Memory24.Maximum,
220207344Sjkim        Descriptor->Memory24.AddressLength,
221207344Sjkim        Descriptor->Memory24.Alignment,
222281075Sdim        MinOp, MaxOp, LengthOp, NULL, Info->DescriptorTypeOp);
223207344Sjkim
224118611Snjl    return (Rnode);
225118611Snjl}
226118611Snjl
227118611Snjl
228118611Snjl/*******************************************************************************
229118611Snjl *
230118611Snjl * FUNCTION:    RsDoMemory32Descriptor
231118611Snjl *
232281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
233118611Snjl *
234118611Snjl * RETURN:      Completed resource node
235118611Snjl *
236118611Snjl * DESCRIPTION: Construct a short "Memory32" descriptor
237118611Snjl *
238118611Snjl ******************************************************************************/
239118611Snjl
240118611SnjlASL_RESOURCE_NODE *
241118611SnjlRsDoMemory32Descriptor (
242281075Sdim    ASL_RESOURCE_INFO       *Info)
243118611Snjl{
244151937Sjkim    AML_RESOURCE            *Descriptor;
245118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
246207344Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
247207344Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
248207344Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
249207344Sjkim    ACPI_PARSE_OBJECT       *AlignOp = NULL;
250118611Snjl    ASL_RESOURCE_NODE       *Rnode;
251281075Sdim    UINT32                  CurrentByteOffset;
252118611Snjl    UINT32                  i;
253118611Snjl
254118611Snjl
255281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
256281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
257151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_MEMORY32));
258118611Snjl
259118611Snjl    Descriptor = Rnode->Buffer;
260151937Sjkim    Descriptor->Memory32.DescriptorType  = ACPI_RESOURCE_NAME_MEMORY32;
261151937Sjkim    Descriptor->Memory32.ResourceLength = 17;
262118611Snjl
263151937Sjkim    /* Process all child initialization nodes */
264151937Sjkim
265118611Snjl    for (i = 0; InitializerOp; i++)
266118611Snjl    {
267118611Snjl        switch (i)
268118611Snjl        {
269118611Snjl        case 0: /* Read/Write type */
270118611Snjl
271151937Sjkim            RsSetFlagBits (&Descriptor->Memory32.Flags, InitializerOp, 0, 1);
272167802Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
273151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Flags), 0);
274118611Snjl            break;
275118611Snjl
276118611Snjl        case 1:  /* Min Address */
277118611Snjl
278151937Sjkim            Descriptor->Memory32.Minimum = (UINT32) InitializerOp->Asl.Value.Integer;
279228110Sjkim            RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR,
280151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Minimum));
281207344Sjkim            MinOp = InitializerOp;
282118611Snjl            break;
283118611Snjl
284118611Snjl        case 2: /* Max Address */
285118611Snjl
286151937Sjkim            Descriptor->Memory32.Maximum = (UINT32) InitializerOp->Asl.Value.Integer;
287228110Sjkim            RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
288151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Maximum));
289207344Sjkim            MaxOp = InitializerOp;
290118611Snjl            break;
291118611Snjl
292118611Snjl        case 3: /* Alignment */
293118611Snjl
294151937Sjkim            Descriptor->Memory32.Alignment = (UINT32) InitializerOp->Asl.Value.Integer;
295228110Sjkim            RsCreateDwordField (InitializerOp, ACPI_RESTAG_ALIGNMENT,
296151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Alignment));
297207344Sjkim            AlignOp = InitializerOp;
298118611Snjl            break;
299118611Snjl
300118611Snjl        case 4: /* Length */
301118611Snjl
302151937Sjkim            Descriptor->Memory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer;
303228110Sjkim            RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH,
304151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.AddressLength));
305207344Sjkim            LengthOp = InitializerOp;
306118611Snjl            break;
307118611Snjl
308118611Snjl        case 5: /* Name */
309118611Snjl
310281075Sdim            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
311118611Snjl            break;
312118611Snjl
313118611Snjl        default:
314118611Snjl
315118611Snjl            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
316118611Snjl            break;
317118611Snjl        }
318118611Snjl
319118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
320118611Snjl    }
321118611Snjl
322207344Sjkim    /* Validate the Min/Max/Len/Align values */
323207344Sjkim
324207344Sjkim    RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY32,
325207344Sjkim        Descriptor->Memory32.Minimum,
326207344Sjkim        Descriptor->Memory32.Maximum,
327207344Sjkim        Descriptor->Memory32.AddressLength,
328207344Sjkim        Descriptor->Memory32.Alignment,
329281075Sdim        MinOp, MaxOp, LengthOp, AlignOp, Info->DescriptorTypeOp);
330207344Sjkim
331118611Snjl    return (Rnode);
332118611Snjl}
333118611Snjl
334118611Snjl
335118611Snjl/*******************************************************************************
336118611Snjl *
337118611Snjl * FUNCTION:    RsDoMemory32FixedDescriptor
338118611Snjl *
339281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
340118611Snjl *
341118611Snjl * RETURN:      Completed resource node
342118611Snjl *
343118611Snjl * DESCRIPTION: Construct a short "Memory32Fixed" descriptor
344118611Snjl *
345118611Snjl ******************************************************************************/
346118611Snjl
347118611SnjlASL_RESOURCE_NODE *
348118611SnjlRsDoMemory32FixedDescriptor (
349281075Sdim    ASL_RESOURCE_INFO       *Info)
350118611Snjl{
351151937Sjkim    AML_RESOURCE            *Descriptor;
352118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
353118611Snjl    ASL_RESOURCE_NODE       *Rnode;
354281075Sdim    UINT32                  CurrentByteOffset;
355118611Snjl    UINT32                  i;
356118611Snjl
357118611Snjl
358281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
359281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
360151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_FIXED_MEMORY32));
361118611Snjl
362118611Snjl    Descriptor = Rnode->Buffer;
363151937Sjkim    Descriptor->FixedMemory32.DescriptorType  = ACPI_RESOURCE_NAME_FIXED_MEMORY32;
364151937Sjkim    Descriptor->FixedMemory32.ResourceLength = 9;
365118611Snjl
366151937Sjkim    /* Process all child initialization nodes */
367151937Sjkim
368118611Snjl    for (i = 0; InitializerOp; i++)
369118611Snjl    {
370118611Snjl        switch (i)
371118611Snjl        {
372118611Snjl        case 0: /* Read/Write type */
373118611Snjl
374151937Sjkim            RsSetFlagBits (&Descriptor->FixedMemory32.Flags, InitializerOp, 0, 1);
375167802Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
376151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Flags), 0);
377118611Snjl            break;
378118611Snjl
379118611Snjl        case 1: /* Address */
380118611Snjl
381151937Sjkim            Descriptor->FixedMemory32.Address = (UINT32) InitializerOp->Asl.Value.Integer;
382228110Sjkim            RsCreateDwordField (InitializerOp, ACPI_RESTAG_BASEADDRESS,
383151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Address));
384118611Snjl            break;
385118611Snjl
386118611Snjl        case 2: /* Length */
387118611Snjl
388151937Sjkim            Descriptor->FixedMemory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer;
389228110Sjkim            RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH,
390151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.AddressLength));
391118611Snjl            break;
392118611Snjl
393118611Snjl        case 3: /* Name */
394118611Snjl
395281075Sdim            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
396118611Snjl            break;
397118611Snjl
398118611Snjl        default:
399118611Snjl
400118611Snjl            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
401118611Snjl            break;
402118611Snjl        }
403118611Snjl
404118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
405118611Snjl    }
406118611Snjl
407118611Snjl    return (Rnode);
408118611Snjl}
409118611Snjl
410118611Snjl
411118611Snjl/*******************************************************************************
412118611Snjl *
413118611Snjl * FUNCTION:    RsDoStartDependentDescriptor
414118611Snjl *
415281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
416118611Snjl *
417118611Snjl * RETURN:      Completed resource node
418118611Snjl *
419118611Snjl * DESCRIPTION: Construct a short "StartDependentFn" descriptor
420118611Snjl *
421118611Snjl ******************************************************************************/
422118611Snjl
423118611SnjlASL_RESOURCE_NODE *
424118611SnjlRsDoStartDependentDescriptor (
425281075Sdim    ASL_RESOURCE_INFO       *Info)
426118611Snjl{
427151937Sjkim    AML_RESOURCE            *Descriptor;
428118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
429118611Snjl    ASL_RESOURCE_NODE       *Rnode;
430118611Snjl    ASL_RESOURCE_NODE       *PreviousRnode;
431118611Snjl    ASL_RESOURCE_NODE       *NextRnode;
432281075Sdim    ASL_RESOURCE_INFO       NextInfo;
433281075Sdim    UINT32                  CurrentByteOffset;
434118611Snjl    UINT32                  i;
435118611Snjl    UINT8                   State;
436118611Snjl
437118611Snjl
438281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
439281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
440151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_START_DEPENDENT));
441118611Snjl
442118611Snjl    PreviousRnode = Rnode;
443118611Snjl    Descriptor = Rnode->Buffer;
444118611Snjl
445234623Sjkim    /* Increment offset past StartDependent descriptor */
446234623Sjkim
447234623Sjkim    CurrentByteOffset += sizeof (AML_RESOURCE_START_DEPENDENT);
448234623Sjkim
449118611Snjl    /* Descriptor has priority byte */
450118611Snjl
451151937Sjkim    Descriptor->StartDpf.DescriptorType  = ACPI_RESOURCE_NAME_START_DEPENDENT |
452151937Sjkim                                      (ASL_RDESC_ST_DEPEND_SIZE + 0x01);
453118611Snjl
454151937Sjkim    /* Process all child initialization nodes */
455151937Sjkim
456118611Snjl    State = ACPI_RSTATE_START_DEPENDENT;
457118611Snjl    for (i = 0; InitializerOp; i++)
458118611Snjl    {
459118611Snjl        switch (i)
460118611Snjl        {
461118611Snjl        case 0: /* Compatibility Priority */
462118611Snjl
463118611Snjl            if ((UINT8) InitializerOp->Asl.Value.Integer > 2)
464118611Snjl            {
465151937Sjkim                AslError (ASL_ERROR, ASL_MSG_INVALID_PRIORITY,
466151937Sjkim                    InitializerOp, NULL);
467118611Snjl            }
468118611Snjl
469151937Sjkim            RsSetFlagBits (&Descriptor->StartDpf.Flags, InitializerOp, 0, 0);
470118611Snjl            break;
471118611Snjl
472118611Snjl        case 1: /* Performance/Robustness Priority */
473118611Snjl
474118611Snjl            if ((UINT8) InitializerOp->Asl.Value.Integer > 2)
475118611Snjl            {
476151937Sjkim                AslError (ASL_ERROR, ASL_MSG_INVALID_PERFORMANCE,
477151937Sjkim                    InitializerOp, NULL);
478118611Snjl            }
479118611Snjl
480151937Sjkim            RsSetFlagBits (&Descriptor->StartDpf.Flags, InitializerOp, 2, 0);
481118611Snjl            break;
482118611Snjl
483118611Snjl        default:
484207344Sjkim
485281075Sdim            NextInfo.CurrentByteOffset = CurrentByteOffset;
486281075Sdim            NextInfo.DescriptorTypeOp = InitializerOp;
487118611Snjl
488281075Sdim            NextRnode = RsDoOneResourceDescriptor (&NextInfo, &State);
489281075Sdim
490118611Snjl            /*
491118611Snjl             * Update current byte offset to indicate the number of bytes from the
492241973Sjkim             * start of the buffer. Buffer can include multiple descriptors, we
493118611Snjl             * must keep track of the offset of not only each descriptor, but each
494118611Snjl             * element (field) within each descriptor as well.
495118611Snjl             */
496151937Sjkim            CurrentByteOffset += RsLinkDescriptorChain (&PreviousRnode,
497151937Sjkim                                    NextRnode);
498118611Snjl            break;
499118611Snjl        }
500118611Snjl
501118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
502118611Snjl    }
503118611Snjl
504118611Snjl    return (Rnode);
505118611Snjl}
506118611Snjl
507118611Snjl
508118611Snjl/*******************************************************************************
509118611Snjl *
510118611Snjl * FUNCTION:    RsDoStartDependentNoPriDescriptor
511118611Snjl *
512281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
513118611Snjl *
514118611Snjl * RETURN:      Completed resource node
515118611Snjl *
516118611Snjl * DESCRIPTION: Construct a short "StartDependentNoPri" descriptor
517118611Snjl *
518118611Snjl ******************************************************************************/
519118611Snjl
520118611SnjlASL_RESOURCE_NODE *
521118611SnjlRsDoStartDependentNoPriDescriptor (
522281075Sdim    ASL_RESOURCE_INFO       *Info)
523118611Snjl{
524151937Sjkim    AML_RESOURCE            *Descriptor;
525118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
526118611Snjl    ASL_RESOURCE_NODE       *Rnode;
527118611Snjl    ASL_RESOURCE_NODE       *PreviousRnode;
528118611Snjl    ASL_RESOURCE_NODE       *NextRnode;
529281075Sdim    ASL_RESOURCE_INFO       NextInfo;
530281075Sdim    UINT32                  CurrentByteOffset;
531118611Snjl    UINT8                   State;
532118611Snjl
533118611Snjl
534281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
535281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
536151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO));
537118611Snjl
538118611Snjl    Descriptor = Rnode->Buffer;
539151937Sjkim    Descriptor->StartDpf.DescriptorType  = ACPI_RESOURCE_NAME_START_DEPENDENT |
540151937Sjkim                                      ASL_RDESC_ST_DEPEND_SIZE;
541118611Snjl    PreviousRnode = Rnode;
542118611Snjl
543234623Sjkim    /* Increment offset past StartDependentNoPri descriptor */
544234623Sjkim
545234623Sjkim    CurrentByteOffset += sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO);
546234623Sjkim
547151937Sjkim    /* Process all child initialization nodes */
548151937Sjkim
549118611Snjl    State = ACPI_RSTATE_START_DEPENDENT;
550118611Snjl    while (InitializerOp)
551118611Snjl    {
552281075Sdim        NextInfo.CurrentByteOffset = CurrentByteOffset;
553281075Sdim        NextInfo.DescriptorTypeOp = InitializerOp;
554118611Snjl
555281075Sdim        NextRnode = RsDoOneResourceDescriptor (&NextInfo, &State);
556281075Sdim
557118611Snjl        /*
558118611Snjl         * Update current byte offset to indicate the number of bytes from the
559241973Sjkim         * start of the buffer. Buffer can include multiple descriptors, we
560118611Snjl         * must keep track of the offset of not only each descriptor, but each
561118611Snjl         * element (field) within each descriptor as well.
562118611Snjl         */
563118611Snjl        CurrentByteOffset += RsLinkDescriptorChain (&PreviousRnode, NextRnode);
564118611Snjl
565118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
566118611Snjl    }
567118611Snjl
568118611Snjl    return (Rnode);
569118611Snjl}
570118611Snjl
571118611Snjl
572118611Snjl/*******************************************************************************
573118611Snjl *
574118611Snjl * FUNCTION:    RsDoVendorSmallDescriptor
575118611Snjl *
576281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
577118611Snjl *
578118611Snjl * RETURN:      Completed resource node
579118611Snjl *
580118611Snjl * DESCRIPTION: Construct a short "VendorShort" descriptor
581118611Snjl *
582118611Snjl ******************************************************************************/
583118611Snjl
584118611SnjlASL_RESOURCE_NODE *
585118611SnjlRsDoVendorSmallDescriptor (
586281075Sdim    ASL_RESOURCE_INFO       *Info)
587118611Snjl{
588151937Sjkim    AML_RESOURCE            *Descriptor;
589118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
590118611Snjl    ASL_RESOURCE_NODE       *Rnode;
591151937Sjkim    UINT8                   *VendorData;
592118611Snjl    UINT32                  i;
593118611Snjl
594118611Snjl
595281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
596118611Snjl
597151937Sjkim    /* Allocate worst case - 7 vendor bytes */
598151937Sjkim
599151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_VENDOR_SMALL) + 7);
600151937Sjkim
601118611Snjl    Descriptor = Rnode->Buffer;
602151937Sjkim    Descriptor->VendorSmall.DescriptorType  = ACPI_RESOURCE_NAME_VENDOR_SMALL;
603151937Sjkim    VendorData = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_SMALL_HEADER);
604118611Snjl
605151937Sjkim    /* Process all child initialization nodes */
606151937Sjkim
607118611Snjl    InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
608151937Sjkim    for (i = 0; InitializerOp; i++)
609118611Snjl    {
610167802Sjkim        if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
611167802Sjkim        {
612167802Sjkim            break;
613167802Sjkim        }
614167802Sjkim
615151937Sjkim        /* Maximum 7 vendor data bytes allowed (0-6) */
616151937Sjkim
617151937Sjkim        if (i >= 7)
618151937Sjkim        {
619151937Sjkim            AslError (ASL_ERROR, ASL_MSG_VENDOR_LIST, InitializerOp, NULL);
620151937Sjkim
621151937Sjkim            /* Eat the excess initializers */
622151937Sjkim
623151937Sjkim            while (InitializerOp)
624151937Sjkim            {
625151937Sjkim                InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
626151937Sjkim            }
627151937Sjkim            break;
628151937Sjkim        }
629151937Sjkim
630151937Sjkim        VendorData[i] = (UINT8) InitializerOp->Asl.Value.Integer;
631118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
632118611Snjl    }
633118611Snjl
634118611Snjl    /* Adjust the Rnode buffer size, so correct number of bytes are emitted */
635118611Snjl
636118611Snjl    Rnode->BufferLength -= (7 - i);
637118611Snjl
638118611Snjl    /* Set the length in the Type Tag */
639118611Snjl
640151937Sjkim    Descriptor->VendorSmall.DescriptorType |= (UINT8) i;
641118611Snjl    return (Rnode);
642118611Snjl}
643