xref: /freebsd/sys/contrib/dev/acpica/components/disassembler/dmresrc.c (revision a159c266a93c3c4f229864954c5f963acd8f60f2)
1*a159c266SJung-uk Kim /*******************************************************************************
2*a159c266SJung-uk Kim  *
3*a159c266SJung-uk Kim  * Module Name: dmresrc.c - Resource Descriptor disassembly
4*a159c266SJung-uk Kim  *
5*a159c266SJung-uk Kim  ******************************************************************************/
6*a159c266SJung-uk Kim 
7*a159c266SJung-uk Kim /*
8*a159c266SJung-uk Kim  * Copyright (C) 2000 - 2012, Intel Corp.
9*a159c266SJung-uk Kim  * All rights reserved.
10*a159c266SJung-uk Kim  *
11*a159c266SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12*a159c266SJung-uk Kim  * modification, are permitted provided that the following conditions
13*a159c266SJung-uk Kim  * are met:
14*a159c266SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15*a159c266SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16*a159c266SJung-uk Kim  *    without modification.
17*a159c266SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*a159c266SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19*a159c266SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20*a159c266SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21*a159c266SJung-uk Kim  *    binary redistribution.
22*a159c266SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23*a159c266SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24*a159c266SJung-uk Kim  *    from this software without specific prior written permission.
25*a159c266SJung-uk Kim  *
26*a159c266SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27*a159c266SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28*a159c266SJung-uk Kim  * Software Foundation.
29*a159c266SJung-uk Kim  *
30*a159c266SJung-uk Kim  * NO WARRANTY
31*a159c266SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*a159c266SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*a159c266SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*a159c266SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*a159c266SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*a159c266SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*a159c266SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*a159c266SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*a159c266SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*a159c266SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*a159c266SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42*a159c266SJung-uk Kim  */
43*a159c266SJung-uk Kim 
44*a159c266SJung-uk Kim 
45*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
46*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
48*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h>
49*a159c266SJung-uk Kim 
50*a159c266SJung-uk Kim #ifdef ACPI_DISASSEMBLER
51*a159c266SJung-uk Kim 
52*a159c266SJung-uk Kim #define _COMPONENT          ACPI_CA_DEBUGGER
53*a159c266SJung-uk Kim         ACPI_MODULE_NAME    ("dbresrc")
54*a159c266SJung-uk Kim 
55*a159c266SJung-uk Kim 
56*a159c266SJung-uk Kim /* Dispatch tables for Resource disassembly functions */
57*a159c266SJung-uk Kim 
58*a159c266SJung-uk Kim static ACPI_RESOURCE_HANDLER    AcpiGbl_DmResourceDispatch [] =
59*a159c266SJung-uk Kim {
60*a159c266SJung-uk Kim     /* Small descriptors */
61*a159c266SJung-uk Kim 
62*a159c266SJung-uk Kim     NULL,                           /* 0x00, Reserved */
63*a159c266SJung-uk Kim     NULL,                           /* 0x01, Reserved */
64*a159c266SJung-uk Kim     NULL,                           /* 0x02, Reserved */
65*a159c266SJung-uk Kim     NULL,                           /* 0x03, Reserved */
66*a159c266SJung-uk Kim     AcpiDmIrqDescriptor,            /* 0x04, ACPI_RESOURCE_NAME_IRQ_FORMAT */
67*a159c266SJung-uk Kim     AcpiDmDmaDescriptor,            /* 0x05, ACPI_RESOURCE_NAME_DMA_FORMAT */
68*a159c266SJung-uk Kim     AcpiDmStartDependentDescriptor, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */
69*a159c266SJung-uk Kim     AcpiDmEndDependentDescriptor,   /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */
70*a159c266SJung-uk Kim     AcpiDmIoDescriptor,             /* 0x08, ACPI_RESOURCE_NAME_IO_PORT */
71*a159c266SJung-uk Kim     AcpiDmFixedIoDescriptor,        /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO_PORT */
72*a159c266SJung-uk Kim     AcpiDmFixedDmaDescriptor,       /* 0x0A, ACPI_RESOURCE_NAME_FIXED_DMA */
73*a159c266SJung-uk Kim     NULL,                           /* 0x0B, Reserved */
74*a159c266SJung-uk Kim     NULL,                           /* 0x0C, Reserved */
75*a159c266SJung-uk Kim     NULL,                           /* 0x0D, Reserved */
76*a159c266SJung-uk Kim     AcpiDmVendorSmallDescriptor,    /* 0x0E, ACPI_RESOURCE_NAME_SMALL_VENDOR */
77*a159c266SJung-uk Kim     NULL,                           /* 0x0F, ACPI_RESOURCE_NAME_END_TAG (not used) */
78*a159c266SJung-uk Kim 
79*a159c266SJung-uk Kim     /* Large descriptors */
80*a159c266SJung-uk Kim 
81*a159c266SJung-uk Kim     NULL,                           /* 0x00, Reserved */
82*a159c266SJung-uk Kim     AcpiDmMemory24Descriptor,       /* 0x01, ACPI_RESOURCE_NAME_MEMORY_24 */
83*a159c266SJung-uk Kim     AcpiDmGenericRegisterDescriptor,/* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */
84*a159c266SJung-uk Kim     NULL,                           /* 0x03, Reserved */
85*a159c266SJung-uk Kim     AcpiDmVendorLargeDescriptor,    /* 0x04, ACPI_RESOURCE_NAME_LARGE_VENDOR */
86*a159c266SJung-uk Kim     AcpiDmMemory32Descriptor,       /* 0x05, ACPI_RESOURCE_NAME_MEMORY_32 */
87*a159c266SJung-uk Kim     AcpiDmFixedMemory32Descriptor,  /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY_32 */
88*a159c266SJung-uk Kim     AcpiDmDwordDescriptor,          /* 0x07, ACPI_RESOURCE_NAME_DWORD_ADDRESS_SPACE */
89*a159c266SJung-uk Kim     AcpiDmWordDescriptor,           /* 0x08, ACPI_RESOURCE_NAME_WORD_ADDRESS_SPACE */
90*a159c266SJung-uk Kim     AcpiDmInterruptDescriptor,      /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_XRUPT */
91*a159c266SJung-uk Kim     AcpiDmQwordDescriptor,          /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */
92*a159c266SJung-uk Kim     AcpiDmExtendedDescriptor,       /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */
93*a159c266SJung-uk Kim     AcpiDmGpioDescriptor,           /* 0x0C, ACPI_RESOURCE_NAME_GPIO */
94*a159c266SJung-uk Kim     NULL,                           /* 0x0D, Reserved */
95*a159c266SJung-uk Kim     AcpiDmSerialBusDescriptor       /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS */
96*a159c266SJung-uk Kim };
97*a159c266SJung-uk Kim 
98*a159c266SJung-uk Kim 
99*a159c266SJung-uk Kim /* Only used for single-threaded applications */
100*a159c266SJung-uk Kim /* TBD: remove when name is passed as parameter to the dump functions */
101*a159c266SJung-uk Kim 
102*a159c266SJung-uk Kim static UINT32               ResourceName;
103*a159c266SJung-uk Kim 
104*a159c266SJung-uk Kim 
105*a159c266SJung-uk Kim /*******************************************************************************
106*a159c266SJung-uk Kim  *
107*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmDescriptorName
108*a159c266SJung-uk Kim  *
109*a159c266SJung-uk Kim  * PARAMETERS:  None
110*a159c266SJung-uk Kim  *
111*a159c266SJung-uk Kim  * RETURN:      None
112*a159c266SJung-uk Kim  *
113*a159c266SJung-uk Kim  * DESCRIPTION: Emit a name for the descriptor if one is present (indicated
114*a159c266SJung-uk Kim  *              by the name being changed from the default name.) A name is only
115*a159c266SJung-uk Kim  *              emitted if a reference to the descriptor has been made somewhere
116*a159c266SJung-uk Kim  *              in the original ASL code.
117*a159c266SJung-uk Kim  *
118*a159c266SJung-uk Kim  ******************************************************************************/
119*a159c266SJung-uk Kim 
120*a159c266SJung-uk Kim void
121*a159c266SJung-uk Kim AcpiDmDescriptorName (
122*a159c266SJung-uk Kim     void)
123*a159c266SJung-uk Kim {
124*a159c266SJung-uk Kim 
125*a159c266SJung-uk Kim     if (ResourceName == ACPI_DEFAULT_RESNAME)
126*a159c266SJung-uk Kim     {
127*a159c266SJung-uk Kim         return;
128*a159c266SJung-uk Kim     }
129*a159c266SJung-uk Kim 
130*a159c266SJung-uk Kim     AcpiOsPrintf ("%4.4s", (char *) &ResourceName);
131*a159c266SJung-uk Kim }
132*a159c266SJung-uk Kim 
133*a159c266SJung-uk Kim 
134*a159c266SJung-uk Kim /*******************************************************************************
135*a159c266SJung-uk Kim  *
136*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmDumpInteger*
137*a159c266SJung-uk Kim  *
138*a159c266SJung-uk Kim  * PARAMETERS:  Value               - Value to emit
139*a159c266SJung-uk Kim  *              Name                - Associated name (emitted as a comment)
140*a159c266SJung-uk Kim  *
141*a159c266SJung-uk Kim  * RETURN:      None
142*a159c266SJung-uk Kim  *
143*a159c266SJung-uk Kim  * DESCRIPTION: Integer output helper functions
144*a159c266SJung-uk Kim  *
145*a159c266SJung-uk Kim  ******************************************************************************/
146*a159c266SJung-uk Kim 
147*a159c266SJung-uk Kim void
148*a159c266SJung-uk Kim AcpiDmDumpInteger8 (
149*a159c266SJung-uk Kim     UINT8                   Value,
150*a159c266SJung-uk Kim     char                    *Name)
151*a159c266SJung-uk Kim {
152*a159c266SJung-uk Kim     AcpiOsPrintf ("0x%2.2X,               // %s\n", Value, Name);
153*a159c266SJung-uk Kim }
154*a159c266SJung-uk Kim 
155*a159c266SJung-uk Kim void
156*a159c266SJung-uk Kim AcpiDmDumpInteger16 (
157*a159c266SJung-uk Kim     UINT16                  Value,
158*a159c266SJung-uk Kim     char                    *Name)
159*a159c266SJung-uk Kim {
160*a159c266SJung-uk Kim     AcpiOsPrintf ("0x%4.4X,             // %s\n", Value, Name);
161*a159c266SJung-uk Kim }
162*a159c266SJung-uk Kim 
163*a159c266SJung-uk Kim void
164*a159c266SJung-uk Kim AcpiDmDumpInteger32 (
165*a159c266SJung-uk Kim     UINT32                  Value,
166*a159c266SJung-uk Kim     char                    *Name)
167*a159c266SJung-uk Kim {
168*a159c266SJung-uk Kim     AcpiOsPrintf ("0x%8.8X,         // %s\n", Value, Name);
169*a159c266SJung-uk Kim }
170*a159c266SJung-uk Kim 
171*a159c266SJung-uk Kim void
172*a159c266SJung-uk Kim AcpiDmDumpInteger64 (
173*a159c266SJung-uk Kim     UINT64                  Value,
174*a159c266SJung-uk Kim     char                    *Name)
175*a159c266SJung-uk Kim {
176*a159c266SJung-uk Kim     AcpiOsPrintf ("0x%8.8X%8.8X, // %s\n", ACPI_FORMAT_UINT64 (Value), Name);
177*a159c266SJung-uk Kim }
178*a159c266SJung-uk Kim 
179*a159c266SJung-uk Kim 
180*a159c266SJung-uk Kim /*******************************************************************************
181*a159c266SJung-uk Kim  *
182*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmBitList
183*a159c266SJung-uk Kim  *
184*a159c266SJung-uk Kim  * PARAMETERS:  Mask            - 16-bit value corresponding to 16 interrupt
185*a159c266SJung-uk Kim  *                                or DMA values
186*a159c266SJung-uk Kim  *
187*a159c266SJung-uk Kim  * RETURN:      None
188*a159c266SJung-uk Kim  *
189*a159c266SJung-uk Kim  * DESCRIPTION: Dump a bit mask as a list of individual interrupt/DMA levels.
190*a159c266SJung-uk Kim  *
191*a159c266SJung-uk Kim  ******************************************************************************/
192*a159c266SJung-uk Kim 
193*a159c266SJung-uk Kim void
194*a159c266SJung-uk Kim AcpiDmBitList (
195*a159c266SJung-uk Kim     UINT16                  Mask)
196*a159c266SJung-uk Kim {
197*a159c266SJung-uk Kim     UINT32                  i;
198*a159c266SJung-uk Kim     BOOLEAN                 Previous = FALSE;
199*a159c266SJung-uk Kim 
200*a159c266SJung-uk Kim 
201*a159c266SJung-uk Kim     /* Open the initializer list */
202*a159c266SJung-uk Kim 
203*a159c266SJung-uk Kim     AcpiOsPrintf ("{");
204*a159c266SJung-uk Kim 
205*a159c266SJung-uk Kim     /* Examine each bit */
206*a159c266SJung-uk Kim 
207*a159c266SJung-uk Kim     for (i = 0; i < 16; i++)
208*a159c266SJung-uk Kim     {
209*a159c266SJung-uk Kim         /* Only interested in bits that are set to 1 */
210*a159c266SJung-uk Kim 
211*a159c266SJung-uk Kim         if (Mask & 1)
212*a159c266SJung-uk Kim         {
213*a159c266SJung-uk Kim             if (Previous)
214*a159c266SJung-uk Kim             {
215*a159c266SJung-uk Kim                 AcpiOsPrintf (",");
216*a159c266SJung-uk Kim             }
217*a159c266SJung-uk Kim             Previous = TRUE;
218*a159c266SJung-uk Kim             AcpiOsPrintf ("%u", i);
219*a159c266SJung-uk Kim         }
220*a159c266SJung-uk Kim 
221*a159c266SJung-uk Kim         Mask >>= 1;
222*a159c266SJung-uk Kim     }
223*a159c266SJung-uk Kim 
224*a159c266SJung-uk Kim     /* Close list */
225*a159c266SJung-uk Kim 
226*a159c266SJung-uk Kim     AcpiOsPrintf ("}\n");
227*a159c266SJung-uk Kim }
228*a159c266SJung-uk Kim 
229*a159c266SJung-uk Kim 
230*a159c266SJung-uk Kim /*******************************************************************************
231*a159c266SJung-uk Kim  *
232*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmResourceTemplate
233*a159c266SJung-uk Kim  *
234*a159c266SJung-uk Kim  * PARAMETERS:  Info            - Curent parse tree walk info
235*a159c266SJung-uk Kim  *              ByteData        - Pointer to the byte list data
236*a159c266SJung-uk Kim  *              ByteCount       - Length of the byte list
237*a159c266SJung-uk Kim  *
238*a159c266SJung-uk Kim  * RETURN:      None
239*a159c266SJung-uk Kim  *
240*a159c266SJung-uk Kim  * DESCRIPTION: Dump the contents of a Resource Template containing a set of
241*a159c266SJung-uk Kim  *              Resource Descriptors.
242*a159c266SJung-uk Kim  *
243*a159c266SJung-uk Kim  ******************************************************************************/
244*a159c266SJung-uk Kim 
245*a159c266SJung-uk Kim void
246*a159c266SJung-uk Kim AcpiDmResourceTemplate (
247*a159c266SJung-uk Kim     ACPI_OP_WALK_INFO       *Info,
248*a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
249*a159c266SJung-uk Kim     UINT8                   *ByteData,
250*a159c266SJung-uk Kim     UINT32                  ByteCount)
251*a159c266SJung-uk Kim {
252*a159c266SJung-uk Kim     ACPI_STATUS             Status;
253*a159c266SJung-uk Kim     UINT32                  CurrentByteOffset;
254*a159c266SJung-uk Kim     UINT8                   ResourceType;
255*a159c266SJung-uk Kim     UINT32                  ResourceLength;
256*a159c266SJung-uk Kim     void                    *Aml;
257*a159c266SJung-uk Kim     UINT32                  Level;
258*a159c266SJung-uk Kim     BOOLEAN                 DependentFns = FALSE;
259*a159c266SJung-uk Kim     UINT8                   ResourceIndex;
260*a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
261*a159c266SJung-uk Kim 
262*a159c266SJung-uk Kim 
263*a159c266SJung-uk Kim     Level = Info->Level;
264*a159c266SJung-uk Kim     ResourceName = ACPI_DEFAULT_RESNAME;
265*a159c266SJung-uk Kim     Node = Op->Common.Node;
266*a159c266SJung-uk Kim     if (Node)
267*a159c266SJung-uk Kim     {
268*a159c266SJung-uk Kim         Node = Node->Child;
269*a159c266SJung-uk Kim     }
270*a159c266SJung-uk Kim 
271*a159c266SJung-uk Kim     for (CurrentByteOffset = 0; CurrentByteOffset < ByteCount;)
272*a159c266SJung-uk Kim     {
273*a159c266SJung-uk Kim         Aml = &ByteData[CurrentByteOffset];
274*a159c266SJung-uk Kim 
275*a159c266SJung-uk Kim         /* Get the descriptor type and length */
276*a159c266SJung-uk Kim 
277*a159c266SJung-uk Kim         ResourceType = AcpiUtGetResourceType (Aml);
278*a159c266SJung-uk Kim         ResourceLength = AcpiUtGetResourceLength (Aml);
279*a159c266SJung-uk Kim 
280*a159c266SJung-uk Kim         /* Validate the Resource Type and Resource Length */
281*a159c266SJung-uk Kim 
282*a159c266SJung-uk Kim         Status = AcpiUtValidateResource (Aml, &ResourceIndex);
283*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
284*a159c266SJung-uk Kim         {
285*a159c266SJung-uk Kim             AcpiOsPrintf ("/*** Could not validate Resource, type (%X) %s***/\n",
286*a159c266SJung-uk Kim                 ResourceType, AcpiFormatException (Status));
287*a159c266SJung-uk Kim             return;
288*a159c266SJung-uk Kim         }
289*a159c266SJung-uk Kim 
290*a159c266SJung-uk Kim         /* Point to next descriptor */
291*a159c266SJung-uk Kim 
292*a159c266SJung-uk Kim         CurrentByteOffset += AcpiUtGetDescriptorLength (Aml);
293*a159c266SJung-uk Kim 
294*a159c266SJung-uk Kim         /* Descriptor pre-processing */
295*a159c266SJung-uk Kim 
296*a159c266SJung-uk Kim         switch (ResourceType)
297*a159c266SJung-uk Kim         {
298*a159c266SJung-uk Kim         case ACPI_RESOURCE_NAME_START_DEPENDENT:
299*a159c266SJung-uk Kim 
300*a159c266SJung-uk Kim             /* Finish a previous StartDependentFns */
301*a159c266SJung-uk Kim 
302*a159c266SJung-uk Kim             if (DependentFns)
303*a159c266SJung-uk Kim             {
304*a159c266SJung-uk Kim                 Level--;
305*a159c266SJung-uk Kim                 AcpiDmIndent (Level);
306*a159c266SJung-uk Kim                 AcpiOsPrintf ("}\n");
307*a159c266SJung-uk Kim             }
308*a159c266SJung-uk Kim             break;
309*a159c266SJung-uk Kim 
310*a159c266SJung-uk Kim         case ACPI_RESOURCE_NAME_END_DEPENDENT:
311*a159c266SJung-uk Kim 
312*a159c266SJung-uk Kim             Level--;
313*a159c266SJung-uk Kim             DependentFns = FALSE;
314*a159c266SJung-uk Kim             break;
315*a159c266SJung-uk Kim 
316*a159c266SJung-uk Kim         case ACPI_RESOURCE_NAME_END_TAG:
317*a159c266SJung-uk Kim 
318*a159c266SJung-uk Kim             /* Normal exit, the resource list is finished */
319*a159c266SJung-uk Kim 
320*a159c266SJung-uk Kim             if (DependentFns)
321*a159c266SJung-uk Kim             {
322*a159c266SJung-uk Kim                 /*
323*a159c266SJung-uk Kim                  * Close an open StartDependentDescriptor. This indicates a
324*a159c266SJung-uk Kim                  * missing EndDependentDescriptor.
325*a159c266SJung-uk Kim                  */
326*a159c266SJung-uk Kim                 Level--;
327*a159c266SJung-uk Kim                 DependentFns = FALSE;
328*a159c266SJung-uk Kim 
329*a159c266SJung-uk Kim                 /* Go ahead and insert EndDependentFn() */
330*a159c266SJung-uk Kim 
331*a159c266SJung-uk Kim                 AcpiDmEndDependentDescriptor (Aml, ResourceLength, Level);
332*a159c266SJung-uk Kim 
333*a159c266SJung-uk Kim                 AcpiDmIndent (Level);
334*a159c266SJung-uk Kim                 AcpiOsPrintf (
335*a159c266SJung-uk Kim                     "/*** Disassembler: inserted missing EndDependentFn () ***/\n");
336*a159c266SJung-uk Kim             }
337*a159c266SJung-uk Kim             return;
338*a159c266SJung-uk Kim 
339*a159c266SJung-uk Kim         default:
340*a159c266SJung-uk Kim             break;
341*a159c266SJung-uk Kim         }
342*a159c266SJung-uk Kim 
343*a159c266SJung-uk Kim         /* Disassemble the resource structure */
344*a159c266SJung-uk Kim 
345*a159c266SJung-uk Kim         if (Node)
346*a159c266SJung-uk Kim         {
347*a159c266SJung-uk Kim             ResourceName = Node->Name.Integer;
348*a159c266SJung-uk Kim             Node = Node->Peer;
349*a159c266SJung-uk Kim         }
350*a159c266SJung-uk Kim 
351*a159c266SJung-uk Kim         AcpiGbl_DmResourceDispatch [ResourceIndex] (
352*a159c266SJung-uk Kim             Aml, ResourceLength, Level);
353*a159c266SJung-uk Kim 
354*a159c266SJung-uk Kim         /* Descriptor post-processing */
355*a159c266SJung-uk Kim 
356*a159c266SJung-uk Kim         if (ResourceType == ACPI_RESOURCE_NAME_START_DEPENDENT)
357*a159c266SJung-uk Kim         {
358*a159c266SJung-uk Kim             DependentFns = TRUE;
359*a159c266SJung-uk Kim             Level++;
360*a159c266SJung-uk Kim         }
361*a159c266SJung-uk Kim     }
362*a159c266SJung-uk Kim }
363*a159c266SJung-uk Kim 
364*a159c266SJung-uk Kim 
365*a159c266SJung-uk Kim /*******************************************************************************
366*a159c266SJung-uk Kim  *
367*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmIsResourceTemplate
368*a159c266SJung-uk Kim  *
369*a159c266SJung-uk Kim  * PARAMETERS:  Op          - Buffer Op to be examined
370*a159c266SJung-uk Kim  *
371*a159c266SJung-uk Kim  * RETURN:      Status. AE_OK if valid template
372*a159c266SJung-uk Kim  *
373*a159c266SJung-uk Kim  * DESCRIPTION: Walk a byte list to determine if it consists of a valid set
374*a159c266SJung-uk Kim  *              of resource descriptors.  Nothing is output.
375*a159c266SJung-uk Kim  *
376*a159c266SJung-uk Kim  ******************************************************************************/
377*a159c266SJung-uk Kim 
378*a159c266SJung-uk Kim ACPI_STATUS
379*a159c266SJung-uk Kim AcpiDmIsResourceTemplate (
380*a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
381*a159c266SJung-uk Kim {
382*a159c266SJung-uk Kim     ACPI_STATUS             Status;
383*a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
384*a159c266SJung-uk Kim     UINT8                   *Aml;
385*a159c266SJung-uk Kim     UINT8                   *EndAml;
386*a159c266SJung-uk Kim     ACPI_SIZE               Length;
387*a159c266SJung-uk Kim 
388*a159c266SJung-uk Kim 
389*a159c266SJung-uk Kim     /* This op must be a buffer */
390*a159c266SJung-uk Kim 
391*a159c266SJung-uk Kim     if (Op->Common.AmlOpcode != AML_BUFFER_OP)
392*a159c266SJung-uk Kim     {
393*a159c266SJung-uk Kim         return (AE_TYPE);
394*a159c266SJung-uk Kim     }
395*a159c266SJung-uk Kim 
396*a159c266SJung-uk Kim     /* Get the ByteData list and length */
397*a159c266SJung-uk Kim 
398*a159c266SJung-uk Kim     NextOp = Op->Common.Value.Arg;
399*a159c266SJung-uk Kim     NextOp = NextOp->Common.Next;
400*a159c266SJung-uk Kim     if (!NextOp)
401*a159c266SJung-uk Kim     {
402*a159c266SJung-uk Kim         return (AE_TYPE);
403*a159c266SJung-uk Kim     }
404*a159c266SJung-uk Kim 
405*a159c266SJung-uk Kim     Aml = NextOp->Named.Data;
406*a159c266SJung-uk Kim     Length = (ACPI_SIZE) NextOp->Common.Value.Integer;
407*a159c266SJung-uk Kim 
408*a159c266SJung-uk Kim     /* Walk the byte list, abort on any invalid descriptor type or length */
409*a159c266SJung-uk Kim 
410*a159c266SJung-uk Kim     Status = AcpiUtWalkAmlResources (Aml, Length, NULL, &EndAml);
411*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
412*a159c266SJung-uk Kim     {
413*a159c266SJung-uk Kim         return (AE_TYPE);
414*a159c266SJung-uk Kim     }
415*a159c266SJung-uk Kim 
416*a159c266SJung-uk Kim     /*
417*a159c266SJung-uk Kim      * For the resource template to be valid, one EndTag must appear
418*a159c266SJung-uk Kim      * at the very end of the ByteList, not before. (For proper disassembly
419*a159c266SJung-uk Kim      * of a ResourceTemplate, the buffer must not have any extra data after
420*a159c266SJung-uk Kim      * the EndTag.)
421*a159c266SJung-uk Kim      */
422*a159c266SJung-uk Kim     if ((Aml + Length - sizeof (AML_RESOURCE_END_TAG)) != EndAml)
423*a159c266SJung-uk Kim     {
424*a159c266SJung-uk Kim         return (AE_AML_NO_RESOURCE_END_TAG);
425*a159c266SJung-uk Kim     }
426*a159c266SJung-uk Kim 
427*a159c266SJung-uk Kim     /*
428*a159c266SJung-uk Kim      * All resource descriptors are valid, therefore this list appears
429*a159c266SJung-uk Kim      * to be a valid resource template
430*a159c266SJung-uk Kim      */
431*a159c266SJung-uk Kim     return (AE_OK);
432*a159c266SJung-uk Kim }
433*a159c266SJung-uk Kim 
434*a159c266SJung-uk Kim #endif
435