1a9643ea8Slogwang /*******************************************************************************
2a9643ea8Slogwang  *
3a9643ea8Slogwang  * Module Name: dbcmds - Miscellaneous debug commands and output routines
4a9643ea8Slogwang  *
5a9643ea8Slogwang  ******************************************************************************/
6a9643ea8Slogwang 
7*22ce4affSfengbojiang /******************************************************************************
8*22ce4affSfengbojiang  *
9*22ce4affSfengbojiang  * 1. Copyright Notice
10*22ce4affSfengbojiang  *
11*22ce4affSfengbojiang  * Some or all of this work - Copyright (c) 1999 - 2020, Intel Corp.
12a9643ea8Slogwang  * All rights reserved.
13a9643ea8Slogwang  *
14*22ce4affSfengbojiang  * 2. License
15*22ce4affSfengbojiang  *
16*22ce4affSfengbojiang  * 2.1. This is your license from Intel Corp. under its intellectual property
17*22ce4affSfengbojiang  * rights. You may have additional license terms from the party that provided
18*22ce4affSfengbojiang  * you this software, covering your right to use that party's intellectual
19*22ce4affSfengbojiang  * property rights.
20*22ce4affSfengbojiang  *
21*22ce4affSfengbojiang  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22*22ce4affSfengbojiang  * copy of the source code appearing in this file ("Covered Code") an
23*22ce4affSfengbojiang  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24*22ce4affSfengbojiang  * base code distributed originally by Intel ("Original Intel Code") to copy,
25*22ce4affSfengbojiang  * make derivatives, distribute, use and display any portion of the Covered
26*22ce4affSfengbojiang  * Code in any form, with the right to sublicense such rights; and
27*22ce4affSfengbojiang  *
28*22ce4affSfengbojiang  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29*22ce4affSfengbojiang  * license (with the right to sublicense), under only those claims of Intel
30*22ce4affSfengbojiang  * patents that are infringed by the Original Intel Code, to make, use, sell,
31*22ce4affSfengbojiang  * offer to sell, and import the Covered Code and derivative works thereof
32*22ce4affSfengbojiang  * solely to the minimum extent necessary to exercise the above copyright
33*22ce4affSfengbojiang  * license, and in no event shall the patent license extend to any additions
34*22ce4affSfengbojiang  * to or modifications of the Original Intel Code. No other license or right
35*22ce4affSfengbojiang  * is granted directly or by implication, estoppel or otherwise;
36*22ce4affSfengbojiang  *
37*22ce4affSfengbojiang  * The above copyright and patent license is granted only if the following
38*22ce4affSfengbojiang  * conditions are met:
39*22ce4affSfengbojiang  *
40*22ce4affSfengbojiang  * 3. Conditions
41*22ce4affSfengbojiang  *
42*22ce4affSfengbojiang  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43*22ce4affSfengbojiang  * Redistribution of source code of any substantial portion of the Covered
44*22ce4affSfengbojiang  * Code or modification with rights to further distribute source must include
45*22ce4affSfengbojiang  * the above Copyright Notice, the above License, this list of Conditions,
46*22ce4affSfengbojiang  * and the following Disclaimer and Export Compliance provision. In addition,
47*22ce4affSfengbojiang  * Licensee must cause all Covered Code to which Licensee contributes to
48*22ce4affSfengbojiang  * contain a file documenting the changes Licensee made to create that Covered
49*22ce4affSfengbojiang  * Code and the date of any change. Licensee must include in that file the
50*22ce4affSfengbojiang  * documentation of any changes made by any predecessor Licensee. Licensee
51*22ce4affSfengbojiang  * must include a prominent statement that the modification is derived,
52*22ce4affSfengbojiang  * directly or indirectly, from Original Intel Code.
53*22ce4affSfengbojiang  *
54*22ce4affSfengbojiang  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55*22ce4affSfengbojiang  * Redistribution of source code of any substantial portion of the Covered
56*22ce4affSfengbojiang  * Code or modification without rights to further distribute source must
57*22ce4affSfengbojiang  * include the following Disclaimer and Export Compliance provision in the
58*22ce4affSfengbojiang  * documentation and/or other materials provided with distribution. In
59*22ce4affSfengbojiang  * addition, Licensee may not authorize further sublicense of source of any
60*22ce4affSfengbojiang  * portion of the Covered Code, and must include terms to the effect that the
61*22ce4affSfengbojiang  * license from Licensee to its licensee is limited to the intellectual
62*22ce4affSfengbojiang  * property embodied in the software Licensee provides to its licensee, and
63*22ce4affSfengbojiang  * not to intellectual property embodied in modifications its licensee may
64*22ce4affSfengbojiang  * make.
65*22ce4affSfengbojiang  *
66*22ce4affSfengbojiang  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67*22ce4affSfengbojiang  * substantial portion of the Covered Code or modification must reproduce the
68*22ce4affSfengbojiang  * above Copyright Notice, and the following Disclaimer and Export Compliance
69*22ce4affSfengbojiang  * provision in the documentation and/or other materials provided with the
70*22ce4affSfengbojiang  * distribution.
71*22ce4affSfengbojiang  *
72*22ce4affSfengbojiang  * 3.4. Intel retains all right, title, and interest in and to the Original
73*22ce4affSfengbojiang  * Intel Code.
74*22ce4affSfengbojiang  *
75*22ce4affSfengbojiang  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76*22ce4affSfengbojiang  * Intel shall be used in advertising or otherwise to promote the sale, use or
77*22ce4affSfengbojiang  * other dealings in products derived from or relating to the Covered Code
78*22ce4affSfengbojiang  * without prior written authorization from Intel.
79*22ce4affSfengbojiang  *
80*22ce4affSfengbojiang  * 4. Disclaimer and Export Compliance
81*22ce4affSfengbojiang  *
82*22ce4affSfengbojiang  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83*22ce4affSfengbojiang  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84*22ce4affSfengbojiang  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85*22ce4affSfengbojiang  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86*22ce4affSfengbojiang  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87*22ce4affSfengbojiang  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88*22ce4affSfengbojiang  * PARTICULAR PURPOSE.
89*22ce4affSfengbojiang  *
90*22ce4affSfengbojiang  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91*22ce4affSfengbojiang  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92*22ce4affSfengbojiang  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93*22ce4affSfengbojiang  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94*22ce4affSfengbojiang  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95*22ce4affSfengbojiang  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96*22ce4affSfengbojiang  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97*22ce4affSfengbojiang  * LIMITED REMEDY.
98*22ce4affSfengbojiang  *
99*22ce4affSfengbojiang  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100*22ce4affSfengbojiang  * software or system incorporating such software without first obtaining any
101*22ce4affSfengbojiang  * required license or other approval from the U. S. Department of Commerce or
102*22ce4affSfengbojiang  * any other agency or department of the United States Government. In the
103*22ce4affSfengbojiang  * event Licensee exports any such software from the United States or
104*22ce4affSfengbojiang  * re-exports any such software from a foreign destination, Licensee shall
105*22ce4affSfengbojiang  * ensure that the distribution and export/re-export of the software is in
106*22ce4affSfengbojiang  * compliance with all laws, regulations, orders, or other restrictions of the
107*22ce4affSfengbojiang  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108*22ce4affSfengbojiang  * any of its subsidiaries will export/re-export any technical data, process,
109*22ce4affSfengbojiang  * software, or service, directly or indirectly, to any country for which the
110*22ce4affSfengbojiang  * United States government or any agency thereof requires an export license,
111*22ce4affSfengbojiang  * other governmental approval, or letter of assurance, without first obtaining
112*22ce4affSfengbojiang  * such license, approval or letter.
113*22ce4affSfengbojiang  *
114*22ce4affSfengbojiang  *****************************************************************************
115*22ce4affSfengbojiang  *
116*22ce4affSfengbojiang  * Alternatively, you may choose to be licensed under the terms of the
117*22ce4affSfengbojiang  * following license:
118*22ce4affSfengbojiang  *
119a9643ea8Slogwang  * Redistribution and use in source and binary forms, with or without
120a9643ea8Slogwang  * modification, are permitted provided that the following conditions
121a9643ea8Slogwang  * are met:
122a9643ea8Slogwang  * 1. Redistributions of source code must retain the above copyright
123a9643ea8Slogwang  *    notice, this list of conditions, and the following disclaimer,
124a9643ea8Slogwang  *    without modification.
125a9643ea8Slogwang  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126a9643ea8Slogwang  *    substantially similar to the "NO WARRANTY" disclaimer below
127a9643ea8Slogwang  *    ("Disclaimer") and any redistribution must be conditioned upon
128a9643ea8Slogwang  *    including a substantially similar Disclaimer requirement for further
129a9643ea8Slogwang  *    binary redistribution.
130a9643ea8Slogwang  * 3. Neither the names of the above-listed copyright holders nor the names
131a9643ea8Slogwang  *    of any contributors may be used to endorse or promote products derived
132a9643ea8Slogwang  *    from this software without specific prior written permission.
133a9643ea8Slogwang  *
134*22ce4affSfengbojiang  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135*22ce4affSfengbojiang  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136*22ce4affSfengbojiang  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137*22ce4affSfengbojiang  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138*22ce4affSfengbojiang  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139*22ce4affSfengbojiang  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140*22ce4affSfengbojiang  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141*22ce4affSfengbojiang  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142*22ce4affSfengbojiang  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143*22ce4affSfengbojiang  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144*22ce4affSfengbojiang  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145*22ce4affSfengbojiang  *
146*22ce4affSfengbojiang  * Alternatively, you may choose to be licensed under the terms of the
147a9643ea8Slogwang  * GNU General Public License ("GPL") version 2 as published by the Free
148a9643ea8Slogwang  * Software Foundation.
149a9643ea8Slogwang  *
150*22ce4affSfengbojiang  *****************************************************************************/
151a9643ea8Slogwang 
152a9643ea8Slogwang #include <contrib/dev/acpica/include/acpi.h>
153a9643ea8Slogwang #include <contrib/dev/acpica/include/accommon.h>
154a9643ea8Slogwang #include <contrib/dev/acpica/include/acevents.h>
155a9643ea8Slogwang #include <contrib/dev/acpica/include/acdebug.h>
156a9643ea8Slogwang #include <contrib/dev/acpica/include/acnamesp.h>
157a9643ea8Slogwang #include <contrib/dev/acpica/include/acresrc.h>
158a9643ea8Slogwang #include <contrib/dev/acpica/include/actables.h>
159a9643ea8Slogwang 
160a9643ea8Slogwang 
161a9643ea8Slogwang #define _COMPONENT          ACPI_CA_DEBUGGER
162a9643ea8Slogwang         ACPI_MODULE_NAME    ("dbcmds")
163a9643ea8Slogwang 
164a9643ea8Slogwang 
165a9643ea8Slogwang /* Local prototypes */
166a9643ea8Slogwang 
167a9643ea8Slogwang static void
168a9643ea8Slogwang AcpiDmCompareAmlResources (
169a9643ea8Slogwang     UINT8                   *Aml1Buffer,
170a9643ea8Slogwang     ACPI_RSDESC_SIZE        Aml1BufferLength,
171a9643ea8Slogwang     UINT8                   *Aml2Buffer,
172a9643ea8Slogwang     ACPI_RSDESC_SIZE        Aml2BufferLength);
173a9643ea8Slogwang 
174a9643ea8Slogwang static ACPI_STATUS
175a9643ea8Slogwang AcpiDmTestResourceConversion (
176a9643ea8Slogwang     ACPI_NAMESPACE_NODE     *Node,
177a9643ea8Slogwang     char                    *Name);
178a9643ea8Slogwang 
179a9643ea8Slogwang static ACPI_STATUS
180a9643ea8Slogwang AcpiDbResourceCallback (
181a9643ea8Slogwang     ACPI_RESOURCE           *Resource,
182a9643ea8Slogwang     void                    *Context);
183a9643ea8Slogwang 
184a9643ea8Slogwang static ACPI_STATUS
185a9643ea8Slogwang AcpiDbDeviceResources (
186a9643ea8Slogwang     ACPI_HANDLE             ObjHandle,
187a9643ea8Slogwang     UINT32                  NestingLevel,
188a9643ea8Slogwang     void                    *Context,
189a9643ea8Slogwang     void                    **ReturnValue);
190a9643ea8Slogwang 
191a9643ea8Slogwang static void
192a9643ea8Slogwang AcpiDbDoOneSleepState (
193a9643ea8Slogwang     UINT8                   SleepState);
194a9643ea8Slogwang 
195a9643ea8Slogwang 
196a9643ea8Slogwang static char                 *AcpiDbTraceMethodName = NULL;
197a9643ea8Slogwang 
198a9643ea8Slogwang 
199a9643ea8Slogwang /*******************************************************************************
200a9643ea8Slogwang  *
201a9643ea8Slogwang  * FUNCTION:    AcpiDbConvertToNode
202a9643ea8Slogwang  *
203a9643ea8Slogwang  * PARAMETERS:  InString            - String to convert
204a9643ea8Slogwang  *
205a9643ea8Slogwang  * RETURN:      Pointer to a NS node
206a9643ea8Slogwang  *
207a9643ea8Slogwang  * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or
208a9643ea8Slogwang  *              alphanumeric strings.
209a9643ea8Slogwang  *
210a9643ea8Slogwang  ******************************************************************************/
211a9643ea8Slogwang 
212a9643ea8Slogwang ACPI_NAMESPACE_NODE *
AcpiDbConvertToNode(char * InString)213a9643ea8Slogwang AcpiDbConvertToNode (
214a9643ea8Slogwang     char                    *InString)
215a9643ea8Slogwang {
216a9643ea8Slogwang     ACPI_NAMESPACE_NODE     *Node;
217a9643ea8Slogwang     ACPI_SIZE               Address;
218a9643ea8Slogwang 
219a9643ea8Slogwang 
220a9643ea8Slogwang     if ((*InString >= 0x30) && (*InString <= 0x39))
221a9643ea8Slogwang     {
222a9643ea8Slogwang         /* Numeric argument, convert */
223a9643ea8Slogwang 
224a9643ea8Slogwang         Address = strtoul (InString, NULL, 16);
225a9643ea8Slogwang         Node = ACPI_TO_POINTER (Address);
226a9643ea8Slogwang         if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE)))
227a9643ea8Slogwang         {
228a9643ea8Slogwang             AcpiOsPrintf ("Address %p is invalid", Node);
229a9643ea8Slogwang             return (NULL);
230a9643ea8Slogwang         }
231a9643ea8Slogwang 
232a9643ea8Slogwang         /* Make sure pointer is valid NS node */
233a9643ea8Slogwang 
234a9643ea8Slogwang         if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
235a9643ea8Slogwang         {
236a9643ea8Slogwang             AcpiOsPrintf ("Address %p is not a valid namespace node [%s]\n",
237a9643ea8Slogwang                 Node, AcpiUtGetDescriptorName (Node));
238a9643ea8Slogwang             return (NULL);
239a9643ea8Slogwang         }
240a9643ea8Slogwang     }
241a9643ea8Slogwang     else
242a9643ea8Slogwang     {
243a9643ea8Slogwang         /*
244a9643ea8Slogwang          * Alpha argument: The parameter is a name string that must be
245a9643ea8Slogwang          * resolved to a Namespace object.
246a9643ea8Slogwang          */
247a9643ea8Slogwang         Node = AcpiDbLocalNsLookup (InString);
248a9643ea8Slogwang         if (!Node)
249a9643ea8Slogwang         {
250a9643ea8Slogwang             AcpiOsPrintf (
251a9643ea8Slogwang                 "Could not find [%s] in namespace, defaulting to root node\n",
252a9643ea8Slogwang                 InString);
253a9643ea8Slogwang             Node = AcpiGbl_RootNode;
254a9643ea8Slogwang         }
255a9643ea8Slogwang     }
256a9643ea8Slogwang 
257a9643ea8Slogwang     return (Node);
258a9643ea8Slogwang }
259a9643ea8Slogwang 
260a9643ea8Slogwang 
261a9643ea8Slogwang /*******************************************************************************
262a9643ea8Slogwang  *
263a9643ea8Slogwang  * FUNCTION:    AcpiDbSleep
264a9643ea8Slogwang  *
265a9643ea8Slogwang  * PARAMETERS:  ObjectArg           - Desired sleep state (0-5). NULL means
266a9643ea8Slogwang  *                                    invoke all possible sleep states.
267a9643ea8Slogwang  *
268a9643ea8Slogwang  * RETURN:      Status
269a9643ea8Slogwang  *
270a9643ea8Slogwang  * DESCRIPTION: Simulate sleep/wake sequences
271a9643ea8Slogwang  *
272a9643ea8Slogwang  ******************************************************************************/
273a9643ea8Slogwang 
274a9643ea8Slogwang ACPI_STATUS
AcpiDbSleep(char * ObjectArg)275a9643ea8Slogwang AcpiDbSleep (
276a9643ea8Slogwang     char                    *ObjectArg)
277a9643ea8Slogwang {
278a9643ea8Slogwang     UINT8                   SleepState;
279a9643ea8Slogwang     UINT32                  i;
280a9643ea8Slogwang 
281a9643ea8Slogwang 
282a9643ea8Slogwang     ACPI_FUNCTION_TRACE (AcpiDbSleep);
283a9643ea8Slogwang 
284a9643ea8Slogwang 
285a9643ea8Slogwang     /* Null input (no arguments) means to invoke all sleep states */
286a9643ea8Slogwang 
287a9643ea8Slogwang     if (!ObjectArg)
288a9643ea8Slogwang     {
289a9643ea8Slogwang         AcpiOsPrintf ("Invoking all possible sleep states, 0-%d\n",
290a9643ea8Slogwang             ACPI_S_STATES_MAX);
291a9643ea8Slogwang 
292a9643ea8Slogwang         for (i = 0; i <= ACPI_S_STATES_MAX; i++)
293a9643ea8Slogwang         {
294a9643ea8Slogwang             AcpiDbDoOneSleepState ((UINT8) i);
295a9643ea8Slogwang         }
296a9643ea8Slogwang 
297a9643ea8Slogwang         return_ACPI_STATUS (AE_OK);
298a9643ea8Slogwang     }
299a9643ea8Slogwang 
300a9643ea8Slogwang     /* Convert argument to binary and invoke the sleep state */
301a9643ea8Slogwang 
302a9643ea8Slogwang     SleepState = (UINT8) strtoul (ObjectArg, NULL, 0);
303a9643ea8Slogwang     AcpiDbDoOneSleepState (SleepState);
304a9643ea8Slogwang     return_ACPI_STATUS (AE_OK);
305a9643ea8Slogwang }
306a9643ea8Slogwang 
307a9643ea8Slogwang 
308a9643ea8Slogwang /*******************************************************************************
309a9643ea8Slogwang  *
310a9643ea8Slogwang  * FUNCTION:    AcpiDbDoOneSleepState
311a9643ea8Slogwang  *
312a9643ea8Slogwang  * PARAMETERS:  SleepState          - Desired sleep state (0-5)
313a9643ea8Slogwang  *
314a9643ea8Slogwang  * RETURN:      None
315a9643ea8Slogwang  *
316a9643ea8Slogwang  * DESCRIPTION: Simulate a sleep/wake sequence
317a9643ea8Slogwang  *
318a9643ea8Slogwang  ******************************************************************************/
319a9643ea8Slogwang 
320a9643ea8Slogwang static void
AcpiDbDoOneSleepState(UINT8 SleepState)321a9643ea8Slogwang AcpiDbDoOneSleepState (
322a9643ea8Slogwang     UINT8                   SleepState)
323a9643ea8Slogwang {
324a9643ea8Slogwang     ACPI_STATUS             Status;
325a9643ea8Slogwang     UINT8                   SleepTypeA;
326a9643ea8Slogwang     UINT8                   SleepTypeB;
327a9643ea8Slogwang 
328a9643ea8Slogwang 
329a9643ea8Slogwang     /* Validate parameter */
330a9643ea8Slogwang 
331a9643ea8Slogwang     if (SleepState > ACPI_S_STATES_MAX)
332a9643ea8Slogwang     {
333a9643ea8Slogwang         AcpiOsPrintf ("Sleep state %d out of range (%d max)\n",
334a9643ea8Slogwang             SleepState, ACPI_S_STATES_MAX);
335a9643ea8Slogwang         return;
336a9643ea8Slogwang     }
337a9643ea8Slogwang 
338a9643ea8Slogwang     AcpiOsPrintf ("\n---- Invoking sleep state S%d (%s):\n",
339a9643ea8Slogwang         SleepState, AcpiGbl_SleepStateNames[SleepState]);
340a9643ea8Slogwang 
341a9643ea8Slogwang     /* Get the values for the sleep type registers (for display only) */
342a9643ea8Slogwang 
343a9643ea8Slogwang     Status = AcpiGetSleepTypeData (SleepState, &SleepTypeA, &SleepTypeB);
344a9643ea8Slogwang     if (ACPI_FAILURE (Status))
345a9643ea8Slogwang     {
346a9643ea8Slogwang         AcpiOsPrintf ("Could not evaluate [%s] method, %s\n",
347a9643ea8Slogwang             AcpiGbl_SleepStateNames[SleepState],
348a9643ea8Slogwang             AcpiFormatException (Status));
349a9643ea8Slogwang         return;
350a9643ea8Slogwang     }
351a9643ea8Slogwang 
352a9643ea8Slogwang     AcpiOsPrintf (
353a9643ea8Slogwang         "Register values for sleep state S%d: Sleep-A: %.2X, Sleep-B: %.2X\n",
354a9643ea8Slogwang         SleepState, SleepTypeA, SleepTypeB);
355a9643ea8Slogwang 
356a9643ea8Slogwang     /* Invoke the various sleep/wake interfaces */
357a9643ea8Slogwang 
358a9643ea8Slogwang     AcpiOsPrintf ("**** Sleep: Prepare to sleep (S%d) ****\n",
359a9643ea8Slogwang         SleepState);
360a9643ea8Slogwang     Status = AcpiEnterSleepStatePrep (SleepState);
361a9643ea8Slogwang     if (ACPI_FAILURE (Status))
362a9643ea8Slogwang     {
363a9643ea8Slogwang         goto ErrorExit;
364a9643ea8Slogwang     }
365a9643ea8Slogwang 
366a9643ea8Slogwang     AcpiOsPrintf ("**** Sleep: Going to sleep (S%d) ****\n",
367a9643ea8Slogwang         SleepState);
368a9643ea8Slogwang     Status = AcpiEnterSleepState (SleepState);
369a9643ea8Slogwang     if (ACPI_FAILURE (Status))
370a9643ea8Slogwang     {
371a9643ea8Slogwang         goto ErrorExit;
372a9643ea8Slogwang     }
373a9643ea8Slogwang 
374a9643ea8Slogwang     AcpiOsPrintf ("**** Wake: Prepare to return from sleep (S%d) ****\n",
375a9643ea8Slogwang         SleepState);
376a9643ea8Slogwang     Status = AcpiLeaveSleepStatePrep (SleepState);
377a9643ea8Slogwang     if (ACPI_FAILURE (Status))
378a9643ea8Slogwang     {
379a9643ea8Slogwang         goto ErrorExit;
380a9643ea8Slogwang     }
381a9643ea8Slogwang 
382a9643ea8Slogwang     AcpiOsPrintf ("**** Wake: Return from sleep (S%d) ****\n",
383a9643ea8Slogwang         SleepState);
384a9643ea8Slogwang     Status = AcpiLeaveSleepState (SleepState);
385a9643ea8Slogwang     if (ACPI_FAILURE (Status))
386a9643ea8Slogwang     {
387a9643ea8Slogwang         goto ErrorExit;
388a9643ea8Slogwang     }
389a9643ea8Slogwang 
390a9643ea8Slogwang     return;
391a9643ea8Slogwang 
392a9643ea8Slogwang 
393a9643ea8Slogwang ErrorExit:
394a9643ea8Slogwang     ACPI_EXCEPTION ((AE_INFO, Status, "During invocation of sleep state S%d",
395a9643ea8Slogwang         SleepState));
396a9643ea8Slogwang }
397a9643ea8Slogwang 
398a9643ea8Slogwang 
399a9643ea8Slogwang /*******************************************************************************
400a9643ea8Slogwang  *
401a9643ea8Slogwang  * FUNCTION:    AcpiDbDisplayLocks
402a9643ea8Slogwang  *
403a9643ea8Slogwang  * PARAMETERS:  None
404a9643ea8Slogwang  *
405a9643ea8Slogwang  * RETURN:      None
406a9643ea8Slogwang  *
407a9643ea8Slogwang  * DESCRIPTION: Display information about internal mutexes.
408a9643ea8Slogwang  *
409a9643ea8Slogwang  ******************************************************************************/
410a9643ea8Slogwang 
411a9643ea8Slogwang void
AcpiDbDisplayLocks(void)412a9643ea8Slogwang AcpiDbDisplayLocks (
413a9643ea8Slogwang     void)
414a9643ea8Slogwang {
415a9643ea8Slogwang     UINT32                  i;
416a9643ea8Slogwang 
417a9643ea8Slogwang 
418a9643ea8Slogwang     for (i = 0; i < ACPI_MAX_MUTEX; i++)
419a9643ea8Slogwang     {
420a9643ea8Slogwang         AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i),
421a9643ea8Slogwang             AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED
422a9643ea8Slogwang                 ? "Locked" : "Unlocked");
423a9643ea8Slogwang     }
424a9643ea8Slogwang }
425a9643ea8Slogwang 
426a9643ea8Slogwang 
427a9643ea8Slogwang /*******************************************************************************
428a9643ea8Slogwang  *
429a9643ea8Slogwang  * FUNCTION:    AcpiDbDisplayTableInfo
430a9643ea8Slogwang  *
431a9643ea8Slogwang  * PARAMETERS:  TableArg            - Name of table to be displayed
432a9643ea8Slogwang  *
433a9643ea8Slogwang  * RETURN:      None
434a9643ea8Slogwang  *
435a9643ea8Slogwang  * DESCRIPTION: Display information about loaded tables. Current
436a9643ea8Slogwang  *              implementation displays all loaded tables.
437a9643ea8Slogwang  *
438a9643ea8Slogwang  ******************************************************************************/
439a9643ea8Slogwang 
440a9643ea8Slogwang void
AcpiDbDisplayTableInfo(char * TableArg)441a9643ea8Slogwang AcpiDbDisplayTableInfo (
442a9643ea8Slogwang     char                    *TableArg)
443a9643ea8Slogwang {
444a9643ea8Slogwang     UINT32                  i;
445a9643ea8Slogwang     ACPI_TABLE_DESC         *TableDesc;
446a9643ea8Slogwang     ACPI_STATUS             Status;
447a9643ea8Slogwang 
448a9643ea8Slogwang 
449a9643ea8Slogwang     /* Header */
450a9643ea8Slogwang 
451a9643ea8Slogwang     AcpiOsPrintf ("Idx ID    Status Type                    "
452a9643ea8Slogwang         "TableHeader (Sig, Address, Length, Misc)\n");
453a9643ea8Slogwang 
454a9643ea8Slogwang     /* Walk the entire root table list */
455a9643ea8Slogwang 
456a9643ea8Slogwang     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
457a9643ea8Slogwang     {
458a9643ea8Slogwang         TableDesc = &AcpiGbl_RootTableList.Tables[i];
459a9643ea8Slogwang 
460a9643ea8Slogwang         /* Index and Table ID */
461a9643ea8Slogwang 
462a9643ea8Slogwang         AcpiOsPrintf ("%3u %.2u ", i, TableDesc->OwnerId);
463a9643ea8Slogwang 
464a9643ea8Slogwang         /* Decode the table flags */
465a9643ea8Slogwang 
466a9643ea8Slogwang         if (!(TableDesc->Flags & ACPI_TABLE_IS_LOADED))
467a9643ea8Slogwang         {
468a9643ea8Slogwang             AcpiOsPrintf ("NotLoaded ");
469a9643ea8Slogwang         }
470a9643ea8Slogwang         else
471a9643ea8Slogwang         {
472a9643ea8Slogwang             AcpiOsPrintf ("   Loaded ");
473a9643ea8Slogwang         }
474a9643ea8Slogwang 
475a9643ea8Slogwang         switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
476a9643ea8Slogwang         {
477a9643ea8Slogwang         case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
478a9643ea8Slogwang 
479a9643ea8Slogwang             AcpiOsPrintf ("External/virtual  ");
480a9643ea8Slogwang             break;
481a9643ea8Slogwang 
482a9643ea8Slogwang         case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
483a9643ea8Slogwang 
484a9643ea8Slogwang             AcpiOsPrintf ("Internal/physical ");
485a9643ea8Slogwang             break;
486a9643ea8Slogwang 
487a9643ea8Slogwang         case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
488a9643ea8Slogwang 
489a9643ea8Slogwang             AcpiOsPrintf ("Internal/virtual  ");
490a9643ea8Slogwang             break;
491a9643ea8Slogwang 
492a9643ea8Slogwang         default:
493a9643ea8Slogwang 
494a9643ea8Slogwang             AcpiOsPrintf ("INVALID TYPE      ");
495a9643ea8Slogwang             break;
496a9643ea8Slogwang         }
497a9643ea8Slogwang 
498a9643ea8Slogwang         /* Make sure that the table is mapped */
499a9643ea8Slogwang 
500a9643ea8Slogwang         Status = AcpiTbValidateTable (TableDesc);
501a9643ea8Slogwang         if (ACPI_FAILURE (Status))
502a9643ea8Slogwang         {
503a9643ea8Slogwang             return;
504a9643ea8Slogwang         }
505a9643ea8Slogwang 
506a9643ea8Slogwang         /* Dump the table header */
507a9643ea8Slogwang 
508a9643ea8Slogwang         if (TableDesc->Pointer)
509a9643ea8Slogwang         {
510a9643ea8Slogwang             AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer);
511a9643ea8Slogwang         }
512a9643ea8Slogwang         else
513a9643ea8Slogwang         {
514a9643ea8Slogwang             /* If the pointer is null, the table has been unloaded */
515a9643ea8Slogwang 
516a9643ea8Slogwang             ACPI_INFO (("%4.4s - Table has been unloaded",
517a9643ea8Slogwang                 TableDesc->Signature.Ascii));
518a9643ea8Slogwang         }
519a9643ea8Slogwang     }
520a9643ea8Slogwang }
521a9643ea8Slogwang 
522a9643ea8Slogwang 
523a9643ea8Slogwang /*******************************************************************************
524a9643ea8Slogwang  *
525a9643ea8Slogwang  * FUNCTION:    AcpiDbUnloadAcpiTable
526a9643ea8Slogwang  *
527a9643ea8Slogwang  * PARAMETERS:  ObjectName          - Namespace pathname for an object that
528a9643ea8Slogwang  *                                    is owned by the table to be unloaded
529a9643ea8Slogwang  *
530a9643ea8Slogwang  * RETURN:      None
531a9643ea8Slogwang  *
532a9643ea8Slogwang  * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned
533a9643ea8Slogwang  *              by the table.
534a9643ea8Slogwang  *
535a9643ea8Slogwang  ******************************************************************************/
536a9643ea8Slogwang 
537a9643ea8Slogwang void
AcpiDbUnloadAcpiTable(char * ObjectName)538a9643ea8Slogwang AcpiDbUnloadAcpiTable (
539a9643ea8Slogwang     char                    *ObjectName)
540a9643ea8Slogwang {
541a9643ea8Slogwang     ACPI_NAMESPACE_NODE     *Node;
542a9643ea8Slogwang     ACPI_STATUS             Status;
543a9643ea8Slogwang 
544a9643ea8Slogwang 
545a9643ea8Slogwang     /* Translate name to an Named object */
546a9643ea8Slogwang 
547a9643ea8Slogwang     Node = AcpiDbConvertToNode (ObjectName);
548a9643ea8Slogwang     if (!Node)
549a9643ea8Slogwang     {
550a9643ea8Slogwang         return;
551a9643ea8Slogwang     }
552a9643ea8Slogwang 
553a9643ea8Slogwang     Status = AcpiUnloadParentTable (ACPI_CAST_PTR (ACPI_HANDLE, Node));
554a9643ea8Slogwang     if (ACPI_SUCCESS (Status))
555a9643ea8Slogwang     {
556a9643ea8Slogwang         AcpiOsPrintf ("Parent of [%s] (%p) unloaded and uninstalled\n",
557a9643ea8Slogwang             ObjectName, Node);
558a9643ea8Slogwang     }
559a9643ea8Slogwang     else
560a9643ea8Slogwang     {
561a9643ea8Slogwang         AcpiOsPrintf ("%s, while unloading parent table of [%s]\n",
562a9643ea8Slogwang             AcpiFormatException (Status), ObjectName);
563a9643ea8Slogwang     }
564a9643ea8Slogwang }
565a9643ea8Slogwang 
566a9643ea8Slogwang 
567a9643ea8Slogwang /*******************************************************************************
568a9643ea8Slogwang  *
569a9643ea8Slogwang  * FUNCTION:    AcpiDbSendNotify
570a9643ea8Slogwang  *
571a9643ea8Slogwang  * PARAMETERS:  Name                - Name of ACPI object where to send notify
572a9643ea8Slogwang  *              Value               - Value of the notify to send.
573a9643ea8Slogwang  *
574a9643ea8Slogwang  * RETURN:      None
575a9643ea8Slogwang  *
576a9643ea8Slogwang  * DESCRIPTION: Send an ACPI notification. The value specified is sent to the
577a9643ea8Slogwang  *              named object as an ACPI notify.
578a9643ea8Slogwang  *
579a9643ea8Slogwang  ******************************************************************************/
580a9643ea8Slogwang 
581a9643ea8Slogwang void
AcpiDbSendNotify(char * Name,UINT32 Value)582a9643ea8Slogwang AcpiDbSendNotify (
583a9643ea8Slogwang     char                    *Name,
584a9643ea8Slogwang     UINT32                  Value)
585a9643ea8Slogwang {
586a9643ea8Slogwang     ACPI_NAMESPACE_NODE     *Node;
587a9643ea8Slogwang     ACPI_STATUS             Status;
588a9643ea8Slogwang 
589a9643ea8Slogwang 
590a9643ea8Slogwang     /* Translate name to an Named object */
591a9643ea8Slogwang 
592a9643ea8Slogwang     Node = AcpiDbConvertToNode (Name);
593a9643ea8Slogwang     if (!Node)
594a9643ea8Slogwang     {
595a9643ea8Slogwang         return;
596a9643ea8Slogwang     }
597a9643ea8Slogwang 
598a9643ea8Slogwang     /* Dispatch the notify if legal */
599a9643ea8Slogwang 
600a9643ea8Slogwang     if (AcpiEvIsNotifyObject (Node))
601a9643ea8Slogwang     {
602a9643ea8Slogwang         Status = AcpiEvQueueNotifyRequest (Node, Value);
603a9643ea8Slogwang         if (ACPI_FAILURE (Status))
604a9643ea8Slogwang         {
605a9643ea8Slogwang             AcpiOsPrintf ("Could not queue notify\n");
606a9643ea8Slogwang         }
607a9643ea8Slogwang     }
608a9643ea8Slogwang     else
609a9643ea8Slogwang     {
610a9643ea8Slogwang         AcpiOsPrintf (
611a9643ea8Slogwang             "Named object [%4.4s] Type %s, "
612a9643ea8Slogwang             "must be Device/Thermal/Processor type\n",
613a9643ea8Slogwang             AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type));
614a9643ea8Slogwang     }
615a9643ea8Slogwang }
616a9643ea8Slogwang 
617a9643ea8Slogwang 
618a9643ea8Slogwang /*******************************************************************************
619a9643ea8Slogwang  *
620a9643ea8Slogwang  * FUNCTION:    AcpiDbDisplayInterfaces
621a9643ea8Slogwang  *
622a9643ea8Slogwang  * PARAMETERS:  ActionArg           - Null, "install", or "remove"
623a9643ea8Slogwang  *              InterfaceNameArg    - Name for install/remove options
624a9643ea8Slogwang  *
625a9643ea8Slogwang  * RETURN:      None
626a9643ea8Slogwang  *
627a9643ea8Slogwang  * DESCRIPTION: Display or modify the global _OSI interface list
628a9643ea8Slogwang  *
629a9643ea8Slogwang  ******************************************************************************/
630a9643ea8Slogwang 
631a9643ea8Slogwang void
AcpiDbDisplayInterfaces(char * ActionArg,char * InterfaceNameArg)632a9643ea8Slogwang AcpiDbDisplayInterfaces (
633a9643ea8Slogwang     char                    *ActionArg,
634a9643ea8Slogwang     char                    *InterfaceNameArg)
635a9643ea8Slogwang {
636a9643ea8Slogwang     ACPI_INTERFACE_INFO     *NextInterface;
637a9643ea8Slogwang     char                    *SubString;
638a9643ea8Slogwang     ACPI_STATUS             Status;
639a9643ea8Slogwang 
640a9643ea8Slogwang 
641a9643ea8Slogwang     /* If no arguments, just display current interface list */
642a9643ea8Slogwang 
643a9643ea8Slogwang     if (!ActionArg)
644a9643ea8Slogwang     {
645a9643ea8Slogwang         (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER);
646a9643ea8Slogwang 
647a9643ea8Slogwang         NextInterface = AcpiGbl_SupportedInterfaces;
648a9643ea8Slogwang         while (NextInterface)
649a9643ea8Slogwang         {
650a9643ea8Slogwang             if (!(NextInterface->Flags & ACPI_OSI_INVALID))
651a9643ea8Slogwang             {
652a9643ea8Slogwang                 AcpiOsPrintf ("%s\n", NextInterface->Name);
653a9643ea8Slogwang             }
654a9643ea8Slogwang 
655a9643ea8Slogwang             NextInterface = NextInterface->Next;
656a9643ea8Slogwang         }
657a9643ea8Slogwang 
658a9643ea8Slogwang         AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
659a9643ea8Slogwang         return;
660a9643ea8Slogwang     }
661a9643ea8Slogwang 
662a9643ea8Slogwang     /* If ActionArg exists, so must InterfaceNameArg */
663a9643ea8Slogwang 
664a9643ea8Slogwang     if (!InterfaceNameArg)
665a9643ea8Slogwang     {
666a9643ea8Slogwang         AcpiOsPrintf ("Missing Interface Name argument\n");
667a9643ea8Slogwang         return;
668a9643ea8Slogwang     }
669a9643ea8Slogwang 
670a9643ea8Slogwang     /* Uppercase the action for match below */
671a9643ea8Slogwang 
672a9643ea8Slogwang     AcpiUtStrupr (ActionArg);
673a9643ea8Slogwang 
674a9643ea8Slogwang     /* Install - install an interface */
675a9643ea8Slogwang 
676a9643ea8Slogwang     SubString = strstr ("INSTALL", ActionArg);
677a9643ea8Slogwang     if (SubString)
678a9643ea8Slogwang     {
679a9643ea8Slogwang         Status = AcpiInstallInterface (InterfaceNameArg);
680a9643ea8Slogwang         if (ACPI_FAILURE (Status))
681a9643ea8Slogwang         {
682a9643ea8Slogwang             AcpiOsPrintf ("%s, while installing \"%s\"\n",
683a9643ea8Slogwang                 AcpiFormatException (Status), InterfaceNameArg);
684a9643ea8Slogwang         }
685a9643ea8Slogwang         return;
686a9643ea8Slogwang     }
687a9643ea8Slogwang 
688a9643ea8Slogwang     /* Remove - remove an interface */
689a9643ea8Slogwang 
690a9643ea8Slogwang     SubString = strstr ("REMOVE", ActionArg);
691a9643ea8Slogwang     if (SubString)
692a9643ea8Slogwang     {
693a9643ea8Slogwang         Status = AcpiRemoveInterface (InterfaceNameArg);
694a9643ea8Slogwang         if (ACPI_FAILURE (Status))
695a9643ea8Slogwang         {
696a9643ea8Slogwang             AcpiOsPrintf ("%s, while removing \"%s\"\n",
697a9643ea8Slogwang                 AcpiFormatException (Status), InterfaceNameArg);
698a9643ea8Slogwang         }
699a9643ea8Slogwang         return;
700a9643ea8Slogwang     }
701a9643ea8Slogwang 
702a9643ea8Slogwang     /* Invalid ActionArg */
703a9643ea8Slogwang 
704a9643ea8Slogwang     AcpiOsPrintf ("Invalid action argument: %s\n", ActionArg);
705a9643ea8Slogwang     return;
706a9643ea8Slogwang }
707a9643ea8Slogwang 
708a9643ea8Slogwang 
709a9643ea8Slogwang /*******************************************************************************
710a9643ea8Slogwang  *
711a9643ea8Slogwang  * FUNCTION:    AcpiDbDisplayTemplate
712a9643ea8Slogwang  *
713a9643ea8Slogwang  * PARAMETERS:  BufferArg           - Buffer name or address
714a9643ea8Slogwang  *
715a9643ea8Slogwang  * RETURN:      None
716a9643ea8Slogwang  *
717a9643ea8Slogwang  * DESCRIPTION: Dump a buffer that contains a resource template
718a9643ea8Slogwang  *
719a9643ea8Slogwang  ******************************************************************************/
720a9643ea8Slogwang 
721a9643ea8Slogwang void
AcpiDbDisplayTemplate(char * BufferArg)722a9643ea8Slogwang AcpiDbDisplayTemplate (
723a9643ea8Slogwang     char                    *BufferArg)
724a9643ea8Slogwang {
725a9643ea8Slogwang     ACPI_NAMESPACE_NODE     *Node;
726a9643ea8Slogwang     ACPI_STATUS             Status;
727a9643ea8Slogwang     ACPI_BUFFER             ReturnBuffer;
728a9643ea8Slogwang 
729a9643ea8Slogwang 
730a9643ea8Slogwang     /* Translate BufferArg to an Named object */
731a9643ea8Slogwang 
732a9643ea8Slogwang     Node = AcpiDbConvertToNode (BufferArg);
733a9643ea8Slogwang     if (!Node || (Node == AcpiGbl_RootNode))
734a9643ea8Slogwang     {
735a9643ea8Slogwang         AcpiOsPrintf ("Invalid argument: %s\n", BufferArg);
736a9643ea8Slogwang         return;
737a9643ea8Slogwang     }
738a9643ea8Slogwang 
739a9643ea8Slogwang     /* We must have a buffer object */
740a9643ea8Slogwang 
741a9643ea8Slogwang     if (Node->Type != ACPI_TYPE_BUFFER)
742a9643ea8Slogwang     {
743a9643ea8Slogwang         AcpiOsPrintf ("Not a Buffer object, cannot be a template: %s\n",
744a9643ea8Slogwang             BufferArg);
745a9643ea8Slogwang         return;
746a9643ea8Slogwang     }
747a9643ea8Slogwang 
748a9643ea8Slogwang     ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE;
749a9643ea8Slogwang     ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
750a9643ea8Slogwang 
751a9643ea8Slogwang     /* Attempt to convert the raw buffer to a resource list */
752a9643ea8Slogwang 
753a9643ea8Slogwang     Status = AcpiRsCreateResourceList (Node->Object, &ReturnBuffer);
754a9643ea8Slogwang 
755a9643ea8Slogwang     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
756a9643ea8Slogwang     AcpiDbgLevel |= ACPI_LV_RESOURCES;
757a9643ea8Slogwang 
758a9643ea8Slogwang     if (ACPI_FAILURE (Status))
759a9643ea8Slogwang     {
760a9643ea8Slogwang         AcpiOsPrintf (
761a9643ea8Slogwang             "Could not convert Buffer to a resource list: %s, %s\n",
762a9643ea8Slogwang             BufferArg, AcpiFormatException (Status));
763a9643ea8Slogwang         goto DumpBuffer;
764a9643ea8Slogwang     }
765a9643ea8Slogwang 
766a9643ea8Slogwang     /* Now we can dump the resource list */
767a9643ea8Slogwang 
768a9643ea8Slogwang     AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
769a9643ea8Slogwang         ReturnBuffer.Pointer));
770a9643ea8Slogwang 
771a9643ea8Slogwang DumpBuffer:
772a9643ea8Slogwang     AcpiOsPrintf ("\nRaw data buffer:\n");
773a9643ea8Slogwang     AcpiUtDebugDumpBuffer ((UINT8 *) Node->Object->Buffer.Pointer,
774a9643ea8Slogwang         Node->Object->Buffer.Length,
775a9643ea8Slogwang         DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
776a9643ea8Slogwang 
777a9643ea8Slogwang     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
778a9643ea8Slogwang     return;
779a9643ea8Slogwang }
780a9643ea8Slogwang 
781a9643ea8Slogwang 
782a9643ea8Slogwang /*******************************************************************************
783a9643ea8Slogwang  *
784a9643ea8Slogwang  * FUNCTION:    AcpiDmCompareAmlResources
785a9643ea8Slogwang  *
786a9643ea8Slogwang  * PARAMETERS:  Aml1Buffer          - Contains first resource list
787a9643ea8Slogwang  *              Aml1BufferLength    - Length of first resource list
788a9643ea8Slogwang  *              Aml2Buffer          - Contains second resource list
789a9643ea8Slogwang  *              Aml2BufferLength    - Length of second resource list
790a9643ea8Slogwang  *
791a9643ea8Slogwang  * RETURN:      None
792a9643ea8Slogwang  *
793a9643ea8Slogwang  * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in
794a9643ea8Slogwang  *              order to isolate a miscompare to an individual resource)
795a9643ea8Slogwang  *
796a9643ea8Slogwang  ******************************************************************************/
797a9643ea8Slogwang 
798a9643ea8Slogwang static void
AcpiDmCompareAmlResources(UINT8 * Aml1Buffer,ACPI_RSDESC_SIZE Aml1BufferLength,UINT8 * Aml2Buffer,ACPI_RSDESC_SIZE Aml2BufferLength)799a9643ea8Slogwang AcpiDmCompareAmlResources (
800a9643ea8Slogwang     UINT8                   *Aml1Buffer,
801a9643ea8Slogwang     ACPI_RSDESC_SIZE        Aml1BufferLength,
802a9643ea8Slogwang     UINT8                   *Aml2Buffer,
803a9643ea8Slogwang     ACPI_RSDESC_SIZE        Aml2BufferLength)
804a9643ea8Slogwang {
805a9643ea8Slogwang     UINT8                   *Aml1;
806a9643ea8Slogwang     UINT8                   *Aml2;
807a9643ea8Slogwang     UINT8                   *Aml1End;
808a9643ea8Slogwang     UINT8                   *Aml2End;
809a9643ea8Slogwang     ACPI_RSDESC_SIZE        Aml1Length;
810a9643ea8Slogwang     ACPI_RSDESC_SIZE        Aml2Length;
811a9643ea8Slogwang     ACPI_RSDESC_SIZE        Offset = 0;
812a9643ea8Slogwang     UINT8                   ResourceType;
813a9643ea8Slogwang     UINT32                  Count = 0;
814a9643ea8Slogwang     UINT32                  i;
815a9643ea8Slogwang 
816a9643ea8Slogwang 
817a9643ea8Slogwang     /* Compare overall buffer sizes (may be different due to size rounding) */
818a9643ea8Slogwang 
819a9643ea8Slogwang     if (Aml1BufferLength != Aml2BufferLength)
820a9643ea8Slogwang     {
821a9643ea8Slogwang         AcpiOsPrintf (
822a9643ea8Slogwang             "**** Buffer length mismatch in converted "
823a9643ea8Slogwang             "AML: Original %X, New %X ****\n",
824a9643ea8Slogwang             Aml1BufferLength, Aml2BufferLength);
825a9643ea8Slogwang     }
826a9643ea8Slogwang 
827a9643ea8Slogwang     Aml1 = Aml1Buffer;
828a9643ea8Slogwang     Aml2 = Aml2Buffer;
829a9643ea8Slogwang     Aml1End = Aml1Buffer + Aml1BufferLength;
830a9643ea8Slogwang     Aml2End = Aml2Buffer + Aml2BufferLength;
831a9643ea8Slogwang 
832a9643ea8Slogwang     /* Walk the descriptor lists, comparing each descriptor */
833a9643ea8Slogwang 
834a9643ea8Slogwang     while ((Aml1 < Aml1End) && (Aml2 < Aml2End))
835a9643ea8Slogwang     {
836a9643ea8Slogwang         /* Get the lengths of each descriptor */
837a9643ea8Slogwang 
838a9643ea8Slogwang         Aml1Length = AcpiUtGetDescriptorLength (Aml1);
839a9643ea8Slogwang         Aml2Length = AcpiUtGetDescriptorLength (Aml2);
840a9643ea8Slogwang         ResourceType = AcpiUtGetResourceType (Aml1);
841a9643ea8Slogwang 
842a9643ea8Slogwang         /* Check for descriptor length match */
843a9643ea8Slogwang 
844a9643ea8Slogwang         if (Aml1Length != Aml2Length)
845a9643ea8Slogwang         {
846a9643ea8Slogwang             AcpiOsPrintf (
847a9643ea8Slogwang                 "**** Length mismatch in descriptor [%.2X] type %2.2X, "
848a9643ea8Slogwang                 "Offset %8.8X Len1 %X, Len2 %X ****\n",
849a9643ea8Slogwang                 Count, ResourceType, Offset, Aml1Length, Aml2Length);
850a9643ea8Slogwang         }
851a9643ea8Slogwang 
852a9643ea8Slogwang         /* Check for descriptor byte match */
853a9643ea8Slogwang 
854a9643ea8Slogwang         else if (memcmp (Aml1, Aml2, Aml1Length))
855a9643ea8Slogwang         {
856a9643ea8Slogwang             AcpiOsPrintf (
857a9643ea8Slogwang                 "**** Data mismatch in descriptor [%.2X] type %2.2X, "
858a9643ea8Slogwang                 "Offset %8.8X ****\n",
859a9643ea8Slogwang                 Count, ResourceType, Offset);
860a9643ea8Slogwang 
861a9643ea8Slogwang             for (i = 0; i < Aml1Length; i++)
862a9643ea8Slogwang             {
863a9643ea8Slogwang                 if (Aml1[i] != Aml2[i])
864a9643ea8Slogwang                 {
865a9643ea8Slogwang                     AcpiOsPrintf (
866a9643ea8Slogwang                         "Mismatch at byte offset %.2X: is %2.2X, "
867a9643ea8Slogwang                         "should be %2.2X\n",
868a9643ea8Slogwang                         i, Aml2[i], Aml1[i]);
869a9643ea8Slogwang                 }
870a9643ea8Slogwang             }
871a9643ea8Slogwang         }
872a9643ea8Slogwang 
873a9643ea8Slogwang         /* Exit on EndTag descriptor */
874a9643ea8Slogwang 
875a9643ea8Slogwang         if (ResourceType == ACPI_RESOURCE_NAME_END_TAG)
876a9643ea8Slogwang         {
877a9643ea8Slogwang             return;
878a9643ea8Slogwang         }
879a9643ea8Slogwang 
880a9643ea8Slogwang         /* Point to next descriptor in each buffer */
881a9643ea8Slogwang 
882a9643ea8Slogwang         Count++;
883a9643ea8Slogwang         Offset += Aml1Length;
884a9643ea8Slogwang         Aml1 += Aml1Length;
885a9643ea8Slogwang         Aml2 += Aml2Length;
886a9643ea8Slogwang     }
887a9643ea8Slogwang }
888a9643ea8Slogwang 
889a9643ea8Slogwang 
890a9643ea8Slogwang /*******************************************************************************
891a9643ea8Slogwang  *
892a9643ea8Slogwang  * FUNCTION:    AcpiDmTestResourceConversion
893a9643ea8Slogwang  *
894a9643ea8Slogwang  * PARAMETERS:  Node                - Parent device node
895a9643ea8Slogwang  *              Name                - resource method name (_CRS)
896a9643ea8Slogwang  *
897a9643ea8Slogwang  * RETURN:      Status
898a9643ea8Slogwang  *
899a9643ea8Slogwang  * DESCRIPTION: Compare the original AML with a conversion of the AML to
900a9643ea8Slogwang  *              internal resource list, then back to AML.
901a9643ea8Slogwang  *
902a9643ea8Slogwang  ******************************************************************************/
903a9643ea8Slogwang 
904a9643ea8Slogwang static ACPI_STATUS
AcpiDmTestResourceConversion(ACPI_NAMESPACE_NODE * Node,char * Name)905a9643ea8Slogwang AcpiDmTestResourceConversion (
906a9643ea8Slogwang     ACPI_NAMESPACE_NODE     *Node,
907a9643ea8Slogwang     char                    *Name)
908a9643ea8Slogwang {
909a9643ea8Slogwang     ACPI_STATUS             Status;
910a9643ea8Slogwang     ACPI_BUFFER             ReturnBuffer;
911a9643ea8Slogwang     ACPI_BUFFER             ResourceBuffer;
912a9643ea8Slogwang     ACPI_BUFFER             NewAml;
913a9643ea8Slogwang     ACPI_OBJECT             *OriginalAml;
914a9643ea8Slogwang 
915a9643ea8Slogwang 
916a9643ea8Slogwang     AcpiOsPrintf ("Resource Conversion Comparison:\n");
917a9643ea8Slogwang 
918a9643ea8Slogwang     NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
919a9643ea8Slogwang     ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
920a9643ea8Slogwang     ResourceBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
921a9643ea8Slogwang 
922a9643ea8Slogwang     /* Get the original _CRS AML resource template */
923a9643ea8Slogwang 
924a9643ea8Slogwang     Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnBuffer);
925a9643ea8Slogwang     if (ACPI_FAILURE (Status))
926a9643ea8Slogwang     {
927a9643ea8Slogwang         AcpiOsPrintf ("Could not obtain %s: %s\n",
928a9643ea8Slogwang             Name, AcpiFormatException (Status));
929a9643ea8Slogwang         return (Status);
930a9643ea8Slogwang     }
931a9643ea8Slogwang 
932a9643ea8Slogwang     /* Get the AML resource template, converted to internal resource structs */
933a9643ea8Slogwang 
934a9643ea8Slogwang     Status = AcpiGetCurrentResources (Node, &ResourceBuffer);
935a9643ea8Slogwang     if (ACPI_FAILURE (Status))
936a9643ea8Slogwang     {
937a9643ea8Slogwang         AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
938a9643ea8Slogwang             AcpiFormatException (Status));
939a9643ea8Slogwang         goto Exit1;
940a9643ea8Slogwang     }
941a9643ea8Slogwang 
942a9643ea8Slogwang     /* Convert internal resource list to external AML resource template */
943a9643ea8Slogwang 
944a9643ea8Slogwang     Status = AcpiRsCreateAmlResources (&ResourceBuffer, &NewAml);
945a9643ea8Slogwang     if (ACPI_FAILURE (Status))
946a9643ea8Slogwang     {
947a9643ea8Slogwang         AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n",
948a9643ea8Slogwang             AcpiFormatException (Status));
949a9643ea8Slogwang         goto Exit2;
950a9643ea8Slogwang     }
951a9643ea8Slogwang 
952a9643ea8Slogwang     /* Compare original AML to the newly created AML resource list */
953a9643ea8Slogwang 
954a9643ea8Slogwang     OriginalAml = ReturnBuffer.Pointer;
955a9643ea8Slogwang 
956a9643ea8Slogwang     AcpiDmCompareAmlResources (OriginalAml->Buffer.Pointer,
957a9643ea8Slogwang         (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
958a9643ea8Slogwang         NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length);
959a9643ea8Slogwang 
960a9643ea8Slogwang     /* Cleanup and exit */
961a9643ea8Slogwang 
962a9643ea8Slogwang     ACPI_FREE (NewAml.Pointer);
963a9643ea8Slogwang Exit2:
964a9643ea8Slogwang     ACPI_FREE (ResourceBuffer.Pointer);
965a9643ea8Slogwang Exit1:
966a9643ea8Slogwang     ACPI_FREE (ReturnBuffer.Pointer);
967a9643ea8Slogwang     return (Status);
968a9643ea8Slogwang }
969a9643ea8Slogwang 
970a9643ea8Slogwang 
971a9643ea8Slogwang /*******************************************************************************
972a9643ea8Slogwang  *
973a9643ea8Slogwang  * FUNCTION:    AcpiDbResourceCallback
974a9643ea8Slogwang  *
975a9643ea8Slogwang  * PARAMETERS:  ACPI_WALK_RESOURCE_CALLBACK
976a9643ea8Slogwang  *
977a9643ea8Slogwang  * RETURN:      Status
978a9643ea8Slogwang  *
979a9643ea8Slogwang  * DESCRIPTION: Simple callback to exercise AcpiWalkResources and
980a9643ea8Slogwang  *              AcpiWalkResourceBuffer.
981a9643ea8Slogwang  *
982a9643ea8Slogwang  ******************************************************************************/
983a9643ea8Slogwang 
984a9643ea8Slogwang static ACPI_STATUS
AcpiDbResourceCallback(ACPI_RESOURCE * Resource,void * Context)985a9643ea8Slogwang AcpiDbResourceCallback (
986a9643ea8Slogwang     ACPI_RESOURCE           *Resource,
987a9643ea8Slogwang     void                    *Context)
988a9643ea8Slogwang {
989a9643ea8Slogwang 
990a9643ea8Slogwang     return (AE_OK);
991a9643ea8Slogwang }
992a9643ea8Slogwang 
993a9643ea8Slogwang 
994a9643ea8Slogwang /*******************************************************************************
995a9643ea8Slogwang  *
996a9643ea8Slogwang  * FUNCTION:    AcpiDbDeviceResources
997a9643ea8Slogwang  *
998a9643ea8Slogwang  * PARAMETERS:  ACPI_WALK_CALLBACK
999a9643ea8Slogwang  *
1000a9643ea8Slogwang  * RETURN:      Status
1001a9643ea8Slogwang  *
1002a9643ea8Slogwang  * DESCRIPTION: Display the _PRT/_CRS/_PRS resources for a device object.
1003a9643ea8Slogwang  *
1004a9643ea8Slogwang  ******************************************************************************/
1005a9643ea8Slogwang 
1006a9643ea8Slogwang static ACPI_STATUS
AcpiDbDeviceResources(ACPI_HANDLE ObjHandle,UINT32 NestingLevel,void * Context,void ** ReturnValue)1007a9643ea8Slogwang AcpiDbDeviceResources (
1008a9643ea8Slogwang     ACPI_HANDLE             ObjHandle,
1009a9643ea8Slogwang     UINT32                  NestingLevel,
1010a9643ea8Slogwang     void                    *Context,
1011a9643ea8Slogwang     void                    **ReturnValue)
1012a9643ea8Slogwang {
1013a9643ea8Slogwang     ACPI_NAMESPACE_NODE     *Node;
1014a9643ea8Slogwang     ACPI_NAMESPACE_NODE     *PrtNode = NULL;
1015a9643ea8Slogwang     ACPI_NAMESPACE_NODE     *CrsNode = NULL;
1016a9643ea8Slogwang     ACPI_NAMESPACE_NODE     *PrsNode = NULL;
1017a9643ea8Slogwang     ACPI_NAMESPACE_NODE     *AeiNode = NULL;
1018a9643ea8Slogwang     char                    *ParentPath;
1019a9643ea8Slogwang     ACPI_BUFFER             ReturnBuffer;
1020a9643ea8Slogwang     ACPI_STATUS             Status;
1021a9643ea8Slogwang 
1022a9643ea8Slogwang 
1023a9643ea8Slogwang     Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
1024a9643ea8Slogwang     ParentPath = AcpiNsGetNormalizedPathname (Node, TRUE);
1025a9643ea8Slogwang     if (!ParentPath)
1026a9643ea8Slogwang     {
1027a9643ea8Slogwang         return (AE_NO_MEMORY);
1028a9643ea8Slogwang     }
1029a9643ea8Slogwang 
1030a9643ea8Slogwang     /* Get handles to the resource methods for this device */
1031a9643ea8Slogwang 
1032a9643ea8Slogwang     (void) AcpiGetHandle (Node, METHOD_NAME__PRT,
1033a9643ea8Slogwang         ACPI_CAST_PTR (ACPI_HANDLE, &PrtNode));
1034a9643ea8Slogwang     (void) AcpiGetHandle (Node, METHOD_NAME__CRS,
1035a9643ea8Slogwang         ACPI_CAST_PTR (ACPI_HANDLE, &CrsNode));
1036a9643ea8Slogwang     (void) AcpiGetHandle (Node, METHOD_NAME__PRS,
1037a9643ea8Slogwang         ACPI_CAST_PTR (ACPI_HANDLE, &PrsNode));
1038a9643ea8Slogwang     (void) AcpiGetHandle (Node, METHOD_NAME__AEI,
1039a9643ea8Slogwang         ACPI_CAST_PTR (ACPI_HANDLE, &AeiNode));
1040a9643ea8Slogwang 
1041a9643ea8Slogwang     if (!PrtNode && !CrsNode && !PrsNode && !AeiNode)
1042a9643ea8Slogwang     {
1043a9643ea8Slogwang         goto Cleanup;   /* Nothing to do */
1044a9643ea8Slogwang     }
1045a9643ea8Slogwang 
1046a9643ea8Slogwang     AcpiOsPrintf ("\nDevice: %s\n", ParentPath);
1047a9643ea8Slogwang 
1048a9643ea8Slogwang     /* Prepare for a return object of arbitrary size */
1049a9643ea8Slogwang 
1050a9643ea8Slogwang     ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1051a9643ea8Slogwang     ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
1052a9643ea8Slogwang 
1053a9643ea8Slogwang 
1054a9643ea8Slogwang     /* _PRT */
1055a9643ea8Slogwang 
1056a9643ea8Slogwang     if (PrtNode)
1057a9643ea8Slogwang     {
1058a9643ea8Slogwang         AcpiOsPrintf ("Evaluating _PRT\n");
1059a9643ea8Slogwang 
1060a9643ea8Slogwang         Status = AcpiEvaluateObject (PrtNode, NULL, NULL, &ReturnBuffer);
1061a9643ea8Slogwang         if (ACPI_FAILURE (Status))
1062a9643ea8Slogwang         {
1063a9643ea8Slogwang             AcpiOsPrintf ("Could not evaluate _PRT: %s\n",
1064a9643ea8Slogwang                 AcpiFormatException (Status));
1065a9643ea8Slogwang             goto GetCrs;
1066a9643ea8Slogwang         }
1067a9643ea8Slogwang 
1068a9643ea8Slogwang         ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1069a9643ea8Slogwang         ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
1070a9643ea8Slogwang 
1071a9643ea8Slogwang         Status = AcpiGetIrqRoutingTable (Node, &ReturnBuffer);
1072a9643ea8Slogwang         if (ACPI_FAILURE (Status))
1073a9643ea8Slogwang         {
1074a9643ea8Slogwang             AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n",
1075a9643ea8Slogwang                 AcpiFormatException (Status));
1076a9643ea8Slogwang             goto GetCrs;
1077a9643ea8Slogwang         }
1078a9643ea8Slogwang 
1079a9643ea8Slogwang         AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer));
1080a9643ea8Slogwang     }
1081a9643ea8Slogwang 
1082a9643ea8Slogwang 
1083a9643ea8Slogwang     /* _CRS */
1084a9643ea8Slogwang 
1085a9643ea8Slogwang GetCrs:
1086a9643ea8Slogwang     if (CrsNode)
1087a9643ea8Slogwang     {
1088a9643ea8Slogwang         AcpiOsPrintf ("Evaluating _CRS\n");
1089a9643ea8Slogwang 
1090a9643ea8Slogwang         ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1091a9643ea8Slogwang         ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
1092a9643ea8Slogwang 
1093a9643ea8Slogwang         Status = AcpiEvaluateObject (CrsNode, NULL, NULL, &ReturnBuffer);
1094a9643ea8Slogwang         if (ACPI_FAILURE (Status))
1095a9643ea8Slogwang         {
1096a9643ea8Slogwang             AcpiOsPrintf ("Could not evaluate _CRS: %s\n",
1097a9643ea8Slogwang                 AcpiFormatException (Status));
1098a9643ea8Slogwang             goto GetPrs;
1099a9643ea8Slogwang         }
1100a9643ea8Slogwang 
1101a9643ea8Slogwang         /* This code exercises the AcpiWalkResources interface */
1102a9643ea8Slogwang 
1103a9643ea8Slogwang         Status = AcpiWalkResources (Node, METHOD_NAME__CRS,
1104a9643ea8Slogwang             AcpiDbResourceCallback, NULL);
1105a9643ea8Slogwang         if (ACPI_FAILURE (Status))
1106a9643ea8Slogwang         {
1107a9643ea8Slogwang             AcpiOsPrintf ("AcpiWalkResources failed: %s\n",
1108a9643ea8Slogwang                 AcpiFormatException (Status));
1109a9643ea8Slogwang             goto GetPrs;
1110a9643ea8Slogwang         }
1111a9643ea8Slogwang 
1112a9643ea8Slogwang         /* Get the _CRS resource list (test ALLOCATE buffer) */
1113a9643ea8Slogwang 
1114a9643ea8Slogwang         ReturnBuffer.Pointer = NULL;
1115a9643ea8Slogwang         ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
1116a9643ea8Slogwang 
1117a9643ea8Slogwang         Status = AcpiGetCurrentResources (Node, &ReturnBuffer);
1118a9643ea8Slogwang         if (ACPI_FAILURE (Status))
1119a9643ea8Slogwang         {
1120a9643ea8Slogwang             AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
1121a9643ea8Slogwang                 AcpiFormatException (Status));
1122a9643ea8Slogwang             goto GetPrs;
1123a9643ea8Slogwang         }
1124a9643ea8Slogwang 
1125a9643ea8Slogwang         /* This code exercises the AcpiWalkResourceBuffer interface */
1126a9643ea8Slogwang 
1127a9643ea8Slogwang         Status = AcpiWalkResourceBuffer (&ReturnBuffer,
1128a9643ea8Slogwang             AcpiDbResourceCallback, NULL);
1129a9643ea8Slogwang         if (ACPI_FAILURE (Status))
1130a9643ea8Slogwang         {
1131a9643ea8Slogwang             AcpiOsPrintf ("AcpiWalkResourceBuffer failed: %s\n",
1132a9643ea8Slogwang                 AcpiFormatException (Status));
1133a9643ea8Slogwang             goto EndCrs;
1134a9643ea8Slogwang         }
1135a9643ea8Slogwang 
1136a9643ea8Slogwang         /* Dump the _CRS resource list */
1137a9643ea8Slogwang 
1138a9643ea8Slogwang         AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
1139a9643ea8Slogwang             ReturnBuffer.Pointer));
1140a9643ea8Slogwang 
1141a9643ea8Slogwang         /*
1142a9643ea8Slogwang          * Perform comparison of original AML to newly created AML. This
1143a9643ea8Slogwang          * tests both the AML->Resource conversion and the Resource->AML
1144a9643ea8Slogwang          * conversion.
1145a9643ea8Slogwang          */
1146a9643ea8Slogwang         (void) AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS);
1147a9643ea8Slogwang 
1148a9643ea8Slogwang         /* Execute _SRS with the resource list */
1149a9643ea8Slogwang 
1150a9643ea8Slogwang         AcpiOsPrintf ("Evaluating _SRS\n");
1151a9643ea8Slogwang 
1152a9643ea8Slogwang         Status = AcpiSetCurrentResources (Node, &ReturnBuffer);
1153a9643ea8Slogwang         if (ACPI_FAILURE (Status))
1154a9643ea8Slogwang         {
1155a9643ea8Slogwang             AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n",
1156a9643ea8Slogwang                 AcpiFormatException (Status));
1157a9643ea8Slogwang             goto EndCrs;
1158a9643ea8Slogwang         }
1159a9643ea8Slogwang 
1160a9643ea8Slogwang EndCrs:
1161a9643ea8Slogwang         ACPI_FREE (ReturnBuffer.Pointer);
1162a9643ea8Slogwang     }
1163a9643ea8Slogwang 
1164a9643ea8Slogwang 
1165a9643ea8Slogwang     /* _PRS */
1166a9643ea8Slogwang 
1167a9643ea8Slogwang GetPrs:
1168a9643ea8Slogwang     if (PrsNode)
1169a9643ea8Slogwang     {
1170a9643ea8Slogwang         AcpiOsPrintf ("Evaluating _PRS\n");
1171a9643ea8Slogwang 
1172a9643ea8Slogwang         ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1173a9643ea8Slogwang         ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
1174a9643ea8Slogwang 
1175a9643ea8Slogwang         Status = AcpiEvaluateObject (PrsNode, NULL, NULL, &ReturnBuffer);
1176a9643ea8Slogwang         if (ACPI_FAILURE (Status))
1177a9643ea8Slogwang         {
1178a9643ea8Slogwang             AcpiOsPrintf ("Could not evaluate _PRS: %s\n",
1179a9643ea8Slogwang                 AcpiFormatException (Status));
1180a9643ea8Slogwang             goto GetAei;
1181a9643ea8Slogwang         }
1182a9643ea8Slogwang 
1183a9643ea8Slogwang         ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1184a9643ea8Slogwang         ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE;
1185a9643ea8Slogwang 
1186a9643ea8Slogwang         Status = AcpiGetPossibleResources (Node, &ReturnBuffer);
1187a9643ea8Slogwang         if (ACPI_FAILURE (Status))
1188a9643ea8Slogwang         {
1189a9643ea8Slogwang             AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n",
1190a9643ea8Slogwang                 AcpiFormatException (Status));
1191a9643ea8Slogwang             goto GetAei;
1192a9643ea8Slogwang         }
1193a9643ea8Slogwang 
1194a9643ea8Slogwang         AcpiRsDumpResourceList (ACPI_CAST_PTR (
1195a9643ea8Slogwang             ACPI_RESOURCE, AcpiGbl_DbBuffer));
1196a9643ea8Slogwang     }
1197a9643ea8Slogwang 
1198a9643ea8Slogwang 
1199a9643ea8Slogwang     /* _AEI */
1200a9643ea8Slogwang 
1201a9643ea8Slogwang GetAei:
1202a9643ea8Slogwang     if (AeiNode)
1203a9643ea8Slogwang     {
1204a9643ea8Slogwang         AcpiOsPrintf ("Evaluating _AEI\n");
1205a9643ea8Slogwang 
1206a9643ea8Slogwang         ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1207a9643ea8Slogwang         ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE;
1208a9643ea8Slogwang 
1209a9643ea8Slogwang         Status = AcpiEvaluateObject (AeiNode, NULL, NULL, &ReturnBuffer);
1210a9643ea8Slogwang         if (ACPI_FAILURE (Status))
1211a9643ea8Slogwang         {
1212a9643ea8Slogwang             AcpiOsPrintf ("Could not evaluate _AEI: %s\n",
1213a9643ea8Slogwang                 AcpiFormatException (Status));
1214a9643ea8Slogwang             goto Cleanup;
1215a9643ea8Slogwang         }
1216a9643ea8Slogwang 
1217a9643ea8Slogwang         ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1218a9643ea8Slogwang         ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE;
1219a9643ea8Slogwang 
1220a9643ea8Slogwang         Status = AcpiGetEventResources (Node, &ReturnBuffer);
1221a9643ea8Slogwang         if (ACPI_FAILURE (Status))
1222a9643ea8Slogwang         {
1223a9643ea8Slogwang             AcpiOsPrintf ("AcpiGetEventResources failed: %s\n",
1224a9643ea8Slogwang                 AcpiFormatException (Status));
1225a9643ea8Slogwang             goto Cleanup;
1226a9643ea8Slogwang         }
1227a9643ea8Slogwang 
1228a9643ea8Slogwang         AcpiRsDumpResourceList (ACPI_CAST_PTR (
1229a9643ea8Slogwang             ACPI_RESOURCE, AcpiGbl_DbBuffer));
1230a9643ea8Slogwang     }
1231a9643ea8Slogwang 
1232a9643ea8Slogwang 
1233a9643ea8Slogwang Cleanup:
1234a9643ea8Slogwang     ACPI_FREE (ParentPath);
1235a9643ea8Slogwang     return (AE_OK);
1236a9643ea8Slogwang }
1237a9643ea8Slogwang 
1238a9643ea8Slogwang 
1239a9643ea8Slogwang /*******************************************************************************
1240a9643ea8Slogwang  *
1241a9643ea8Slogwang  * FUNCTION:    AcpiDbDisplayResources
1242a9643ea8Slogwang  *
1243a9643ea8Slogwang  * PARAMETERS:  ObjectArg           - String object name or object pointer.
1244a9643ea8Slogwang  *                                    NULL or "*" means "display resources for
1245a9643ea8Slogwang  *                                    all devices"
1246a9643ea8Slogwang  *
1247a9643ea8Slogwang  * RETURN:      None
1248a9643ea8Slogwang  *
1249a9643ea8Slogwang  * DESCRIPTION: Display the resource objects associated with a device.
1250a9643ea8Slogwang  *
1251a9643ea8Slogwang  ******************************************************************************/
1252a9643ea8Slogwang 
1253a9643ea8Slogwang void
AcpiDbDisplayResources(char * ObjectArg)1254a9643ea8Slogwang AcpiDbDisplayResources (
1255a9643ea8Slogwang     char                    *ObjectArg)
1256a9643ea8Slogwang {
1257a9643ea8Slogwang     ACPI_NAMESPACE_NODE     *Node;
1258a9643ea8Slogwang 
1259a9643ea8Slogwang 
1260a9643ea8Slogwang     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
1261a9643ea8Slogwang     AcpiDbgLevel |= ACPI_LV_RESOURCES;
1262a9643ea8Slogwang 
1263a9643ea8Slogwang     /* Asterisk means "display resources for all devices" */
1264a9643ea8Slogwang 
1265a9643ea8Slogwang     if (!ObjectArg || (!strcmp (ObjectArg, "*")))
1266a9643ea8Slogwang     {
1267a9643ea8Slogwang         (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
1268a9643ea8Slogwang             ACPI_UINT32_MAX, AcpiDbDeviceResources, NULL, NULL, NULL);
1269a9643ea8Slogwang     }
1270a9643ea8Slogwang     else
1271a9643ea8Slogwang     {
1272a9643ea8Slogwang         /* Convert string to object pointer */
1273a9643ea8Slogwang 
1274a9643ea8Slogwang         Node = AcpiDbConvertToNode (ObjectArg);
1275a9643ea8Slogwang         if (Node)
1276a9643ea8Slogwang         {
1277a9643ea8Slogwang             if (Node->Type != ACPI_TYPE_DEVICE)
1278a9643ea8Slogwang             {
1279a9643ea8Slogwang                 AcpiOsPrintf (
1280a9643ea8Slogwang                     "%4.4s: Name is not a device object (%s)\n",
1281a9643ea8Slogwang                     Node->Name.Ascii, AcpiUtGetTypeName (Node->Type));
1282a9643ea8Slogwang             }
1283a9643ea8Slogwang             else
1284a9643ea8Slogwang             {
1285a9643ea8Slogwang                 (void) AcpiDbDeviceResources (Node, 0, NULL, NULL);
1286a9643ea8Slogwang             }
1287a9643ea8Slogwang         }
1288a9643ea8Slogwang     }
1289a9643ea8Slogwang 
1290a9643ea8Slogwang     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
1291a9643ea8Slogwang }
1292a9643ea8Slogwang 
1293a9643ea8Slogwang 
1294a9643ea8Slogwang #if (!ACPI_REDUCED_HARDWARE)
1295a9643ea8Slogwang /*******************************************************************************
1296a9643ea8Slogwang  *
1297a9643ea8Slogwang  * FUNCTION:    AcpiDbGenerateGpe
1298a9643ea8Slogwang  *
1299a9643ea8Slogwang  * PARAMETERS:  GpeArg              - Raw GPE number, ascii string
1300a9643ea8Slogwang  *              BlockArg            - GPE block number, ascii string
1301a9643ea8Slogwang  *                                    0 or 1 for FADT GPE blocks
1302a9643ea8Slogwang  *
1303a9643ea8Slogwang  * RETURN:      None
1304a9643ea8Slogwang  *
1305a9643ea8Slogwang  * DESCRIPTION: Simulate firing of a GPE
1306a9643ea8Slogwang  *
1307a9643ea8Slogwang  ******************************************************************************/
1308a9643ea8Slogwang 
1309a9643ea8Slogwang void
AcpiDbGenerateGpe(char * GpeArg,char * BlockArg)1310a9643ea8Slogwang AcpiDbGenerateGpe (
1311a9643ea8Slogwang     char                    *GpeArg,
1312a9643ea8Slogwang     char                    *BlockArg)
1313a9643ea8Slogwang {
1314a9643ea8Slogwang     UINT32                  BlockNumber = 0;
1315a9643ea8Slogwang     UINT32                  GpeNumber;
1316a9643ea8Slogwang     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
1317a9643ea8Slogwang 
1318a9643ea8Slogwang 
1319a9643ea8Slogwang     GpeNumber = strtoul (GpeArg, NULL, 0);
1320a9643ea8Slogwang 
1321a9643ea8Slogwang     /*
1322a9643ea8Slogwang      * If no block arg, or block arg == 0 or 1, use the FADT-defined
1323a9643ea8Slogwang      * GPE blocks.
1324a9643ea8Slogwang      */
1325a9643ea8Slogwang     if (BlockArg)
1326a9643ea8Slogwang     {
1327a9643ea8Slogwang         BlockNumber = strtoul (BlockArg, NULL, 0);
1328a9643ea8Slogwang         if (BlockNumber == 1)
1329a9643ea8Slogwang         {
1330a9643ea8Slogwang             BlockNumber = 0;
1331a9643ea8Slogwang         }
1332a9643ea8Slogwang     }
1333a9643ea8Slogwang 
1334a9643ea8Slogwang     GpeEventInfo = AcpiEvGetGpeEventInfo (
1335a9643ea8Slogwang         ACPI_TO_POINTER (BlockNumber), GpeNumber);
1336a9643ea8Slogwang     if (!GpeEventInfo)
1337a9643ea8Slogwang     {
1338a9643ea8Slogwang         AcpiOsPrintf ("Invalid GPE\n");
1339a9643ea8Slogwang         return;
1340a9643ea8Slogwang     }
1341a9643ea8Slogwang 
1342a9643ea8Slogwang     (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber);
1343a9643ea8Slogwang }
1344a9643ea8Slogwang 
1345a9643ea8Slogwang 
1346a9643ea8Slogwang /*******************************************************************************
1347a9643ea8Slogwang  *
1348a9643ea8Slogwang  * FUNCTION:    AcpiDbGenerateSci
1349a9643ea8Slogwang  *
1350a9643ea8Slogwang  * PARAMETERS:  None
1351a9643ea8Slogwang  *
1352a9643ea8Slogwang  * RETURN:      None
1353a9643ea8Slogwang  *
1354a9643ea8Slogwang  * DESCRIPTION: Simulate an SCI -- just call the SCI dispatch.
1355a9643ea8Slogwang  *
1356a9643ea8Slogwang  ******************************************************************************/
1357a9643ea8Slogwang 
1358a9643ea8Slogwang void
AcpiDbGenerateSci(void)1359a9643ea8Slogwang AcpiDbGenerateSci (
1360a9643ea8Slogwang     void)
1361a9643ea8Slogwang {
1362a9643ea8Slogwang     AcpiEvSciDispatch ();
1363a9643ea8Slogwang }
1364a9643ea8Slogwang 
1365a9643ea8Slogwang #endif /* !ACPI_REDUCED_HARDWARE */
1366a9643ea8Slogwang 
1367a9643ea8Slogwang 
1368a9643ea8Slogwang /*******************************************************************************
1369a9643ea8Slogwang  *
1370a9643ea8Slogwang  * FUNCTION:    AcpiDbTrace
1371a9643ea8Slogwang  *
1372a9643ea8Slogwang  * PARAMETERS:  EnableArg           - ENABLE/AML to enable tracer
1373a9643ea8Slogwang  *                                    DISABLE to disable tracer
1374a9643ea8Slogwang  *              MethodArg           - Method to trace
1375a9643ea8Slogwang  *              OnceArg             - Whether trace once
1376a9643ea8Slogwang  *
1377a9643ea8Slogwang  * RETURN:      None
1378a9643ea8Slogwang  *
1379a9643ea8Slogwang  * DESCRIPTION: Control method tracing facility
1380a9643ea8Slogwang  *
1381a9643ea8Slogwang  ******************************************************************************/
1382a9643ea8Slogwang 
1383a9643ea8Slogwang void
AcpiDbTrace(char * EnableArg,char * MethodArg,char * OnceArg)1384a9643ea8Slogwang AcpiDbTrace (
1385a9643ea8Slogwang     char                    *EnableArg,
1386a9643ea8Slogwang     char                    *MethodArg,
1387a9643ea8Slogwang     char                    *OnceArg)
1388a9643ea8Slogwang {
1389a9643ea8Slogwang     UINT32                  DebugLevel = 0;
1390a9643ea8Slogwang     UINT32                  DebugLayer = 0;
1391a9643ea8Slogwang     UINT32                  Flags = 0;
1392a9643ea8Slogwang 
1393a9643ea8Slogwang 
1394a9643ea8Slogwang     AcpiUtStrupr (EnableArg);
1395a9643ea8Slogwang     AcpiUtStrupr (OnceArg);
1396a9643ea8Slogwang 
1397a9643ea8Slogwang     if (MethodArg)
1398a9643ea8Slogwang     {
1399a9643ea8Slogwang         if (AcpiDbTraceMethodName)
1400a9643ea8Slogwang         {
1401a9643ea8Slogwang             ACPI_FREE (AcpiDbTraceMethodName);
1402a9643ea8Slogwang             AcpiDbTraceMethodName = NULL;
1403a9643ea8Slogwang         }
1404a9643ea8Slogwang 
1405a9643ea8Slogwang         AcpiDbTraceMethodName = ACPI_ALLOCATE (strlen (MethodArg) + 1);
1406a9643ea8Slogwang         if (!AcpiDbTraceMethodName)
1407a9643ea8Slogwang         {
1408a9643ea8Slogwang             AcpiOsPrintf ("Failed to allocate method name (%s)\n",
1409a9643ea8Slogwang                 MethodArg);
1410a9643ea8Slogwang             return;
1411a9643ea8Slogwang         }
1412a9643ea8Slogwang 
1413a9643ea8Slogwang         strcpy (AcpiDbTraceMethodName, MethodArg);
1414a9643ea8Slogwang     }
1415a9643ea8Slogwang 
1416a9643ea8Slogwang     if (!strcmp (EnableArg, "ENABLE") ||
1417a9643ea8Slogwang         !strcmp (EnableArg, "METHOD") ||
1418a9643ea8Slogwang         !strcmp (EnableArg, "OPCODE"))
1419a9643ea8Slogwang     {
1420a9643ea8Slogwang         if (!strcmp (EnableArg, "ENABLE"))
1421a9643ea8Slogwang         {
1422a9643ea8Slogwang             /* Inherit current console settings */
1423a9643ea8Slogwang 
1424a9643ea8Slogwang             DebugLevel = AcpiGbl_DbConsoleDebugLevel;
1425a9643ea8Slogwang             DebugLayer = AcpiDbgLayer;
1426a9643ea8Slogwang         }
1427a9643ea8Slogwang         else
1428a9643ea8Slogwang         {
1429a9643ea8Slogwang             /* Restrict console output to trace points only */
1430a9643ea8Slogwang 
1431a9643ea8Slogwang             DebugLevel = ACPI_LV_TRACE_POINT;
1432a9643ea8Slogwang             DebugLayer = ACPI_EXECUTER;
1433a9643ea8Slogwang         }
1434a9643ea8Slogwang 
1435a9643ea8Slogwang         Flags = ACPI_TRACE_ENABLED;
1436a9643ea8Slogwang 
1437a9643ea8Slogwang         if (!strcmp (EnableArg, "OPCODE"))
1438a9643ea8Slogwang         {
1439a9643ea8Slogwang             Flags |= ACPI_TRACE_OPCODE;
1440a9643ea8Slogwang         }
1441a9643ea8Slogwang 
1442a9643ea8Slogwang         if (OnceArg && !strcmp (OnceArg, "ONCE"))
1443a9643ea8Slogwang         {
1444a9643ea8Slogwang             Flags |= ACPI_TRACE_ONESHOT;
1445a9643ea8Slogwang         }
1446a9643ea8Slogwang     }
1447a9643ea8Slogwang 
1448a9643ea8Slogwang     (void) AcpiDebugTrace (AcpiDbTraceMethodName,
1449a9643ea8Slogwang         DebugLevel, DebugLayer, Flags);
1450a9643ea8Slogwang }
1451