aslrestype1.c revision 217365
1118611Snjl
2118611Snjl/******************************************************************************
3118611Snjl *
4207344Sjkim * Module Name: aslrestype1 - Miscellaneous small resource descriptors
5118611Snjl *
6118611Snjl *****************************************************************************/
7118611Snjl
8217365Sjkim/*
9217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp.
10118611Snjl * All rights reserved.
11118611Snjl *
12217365Sjkim * Redistribution and use in source and binary forms, with or without
13217365Sjkim * modification, are permitted provided that the following conditions
14217365Sjkim * are met:
15217365Sjkim * 1. Redistributions of source code must retain the above copyright
16217365Sjkim *    notice, this list of conditions, and the following disclaimer,
17217365Sjkim *    without modification.
18217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
20217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
21217365Sjkim *    including a substantially similar Disclaimer requirement for further
22217365Sjkim *    binary redistribution.
23217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
24217365Sjkim *    of any contributors may be used to endorse or promote products derived
25217365Sjkim *    from this software without specific prior written permission.
26118611Snjl *
27217365Sjkim * Alternatively, this software may be distributed under the terms of the
28217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
29217365Sjkim * Software Foundation.
30118611Snjl *
31217365Sjkim * NO WARRANTY
32217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
43217365Sjkim */
44118611Snjl
45118611Snjl
46151937Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
47118611Snjl#include "aslcompiler.y.h"
48118611Snjl
49118611Snjl#define _COMPONENT          ACPI_COMPILER
50118611Snjl        ACPI_MODULE_NAME    ("aslrestype1")
51118611Snjl
52207344Sjkim/*
53207344Sjkim * This module contains miscellaneous small resource descriptors:
54207344Sjkim *
55207344Sjkim * EndTag
56207344Sjkim * EndDependentFn
57207344Sjkim * Memory24
58207344Sjkim * Memory32
59207344Sjkim * Memory32Fixed
60207344Sjkim * StartDependentFn
61207344Sjkim * StartDependentFnNoPri
62207344Sjkim * VendorShort
63207344Sjkim */
64118611Snjl
65118611Snjl/*******************************************************************************
66118611Snjl *
67167802Sjkim * FUNCTION:    RsDoEndTagDescriptor
68167802Sjkim *
69167802Sjkim * PARAMETERS:  Op                  - Parent resource descriptor parse node
70167802Sjkim *              CurrentByteOffset   - Offset into the resource template AML
71167802Sjkim *                                    buffer (to track references to the desc)
72167802Sjkim *
73167802Sjkim * RETURN:      Completed resource node
74167802Sjkim *
75167802Sjkim * DESCRIPTION: Construct a short "EndDependentFn" descriptor
76167802Sjkim *
77167802Sjkim ******************************************************************************/
78167802Sjkim
79167802SjkimASL_RESOURCE_NODE *
80167802SjkimRsDoEndTagDescriptor (
81167802Sjkim    ACPI_PARSE_OBJECT       *Op,
82167802Sjkim    UINT32                  CurrentByteOffset)
83167802Sjkim{
84167802Sjkim    AML_RESOURCE            *Descriptor;
85167802Sjkim    ASL_RESOURCE_NODE       *Rnode;
86167802Sjkim
87167802Sjkim
88167802Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_END_TAG));
89167802Sjkim
90167802Sjkim    Descriptor = Rnode->Buffer;
91167802Sjkim    Descriptor->EndTag.DescriptorType = ACPI_RESOURCE_NAME_END_TAG |
92167802Sjkim                                        ASL_RDESC_END_TAG_SIZE;
93167802Sjkim    Descriptor->EndTag.Checksum = 0;
94167802Sjkim
95167802Sjkim    return (Rnode);
96167802Sjkim}
97167802Sjkim
98167802Sjkim
99167802Sjkim/*******************************************************************************
100167802Sjkim *
101118611Snjl * FUNCTION:    RsDoEndDependentDescriptor
102118611Snjl *
103118611Snjl * PARAMETERS:  Op                  - Parent resource descriptor parse node
104118611Snjl *              CurrentByteOffset   - Offset into the resource template AML
105118611Snjl *                                    buffer (to track references to the desc)
106118611Snjl *
107118611Snjl * RETURN:      Completed resource node
108118611Snjl *
109118611Snjl * DESCRIPTION: Construct a short "EndDependentFn" descriptor
110118611Snjl *
111118611Snjl ******************************************************************************/
112118611Snjl
113118611SnjlASL_RESOURCE_NODE *
114118611SnjlRsDoEndDependentDescriptor (
115118611Snjl    ACPI_PARSE_OBJECT       *Op,
116118611Snjl    UINT32                  CurrentByteOffset)
117118611Snjl{
118151937Sjkim    AML_RESOURCE            *Descriptor;
119118611Snjl    ASL_RESOURCE_NODE       *Rnode;
120118611Snjl
121118611Snjl
122151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_END_DEPENDENT));
123118611Snjl
124118611Snjl    Descriptor = Rnode->Buffer;
125151937Sjkim    Descriptor->EndDpf.DescriptorType  = ACPI_RESOURCE_NAME_END_DEPENDENT |
126151937Sjkim                                      ASL_RDESC_END_DEPEND_SIZE;
127118611Snjl    return (Rnode);
128118611Snjl}
129118611Snjl
130118611Snjl
131118611Snjl/*******************************************************************************
132118611Snjl *
133118611Snjl * FUNCTION:    RsDoMemory24Descriptor
134118611Snjl *
135118611Snjl * PARAMETERS:  Op                  - Parent resource descriptor parse node
136118611Snjl *              CurrentByteOffset   - Offset into the resource template AML
137118611Snjl *                                    buffer (to track references to the desc)
138118611Snjl *
139118611Snjl * RETURN:      Completed resource node
140118611Snjl *
141118611Snjl * DESCRIPTION: Construct a short "Memory24" descriptor
142118611Snjl *
143118611Snjl ******************************************************************************/
144118611Snjl
145118611SnjlASL_RESOURCE_NODE *
146118611SnjlRsDoMemory24Descriptor (
147118611Snjl    ACPI_PARSE_OBJECT       *Op,
148118611Snjl    UINT32                  CurrentByteOffset)
149118611Snjl{
150151937Sjkim    AML_RESOURCE            *Descriptor;
151118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
152207344Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
153207344Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
154207344Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
155118611Snjl    ASL_RESOURCE_NODE       *Rnode;
156118611Snjl    UINT32                  i;
157118611Snjl
158118611Snjl
159118611Snjl    InitializerOp = Op->Asl.Child;
160151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_MEMORY24));
161118611Snjl
162118611Snjl    Descriptor = Rnode->Buffer;
163151937Sjkim    Descriptor->Memory24.DescriptorType  = ACPI_RESOURCE_NAME_MEMORY24;
164151937Sjkim    Descriptor->Memory24.ResourceLength = 9;
165118611Snjl
166151937Sjkim    /* Process all child initialization nodes */
167151937Sjkim
168118611Snjl    for (i = 0; InitializerOp; i++)
169118611Snjl    {
170118611Snjl        switch (i)
171118611Snjl        {
172118611Snjl        case 0: /* Read/Write type */
173118611Snjl
174151937Sjkim            RsSetFlagBits (&Descriptor->Memory24.Flags, InitializerOp, 0, 1);
175167802Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
176151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Flags), 0);
177118611Snjl            break;
178118611Snjl
179118611Snjl        case 1: /* Min Address */
180118611Snjl
181151937Sjkim            Descriptor->Memory24.Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
182167802Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
183151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Minimum));
184207344Sjkim            MinOp = InitializerOp;
185118611Snjl            break;
186118611Snjl
187118611Snjl        case 2: /* Max Address */
188118611Snjl
189151937Sjkim            Descriptor->Memory24.Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
190167802Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
191151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Maximum));
192207344Sjkim            MaxOp = InitializerOp;
193118611Snjl            break;
194118611Snjl
195118611Snjl        case 3: /* Alignment */
196118611Snjl
197151937Sjkim            Descriptor->Memory24.Alignment = (UINT16) InitializerOp->Asl.Value.Integer;
198167802Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_ALIGNMENT,
199151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Alignment));
200118611Snjl            break;
201118611Snjl
202118611Snjl        case 4: /* Length */
203118611Snjl
204151937Sjkim            Descriptor->Memory24.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;
205167802Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
206151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.AddressLength));
207207344Sjkim            LengthOp = InitializerOp;
208118611Snjl            break;
209118611Snjl
210118611Snjl        case 5: /* Name */
211118611Snjl
212118611Snjl            UtAttachNamepathToOwner (Op, InitializerOp);
213118611Snjl            break;
214118611Snjl
215118611Snjl        default:
216118611Snjl
217118611Snjl            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
218118611Snjl            break;
219118611Snjl        }
220118611Snjl
221118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
222118611Snjl    }
223118611Snjl
224207344Sjkim    /* Validate the Min/Max/Len/Align values (Alignment==0 means 64K) */
225207344Sjkim
226207344Sjkim    RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY24,
227207344Sjkim        Descriptor->Memory24.Minimum,
228207344Sjkim        Descriptor->Memory24.Maximum,
229207344Sjkim        Descriptor->Memory24.AddressLength,
230207344Sjkim        Descriptor->Memory24.Alignment,
231213806Sjkim        MinOp, MaxOp, LengthOp, NULL, Op);
232207344Sjkim
233118611Snjl    return (Rnode);
234118611Snjl}
235118611Snjl
236118611Snjl
237118611Snjl/*******************************************************************************
238118611Snjl *
239118611Snjl * FUNCTION:    RsDoMemory32Descriptor
240118611Snjl *
241118611Snjl * PARAMETERS:  Op                  - Parent resource descriptor parse node
242118611Snjl *              CurrentByteOffset   - Offset into the resource template AML
243118611Snjl *                                    buffer (to track references to the desc)
244118611Snjl *
245118611Snjl * RETURN:      Completed resource node
246118611Snjl *
247118611Snjl * DESCRIPTION: Construct a short "Memory32" descriptor
248118611Snjl *
249118611Snjl ******************************************************************************/
250118611Snjl
251118611SnjlASL_RESOURCE_NODE *
252118611SnjlRsDoMemory32Descriptor (
253118611Snjl    ACPI_PARSE_OBJECT       *Op,
254118611Snjl    UINT32                  CurrentByteOffset)
255118611Snjl{
256151937Sjkim    AML_RESOURCE            *Descriptor;
257118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
258207344Sjkim    ACPI_PARSE_OBJECT       *MinOp = NULL;
259207344Sjkim    ACPI_PARSE_OBJECT       *MaxOp = NULL;
260207344Sjkim    ACPI_PARSE_OBJECT       *LengthOp = NULL;
261207344Sjkim    ACPI_PARSE_OBJECT       *AlignOp = NULL;
262118611Snjl    ASL_RESOURCE_NODE       *Rnode;
263118611Snjl    UINT32                  i;
264118611Snjl
265118611Snjl
266118611Snjl    InitializerOp = Op->Asl.Child;
267151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_MEMORY32));
268118611Snjl
269118611Snjl    Descriptor = Rnode->Buffer;
270151937Sjkim    Descriptor->Memory32.DescriptorType  = ACPI_RESOURCE_NAME_MEMORY32;
271151937Sjkim    Descriptor->Memory32.ResourceLength = 17;
272118611Snjl
273151937Sjkim    /* Process all child initialization nodes */
274151937Sjkim
275118611Snjl    for (i = 0; InitializerOp; i++)
276118611Snjl    {
277118611Snjl        switch (i)
278118611Snjl        {
279118611Snjl        case 0: /* Read/Write type */
280118611Snjl
281151937Sjkim            RsSetFlagBits (&Descriptor->Memory32.Flags, InitializerOp, 0, 1);
282167802Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
283151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Flags), 0);
284118611Snjl            break;
285118611Snjl
286118611Snjl        case 1:  /* Min Address */
287118611Snjl
288151937Sjkim            Descriptor->Memory32.Minimum = (UINT32) InitializerOp->Asl.Value.Integer;
289167802Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
290151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Minimum));
291207344Sjkim            MinOp = InitializerOp;
292118611Snjl            break;
293118611Snjl
294118611Snjl        case 2: /* Max Address */
295118611Snjl
296151937Sjkim            Descriptor->Memory32.Maximum = (UINT32) InitializerOp->Asl.Value.Integer;
297167802Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
298151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Maximum));
299207344Sjkim            MaxOp = InitializerOp;
300118611Snjl            break;
301118611Snjl
302118611Snjl        case 3: /* Alignment */
303118611Snjl
304151937Sjkim            Descriptor->Memory32.Alignment = (UINT32) InitializerOp->Asl.Value.Integer;
305167802Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_ALIGNMENT,
306151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Alignment));
307207344Sjkim            AlignOp = InitializerOp;
308118611Snjl            break;
309118611Snjl
310118611Snjl        case 4: /* Length */
311118611Snjl
312151937Sjkim            Descriptor->Memory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer;
313167802Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
314151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.AddressLength));
315207344Sjkim            LengthOp = InitializerOp;
316118611Snjl            break;
317118611Snjl
318118611Snjl        case 5: /* Name */
319118611Snjl
320118611Snjl            UtAttachNamepathToOwner (Op, InitializerOp);
321118611Snjl            break;
322118611Snjl
323118611Snjl        default:
324118611Snjl
325118611Snjl            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
326118611Snjl            break;
327118611Snjl        }
328118611Snjl
329118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
330118611Snjl    }
331118611Snjl
332207344Sjkim    /* Validate the Min/Max/Len/Align values */
333207344Sjkim
334207344Sjkim    RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY32,
335207344Sjkim        Descriptor->Memory32.Minimum,
336207344Sjkim        Descriptor->Memory32.Maximum,
337207344Sjkim        Descriptor->Memory32.AddressLength,
338207344Sjkim        Descriptor->Memory32.Alignment,
339213806Sjkim        MinOp, MaxOp, LengthOp, AlignOp, Op);
340207344Sjkim
341118611Snjl    return (Rnode);
342118611Snjl}
343118611Snjl
344118611Snjl
345118611Snjl/*******************************************************************************
346118611Snjl *
347118611Snjl * FUNCTION:    RsDoMemory32FixedDescriptor
348118611Snjl *
349118611Snjl * PARAMETERS:  Op                  - Parent resource descriptor parse node
350118611Snjl *              CurrentByteOffset   - Offset into the resource template AML
351118611Snjl *                                    buffer (to track references to the desc)
352118611Snjl *
353118611Snjl * RETURN:      Completed resource node
354118611Snjl *
355118611Snjl * DESCRIPTION: Construct a short "Memory32Fixed" descriptor
356118611Snjl *
357118611Snjl ******************************************************************************/
358118611Snjl
359118611SnjlASL_RESOURCE_NODE *
360118611SnjlRsDoMemory32FixedDescriptor (
361118611Snjl    ACPI_PARSE_OBJECT       *Op,
362118611Snjl    UINT32                  CurrentByteOffset)
363118611Snjl{
364151937Sjkim    AML_RESOURCE            *Descriptor;
365118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
366118611Snjl    ASL_RESOURCE_NODE       *Rnode;
367118611Snjl    UINT32                  i;
368118611Snjl
369118611Snjl
370118611Snjl    InitializerOp = Op->Asl.Child;
371151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_FIXED_MEMORY32));
372118611Snjl
373118611Snjl    Descriptor = Rnode->Buffer;
374151937Sjkim    Descriptor->FixedMemory32.DescriptorType  = ACPI_RESOURCE_NAME_FIXED_MEMORY32;
375151937Sjkim    Descriptor->FixedMemory32.ResourceLength = 9;
376118611Snjl
377151937Sjkim    /* Process all child initialization nodes */
378151937Sjkim
379118611Snjl    for (i = 0; InitializerOp; i++)
380118611Snjl    {
381118611Snjl        switch (i)
382118611Snjl        {
383118611Snjl        case 0: /* Read/Write type */
384118611Snjl
385151937Sjkim            RsSetFlagBits (&Descriptor->FixedMemory32.Flags, InitializerOp, 0, 1);
386167802Sjkim            RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
387151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Flags), 0);
388118611Snjl            break;
389118611Snjl
390118611Snjl        case 1: /* Address */
391118611Snjl
392151937Sjkim            Descriptor->FixedMemory32.Address = (UINT32) InitializerOp->Asl.Value.Integer;
393167802Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_BASEADDRESS,
394151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Address));
395118611Snjl            break;
396118611Snjl
397118611Snjl        case 2: /* Length */
398118611Snjl
399151937Sjkim            Descriptor->FixedMemory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer;
400167802Sjkim            RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
401151937Sjkim                CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.AddressLength));
402118611Snjl            break;
403118611Snjl
404118611Snjl        case 3: /* Name */
405118611Snjl
406118611Snjl            UtAttachNamepathToOwner (Op, InitializerOp);
407118611Snjl            break;
408118611Snjl
409118611Snjl        default:
410118611Snjl
411118611Snjl            AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
412118611Snjl            break;
413118611Snjl        }
414118611Snjl
415118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
416118611Snjl    }
417118611Snjl
418118611Snjl    return (Rnode);
419118611Snjl}
420118611Snjl
421118611Snjl
422118611Snjl/*******************************************************************************
423118611Snjl *
424118611Snjl * FUNCTION:    RsDoStartDependentDescriptor
425118611Snjl *
426118611Snjl * PARAMETERS:  Op                  - Parent resource descriptor parse node
427118611Snjl *              CurrentByteOffset   - Offset into the resource template AML
428118611Snjl *                                    buffer (to track references to the desc)
429118611Snjl *
430118611Snjl * RETURN:      Completed resource node
431118611Snjl *
432118611Snjl * DESCRIPTION: Construct a short "StartDependentFn" descriptor
433118611Snjl *
434118611Snjl ******************************************************************************/
435118611Snjl
436118611SnjlASL_RESOURCE_NODE *
437118611SnjlRsDoStartDependentDescriptor (
438118611Snjl    ACPI_PARSE_OBJECT       *Op,
439118611Snjl    UINT32                  CurrentByteOffset)
440118611Snjl{
441151937Sjkim    AML_RESOURCE            *Descriptor;
442118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
443118611Snjl    ASL_RESOURCE_NODE       *Rnode;
444118611Snjl    ASL_RESOURCE_NODE       *PreviousRnode;
445118611Snjl    ASL_RESOURCE_NODE       *NextRnode;
446118611Snjl    UINT32                  i;
447118611Snjl    UINT8                   State;
448118611Snjl
449118611Snjl
450118611Snjl    InitializerOp = Op->Asl.Child;
451151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_START_DEPENDENT));
452118611Snjl
453118611Snjl    PreviousRnode = Rnode;
454118611Snjl    Descriptor = Rnode->Buffer;
455118611Snjl
456118611Snjl    /* Descriptor has priority byte */
457118611Snjl
458151937Sjkim    Descriptor->StartDpf.DescriptorType  = ACPI_RESOURCE_NAME_START_DEPENDENT |
459151937Sjkim                                      (ASL_RDESC_ST_DEPEND_SIZE + 0x01);
460118611Snjl
461151937Sjkim    /* Process all child initialization nodes */
462151937Sjkim
463118611Snjl    State = ACPI_RSTATE_START_DEPENDENT;
464118611Snjl    for (i = 0; InitializerOp; i++)
465118611Snjl    {
466118611Snjl        switch (i)
467118611Snjl        {
468118611Snjl        case 0: /* Compatibility Priority */
469118611Snjl
470118611Snjl            if ((UINT8) InitializerOp->Asl.Value.Integer > 2)
471118611Snjl            {
472151937Sjkim                AslError (ASL_ERROR, ASL_MSG_INVALID_PRIORITY,
473151937Sjkim                    InitializerOp, NULL);
474118611Snjl            }
475118611Snjl
476151937Sjkim            RsSetFlagBits (&Descriptor->StartDpf.Flags, InitializerOp, 0, 0);
477118611Snjl            break;
478118611Snjl
479118611Snjl        case 1: /* Performance/Robustness Priority */
480118611Snjl
481118611Snjl            if ((UINT8) InitializerOp->Asl.Value.Integer > 2)
482118611Snjl            {
483151937Sjkim                AslError (ASL_ERROR, ASL_MSG_INVALID_PERFORMANCE,
484151937Sjkim                    InitializerOp, NULL);
485118611Snjl            }
486118611Snjl
487151937Sjkim            RsSetFlagBits (&Descriptor->StartDpf.Flags, InitializerOp, 2, 0);
488118611Snjl            break;
489118611Snjl
490118611Snjl        default:
491207344Sjkim
492151937Sjkim            NextRnode = RsDoOneResourceDescriptor  (InitializerOp,
493151937Sjkim                        CurrentByteOffset, &State);
494118611Snjl
495118611Snjl            /*
496118611Snjl             * Update current byte offset to indicate the number of bytes from the
497118611Snjl             * start of the buffer.  Buffer can include multiple descriptors, we
498118611Snjl             * must keep track of the offset of not only each descriptor, but each
499118611Snjl             * element (field) within each descriptor as well.
500118611Snjl             */
501151937Sjkim            CurrentByteOffset += RsLinkDescriptorChain (&PreviousRnode,
502151937Sjkim                                    NextRnode);
503118611Snjl            break;
504118611Snjl        }
505118611Snjl
506118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
507118611Snjl    }
508118611Snjl
509118611Snjl    return (Rnode);
510118611Snjl}
511118611Snjl
512118611Snjl
513118611Snjl/*******************************************************************************
514118611Snjl *
515118611Snjl * FUNCTION:    RsDoStartDependentNoPriDescriptor
516118611Snjl *
517118611Snjl * PARAMETERS:  Op                  - Parent resource descriptor parse node
518118611Snjl *              CurrentByteOffset   - Offset into the resource template AML
519118611Snjl *                                    buffer (to track references to the desc)
520118611Snjl *
521118611Snjl * RETURN:      Completed resource node
522118611Snjl *
523118611Snjl * DESCRIPTION: Construct a short "StartDependentNoPri" descriptor
524118611Snjl *
525118611Snjl ******************************************************************************/
526118611Snjl
527118611SnjlASL_RESOURCE_NODE *
528118611SnjlRsDoStartDependentNoPriDescriptor (
529118611Snjl    ACPI_PARSE_OBJECT       *Op,
530118611Snjl    UINT32                  CurrentByteOffset)
531118611Snjl{
532151937Sjkim    AML_RESOURCE            *Descriptor;
533118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
534118611Snjl    ASL_RESOURCE_NODE       *Rnode;
535118611Snjl    ASL_RESOURCE_NODE       *PreviousRnode;
536118611Snjl    ASL_RESOURCE_NODE       *NextRnode;
537118611Snjl    UINT8                   State;
538118611Snjl
539118611Snjl
540118611Snjl    InitializerOp = Op->Asl.Child;
541151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO));
542118611Snjl
543118611Snjl    Descriptor = Rnode->Buffer;
544151937Sjkim    Descriptor->StartDpf.DescriptorType  = ACPI_RESOURCE_NAME_START_DEPENDENT |
545151937Sjkim                                      ASL_RDESC_ST_DEPEND_SIZE;
546118611Snjl    PreviousRnode = Rnode;
547118611Snjl
548151937Sjkim    /* Process all child initialization nodes */
549151937Sjkim
550118611Snjl    State = ACPI_RSTATE_START_DEPENDENT;
551118611Snjl    while (InitializerOp)
552118611Snjl    {
553151937Sjkim        NextRnode = RsDoOneResourceDescriptor  (InitializerOp,
554151937Sjkim                        CurrentByteOffset, &State);
555118611Snjl
556118611Snjl        /*
557118611Snjl         * Update current byte offset to indicate the number of bytes from the
558118611Snjl         * 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 *
575118611Snjl * PARAMETERS:  Op                  - Parent resource descriptor parse node
576118611Snjl *              CurrentByteOffset   - Offset into the resource template AML
577118611Snjl *                                    buffer (to track references to the desc)
578118611Snjl *
579118611Snjl * RETURN:      Completed resource node
580118611Snjl *
581118611Snjl * DESCRIPTION: Construct a short "VendorShort" descriptor
582118611Snjl *
583118611Snjl ******************************************************************************/
584118611Snjl
585118611SnjlASL_RESOURCE_NODE *
586118611SnjlRsDoVendorSmallDescriptor (
587118611Snjl    ACPI_PARSE_OBJECT       *Op,
588118611Snjl    UINT32                  CurrentByteOffset)
589118611Snjl{
590151937Sjkim    AML_RESOURCE            *Descriptor;
591118611Snjl    ACPI_PARSE_OBJECT       *InitializerOp;
592118611Snjl    ASL_RESOURCE_NODE       *Rnode;
593151937Sjkim    UINT8                   *VendorData;
594118611Snjl    UINT32                  i;
595118611Snjl
596118611Snjl
597118611Snjl    InitializerOp = Op->Asl.Child;
598118611Snjl
599151937Sjkim    /* Allocate worst case - 7 vendor bytes */
600151937Sjkim
601151937Sjkim    Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_VENDOR_SMALL) + 7);
602151937Sjkim
603118611Snjl    Descriptor = Rnode->Buffer;
604151937Sjkim    Descriptor->VendorSmall.DescriptorType  = ACPI_RESOURCE_NAME_VENDOR_SMALL;
605151937Sjkim    VendorData = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_SMALL_HEADER);
606118611Snjl
607151937Sjkim    /* Process all child initialization nodes */
608151937Sjkim
609118611Snjl    InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
610151937Sjkim    for (i = 0; InitializerOp; i++)
611118611Snjl    {
612167802Sjkim        if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
613167802Sjkim        {
614167802Sjkim            break;
615167802Sjkim        }
616167802Sjkim
617151937Sjkim        /* Maximum 7 vendor data bytes allowed (0-6) */
618151937Sjkim
619151937Sjkim        if (i >= 7)
620151937Sjkim        {
621151937Sjkim            AslError (ASL_ERROR, ASL_MSG_VENDOR_LIST, InitializerOp, NULL);
622151937Sjkim
623151937Sjkim            /* Eat the excess initializers */
624151937Sjkim
625151937Sjkim            while (InitializerOp)
626151937Sjkim            {
627151937Sjkim                InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
628151937Sjkim            }
629151937Sjkim            break;
630151937Sjkim        }
631151937Sjkim
632151937Sjkim        VendorData[i] = (UINT8) InitializerOp->Asl.Value.Integer;
633118611Snjl        InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
634118611Snjl    }
635118611Snjl
636118611Snjl    /* Adjust the Rnode buffer size, so correct number of bytes are emitted */
637118611Snjl
638118611Snjl    Rnode->BufferLength -= (7 - i);
639118611Snjl
640118611Snjl    /* Set the length in the Type Tag */
641118611Snjl
642151937Sjkim    Descriptor->VendorSmall.DescriptorType |= (UINT8) i;
643118611Snjl    return (Rnode);
644118611Snjl}
645118611Snjl
646