167754Smsmith/*******************************************************************************
267754Smsmith *
3218590Sjkim * Module Name: dbcmds - Miscellaneous debug commands and output routines
467754Smsmith *
567754Smsmith ******************************************************************************/
667754Smsmith
7217365Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp.
970243Smsmith * All rights reserved.
1067754Smsmith *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
2567754Smsmith *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
2967754Smsmith *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
4367754Smsmith
44193341Sjkim#include <contrib/dev/acpica/include/acpi.h>
45193341Sjkim#include <contrib/dev/acpica/include/accommon.h>
46193341Sjkim#include <contrib/dev/acpica/include/acevents.h>
47193341Sjkim#include <contrib/dev/acpica/include/acdebug.h>
48228110Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
49193341Sjkim#include <contrib/dev/acpica/include/acresrc.h>
50193341Sjkim#include <contrib/dev/acpica/include/actables.h>
51138287Smarks
5267754Smsmith
53102550Siwasaki#define _COMPONENT          ACPI_CA_DEBUGGER
5491116Smsmith        ACPI_MODULE_NAME    ("dbcmds")
5567754Smsmith
56198237Sjkim
57151937Sjkim/* Local prototypes */
5867754Smsmith
59151937Sjkimstatic void
60151937SjkimAcpiDmCompareAmlResources (
61151937Sjkim    UINT8                   *Aml1Buffer,
62151937Sjkim    ACPI_RSDESC_SIZE        Aml1BufferLength,
63151937Sjkim    UINT8                   *Aml2Buffer,
64151937Sjkim    ACPI_RSDESC_SIZE        Aml2BufferLength);
65151937Sjkim
66151937Sjkimstatic ACPI_STATUS
67151937SjkimAcpiDmTestResourceConversion (
68151937Sjkim    ACPI_NAMESPACE_NODE     *Node,
69151937Sjkim    char                    *Name);
70151937Sjkim
71228110Sjkimstatic ACPI_STATUS
72228110SjkimAcpiDbResourceCallback (
73228110Sjkim    ACPI_RESOURCE           *Resource,
74228110Sjkim    void                    *Context);
75151937Sjkim
76228110Sjkimstatic ACPI_STATUS
77228110SjkimAcpiDbDeviceResources (
78228110Sjkim    ACPI_HANDLE             ObjHandle,
79228110Sjkim    UINT32                  NestingLevel,
80228110Sjkim    void                    *Context,
81228110Sjkim    void                    **ReturnValue);
82228110Sjkim
83245582Sjkimstatic void
84245582SjkimAcpiDbDoOneSleepState (
85245582Sjkim    UINT8                   SleepState);
86228110Sjkim
87245582Sjkim
88306536Sjkimstatic char                 *AcpiDbTraceMethodName = NULL;
89306536Sjkim
90306536Sjkim
91138287Smarks/*******************************************************************************
92138287Smarks *
93151937Sjkim * FUNCTION:    AcpiDbConvertToNode
94151937Sjkim *
95245582Sjkim * PARAMETERS:  InString            - String to convert
96151937Sjkim *
97151937Sjkim * RETURN:      Pointer to a NS node
98151937Sjkim *
99241973Sjkim * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or
100245582Sjkim *              alphanumeric strings.
101151937Sjkim *
102151937Sjkim ******************************************************************************/
103151937Sjkim
104218590SjkimACPI_NAMESPACE_NODE *
105151937SjkimAcpiDbConvertToNode (
106151937Sjkim    char                    *InString)
107151937Sjkim{
108151937Sjkim    ACPI_NAMESPACE_NODE     *Node;
109252279Sjkim    ACPI_SIZE               Address;
110151937Sjkim
111151937Sjkim
112151937Sjkim    if ((*InString >= 0x30) && (*InString <= 0x39))
113151937Sjkim    {
114151937Sjkim        /* Numeric argument, convert */
115151937Sjkim
116306536Sjkim        Address = strtoul (InString, NULL, 16);
117252279Sjkim        Node = ACPI_TO_POINTER (Address);
118151937Sjkim        if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE)))
119151937Sjkim        {
120306536Sjkim            AcpiOsPrintf ("Address %p is invalid", Node);
121151937Sjkim            return (NULL);
122151937Sjkim        }
123151937Sjkim
124151937Sjkim        /* Make sure pointer is valid NS node */
125151937Sjkim
126151937Sjkim        if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
127151937Sjkim        {
128281075Sdim            AcpiOsPrintf ("Address %p is not a valid namespace node [%s]\n",
129306536Sjkim                Node, AcpiUtGetDescriptorName (Node));
130151937Sjkim            return (NULL);
131151937Sjkim        }
132151937Sjkim    }
133151937Sjkim    else
134151937Sjkim    {
135245582Sjkim        /*
136245582Sjkim         * Alpha argument: The parameter is a name string that must be
137245582Sjkim         * resolved to a Namespace object.
138151937Sjkim         */
139151937Sjkim        Node = AcpiDbLocalNsLookup (InString);
140151937Sjkim        if (!Node)
141151937Sjkim        {
142306536Sjkim            AcpiOsPrintf (
143306536Sjkim                "Could not find [%s] in namespace, defaulting to root node\n",
144281075Sdim                InString);
145151937Sjkim            Node = AcpiGbl_RootNode;
146151937Sjkim        }
147151937Sjkim    }
148151937Sjkim
149151937Sjkim    return (Node);
150151937Sjkim}
151151937Sjkim
152151937Sjkim
153151937Sjkim/*******************************************************************************
154151937Sjkim *
155138287Smarks * FUNCTION:    AcpiDbSleep
156138287Smarks *
157245582Sjkim * PARAMETERS:  ObjectArg           - Desired sleep state (0-5). NULL means
158245582Sjkim *                                    invoke all possible sleep states.
159138287Smarks *
160138287Smarks * RETURN:      Status
161138287Smarks *
162245582Sjkim * DESCRIPTION: Simulate sleep/wake sequences
163138287Smarks *
164138287Smarks ******************************************************************************/
165138287Smarks
166129684SnjlACPI_STATUS
167129684SnjlAcpiDbSleep (
168129684Snjl    char                    *ObjectArg)
169129684Snjl{
170129684Snjl    UINT8                   SleepState;
171245582Sjkim    UINT32                  i;
172129684Snjl
173129684Snjl
174231844Sjkim    ACPI_FUNCTION_TRACE (AcpiDbSleep);
175231844Sjkim
176231844Sjkim
177245582Sjkim    /* Null input (no arguments) means to invoke all sleep states */
178245582Sjkim
179245582Sjkim    if (!ObjectArg)
180245582Sjkim    {
181245582Sjkim        AcpiOsPrintf ("Invoking all possible sleep states, 0-%d\n",
182245582Sjkim            ACPI_S_STATES_MAX);
183245582Sjkim
184245582Sjkim        for (i = 0; i <= ACPI_S_STATES_MAX; i++)
185245582Sjkim        {
186245582Sjkim            AcpiDbDoOneSleepState ((UINT8) i);
187245582Sjkim        }
188245582Sjkim
189245582Sjkim        return_ACPI_STATUS (AE_OK);
190245582Sjkim    }
191245582Sjkim
192245582Sjkim    /* Convert argument to binary and invoke the sleep state */
193245582Sjkim
194306536Sjkim    SleepState = (UINT8) strtoul (ObjectArg, NULL, 0);
195245582Sjkim    AcpiDbDoOneSleepState (SleepState);
196245582Sjkim    return_ACPI_STATUS (AE_OK);
197245582Sjkim}
198129684Snjl
199245582Sjkim
200245582Sjkim/*******************************************************************************
201245582Sjkim *
202245582Sjkim * FUNCTION:    AcpiDbDoOneSleepState
203245582Sjkim *
204245582Sjkim * PARAMETERS:  SleepState          - Desired sleep state (0-5)
205245582Sjkim *
206306536Sjkim * RETURN:      None
207245582Sjkim *
208245582Sjkim * DESCRIPTION: Simulate a sleep/wake sequence
209245582Sjkim *
210245582Sjkim ******************************************************************************/
211245582Sjkim
212245582Sjkimstatic void
213245582SjkimAcpiDbDoOneSleepState (
214245582Sjkim    UINT8                   SleepState)
215245582Sjkim{
216245582Sjkim    ACPI_STATUS             Status;
217245582Sjkim    UINT8                   SleepTypeA;
218245582Sjkim    UINT8                   SleepTypeB;
219245582Sjkim
220245582Sjkim
221245582Sjkim    /* Validate parameter */
222245582Sjkim
223245582Sjkim    if (SleepState > ACPI_S_STATES_MAX)
224245582Sjkim    {
225245582Sjkim        AcpiOsPrintf ("Sleep state %d out of range (%d max)\n",
226245582Sjkim            SleepState, ACPI_S_STATES_MAX);
227245582Sjkim        return;
228245582Sjkim    }
229245582Sjkim
230245582Sjkim    AcpiOsPrintf ("\n---- Invoking sleep state S%d (%s):\n",
231245582Sjkim        SleepState, AcpiGbl_SleepStateNames[SleepState]);
232245582Sjkim
233245582Sjkim    /* Get the values for the sleep type registers (for display only) */
234245582Sjkim
235245582Sjkim    Status = AcpiGetSleepTypeData (SleepState, &SleepTypeA, &SleepTypeB);
236245582Sjkim    if (ACPI_FAILURE (Status))
237245582Sjkim    {
238245582Sjkim        AcpiOsPrintf ("Could not evaluate [%s] method, %s\n",
239245582Sjkim            AcpiGbl_SleepStateNames[SleepState],
240245582Sjkim            AcpiFormatException (Status));
241245582Sjkim        return;
242245582Sjkim    }
243245582Sjkim
244245582Sjkim    AcpiOsPrintf (
245245582Sjkim        "Register values for sleep state S%d: Sleep-A: %.2X, Sleep-B: %.2X\n",
246245582Sjkim        SleepState, SleepTypeA, SleepTypeB);
247245582Sjkim
248245582Sjkim    /* Invoke the various sleep/wake interfaces */
249245582Sjkim
250245582Sjkim    AcpiOsPrintf ("**** Sleep: Prepare to sleep (S%d) ****\n",
251245582Sjkim        SleepState);
252129684Snjl    Status = AcpiEnterSleepStatePrep (SleepState);
253129684Snjl    if (ACPI_FAILURE (Status))
254129684Snjl    {
255231844Sjkim        goto ErrorExit;
256129684Snjl    }
257129684Snjl
258245582Sjkim    AcpiOsPrintf ("**** Sleep: Going to sleep (S%d) ****\n",
259245582Sjkim        SleepState);
260239340Sjkim    Status = AcpiEnterSleepState (SleepState);
261129684Snjl    if (ACPI_FAILURE (Status))
262129684Snjl    {
263231844Sjkim        goto ErrorExit;
264129684Snjl    }
265129684Snjl
266245582Sjkim    AcpiOsPrintf ("**** Wake: Prepare to return from sleep (S%d) ****\n",
267245582Sjkim        SleepState);
268239340Sjkim    Status = AcpiLeaveSleepStatePrep (SleepState);
269231844Sjkim    if (ACPI_FAILURE (Status))
270231844Sjkim    {
271231844Sjkim        goto ErrorExit;
272231844Sjkim    }
273231844Sjkim
274245582Sjkim    AcpiOsPrintf ("**** Wake: Return from sleep (S%d) ****\n",
275245582Sjkim        SleepState);
276129684Snjl    Status = AcpiLeaveSleepState (SleepState);
277231844Sjkim    if (ACPI_FAILURE (Status))
278231844Sjkim    {
279231844Sjkim        goto ErrorExit;
280231844Sjkim    }
281129684Snjl
282245582Sjkim    return;
283231844Sjkim
284231844Sjkim
285231844SjkimErrorExit:
286245582Sjkim    ACPI_EXCEPTION ((AE_INFO, Status, "During invocation of sleep state S%d",
287245582Sjkim        SleepState));
288129684Snjl}
289129684Snjl
290231844Sjkim
29167754Smsmith/*******************************************************************************
29267754Smsmith *
29377424Smsmith * FUNCTION:    AcpiDbDisplayLocks
29477424Smsmith *
29577424Smsmith * PARAMETERS:  None
29677424Smsmith *
29777424Smsmith * RETURN:      None
29877424Smsmith *
29977424Smsmith * DESCRIPTION: Display information about internal mutexes.
30077424Smsmith *
30177424Smsmith ******************************************************************************/
30277424Smsmith
30377424Smsmithvoid
304151937SjkimAcpiDbDisplayLocks (
305151937Sjkim    void)
30677424Smsmith{
30777424Smsmith    UINT32                  i;
30877424Smsmith
30977424Smsmith
310167802Sjkim    for (i = 0; i < ACPI_MAX_MUTEX; i++)
31177424Smsmith    {
31277424Smsmith        AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i),
313167802Sjkim            AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED
314167802Sjkim                ? "Locked" : "Unlocked");
31577424Smsmith    }
31677424Smsmith}
31777424Smsmith
31877424Smsmith
31977424Smsmith/*******************************************************************************
32077424Smsmith *
32167754Smsmith * FUNCTION:    AcpiDbDisplayTableInfo
32267754Smsmith *
323245582Sjkim * PARAMETERS:  TableArg            - Name of table to be displayed
32467754Smsmith *
32567754Smsmith * RETURN:      None
32667754Smsmith *
327241973Sjkim * DESCRIPTION: Display information about loaded tables. Current
32867754Smsmith *              implementation displays all loaded tables.
32967754Smsmith *
33067754Smsmith ******************************************************************************/
33167754Smsmith
33267754Smsmithvoid
33367754SmsmithAcpiDbDisplayTableInfo (
334114237Snjl    char                    *TableArg)
33567754Smsmith{
336193267Sjkim    UINT32                  i;
337117521Snjl    ACPI_TABLE_DESC         *TableDesc;
338193267Sjkim    ACPI_STATUS             Status;
33967754Smsmith
34067754Smsmith
341238381Sjkim    /* Header */
342238381Sjkim
343306536Sjkim    AcpiOsPrintf ("Idx ID    Status Type                    "
344306536Sjkim        "TableHeader (Sig, Address, Length, Misc)\n");
345238381Sjkim
346193267Sjkim    /* Walk the entire root table list */
347193267Sjkim
348207344Sjkim    for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
34967754Smsmith    {
350167802Sjkim        TableDesc = &AcpiGbl_RootTableList.Tables[i];
351167802Sjkim
352238381Sjkim        /* Index and Table ID */
353238381Sjkim
354238381Sjkim        AcpiOsPrintf ("%3u %.2u ", i, TableDesc->OwnerId);
355238381Sjkim
356238381Sjkim        /* Decode the table flags */
357238381Sjkim
358238381Sjkim        if (!(TableDesc->Flags & ACPI_TABLE_IS_LOADED))
359238381Sjkim        {
360238381Sjkim            AcpiOsPrintf ("NotLoaded ");
361238381Sjkim        }
362238381Sjkim        else
363238381Sjkim        {
364238381Sjkim            AcpiOsPrintf ("   Loaded ");
365238381Sjkim        }
366238381Sjkim
367238381Sjkim        switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
368238381Sjkim        {
369281075Sdim        case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
370250838Sjkim
371281075Sdim            AcpiOsPrintf ("External/virtual  ");
372238381Sjkim            break;
373238381Sjkim
374281075Sdim        case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
375250838Sjkim
376281075Sdim            AcpiOsPrintf ("Internal/physical ");
377238381Sjkim            break;
378238381Sjkim
379281075Sdim        case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
380250838Sjkim
381281075Sdim            AcpiOsPrintf ("Internal/virtual  ");
382238381Sjkim            break;
383238381Sjkim
384238381Sjkim        default:
385250838Sjkim
386281075Sdim            AcpiOsPrintf ("INVALID TYPE      ");
387238381Sjkim            break;
388238381Sjkim        }
389238381Sjkim
390193267Sjkim        /* Make sure that the table is mapped */
391193267Sjkim
392281075Sdim        Status = AcpiTbValidateTable (TableDesc);
393193267Sjkim        if (ACPI_FAILURE (Status))
39467754Smsmith        {
395193267Sjkim            return;
39667754Smsmith        }
397193267Sjkim
398193267Sjkim        /* Dump the table header */
399193267Sjkim
400193267Sjkim        if (TableDesc->Pointer)
401193267Sjkim        {
402193267Sjkim            AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer);
403193267Sjkim        }
404193267Sjkim        else
405193267Sjkim        {
406193267Sjkim            /* If the pointer is null, the table has been unloaded */
407193267Sjkim
408306536Sjkim            ACPI_INFO (("%4.4s - Table has been unloaded",
409193267Sjkim                TableDesc->Signature.Ascii));
410193267Sjkim        }
41167754Smsmith    }
41267754Smsmith}
41367754Smsmith
41467754Smsmith
41567754Smsmith/*******************************************************************************
41667754Smsmith *
41767754Smsmith * FUNCTION:    AcpiDbUnloadAcpiTable
41867754Smsmith *
419238381Sjkim * PARAMETERS:  ObjectName          - Namespace pathname for an object that
420238381Sjkim *                                    is owned by the table to be unloaded
42167754Smsmith *
422238381Sjkim * RETURN:      None
42367754Smsmith *
424238381Sjkim * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned
425238381Sjkim *              by the table.
42667754Smsmith *
42767754Smsmith ******************************************************************************/
42867754Smsmith
42967754Smsmithvoid
43067754SmsmithAcpiDbUnloadAcpiTable (
431238381Sjkim    char                    *ObjectName)
43267754Smsmith{
433238381Sjkim    ACPI_NAMESPACE_NODE     *Node;
43467754Smsmith    ACPI_STATUS             Status;
43567754Smsmith
43667754Smsmith
437238381Sjkim    /* Translate name to an Named object */
43867754Smsmith
439238381Sjkim    Node = AcpiDbConvertToNode (ObjectName);
440238381Sjkim    if (!Node)
44167754Smsmith    {
442238381Sjkim        return;
443238381Sjkim    }
44467754Smsmith
445238381Sjkim    Status = AcpiUnloadParentTable (ACPI_CAST_PTR (ACPI_HANDLE, Node));
446238381Sjkim    if (ACPI_SUCCESS (Status))
447238381Sjkim    {
448238381Sjkim        AcpiOsPrintf ("Parent of [%s] (%p) unloaded and uninstalled\n",
449238381Sjkim            ObjectName, Node);
45067754Smsmith    }
451238381Sjkim    else
452238381Sjkim    {
453238381Sjkim        AcpiOsPrintf ("%s, while unloading parent table of [%s]\n",
454238381Sjkim            AcpiFormatException (Status), ObjectName);
455238381Sjkim    }
45667754Smsmith}
45767754Smsmith
45867754Smsmith
45967754Smsmith/*******************************************************************************
46067754Smsmith *
46167754Smsmith * FUNCTION:    AcpiDbSendNotify
46267754Smsmith *
463245582Sjkim * PARAMETERS:  Name                - Name of ACPI object where to send notify
464245582Sjkim *              Value               - Value of the notify to send.
46567754Smsmith *
46667754Smsmith * RETURN:      None
46767754Smsmith *
468241973Sjkim * DESCRIPTION: Send an ACPI notification. The value specified is sent to the
46967754Smsmith *              named object as an ACPI notify.
47067754Smsmith *
47167754Smsmith ******************************************************************************/
47267754Smsmith
47367754Smsmithvoid
47467754SmsmithAcpiDbSendNotify (
475114237Snjl    char                    *Name,
47667754Smsmith    UINT32                  Value)
47767754Smsmith{
47867754Smsmith    ACPI_NAMESPACE_NODE     *Node;
47999679Siwasaki    ACPI_STATUS             Status;
48067754Smsmith
48167754Smsmith
48267754Smsmith    /* Translate name to an Named object */
48367754Smsmith
484151937Sjkim    Node = AcpiDbConvertToNode (Name);
48567754Smsmith    if (!Node)
48667754Smsmith    {
48767754Smsmith        return;
48867754Smsmith    }
48967754Smsmith
490234623Sjkim    /* Dispatch the notify if legal */
49167754Smsmith
492234623Sjkim    if (AcpiEvIsNotifyObject (Node))
49367754Smsmith    {
49499679Siwasaki        Status = AcpiEvQueueNotifyRequest (Node, Value);
49599679Siwasaki        if (ACPI_FAILURE (Status))
49699679Siwasaki        {
49799679Siwasaki            AcpiOsPrintf ("Could not queue notify\n");
49899679Siwasaki        }
49967754Smsmith    }
500234623Sjkim    else
501234623Sjkim    {
502245582Sjkim        AcpiOsPrintf (
503306536Sjkim            "Named object [%4.4s] Type %s, "
504306536Sjkim            "must be Device/Thermal/Processor type\n",
505234623Sjkim            AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type));
506234623Sjkim    }
50767754Smsmith}
50867754Smsmith
50967754Smsmith
51067754Smsmith/*******************************************************************************
51167754Smsmith *
512210976Sjkim * FUNCTION:    AcpiDbDisplayInterfaces
513210976Sjkim *
514210976Sjkim * PARAMETERS:  ActionArg           - Null, "install", or "remove"
515210976Sjkim *              InterfaceNameArg    - Name for install/remove options
516210976Sjkim *
517210976Sjkim * RETURN:      None
518210976Sjkim *
519210976Sjkim * DESCRIPTION: Display or modify the global _OSI interface list
520210976Sjkim *
521210976Sjkim ******************************************************************************/
522210976Sjkim
523210976Sjkimvoid
524210976SjkimAcpiDbDisplayInterfaces (
525210976Sjkim    char                    *ActionArg,
526210976Sjkim    char                    *InterfaceNameArg)
527210976Sjkim{
528210976Sjkim    ACPI_INTERFACE_INFO     *NextInterface;
529210976Sjkim    char                    *SubString;
530210976Sjkim    ACPI_STATUS             Status;
531210976Sjkim
532210976Sjkim
533210976Sjkim    /* If no arguments, just display current interface list */
534210976Sjkim
535210976Sjkim    if (!ActionArg)
536210976Sjkim    {
537306536Sjkim        (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER);
538210976Sjkim
539210976Sjkim        NextInterface = AcpiGbl_SupportedInterfaces;
540210976Sjkim        while (NextInterface)
541210976Sjkim        {
542210976Sjkim            if (!(NextInterface->Flags & ACPI_OSI_INVALID))
543210976Sjkim            {
544210976Sjkim                AcpiOsPrintf ("%s\n", NextInterface->Name);
545210976Sjkim            }
546306536Sjkim
547210976Sjkim            NextInterface = NextInterface->Next;
548210976Sjkim        }
549210976Sjkim
550210976Sjkim        AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
551210976Sjkim        return;
552210976Sjkim    }
553210976Sjkim
554210976Sjkim    /* If ActionArg exists, so must InterfaceNameArg */
555210976Sjkim
556210976Sjkim    if (!InterfaceNameArg)
557210976Sjkim    {
558210976Sjkim        AcpiOsPrintf ("Missing Interface Name argument\n");
559210976Sjkim        return;
560210976Sjkim    }
561210976Sjkim
562210976Sjkim    /* Uppercase the action for match below */
563210976Sjkim
564210976Sjkim    AcpiUtStrupr (ActionArg);
565210976Sjkim
566210976Sjkim    /* Install - install an interface */
567210976Sjkim
568306536Sjkim    SubString = strstr ("INSTALL", ActionArg);
569210976Sjkim    if (SubString)
570210976Sjkim    {
571210976Sjkim        Status = AcpiInstallInterface (InterfaceNameArg);
572210976Sjkim        if (ACPI_FAILURE (Status))
573210976Sjkim        {
574210976Sjkim            AcpiOsPrintf ("%s, while installing \"%s\"\n",
575210976Sjkim                AcpiFormatException (Status), InterfaceNameArg);
576210976Sjkim        }
577210976Sjkim        return;
578210976Sjkim    }
579210976Sjkim
580210976Sjkim    /* Remove - remove an interface */
581210976Sjkim
582306536Sjkim    SubString = strstr ("REMOVE", ActionArg);
583210976Sjkim    if (SubString)
584210976Sjkim    {
585210976Sjkim        Status = AcpiRemoveInterface (InterfaceNameArg);
586210976Sjkim        if (ACPI_FAILURE (Status))
587210976Sjkim        {
588210976Sjkim            AcpiOsPrintf ("%s, while removing \"%s\"\n",
589210976Sjkim                AcpiFormatException (Status), InterfaceNameArg);
590210976Sjkim        }
591210976Sjkim        return;
592210976Sjkim    }
593210976Sjkim
594210976Sjkim    /* Invalid ActionArg */
595210976Sjkim
596210976Sjkim    AcpiOsPrintf ("Invalid action argument: %s\n", ActionArg);
597210976Sjkim    return;
598210976Sjkim}
599210976Sjkim
600210976Sjkim
601210976Sjkim/*******************************************************************************
602210976Sjkim *
603228110Sjkim * FUNCTION:    AcpiDbDisplayTemplate
604228110Sjkim *
605245582Sjkim * PARAMETERS:  BufferArg           - Buffer name or address
606228110Sjkim *
607228110Sjkim * RETURN:      None
608228110Sjkim *
609228110Sjkim * DESCRIPTION: Dump a buffer that contains a resource template
610228110Sjkim *
611228110Sjkim ******************************************************************************/
612228110Sjkim
613228110Sjkimvoid
614228110SjkimAcpiDbDisplayTemplate (
615228110Sjkim    char                    *BufferArg)
616228110Sjkim{
617228110Sjkim    ACPI_NAMESPACE_NODE     *Node;
618228110Sjkim    ACPI_STATUS             Status;
619245582Sjkim    ACPI_BUFFER             ReturnBuffer;
620228110Sjkim
621228110Sjkim
622228110Sjkim    /* Translate BufferArg to an Named object */
623228110Sjkim
624228110Sjkim    Node = AcpiDbConvertToNode (BufferArg);
625228110Sjkim    if (!Node || (Node == AcpiGbl_RootNode))
626228110Sjkim    {
627228110Sjkim        AcpiOsPrintf ("Invalid argument: %s\n", BufferArg);
628228110Sjkim        return;
629228110Sjkim    }
630228110Sjkim
631228110Sjkim    /* We must have a buffer object */
632228110Sjkim
633228110Sjkim    if (Node->Type != ACPI_TYPE_BUFFER)
634228110Sjkim    {
635228110Sjkim        AcpiOsPrintf ("Not a Buffer object, cannot be a template: %s\n",
636228110Sjkim            BufferArg);
637228110Sjkim        return;
638228110Sjkim    }
639228110Sjkim
640245582Sjkim    ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE;
641245582Sjkim    ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
642228110Sjkim
643228110Sjkim    /* Attempt to convert the raw buffer to a resource list */
644228110Sjkim
645245582Sjkim    Status = AcpiRsCreateResourceList (Node->Object, &ReturnBuffer);
646228110Sjkim
647228110Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
648228110Sjkim    AcpiDbgLevel |= ACPI_LV_RESOURCES;
649228110Sjkim
650228110Sjkim    if (ACPI_FAILURE (Status))
651228110Sjkim    {
652306536Sjkim        AcpiOsPrintf (
653306536Sjkim            "Could not convert Buffer to a resource list: %s, %s\n",
654228110Sjkim            BufferArg, AcpiFormatException (Status));
655228110Sjkim        goto DumpBuffer;
656228110Sjkim    }
657228110Sjkim
658228110Sjkim    /* Now we can dump the resource list */
659228110Sjkim
660228110Sjkim    AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
661245582Sjkim        ReturnBuffer.Pointer));
662228110Sjkim
663228110SjkimDumpBuffer:
664228110Sjkim    AcpiOsPrintf ("\nRaw data buffer:\n");
665241973Sjkim    AcpiUtDebugDumpBuffer ((UINT8 *) Node->Object->Buffer.Pointer,
666228110Sjkim        Node->Object->Buffer.Length,
667228110Sjkim        DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
668228110Sjkim
669228110Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
670228110Sjkim    return;
671228110Sjkim}
672228110Sjkim
673228110Sjkim
674228110Sjkim/*******************************************************************************
675228110Sjkim *
676151937Sjkim * FUNCTION:    AcpiDmCompareAmlResources
677151937Sjkim *
678151937Sjkim * PARAMETERS:  Aml1Buffer          - Contains first resource list
679151937Sjkim *              Aml1BufferLength    - Length of first resource list
680151937Sjkim *              Aml2Buffer          - Contains second resource list
681151937Sjkim *              Aml2BufferLength    - Length of second resource list
682151937Sjkim *
683151937Sjkim * RETURN:      None
684151937Sjkim *
685151937Sjkim * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in
686151937Sjkim *              order to isolate a miscompare to an individual resource)
687151937Sjkim *
688151937Sjkim ******************************************************************************/
689151937Sjkim
690151937Sjkimstatic void
691151937SjkimAcpiDmCompareAmlResources (
692151937Sjkim    UINT8                   *Aml1Buffer,
693151937Sjkim    ACPI_RSDESC_SIZE        Aml1BufferLength,
694151937Sjkim    UINT8                   *Aml2Buffer,
695151937Sjkim    ACPI_RSDESC_SIZE        Aml2BufferLength)
696151937Sjkim{
697151937Sjkim    UINT8                   *Aml1;
698151937Sjkim    UINT8                   *Aml2;
699228110Sjkim    UINT8                   *Aml1End;
700228110Sjkim    UINT8                   *Aml2End;
701151937Sjkim    ACPI_RSDESC_SIZE        Aml1Length;
702151937Sjkim    ACPI_RSDESC_SIZE        Aml2Length;
703151937Sjkim    ACPI_RSDESC_SIZE        Offset = 0;
704151937Sjkim    UINT8                   ResourceType;
705151937Sjkim    UINT32                  Count = 0;
706228110Sjkim    UINT32                  i;
707151937Sjkim
708151937Sjkim
709151937Sjkim    /* Compare overall buffer sizes (may be different due to size rounding) */
710151937Sjkim
711151937Sjkim    if (Aml1BufferLength != Aml2BufferLength)
712151937Sjkim    {
713151937Sjkim        AcpiOsPrintf (
714306536Sjkim            "**** Buffer length mismatch in converted "
715306536Sjkim            "AML: Original %X, New %X ****\n",
716151937Sjkim            Aml1BufferLength, Aml2BufferLength);
717151937Sjkim    }
718151937Sjkim
719151937Sjkim    Aml1 = Aml1Buffer;
720151937Sjkim    Aml2 = Aml2Buffer;
721228110Sjkim    Aml1End = Aml1Buffer + Aml1BufferLength;
722228110Sjkim    Aml2End = Aml2Buffer + Aml2BufferLength;
723151937Sjkim
724151937Sjkim    /* Walk the descriptor lists, comparing each descriptor */
725151937Sjkim
726228110Sjkim    while ((Aml1 < Aml1End) && (Aml2 < Aml2End))
727151937Sjkim    {
728151937Sjkim        /* Get the lengths of each descriptor */
729151937Sjkim
730151937Sjkim        Aml1Length = AcpiUtGetDescriptorLength (Aml1);
731151937Sjkim        Aml2Length = AcpiUtGetDescriptorLength (Aml2);
732151937Sjkim        ResourceType = AcpiUtGetResourceType (Aml1);
733151937Sjkim
734151937Sjkim        /* Check for descriptor length match */
735151937Sjkim
736151937Sjkim        if (Aml1Length != Aml2Length)
737151937Sjkim        {
738151937Sjkim            AcpiOsPrintf (
739306536Sjkim                "**** Length mismatch in descriptor [%.2X] type %2.2X, "
740306536Sjkim                "Offset %8.8X Len1 %X, Len2 %X ****\n",
741151937Sjkim                Count, ResourceType, Offset, Aml1Length, Aml2Length);
742151937Sjkim        }
743151937Sjkim
744151937Sjkim        /* Check for descriptor byte match */
745151937Sjkim
746306536Sjkim        else if (memcmp (Aml1, Aml2, Aml1Length))
747151937Sjkim        {
748151937Sjkim            AcpiOsPrintf (
749306536Sjkim                "**** Data mismatch in descriptor [%.2X] type %2.2X, "
750306536Sjkim                "Offset %8.8X ****\n",
751151937Sjkim                Count, ResourceType, Offset);
752228110Sjkim
753228110Sjkim            for (i = 0; i < Aml1Length; i++)
754228110Sjkim            {
755228110Sjkim                if (Aml1[i] != Aml2[i])
756228110Sjkim                {
757245582Sjkim                    AcpiOsPrintf (
758306536Sjkim                        "Mismatch at byte offset %.2X: is %2.2X, "
759306536Sjkim                        "should be %2.2X\n",
760228110Sjkim                        i, Aml2[i], Aml1[i]);
761228110Sjkim                }
762228110Sjkim            }
763151937Sjkim        }
764151937Sjkim
765151937Sjkim        /* Exit on EndTag descriptor */
766151937Sjkim
767151937Sjkim        if (ResourceType == ACPI_RESOURCE_NAME_END_TAG)
768151937Sjkim        {
769151937Sjkim            return;
770151937Sjkim        }
771151937Sjkim
772151937Sjkim        /* Point to next descriptor in each buffer */
773151937Sjkim
774151937Sjkim        Count++;
775151937Sjkim        Offset += Aml1Length;
776151937Sjkim        Aml1 += Aml1Length;
777167802Sjkim        Aml2 += Aml2Length;
778151937Sjkim    }
779151937Sjkim}
780151937Sjkim
781151937Sjkim
782151937Sjkim/*******************************************************************************
783151937Sjkim *
784151937Sjkim * FUNCTION:    AcpiDmTestResourceConversion
785151937Sjkim *
786245582Sjkim * PARAMETERS:  Node                - Parent device node
787245582Sjkim *              Name                - resource method name (_CRS)
788151937Sjkim *
789151937Sjkim * RETURN:      Status
790151937Sjkim *
791151937Sjkim * DESCRIPTION: Compare the original AML with a conversion of the AML to
792151937Sjkim *              internal resource list, then back to AML.
793151937Sjkim *
794151937Sjkim ******************************************************************************/
795151937Sjkim
796151937Sjkimstatic ACPI_STATUS
797151937SjkimAcpiDmTestResourceConversion (
798151937Sjkim    ACPI_NAMESPACE_NODE     *Node,
799151937Sjkim    char                    *Name)
800151937Sjkim{
801151937Sjkim    ACPI_STATUS             Status;
802245582Sjkim    ACPI_BUFFER             ReturnBuffer;
803245582Sjkim    ACPI_BUFFER             ResourceBuffer;
804151937Sjkim    ACPI_BUFFER             NewAml;
805151937Sjkim    ACPI_OBJECT             *OriginalAml;
806151937Sjkim
807151937Sjkim
808151937Sjkim    AcpiOsPrintf ("Resource Conversion Comparison:\n");
809151937Sjkim
810151937Sjkim    NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
811245582Sjkim    ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
812245582Sjkim    ResourceBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
813151937Sjkim
814151937Sjkim    /* Get the original _CRS AML resource template */
815151937Sjkim
816245582Sjkim    Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnBuffer);
817151937Sjkim    if (ACPI_FAILURE (Status))
818151937Sjkim    {
819151937Sjkim        AcpiOsPrintf ("Could not obtain %s: %s\n",
820151937Sjkim            Name, AcpiFormatException (Status));
821151937Sjkim        return (Status);
822151937Sjkim    }
823151937Sjkim
824151937Sjkim    /* Get the AML resource template, converted to internal resource structs */
825151937Sjkim
826245582Sjkim    Status = AcpiGetCurrentResources (Node, &ResourceBuffer);
827151937Sjkim    if (ACPI_FAILURE (Status))
828151937Sjkim    {
829151937Sjkim        AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
830151937Sjkim            AcpiFormatException (Status));
831151937Sjkim        goto Exit1;
832151937Sjkim    }
833151937Sjkim
834151937Sjkim    /* Convert internal resource list to external AML resource template */
835151937Sjkim
836281075Sdim    Status = AcpiRsCreateAmlResources (&ResourceBuffer, &NewAml);
837151937Sjkim    if (ACPI_FAILURE (Status))
838151937Sjkim    {
839151937Sjkim        AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n",
840151937Sjkim            AcpiFormatException (Status));
841151937Sjkim        goto Exit2;
842151937Sjkim    }
843151937Sjkim
844151937Sjkim    /* Compare original AML to the newly created AML resource list */
845151937Sjkim
846245582Sjkim    OriginalAml = ReturnBuffer.Pointer;
847151937Sjkim
848281075Sdim    AcpiDmCompareAmlResources (OriginalAml->Buffer.Pointer,
849281075Sdim        (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
850193267Sjkim        NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length);
851151937Sjkim
852151937Sjkim    /* Cleanup and exit */
853151937Sjkim
854167802Sjkim    ACPI_FREE (NewAml.Pointer);
855151937SjkimExit2:
856245582Sjkim    ACPI_FREE (ResourceBuffer.Pointer);
857151937SjkimExit1:
858245582Sjkim    ACPI_FREE (ReturnBuffer.Pointer);
859151937Sjkim    return (Status);
860151937Sjkim}
861151937Sjkim
862151937Sjkim
863151937Sjkim/*******************************************************************************
864151937Sjkim *
865228110Sjkim * FUNCTION:    AcpiDbResourceCallback
86673561Smsmith *
867228110Sjkim * PARAMETERS:  ACPI_WALK_RESOURCE_CALLBACK
86873561Smsmith *
869228110Sjkim * RETURN:      Status
87073561Smsmith *
871245582Sjkim * DESCRIPTION: Simple callback to exercise AcpiWalkResources and
872245582Sjkim *              AcpiWalkResourceBuffer.
87373561Smsmith *
87473561Smsmith ******************************************************************************/
87573561Smsmith
876228110Sjkimstatic ACPI_STATUS
877228110SjkimAcpiDbResourceCallback (
878228110Sjkim    ACPI_RESOURCE           *Resource,
879228110Sjkim    void                    *Context)
88073561Smsmith{
881228110Sjkim
882228110Sjkim    return (AE_OK);
883228110Sjkim}
884228110Sjkim
885228110Sjkim
886228110Sjkim/*******************************************************************************
887228110Sjkim *
888228110Sjkim * FUNCTION:    AcpiDbDeviceResources
889228110Sjkim *
890228110Sjkim * PARAMETERS:  ACPI_WALK_CALLBACK
891228110Sjkim *
892228110Sjkim * RETURN:      Status
893228110Sjkim *
894228110Sjkim * DESCRIPTION: Display the _PRT/_CRS/_PRS resources for a device object.
895228110Sjkim *
896228110Sjkim ******************************************************************************/
897228110Sjkim
898228110Sjkimstatic ACPI_STATUS
899228110SjkimAcpiDbDeviceResources (
900228110Sjkim    ACPI_HANDLE             ObjHandle,
901228110Sjkim    UINT32                  NestingLevel,
902228110Sjkim    void                    *Context,
903228110Sjkim    void                    **ReturnValue)
904228110Sjkim{
905151937Sjkim    ACPI_NAMESPACE_NODE     *Node;
906228110Sjkim    ACPI_NAMESPACE_NODE     *PrtNode = NULL;
907228110Sjkim    ACPI_NAMESPACE_NODE     *CrsNode = NULL;
908228110Sjkim    ACPI_NAMESPACE_NODE     *PrsNode = NULL;
909228110Sjkim    ACPI_NAMESPACE_NODE     *AeiNode = NULL;
910228110Sjkim    char                    *ParentPath;
911245582Sjkim    ACPI_BUFFER             ReturnBuffer;
91273561Smsmith    ACPI_STATUS             Status;
91373561Smsmith
91473561Smsmith
915228110Sjkim    Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
916306536Sjkim    ParentPath = AcpiNsGetNormalizedPathname (Node, TRUE);
917228110Sjkim    if (!ParentPath)
918228110Sjkim    {
919228110Sjkim        return (AE_NO_MEMORY);
920228110Sjkim    }
92173561Smsmith
922228110Sjkim    /* Get handles to the resource methods for this device */
92373561Smsmith
924306536Sjkim    (void) AcpiGetHandle (Node, METHOD_NAME__PRT,
925306536Sjkim        ACPI_CAST_PTR (ACPI_HANDLE, &PrtNode));
926306536Sjkim    (void) AcpiGetHandle (Node, METHOD_NAME__CRS,
927306536Sjkim        ACPI_CAST_PTR (ACPI_HANDLE, &CrsNode));
928306536Sjkim    (void) AcpiGetHandle (Node, METHOD_NAME__PRS,
929306536Sjkim        ACPI_CAST_PTR (ACPI_HANDLE, &PrsNode));
930306536Sjkim    (void) AcpiGetHandle (Node, METHOD_NAME__AEI,
931306536Sjkim        ACPI_CAST_PTR (ACPI_HANDLE, &AeiNode));
932306536Sjkim
933228110Sjkim    if (!PrtNode && !CrsNode && !PrsNode && !AeiNode)
934151937Sjkim    {
935228110Sjkim        goto Cleanup;   /* Nothing to do */
936151937Sjkim    }
93773561Smsmith
938228110Sjkim    AcpiOsPrintf ("\nDevice: %s\n", ParentPath);
939228110Sjkim
94073561Smsmith    /* Prepare for a return object of arbitrary size */
94173561Smsmith
942245582Sjkim    ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
943245582Sjkim    ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
94473561Smsmith
945228110Sjkim
94677424Smsmith    /* _PRT */
94777424Smsmith
948228110Sjkim    if (PrtNode)
949228110Sjkim    {
950228110Sjkim        AcpiOsPrintf ("Evaluating _PRT\n");
95177424Smsmith
952245582Sjkim        Status = AcpiEvaluateObject (PrtNode, NULL, NULL, &ReturnBuffer);
953228110Sjkim        if (ACPI_FAILURE (Status))
954228110Sjkim        {
955228110Sjkim            AcpiOsPrintf ("Could not evaluate _PRT: %s\n",
956228110Sjkim                AcpiFormatException (Status));
957228110Sjkim            goto GetCrs;
958228110Sjkim        }
959151937Sjkim
960245582Sjkim        ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
961245582Sjkim        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
96273561Smsmith
963245582Sjkim        Status = AcpiGetIrqRoutingTable (Node, &ReturnBuffer);
964228110Sjkim        if (ACPI_FAILURE (Status))
965228110Sjkim        {
966228110Sjkim            AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n",
967228110Sjkim                AcpiFormatException (Status));
968228110Sjkim            goto GetCrs;
969228110Sjkim        }
97073561Smsmith
971228110Sjkim        AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer));
97277424Smsmith    }
97377424Smsmith
97477424Smsmith
97577424Smsmith    /* _CRS */
97683174Smsmith
97783174SmsmithGetCrs:
978228110Sjkim    if (CrsNode)
979228110Sjkim    {
980228110Sjkim        AcpiOsPrintf ("Evaluating _CRS\n");
98177424Smsmith
982245582Sjkim        ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
983245582Sjkim        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
98477424Smsmith
985245582Sjkim        Status = AcpiEvaluateObject (CrsNode, NULL, NULL, &ReturnBuffer);
986228110Sjkim        if (ACPI_FAILURE (Status))
987228110Sjkim        {
988228110Sjkim            AcpiOsPrintf ("Could not evaluate _CRS: %s\n",
989228110Sjkim                AcpiFormatException (Status));
990228110Sjkim            goto GetPrs;
991228110Sjkim        }
992151937Sjkim
993245582Sjkim        /* This code exercises the AcpiWalkResources interface */
99477424Smsmith
995228110Sjkim        Status = AcpiWalkResources (Node, METHOD_NAME__CRS,
996228110Sjkim            AcpiDbResourceCallback, NULL);
997228110Sjkim        if (ACPI_FAILURE (Status))
998228110Sjkim        {
999228110Sjkim            AcpiOsPrintf ("AcpiWalkResources failed: %s\n",
1000228110Sjkim                AcpiFormatException (Status));
1001228110Sjkim            goto GetPrs;
1002228110Sjkim        }
100377424Smsmith
1004245582Sjkim        /* Get the _CRS resource list (test ALLOCATE buffer) */
1005151937Sjkim
1006245582Sjkim        ReturnBuffer.Pointer = NULL;
1007306536Sjkim        ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
100877424Smsmith
1009245582Sjkim        Status = AcpiGetCurrentResources (Node, &ReturnBuffer);
1010228110Sjkim        if (ACPI_FAILURE (Status))
1011228110Sjkim        {
1012228110Sjkim            AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
1013228110Sjkim                AcpiFormatException (Status));
1014228110Sjkim            goto GetPrs;
1015228110Sjkim        }
1016151937Sjkim
1017245582Sjkim        /* This code exercises the AcpiWalkResourceBuffer interface */
1018245582Sjkim
1019245582Sjkim        Status = AcpiWalkResourceBuffer (&ReturnBuffer,
1020245582Sjkim            AcpiDbResourceCallback, NULL);
1021245582Sjkim        if (ACPI_FAILURE (Status))
1022245582Sjkim        {
1023245582Sjkim            AcpiOsPrintf ("AcpiWalkResourceBuffer failed: %s\n",
1024245582Sjkim                AcpiFormatException (Status));
1025245582Sjkim            goto EndCrs;
1026245582Sjkim        }
1027245582Sjkim
1028228110Sjkim        /* Dump the _CRS resource list */
1029151937Sjkim
1030228110Sjkim        AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
1031245582Sjkim            ReturnBuffer.Pointer));
1032151937Sjkim
1033228110Sjkim        /*
1034245582Sjkim         * Perform comparison of original AML to newly created AML. This
1035245582Sjkim         * tests both the AML->Resource conversion and the Resource->AML
1036245582Sjkim         * conversion.
1037228110Sjkim         */
1038245582Sjkim        (void) AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS);
1039151937Sjkim
1040228110Sjkim        /* Execute _SRS with the resource list */
1041228110Sjkim
1042246849Sjkim        AcpiOsPrintf ("Evaluating _SRS\n");
1043246849Sjkim
1044245582Sjkim        Status = AcpiSetCurrentResources (Node, &ReturnBuffer);
1045228110Sjkim        if (ACPI_FAILURE (Status))
1046228110Sjkim        {
1047228110Sjkim            AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n",
1048228110Sjkim                AcpiFormatException (Status));
1049245582Sjkim            goto EndCrs;
1050228110Sjkim        }
1051245582Sjkim
1052245582SjkimEndCrs:
1053281075Sdim        ACPI_FREE (ReturnBuffer.Pointer);
105491116Smsmith    }
105583174Smsmith
105691116Smsmith
105777424Smsmith    /* _PRS */
105883174Smsmith
105983174SmsmithGetPrs:
1060228110Sjkim    if (PrsNode)
1061228110Sjkim    {
1062228110Sjkim        AcpiOsPrintf ("Evaluating _PRS\n");
106377424Smsmith
1064245582Sjkim        ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1065245582Sjkim        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
106677424Smsmith
1067245582Sjkim        Status = AcpiEvaluateObject (PrsNode, NULL, NULL, &ReturnBuffer);
1068228110Sjkim        if (ACPI_FAILURE (Status))
1069228110Sjkim        {
1070228110Sjkim            AcpiOsPrintf ("Could not evaluate _PRS: %s\n",
1071228110Sjkim                AcpiFormatException (Status));
1072228110Sjkim            goto GetAei;
1073228110Sjkim        }
1074151937Sjkim
1075245582Sjkim        ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1076306536Sjkim        ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE;
1077228110Sjkim
1078245582Sjkim        Status = AcpiGetPossibleResources (Node, &ReturnBuffer);
1079228110Sjkim        if (ACPI_FAILURE (Status))
1080228110Sjkim        {
1081228110Sjkim            AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n",
1082228110Sjkim                AcpiFormatException (Status));
1083228110Sjkim            goto GetAei;
1084228110Sjkim        }
1085228110Sjkim
1086306536Sjkim        AcpiRsDumpResourceList (ACPI_CAST_PTR (
1087306536Sjkim            ACPI_RESOURCE, AcpiGbl_DbBuffer));
108873561Smsmith    }
108973561Smsmith
109077424Smsmith
1091228110Sjkim    /* _AEI */
1092228110Sjkim
1093228110SjkimGetAei:
1094228110Sjkim    if (AeiNode)
109573561Smsmith    {
1096228110Sjkim        AcpiOsPrintf ("Evaluating _AEI\n");
1097228110Sjkim
1098245582Sjkim        ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1099306536Sjkim        ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE;
1100228110Sjkim
1101245582Sjkim        Status = AcpiEvaluateObject (AeiNode, NULL, NULL, &ReturnBuffer);
1102228110Sjkim        if (ACPI_FAILURE (Status))
1103228110Sjkim        {
1104228110Sjkim            AcpiOsPrintf ("Could not evaluate _AEI: %s\n",
1105228110Sjkim                AcpiFormatException (Status));
1106228110Sjkim            goto Cleanup;
1107228110Sjkim        }
1108228110Sjkim
1109245582Sjkim        ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1110306536Sjkim        ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE;
1111228110Sjkim
1112245582Sjkim        Status = AcpiGetEventResources (Node, &ReturnBuffer);
1113228110Sjkim        if (ACPI_FAILURE (Status))
1114228110Sjkim        {
1115228110Sjkim            AcpiOsPrintf ("AcpiGetEventResources failed: %s\n",
1116228110Sjkim                AcpiFormatException (Status));
1117228110Sjkim            goto Cleanup;
1118228110Sjkim        }
1119228110Sjkim
1120306536Sjkim        AcpiRsDumpResourceList (ACPI_CAST_PTR (
1121306536Sjkim            ACPI_RESOURCE, AcpiGbl_DbBuffer));
112273561Smsmith    }
112377424Smsmith
1124151937Sjkim
112573561SmsmithCleanup:
1126228110Sjkim    ACPI_FREE (ParentPath);
1127228110Sjkim    return (AE_OK);
1128228110Sjkim}
112973561Smsmith
1130228110Sjkim
1131228110Sjkim/*******************************************************************************
1132228110Sjkim *
1133228110Sjkim * FUNCTION:    AcpiDbDisplayResources
1134228110Sjkim *
1135245582Sjkim * PARAMETERS:  ObjectArg           - String object name or object pointer.
1136246849Sjkim *                                    NULL or "*" means "display resources for
1137246849Sjkim *                                    all devices"
1138228110Sjkim *
1139228110Sjkim * RETURN:      None
1140228110Sjkim *
1141228110Sjkim * DESCRIPTION: Display the resource objects associated with a device.
1142228110Sjkim *
1143228110Sjkim ******************************************************************************/
1144228110Sjkim
1145228110Sjkimvoid
1146228110SjkimAcpiDbDisplayResources (
1147228110Sjkim    char                    *ObjectArg)
1148228110Sjkim{
1149228110Sjkim    ACPI_NAMESPACE_NODE     *Node;
1150228110Sjkim
1151228110Sjkim
1152228110Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
1153228110Sjkim    AcpiDbgLevel |= ACPI_LV_RESOURCES;
1154228110Sjkim
1155228110Sjkim    /* Asterisk means "display resources for all devices" */
1156228110Sjkim
1157306536Sjkim    if (!ObjectArg || (!strcmp (ObjectArg, "*")))
1158228110Sjkim    {
1159228110Sjkim        (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
1160306536Sjkim            ACPI_UINT32_MAX, AcpiDbDeviceResources, NULL, NULL, NULL);
1161228110Sjkim    }
1162228110Sjkim    else
1163228110Sjkim    {
1164228110Sjkim        /* Convert string to object pointer */
1165228110Sjkim
1166228110Sjkim        Node = AcpiDbConvertToNode (ObjectArg);
1167228110Sjkim        if (Node)
1168228110Sjkim        {
1169228110Sjkim            if (Node->Type != ACPI_TYPE_DEVICE)
1170228110Sjkim            {
1171306536Sjkim                AcpiOsPrintf (
1172306536Sjkim                    "%4.4s: Name is not a device object (%s)\n",
1173228110Sjkim                    Node->Name.Ascii, AcpiUtGetTypeName (Node->Type));
1174228110Sjkim            }
1175228110Sjkim            else
1176228110Sjkim            {
1177228110Sjkim                (void) AcpiDbDeviceResources (Node, 0, NULL, NULL);
1178228110Sjkim            }
1179228110Sjkim        }
1180228110Sjkim    }
1181228110Sjkim
118291116Smsmith    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
118373561Smsmith}
118473561Smsmith
118573561Smsmith
1186231844Sjkim#if (!ACPI_REDUCED_HARDWARE)
118799679Siwasaki/*******************************************************************************
118899679Siwasaki *
1189114237Snjl * FUNCTION:    AcpiDbGenerateGpe
1190114237Snjl *
1191245582Sjkim * PARAMETERS:  GpeArg              - Raw GPE number, ascii string
1192245582Sjkim *              BlockArg            - GPE block number, ascii string
1193245582Sjkim *                                    0 or 1 for FADT GPE blocks
1194114237Snjl *
1195114237Snjl * RETURN:      None
1196114237Snjl *
1197245582Sjkim * DESCRIPTION: Simulate firing of a GPE
1198114237Snjl *
1199114237Snjl ******************************************************************************/
1200114237Snjl
1201114237Snjlvoid
1202114237SnjlAcpiDbGenerateGpe (
1203114237Snjl    char                    *GpeArg,
1204114237Snjl    char                    *BlockArg)
1205114237Snjl{
1206281075Sdim    UINT32                  BlockNumber = 0;
1207114237Snjl    UINT32                  GpeNumber;
1208114237Snjl    ACPI_GPE_EVENT_INFO     *GpeEventInfo;
1209114237Snjl
1210114237Snjl
1211306536Sjkim    GpeNumber = strtoul (GpeArg, NULL, 0);
1212114237Snjl
1213281075Sdim    /*
1214281075Sdim     * If no block arg, or block arg == 0 or 1, use the FADT-defined
1215281075Sdim     * GPE blocks.
1216281075Sdim     */
1217281075Sdim    if (BlockArg)
1218281075Sdim    {
1219306536Sjkim        BlockNumber = strtoul (BlockArg, NULL, 0);
1220281075Sdim        if (BlockNumber == 1)
1221281075Sdim        {
1222281075Sdim            BlockNumber = 0;
1223281075Sdim        }
1224281075Sdim    }
1225114237Snjl
1226306536Sjkim    GpeEventInfo = AcpiEvGetGpeEventInfo (
1227306536Sjkim        ACPI_TO_POINTER (BlockNumber), GpeNumber);
1228114237Snjl    if (!GpeEventInfo)
1229114237Snjl    {
1230114237Snjl        AcpiOsPrintf ("Invalid GPE\n");
1231114237Snjl        return;
1232114237Snjl    }
1233114237Snjl
1234216471Sjkim    (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber);
1235114237Snjl}
1236254745Sjkim
1237306536Sjkim
1238306536Sjkim/*******************************************************************************
1239306536Sjkim *
1240306536Sjkim * FUNCTION:    AcpiDbGenerateSci
1241306536Sjkim *
1242306536Sjkim * PARAMETERS:  None
1243306536Sjkim *
1244306536Sjkim * RETURN:      None
1245306536Sjkim *
1246306536Sjkim * DESCRIPTION: Simulate an SCI -- just call the SCI dispatch.
1247306536Sjkim *
1248306536Sjkim ******************************************************************************/
1249306536Sjkim
1250254745Sjkimvoid
1251254745SjkimAcpiDbGenerateSci (
1252254745Sjkim    void)
1253254745Sjkim{
1254254745Sjkim    AcpiEvSciDispatch ();
1255254745Sjkim}
1256254745Sjkim
1257231844Sjkim#endif /* !ACPI_REDUCED_HARDWARE */
1258114237Snjl
1259306536Sjkim
1260306536Sjkim/*******************************************************************************
1261306536Sjkim *
1262306536Sjkim * FUNCTION:    AcpiDbTrace
1263306536Sjkim *
1264306536Sjkim * PARAMETERS:  EnableArg           - ENABLE/AML to enable tracer
1265306536Sjkim *                                    DISABLE to disable tracer
1266306536Sjkim *              MethodArg           - Method to trace
1267306536Sjkim *              OnceArg             - Whether trace once
1268306536Sjkim *
1269306536Sjkim * RETURN:      None
1270306536Sjkim *
1271306536Sjkim * DESCRIPTION: Control method tracing facility
1272306536Sjkim *
1273306536Sjkim ******************************************************************************/
1274306536Sjkim
1275306536Sjkimvoid
1276306536SjkimAcpiDbTrace (
1277306536Sjkim    char                    *EnableArg,
1278306536Sjkim    char                    *MethodArg,
1279306536Sjkim    char                    *OnceArg)
1280306536Sjkim{
1281306536Sjkim    UINT32                  DebugLevel = 0;
1282306536Sjkim    UINT32                  DebugLayer = 0;
1283306536Sjkim    UINT32                  Flags = 0;
1284306536Sjkim
1285306536Sjkim
1286306536Sjkim    AcpiUtStrupr (EnableArg);
1287306536Sjkim    AcpiUtStrupr (OnceArg);
1288306536Sjkim
1289306536Sjkim    if (MethodArg)
1290306536Sjkim    {
1291306536Sjkim        if (AcpiDbTraceMethodName)
1292306536Sjkim        {
1293306536Sjkim            ACPI_FREE (AcpiDbTraceMethodName);
1294306536Sjkim            AcpiDbTraceMethodName = NULL;
1295306536Sjkim        }
1296306536Sjkim
1297306536Sjkim        AcpiDbTraceMethodName = ACPI_ALLOCATE (strlen (MethodArg) + 1);
1298306536Sjkim        if (!AcpiDbTraceMethodName)
1299306536Sjkim        {
1300306536Sjkim            AcpiOsPrintf ("Failed to allocate method name (%s)\n",
1301306536Sjkim                MethodArg);
1302306536Sjkim            return;
1303306536Sjkim        }
1304306536Sjkim
1305306536Sjkim        strcpy (AcpiDbTraceMethodName, MethodArg);
1306306536Sjkim    }
1307306536Sjkim
1308306536Sjkim    if (!strcmp (EnableArg, "ENABLE") ||
1309306536Sjkim        !strcmp (EnableArg, "METHOD") ||
1310306536Sjkim        !strcmp (EnableArg, "OPCODE"))
1311306536Sjkim    {
1312306536Sjkim        if (!strcmp (EnableArg, "ENABLE"))
1313306536Sjkim        {
1314306536Sjkim            /* Inherit current console settings */
1315306536Sjkim
1316306536Sjkim            DebugLevel = AcpiGbl_DbConsoleDebugLevel;
1317306536Sjkim            DebugLayer = AcpiDbgLayer;
1318306536Sjkim        }
1319306536Sjkim        else
1320306536Sjkim        {
1321306536Sjkim            /* Restrict console output to trace points only */
1322306536Sjkim
1323306536Sjkim            DebugLevel = ACPI_LV_TRACE_POINT;
1324306536Sjkim            DebugLayer = ACPI_EXECUTER;
1325306536Sjkim        }
1326306536Sjkim
1327306536Sjkim        Flags = ACPI_TRACE_ENABLED;
1328306536Sjkim
1329306536Sjkim        if (!strcmp (EnableArg, "OPCODE"))
1330306536Sjkim        {
1331306536Sjkim            Flags |= ACPI_TRACE_OPCODE;
1332306536Sjkim        }
1333306536Sjkim
1334306536Sjkim        if (OnceArg && !strcmp (OnceArg, "ONCE"))
1335306536Sjkim        {
1336306536Sjkim            Flags |= ACPI_TRACE_ONESHOT;
1337306536Sjkim        }
1338306536Sjkim    }
1339306536Sjkim
1340306536Sjkim    (void) AcpiDebugTrace (AcpiDbTraceMethodName,
1341306536Sjkim        DebugLevel, DebugLayer, Flags);
1342306536Sjkim}
1343