167754Smsmith/*******************************************************************************
267754Smsmith *
3218590Sjkim * Module Name: dbcmds - Miscellaneous debug commands and output routines
467754Smsmith *
567754Smsmith ******************************************************************************/
667754Smsmith
7217365Sjkim/*
8281075Sdim * Copyright (C) 2000 - 2015, 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
52102550Siwasaki#ifdef ACPI_DEBUGGER
5367754Smsmith
54102550Siwasaki#define _COMPONENT          ACPI_CA_DEBUGGER
5591116Smsmith        ACPI_MODULE_NAME    ("dbcmds")
5667754Smsmith
57198237Sjkim
58151937Sjkim/* Local prototypes */
5967754Smsmith
60151937Sjkimstatic void
61151937SjkimAcpiDmCompareAmlResources (
62151937Sjkim    UINT8                   *Aml1Buffer,
63151937Sjkim    ACPI_RSDESC_SIZE        Aml1BufferLength,
64151937Sjkim    UINT8                   *Aml2Buffer,
65151937Sjkim    ACPI_RSDESC_SIZE        Aml2BufferLength);
66151937Sjkim
67151937Sjkimstatic ACPI_STATUS
68151937SjkimAcpiDmTestResourceConversion (
69151937Sjkim    ACPI_NAMESPACE_NODE     *Node,
70151937Sjkim    char                    *Name);
71151937Sjkim
72228110Sjkimstatic ACPI_STATUS
73228110SjkimAcpiDbResourceCallback (
74228110Sjkim    ACPI_RESOURCE           *Resource,
75228110Sjkim    void                    *Context);
76151937Sjkim
77228110Sjkimstatic ACPI_STATUS
78228110SjkimAcpiDbDeviceResources (
79228110Sjkim    ACPI_HANDLE             ObjHandle,
80228110Sjkim    UINT32                  NestingLevel,
81228110Sjkim    void                    *Context,
82228110Sjkim    void                    **ReturnValue);
83228110Sjkim
84245582Sjkimstatic void
85245582SjkimAcpiDbDoOneSleepState (
86245582Sjkim    UINT8                   SleepState);
87228110Sjkim
88245582Sjkim
89138287Smarks/*******************************************************************************
90138287Smarks *
91151937Sjkim * FUNCTION:    AcpiDbConvertToNode
92151937Sjkim *
93245582Sjkim * PARAMETERS:  InString            - String to convert
94151937Sjkim *
95151937Sjkim * RETURN:      Pointer to a NS node
96151937Sjkim *
97241973Sjkim * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or
98245582Sjkim *              alphanumeric strings.
99151937Sjkim *
100151937Sjkim ******************************************************************************/
101151937Sjkim
102218590SjkimACPI_NAMESPACE_NODE *
103151937SjkimAcpiDbConvertToNode (
104151937Sjkim    char                    *InString)
105151937Sjkim{
106151937Sjkim    ACPI_NAMESPACE_NODE     *Node;
107252279Sjkim    ACPI_SIZE               Address;
108151937Sjkim
109151937Sjkim
110151937Sjkim    if ((*InString >= 0x30) && (*InString <= 0x39))
111151937Sjkim    {
112151937Sjkim        /* Numeric argument, convert */
113151937Sjkim
114252279Sjkim        Address = ACPI_STRTOUL (InString, NULL, 16);
115252279Sjkim        Node = ACPI_TO_POINTER (Address);
116151937Sjkim        if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE)))
117151937Sjkim        {
118281075Sdim            AcpiOsPrintf ("Address %p is invalid",
119151937Sjkim                Node);
120151937Sjkim            return (NULL);
121151937Sjkim        }
122151937Sjkim
123151937Sjkim        /* Make sure pointer is valid NS node */
124151937Sjkim
125151937Sjkim        if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
126151937Sjkim        {
127281075Sdim            AcpiOsPrintf ("Address %p is not a valid namespace node [%s]\n",
128151937Sjkim                    Node, AcpiUtGetDescriptorName (Node));
129151937Sjkim            return (NULL);
130151937Sjkim        }
131151937Sjkim    }
132151937Sjkim    else
133151937Sjkim    {
134245582Sjkim        /*
135245582Sjkim         * Alpha argument: The parameter is a name string that must be
136245582Sjkim         * resolved to a Namespace object.
137151937Sjkim         */
138151937Sjkim        Node = AcpiDbLocalNsLookup (InString);
139151937Sjkim        if (!Node)
140151937Sjkim        {
141281075Sdim            AcpiOsPrintf ("Could not find [%s] in namespace, defaulting to root node\n",
142281075Sdim                InString);
143151937Sjkim            Node = AcpiGbl_RootNode;
144151937Sjkim        }
145151937Sjkim    }
146151937Sjkim
147151937Sjkim    return (Node);
148151937Sjkim}
149151937Sjkim
150151937Sjkim
151151937Sjkim/*******************************************************************************
152151937Sjkim *
153138287Smarks * FUNCTION:    AcpiDbSleep
154138287Smarks *
155245582Sjkim * PARAMETERS:  ObjectArg           - Desired sleep state (0-5). NULL means
156245582Sjkim *                                    invoke all possible sleep states.
157138287Smarks *
158138287Smarks * RETURN:      Status
159138287Smarks *
160245582Sjkim * DESCRIPTION: Simulate sleep/wake sequences
161138287Smarks *
162138287Smarks ******************************************************************************/
163138287Smarks
164129684SnjlACPI_STATUS
165129684SnjlAcpiDbSleep (
166129684Snjl    char                    *ObjectArg)
167129684Snjl{
168129684Snjl    UINT8                   SleepState;
169245582Sjkim    UINT32                  i;
170129684Snjl
171129684Snjl
172231844Sjkim    ACPI_FUNCTION_TRACE (AcpiDbSleep);
173231844Sjkim
174231844Sjkim
175245582Sjkim    /* Null input (no arguments) means to invoke all sleep states */
176245582Sjkim
177245582Sjkim    if (!ObjectArg)
178245582Sjkim    {
179245582Sjkim        AcpiOsPrintf ("Invoking all possible sleep states, 0-%d\n",
180245582Sjkim            ACPI_S_STATES_MAX);
181245582Sjkim
182245582Sjkim        for (i = 0; i <= ACPI_S_STATES_MAX; i++)
183245582Sjkim        {
184245582Sjkim            AcpiDbDoOneSleepState ((UINT8) i);
185245582Sjkim        }
186245582Sjkim
187245582Sjkim        return_ACPI_STATUS (AE_OK);
188245582Sjkim    }
189245582Sjkim
190245582Sjkim    /* Convert argument to binary and invoke the sleep state */
191245582Sjkim
192129684Snjl    SleepState = (UINT8) ACPI_STRTOUL (ObjectArg, NULL, 0);
193245582Sjkim    AcpiDbDoOneSleepState (SleepState);
194245582Sjkim    return_ACPI_STATUS (AE_OK);
195245582Sjkim}
196129684Snjl
197245582Sjkim
198245582Sjkim/*******************************************************************************
199245582Sjkim *
200245582Sjkim * FUNCTION:    AcpiDbDoOneSleepState
201245582Sjkim *
202245582Sjkim * PARAMETERS:  SleepState          - Desired sleep state (0-5)
203245582Sjkim *
204245582Sjkim * RETURN:      Status
205245582Sjkim *
206245582Sjkim * DESCRIPTION: Simulate a sleep/wake sequence
207245582Sjkim *
208245582Sjkim ******************************************************************************/
209245582Sjkim
210245582Sjkimstatic void
211245582SjkimAcpiDbDoOneSleepState (
212245582Sjkim    UINT8                   SleepState)
213245582Sjkim{
214245582Sjkim    ACPI_STATUS             Status;
215245582Sjkim    UINT8                   SleepTypeA;
216245582Sjkim    UINT8                   SleepTypeB;
217245582Sjkim
218245582Sjkim
219245582Sjkim    /* Validate parameter */
220245582Sjkim
221245582Sjkim    if (SleepState > ACPI_S_STATES_MAX)
222245582Sjkim    {
223245582Sjkim        AcpiOsPrintf ("Sleep state %d out of range (%d max)\n",
224245582Sjkim            SleepState, ACPI_S_STATES_MAX);
225245582Sjkim        return;
226245582Sjkim    }
227245582Sjkim
228245582Sjkim    AcpiOsPrintf ("\n---- Invoking sleep state S%d (%s):\n",
229245582Sjkim        SleepState, AcpiGbl_SleepStateNames[SleepState]);
230245582Sjkim
231245582Sjkim    /* Get the values for the sleep type registers (for display only) */
232245582Sjkim
233245582Sjkim    Status = AcpiGetSleepTypeData (SleepState, &SleepTypeA, &SleepTypeB);
234245582Sjkim    if (ACPI_FAILURE (Status))
235245582Sjkim    {
236245582Sjkim        AcpiOsPrintf ("Could not evaluate [%s] method, %s\n",
237245582Sjkim            AcpiGbl_SleepStateNames[SleepState],
238245582Sjkim            AcpiFormatException (Status));
239245582Sjkim        return;
240245582Sjkim    }
241245582Sjkim
242245582Sjkim    AcpiOsPrintf (
243245582Sjkim        "Register values for sleep state S%d: Sleep-A: %.2X, Sleep-B: %.2X\n",
244245582Sjkim        SleepState, SleepTypeA, SleepTypeB);
245245582Sjkim
246245582Sjkim    /* Invoke the various sleep/wake interfaces */
247245582Sjkim
248245582Sjkim    AcpiOsPrintf ("**** Sleep: Prepare to sleep (S%d) ****\n",
249245582Sjkim        SleepState);
250129684Snjl    Status = AcpiEnterSleepStatePrep (SleepState);
251129684Snjl    if (ACPI_FAILURE (Status))
252129684Snjl    {
253231844Sjkim        goto ErrorExit;
254129684Snjl    }
255129684Snjl
256245582Sjkim    AcpiOsPrintf ("**** Sleep: Going to sleep (S%d) ****\n",
257245582Sjkim        SleepState);
258239340Sjkim    Status = AcpiEnterSleepState (SleepState);
259129684Snjl    if (ACPI_FAILURE (Status))
260129684Snjl    {
261231844Sjkim        goto ErrorExit;
262129684Snjl    }
263129684Snjl
264245582Sjkim    AcpiOsPrintf ("**** Wake: Prepare to return from sleep (S%d) ****\n",
265245582Sjkim        SleepState);
266239340Sjkim    Status = AcpiLeaveSleepStatePrep (SleepState);
267231844Sjkim    if (ACPI_FAILURE (Status))
268231844Sjkim    {
269231844Sjkim        goto ErrorExit;
270231844Sjkim    }
271231844Sjkim
272245582Sjkim    AcpiOsPrintf ("**** Wake: Return from sleep (S%d) ****\n",
273245582Sjkim        SleepState);
274129684Snjl    Status = AcpiLeaveSleepState (SleepState);
275231844Sjkim    if (ACPI_FAILURE (Status))
276231844Sjkim    {
277231844Sjkim        goto ErrorExit;
278231844Sjkim    }
279129684Snjl
280245582Sjkim    return;
281231844Sjkim
282231844Sjkim
283231844SjkimErrorExit:
284245582Sjkim    ACPI_EXCEPTION ((AE_INFO, Status, "During invocation of sleep state S%d",
285245582Sjkim        SleepState));
286129684Snjl}
287129684Snjl
288231844Sjkim
28967754Smsmith/*******************************************************************************
29067754Smsmith *
29177424Smsmith * FUNCTION:    AcpiDbDisplayLocks
29277424Smsmith *
29377424Smsmith * PARAMETERS:  None
29477424Smsmith *
29577424Smsmith * RETURN:      None
29677424Smsmith *
29777424Smsmith * DESCRIPTION: Display information about internal mutexes.
29877424Smsmith *
29977424Smsmith ******************************************************************************/
30077424Smsmith
30177424Smsmithvoid
302151937SjkimAcpiDbDisplayLocks (
303151937Sjkim    void)
30477424Smsmith{
30577424Smsmith    UINT32                  i;
30677424Smsmith
30777424Smsmith
308167802Sjkim    for (i = 0; i < ACPI_MAX_MUTEX; i++)
30977424Smsmith    {
31077424Smsmith        AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i),
311167802Sjkim            AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED
312167802Sjkim                ? "Locked" : "Unlocked");
31377424Smsmith    }
31477424Smsmith}
31577424Smsmith
31677424Smsmith
31777424Smsmith/*******************************************************************************
31877424Smsmith *
31967754Smsmith * FUNCTION:    AcpiDbDisplayTableInfo
32067754Smsmith *
321245582Sjkim * PARAMETERS:  TableArg            - Name of table to be displayed
32267754Smsmith *
32367754Smsmith * RETURN:      None
32467754Smsmith *
325241973Sjkim * DESCRIPTION: Display information about loaded tables. Current
32667754Smsmith *              implementation displays all loaded tables.
32767754Smsmith *
32867754Smsmith ******************************************************************************/
32967754Smsmith
33067754Smsmithvoid
33167754SmsmithAcpiDbDisplayTableInfo (
332114237Snjl    char                    *TableArg)
33367754Smsmith{
334193267Sjkim    UINT32                  i;
335117521Snjl    ACPI_TABLE_DESC         *TableDesc;
336193267Sjkim    ACPI_STATUS             Status;
33767754Smsmith
33867754Smsmith
339238381Sjkim    /* Header */
340238381Sjkim
341281075Sdim    AcpiOsPrintf ("Idx ID    Status Type              TableHeader (Sig, Address, Length)\n");
342238381Sjkim
343193267Sjkim    /* Walk the entire root table list */
344193267Sjkim
345207344Sjkim    for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
34667754Smsmith    {
347167802Sjkim        TableDesc = &AcpiGbl_RootTableList.Tables[i];
348167802Sjkim
349238381Sjkim        /* Index and Table ID */
350238381Sjkim
351238381Sjkim        AcpiOsPrintf ("%3u %.2u ", i, TableDesc->OwnerId);
352238381Sjkim
353238381Sjkim        /* Decode the table flags */
354238381Sjkim
355238381Sjkim        if (!(TableDesc->Flags & ACPI_TABLE_IS_LOADED))
356238381Sjkim        {
357238381Sjkim            AcpiOsPrintf ("NotLoaded ");
358238381Sjkim        }
359238381Sjkim        else
360238381Sjkim        {
361238381Sjkim            AcpiOsPrintf ("   Loaded ");
362238381Sjkim        }
363238381Sjkim
364238381Sjkim        switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
365238381Sjkim        {
366281075Sdim        case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
367250838Sjkim
368281075Sdim            AcpiOsPrintf ("External/virtual  ");
369238381Sjkim            break;
370238381Sjkim
371281075Sdim        case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
372250838Sjkim
373281075Sdim            AcpiOsPrintf ("Internal/physical ");
374238381Sjkim            break;
375238381Sjkim
376281075Sdim        case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
377250838Sjkim
378281075Sdim            AcpiOsPrintf ("Internal/virtual  ");
379238381Sjkim            break;
380238381Sjkim
381238381Sjkim        default:
382250838Sjkim
383281075Sdim            AcpiOsPrintf ("INVALID TYPE      ");
384238381Sjkim            break;
385238381Sjkim        }
386238381Sjkim
387193267Sjkim        /* Make sure that the table is mapped */
388193267Sjkim
389281075Sdim        Status = AcpiTbValidateTable (TableDesc);
390193267Sjkim        if (ACPI_FAILURE (Status))
39167754Smsmith        {
392193267Sjkim            return;
39367754Smsmith        }
394193267Sjkim
395193267Sjkim        /* Dump the table header */
396193267Sjkim
397193267Sjkim        if (TableDesc->Pointer)
398193267Sjkim        {
399193267Sjkim            AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer);
400193267Sjkim        }
401193267Sjkim        else
402193267Sjkim        {
403193267Sjkim            /* If the pointer is null, the table has been unloaded */
404193267Sjkim
405193267Sjkim            ACPI_INFO ((AE_INFO, "%4.4s - Table has been unloaded",
406193267Sjkim                TableDesc->Signature.Ascii));
407193267Sjkim        }
40867754Smsmith    }
40967754Smsmith}
41067754Smsmith
41167754Smsmith
41267754Smsmith/*******************************************************************************
41367754Smsmith *
41467754Smsmith * FUNCTION:    AcpiDbUnloadAcpiTable
41567754Smsmith *
416238381Sjkim * PARAMETERS:  ObjectName          - Namespace pathname for an object that
417238381Sjkim *                                    is owned by the table to be unloaded
41867754Smsmith *
419238381Sjkim * RETURN:      None
42067754Smsmith *
421238381Sjkim * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned
422238381Sjkim *              by the table.
42367754Smsmith *
42467754Smsmith ******************************************************************************/
42567754Smsmith
42667754Smsmithvoid
42767754SmsmithAcpiDbUnloadAcpiTable (
428238381Sjkim    char                    *ObjectName)
42967754Smsmith{
430238381Sjkim    ACPI_NAMESPACE_NODE     *Node;
43167754Smsmith    ACPI_STATUS             Status;
43267754Smsmith
43367754Smsmith
434238381Sjkim    /* Translate name to an Named object */
43567754Smsmith
436238381Sjkim    Node = AcpiDbConvertToNode (ObjectName);
437238381Sjkim    if (!Node)
43867754Smsmith    {
439238381Sjkim        return;
440238381Sjkim    }
44167754Smsmith
442238381Sjkim    Status = AcpiUnloadParentTable (ACPI_CAST_PTR (ACPI_HANDLE, Node));
443238381Sjkim    if (ACPI_SUCCESS (Status))
444238381Sjkim    {
445238381Sjkim        AcpiOsPrintf ("Parent of [%s] (%p) unloaded and uninstalled\n",
446238381Sjkim            ObjectName, Node);
44767754Smsmith    }
448238381Sjkim    else
449238381Sjkim    {
450238381Sjkim        AcpiOsPrintf ("%s, while unloading parent table of [%s]\n",
451238381Sjkim            AcpiFormatException (Status), ObjectName);
452238381Sjkim    }
45367754Smsmith}
45467754Smsmith
45567754Smsmith
45667754Smsmith/*******************************************************************************
45767754Smsmith *
45867754Smsmith * FUNCTION:    AcpiDbSendNotify
45967754Smsmith *
460245582Sjkim * PARAMETERS:  Name                - Name of ACPI object where to send notify
461245582Sjkim *              Value               - Value of the notify to send.
46267754Smsmith *
46367754Smsmith * RETURN:      None
46467754Smsmith *
465241973Sjkim * DESCRIPTION: Send an ACPI notification. The value specified is sent to the
46667754Smsmith *              named object as an ACPI notify.
46767754Smsmith *
46867754Smsmith ******************************************************************************/
46967754Smsmith
47067754Smsmithvoid
47167754SmsmithAcpiDbSendNotify (
472114237Snjl    char                    *Name,
47367754Smsmith    UINT32                  Value)
47467754Smsmith{
47567754Smsmith    ACPI_NAMESPACE_NODE     *Node;
47699679Siwasaki    ACPI_STATUS             Status;
47767754Smsmith
47867754Smsmith
47967754Smsmith    /* Translate name to an Named object */
48067754Smsmith
481151937Sjkim    Node = AcpiDbConvertToNode (Name);
48267754Smsmith    if (!Node)
48367754Smsmith    {
48467754Smsmith        return;
48567754Smsmith    }
48667754Smsmith
487234623Sjkim    /* Dispatch the notify if legal */
48867754Smsmith
489234623Sjkim    if (AcpiEvIsNotifyObject (Node))
49067754Smsmith    {
49199679Siwasaki        Status = AcpiEvQueueNotifyRequest (Node, Value);
49299679Siwasaki        if (ACPI_FAILURE (Status))
49399679Siwasaki        {
49499679Siwasaki            AcpiOsPrintf ("Could not queue notify\n");
49599679Siwasaki        }
49667754Smsmith    }
497234623Sjkim    else
498234623Sjkim    {
499245582Sjkim        AcpiOsPrintf (
500245582Sjkim            "Named object [%4.4s] Type %s, must be Device/Thermal/Processor type\n",
501234623Sjkim            AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type));
502234623Sjkim    }
50367754Smsmith}
50467754Smsmith
50567754Smsmith
50667754Smsmith/*******************************************************************************
50767754Smsmith *
508210976Sjkim * FUNCTION:    AcpiDbDisplayInterfaces
509210976Sjkim *
510210976Sjkim * PARAMETERS:  ActionArg           - Null, "install", or "remove"
511210976Sjkim *              InterfaceNameArg    - Name for install/remove options
512210976Sjkim *
513210976Sjkim * RETURN:      None
514210976Sjkim *
515210976Sjkim * DESCRIPTION: Display or modify the global _OSI interface list
516210976Sjkim *
517210976Sjkim ******************************************************************************/
518210976Sjkim
519210976Sjkimvoid
520210976SjkimAcpiDbDisplayInterfaces (
521210976Sjkim    char                    *ActionArg,
522210976Sjkim    char                    *InterfaceNameArg)
523210976Sjkim{
524210976Sjkim    ACPI_INTERFACE_INFO     *NextInterface;
525210976Sjkim    char                    *SubString;
526210976Sjkim    ACPI_STATUS             Status;
527210976Sjkim
528210976Sjkim
529210976Sjkim    /* If no arguments, just display current interface list */
530210976Sjkim
531210976Sjkim    if (!ActionArg)
532210976Sjkim    {
533210976Sjkim        (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex,
534210976Sjkim                    ACPI_WAIT_FOREVER);
535210976Sjkim
536210976Sjkim        NextInterface = AcpiGbl_SupportedInterfaces;
537210976Sjkim        while (NextInterface)
538210976Sjkim        {
539210976Sjkim            if (!(NextInterface->Flags & ACPI_OSI_INVALID))
540210976Sjkim            {
541210976Sjkim                AcpiOsPrintf ("%s\n", NextInterface->Name);
542210976Sjkim            }
543210976Sjkim            NextInterface = NextInterface->Next;
544210976Sjkim        }
545210976Sjkim
546210976Sjkim        AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
547210976Sjkim        return;
548210976Sjkim    }
549210976Sjkim
550210976Sjkim    /* If ActionArg exists, so must InterfaceNameArg */
551210976Sjkim
552210976Sjkim    if (!InterfaceNameArg)
553210976Sjkim    {
554210976Sjkim        AcpiOsPrintf ("Missing Interface Name argument\n");
555210976Sjkim        return;
556210976Sjkim    }
557210976Sjkim
558210976Sjkim    /* Uppercase the action for match below */
559210976Sjkim
560210976Sjkim    AcpiUtStrupr (ActionArg);
561210976Sjkim
562210976Sjkim    /* Install - install an interface */
563210976Sjkim
564210976Sjkim    SubString = ACPI_STRSTR ("INSTALL", ActionArg);
565210976Sjkim    if (SubString)
566210976Sjkim    {
567210976Sjkim        Status = AcpiInstallInterface (InterfaceNameArg);
568210976Sjkim        if (ACPI_FAILURE (Status))
569210976Sjkim        {
570210976Sjkim            AcpiOsPrintf ("%s, while installing \"%s\"\n",
571210976Sjkim                AcpiFormatException (Status), InterfaceNameArg);
572210976Sjkim        }
573210976Sjkim        return;
574210976Sjkim    }
575210976Sjkim
576210976Sjkim    /* Remove - remove an interface */
577210976Sjkim
578210976Sjkim    SubString = ACPI_STRSTR ("REMOVE", ActionArg);
579210976Sjkim    if (SubString)
580210976Sjkim    {
581210976Sjkim        Status = AcpiRemoveInterface (InterfaceNameArg);
582210976Sjkim        if (ACPI_FAILURE (Status))
583210976Sjkim        {
584210976Sjkim            AcpiOsPrintf ("%s, while removing \"%s\"\n",
585210976Sjkim                AcpiFormatException (Status), InterfaceNameArg);
586210976Sjkim        }
587210976Sjkim        return;
588210976Sjkim    }
589210976Sjkim
590210976Sjkim    /* Invalid ActionArg */
591210976Sjkim
592210976Sjkim    AcpiOsPrintf ("Invalid action argument: %s\n", ActionArg);
593210976Sjkim    return;
594210976Sjkim}
595210976Sjkim
596210976Sjkim
597210976Sjkim/*******************************************************************************
598210976Sjkim *
599228110Sjkim * FUNCTION:    AcpiDbDisplayTemplate
600228110Sjkim *
601245582Sjkim * PARAMETERS:  BufferArg           - Buffer name or address
602228110Sjkim *
603228110Sjkim * RETURN:      None
604228110Sjkim *
605228110Sjkim * DESCRIPTION: Dump a buffer that contains a resource template
606228110Sjkim *
607228110Sjkim ******************************************************************************/
608228110Sjkim
609228110Sjkimvoid
610228110SjkimAcpiDbDisplayTemplate (
611228110Sjkim    char                    *BufferArg)
612228110Sjkim{
613228110Sjkim    ACPI_NAMESPACE_NODE     *Node;
614228110Sjkim    ACPI_STATUS             Status;
615245582Sjkim    ACPI_BUFFER             ReturnBuffer;
616228110Sjkim
617228110Sjkim
618228110Sjkim    /* Translate BufferArg to an Named object */
619228110Sjkim
620228110Sjkim    Node = AcpiDbConvertToNode (BufferArg);
621228110Sjkim    if (!Node || (Node == AcpiGbl_RootNode))
622228110Sjkim    {
623228110Sjkim        AcpiOsPrintf ("Invalid argument: %s\n", BufferArg);
624228110Sjkim        return;
625228110Sjkim    }
626228110Sjkim
627228110Sjkim    /* We must have a buffer object */
628228110Sjkim
629228110Sjkim    if (Node->Type != ACPI_TYPE_BUFFER)
630228110Sjkim    {
631228110Sjkim        AcpiOsPrintf ("Not a Buffer object, cannot be a template: %s\n",
632228110Sjkim            BufferArg);
633228110Sjkim        return;
634228110Sjkim    }
635228110Sjkim
636245582Sjkim    ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE;
637245582Sjkim    ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
638228110Sjkim
639228110Sjkim    /* Attempt to convert the raw buffer to a resource list */
640228110Sjkim
641245582Sjkim    Status = AcpiRsCreateResourceList (Node->Object, &ReturnBuffer);
642228110Sjkim
643228110Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
644228110Sjkim    AcpiDbgLevel |= ACPI_LV_RESOURCES;
645228110Sjkim
646228110Sjkim    if (ACPI_FAILURE (Status))
647228110Sjkim    {
648228110Sjkim        AcpiOsPrintf ("Could not convert Buffer to a resource list: %s, %s\n",
649228110Sjkim            BufferArg, AcpiFormatException (Status));
650228110Sjkim        goto DumpBuffer;
651228110Sjkim    }
652228110Sjkim
653228110Sjkim    /* Now we can dump the resource list */
654228110Sjkim
655228110Sjkim    AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
656245582Sjkim        ReturnBuffer.Pointer));
657228110Sjkim
658228110SjkimDumpBuffer:
659228110Sjkim    AcpiOsPrintf ("\nRaw data buffer:\n");
660241973Sjkim    AcpiUtDebugDumpBuffer ((UINT8 *) Node->Object->Buffer.Pointer,
661228110Sjkim        Node->Object->Buffer.Length,
662228110Sjkim        DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
663228110Sjkim
664228110Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
665228110Sjkim    return;
666228110Sjkim}
667228110Sjkim
668228110Sjkim
669228110Sjkim/*******************************************************************************
670228110Sjkim *
671151937Sjkim * FUNCTION:    AcpiDmCompareAmlResources
672151937Sjkim *
673151937Sjkim * PARAMETERS:  Aml1Buffer          - Contains first resource list
674151937Sjkim *              Aml1BufferLength    - Length of first resource list
675151937Sjkim *              Aml2Buffer          - Contains second resource list
676151937Sjkim *              Aml2BufferLength    - Length of second resource list
677151937Sjkim *
678151937Sjkim * RETURN:      None
679151937Sjkim *
680151937Sjkim * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in
681151937Sjkim *              order to isolate a miscompare to an individual resource)
682151937Sjkim *
683151937Sjkim ******************************************************************************/
684151937Sjkim
685151937Sjkimstatic void
686151937SjkimAcpiDmCompareAmlResources (
687151937Sjkim    UINT8                   *Aml1Buffer,
688151937Sjkim    ACPI_RSDESC_SIZE        Aml1BufferLength,
689151937Sjkim    UINT8                   *Aml2Buffer,
690151937Sjkim    ACPI_RSDESC_SIZE        Aml2BufferLength)
691151937Sjkim{
692151937Sjkim    UINT8                   *Aml1;
693151937Sjkim    UINT8                   *Aml2;
694228110Sjkim    UINT8                   *Aml1End;
695228110Sjkim    UINT8                   *Aml2End;
696151937Sjkim    ACPI_RSDESC_SIZE        Aml1Length;
697151937Sjkim    ACPI_RSDESC_SIZE        Aml2Length;
698151937Sjkim    ACPI_RSDESC_SIZE        Offset = 0;
699151937Sjkim    UINT8                   ResourceType;
700151937Sjkim    UINT32                  Count = 0;
701228110Sjkim    UINT32                  i;
702151937Sjkim
703151937Sjkim
704151937Sjkim    /* Compare overall buffer sizes (may be different due to size rounding) */
705151937Sjkim
706151937Sjkim    if (Aml1BufferLength != Aml2BufferLength)
707151937Sjkim    {
708151937Sjkim        AcpiOsPrintf (
709228110Sjkim            "**** Buffer length mismatch in converted AML: Original %X, New %X ****\n",
710151937Sjkim            Aml1BufferLength, Aml2BufferLength);
711151937Sjkim    }
712151937Sjkim
713151937Sjkim    Aml1 = Aml1Buffer;
714151937Sjkim    Aml2 = Aml2Buffer;
715228110Sjkim    Aml1End = Aml1Buffer + Aml1BufferLength;
716228110Sjkim    Aml2End = Aml2Buffer + Aml2BufferLength;
717151937Sjkim
718151937Sjkim    /* Walk the descriptor lists, comparing each descriptor */
719151937Sjkim
720228110Sjkim    while ((Aml1 < Aml1End) && (Aml2 < Aml2End))
721151937Sjkim    {
722151937Sjkim        /* Get the lengths of each descriptor */
723151937Sjkim
724151937Sjkim        Aml1Length = AcpiUtGetDescriptorLength (Aml1);
725151937Sjkim        Aml2Length = AcpiUtGetDescriptorLength (Aml2);
726151937Sjkim        ResourceType = AcpiUtGetResourceType (Aml1);
727151937Sjkim
728151937Sjkim        /* Check for descriptor length match */
729151937Sjkim
730151937Sjkim        if (Aml1Length != Aml2Length)
731151937Sjkim        {
732151937Sjkim            AcpiOsPrintf (
733228110Sjkim                "**** Length mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X Len1 %X, Len2 %X ****\n",
734151937Sjkim                Count, ResourceType, Offset, Aml1Length, Aml2Length);
735151937Sjkim        }
736151937Sjkim
737151937Sjkim        /* Check for descriptor byte match */
738151937Sjkim
739167802Sjkim        else if (ACPI_MEMCMP (Aml1, Aml2, Aml1Length))
740151937Sjkim        {
741151937Sjkim            AcpiOsPrintf (
742151937Sjkim                "**** Data mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X ****\n",
743151937Sjkim                Count, ResourceType, Offset);
744228110Sjkim
745228110Sjkim            for (i = 0; i < Aml1Length; i++)
746228110Sjkim            {
747228110Sjkim                if (Aml1[i] != Aml2[i])
748228110Sjkim                {
749245582Sjkim                    AcpiOsPrintf (
750245582Sjkim                        "Mismatch at byte offset %.2X: is %2.2X, should be %2.2X\n",
751228110Sjkim                        i, Aml2[i], Aml1[i]);
752228110Sjkim                }
753228110Sjkim            }
754151937Sjkim        }
755151937Sjkim
756151937Sjkim        /* Exit on EndTag descriptor */
757151937Sjkim
758151937Sjkim        if (ResourceType == ACPI_RESOURCE_NAME_END_TAG)
759151937Sjkim        {
760151937Sjkim            return;
761151937Sjkim        }
762151937Sjkim
763151937Sjkim        /* Point to next descriptor in each buffer */
764151937Sjkim
765151937Sjkim        Count++;
766151937Sjkim        Offset += Aml1Length;
767151937Sjkim        Aml1 += Aml1Length;
768167802Sjkim        Aml2 += Aml2Length;
769151937Sjkim    }
770151937Sjkim}
771151937Sjkim
772151937Sjkim
773151937Sjkim/*******************************************************************************
774151937Sjkim *
775151937Sjkim * FUNCTION:    AcpiDmTestResourceConversion
776151937Sjkim *
777245582Sjkim * PARAMETERS:  Node                - Parent device node
778245582Sjkim *              Name                - resource method name (_CRS)
779151937Sjkim *
780151937Sjkim * RETURN:      Status
781151937Sjkim *
782151937Sjkim * DESCRIPTION: Compare the original AML with a conversion of the AML to
783151937Sjkim *              internal resource list, then back to AML.
784151937Sjkim *
785151937Sjkim ******************************************************************************/
786151937Sjkim
787151937Sjkimstatic ACPI_STATUS
788151937SjkimAcpiDmTestResourceConversion (
789151937Sjkim    ACPI_NAMESPACE_NODE     *Node,
790151937Sjkim    char                    *Name)
791151937Sjkim{
792151937Sjkim    ACPI_STATUS             Status;
793245582Sjkim    ACPI_BUFFER             ReturnBuffer;
794245582Sjkim    ACPI_BUFFER             ResourceBuffer;
795151937Sjkim    ACPI_BUFFER             NewAml;
796151937Sjkim    ACPI_OBJECT             *OriginalAml;
797151937Sjkim
798151937Sjkim
799151937Sjkim    AcpiOsPrintf ("Resource Conversion Comparison:\n");
800151937Sjkim
801151937Sjkim    NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
802245582Sjkim    ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
803245582Sjkim    ResourceBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
804151937Sjkim
805151937Sjkim    /* Get the original _CRS AML resource template */
806151937Sjkim
807245582Sjkim    Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnBuffer);
808151937Sjkim    if (ACPI_FAILURE (Status))
809151937Sjkim    {
810151937Sjkim        AcpiOsPrintf ("Could not obtain %s: %s\n",
811151937Sjkim            Name, AcpiFormatException (Status));
812151937Sjkim        return (Status);
813151937Sjkim    }
814151937Sjkim
815151937Sjkim    /* Get the AML resource template, converted to internal resource structs */
816151937Sjkim
817245582Sjkim    Status = AcpiGetCurrentResources (Node, &ResourceBuffer);
818151937Sjkim    if (ACPI_FAILURE (Status))
819151937Sjkim    {
820151937Sjkim        AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
821151937Sjkim            AcpiFormatException (Status));
822151937Sjkim        goto Exit1;
823151937Sjkim    }
824151937Sjkim
825151937Sjkim    /* Convert internal resource list to external AML resource template */
826151937Sjkim
827281075Sdim    Status = AcpiRsCreateAmlResources (&ResourceBuffer, &NewAml);
828151937Sjkim    if (ACPI_FAILURE (Status))
829151937Sjkim    {
830151937Sjkim        AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n",
831151937Sjkim            AcpiFormatException (Status));
832151937Sjkim        goto Exit2;
833151937Sjkim    }
834151937Sjkim
835151937Sjkim    /* Compare original AML to the newly created AML resource list */
836151937Sjkim
837245582Sjkim    OriginalAml = ReturnBuffer.Pointer;
838151937Sjkim
839281075Sdim    AcpiDmCompareAmlResources (OriginalAml->Buffer.Pointer,
840281075Sdim        (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
841193267Sjkim        NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length);
842151937Sjkim
843151937Sjkim    /* Cleanup and exit */
844151937Sjkim
845167802Sjkim    ACPI_FREE (NewAml.Pointer);
846151937SjkimExit2:
847245582Sjkim    ACPI_FREE (ResourceBuffer.Pointer);
848151937SjkimExit1:
849245582Sjkim    ACPI_FREE (ReturnBuffer.Pointer);
850151937Sjkim    return (Status);
851151937Sjkim}
852151937Sjkim
853151937Sjkim
854151937Sjkim/*******************************************************************************
855151937Sjkim *
856228110Sjkim * FUNCTION:    AcpiDbResourceCallback
85773561Smsmith *
858228110Sjkim * PARAMETERS:  ACPI_WALK_RESOURCE_CALLBACK
85973561Smsmith *
860228110Sjkim * RETURN:      Status
86173561Smsmith *
862245582Sjkim * DESCRIPTION: Simple callback to exercise AcpiWalkResources and
863245582Sjkim *              AcpiWalkResourceBuffer.
86473561Smsmith *
86573561Smsmith ******************************************************************************/
86673561Smsmith
867228110Sjkimstatic ACPI_STATUS
868228110SjkimAcpiDbResourceCallback (
869228110Sjkim    ACPI_RESOURCE           *Resource,
870228110Sjkim    void                    *Context)
87173561Smsmith{
872228110Sjkim
873228110Sjkim    return (AE_OK);
874228110Sjkim}
875228110Sjkim
876228110Sjkim
877228110Sjkim/*******************************************************************************
878228110Sjkim *
879228110Sjkim * FUNCTION:    AcpiDbDeviceResources
880228110Sjkim *
881228110Sjkim * PARAMETERS:  ACPI_WALK_CALLBACK
882228110Sjkim *
883228110Sjkim * RETURN:      Status
884228110Sjkim *
885228110Sjkim * DESCRIPTION: Display the _PRT/_CRS/_PRS resources for a device object.
886228110Sjkim *
887228110Sjkim ******************************************************************************/
888228110Sjkim
889228110Sjkimstatic ACPI_STATUS
890228110SjkimAcpiDbDeviceResources (
891228110Sjkim    ACPI_HANDLE             ObjHandle,
892228110Sjkim    UINT32                  NestingLevel,
893228110Sjkim    void                    *Context,
894228110Sjkim    void                    **ReturnValue)
895228110Sjkim{
896151937Sjkim    ACPI_NAMESPACE_NODE     *Node;
897228110Sjkim    ACPI_NAMESPACE_NODE     *PrtNode = NULL;
898228110Sjkim    ACPI_NAMESPACE_NODE     *CrsNode = NULL;
899228110Sjkim    ACPI_NAMESPACE_NODE     *PrsNode = NULL;
900228110Sjkim    ACPI_NAMESPACE_NODE     *AeiNode = NULL;
901228110Sjkim    char                    *ParentPath;
902245582Sjkim    ACPI_BUFFER             ReturnBuffer;
90373561Smsmith    ACPI_STATUS             Status;
90473561Smsmith
90573561Smsmith
906228110Sjkim    Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
907228110Sjkim    ParentPath = AcpiNsGetExternalPathname (Node);
908228110Sjkim    if (!ParentPath)
909228110Sjkim    {
910228110Sjkim        return (AE_NO_MEMORY);
911228110Sjkim    }
91273561Smsmith
913228110Sjkim    /* Get handles to the resource methods for this device */
91473561Smsmith
915228110Sjkim    (void) AcpiGetHandle (Node, METHOD_NAME__PRT, ACPI_CAST_PTR (ACPI_HANDLE, &PrtNode));
916228110Sjkim    (void) AcpiGetHandle (Node, METHOD_NAME__CRS, ACPI_CAST_PTR (ACPI_HANDLE, &CrsNode));
917228110Sjkim    (void) AcpiGetHandle (Node, METHOD_NAME__PRS, ACPI_CAST_PTR (ACPI_HANDLE, &PrsNode));
918228110Sjkim    (void) AcpiGetHandle (Node, METHOD_NAME__AEI, ACPI_CAST_PTR (ACPI_HANDLE, &AeiNode));
919228110Sjkim    if (!PrtNode && !CrsNode && !PrsNode && !AeiNode)
920151937Sjkim    {
921228110Sjkim        goto Cleanup;   /* Nothing to do */
922151937Sjkim    }
92373561Smsmith
924228110Sjkim    AcpiOsPrintf ("\nDevice: %s\n", ParentPath);
925228110Sjkim
92673561Smsmith    /* Prepare for a return object of arbitrary size */
92773561Smsmith
928245582Sjkim    ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
929245582Sjkim    ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
93073561Smsmith
931228110Sjkim
93277424Smsmith    /* _PRT */
93377424Smsmith
934228110Sjkim    if (PrtNode)
935228110Sjkim    {
936228110Sjkim        AcpiOsPrintf ("Evaluating _PRT\n");
93777424Smsmith
938245582Sjkim        Status = AcpiEvaluateObject (PrtNode, NULL, NULL, &ReturnBuffer);
939228110Sjkim        if (ACPI_FAILURE (Status))
940228110Sjkim        {
941228110Sjkim            AcpiOsPrintf ("Could not evaluate _PRT: %s\n",
942228110Sjkim                AcpiFormatException (Status));
943228110Sjkim            goto GetCrs;
944228110Sjkim        }
945151937Sjkim
946245582Sjkim        ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
947245582Sjkim        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
94873561Smsmith
949245582Sjkim        Status = AcpiGetIrqRoutingTable (Node, &ReturnBuffer);
950228110Sjkim        if (ACPI_FAILURE (Status))
951228110Sjkim        {
952228110Sjkim            AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n",
953228110Sjkim                AcpiFormatException (Status));
954228110Sjkim            goto GetCrs;
955228110Sjkim        }
95673561Smsmith
957228110Sjkim        AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer));
95877424Smsmith    }
95977424Smsmith
96077424Smsmith
96177424Smsmith    /* _CRS */
96283174Smsmith
96383174SmsmithGetCrs:
964228110Sjkim    if (CrsNode)
965228110Sjkim    {
966228110Sjkim        AcpiOsPrintf ("Evaluating _CRS\n");
96777424Smsmith
968245582Sjkim        ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
969245582Sjkim        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
97077424Smsmith
971245582Sjkim        Status = AcpiEvaluateObject (CrsNode, NULL, NULL, &ReturnBuffer);
972228110Sjkim        if (ACPI_FAILURE (Status))
973228110Sjkim        {
974228110Sjkim            AcpiOsPrintf ("Could not evaluate _CRS: %s\n",
975228110Sjkim                AcpiFormatException (Status));
976228110Sjkim            goto GetPrs;
977228110Sjkim        }
978151937Sjkim
979245582Sjkim        /* This code exercises the AcpiWalkResources interface */
98077424Smsmith
981228110Sjkim        Status = AcpiWalkResources (Node, METHOD_NAME__CRS,
982228110Sjkim            AcpiDbResourceCallback, NULL);
983228110Sjkim        if (ACPI_FAILURE (Status))
984228110Sjkim        {
985228110Sjkim            AcpiOsPrintf ("AcpiWalkResources failed: %s\n",
986228110Sjkim                AcpiFormatException (Status));
987228110Sjkim            goto GetPrs;
988228110Sjkim        }
98977424Smsmith
990245582Sjkim        /* Get the _CRS resource list (test ALLOCATE buffer) */
991151937Sjkim
992245582Sjkim        ReturnBuffer.Pointer = NULL;
993245582Sjkim        ReturnBuffer.Length  = ACPI_ALLOCATE_LOCAL_BUFFER;
99477424Smsmith
995245582Sjkim        Status = AcpiGetCurrentResources (Node, &ReturnBuffer);
996228110Sjkim        if (ACPI_FAILURE (Status))
997228110Sjkim        {
998228110Sjkim            AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
999228110Sjkim                AcpiFormatException (Status));
1000228110Sjkim            goto GetPrs;
1001228110Sjkim        }
1002151937Sjkim
1003245582Sjkim        /* This code exercises the AcpiWalkResourceBuffer interface */
1004245582Sjkim
1005245582Sjkim        Status = AcpiWalkResourceBuffer (&ReturnBuffer,
1006245582Sjkim            AcpiDbResourceCallback, NULL);
1007245582Sjkim        if (ACPI_FAILURE (Status))
1008245582Sjkim        {
1009245582Sjkim            AcpiOsPrintf ("AcpiWalkResourceBuffer failed: %s\n",
1010245582Sjkim                AcpiFormatException (Status));
1011245582Sjkim            goto EndCrs;
1012245582Sjkim        }
1013245582Sjkim
1014228110Sjkim        /* Dump the _CRS resource list */
1015151937Sjkim
1016228110Sjkim        AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
1017245582Sjkim            ReturnBuffer.Pointer));
1018151937Sjkim
1019228110Sjkim        /*
1020245582Sjkim         * Perform comparison of original AML to newly created AML. This
1021245582Sjkim         * tests both the AML->Resource conversion and the Resource->AML
1022245582Sjkim         * conversion.
1023228110Sjkim         */
1024245582Sjkim        (void) AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS);
1025151937Sjkim
1026228110Sjkim        /* Execute _SRS with the resource list */
1027228110Sjkim
1028246849Sjkim        AcpiOsPrintf ("Evaluating _SRS\n");
1029246849Sjkim
1030245582Sjkim        Status = AcpiSetCurrentResources (Node, &ReturnBuffer);
1031228110Sjkim        if (ACPI_FAILURE (Status))
1032228110Sjkim        {
1033228110Sjkim            AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n",
1034228110Sjkim                AcpiFormatException (Status));
1035245582Sjkim            goto EndCrs;
1036228110Sjkim        }
1037245582Sjkim
1038245582SjkimEndCrs:
1039281075Sdim        ACPI_FREE (ReturnBuffer.Pointer);
104091116Smsmith    }
104183174Smsmith
104291116Smsmith
104377424Smsmith    /* _PRS */
104483174Smsmith
104583174SmsmithGetPrs:
1046228110Sjkim    if (PrsNode)
1047228110Sjkim    {
1048228110Sjkim        AcpiOsPrintf ("Evaluating _PRS\n");
104977424Smsmith
1050245582Sjkim        ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1051245582Sjkim        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
105277424Smsmith
1053245582Sjkim        Status = AcpiEvaluateObject (PrsNode, NULL, NULL, &ReturnBuffer);
1054228110Sjkim        if (ACPI_FAILURE (Status))
1055228110Sjkim        {
1056228110Sjkim            AcpiOsPrintf ("Could not evaluate _PRS: %s\n",
1057228110Sjkim                AcpiFormatException (Status));
1058228110Sjkim            goto GetAei;
1059228110Sjkim        }
1060151937Sjkim
1061245582Sjkim        ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1062245582Sjkim        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
1063228110Sjkim
1064245582Sjkim        Status = AcpiGetPossibleResources (Node, &ReturnBuffer);
1065228110Sjkim        if (ACPI_FAILURE (Status))
1066228110Sjkim        {
1067228110Sjkim            AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n",
1068228110Sjkim                AcpiFormatException (Status));
1069228110Sjkim            goto GetAei;
1070228110Sjkim        }
1071228110Sjkim
1072228110Sjkim        AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer));
107373561Smsmith    }
107473561Smsmith
107577424Smsmith
1076228110Sjkim    /* _AEI */
1077228110Sjkim
1078228110SjkimGetAei:
1079228110Sjkim    if (AeiNode)
108073561Smsmith    {
1081228110Sjkim        AcpiOsPrintf ("Evaluating _AEI\n");
1082228110Sjkim
1083245582Sjkim        ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1084245582Sjkim        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
1085228110Sjkim
1086245582Sjkim        Status = AcpiEvaluateObject (AeiNode, NULL, NULL, &ReturnBuffer);
1087228110Sjkim        if (ACPI_FAILURE (Status))
1088228110Sjkim        {
1089228110Sjkim            AcpiOsPrintf ("Could not evaluate _AEI: %s\n",
1090228110Sjkim                AcpiFormatException (Status));
1091228110Sjkim            goto Cleanup;
1092228110Sjkim        }
1093228110Sjkim
1094245582Sjkim        ReturnBuffer.Pointer = AcpiGbl_DbBuffer;
1095245582Sjkim        ReturnBuffer.Length  = ACPI_DEBUG_BUFFER_SIZE;
1096228110Sjkim
1097245582Sjkim        Status = AcpiGetEventResources (Node, &ReturnBuffer);
1098228110Sjkim        if (ACPI_FAILURE (Status))
1099228110Sjkim        {
1100228110Sjkim            AcpiOsPrintf ("AcpiGetEventResources failed: %s\n",
1101228110Sjkim                AcpiFormatException (Status));
1102228110Sjkim            goto Cleanup;
1103228110Sjkim        }
1104228110Sjkim
1105228110Sjkim        AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer));
110673561Smsmith    }
110777424Smsmith
1108151937Sjkim
110973561SmsmithCleanup:
1110228110Sjkim    ACPI_FREE (ParentPath);
1111228110Sjkim    return (AE_OK);
1112228110Sjkim}
111373561Smsmith
1114228110Sjkim
1115228110Sjkim/*******************************************************************************
1116228110Sjkim *
1117228110Sjkim * FUNCTION:    AcpiDbDisplayResources
1118228110Sjkim *
1119245582Sjkim * PARAMETERS:  ObjectArg           - String object name or object pointer.
1120246849Sjkim *                                    NULL or "*" means "display resources for
1121246849Sjkim *                                    all devices"
1122228110Sjkim *
1123228110Sjkim * RETURN:      None
1124228110Sjkim *
1125228110Sjkim * DESCRIPTION: Display the resource objects associated with a device.
1126228110Sjkim *
1127228110Sjkim ******************************************************************************/
1128228110Sjkim
1129228110Sjkimvoid
1130228110SjkimAcpiDbDisplayResources (
1131228110Sjkim    char                    *ObjectArg)
1132228110Sjkim{
1133228110Sjkim    ACPI_NAMESPACE_NODE     *Node;
1134228110Sjkim
1135228110Sjkim
1136228110Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
1137228110Sjkim    AcpiDbgLevel |= ACPI_LV_RESOURCES;
1138228110Sjkim
1139228110Sjkim    /* Asterisk means "display resources for all devices" */
1140228110Sjkim
1141246849Sjkim    if (!ObjectArg || (!ACPI_STRCMP (ObjectArg, "*")))
1142228110Sjkim    {
1143228110Sjkim        (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
1144228110Sjkim                    ACPI_UINT32_MAX, AcpiDbDeviceResources, NULL, NULL, NULL);
1145228110Sjkim    }
1146228110Sjkim    else
1147228110Sjkim    {
1148228110Sjkim        /* Convert string to object pointer */
1149228110Sjkim
1150228110Sjkim        Node = AcpiDbConvertToNode (ObjectArg);
1151228110Sjkim        if (Node)
1152228110Sjkim        {
1153228110Sjkim            if (Node->Type != ACPI_TYPE_DEVICE)
1154228110Sjkim            {
1155228110Sjkim                AcpiOsPrintf ("%4.4s: Name is not a device object (%s)\n",
1156228110Sjkim                    Node->Name.Ascii, AcpiUtGetTypeName (Node->Type));
1157228110Sjkim            }
1158228110Sjkim            else
1159228110Sjkim            {
1160228110Sjkim                (void) AcpiDbDeviceResources (Node, 0, NULL, NULL);
1161228110Sjkim            }
1162228110Sjkim        }
1163228110Sjkim    }
1164228110Sjkim
116591116Smsmith    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
116673561Smsmith}
116773561Smsmith
116873561Smsmith
1169231844Sjkim#if (!ACPI_REDUCED_HARDWARE)
117099679Siwasaki/*******************************************************************************
117199679Siwasaki *
1172114237Snjl * FUNCTION:    AcpiDbGenerateGpe
1173114237Snjl *
1174245582Sjkim * PARAMETERS:  GpeArg              - Raw GPE number, ascii string
1175245582Sjkim *              BlockArg            - GPE block number, ascii string
1176245582Sjkim *                                    0 or 1 for FADT GPE blocks
1177114237Snjl *
1178114237Snjl * RETURN:      None
1179114237Snjl *
1180245582Sjkim * DESCRIPTION: Simulate firing of a GPE
1181114237Snjl *
1182114237Snjl ******************************************************************************/
1183114237Snjl
1184114237Snjlvoid
1185114237SnjlAcpiDbGenerateGpe (
1186114237Snjl    char                    *GpeArg,
1187114237Snjl    char                    *BlockArg)
1188114237Snjl{
1189281075Sdim    UINT32                  BlockNumber = 0;
1190114237Snjl    UINT32                  GpeNumber;
1191114237Snjl    ACPI_GPE_EVENT_INFO     *GpeEventInfo;
1192114237Snjl
1193114237Snjl
1194281075Sdim    GpeNumber = ACPI_STRTOUL (GpeArg, NULL, 0);
1195114237Snjl
1196281075Sdim    /*
1197281075Sdim     * If no block arg, or block arg == 0 or 1, use the FADT-defined
1198281075Sdim     * GPE blocks.
1199281075Sdim     */
1200281075Sdim    if (BlockArg)
1201281075Sdim    {
1202281075Sdim        BlockNumber = ACPI_STRTOUL (BlockArg, NULL, 0);
1203281075Sdim        if (BlockNumber == 1)
1204281075Sdim        {
1205281075Sdim            BlockNumber = 0;
1206281075Sdim        }
1207281075Sdim    }
1208114237Snjl
1209151937Sjkim    GpeEventInfo = AcpiEvGetGpeEventInfo (ACPI_TO_POINTER (BlockNumber),
1210151937Sjkim        GpeNumber);
1211114237Snjl    if (!GpeEventInfo)
1212114237Snjl    {
1213114237Snjl        AcpiOsPrintf ("Invalid GPE\n");
1214114237Snjl        return;
1215114237Snjl    }
1216114237Snjl
1217216471Sjkim    (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber);
1218114237Snjl}
1219254745Sjkim
1220254745Sjkimvoid
1221254745SjkimAcpiDbGenerateSci (
1222254745Sjkim    void)
1223254745Sjkim{
1224254745Sjkim    AcpiEvSciDispatch ();
1225254745Sjkim}
1226254745Sjkim
1227231844Sjkim#endif /* !ACPI_REDUCED_HARDWARE */
1228114237Snjl
1229102550Siwasaki#endif /* ACPI_DEBUGGER */
1230