1118611Snjl/******************************************************************************
2118611Snjl *
3207344Sjkim * Module Name: aslrestype1 - Miscellaneous small resource descriptors
4118611Snjl *
5118611Snjl *****************************************************************************/
6118611Snjl
7217365Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, 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    return (Rnode);
90167802Sjkim}
91167802Sjkim
92167802Sjkim
93167802Sjkim/*******************************************************************************
94167802Sjkim *
95118611Snjl * FUNCTION:    RsDoEndDependentDescriptor
96118611Snjl *
97281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
98118611Snjl *
99118611Snjl * RETURN:      Completed resource node
100118611Snjl *
101118611Snjl * DESCRIPTION: Construct a short "EndDependentFn" descriptor
102118611Snjl *
103118611Snjl ******************************************************************************/
104118611Snjl
105118611SnjlASL_RESOURCE_NODE *
106118611SnjlRsDoEndDependentDescriptor (
107281075Sdim    ASL_RESOURCE_INFO       *Info)
108118611Snjl{
109151937Sjkim    AML_RESOURCE            *Descriptor;
110118611Snjl    ASL_RESOURCE_NODE       *Rnode;
111118611Snjl
112118611Snjl
113151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_END_DEPENDENT));
114118611Snjl
115118611Snjl    Descriptor = Rnode->Buffer;
116306536Sjkim    Descriptor->EndDpf.DescriptorType =
117306536Sjkim        ACPI_RESOURCE_NAME_END_DEPENDENT | ASL_RDESC_END_DEPEND_SIZE;
118118611Snjl    return (Rnode);
119118611Snjl}
120118611Snjl
121118611Snjl
122118611Snjl/*******************************************************************************
123118611Snjl *
124118611Snjl * FUNCTION:    RsDoMemory24Descriptor
125118611Snjl *
126281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
127118611Snjl *
128118611Snjl * RETURN:      Completed resource node
129118611Snjl *
130118611Snjl * DESCRIPTION: Construct a short "Memory24" descriptor
131118611Snjl *
132118611Snjl ******************************************************************************/
133118611Snjl
134118611SnjlASL_RESOURCE_NODE *
135118611SnjlRsDoMemory24Descriptor (
136281075Sdim    ASL_RESOURCE_INFO       *Info)
137118611Snjl{
138151937Sjkim    AML_RESOURCE            *Descriptor;
139118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
140207344Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
141207344Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
142207344Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
143118611Snjl    ASL_RESOURCE_NODE       *Rnode;
144281075Sdim    UINT32                  CurrentByteOffset;
145118611Snjl    UINT32                  i;
146118611Snjl
147118611Snjl
148281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
149281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
150151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_MEMORY24));
151118611Snjl
152118611Snjl    Descriptor = Rnode->Buffer;
153306536Sjkim    Descriptor->Memory24.DescriptorType = ACPI_RESOURCE_NAME_MEMORY24;
154151937Sjkim    Descriptor->Memory24.ResourceLength = 9;
155118611Snjl
156151937Sjkim    /* Process all child initialization nodes */
157151937Sjkim
158118611Snjl    for (i = 0; InitializerOp; i++)
159118611Snjl    {
160118611Snjl        switch (i)
161118611Snjl        {
162118611Snjl        case 0: /* Read/Write type */
163118611Snjl
164151937Sjkim            RsSetFlagBits (&Descriptor->Memory24.Flags, InitializerOp, 0, 1);
165167802Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
166151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Flags), 0);
167118611Snjl            break;
168118611Snjl
169118611Snjl        case 1: /* Min Address */
170118611Snjl
171151937Sjkim            Descriptor->Memory24.Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
172228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR,
173151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Minimum));
174207344Sjkim            MinOp = InitializerOp;
175118611Snjl            break;
176118611Snjl
177118611Snjl        case 2: /* Max Address */
178118611Snjl
179151937Sjkim            Descriptor->Memory24.Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
180228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR,
181151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Maximum));
182207344Sjkim            MaxOp = InitializerOp;
183118611Snjl            break;
184118611Snjl
185118611Snjl        case 3: /* Alignment */
186118611Snjl
187151937Sjkim            Descriptor->Memory24.Alignment = (UINT16) InitializerOp->Asl.Value.Integer;
188228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_ALIGNMENT,
189151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Alignment));
190118611Snjl            break;
191118611Snjl
192118611Snjl        case 4: /* Length */
193118611Snjl
194151937Sjkim            Descriptor->Memory24.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;
195228110Sjkim            RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH,
196151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.AddressLength));
197207344Sjkim            LengthOp = InitializerOp;
198118611Snjl            break;
199118611Snjl
200118611Snjl        case 5: /* Name */
201118611Snjl
202281075Sdim            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
203118611Snjl            break;
204118611Snjl
205118611Snjl        default:
206118611Snjl
207118611Snjl            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
208118611Snjl            break;
209118611Snjl        }
210118611Snjl
211118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
212118611Snjl    }
213118611Snjl
214207344Sjkim    /* Validate the Min/Max/Len/Align values (Alignment==0 means 64K) */
215207344Sjkim
216207344Sjkim    RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY24,
217207344Sjkim        Descriptor->Memory24.Minimum,
218207344Sjkim        Descriptor->Memory24.Maximum,
219207344Sjkim        Descriptor->Memory24.AddressLength,
220207344Sjkim        Descriptor->Memory24.Alignment,
221281075Sdim        MinOp, MaxOp, LengthOp, NULL, Info->DescriptorTypeOp);
222207344Sjkim
223118611Snjl    return (Rnode);
224118611Snjl}
225118611Snjl
226118611Snjl
227118611Snjl/*******************************************************************************
228118611Snjl *
229118611Snjl * FUNCTION:    RsDoMemory32Descriptor
230118611Snjl *
231281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
232118611Snjl *
233118611Snjl * RETURN:      Completed resource node
234118611Snjl *
235118611Snjl * DESCRIPTION: Construct a short "Memory32" descriptor
236118611Snjl *
237118611Snjl ******************************************************************************/
238118611Snjl
239118611SnjlASL_RESOURCE_NODE *
240118611SnjlRsDoMemory32Descriptor (
241281075Sdim    ASL_RESOURCE_INFO       *Info)
242118611Snjl{
243151937Sjkim    AML_RESOURCE            *Descriptor;
244118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
245207344Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
246207344Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
247207344Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
248207344Sjkim    ACPI_PARSE_OBJECT       *AlignOp = NULL;
249118611Snjl    ASL_RESOURCE_NODE       *Rnode;
250281075Sdim    UINT32                  CurrentByteOffset;
251118611Snjl    UINT32                  i;
252118611Snjl
253118611Snjl
254281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
255281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
256151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_MEMORY32));
257118611Snjl
258118611Snjl    Descriptor = Rnode->Buffer;
259306536Sjkim    Descriptor->Memory32.DescriptorType = ACPI_RESOURCE_NAME_MEMORY32;
260151937Sjkim    Descriptor->Memory32.ResourceLength = 17;
261118611Snjl
262151937Sjkim    /* Process all child initialization nodes */
263151937Sjkim
264118611Snjl    for (i = 0; InitializerOp; i++)
265118611Snjl    {
266118611Snjl        switch (i)
267118611Snjl        {
268118611Snjl        case 0: /* Read/Write type */
269118611Snjl
270151937Sjkim            RsSetFlagBits (&Descriptor->Memory32.Flags, InitializerOp, 0, 1);
271167802Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
272151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Flags), 0);
273118611Snjl            break;
274118611Snjl
275118611Snjl        case 1:  /* Min Address */
276118611Snjl
277151937Sjkim            Descriptor->Memory32.Minimum = (UINT32) InitializerOp->Asl.Value.Integer;
278228110Sjkim            RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR,
279151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Minimum));
280207344Sjkim            MinOp = InitializerOp;
281118611Snjl            break;
282118611Snjl
283118611Snjl        case 2: /* Max Address */
284118611Snjl
285151937Sjkim            Descriptor->Memory32.Maximum = (UINT32) InitializerOp->Asl.Value.Integer;
286228110Sjkim            RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
287151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Maximum));
288207344Sjkim            MaxOp = InitializerOp;
289118611Snjl            break;
290118611Snjl
291118611Snjl        case 3: /* Alignment */
292118611Snjl
293151937Sjkim            Descriptor->Memory32.Alignment = (UINT32) InitializerOp->Asl.Value.Integer;
294228110Sjkim            RsCreateDwordField (InitializerOp, ACPI_RESTAG_ALIGNMENT,
295151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Alignment));
296207344Sjkim            AlignOp = InitializerOp;
297118611Snjl            break;
298118611Snjl
299118611Snjl        case 4: /* Length */
300118611Snjl
301151937Sjkim            Descriptor->Memory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer;
302228110Sjkim            RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH,
303151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.AddressLength));
304207344Sjkim            LengthOp = InitializerOp;
305118611Snjl            break;
306118611Snjl
307118611Snjl        case 5: /* Name */
308118611Snjl
309281075Sdim            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
310118611Snjl            break;
311118611Snjl
312118611Snjl        default:
313118611Snjl
314118611Snjl            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
315118611Snjl            break;
316118611Snjl        }
317118611Snjl
318118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
319118611Snjl    }
320118611Snjl
321207344Sjkim    /* Validate the Min/Max/Len/Align values */
322207344Sjkim
323207344Sjkim    RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY32,
324207344Sjkim        Descriptor->Memory32.Minimum,
325207344Sjkim        Descriptor->Memory32.Maximum,
326207344Sjkim        Descriptor->Memory32.AddressLength,
327207344Sjkim        Descriptor->Memory32.Alignment,
328281075Sdim        MinOp, MaxOp, LengthOp, AlignOp, Info->DescriptorTypeOp);
329207344Sjkim
330118611Snjl    return (Rnode);
331118611Snjl}
332118611Snjl
333118611Snjl
334118611Snjl/*******************************************************************************
335118611Snjl *
336118611Snjl * FUNCTION:    RsDoMemory32FixedDescriptor
337118611Snjl *
338281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
339118611Snjl *
340118611Snjl * RETURN:      Completed resource node
341118611Snjl *
342118611Snjl * DESCRIPTION: Construct a short "Memory32Fixed" descriptor
343118611Snjl *
344118611Snjl ******************************************************************************/
345118611Snjl
346118611SnjlASL_RESOURCE_NODE *
347118611SnjlRsDoMemory32FixedDescriptor (
348281075Sdim    ASL_RESOURCE_INFO       *Info)
349118611Snjl{
350151937Sjkim    AML_RESOURCE            *Descriptor;
351118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
352118611Snjl    ASL_RESOURCE_NODE       *Rnode;
353281075Sdim    UINT32                  CurrentByteOffset;
354118611Snjl    UINT32                  i;
355118611Snjl
356118611Snjl
357281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
358281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
359151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_FIXED_MEMORY32));
360118611Snjl
361118611Snjl    Descriptor = Rnode->Buffer;
362306536Sjkim    Descriptor->FixedMemory32.DescriptorType = ACPI_RESOURCE_NAME_FIXED_MEMORY32;
363151937Sjkim    Descriptor->FixedMemory32.ResourceLength = 9;
364118611Snjl
365151937Sjkim    /* Process all child initialization nodes */
366151937Sjkim
367118611Snjl    for (i = 0; InitializerOp; i++)
368118611Snjl    {
369118611Snjl        switch (i)
370118611Snjl        {
371118611Snjl        case 0: /* Read/Write type */
372118611Snjl
373151937Sjkim            RsSetFlagBits (&Descriptor->FixedMemory32.Flags, InitializerOp, 0, 1);
374167802Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
375151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Flags), 0);
376118611Snjl            break;
377118611Snjl
378118611Snjl        case 1: /* Address */
379118611Snjl
380151937Sjkim            Descriptor->FixedMemory32.Address = (UINT32) InitializerOp->Asl.Value.Integer;
381228110Sjkim            RsCreateDwordField (InitializerOp, ACPI_RESTAG_BASEADDRESS,
382151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Address));
383118611Snjl            break;
384118611Snjl
385118611Snjl        case 2: /* Length */
386118611Snjl
387151937Sjkim            Descriptor->FixedMemory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer;
388228110Sjkim            RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH,
389151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.AddressLength));
390118611Snjl            break;
391118611Snjl
392118611Snjl        case 3: /* Name */
393118611Snjl
394281075Sdim            UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp);
395118611Snjl            break;
396118611Snjl
397118611Snjl        default:
398118611Snjl
399118611Snjl            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
400118611Snjl            break;
401118611Snjl        }
402118611Snjl
403118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
404118611Snjl    }
405118611Snjl
406118611Snjl    return (Rnode);
407118611Snjl}
408118611Snjl
409118611Snjl
410118611Snjl/*******************************************************************************
411118611Snjl *
412118611Snjl * FUNCTION:    RsDoStartDependentDescriptor
413118611Snjl *
414281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
415118611Snjl *
416118611Snjl * RETURN:      Completed resource node
417118611Snjl *
418118611Snjl * DESCRIPTION: Construct a short "StartDependentFn" descriptor
419118611Snjl *
420118611Snjl ******************************************************************************/
421118611Snjl
422118611SnjlASL_RESOURCE_NODE *
423118611SnjlRsDoStartDependentDescriptor (
424281075Sdim    ASL_RESOURCE_INFO       *Info)
425118611Snjl{
426151937Sjkim    AML_RESOURCE            *Descriptor;
427118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
428118611Snjl    ASL_RESOURCE_NODE       *Rnode;
429118611Snjl    ASL_RESOURCE_NODE       *PreviousRnode;
430118611Snjl    ASL_RESOURCE_NODE       *NextRnode;
431281075Sdim    ASL_RESOURCE_INFO       NextInfo;
432281075Sdim    UINT32                  CurrentByteOffset;
433118611Snjl    UINT32                  i;
434118611Snjl    UINT8                   State;
435118611Snjl
436118611Snjl
437281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
438281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
439151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_START_DEPENDENT));
440118611Snjl
441118611Snjl    PreviousRnode = Rnode;
442118611Snjl    Descriptor = Rnode->Buffer;
443118611Snjl
444234623Sjkim    /* Increment offset past StartDependent descriptor */
445234623Sjkim
446234623Sjkim    CurrentByteOffset += sizeof (AML_RESOURCE_START_DEPENDENT);
447234623Sjkim
448118611Snjl    /* Descriptor has priority byte */
449118611Snjl
450306536Sjkim    Descriptor->StartDpf.DescriptorType =
451306536Sjkim        ACPI_RESOURCE_NAME_START_DEPENDENT | (ASL_RDESC_ST_DEPEND_SIZE + 0x01);
452118611Snjl
453151937Sjkim    /* Process all child initialization nodes */
454151937Sjkim
455118611Snjl    State = ACPI_RSTATE_START_DEPENDENT;
456118611Snjl    for (i = 0; InitializerOp; i++)
457118611Snjl    {
458118611Snjl        switch (i)
459118611Snjl        {
460118611Snjl        case 0: /* Compatibility Priority */
461118611Snjl
462118611Snjl            if ((UINT8) InitializerOp->Asl.Value.Integer > 2)
463118611Snjl            {
464151937Sjkim                AslError (ASL_ERROR, ASL_MSG_INVALID_PRIORITY,
465151937Sjkim                    InitializerOp, NULL);
466118611Snjl            }
467118611Snjl
468151937Sjkim            RsSetFlagBits (&Descriptor->StartDpf.Flags, InitializerOp, 0, 0);
469118611Snjl            break;
470118611Snjl
471118611Snjl        case 1: /* Performance/Robustness Priority */
472118611Snjl
473118611Snjl            if ((UINT8) InitializerOp->Asl.Value.Integer > 2)
474118611Snjl            {
475151937Sjkim                AslError (ASL_ERROR, ASL_MSG_INVALID_PERFORMANCE,
476151937Sjkim                    InitializerOp, NULL);
477118611Snjl            }
478118611Snjl
479151937Sjkim            RsSetFlagBits (&Descriptor->StartDpf.Flags, InitializerOp, 2, 0);
480118611Snjl            break;
481118611Snjl
482118611Snjl        default:
483207344Sjkim
484281075Sdim            NextInfo.CurrentByteOffset = CurrentByteOffset;
485281075Sdim            NextInfo.DescriptorTypeOp = InitializerOp;
486118611Snjl
487281075Sdim            NextRnode = RsDoOneResourceDescriptor (&NextInfo, &State);
488281075Sdim
489118611Snjl            /*
490118611Snjl             * Update current byte offset to indicate the number of bytes from the
491241973Sjkim             * start of the buffer. Buffer can include multiple descriptors, we
492118611Snjl             * must keep track of the offset of not only each descriptor, but each
493118611Snjl             * element (field) within each descriptor as well.
494118611Snjl             */
495306536Sjkim            CurrentByteOffset += RsLinkDescriptorChain (
496306536Sjkim                &PreviousRnode, NextRnode);
497118611Snjl            break;
498118611Snjl        }
499118611Snjl
500118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
501118611Snjl    }
502118611Snjl
503118611Snjl    return (Rnode);
504118611Snjl}
505118611Snjl
506118611Snjl
507118611Snjl/*******************************************************************************
508118611Snjl *
509118611Snjl * FUNCTION:    RsDoStartDependentNoPriDescriptor
510118611Snjl *
511281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
512118611Snjl *
513118611Snjl * RETURN:      Completed resource node
514118611Snjl *
515118611Snjl * DESCRIPTION: Construct a short "StartDependentNoPri" descriptor
516118611Snjl *
517118611Snjl ******************************************************************************/
518118611Snjl
519118611SnjlASL_RESOURCE_NODE *
520118611SnjlRsDoStartDependentNoPriDescriptor (
521281075Sdim    ASL_RESOURCE_INFO       *Info)
522118611Snjl{
523151937Sjkim    AML_RESOURCE            *Descriptor;
524118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
525118611Snjl    ASL_RESOURCE_NODE       *Rnode;
526118611Snjl    ASL_RESOURCE_NODE       *PreviousRnode;
527118611Snjl    ASL_RESOURCE_NODE       *NextRnode;
528281075Sdim    ASL_RESOURCE_INFO       NextInfo;
529281075Sdim    UINT32                  CurrentByteOffset;
530118611Snjl    UINT8                   State;
531118611Snjl
532118611Snjl
533281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
534281075Sdim    CurrentByteOffset = Info->CurrentByteOffset;
535151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO));
536118611Snjl
537118611Snjl    Descriptor = Rnode->Buffer;
538306536Sjkim    Descriptor->StartDpf.DescriptorType =
539306536Sjkim        ACPI_RESOURCE_NAME_START_DEPENDENT | ASL_RDESC_ST_DEPEND_SIZE;
540118611Snjl    PreviousRnode = Rnode;
541118611Snjl
542234623Sjkim    /* Increment offset past StartDependentNoPri descriptor */
543234623Sjkim
544234623Sjkim    CurrentByteOffset += sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO);
545234623Sjkim
546151937Sjkim    /* Process all child initialization nodes */
547151937Sjkim
548118611Snjl    State = ACPI_RSTATE_START_DEPENDENT;
549118611Snjl    while (InitializerOp)
550118611Snjl    {
551281075Sdim        NextInfo.CurrentByteOffset = CurrentByteOffset;
552281075Sdim        NextInfo.DescriptorTypeOp = InitializerOp;
553118611Snjl
554281075Sdim        NextRnode = RsDoOneResourceDescriptor (&NextInfo, &State);
555281075Sdim
556118611Snjl        /*
557118611Snjl         * Update current byte offset to indicate the number of bytes from the
558241973Sjkim         * start of the buffer. Buffer can include multiple descriptors, we
559118611Snjl         * must keep track of the offset of not only each descriptor, but each
560118611Snjl         * element (field) within each descriptor as well.
561118611Snjl         */
562118611Snjl        CurrentByteOffset += RsLinkDescriptorChain (&PreviousRnode, NextRnode);
563118611Snjl
564118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
565118611Snjl    }
566118611Snjl
567118611Snjl    return (Rnode);
568118611Snjl}
569118611Snjl
570118611Snjl
571118611Snjl/*******************************************************************************
572118611Snjl *
573118611Snjl * FUNCTION:    RsDoVendorSmallDescriptor
574118611Snjl *
575281075Sdim * PARAMETERS:  Info                - Parse Op and resource template offset
576118611Snjl *
577118611Snjl * RETURN:      Completed resource node
578118611Snjl *
579118611Snjl * DESCRIPTION: Construct a short "VendorShort" descriptor
580118611Snjl *
581118611Snjl ******************************************************************************/
582118611Snjl
583118611SnjlASL_RESOURCE_NODE *
584118611SnjlRsDoVendorSmallDescriptor (
585281075Sdim    ASL_RESOURCE_INFO       *Info)
586118611Snjl{
587151937Sjkim    AML_RESOURCE            *Descriptor;
588118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
589118611Snjl    ASL_RESOURCE_NODE       *Rnode;
590151937Sjkim    UINT8                   *VendorData;
591118611Snjl    UINT32                  i;
592118611Snjl
593118611Snjl
594281075Sdim    InitializerOp = Info->DescriptorTypeOp->Asl.Child;
595118611Snjl
596151937Sjkim    /* Allocate worst case - 7 vendor bytes */
597151937Sjkim
598151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_VENDOR_SMALL) + 7);
599151937Sjkim
600118611Snjl    Descriptor = Rnode->Buffer;
601306536Sjkim    Descriptor->VendorSmall.DescriptorType = ACPI_RESOURCE_NAME_VENDOR_SMALL;
602151937Sjkim    VendorData = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_SMALL_HEADER);
603118611Snjl
604151937Sjkim    /* Process all child initialization nodes */
605151937Sjkim
606118611Snjl    InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
607151937Sjkim    for (i = 0; InitializerOp; i++)
608118611Snjl    {
609167802Sjkim        if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
610167802Sjkim        {
611167802Sjkim            break;
612167802Sjkim        }
613167802Sjkim
614151937Sjkim        /* Maximum 7 vendor data bytes allowed (0-6) */
615151937Sjkim
616151937Sjkim        if (i >= 7)
617151937Sjkim        {
618151937Sjkim            AslError (ASL_ERROR, ASL_MSG_VENDOR_LIST, InitializerOp, NULL);
619151937Sjkim
620151937Sjkim            /* Eat the excess initializers */
621151937Sjkim
622151937Sjkim            while (InitializerOp)
623151937Sjkim            {
624151937Sjkim                InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
625151937Sjkim            }
626151937Sjkim            break;
627151937Sjkim        }
628151937Sjkim
629151937Sjkim        VendorData[i] = (UINT8) InitializerOp->Asl.Value.Integer;
630118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
631118611Snjl    }
632118611Snjl
633118611Snjl    /* Adjust the Rnode buffer size, so correct number of bytes are emitted */
634118611Snjl
635118611Snjl    Rnode->BufferLength -= (7 - i);
636118611Snjl
637118611Snjl    /* Set the length in the Type Tag */
638118611Snjl
639151937Sjkim    Descriptor->VendorSmall.DescriptorType |= (UINT8) i;
640118611Snjl    return (Rnode);
641118611Snjl}
642