xref: /freebsd/sys/contrib/dev/acpica/components/debugger/dbcmds.c (revision a159c266a93c3c4f229864954c5f963acd8f60f2)
1*a159c266SJung-uk Kim /*******************************************************************************
2*a159c266SJung-uk Kim  *
3*a159c266SJung-uk Kim  * Module Name: dbcmds - Miscellaneous debug commands and output routines
4*a159c266SJung-uk Kim  *
5*a159c266SJung-uk Kim  ******************************************************************************/
6*a159c266SJung-uk Kim 
7*a159c266SJung-uk Kim /*
8*a159c266SJung-uk Kim  * Copyright (C) 2000 - 2012, Intel Corp.
9*a159c266SJung-uk Kim  * All rights reserved.
10*a159c266SJung-uk Kim  *
11*a159c266SJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12*a159c266SJung-uk Kim  * modification, are permitted provided that the following conditions
13*a159c266SJung-uk Kim  * are met:
14*a159c266SJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15*a159c266SJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16*a159c266SJung-uk Kim  *    without modification.
17*a159c266SJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*a159c266SJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19*a159c266SJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20*a159c266SJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21*a159c266SJung-uk Kim  *    binary redistribution.
22*a159c266SJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23*a159c266SJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24*a159c266SJung-uk Kim  *    from this software without specific prior written permission.
25*a159c266SJung-uk Kim  *
26*a159c266SJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27*a159c266SJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28*a159c266SJung-uk Kim  * Software Foundation.
29*a159c266SJung-uk Kim  *
30*a159c266SJung-uk Kim  * NO WARRANTY
31*a159c266SJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*a159c266SJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*a159c266SJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*a159c266SJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*a159c266SJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*a159c266SJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*a159c266SJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*a159c266SJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*a159c266SJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*a159c266SJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*a159c266SJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42*a159c266SJung-uk Kim  */
43*a159c266SJung-uk Kim 
44*a159c266SJung-uk Kim 
45*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
46*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acevents.h>
48*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h>
49*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h>
50*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acresrc.h>
51*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/actables.h>
52*a159c266SJung-uk Kim 
53*a159c266SJung-uk Kim #ifdef ACPI_DEBUGGER
54*a159c266SJung-uk Kim 
55*a159c266SJung-uk Kim #define _COMPONENT          ACPI_CA_DEBUGGER
56*a159c266SJung-uk Kim         ACPI_MODULE_NAME    ("dbcmds")
57*a159c266SJung-uk Kim 
58*a159c266SJung-uk Kim 
59*a159c266SJung-uk Kim /* Local prototypes */
60*a159c266SJung-uk Kim 
61*a159c266SJung-uk Kim static void
62*a159c266SJung-uk Kim AcpiDmCompareAmlResources (
63*a159c266SJung-uk Kim     UINT8                   *Aml1Buffer,
64*a159c266SJung-uk Kim     ACPI_RSDESC_SIZE        Aml1BufferLength,
65*a159c266SJung-uk Kim     UINT8                   *Aml2Buffer,
66*a159c266SJung-uk Kim     ACPI_RSDESC_SIZE        Aml2BufferLength);
67*a159c266SJung-uk Kim 
68*a159c266SJung-uk Kim static ACPI_STATUS
69*a159c266SJung-uk Kim AcpiDmTestResourceConversion (
70*a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
71*a159c266SJung-uk Kim     char                    *Name);
72*a159c266SJung-uk Kim 
73*a159c266SJung-uk Kim static ACPI_STATUS
74*a159c266SJung-uk Kim AcpiDbResourceCallback (
75*a159c266SJung-uk Kim     ACPI_RESOURCE           *Resource,
76*a159c266SJung-uk Kim     void                    *Context);
77*a159c266SJung-uk Kim 
78*a159c266SJung-uk Kim static ACPI_STATUS
79*a159c266SJung-uk Kim AcpiDbDeviceResources (
80*a159c266SJung-uk Kim     ACPI_HANDLE             ObjHandle,
81*a159c266SJung-uk Kim     UINT32                  NestingLevel,
82*a159c266SJung-uk Kim     void                    *Context,
83*a159c266SJung-uk Kim     void                    **ReturnValue);
84*a159c266SJung-uk Kim 
85*a159c266SJung-uk Kim 
86*a159c266SJung-uk Kim /*******************************************************************************
87*a159c266SJung-uk Kim  *
88*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbConvertToNode
89*a159c266SJung-uk Kim  *
90*a159c266SJung-uk Kim  * PARAMETERS:  InString        - String to convert
91*a159c266SJung-uk Kim  *
92*a159c266SJung-uk Kim  * RETURN:      Pointer to a NS node
93*a159c266SJung-uk Kim  *
94*a159c266SJung-uk Kim  * DESCRIPTION: Convert a string to a valid NS pointer.  Handles numeric or
95*a159c266SJung-uk Kim  *              alpha strings.
96*a159c266SJung-uk Kim  *
97*a159c266SJung-uk Kim  ******************************************************************************/
98*a159c266SJung-uk Kim 
99*a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *
100*a159c266SJung-uk Kim AcpiDbConvertToNode (
101*a159c266SJung-uk Kim     char                    *InString)
102*a159c266SJung-uk Kim {
103*a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
104*a159c266SJung-uk Kim 
105*a159c266SJung-uk Kim 
106*a159c266SJung-uk Kim     if ((*InString >= 0x30) && (*InString <= 0x39))
107*a159c266SJung-uk Kim     {
108*a159c266SJung-uk Kim         /* Numeric argument, convert */
109*a159c266SJung-uk Kim 
110*a159c266SJung-uk Kim         Node = ACPI_TO_POINTER (ACPI_STRTOUL (InString, NULL, 16));
111*a159c266SJung-uk Kim         if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE)))
112*a159c266SJung-uk Kim         {
113*a159c266SJung-uk Kim             AcpiOsPrintf ("Address %p is invalid in this address space\n",
114*a159c266SJung-uk Kim                 Node);
115*a159c266SJung-uk Kim             return (NULL);
116*a159c266SJung-uk Kim         }
117*a159c266SJung-uk Kim 
118*a159c266SJung-uk Kim         /* Make sure pointer is valid NS node */
119*a159c266SJung-uk Kim 
120*a159c266SJung-uk Kim         if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
121*a159c266SJung-uk Kim         {
122*a159c266SJung-uk Kim             AcpiOsPrintf ("Address %p is not a valid NS node [%s]\n",
123*a159c266SJung-uk Kim                     Node, AcpiUtGetDescriptorName (Node));
124*a159c266SJung-uk Kim             return (NULL);
125*a159c266SJung-uk Kim         }
126*a159c266SJung-uk Kim     }
127*a159c266SJung-uk Kim     else
128*a159c266SJung-uk Kim     {
129*a159c266SJung-uk Kim         /* Alpha argument */
130*a159c266SJung-uk Kim         /* The parameter is a name string that must be resolved to a
131*a159c266SJung-uk Kim          * Named obj
132*a159c266SJung-uk Kim          */
133*a159c266SJung-uk Kim         Node = AcpiDbLocalNsLookup (InString);
134*a159c266SJung-uk Kim         if (!Node)
135*a159c266SJung-uk Kim         {
136*a159c266SJung-uk Kim             Node = AcpiGbl_RootNode;
137*a159c266SJung-uk Kim         }
138*a159c266SJung-uk Kim     }
139*a159c266SJung-uk Kim 
140*a159c266SJung-uk Kim     return (Node);
141*a159c266SJung-uk Kim }
142*a159c266SJung-uk Kim 
143*a159c266SJung-uk Kim 
144*a159c266SJung-uk Kim /*******************************************************************************
145*a159c266SJung-uk Kim  *
146*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbSleep
147*a159c266SJung-uk Kim  *
148*a159c266SJung-uk Kim  * PARAMETERS:  ObjectArg       - Desired sleep state (0-5)
149*a159c266SJung-uk Kim  *
150*a159c266SJung-uk Kim  * RETURN:      Status
151*a159c266SJung-uk Kim  *
152*a159c266SJung-uk Kim  * DESCRIPTION: Simulate a sleep/wake sequence
153*a159c266SJung-uk Kim  *
154*a159c266SJung-uk Kim  ******************************************************************************/
155*a159c266SJung-uk Kim 
156*a159c266SJung-uk Kim ACPI_STATUS
157*a159c266SJung-uk Kim AcpiDbSleep (
158*a159c266SJung-uk Kim     char                    *ObjectArg)
159*a159c266SJung-uk Kim {
160*a159c266SJung-uk Kim     ACPI_STATUS             Status;
161*a159c266SJung-uk Kim     UINT8                   SleepState;
162*a159c266SJung-uk Kim 
163*a159c266SJung-uk Kim 
164*a159c266SJung-uk Kim     ACPI_FUNCTION_TRACE (AcpiDbSleep);
165*a159c266SJung-uk Kim 
166*a159c266SJung-uk Kim 
167*a159c266SJung-uk Kim     SleepState = (UINT8) ACPI_STRTOUL (ObjectArg, NULL, 0);
168*a159c266SJung-uk Kim 
169*a159c266SJung-uk Kim     AcpiOsPrintf ("**** Prepare to sleep ****\n");
170*a159c266SJung-uk Kim     Status = AcpiEnterSleepStatePrep (SleepState);
171*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
172*a159c266SJung-uk Kim     {
173*a159c266SJung-uk Kim         goto ErrorExit;
174*a159c266SJung-uk Kim     }
175*a159c266SJung-uk Kim 
176*a159c266SJung-uk Kim     AcpiOsPrintf ("**** Going to sleep ****\n");
177*a159c266SJung-uk Kim     Status = AcpiEnterSleepState (SleepState);
178*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
179*a159c266SJung-uk Kim     {
180*a159c266SJung-uk Kim         goto ErrorExit;
181*a159c266SJung-uk Kim     }
182*a159c266SJung-uk Kim 
183*a159c266SJung-uk Kim     AcpiOsPrintf ("**** Prepare to return from sleep ****\n");
184*a159c266SJung-uk Kim     Status = AcpiLeaveSleepStatePrep (SleepState);
185*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
186*a159c266SJung-uk Kim     {
187*a159c266SJung-uk Kim         goto ErrorExit;
188*a159c266SJung-uk Kim     }
189*a159c266SJung-uk Kim 
190*a159c266SJung-uk Kim     AcpiOsPrintf ("**** Returning from sleep ****\n");
191*a159c266SJung-uk Kim     Status = AcpiLeaveSleepState (SleepState);
192*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
193*a159c266SJung-uk Kim     {
194*a159c266SJung-uk Kim         goto ErrorExit;
195*a159c266SJung-uk Kim     }
196*a159c266SJung-uk Kim 
197*a159c266SJung-uk Kim     return (Status);
198*a159c266SJung-uk Kim 
199*a159c266SJung-uk Kim 
200*a159c266SJung-uk Kim ErrorExit:
201*a159c266SJung-uk Kim 
202*a159c266SJung-uk Kim     ACPI_EXCEPTION ((AE_INFO, Status, "During sleep test"));
203*a159c266SJung-uk Kim     return (Status);
204*a159c266SJung-uk Kim }
205*a159c266SJung-uk Kim 
206*a159c266SJung-uk Kim 
207*a159c266SJung-uk Kim /*******************************************************************************
208*a159c266SJung-uk Kim  *
209*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbDisplayLocks
210*a159c266SJung-uk Kim  *
211*a159c266SJung-uk Kim  * PARAMETERS:  None
212*a159c266SJung-uk Kim  *
213*a159c266SJung-uk Kim  * RETURN:      None
214*a159c266SJung-uk Kim  *
215*a159c266SJung-uk Kim  * DESCRIPTION: Display information about internal mutexes.
216*a159c266SJung-uk Kim  *
217*a159c266SJung-uk Kim  ******************************************************************************/
218*a159c266SJung-uk Kim 
219*a159c266SJung-uk Kim void
220*a159c266SJung-uk Kim AcpiDbDisplayLocks (
221*a159c266SJung-uk Kim     void)
222*a159c266SJung-uk Kim {
223*a159c266SJung-uk Kim     UINT32                  i;
224*a159c266SJung-uk Kim 
225*a159c266SJung-uk Kim 
226*a159c266SJung-uk Kim     for (i = 0; i < ACPI_MAX_MUTEX; i++)
227*a159c266SJung-uk Kim     {
228*a159c266SJung-uk Kim         AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i),
229*a159c266SJung-uk Kim             AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED
230*a159c266SJung-uk Kim                 ? "Locked" : "Unlocked");
231*a159c266SJung-uk Kim     }
232*a159c266SJung-uk Kim }
233*a159c266SJung-uk Kim 
234*a159c266SJung-uk Kim 
235*a159c266SJung-uk Kim /*******************************************************************************
236*a159c266SJung-uk Kim  *
237*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbDisplayTableInfo
238*a159c266SJung-uk Kim  *
239*a159c266SJung-uk Kim  * PARAMETERS:  TableArg        - String with name of table to be displayed
240*a159c266SJung-uk Kim  *
241*a159c266SJung-uk Kim  * RETURN:      None
242*a159c266SJung-uk Kim  *
243*a159c266SJung-uk Kim  * DESCRIPTION: Display information about loaded tables.  Current
244*a159c266SJung-uk Kim  *              implementation displays all loaded tables.
245*a159c266SJung-uk Kim  *
246*a159c266SJung-uk Kim  ******************************************************************************/
247*a159c266SJung-uk Kim 
248*a159c266SJung-uk Kim void
249*a159c266SJung-uk Kim AcpiDbDisplayTableInfo (
250*a159c266SJung-uk Kim     char                    *TableArg)
251*a159c266SJung-uk Kim {
252*a159c266SJung-uk Kim     UINT32                  i;
253*a159c266SJung-uk Kim     ACPI_TABLE_DESC         *TableDesc;
254*a159c266SJung-uk Kim     ACPI_STATUS             Status;
255*a159c266SJung-uk Kim 
256*a159c266SJung-uk Kim 
257*a159c266SJung-uk Kim     /* Walk the entire root table list */
258*a159c266SJung-uk Kim 
259*a159c266SJung-uk Kim     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
260*a159c266SJung-uk Kim     {
261*a159c266SJung-uk Kim         TableDesc = &AcpiGbl_RootTableList.Tables[i];
262*a159c266SJung-uk Kim         AcpiOsPrintf ("%u ", i);
263*a159c266SJung-uk Kim 
264*a159c266SJung-uk Kim         /* Make sure that the table is mapped */
265*a159c266SJung-uk Kim 
266*a159c266SJung-uk Kim         Status = AcpiTbVerifyTable (TableDesc);
267*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
268*a159c266SJung-uk Kim         {
269*a159c266SJung-uk Kim             return;
270*a159c266SJung-uk Kim         }
271*a159c266SJung-uk Kim 
272*a159c266SJung-uk Kim         /* Dump the table header */
273*a159c266SJung-uk Kim 
274*a159c266SJung-uk Kim         if (TableDesc->Pointer)
275*a159c266SJung-uk Kim         {
276*a159c266SJung-uk Kim             AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer);
277*a159c266SJung-uk Kim         }
278*a159c266SJung-uk Kim         else
279*a159c266SJung-uk Kim         {
280*a159c266SJung-uk Kim             /* If the pointer is null, the table has been unloaded */
281*a159c266SJung-uk Kim 
282*a159c266SJung-uk Kim             ACPI_INFO ((AE_INFO, "%4.4s - Table has been unloaded",
283*a159c266SJung-uk Kim                 TableDesc->Signature.Ascii));
284*a159c266SJung-uk Kim         }
285*a159c266SJung-uk Kim     }
286*a159c266SJung-uk Kim }
287*a159c266SJung-uk Kim 
288*a159c266SJung-uk Kim 
289*a159c266SJung-uk Kim /*******************************************************************************
290*a159c266SJung-uk Kim  *
291*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbUnloadAcpiTable
292*a159c266SJung-uk Kim  *
293*a159c266SJung-uk Kim  * PARAMETERS:  TableArg        - Name of the table to be unloaded
294*a159c266SJung-uk Kim  *              InstanceArg     - Which instance of the table to unload (if
295*a159c266SJung-uk Kim  *                                there are multiple tables of the same type)
296*a159c266SJung-uk Kim  *
297*a159c266SJung-uk Kim  * RETURN:      Nonde
298*a159c266SJung-uk Kim  *
299*a159c266SJung-uk Kim  * DESCRIPTION: Unload an ACPI table.
300*a159c266SJung-uk Kim  *              Instance is not implemented
301*a159c266SJung-uk Kim  *
302*a159c266SJung-uk Kim  ******************************************************************************/
303*a159c266SJung-uk Kim 
304*a159c266SJung-uk Kim void
305*a159c266SJung-uk Kim AcpiDbUnloadAcpiTable (
306*a159c266SJung-uk Kim     char                    *TableArg,
307*a159c266SJung-uk Kim     char                    *InstanceArg)
308*a159c266SJung-uk Kim {
309*a159c266SJung-uk Kim /* TBD: Need to reimplement for new data structures */
310*a159c266SJung-uk Kim 
311*a159c266SJung-uk Kim #if 0
312*a159c266SJung-uk Kim     UINT32                  i;
313*a159c266SJung-uk Kim     ACPI_STATUS             Status;
314*a159c266SJung-uk Kim 
315*a159c266SJung-uk Kim 
316*a159c266SJung-uk Kim     /* Search all tables for the target type */
317*a159c266SJung-uk Kim 
318*a159c266SJung-uk Kim     for (i = 0; i < (ACPI_TABLE_ID_MAX+1); i++)
319*a159c266SJung-uk Kim     {
320*a159c266SJung-uk Kim         if (!ACPI_STRNCMP (TableArg, AcpiGbl_TableData[i].Signature,
321*a159c266SJung-uk Kim                 AcpiGbl_TableData[i].SigLength))
322*a159c266SJung-uk Kim         {
323*a159c266SJung-uk Kim             /* Found the table, unload it */
324*a159c266SJung-uk Kim 
325*a159c266SJung-uk Kim             Status = AcpiUnloadTable (i);
326*a159c266SJung-uk Kim             if (ACPI_SUCCESS (Status))
327*a159c266SJung-uk Kim             {
328*a159c266SJung-uk Kim                 AcpiOsPrintf ("[%s] unloaded and uninstalled\n", TableArg);
329*a159c266SJung-uk Kim             }
330*a159c266SJung-uk Kim             else
331*a159c266SJung-uk Kim             {
332*a159c266SJung-uk Kim                 AcpiOsPrintf ("%s, while unloading [%s]\n",
333*a159c266SJung-uk Kim                     AcpiFormatException (Status), TableArg);
334*a159c266SJung-uk Kim             }
335*a159c266SJung-uk Kim 
336*a159c266SJung-uk Kim             return;
337*a159c266SJung-uk Kim         }
338*a159c266SJung-uk Kim     }
339*a159c266SJung-uk Kim 
340*a159c266SJung-uk Kim     AcpiOsPrintf ("Unknown table type [%s]\n", TableArg);
341*a159c266SJung-uk Kim #endif
342*a159c266SJung-uk Kim }
343*a159c266SJung-uk Kim 
344*a159c266SJung-uk Kim 
345*a159c266SJung-uk Kim /*******************************************************************************
346*a159c266SJung-uk Kim  *
347*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbSendNotify
348*a159c266SJung-uk Kim  *
349*a159c266SJung-uk Kim  * PARAMETERS:  Name            - Name of ACPI object to send the notify to
350*a159c266SJung-uk Kim  *              Value           - Value of the notify to send.
351*a159c266SJung-uk Kim  *
352*a159c266SJung-uk Kim  * RETURN:      None
353*a159c266SJung-uk Kim  *
354*a159c266SJung-uk Kim  * DESCRIPTION: Send an ACPI notification.  The value specified is sent to the
355*a159c266SJung-uk Kim  *              named object as an ACPI notify.
356*a159c266SJung-uk Kim  *
357*a159c266SJung-uk Kim  ******************************************************************************/
358*a159c266SJung-uk Kim 
359*a159c266SJung-uk Kim void
360*a159c266SJung-uk Kim AcpiDbSendNotify (
361*a159c266SJung-uk Kim     char                    *Name,
362*a159c266SJung-uk Kim     UINT32                  Value)
363*a159c266SJung-uk Kim {
364*a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
365*a159c266SJung-uk Kim     ACPI_STATUS             Status;
366*a159c266SJung-uk Kim 
367*a159c266SJung-uk Kim 
368*a159c266SJung-uk Kim     /* Translate name to an Named object */
369*a159c266SJung-uk Kim 
370*a159c266SJung-uk Kim     Node = AcpiDbConvertToNode (Name);
371*a159c266SJung-uk Kim     if (!Node)
372*a159c266SJung-uk Kim     {
373*a159c266SJung-uk Kim         return;
374*a159c266SJung-uk Kim     }
375*a159c266SJung-uk Kim 
376*a159c266SJung-uk Kim     /* Decode Named object type */
377*a159c266SJung-uk Kim 
378*a159c266SJung-uk Kim     switch (Node->Type)
379*a159c266SJung-uk Kim     {
380*a159c266SJung-uk Kim     case ACPI_TYPE_DEVICE:
381*a159c266SJung-uk Kim     case ACPI_TYPE_THERMAL:
382*a159c266SJung-uk Kim 
383*a159c266SJung-uk Kim          /* Send the notify */
384*a159c266SJung-uk Kim 
385*a159c266SJung-uk Kim         Status = AcpiEvQueueNotifyRequest (Node, Value);
386*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
387*a159c266SJung-uk Kim         {
388*a159c266SJung-uk Kim             AcpiOsPrintf ("Could not queue notify\n");
389*a159c266SJung-uk Kim         }
390*a159c266SJung-uk Kim         break;
391*a159c266SJung-uk Kim 
392*a159c266SJung-uk Kim     default:
393*a159c266SJung-uk Kim         AcpiOsPrintf ("Named object is not a device or a thermal object\n");
394*a159c266SJung-uk Kim         break;
395*a159c266SJung-uk Kim     }
396*a159c266SJung-uk Kim }
397*a159c266SJung-uk Kim 
398*a159c266SJung-uk Kim 
399*a159c266SJung-uk Kim /*******************************************************************************
400*a159c266SJung-uk Kim  *
401*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbDisplayInterfaces
402*a159c266SJung-uk Kim  *
403*a159c266SJung-uk Kim  * PARAMETERS:  ActionArg           - Null, "install", or "remove"
404*a159c266SJung-uk Kim  *              InterfaceNameArg    - Name for install/remove options
405*a159c266SJung-uk Kim  *
406*a159c266SJung-uk Kim  * RETURN:      None
407*a159c266SJung-uk Kim  *
408*a159c266SJung-uk Kim  * DESCRIPTION: Display or modify the global _OSI interface list
409*a159c266SJung-uk Kim  *
410*a159c266SJung-uk Kim  ******************************************************************************/
411*a159c266SJung-uk Kim 
412*a159c266SJung-uk Kim void
413*a159c266SJung-uk Kim AcpiDbDisplayInterfaces (
414*a159c266SJung-uk Kim     char                    *ActionArg,
415*a159c266SJung-uk Kim     char                    *InterfaceNameArg)
416*a159c266SJung-uk Kim {
417*a159c266SJung-uk Kim     ACPI_INTERFACE_INFO     *NextInterface;
418*a159c266SJung-uk Kim     char                    *SubString;
419*a159c266SJung-uk Kim     ACPI_STATUS             Status;
420*a159c266SJung-uk Kim 
421*a159c266SJung-uk Kim 
422*a159c266SJung-uk Kim     /* If no arguments, just display current interface list */
423*a159c266SJung-uk Kim 
424*a159c266SJung-uk Kim     if (!ActionArg)
425*a159c266SJung-uk Kim     {
426*a159c266SJung-uk Kim         (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex,
427*a159c266SJung-uk Kim                     ACPI_WAIT_FOREVER);
428*a159c266SJung-uk Kim 
429*a159c266SJung-uk Kim         NextInterface = AcpiGbl_SupportedInterfaces;
430*a159c266SJung-uk Kim 
431*a159c266SJung-uk Kim         while (NextInterface)
432*a159c266SJung-uk Kim         {
433*a159c266SJung-uk Kim             if (!(NextInterface->Flags & ACPI_OSI_INVALID))
434*a159c266SJung-uk Kim             {
435*a159c266SJung-uk Kim                 AcpiOsPrintf ("%s\n", NextInterface->Name);
436*a159c266SJung-uk Kim             }
437*a159c266SJung-uk Kim             NextInterface = NextInterface->Next;
438*a159c266SJung-uk Kim         }
439*a159c266SJung-uk Kim 
440*a159c266SJung-uk Kim         AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
441*a159c266SJung-uk Kim         return;
442*a159c266SJung-uk Kim     }
443*a159c266SJung-uk Kim 
444*a159c266SJung-uk Kim     /* If ActionArg exists, so must InterfaceNameArg */
445*a159c266SJung-uk Kim 
446*a159c266SJung-uk Kim     if (!InterfaceNameArg)
447*a159c266SJung-uk Kim     {
448*a159c266SJung-uk Kim         AcpiOsPrintf ("Missing Interface Name argument\n");
449*a159c266SJung-uk Kim         return;
450*a159c266SJung-uk Kim     }
451*a159c266SJung-uk Kim 
452*a159c266SJung-uk Kim     /* Uppercase the action for match below */
453*a159c266SJung-uk Kim 
454*a159c266SJung-uk Kim     AcpiUtStrupr (ActionArg);
455*a159c266SJung-uk Kim 
456*a159c266SJung-uk Kim     /* Install - install an interface */
457*a159c266SJung-uk Kim 
458*a159c266SJung-uk Kim     SubString = ACPI_STRSTR ("INSTALL", ActionArg);
459*a159c266SJung-uk Kim     if (SubString)
460*a159c266SJung-uk Kim     {
461*a159c266SJung-uk Kim         Status = AcpiInstallInterface (InterfaceNameArg);
462*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
463*a159c266SJung-uk Kim         {
464*a159c266SJung-uk Kim             AcpiOsPrintf ("%s, while installing \"%s\"\n",
465*a159c266SJung-uk Kim                 AcpiFormatException (Status), InterfaceNameArg);
466*a159c266SJung-uk Kim         }
467*a159c266SJung-uk Kim         return;
468*a159c266SJung-uk Kim     }
469*a159c266SJung-uk Kim 
470*a159c266SJung-uk Kim     /* Remove - remove an interface */
471*a159c266SJung-uk Kim 
472*a159c266SJung-uk Kim     SubString = ACPI_STRSTR ("REMOVE", ActionArg);
473*a159c266SJung-uk Kim     if (SubString)
474*a159c266SJung-uk Kim     {
475*a159c266SJung-uk Kim         Status = AcpiRemoveInterface (InterfaceNameArg);
476*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
477*a159c266SJung-uk Kim         {
478*a159c266SJung-uk Kim             AcpiOsPrintf ("%s, while removing \"%s\"\n",
479*a159c266SJung-uk Kim                 AcpiFormatException (Status), InterfaceNameArg);
480*a159c266SJung-uk Kim         }
481*a159c266SJung-uk Kim         return;
482*a159c266SJung-uk Kim     }
483*a159c266SJung-uk Kim 
484*a159c266SJung-uk Kim     /* Invalid ActionArg */
485*a159c266SJung-uk Kim 
486*a159c266SJung-uk Kim     AcpiOsPrintf ("Invalid action argument: %s\n", ActionArg);
487*a159c266SJung-uk Kim     return;
488*a159c266SJung-uk Kim }
489*a159c266SJung-uk Kim 
490*a159c266SJung-uk Kim 
491*a159c266SJung-uk Kim /*******************************************************************************
492*a159c266SJung-uk Kim  *
493*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbDisplayTemplate
494*a159c266SJung-uk Kim  *
495*a159c266SJung-uk Kim  * PARAMETERS:  BufferArg           - Buffer name or addrss
496*a159c266SJung-uk Kim  *
497*a159c266SJung-uk Kim  * RETURN:      None
498*a159c266SJung-uk Kim  *
499*a159c266SJung-uk Kim  * DESCRIPTION: Dump a buffer that contains a resource template
500*a159c266SJung-uk Kim  *
501*a159c266SJung-uk Kim  ******************************************************************************/
502*a159c266SJung-uk Kim 
503*a159c266SJung-uk Kim void
504*a159c266SJung-uk Kim AcpiDbDisplayTemplate (
505*a159c266SJung-uk Kim     char                    *BufferArg)
506*a159c266SJung-uk Kim {
507*a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
508*a159c266SJung-uk Kim     ACPI_STATUS             Status;
509*a159c266SJung-uk Kim     ACPI_BUFFER             ReturnObj;
510*a159c266SJung-uk Kim 
511*a159c266SJung-uk Kim 
512*a159c266SJung-uk Kim     /* Translate BufferArg to an Named object */
513*a159c266SJung-uk Kim 
514*a159c266SJung-uk Kim     Node = AcpiDbConvertToNode (BufferArg);
515*a159c266SJung-uk Kim     if (!Node || (Node == AcpiGbl_RootNode))
516*a159c266SJung-uk Kim     {
517*a159c266SJung-uk Kim         AcpiOsPrintf ("Invalid argument: %s\n", BufferArg);
518*a159c266SJung-uk Kim         return;
519*a159c266SJung-uk Kim     }
520*a159c266SJung-uk Kim 
521*a159c266SJung-uk Kim     /* We must have a buffer object */
522*a159c266SJung-uk Kim 
523*a159c266SJung-uk Kim     if (Node->Type != ACPI_TYPE_BUFFER)
524*a159c266SJung-uk Kim     {
525*a159c266SJung-uk Kim         AcpiOsPrintf ("Not a Buffer object, cannot be a template: %s\n",
526*a159c266SJung-uk Kim             BufferArg);
527*a159c266SJung-uk Kim         return;
528*a159c266SJung-uk Kim     }
529*a159c266SJung-uk Kim 
530*a159c266SJung-uk Kim     ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE;
531*a159c266SJung-uk Kim     ReturnObj.Pointer = AcpiGbl_DbBuffer;
532*a159c266SJung-uk Kim 
533*a159c266SJung-uk Kim     /* Attempt to convert the raw buffer to a resource list */
534*a159c266SJung-uk Kim 
535*a159c266SJung-uk Kim     Status = AcpiRsCreateResourceList (Node->Object, &ReturnObj);
536*a159c266SJung-uk Kim 
537*a159c266SJung-uk Kim     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
538*a159c266SJung-uk Kim     AcpiDbgLevel |= ACPI_LV_RESOURCES;
539*a159c266SJung-uk Kim 
540*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
541*a159c266SJung-uk Kim     {
542*a159c266SJung-uk Kim         AcpiOsPrintf ("Could not convert Buffer to a resource list: %s, %s\n",
543*a159c266SJung-uk Kim             BufferArg, AcpiFormatException (Status));
544*a159c266SJung-uk Kim         goto DumpBuffer;
545*a159c266SJung-uk Kim     }
546*a159c266SJung-uk Kim 
547*a159c266SJung-uk Kim     /* Now we can dump the resource list */
548*a159c266SJung-uk Kim 
549*a159c266SJung-uk Kim     AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
550*a159c266SJung-uk Kim         ReturnObj.Pointer));
551*a159c266SJung-uk Kim 
552*a159c266SJung-uk Kim DumpBuffer:
553*a159c266SJung-uk Kim     AcpiOsPrintf ("\nRaw data buffer:\n");
554*a159c266SJung-uk Kim     AcpiUtDumpBuffer ((UINT8 *) Node->Object->Buffer.Pointer,
555*a159c266SJung-uk Kim         Node->Object->Buffer.Length,
556*a159c266SJung-uk Kim         DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
557*a159c266SJung-uk Kim 
558*a159c266SJung-uk Kim     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
559*a159c266SJung-uk Kim     return;
560*a159c266SJung-uk Kim }
561*a159c266SJung-uk Kim 
562*a159c266SJung-uk Kim 
563*a159c266SJung-uk Kim /*******************************************************************************
564*a159c266SJung-uk Kim  *
565*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmCompareAmlResources
566*a159c266SJung-uk Kim  *
567*a159c266SJung-uk Kim  * PARAMETERS:  Aml1Buffer          - Contains first resource list
568*a159c266SJung-uk Kim  *              Aml1BufferLength    - Length of first resource list
569*a159c266SJung-uk Kim  *              Aml2Buffer          - Contains second resource list
570*a159c266SJung-uk Kim  *              Aml2BufferLength    - Length of second resource list
571*a159c266SJung-uk Kim  *
572*a159c266SJung-uk Kim  * RETURN:      None
573*a159c266SJung-uk Kim  *
574*a159c266SJung-uk Kim  * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in
575*a159c266SJung-uk Kim  *              order to isolate a miscompare to an individual resource)
576*a159c266SJung-uk Kim  *
577*a159c266SJung-uk Kim  ******************************************************************************/
578*a159c266SJung-uk Kim 
579*a159c266SJung-uk Kim static void
580*a159c266SJung-uk Kim AcpiDmCompareAmlResources (
581*a159c266SJung-uk Kim     UINT8                   *Aml1Buffer,
582*a159c266SJung-uk Kim     ACPI_RSDESC_SIZE        Aml1BufferLength,
583*a159c266SJung-uk Kim     UINT8                   *Aml2Buffer,
584*a159c266SJung-uk Kim     ACPI_RSDESC_SIZE        Aml2BufferLength)
585*a159c266SJung-uk Kim {
586*a159c266SJung-uk Kim     UINT8                   *Aml1;
587*a159c266SJung-uk Kim     UINT8                   *Aml2;
588*a159c266SJung-uk Kim     UINT8                   *Aml1End;
589*a159c266SJung-uk Kim     UINT8                   *Aml2End;
590*a159c266SJung-uk Kim     ACPI_RSDESC_SIZE        Aml1Length;
591*a159c266SJung-uk Kim     ACPI_RSDESC_SIZE        Aml2Length;
592*a159c266SJung-uk Kim     ACPI_RSDESC_SIZE        Offset = 0;
593*a159c266SJung-uk Kim     UINT8                   ResourceType;
594*a159c266SJung-uk Kim     UINT32                  Count = 0;
595*a159c266SJung-uk Kim     UINT32                  i;
596*a159c266SJung-uk Kim 
597*a159c266SJung-uk Kim 
598*a159c266SJung-uk Kim     /* Compare overall buffer sizes (may be different due to size rounding) */
599*a159c266SJung-uk Kim 
600*a159c266SJung-uk Kim     if (Aml1BufferLength != Aml2BufferLength)
601*a159c266SJung-uk Kim     {
602*a159c266SJung-uk Kim         AcpiOsPrintf (
603*a159c266SJung-uk Kim             "**** Buffer length mismatch in converted AML: Original %X, New %X ****\n",
604*a159c266SJung-uk Kim             Aml1BufferLength, Aml2BufferLength);
605*a159c266SJung-uk Kim     }
606*a159c266SJung-uk Kim 
607*a159c266SJung-uk Kim     Aml1 = Aml1Buffer;
608*a159c266SJung-uk Kim     Aml2 = Aml2Buffer;
609*a159c266SJung-uk Kim     Aml1End = Aml1Buffer + Aml1BufferLength;
610*a159c266SJung-uk Kim     Aml2End = Aml2Buffer + Aml2BufferLength;
611*a159c266SJung-uk Kim 
612*a159c266SJung-uk Kim     /* Walk the descriptor lists, comparing each descriptor */
613*a159c266SJung-uk Kim 
614*a159c266SJung-uk Kim     while ((Aml1 < Aml1End) && (Aml2 < Aml2End))
615*a159c266SJung-uk Kim     {
616*a159c266SJung-uk Kim         /* Get the lengths of each descriptor */
617*a159c266SJung-uk Kim 
618*a159c266SJung-uk Kim         Aml1Length = AcpiUtGetDescriptorLength (Aml1);
619*a159c266SJung-uk Kim         Aml2Length = AcpiUtGetDescriptorLength (Aml2);
620*a159c266SJung-uk Kim         ResourceType = AcpiUtGetResourceType (Aml1);
621*a159c266SJung-uk Kim 
622*a159c266SJung-uk Kim         /* Check for descriptor length match */
623*a159c266SJung-uk Kim 
624*a159c266SJung-uk Kim         if (Aml1Length != Aml2Length)
625*a159c266SJung-uk Kim         {
626*a159c266SJung-uk Kim             AcpiOsPrintf (
627*a159c266SJung-uk Kim                 "**** Length mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X Len1 %X, Len2 %X ****\n",
628*a159c266SJung-uk Kim                 Count, ResourceType, Offset, Aml1Length, Aml2Length);
629*a159c266SJung-uk Kim         }
630*a159c266SJung-uk Kim 
631*a159c266SJung-uk Kim         /* Check for descriptor byte match */
632*a159c266SJung-uk Kim 
633*a159c266SJung-uk Kim         else if (ACPI_MEMCMP (Aml1, Aml2, Aml1Length))
634*a159c266SJung-uk Kim         {
635*a159c266SJung-uk Kim             AcpiOsPrintf (
636*a159c266SJung-uk Kim                 "**** Data mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X ****\n",
637*a159c266SJung-uk Kim                 Count, ResourceType, Offset);
638*a159c266SJung-uk Kim 
639*a159c266SJung-uk Kim             for (i = 0; i < Aml1Length; i++)
640*a159c266SJung-uk Kim             {
641*a159c266SJung-uk Kim                 if (Aml1[i] != Aml2[i])
642*a159c266SJung-uk Kim                 {
643*a159c266SJung-uk Kim                     AcpiOsPrintf ("Mismatch at byte offset %.2X: is %2.2X, should be %2.2X\n",
644*a159c266SJung-uk Kim                         i, Aml2[i], Aml1[i]);
645*a159c266SJung-uk Kim                 }
646*a159c266SJung-uk Kim             }
647*a159c266SJung-uk Kim         }
648*a159c266SJung-uk Kim 
649*a159c266SJung-uk Kim         /* Exit on EndTag descriptor */
650*a159c266SJung-uk Kim 
651*a159c266SJung-uk Kim         if (ResourceType == ACPI_RESOURCE_NAME_END_TAG)
652*a159c266SJung-uk Kim         {
653*a159c266SJung-uk Kim             return;
654*a159c266SJung-uk Kim         }
655*a159c266SJung-uk Kim 
656*a159c266SJung-uk Kim         /* Point to next descriptor in each buffer */
657*a159c266SJung-uk Kim 
658*a159c266SJung-uk Kim         Count++;
659*a159c266SJung-uk Kim         Offset += Aml1Length;
660*a159c266SJung-uk Kim         Aml1 += Aml1Length;
661*a159c266SJung-uk Kim         Aml2 += Aml2Length;
662*a159c266SJung-uk Kim     }
663*a159c266SJung-uk Kim }
664*a159c266SJung-uk Kim 
665*a159c266SJung-uk Kim 
666*a159c266SJung-uk Kim /*******************************************************************************
667*a159c266SJung-uk Kim  *
668*a159c266SJung-uk Kim  * FUNCTION:    AcpiDmTestResourceConversion
669*a159c266SJung-uk Kim  *
670*a159c266SJung-uk Kim  * PARAMETERS:  Node            - Parent device node
671*a159c266SJung-uk Kim  *              Name            - resource method name (_CRS)
672*a159c266SJung-uk Kim  *
673*a159c266SJung-uk Kim  * RETURN:      Status
674*a159c266SJung-uk Kim  *
675*a159c266SJung-uk Kim  * DESCRIPTION: Compare the original AML with a conversion of the AML to
676*a159c266SJung-uk Kim  *              internal resource list, then back to AML.
677*a159c266SJung-uk Kim  *
678*a159c266SJung-uk Kim  ******************************************************************************/
679*a159c266SJung-uk Kim 
680*a159c266SJung-uk Kim static ACPI_STATUS
681*a159c266SJung-uk Kim AcpiDmTestResourceConversion (
682*a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node,
683*a159c266SJung-uk Kim     char                    *Name)
684*a159c266SJung-uk Kim {
685*a159c266SJung-uk Kim     ACPI_STATUS             Status;
686*a159c266SJung-uk Kim     ACPI_BUFFER             ReturnObj;
687*a159c266SJung-uk Kim     ACPI_BUFFER             ResourceObj;
688*a159c266SJung-uk Kim     ACPI_BUFFER             NewAml;
689*a159c266SJung-uk Kim     ACPI_OBJECT             *OriginalAml;
690*a159c266SJung-uk Kim 
691*a159c266SJung-uk Kim 
692*a159c266SJung-uk Kim     AcpiOsPrintf ("Resource Conversion Comparison:\n");
693*a159c266SJung-uk Kim 
694*a159c266SJung-uk Kim     NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
695*a159c266SJung-uk Kim     ReturnObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
696*a159c266SJung-uk Kim     ResourceObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
697*a159c266SJung-uk Kim 
698*a159c266SJung-uk Kim     /* Get the original _CRS AML resource template */
699*a159c266SJung-uk Kim 
700*a159c266SJung-uk Kim     Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnObj);
701*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
702*a159c266SJung-uk Kim     {
703*a159c266SJung-uk Kim         AcpiOsPrintf ("Could not obtain %s: %s\n",
704*a159c266SJung-uk Kim             Name, AcpiFormatException (Status));
705*a159c266SJung-uk Kim         return (Status);
706*a159c266SJung-uk Kim     }
707*a159c266SJung-uk Kim 
708*a159c266SJung-uk Kim     /* Get the AML resource template, converted to internal resource structs */
709*a159c266SJung-uk Kim 
710*a159c266SJung-uk Kim     Status = AcpiGetCurrentResources (Node, &ResourceObj);
711*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
712*a159c266SJung-uk Kim     {
713*a159c266SJung-uk Kim         AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
714*a159c266SJung-uk Kim             AcpiFormatException (Status));
715*a159c266SJung-uk Kim         goto Exit1;
716*a159c266SJung-uk Kim     }
717*a159c266SJung-uk Kim 
718*a159c266SJung-uk Kim     /* Convert internal resource list to external AML resource template */
719*a159c266SJung-uk Kim 
720*a159c266SJung-uk Kim     Status = AcpiRsCreateAmlResources (ResourceObj.Pointer, &NewAml);
721*a159c266SJung-uk Kim     if (ACPI_FAILURE (Status))
722*a159c266SJung-uk Kim     {
723*a159c266SJung-uk Kim         AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n",
724*a159c266SJung-uk Kim             AcpiFormatException (Status));
725*a159c266SJung-uk Kim         goto Exit2;
726*a159c266SJung-uk Kim     }
727*a159c266SJung-uk Kim 
728*a159c266SJung-uk Kim     /* Compare original AML to the newly created AML resource list */
729*a159c266SJung-uk Kim 
730*a159c266SJung-uk Kim     OriginalAml = ReturnObj.Pointer;
731*a159c266SJung-uk Kim 
732*a159c266SJung-uk Kim     AcpiDmCompareAmlResources (
733*a159c266SJung-uk Kim         OriginalAml->Buffer.Pointer, (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
734*a159c266SJung-uk Kim         NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length);
735*a159c266SJung-uk Kim 
736*a159c266SJung-uk Kim     /* Cleanup and exit */
737*a159c266SJung-uk Kim 
738*a159c266SJung-uk Kim     ACPI_FREE (NewAml.Pointer);
739*a159c266SJung-uk Kim Exit2:
740*a159c266SJung-uk Kim     ACPI_FREE (ResourceObj.Pointer);
741*a159c266SJung-uk Kim Exit1:
742*a159c266SJung-uk Kim     ACPI_FREE (ReturnObj.Pointer);
743*a159c266SJung-uk Kim     return (Status);
744*a159c266SJung-uk Kim }
745*a159c266SJung-uk Kim 
746*a159c266SJung-uk Kim 
747*a159c266SJung-uk Kim /*******************************************************************************
748*a159c266SJung-uk Kim  *
749*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbResourceCallback
750*a159c266SJung-uk Kim  *
751*a159c266SJung-uk Kim  * PARAMETERS:  ACPI_WALK_RESOURCE_CALLBACK
752*a159c266SJung-uk Kim  *
753*a159c266SJung-uk Kim  * RETURN:      Status
754*a159c266SJung-uk Kim  *
755*a159c266SJung-uk Kim  * DESCRIPTION: Simple callback to exercise AcpiWalkResources
756*a159c266SJung-uk Kim  *
757*a159c266SJung-uk Kim  ******************************************************************************/
758*a159c266SJung-uk Kim 
759*a159c266SJung-uk Kim static ACPI_STATUS
760*a159c266SJung-uk Kim AcpiDbResourceCallback (
761*a159c266SJung-uk Kim     ACPI_RESOURCE           *Resource,
762*a159c266SJung-uk Kim     void                    *Context)
763*a159c266SJung-uk Kim {
764*a159c266SJung-uk Kim 
765*a159c266SJung-uk Kim     return (AE_OK);
766*a159c266SJung-uk Kim }
767*a159c266SJung-uk Kim 
768*a159c266SJung-uk Kim 
769*a159c266SJung-uk Kim /*******************************************************************************
770*a159c266SJung-uk Kim  *
771*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbDeviceResources
772*a159c266SJung-uk Kim  *
773*a159c266SJung-uk Kim  * PARAMETERS:  ACPI_WALK_CALLBACK
774*a159c266SJung-uk Kim  *
775*a159c266SJung-uk Kim  * RETURN:      Status
776*a159c266SJung-uk Kim  *
777*a159c266SJung-uk Kim  * DESCRIPTION: Display the _PRT/_CRS/_PRS resources for a device object.
778*a159c266SJung-uk Kim  *
779*a159c266SJung-uk Kim  ******************************************************************************/
780*a159c266SJung-uk Kim 
781*a159c266SJung-uk Kim static ACPI_STATUS
782*a159c266SJung-uk Kim AcpiDbDeviceResources (
783*a159c266SJung-uk Kim     ACPI_HANDLE             ObjHandle,
784*a159c266SJung-uk Kim     UINT32                  NestingLevel,
785*a159c266SJung-uk Kim     void                    *Context,
786*a159c266SJung-uk Kim     void                    **ReturnValue)
787*a159c266SJung-uk Kim {
788*a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
789*a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *PrtNode = NULL;
790*a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *CrsNode = NULL;
791*a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *PrsNode = NULL;
792*a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *AeiNode = NULL;
793*a159c266SJung-uk Kim     char                    *ParentPath;
794*a159c266SJung-uk Kim     ACPI_BUFFER             ReturnObj;
795*a159c266SJung-uk Kim     ACPI_STATUS             Status;
796*a159c266SJung-uk Kim 
797*a159c266SJung-uk Kim 
798*a159c266SJung-uk Kim     Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
799*a159c266SJung-uk Kim     ParentPath = AcpiNsGetExternalPathname (Node);
800*a159c266SJung-uk Kim     if (!ParentPath)
801*a159c266SJung-uk Kim     {
802*a159c266SJung-uk Kim         return (AE_NO_MEMORY);
803*a159c266SJung-uk Kim     }
804*a159c266SJung-uk Kim 
805*a159c266SJung-uk Kim     /* Get handles to the resource methods for this device */
806*a159c266SJung-uk Kim 
807*a159c266SJung-uk Kim     (void) AcpiGetHandle (Node, METHOD_NAME__PRT, ACPI_CAST_PTR (ACPI_HANDLE, &PrtNode));
808*a159c266SJung-uk Kim     (void) AcpiGetHandle (Node, METHOD_NAME__CRS, ACPI_CAST_PTR (ACPI_HANDLE, &CrsNode));
809*a159c266SJung-uk Kim     (void) AcpiGetHandle (Node, METHOD_NAME__PRS, ACPI_CAST_PTR (ACPI_HANDLE, &PrsNode));
810*a159c266SJung-uk Kim     (void) AcpiGetHandle (Node, METHOD_NAME__AEI, ACPI_CAST_PTR (ACPI_HANDLE, &AeiNode));
811*a159c266SJung-uk Kim     if (!PrtNode && !CrsNode && !PrsNode && !AeiNode)
812*a159c266SJung-uk Kim     {
813*a159c266SJung-uk Kim         goto Cleanup;   /* Nothing to do */
814*a159c266SJung-uk Kim     }
815*a159c266SJung-uk Kim 
816*a159c266SJung-uk Kim     AcpiOsPrintf ("\nDevice: %s\n", ParentPath);
817*a159c266SJung-uk Kim 
818*a159c266SJung-uk Kim     /* Prepare for a return object of arbitrary size */
819*a159c266SJung-uk Kim 
820*a159c266SJung-uk Kim     ReturnObj.Pointer = AcpiGbl_DbBuffer;
821*a159c266SJung-uk Kim     ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
822*a159c266SJung-uk Kim 
823*a159c266SJung-uk Kim 
824*a159c266SJung-uk Kim     /* _PRT */
825*a159c266SJung-uk Kim 
826*a159c266SJung-uk Kim     if (PrtNode)
827*a159c266SJung-uk Kim     {
828*a159c266SJung-uk Kim         AcpiOsPrintf ("Evaluating _PRT\n");
829*a159c266SJung-uk Kim 
830*a159c266SJung-uk Kim         Status = AcpiEvaluateObject (PrtNode, NULL, NULL, &ReturnObj);
831*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
832*a159c266SJung-uk Kim         {
833*a159c266SJung-uk Kim             AcpiOsPrintf ("Could not evaluate _PRT: %s\n",
834*a159c266SJung-uk Kim                 AcpiFormatException (Status));
835*a159c266SJung-uk Kim             goto GetCrs;
836*a159c266SJung-uk Kim         }
837*a159c266SJung-uk Kim 
838*a159c266SJung-uk Kim         ReturnObj.Pointer = AcpiGbl_DbBuffer;
839*a159c266SJung-uk Kim         ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
840*a159c266SJung-uk Kim 
841*a159c266SJung-uk Kim         Status = AcpiGetIrqRoutingTable (Node, &ReturnObj);
842*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
843*a159c266SJung-uk Kim         {
844*a159c266SJung-uk Kim             AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n",
845*a159c266SJung-uk Kim                 AcpiFormatException (Status));
846*a159c266SJung-uk Kim             goto GetCrs;
847*a159c266SJung-uk Kim         }
848*a159c266SJung-uk Kim 
849*a159c266SJung-uk Kim         AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer));
850*a159c266SJung-uk Kim     }
851*a159c266SJung-uk Kim 
852*a159c266SJung-uk Kim 
853*a159c266SJung-uk Kim     /* _CRS */
854*a159c266SJung-uk Kim 
855*a159c266SJung-uk Kim GetCrs:
856*a159c266SJung-uk Kim     if (CrsNode)
857*a159c266SJung-uk Kim     {
858*a159c266SJung-uk Kim         AcpiOsPrintf ("Evaluating _CRS\n");
859*a159c266SJung-uk Kim 
860*a159c266SJung-uk Kim         ReturnObj.Pointer = AcpiGbl_DbBuffer;
861*a159c266SJung-uk Kim         ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
862*a159c266SJung-uk Kim 
863*a159c266SJung-uk Kim         Status = AcpiEvaluateObject (CrsNode, NULL, NULL, &ReturnObj);
864*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
865*a159c266SJung-uk Kim         {
866*a159c266SJung-uk Kim             AcpiOsPrintf ("Could not evaluate _CRS: %s\n",
867*a159c266SJung-uk Kim                 AcpiFormatException (Status));
868*a159c266SJung-uk Kim             goto GetPrs;
869*a159c266SJung-uk Kim         }
870*a159c266SJung-uk Kim 
871*a159c266SJung-uk Kim         /* This code is here to exercise the AcpiWalkResources interface */
872*a159c266SJung-uk Kim 
873*a159c266SJung-uk Kim         Status = AcpiWalkResources (Node, METHOD_NAME__CRS,
874*a159c266SJung-uk Kim             AcpiDbResourceCallback, NULL);
875*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
876*a159c266SJung-uk Kim         {
877*a159c266SJung-uk Kim             AcpiOsPrintf ("AcpiWalkResources failed: %s\n",
878*a159c266SJung-uk Kim                 AcpiFormatException (Status));
879*a159c266SJung-uk Kim             goto GetPrs;
880*a159c266SJung-uk Kim         }
881*a159c266SJung-uk Kim 
882*a159c266SJung-uk Kim         /* Get the _CRS resource list */
883*a159c266SJung-uk Kim 
884*a159c266SJung-uk Kim         ReturnObj.Pointer = AcpiGbl_DbBuffer;
885*a159c266SJung-uk Kim         ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
886*a159c266SJung-uk Kim 
887*a159c266SJung-uk Kim         Status = AcpiGetCurrentResources (Node, &ReturnObj);
888*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
889*a159c266SJung-uk Kim         {
890*a159c266SJung-uk Kim             AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
891*a159c266SJung-uk Kim                 AcpiFormatException (Status));
892*a159c266SJung-uk Kim             goto GetPrs;
893*a159c266SJung-uk Kim         }
894*a159c266SJung-uk Kim 
895*a159c266SJung-uk Kim         /* Dump the _CRS resource list */
896*a159c266SJung-uk Kim 
897*a159c266SJung-uk Kim         AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
898*a159c266SJung-uk Kim             ReturnObj.Pointer));
899*a159c266SJung-uk Kim 
900*a159c266SJung-uk Kim         /*
901*a159c266SJung-uk Kim          * Perform comparison of original AML to newly created AML. This tests both
902*a159c266SJung-uk Kim          * the AML->Resource conversion and the Resource->Aml conversion.
903*a159c266SJung-uk Kim          */
904*a159c266SJung-uk Kim         Status = AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS);
905*a159c266SJung-uk Kim 
906*a159c266SJung-uk Kim         /* Execute _SRS with the resource list */
907*a159c266SJung-uk Kim 
908*a159c266SJung-uk Kim         Status = AcpiSetCurrentResources (Node, &ReturnObj);
909*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
910*a159c266SJung-uk Kim         {
911*a159c266SJung-uk Kim             AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n",
912*a159c266SJung-uk Kim                 AcpiFormatException (Status));
913*a159c266SJung-uk Kim             goto GetPrs;
914*a159c266SJung-uk Kim         }
915*a159c266SJung-uk Kim     }
916*a159c266SJung-uk Kim 
917*a159c266SJung-uk Kim 
918*a159c266SJung-uk Kim     /* _PRS */
919*a159c266SJung-uk Kim 
920*a159c266SJung-uk Kim GetPrs:
921*a159c266SJung-uk Kim     if (PrsNode)
922*a159c266SJung-uk Kim     {
923*a159c266SJung-uk Kim         AcpiOsPrintf ("Evaluating _PRS\n");
924*a159c266SJung-uk Kim 
925*a159c266SJung-uk Kim         ReturnObj.Pointer = AcpiGbl_DbBuffer;
926*a159c266SJung-uk Kim         ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
927*a159c266SJung-uk Kim 
928*a159c266SJung-uk Kim         Status = AcpiEvaluateObject (PrsNode, NULL, NULL, &ReturnObj);
929*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
930*a159c266SJung-uk Kim         {
931*a159c266SJung-uk Kim             AcpiOsPrintf ("Could not evaluate _PRS: %s\n",
932*a159c266SJung-uk Kim                 AcpiFormatException (Status));
933*a159c266SJung-uk Kim             goto GetAei;
934*a159c266SJung-uk Kim         }
935*a159c266SJung-uk Kim 
936*a159c266SJung-uk Kim         ReturnObj.Pointer = AcpiGbl_DbBuffer;
937*a159c266SJung-uk Kim         ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
938*a159c266SJung-uk Kim 
939*a159c266SJung-uk Kim         Status = AcpiGetPossibleResources (Node, &ReturnObj);
940*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
941*a159c266SJung-uk Kim         {
942*a159c266SJung-uk Kim             AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n",
943*a159c266SJung-uk Kim                 AcpiFormatException (Status));
944*a159c266SJung-uk Kim             goto GetAei;
945*a159c266SJung-uk Kim         }
946*a159c266SJung-uk Kim 
947*a159c266SJung-uk Kim         AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer));
948*a159c266SJung-uk Kim     }
949*a159c266SJung-uk Kim 
950*a159c266SJung-uk Kim 
951*a159c266SJung-uk Kim     /* _AEI */
952*a159c266SJung-uk Kim 
953*a159c266SJung-uk Kim GetAei:
954*a159c266SJung-uk Kim     if (AeiNode)
955*a159c266SJung-uk Kim     {
956*a159c266SJung-uk Kim         AcpiOsPrintf ("Evaluating _AEI\n");
957*a159c266SJung-uk Kim 
958*a159c266SJung-uk Kim         ReturnObj.Pointer = AcpiGbl_DbBuffer;
959*a159c266SJung-uk Kim         ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
960*a159c266SJung-uk Kim 
961*a159c266SJung-uk Kim         Status = AcpiEvaluateObject (AeiNode, NULL, NULL, &ReturnObj);
962*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
963*a159c266SJung-uk Kim         {
964*a159c266SJung-uk Kim             AcpiOsPrintf ("Could not evaluate _AEI: %s\n",
965*a159c266SJung-uk Kim                 AcpiFormatException (Status));
966*a159c266SJung-uk Kim             goto Cleanup;
967*a159c266SJung-uk Kim         }
968*a159c266SJung-uk Kim 
969*a159c266SJung-uk Kim         ReturnObj.Pointer = AcpiGbl_DbBuffer;
970*a159c266SJung-uk Kim         ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
971*a159c266SJung-uk Kim 
972*a159c266SJung-uk Kim         Status = AcpiGetEventResources (Node, &ReturnObj);
973*a159c266SJung-uk Kim         if (ACPI_FAILURE (Status))
974*a159c266SJung-uk Kim         {
975*a159c266SJung-uk Kim             AcpiOsPrintf ("AcpiGetEventResources failed: %s\n",
976*a159c266SJung-uk Kim                 AcpiFormatException (Status));
977*a159c266SJung-uk Kim             goto Cleanup;
978*a159c266SJung-uk Kim         }
979*a159c266SJung-uk Kim 
980*a159c266SJung-uk Kim         AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer));
981*a159c266SJung-uk Kim     }
982*a159c266SJung-uk Kim 
983*a159c266SJung-uk Kim 
984*a159c266SJung-uk Kim Cleanup:
985*a159c266SJung-uk Kim     ACPI_FREE (ParentPath);
986*a159c266SJung-uk Kim     return (AE_OK);
987*a159c266SJung-uk Kim }
988*a159c266SJung-uk Kim 
989*a159c266SJung-uk Kim 
990*a159c266SJung-uk Kim /*******************************************************************************
991*a159c266SJung-uk Kim  *
992*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbDisplayResources
993*a159c266SJung-uk Kim  *
994*a159c266SJung-uk Kim  * PARAMETERS:  ObjectArg       - String object name or object pointer.
995*a159c266SJung-uk Kim  *                                "*" means "display resources for all devices"
996*a159c266SJung-uk Kim  *
997*a159c266SJung-uk Kim  * RETURN:      None
998*a159c266SJung-uk Kim  *
999*a159c266SJung-uk Kim  * DESCRIPTION: Display the resource objects associated with a device.
1000*a159c266SJung-uk Kim  *
1001*a159c266SJung-uk Kim  ******************************************************************************/
1002*a159c266SJung-uk Kim 
1003*a159c266SJung-uk Kim void
1004*a159c266SJung-uk Kim AcpiDbDisplayResources (
1005*a159c266SJung-uk Kim     char                    *ObjectArg)
1006*a159c266SJung-uk Kim {
1007*a159c266SJung-uk Kim     ACPI_NAMESPACE_NODE     *Node;
1008*a159c266SJung-uk Kim 
1009*a159c266SJung-uk Kim 
1010*a159c266SJung-uk Kim     AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
1011*a159c266SJung-uk Kim     AcpiDbgLevel |= ACPI_LV_RESOURCES;
1012*a159c266SJung-uk Kim 
1013*a159c266SJung-uk Kim     /* Asterisk means "display resources for all devices" */
1014*a159c266SJung-uk Kim 
1015*a159c266SJung-uk Kim     if (!ACPI_STRCMP (ObjectArg, "*"))
1016*a159c266SJung-uk Kim     {
1017*a159c266SJung-uk Kim         (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
1018*a159c266SJung-uk Kim                     ACPI_UINT32_MAX, AcpiDbDeviceResources, NULL, NULL, NULL);
1019*a159c266SJung-uk Kim     }
1020*a159c266SJung-uk Kim     else
1021*a159c266SJung-uk Kim     {
1022*a159c266SJung-uk Kim         /* Convert string to object pointer */
1023*a159c266SJung-uk Kim 
1024*a159c266SJung-uk Kim         Node = AcpiDbConvertToNode (ObjectArg);
1025*a159c266SJung-uk Kim         if (Node)
1026*a159c266SJung-uk Kim         {
1027*a159c266SJung-uk Kim             if (Node->Type != ACPI_TYPE_DEVICE)
1028*a159c266SJung-uk Kim             {
1029*a159c266SJung-uk Kim                 AcpiOsPrintf ("%4.4s: Name is not a device object (%s)\n",
1030*a159c266SJung-uk Kim                     Node->Name.Ascii, AcpiUtGetTypeName (Node->Type));
1031*a159c266SJung-uk Kim             }
1032*a159c266SJung-uk Kim             else
1033*a159c266SJung-uk Kim             {
1034*a159c266SJung-uk Kim                 (void) AcpiDbDeviceResources (Node, 0, NULL, NULL);
1035*a159c266SJung-uk Kim             }
1036*a159c266SJung-uk Kim         }
1037*a159c266SJung-uk Kim     }
1038*a159c266SJung-uk Kim 
1039*a159c266SJung-uk Kim     AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
1040*a159c266SJung-uk Kim }
1041*a159c266SJung-uk Kim 
1042*a159c266SJung-uk Kim 
1043*a159c266SJung-uk Kim #if (!ACPI_REDUCED_HARDWARE)
1044*a159c266SJung-uk Kim /*******************************************************************************
1045*a159c266SJung-uk Kim  *
1046*a159c266SJung-uk Kim  * FUNCTION:    AcpiDbGenerateGpe
1047*a159c266SJung-uk Kim  *
1048*a159c266SJung-uk Kim  * PARAMETERS:  GpeArg          - Raw GPE number, ascii string
1049*a159c266SJung-uk Kim  *              BlockArg        - GPE block number, ascii string
1050*a159c266SJung-uk Kim  *                                0 or 1 for FADT GPE blocks
1051*a159c266SJung-uk Kim  *
1052*a159c266SJung-uk Kim  * RETURN:      None
1053*a159c266SJung-uk Kim  *
1054*a159c266SJung-uk Kim  * DESCRIPTION: Generate a GPE
1055*a159c266SJung-uk Kim  *
1056*a159c266SJung-uk Kim  ******************************************************************************/
1057*a159c266SJung-uk Kim 
1058*a159c266SJung-uk Kim void
1059*a159c266SJung-uk Kim AcpiDbGenerateGpe (
1060*a159c266SJung-uk Kim     char                    *GpeArg,
1061*a159c266SJung-uk Kim     char                    *BlockArg)
1062*a159c266SJung-uk Kim {
1063*a159c266SJung-uk Kim     UINT32                  BlockNumber;
1064*a159c266SJung-uk Kim     UINT32                  GpeNumber;
1065*a159c266SJung-uk Kim     ACPI_GPE_EVENT_INFO     *GpeEventInfo;
1066*a159c266SJung-uk Kim 
1067*a159c266SJung-uk Kim 
1068*a159c266SJung-uk Kim     GpeNumber   = ACPI_STRTOUL (GpeArg, NULL, 0);
1069*a159c266SJung-uk Kim     BlockNumber = ACPI_STRTOUL (BlockArg, NULL, 0);
1070*a159c266SJung-uk Kim 
1071*a159c266SJung-uk Kim 
1072*a159c266SJung-uk Kim     GpeEventInfo = AcpiEvGetGpeEventInfo (ACPI_TO_POINTER (BlockNumber),
1073*a159c266SJung-uk Kim         GpeNumber);
1074*a159c266SJung-uk Kim     if (!GpeEventInfo)
1075*a159c266SJung-uk Kim     {
1076*a159c266SJung-uk Kim         AcpiOsPrintf ("Invalid GPE\n");
1077*a159c266SJung-uk Kim         return;
1078*a159c266SJung-uk Kim     }
1079*a159c266SJung-uk Kim 
1080*a159c266SJung-uk Kim     (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber);
1081*a159c266SJung-uk Kim }
1082*a159c266SJung-uk Kim #endif /* !ACPI_REDUCED_HARDWARE */
1083*a159c266SJung-uk Kim 
1084*a159c266SJung-uk Kim #endif /* ACPI_DEBUGGER */
1085