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