xref: /freebsd/sys/contrib/dev/acpica/components/disassembler/dmresrc.c (revision ed17e06e2cdf97a1c05c04d88ef6c54cbdb34871)
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 /*
8a159c266SJung-uk Kim  * Copyright (C) 2000 - 2012, 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 
45a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
46a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
47a159c266SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h>
48a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h>
49a159c266SJung-uk Kim 
50a159c266SJung-uk Kim #ifdef ACPI_DISASSEMBLER
51a159c266SJung-uk Kim 
52a159c266SJung-uk Kim #define _COMPONENT          ACPI_CA_DEBUGGER
53a159c266SJung-uk Kim         ACPI_MODULE_NAME    ("dbresrc")
54a159c266SJung-uk Kim 
55a159c266SJung-uk Kim 
56a159c266SJung-uk Kim /* Dispatch tables for Resource disassembly functions */
57a159c266SJung-uk Kim 
58a159c266SJung-uk Kim static ACPI_RESOURCE_HANDLER    AcpiGbl_DmResourceDispatch [] =
59a159c266SJung-uk Kim {
60a159c266SJung-uk Kim     /* Small descriptors */
61a159c266SJung-uk Kim 
62a159c266SJung-uk Kim     NULL,                           /* 0x00, Reserved */
63a159c266SJung-uk Kim     NULL,                           /* 0x01, Reserved */
64a159c266SJung-uk Kim     NULL,                           /* 0x02, Reserved */
65a159c266SJung-uk Kim     NULL,                           /* 0x03, Reserved */
66a159c266SJung-uk Kim     AcpiDmIrqDescriptor,            /* 0x04, ACPI_RESOURCE_NAME_IRQ_FORMAT */
67a159c266SJung-uk Kim     AcpiDmDmaDescriptor,            /* 0x05, ACPI_RESOURCE_NAME_DMA_FORMAT */
68a159c266SJung-uk Kim     AcpiDmStartDependentDescriptor, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */
69a159c266SJung-uk Kim     AcpiDmEndDependentDescriptor,   /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */
70a159c266SJung-uk Kim     AcpiDmIoDescriptor,             /* 0x08, ACPI_RESOURCE_NAME_IO_PORT */
71a159c266SJung-uk Kim     AcpiDmFixedIoDescriptor,        /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO_PORT */
72a159c266SJung-uk Kim     AcpiDmFixedDmaDescriptor,       /* 0x0A, ACPI_RESOURCE_NAME_FIXED_DMA */
73a159c266SJung-uk Kim     NULL,                           /* 0x0B, Reserved */
74a159c266SJung-uk Kim     NULL,                           /* 0x0C, Reserved */
75a159c266SJung-uk Kim     NULL,                           /* 0x0D, Reserved */
76a159c266SJung-uk Kim     AcpiDmVendorSmallDescriptor,    /* 0x0E, ACPI_RESOURCE_NAME_SMALL_VENDOR */
77a159c266SJung-uk Kim     NULL,                           /* 0x0F, ACPI_RESOURCE_NAME_END_TAG (not used) */
78a159c266SJung-uk Kim 
79a159c266SJung-uk Kim     /* Large descriptors */
80a159c266SJung-uk Kim 
81a159c266SJung-uk Kim     NULL,                           /* 0x00, Reserved */
82a159c266SJung-uk Kim     AcpiDmMemory24Descriptor,       /* 0x01, ACPI_RESOURCE_NAME_MEMORY_24 */
83a159c266SJung-uk Kim     AcpiDmGenericRegisterDescriptor,/* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */
84a159c266SJung-uk Kim     NULL,                           /* 0x03, Reserved */
85a159c266SJung-uk Kim     AcpiDmVendorLargeDescriptor,    /* 0x04, ACPI_RESOURCE_NAME_LARGE_VENDOR */
86a159c266SJung-uk Kim     AcpiDmMemory32Descriptor,       /* 0x05, ACPI_RESOURCE_NAME_MEMORY_32 */
87a159c266SJung-uk Kim     AcpiDmFixedMemory32Descriptor,  /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY_32 */
88a159c266SJung-uk Kim     AcpiDmDwordDescriptor,          /* 0x07, ACPI_RESOURCE_NAME_DWORD_ADDRESS_SPACE */
89a159c266SJung-uk Kim     AcpiDmWordDescriptor,           /* 0x08, ACPI_RESOURCE_NAME_WORD_ADDRESS_SPACE */
90a159c266SJung-uk Kim     AcpiDmInterruptDescriptor,      /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_XRUPT */
91a159c266SJung-uk Kim     AcpiDmQwordDescriptor,          /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */
92a159c266SJung-uk Kim     AcpiDmExtendedDescriptor,       /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */
93a159c266SJung-uk Kim     AcpiDmGpioDescriptor,           /* 0x0C, ACPI_RESOURCE_NAME_GPIO */
94a159c266SJung-uk Kim     NULL,                           /* 0x0D, Reserved */
95a159c266SJung-uk Kim     AcpiDmSerialBusDescriptor       /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS */
96a159c266SJung-uk Kim };
97a159c266SJung-uk Kim 
98a159c266SJung-uk Kim 
99a159c266SJung-uk Kim /* Only used for single-threaded applications */
100a159c266SJung-uk Kim /* TBD: remove when name is passed as parameter to the dump functions */
101a159c266SJung-uk Kim 
102a159c266SJung-uk Kim static UINT32               ResourceName;
103a159c266SJung-uk Kim 
104a159c266SJung-uk Kim 
105a159c266SJung-uk Kim /*******************************************************************************
106a159c266SJung-uk Kim  *
107a159c266SJung-uk Kim  * FUNCTION:    AcpiDmDescriptorName
108a159c266SJung-uk Kim  *
109a159c266SJung-uk Kim  * PARAMETERS:  None
110a159c266SJung-uk Kim  *
111a159c266SJung-uk Kim  * RETURN:      None
112a159c266SJung-uk Kim  *
113a159c266SJung-uk Kim  * DESCRIPTION: Emit a name for the descriptor if one is present (indicated
114a159c266SJung-uk Kim  *              by the name being changed from the default name.) A name is only
115a159c266SJung-uk Kim  *              emitted if a reference to the descriptor has been made somewhere
116a159c266SJung-uk Kim  *              in the original ASL code.
117a159c266SJung-uk Kim  *
118a159c266SJung-uk Kim  ******************************************************************************/
119a159c266SJung-uk Kim 
120a159c266SJung-uk Kim void
121a159c266SJung-uk Kim AcpiDmDescriptorName (
122a159c266SJung-uk Kim     void)
123a159c266SJung-uk Kim {
124a159c266SJung-uk Kim 
125a159c266SJung-uk Kim     if (ResourceName == ACPI_DEFAULT_RESNAME)
126a159c266SJung-uk Kim     {
127a159c266SJung-uk Kim         return;
128a159c266SJung-uk Kim     }
129a159c266SJung-uk Kim 
130a159c266SJung-uk Kim     AcpiOsPrintf ("%4.4s", (char *) &ResourceName);
131a159c266SJung-uk Kim }
132a159c266SJung-uk Kim 
133a159c266SJung-uk Kim 
134a159c266SJung-uk Kim /*******************************************************************************
135a159c266SJung-uk Kim  *
136a159c266SJung-uk Kim  * FUNCTION:    AcpiDmDumpInteger*
137a159c266SJung-uk Kim  *
138a159c266SJung-uk Kim  * PARAMETERS:  Value               - Value to emit
139a159c266SJung-uk Kim  *              Name                - Associated name (emitted as a comment)
140a159c266SJung-uk Kim  *
141a159c266SJung-uk Kim  * RETURN:      None
142a159c266SJung-uk Kim  *
143a159c266SJung-uk Kim  * DESCRIPTION: Integer output helper functions
144a159c266SJung-uk Kim  *
145a159c266SJung-uk Kim  ******************************************************************************/
146a159c266SJung-uk Kim 
147a159c266SJung-uk Kim void
148a159c266SJung-uk Kim AcpiDmDumpInteger8 (
149a159c266SJung-uk Kim     UINT8                   Value,
150a159c266SJung-uk Kim     char                    *Name)
151a159c266SJung-uk Kim {
152a159c266SJung-uk Kim     AcpiOsPrintf ("0x%2.2X,               // %s\n", Value, Name);
153a159c266SJung-uk Kim }
154a159c266SJung-uk Kim 
155a159c266SJung-uk Kim void
156a159c266SJung-uk Kim AcpiDmDumpInteger16 (
157a159c266SJung-uk Kim     UINT16                  Value,
158a159c266SJung-uk Kim     char                    *Name)
159a159c266SJung-uk Kim {
160a159c266SJung-uk Kim     AcpiOsPrintf ("0x%4.4X,             // %s\n", Value, Name);
161a159c266SJung-uk Kim }
162a159c266SJung-uk Kim 
163a159c266SJung-uk Kim void
164a159c266SJung-uk Kim AcpiDmDumpInteger32 (
165a159c266SJung-uk Kim     UINT32                  Value,
166a159c266SJung-uk Kim     char                    *Name)
167a159c266SJung-uk Kim {
168a159c266SJung-uk Kim     AcpiOsPrintf ("0x%8.8X,         // %s\n", Value, Name);
169a159c266SJung-uk Kim }
170a159c266SJung-uk Kim 
171a159c266SJung-uk Kim void
172a159c266SJung-uk Kim AcpiDmDumpInteger64 (
173a159c266SJung-uk Kim     UINT64                  Value,
174a159c266SJung-uk Kim     char                    *Name)
175a159c266SJung-uk Kim {
176a159c266SJung-uk Kim     AcpiOsPrintf ("0x%8.8X%8.8X, // %s\n", ACPI_FORMAT_UINT64 (Value), Name);
177a159c266SJung-uk Kim }
178a159c266SJung-uk Kim 
179a159c266SJung-uk Kim 
180a159c266SJung-uk Kim /*******************************************************************************
181a159c266SJung-uk Kim  *
182a159c266SJung-uk Kim  * FUNCTION:    AcpiDmBitList
183a159c266SJung-uk Kim  *
184a159c266SJung-uk Kim  * PARAMETERS:  Mask            - 16-bit value corresponding to 16 interrupt
185a159c266SJung-uk Kim  *                                or DMA values
186a159c266SJung-uk Kim  *
187a159c266SJung-uk Kim  * RETURN:      None
188a159c266SJung-uk Kim  *
189a159c266SJung-uk Kim  * DESCRIPTION: Dump a bit mask as a list of individual interrupt/DMA levels.
190a159c266SJung-uk Kim  *
191a159c266SJung-uk Kim  ******************************************************************************/
192a159c266SJung-uk Kim 
193a159c266SJung-uk Kim void
194a159c266SJung-uk Kim AcpiDmBitList (
195a159c266SJung-uk Kim     UINT16                  Mask)
196a159c266SJung-uk Kim {
197a159c266SJung-uk Kim     UINT32                  i;
198a159c266SJung-uk Kim     BOOLEAN                 Previous = FALSE;
199a159c266SJung-uk Kim 
200a159c266SJung-uk Kim 
201a159c266SJung-uk Kim     /* Open the initializer list */
202a159c266SJung-uk Kim 
203a159c266SJung-uk Kim     AcpiOsPrintf ("{");
204a159c266SJung-uk Kim 
205a159c266SJung-uk Kim     /* Examine each bit */
206a159c266SJung-uk Kim 
207a159c266SJung-uk Kim     for (i = 0; i < 16; i++)
208a159c266SJung-uk Kim     {
209a159c266SJung-uk Kim         /* Only interested in bits that are set to 1 */
210a159c266SJung-uk Kim 
211a159c266SJung-uk Kim         if (Mask & 1)
212a159c266SJung-uk Kim         {
213a159c266SJung-uk Kim             if (Previous)
214a159c266SJung-uk Kim             {
215a159c266SJung-uk Kim                 AcpiOsPrintf (",");
216a159c266SJung-uk Kim             }
217a159c266SJung-uk Kim             Previous = TRUE;
218a159c266SJung-uk Kim             AcpiOsPrintf ("%u", i);
219a159c266SJung-uk Kim         }
220a159c266SJung-uk Kim 
221a159c266SJung-uk Kim         Mask >>= 1;
222a159c266SJung-uk Kim     }
223a159c266SJung-uk Kim 
224a159c266SJung-uk Kim     /* Close list */
225a159c266SJung-uk Kim 
226a159c266SJung-uk Kim     AcpiOsPrintf ("}\n");
227a159c266SJung-uk Kim }
228a159c266SJung-uk Kim 
229a159c266SJung-uk Kim 
230a159c266SJung-uk Kim /*******************************************************************************
231a159c266SJung-uk Kim  *
232a159c266SJung-uk Kim  * FUNCTION:    AcpiDmResourceTemplate
233a159c266SJung-uk Kim  *
234a159c266SJung-uk Kim  * PARAMETERS:  Info            - Curent parse tree walk info
235a159c266SJung-uk Kim  *              ByteData        - Pointer to the byte list data
236a159c266SJung-uk Kim  *              ByteCount       - Length of the byte list
237a159c266SJung-uk Kim  *
238a159c266SJung-uk Kim  * RETURN:      None
239a159c266SJung-uk Kim  *
240a159c266SJung-uk Kim  * DESCRIPTION: Dump the contents of a Resource Template containing a set of
241a159c266SJung-uk Kim  *              Resource Descriptors.
242a159c266SJung-uk Kim  *
243a159c266SJung-uk Kim  ******************************************************************************/
244a159c266SJung-uk Kim 
245a159c266SJung-uk Kim void
246a159c266SJung-uk Kim AcpiDmResourceTemplate (
247a159c266SJung-uk Kim     ACPI_OP_WALK_INFO       *Info,
248a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
249a159c266SJung-uk Kim     UINT8                   *ByteData,
250a159c266SJung-uk Kim     UINT32                  ByteCount)
251a159c266SJung-uk Kim {
252a159c266SJung-uk Kim     ACPI_STATUS             Status;
253a159c266SJung-uk Kim     UINT32                  CurrentByteOffset;
254a159c266SJung-uk Kim     UINT8                   ResourceType;
255a159c266SJung-uk Kim     UINT32                  ResourceLength;
256a159c266SJung-uk Kim     void                    *Aml;
257a159c266SJung-uk Kim     UINT32                  Level;
258a159c266SJung-uk Kim     BOOLEAN                 DependentFns = FALSE;
259a159c266SJung-uk Kim     UINT8                   ResourceIndex;
260a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
261a159c266SJung-uk Kim 
262a159c266SJung-uk Kim 
263a159c266SJung-uk Kim     Level = Info->Level;
264a159c266SJung-uk Kim     ResourceName = ACPI_DEFAULT_RESNAME;
265a159c266SJung-uk Kim     Node = Op->Common.Node;
266a159c266SJung-uk Kim     if (Node)
267a159c266SJung-uk Kim     {
268a159c266SJung-uk Kim         Node = Node->Child;
269a159c266SJung-uk Kim     }
270a159c266SJung-uk Kim 
271a159c266SJung-uk Kim     for (CurrentByteOffset = 0; CurrentByteOffset < ByteCount;)
272a159c266SJung-uk Kim     {
273a159c266SJung-uk Kim         Aml = &ByteData[CurrentByteOffset];
274a159c266SJung-uk Kim 
275a159c266SJung-uk Kim         /* Get the descriptor type and length */
276a159c266SJung-uk Kim 
277a159c266SJung-uk Kim         ResourceType = AcpiUtGetResourceType (Aml);
278a159c266SJung-uk Kim         ResourceLength = AcpiUtGetResourceLength (Aml);
279a159c266SJung-uk Kim 
280a159c266SJung-uk Kim         /* Validate the Resource Type and Resource Length */
281a159c266SJung-uk Kim 
282*ed17e06eSJung-uk Kim         Status = AcpiUtValidateResource (NULL, Aml, &ResourceIndex);
283a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
284a159c266SJung-uk Kim         {
285a159c266SJung-uk Kim             AcpiOsPrintf ("/*** Could not validate Resource, type (%X) %s***/\n",
286a159c266SJung-uk Kim                 ResourceType, AcpiFormatException (Status));
287a159c266SJung-uk Kim             return;
288a159c266SJung-uk Kim         }
289a159c266SJung-uk Kim 
290a159c266SJung-uk Kim         /* Point to next descriptor */
291a159c266SJung-uk Kim 
292a159c266SJung-uk Kim         CurrentByteOffset += AcpiUtGetDescriptorLength (Aml);
293a159c266SJung-uk Kim 
294a159c266SJung-uk Kim         /* Descriptor pre-processing */
295a159c266SJung-uk Kim 
296a159c266SJung-uk Kim         switch (ResourceType)
297a159c266SJung-uk Kim         {
298a159c266SJung-uk Kim         case ACPI_RESOURCE_NAME_START_DEPENDENT:
299a159c266SJung-uk Kim 
300a159c266SJung-uk Kim             /* Finish a previous StartDependentFns */
301a159c266SJung-uk Kim 
302a159c266SJung-uk Kim             if (DependentFns)
303a159c266SJung-uk Kim             {
304a159c266SJung-uk Kim                 Level--;
305a159c266SJung-uk Kim                 AcpiDmIndent (Level);
306a159c266SJung-uk Kim                 AcpiOsPrintf ("}\n");
307a159c266SJung-uk Kim             }
308a159c266SJung-uk Kim             break;
309a159c266SJung-uk Kim 
310a159c266SJung-uk Kim         case ACPI_RESOURCE_NAME_END_DEPENDENT:
311a159c266SJung-uk Kim 
312a159c266SJung-uk Kim             Level--;
313a159c266SJung-uk Kim             DependentFns = FALSE;
314a159c266SJung-uk Kim             break;
315a159c266SJung-uk Kim 
316a159c266SJung-uk Kim         case ACPI_RESOURCE_NAME_END_TAG:
317a159c266SJung-uk Kim 
318a159c266SJung-uk Kim             /* Normal exit, the resource list is finished */
319a159c266SJung-uk Kim 
320a159c266SJung-uk Kim             if (DependentFns)
321a159c266SJung-uk Kim             {
322a159c266SJung-uk Kim                 /*
323a159c266SJung-uk Kim                  * Close an open StartDependentDescriptor. This indicates a
324a159c266SJung-uk Kim                  * missing EndDependentDescriptor.
325a159c266SJung-uk Kim                  */
326a159c266SJung-uk Kim                 Level--;
327a159c266SJung-uk Kim                 DependentFns = FALSE;
328a159c266SJung-uk Kim 
329a159c266SJung-uk Kim                 /* Go ahead and insert EndDependentFn() */
330a159c266SJung-uk Kim 
331a159c266SJung-uk Kim                 AcpiDmEndDependentDescriptor (Aml, ResourceLength, Level);
332a159c266SJung-uk Kim 
333a159c266SJung-uk Kim                 AcpiDmIndent (Level);
334a159c266SJung-uk Kim                 AcpiOsPrintf (
335a159c266SJung-uk Kim                     "/*** Disassembler: inserted missing EndDependentFn () ***/\n");
336a159c266SJung-uk Kim             }
337a159c266SJung-uk Kim             return;
338a159c266SJung-uk Kim 
339a159c266SJung-uk Kim         default:
340a159c266SJung-uk Kim             break;
341a159c266SJung-uk Kim         }
342a159c266SJung-uk Kim 
343a159c266SJung-uk Kim         /* Disassemble the resource structure */
344a159c266SJung-uk Kim 
345a159c266SJung-uk Kim         if (Node)
346a159c266SJung-uk Kim         {
347a159c266SJung-uk Kim             ResourceName = Node->Name.Integer;
348a159c266SJung-uk Kim             Node = Node->Peer;
349a159c266SJung-uk Kim         }
350a159c266SJung-uk Kim 
351a159c266SJung-uk Kim         AcpiGbl_DmResourceDispatch [ResourceIndex] (
352a159c266SJung-uk Kim             Aml, ResourceLength, Level);
353a159c266SJung-uk Kim 
354a159c266SJung-uk Kim         /* Descriptor post-processing */
355a159c266SJung-uk Kim 
356a159c266SJung-uk Kim         if (ResourceType == ACPI_RESOURCE_NAME_START_DEPENDENT)
357a159c266SJung-uk Kim         {
358a159c266SJung-uk Kim             DependentFns = TRUE;
359a159c266SJung-uk Kim             Level++;
360a159c266SJung-uk Kim         }
361a159c266SJung-uk Kim     }
362a159c266SJung-uk Kim }
363a159c266SJung-uk Kim 
364a159c266SJung-uk Kim 
365a159c266SJung-uk Kim /*******************************************************************************
366a159c266SJung-uk Kim  *
367a159c266SJung-uk Kim  * FUNCTION:    AcpiDmIsResourceTemplate
368a159c266SJung-uk Kim  *
369*ed17e06eSJung-uk Kim  * PARAMETERS:  WalkState           - Current walk info
370*ed17e06eSJung-uk Kim  *              Op                  - Buffer Op to be examined
371a159c266SJung-uk Kim  *
372a159c266SJung-uk Kim  * RETURN:      Status. AE_OK if valid template
373a159c266SJung-uk Kim  *
374a159c266SJung-uk Kim  * DESCRIPTION: Walk a byte list to determine if it consists of a valid set
375a159c266SJung-uk Kim  *              of resource descriptors. Nothing is output.
376a159c266SJung-uk Kim  *
377a159c266SJung-uk Kim  ******************************************************************************/
378a159c266SJung-uk Kim 
379a159c266SJung-uk Kim ACPI_STATUS
380a159c266SJung-uk Kim AcpiDmIsResourceTemplate (
381*ed17e06eSJung-uk Kim     ACPI_WALK_STATE         *WalkState,
382a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *Op)
383a159c266SJung-uk Kim {
384a159c266SJung-uk Kim     ACPI_STATUS             Status;
385a159c266SJung-uk Kim     ACPI_PARSE_OBJECT       *NextOp;
386a159c266SJung-uk Kim     UINT8                   *Aml;
387a159c266SJung-uk Kim     UINT8                   *EndAml;
388a159c266SJung-uk Kim     ACPI_SIZE               Length;
389a159c266SJung-uk Kim 
390a159c266SJung-uk Kim 
391a159c266SJung-uk Kim     /* This op must be a buffer */
392a159c266SJung-uk Kim 
393a159c266SJung-uk Kim     if (Op->Common.AmlOpcode != AML_BUFFER_OP)
394a159c266SJung-uk Kim     {
395a159c266SJung-uk Kim         return (AE_TYPE);
396a159c266SJung-uk Kim     }
397a159c266SJung-uk Kim 
398a159c266SJung-uk Kim     /* Get the ByteData list and length */
399a159c266SJung-uk Kim 
400a159c266SJung-uk Kim     NextOp = Op->Common.Value.Arg;
401*ed17e06eSJung-uk Kim     if (!NextOp)
402*ed17e06eSJung-uk Kim     {
403*ed17e06eSJung-uk Kim         AcpiOsPrintf ("NULL byte list in buffer\n");
404*ed17e06eSJung-uk Kim         return (AE_TYPE);
405*ed17e06eSJung-uk Kim     }
406*ed17e06eSJung-uk Kim 
407a159c266SJung-uk Kim     NextOp = NextOp->Common.Next;
408a159c266SJung-uk Kim     if (!NextOp)
409a159c266SJung-uk Kim     {
410a159c266SJung-uk Kim         return (AE_TYPE);
411a159c266SJung-uk Kim     }
412a159c266SJung-uk Kim 
413a159c266SJung-uk Kim     Aml = NextOp->Named.Data;
414a159c266SJung-uk Kim     Length = (ACPI_SIZE) NextOp->Common.Value.Integer;
415a159c266SJung-uk Kim 
416a159c266SJung-uk Kim     /* Walk the byte list, abort on any invalid descriptor type or length */
417a159c266SJung-uk Kim 
418*ed17e06eSJung-uk Kim     Status = AcpiUtWalkAmlResources (WalkState, Aml, Length, NULL, &EndAml);
419a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
420a159c266SJung-uk Kim     {
421a159c266SJung-uk Kim         return (AE_TYPE);
422a159c266SJung-uk Kim     }
423a159c266SJung-uk Kim 
424a159c266SJung-uk Kim     /*
425a159c266SJung-uk Kim      * For the resource template to be valid, one EndTag must appear
426a159c266SJung-uk Kim      * at the very end of the ByteList, not before. (For proper disassembly
427a159c266SJung-uk Kim      * of a ResourceTemplate, the buffer must not have any extra data after
428a159c266SJung-uk Kim      * the EndTag.)
429a159c266SJung-uk Kim      */
430a159c266SJung-uk Kim     if ((Aml + Length - sizeof (AML_RESOURCE_END_TAG)) != EndAml)
431a159c266SJung-uk Kim     {
432a159c266SJung-uk Kim         return (AE_AML_NO_RESOURCE_END_TAG);
433a159c266SJung-uk Kim     }
434a159c266SJung-uk Kim 
435a159c266SJung-uk Kim     /*
436a159c266SJung-uk Kim      * All resource descriptors are valid, therefore this list appears
437a159c266SJung-uk Kim      * to be a valid resource template
438a159c266SJung-uk Kim      */
439a159c266SJung-uk Kim     return (AE_OK);
440a159c266SJung-uk Kim }
441a159c266SJung-uk Kim 
442a159c266SJung-uk Kim #endif
443