dbcmds.c revision 241973
167754Smsmith/*******************************************************************************
267754Smsmith *
3218590Sjkim * Module Name: dbcmds - Miscellaneous debug commands and output routines
467754Smsmith *
567754Smsmith ******************************************************************************/
667754Smsmith
7217365Sjkim/*
8229989Sjkim * Copyright (C) 2000 - 2012, 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
4467754Smsmith
45193341Sjkim#include <contrib/dev/acpica/include/acpi.h>
46193341Sjkim#include <contrib/dev/acpica/include/accommon.h>
47193341Sjkim#include <contrib/dev/acpica/include/acevents.h>
48193341Sjkim#include <contrib/dev/acpica/include/acdebug.h>
49228110Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
50193341Sjkim#include <contrib/dev/acpica/include/acresrc.h>
51193341Sjkim#include <contrib/dev/acpica/include/actables.h>
52138287Smarks
53102550Siwasaki#ifdef ACPI_DEBUGGER
5467754Smsmith
55102550Siwasaki#define _COMPONENT          ACPI_CA_DEBUGGER
5691116Smsmith        ACPI_MODULE_NAME    ("dbcmds")
5767754Smsmith
58198237Sjkim
59151937Sjkim/* Local prototypes */
6067754Smsmith
61151937Sjkimstatic void
62151937SjkimAcpiDmCompareAmlResources (
63151937Sjkim    UINT8                   *Aml1Buffer,
64151937Sjkim    ACPI_RSDESC_SIZE        Aml1BufferLength,
65151937Sjkim    UINT8                   *Aml2Buffer,
66151937Sjkim    ACPI_RSDESC_SIZE        Aml2BufferLength);
67151937Sjkim
68151937Sjkimstatic ACPI_STATUS
69151937SjkimAcpiDmTestResourceConversion (
70151937Sjkim    ACPI_NAMESPACE_NODE     *Node,
71151937Sjkim    char                    *Name);
72151937Sjkim
73228110Sjkimstatic ACPI_STATUS
74228110SjkimAcpiDbResourceCallback (
75228110Sjkim    ACPI_RESOURCE           *Resource,
76228110Sjkim    void                    *Context);
77151937Sjkim
78228110Sjkimstatic ACPI_STATUS
79228110SjkimAcpiDbDeviceResources (
80228110Sjkim    ACPI_HANDLE             ObjHandle,
81228110Sjkim    UINT32                  NestingLevel,
82228110Sjkim    void                    *Context,
83228110Sjkim    void                    **ReturnValue);
84228110Sjkim
85228110Sjkim
86138287Smarks/*******************************************************************************
87138287Smarks *
88151937Sjkim * FUNCTION:    AcpiDbConvertToNode
89151937Sjkim *
90151937Sjkim * PARAMETERS:  InString        - String to convert
91151937Sjkim *
92151937Sjkim * RETURN:      Pointer to a NS node
93151937Sjkim *
94241973Sjkim * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or
95151937Sjkim *              alpha strings.
96151937Sjkim *
97151937Sjkim ******************************************************************************/
98151937Sjkim
99218590SjkimACPI_NAMESPACE_NODE *
100151937SjkimAcpiDbConvertToNode (
101151937Sjkim    char                    *InString)
102151937Sjkim{
103151937Sjkim    ACPI_NAMESPACE_NODE     *Node;
104151937Sjkim
105151937Sjkim
106151937Sjkim    if ((*InString >= 0x30) && (*InString <= 0x39))
107151937Sjkim    {
108151937Sjkim        /* Numeric argument, convert */
109151937Sjkim
110151937Sjkim        Node = ACPI_TO_POINTER (ACPI_STRTOUL (InString, NULL, 16));
111151937Sjkim        if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE)))
112151937Sjkim        {
113151937Sjkim            AcpiOsPrintf ("Address %p is invalid in this address space\n",
114151937Sjkim                Node);
115151937Sjkim            return (NULL);
116151937Sjkim        }
117151937Sjkim
118151937Sjkim        /* Make sure pointer is valid NS node */
119151937Sjkim
120151937Sjkim        if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
121151937Sjkim        {
122151937Sjkim            AcpiOsPrintf ("Address %p is not a valid NS node [%s]\n",
123151937Sjkim                    Node, AcpiUtGetDescriptorName (Node));
124151937Sjkim            return (NULL);
125151937Sjkim        }
126151937Sjkim    }
127151937Sjkim    else
128151937Sjkim    {
129151937Sjkim        /* Alpha argument */
130151937Sjkim        /* The parameter is a name string that must be resolved to a
131151937Sjkim         * Named obj
132151937Sjkim         */
133151937Sjkim        Node = AcpiDbLocalNsLookup (InString);
134151937Sjkim        if (!Node)
135151937Sjkim        {
136151937Sjkim            Node = AcpiGbl_RootNode;
137151937Sjkim        }
138151937Sjkim    }
139151937Sjkim
140151937Sjkim    return (Node);
141151937Sjkim}
142151937Sjkim
143151937Sjkim
144151937Sjkim/*******************************************************************************
145151937Sjkim *
146138287Smarks * FUNCTION:    AcpiDbSleep
147138287Smarks *
148138287Smarks * PARAMETERS:  ObjectArg       - Desired sleep state (0-5)
149138287Smarks *
150138287Smarks * RETURN:      Status
151138287Smarks *
152138287Smarks * DESCRIPTION: Simulate a sleep/wake sequence
153138287Smarks *
154138287Smarks ******************************************************************************/
155138287Smarks
156129684SnjlACPI_STATUS
157129684SnjlAcpiDbSleep (
158129684Snjl    char                    *ObjectArg)
159129684Snjl{
160129684Snjl    ACPI_STATUS             Status;
161129684Snjl    UINT8                   SleepState;
162129684Snjl
163129684Snjl
164231844Sjkim    ACPI_FUNCTION_TRACE (AcpiDbSleep);
165231844Sjkim
166231844Sjkim
167129684Snjl    SleepState = (UINT8) ACPI_STRTOUL (ObjectArg, NULL, 0);
168129684Snjl
169129684Snjl    AcpiOsPrintf ("**** Prepare to sleep ****\n");
170129684Snjl    Status = AcpiEnterSleepStatePrep (SleepState);
171129684Snjl    if (ACPI_FAILURE (Status))
172129684Snjl    {
173231844Sjkim        goto ErrorExit;
174129684Snjl    }
175129684Snjl
176129684Snjl    AcpiOsPrintf ("**** Going to sleep ****\n");
177239340Sjkim    Status = AcpiEnterSleepState (SleepState);
178129684Snjl    if (ACPI_FAILURE (Status))
179129684Snjl    {
180231844Sjkim        goto ErrorExit;
181129684Snjl    }
182129684Snjl
183231844Sjkim    AcpiOsPrintf ("**** Prepare to return from sleep ****\n");
184239340Sjkim    Status = AcpiLeaveSleepStatePrep (SleepState);
185231844Sjkim    if (ACPI_FAILURE (Status))
186231844Sjkim    {
187231844Sjkim        goto ErrorExit;
188231844Sjkim    }
189231844Sjkim
190231844Sjkim    AcpiOsPrintf ("**** Returning from sleep ****\n");
191129684Snjl    Status = AcpiLeaveSleepState (SleepState);
192231844Sjkim    if (ACPI_FAILURE (Status))
193231844Sjkim    {
194231844Sjkim        goto ErrorExit;
195231844Sjkim    }
196129684Snjl
197241973Sjkim    return_ACPI_STATUS (Status);
198231844Sjkim
199231844Sjkim
200231844SjkimErrorExit:
201231844Sjkim
202231844Sjkim    ACPI_EXCEPTION ((AE_INFO, Status, "During sleep test"));
203241973Sjkim    return_ACPI_STATUS (Status);
204129684Snjl}
205129684Snjl
206231844Sjkim
20767754Smsmith/*******************************************************************************
20867754Smsmith *
20977424Smsmith * FUNCTION:    AcpiDbDisplayLocks
21077424Smsmith *
21177424Smsmith * PARAMETERS:  None
21277424Smsmith *
21377424Smsmith * RETURN:      None
21477424Smsmith *
21577424Smsmith * DESCRIPTION: Display information about internal mutexes.
21677424Smsmith *
21777424Smsmith ******************************************************************************/
21877424Smsmith
21977424Smsmithvoid
220151937SjkimAcpiDbDisplayLocks (
221151937Sjkim    void)
22277424Smsmith{
22377424Smsmith    UINT32                  i;
22477424Smsmith
22577424Smsmith
226167802Sjkim    for (i = 0; i < ACPI_MAX_MUTEX; i++)
22777424Smsmith    {
22877424Smsmith        AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i),
229167802Sjkim            AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED
230167802Sjkim                ? "Locked" : "Unlocked");
23177424Smsmith    }
23277424Smsmith}
23377424Smsmith
23477424Smsmith
23577424Smsmith/*******************************************************************************
23677424Smsmith *
23767754Smsmith * FUNCTION:    AcpiDbDisplayTableInfo
23867754Smsmith *
23967754Smsmith * PARAMETERS:  TableArg        - String with name of table to be displayed
24067754Smsmith *
24167754Smsmith * RETURN:      None
24267754Smsmith *
243241973Sjkim * DESCRIPTION: Display information about loaded tables. Current
24467754Smsmith *              implementation displays all loaded tables.
24567754Smsmith *
24667754Smsmith ******************************************************************************/
24767754Smsmith
24867754Smsmithvoid
24967754SmsmithAcpiDbDisplayTableInfo (
250114237Snjl    char                    *TableArg)
25167754Smsmith{
252193267Sjkim    UINT32                  i;
253117521Snjl    ACPI_TABLE_DESC         *TableDesc;
254193267Sjkim    ACPI_STATUS             Status;
25567754Smsmith
25667754Smsmith
257238381Sjkim    /* Header */
258238381Sjkim
259238381Sjkim    AcpiOsPrintf ("Idx ID Status    Type            Sig  Address  Len   Header\n");
260238381Sjkim
261193267Sjkim    /* Walk the entire root table list */
262193267Sjkim
263207344Sjkim    for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
26467754Smsmith    {
265167802Sjkim        TableDesc = &AcpiGbl_RootTableList.Tables[i];
266167802Sjkim
267238381Sjkim        /* Index and Table ID */
268238381Sjkim
269238381Sjkim        AcpiOsPrintf ("%3u %.2u ", i, TableDesc->OwnerId);
270238381Sjkim
271238381Sjkim        /* Decode the table flags */
272238381Sjkim
273238381Sjkim        if (!(TableDesc->Flags & ACPI_TABLE_IS_LOADED))
274238381Sjkim        {
275238381Sjkim            AcpiOsPrintf ("NotLoaded ");
276238381Sjkim        }
277238381Sjkim        else
278238381Sjkim        {
279238381Sjkim            AcpiOsPrintf ("   Loaded ");
280238381Sjkim        }
281238381Sjkim
282238381Sjkim        switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
283238381Sjkim        {
284238381Sjkim        case ACPI_TABLE_ORIGIN_UNKNOWN:
285238381Sjkim            AcpiOsPrintf ("Unknown   ");
286238381Sjkim            break;
287238381Sjkim
288238381Sjkim        case ACPI_TABLE_ORIGIN_MAPPED:
289238381Sjkim            AcpiOsPrintf ("Mapped    ");
290238381Sjkim            break;
291238381Sjkim
292238381Sjkim        case ACPI_TABLE_ORIGIN_ALLOCATED:
293238381Sjkim            AcpiOsPrintf ("Allocated ");
294238381Sjkim            break;
295238381Sjkim
296238381Sjkim        case ACPI_TABLE_ORIGIN_OVERRIDE:
297238381Sjkim            AcpiOsPrintf ("Override  ");
298238381Sjkim            break;
299238381Sjkim
300238381Sjkim        default:
301238381Sjkim            AcpiOsPrintf ("INVALID   ");
302238381Sjkim            break;
303238381Sjkim        }
304238381Sjkim
305193267Sjkim        /* Make sure that the table is mapped */
306193267Sjkim
307193267Sjkim        Status = AcpiTbVerifyTable (TableDesc);
308193267Sjkim        if (ACPI_FAILURE (Status))
30967754Smsmith        {
310193267Sjkim            return;
31167754Smsmith        }
312193267Sjkim
313193267Sjkim        /* Dump the table header */
314193267Sjkim
315193267Sjkim        if (TableDesc->Pointer)
316193267Sjkim        {
317193267Sjkim            AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer);
318193267Sjkim        }
319193267Sjkim        else
320193267Sjkim        {
321193267Sjkim            /* If the pointer is null, the table has been unloaded */
322193267Sjkim
323193267Sjkim            ACPI_INFO ((AE_INFO, "%4.4s - Table has been unloaded",
324193267Sjkim                TableDesc->Signature.Ascii));
325193267Sjkim        }
32667754Smsmith    }
32767754Smsmith}
32867754Smsmith
32967754Smsmith
33067754Smsmith/*******************************************************************************
33167754Smsmith *
33267754Smsmith * FUNCTION:    AcpiDbUnloadAcpiTable
33367754Smsmith *
334238381Sjkim * PARAMETERS:  ObjectName          - Namespace pathname for an object that
335238381Sjkim *                                    is owned by the table to be unloaded
33667754Smsmith *
337238381Sjkim * RETURN:      None
33867754Smsmith *
339238381Sjkim * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned
340238381Sjkim *              by the table.
34167754Smsmith *
34267754Smsmith ******************************************************************************/
34367754Smsmith
34467754Smsmithvoid
34567754SmsmithAcpiDbUnloadAcpiTable (
346238381Sjkim    char                    *ObjectName)
34767754Smsmith{
348238381Sjkim    ACPI_NAMESPACE_NODE     *Node;
34967754Smsmith    ACPI_STATUS             Status;
35067754Smsmith
35167754Smsmith
352238381Sjkim    /* Translate name to an Named object */
35367754Smsmith
354238381Sjkim    Node = AcpiDbConvertToNode (ObjectName);
355238381Sjkim    if (!Node)
35667754Smsmith    {
357238381Sjkim        AcpiOsPrintf ("Could not find [%s] in namespace\n",
358238381Sjkim            ObjectName);
359238381Sjkim        return;
360238381Sjkim    }
36167754Smsmith
362238381Sjkim    Status = AcpiUnloadParentTable (ACPI_CAST_PTR (ACPI_HANDLE, Node));
363238381Sjkim    if (ACPI_SUCCESS (Status))
364238381Sjkim    {
365238381Sjkim        AcpiOsPrintf ("Parent of [%s] (%p) unloaded and uninstalled\n",
366238381Sjkim            ObjectName, Node);
36767754Smsmith    }
368238381Sjkim    else
369238381Sjkim    {
370238381Sjkim        AcpiOsPrintf ("%s, while unloading parent table of [%s]\n",
371238381Sjkim            AcpiFormatException (Status), ObjectName);
372238381Sjkim    }
37367754Smsmith}
37467754Smsmith
37567754Smsmith
37667754Smsmith/*******************************************************************************
37767754Smsmith *
37867754Smsmith * FUNCTION:    AcpiDbSendNotify
37967754Smsmith *
38067754Smsmith * PARAMETERS:  Name            - Name of ACPI object to send the notify to
38167754Smsmith *              Value           - Value of the notify to send.
38267754Smsmith *
38367754Smsmith * RETURN:      None
38467754Smsmith *
385241973Sjkim * DESCRIPTION: Send an ACPI notification. The value specified is sent to the
38667754Smsmith *              named object as an ACPI notify.
38767754Smsmith *
38867754Smsmith ******************************************************************************/
38967754Smsmith
39067754Smsmithvoid
39167754SmsmithAcpiDbSendNotify (
392114237Snjl    char                    *Name,
39367754Smsmith    UINT32                  Value)
39467754Smsmith{
39567754Smsmith    ACPI_NAMESPACE_NODE     *Node;
39699679Siwasaki    ACPI_STATUS             Status;
39767754Smsmith
39867754Smsmith
39967754Smsmith    /* Translate name to an Named object */
40067754Smsmith
401151937Sjkim    Node = AcpiDbConvertToNode (Name);
40267754Smsmith    if (!Node)
40367754Smsmith    {
40467754Smsmith        return;
40567754Smsmith    }
40667754Smsmith
407234623Sjkim    /* Dispatch the notify if legal */
40867754Smsmith
409234623Sjkim    if (AcpiEvIsNotifyObject (Node))
41067754Smsmith    {
41199679Siwasaki        Status = AcpiEvQueueNotifyRequest (Node, Value);
41299679Siwasaki        if (ACPI_FAILURE (Status))
41399679Siwasaki        {
41499679Siwasaki            AcpiOsPrintf ("Could not queue notify\n");
41599679Siwasaki        }
41667754Smsmith    }
417234623Sjkim    else
418234623Sjkim    {
419234623Sjkim        AcpiOsPrintf ("Named object [%4.4s] Type %s, must be Device/Thermal/Processor type\n",
420234623Sjkim            AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type));
421234623Sjkim    }
42267754Smsmith}
42367754Smsmith
42467754Smsmith
42567754Smsmith/*******************************************************************************
42667754Smsmith *
427210976Sjkim * FUNCTION:    AcpiDbDisplayInterfaces
428210976Sjkim *
429210976Sjkim * PARAMETERS:  ActionArg           - Null, "install", or "remove"
430210976Sjkim *              InterfaceNameArg    - Name for install/remove options
431210976Sjkim *
432210976Sjkim * RETURN:      None
433210976Sjkim *
434210976Sjkim * DESCRIPTION: Display or modify the global _OSI interface list
435210976Sjkim *
436210976Sjkim ******************************************************************************/
437210976Sjkim
438210976Sjkimvoid
439210976SjkimAcpiDbDisplayInterfaces (
440210976Sjkim    char                    *ActionArg,
441210976Sjkim    char                    *InterfaceNameArg)
442210976Sjkim{
443210976Sjkim    ACPI_INTERFACE_INFO     *NextInterface;
444210976Sjkim    char                    *SubString;
445210976Sjkim    ACPI_STATUS             Status;
446210976Sjkim
447210976Sjkim
448210976Sjkim    /* If no arguments, just display current interface list */
449210976Sjkim
450210976Sjkim    if (!ActionArg)
451210976Sjkim    {
452210976Sjkim        (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex,
453210976Sjkim                    ACPI_WAIT_FOREVER);
454210976Sjkim
455210976Sjkim        NextInterface = AcpiGbl_SupportedInterfaces;
456210976Sjkim
457210976Sjkim        while (NextInterface)
458210976Sjkim        {
459210976Sjkim            if (!(NextInterface->Flags & ACPI_OSI_INVALID))
460210976Sjkim            {
461210976Sjkim                AcpiOsPrintf ("%s\n", NextInterface->Name);
462210976Sjkim            }
463210976Sjkim            NextInterface = NextInterface->Next;
464210976Sjkim        }
465210976Sjkim
466210976Sjkim        AcpiOsReleaseMutex (AcpiGbl_OsiMutex);
467210976Sjkim        return;
468210976Sjkim    }
469210976Sjkim
470210976Sjkim    /* If ActionArg exists, so must InterfaceNameArg */
471210976Sjkim
472210976Sjkim    if (!InterfaceNameArg)
473210976Sjkim    {
474210976Sjkim        AcpiOsPrintf ("Missing Interface Name argument\n");
475210976Sjkim        return;
476210976Sjkim    }
477210976Sjkim
478210976Sjkim    /* Uppercase the action for match below */
479210976Sjkim
480210976Sjkim    AcpiUtStrupr (ActionArg);
481210976Sjkim
482210976Sjkim    /* Install - install an interface */
483210976Sjkim
484210976Sjkim    SubString = ACPI_STRSTR ("INSTALL", ActionArg);
485210976Sjkim    if (SubString)
486210976Sjkim    {
487210976Sjkim        Status = AcpiInstallInterface (InterfaceNameArg);
488210976Sjkim        if (ACPI_FAILURE (Status))
489210976Sjkim        {
490210976Sjkim            AcpiOsPrintf ("%s, while installing \"%s\"\n",
491210976Sjkim                AcpiFormatException (Status), InterfaceNameArg);
492210976Sjkim        }
493210976Sjkim        return;
494210976Sjkim    }
495210976Sjkim
496210976Sjkim    /* Remove - remove an interface */
497210976Sjkim
498210976Sjkim    SubString = ACPI_STRSTR ("REMOVE", ActionArg);
499210976Sjkim    if (SubString)
500210976Sjkim    {
501210976Sjkim        Status = AcpiRemoveInterface (InterfaceNameArg);
502210976Sjkim        if (ACPI_FAILURE (Status))
503210976Sjkim        {
504210976Sjkim            AcpiOsPrintf ("%s, while removing \"%s\"\n",
505210976Sjkim                AcpiFormatException (Status), InterfaceNameArg);
506210976Sjkim        }
507210976Sjkim        return;
508210976Sjkim    }
509210976Sjkim
510210976Sjkim    /* Invalid ActionArg */
511210976Sjkim
512210976Sjkim    AcpiOsPrintf ("Invalid action argument: %s\n", ActionArg);
513210976Sjkim    return;
514210976Sjkim}
515210976Sjkim
516210976Sjkim
517210976Sjkim/*******************************************************************************
518210976Sjkim *
519228110Sjkim * FUNCTION:    AcpiDbDisplayTemplate
520228110Sjkim *
521228110Sjkim * PARAMETERS:  BufferArg           - Buffer name or addrss
522228110Sjkim *
523228110Sjkim * RETURN:      None
524228110Sjkim *
525228110Sjkim * DESCRIPTION: Dump a buffer that contains a resource template
526228110Sjkim *
527228110Sjkim ******************************************************************************/
528228110Sjkim
529228110Sjkimvoid
530228110SjkimAcpiDbDisplayTemplate (
531228110Sjkim    char                    *BufferArg)
532228110Sjkim{
533228110Sjkim    ACPI_NAMESPACE_NODE     *Node;
534228110Sjkim    ACPI_STATUS             Status;
535228110Sjkim    ACPI_BUFFER             ReturnObj;
536228110Sjkim
537228110Sjkim
538228110Sjkim    /* Translate BufferArg to an Named object */
539228110Sjkim
540228110Sjkim    Node = AcpiDbConvertToNode (BufferArg);
541228110Sjkim    if (!Node || (Node == AcpiGbl_RootNode))
542228110Sjkim    {
543228110Sjkim        AcpiOsPrintf ("Invalid argument: %s\n", BufferArg);
544228110Sjkim        return;
545228110Sjkim    }
546228110Sjkim
547228110Sjkim    /* We must have a buffer object */
548228110Sjkim
549228110Sjkim    if (Node->Type != ACPI_TYPE_BUFFER)
550228110Sjkim    {
551228110Sjkim        AcpiOsPrintf ("Not a Buffer object, cannot be a template: %s\n",
552228110Sjkim            BufferArg);
553228110Sjkim        return;
554228110Sjkim    }
555228110Sjkim
556228110Sjkim    ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE;
557228110Sjkim    ReturnObj.Pointer = AcpiGbl_DbBuffer;
558228110Sjkim
559228110Sjkim    /* Attempt to convert the raw buffer to a resource list */
560228110Sjkim
561228110Sjkim    Status = AcpiRsCreateResourceList (Node->Object, &ReturnObj);
562228110Sjkim
563228110Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
564228110Sjkim    AcpiDbgLevel |= ACPI_LV_RESOURCES;
565228110Sjkim
566228110Sjkim    if (ACPI_FAILURE (Status))
567228110Sjkim    {
568228110Sjkim        AcpiOsPrintf ("Could not convert Buffer to a resource list: %s, %s\n",
569228110Sjkim            BufferArg, AcpiFormatException (Status));
570228110Sjkim        goto DumpBuffer;
571228110Sjkim    }
572228110Sjkim
573228110Sjkim    /* Now we can dump the resource list */
574228110Sjkim
575228110Sjkim    AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
576228110Sjkim        ReturnObj.Pointer));
577228110Sjkim
578228110SjkimDumpBuffer:
579228110Sjkim    AcpiOsPrintf ("\nRaw data buffer:\n");
580241973Sjkim    AcpiUtDebugDumpBuffer ((UINT8 *) Node->Object->Buffer.Pointer,
581228110Sjkim        Node->Object->Buffer.Length,
582228110Sjkim        DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
583228110Sjkim
584228110Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
585228110Sjkim    return;
586228110Sjkim}
587228110Sjkim
588228110Sjkim
589228110Sjkim/*******************************************************************************
590228110Sjkim *
591151937Sjkim * FUNCTION:    AcpiDmCompareAmlResources
592151937Sjkim *
593151937Sjkim * PARAMETERS:  Aml1Buffer          - Contains first resource list
594151937Sjkim *              Aml1BufferLength    - Length of first resource list
595151937Sjkim *              Aml2Buffer          - Contains second resource list
596151937Sjkim *              Aml2BufferLength    - Length of second resource list
597151937Sjkim *
598151937Sjkim * RETURN:      None
599151937Sjkim *
600151937Sjkim * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in
601151937Sjkim *              order to isolate a miscompare to an individual resource)
602151937Sjkim *
603151937Sjkim ******************************************************************************/
604151937Sjkim
605151937Sjkimstatic void
606151937SjkimAcpiDmCompareAmlResources (
607151937Sjkim    UINT8                   *Aml1Buffer,
608151937Sjkim    ACPI_RSDESC_SIZE        Aml1BufferLength,
609151937Sjkim    UINT8                   *Aml2Buffer,
610151937Sjkim    ACPI_RSDESC_SIZE        Aml2BufferLength)
611151937Sjkim{
612151937Sjkim    UINT8                   *Aml1;
613151937Sjkim    UINT8                   *Aml2;
614228110Sjkim    UINT8                   *Aml1End;
615228110Sjkim    UINT8                   *Aml2End;
616151937Sjkim    ACPI_RSDESC_SIZE        Aml1Length;
617151937Sjkim    ACPI_RSDESC_SIZE        Aml2Length;
618151937Sjkim    ACPI_RSDESC_SIZE        Offset = 0;
619151937Sjkim    UINT8                   ResourceType;
620151937Sjkim    UINT32                  Count = 0;
621228110Sjkim    UINT32                  i;
622151937Sjkim
623151937Sjkim
624151937Sjkim    /* Compare overall buffer sizes (may be different due to size rounding) */
625151937Sjkim
626151937Sjkim    if (Aml1BufferLength != Aml2BufferLength)
627151937Sjkim    {
628151937Sjkim        AcpiOsPrintf (
629228110Sjkim            "**** Buffer length mismatch in converted AML: Original %X, New %X ****\n",
630151937Sjkim            Aml1BufferLength, Aml2BufferLength);
631151937Sjkim    }
632151937Sjkim
633151937Sjkim    Aml1 = Aml1Buffer;
634151937Sjkim    Aml2 = Aml2Buffer;
635228110Sjkim    Aml1End = Aml1Buffer + Aml1BufferLength;
636228110Sjkim    Aml2End = Aml2Buffer + Aml2BufferLength;
637151937Sjkim
638151937Sjkim    /* Walk the descriptor lists, comparing each descriptor */
639151937Sjkim
640228110Sjkim    while ((Aml1 < Aml1End) && (Aml2 < Aml2End))
641151937Sjkim    {
642151937Sjkim        /* Get the lengths of each descriptor */
643151937Sjkim
644151937Sjkim        Aml1Length = AcpiUtGetDescriptorLength (Aml1);
645151937Sjkim        Aml2Length = AcpiUtGetDescriptorLength (Aml2);
646151937Sjkim        ResourceType = AcpiUtGetResourceType (Aml1);
647151937Sjkim
648151937Sjkim        /* Check for descriptor length match */
649151937Sjkim
650151937Sjkim        if (Aml1Length != Aml2Length)
651151937Sjkim        {
652151937Sjkim            AcpiOsPrintf (
653228110Sjkim                "**** Length mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X Len1 %X, Len2 %X ****\n",
654151937Sjkim                Count, ResourceType, Offset, Aml1Length, Aml2Length);
655151937Sjkim        }
656151937Sjkim
657151937Sjkim        /* Check for descriptor byte match */
658151937Sjkim
659167802Sjkim        else if (ACPI_MEMCMP (Aml1, Aml2, Aml1Length))
660151937Sjkim        {
661151937Sjkim            AcpiOsPrintf (
662151937Sjkim                "**** Data mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X ****\n",
663151937Sjkim                Count, ResourceType, Offset);
664228110Sjkim
665228110Sjkim            for (i = 0; i < Aml1Length; i++)
666228110Sjkim            {
667228110Sjkim                if (Aml1[i] != Aml2[i])
668228110Sjkim                {
669228110Sjkim                    AcpiOsPrintf ("Mismatch at byte offset %.2X: is %2.2X, should be %2.2X\n",
670228110Sjkim                        i, Aml2[i], Aml1[i]);
671228110Sjkim                }
672228110Sjkim            }
673151937Sjkim        }
674151937Sjkim
675151937Sjkim        /* Exit on EndTag descriptor */
676151937Sjkim
677151937Sjkim        if (ResourceType == ACPI_RESOURCE_NAME_END_TAG)
678151937Sjkim        {
679151937Sjkim            return;
680151937Sjkim        }
681151937Sjkim
682151937Sjkim        /* Point to next descriptor in each buffer */
683151937Sjkim
684151937Sjkim        Count++;
685151937Sjkim        Offset += Aml1Length;
686151937Sjkim        Aml1 += Aml1Length;
687167802Sjkim        Aml2 += Aml2Length;
688151937Sjkim    }
689151937Sjkim}
690151937Sjkim
691151937Sjkim
692151937Sjkim/*******************************************************************************
693151937Sjkim *
694151937Sjkim * FUNCTION:    AcpiDmTestResourceConversion
695151937Sjkim *
696151937Sjkim * PARAMETERS:  Node            - Parent device node
697151937Sjkim *              Name            - resource method name (_CRS)
698151937Sjkim *
699151937Sjkim * RETURN:      Status
700151937Sjkim *
701151937Sjkim * DESCRIPTION: Compare the original AML with a conversion of the AML to
702151937Sjkim *              internal resource list, then back to AML.
703151937Sjkim *
704151937Sjkim ******************************************************************************/
705151937Sjkim
706151937Sjkimstatic ACPI_STATUS
707151937SjkimAcpiDmTestResourceConversion (
708151937Sjkim    ACPI_NAMESPACE_NODE     *Node,
709151937Sjkim    char                    *Name)
710151937Sjkim{
711151937Sjkim    ACPI_STATUS             Status;
712151937Sjkim    ACPI_BUFFER             ReturnObj;
713151937Sjkim    ACPI_BUFFER             ResourceObj;
714151937Sjkim    ACPI_BUFFER             NewAml;
715151937Sjkim    ACPI_OBJECT             *OriginalAml;
716151937Sjkim
717151937Sjkim
718151937Sjkim    AcpiOsPrintf ("Resource Conversion Comparison:\n");
719151937Sjkim
720151937Sjkim    NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
721151937Sjkim    ReturnObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
722151937Sjkim    ResourceObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
723151937Sjkim
724151937Sjkim    /* Get the original _CRS AML resource template */
725151937Sjkim
726151937Sjkim    Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnObj);
727151937Sjkim    if (ACPI_FAILURE (Status))
728151937Sjkim    {
729151937Sjkim        AcpiOsPrintf ("Could not obtain %s: %s\n",
730151937Sjkim            Name, AcpiFormatException (Status));
731151937Sjkim        return (Status);
732151937Sjkim    }
733151937Sjkim
734151937Sjkim    /* Get the AML resource template, converted to internal resource structs */
735151937Sjkim
736151937Sjkim    Status = AcpiGetCurrentResources (Node, &ResourceObj);
737151937Sjkim    if (ACPI_FAILURE (Status))
738151937Sjkim    {
739151937Sjkim        AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
740151937Sjkim            AcpiFormatException (Status));
741151937Sjkim        goto Exit1;
742151937Sjkim    }
743151937Sjkim
744151937Sjkim    /* Convert internal resource list to external AML resource template */
745151937Sjkim
746151937Sjkim    Status = AcpiRsCreateAmlResources (ResourceObj.Pointer, &NewAml);
747151937Sjkim    if (ACPI_FAILURE (Status))
748151937Sjkim    {
749151937Sjkim        AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n",
750151937Sjkim            AcpiFormatException (Status));
751151937Sjkim        goto Exit2;
752151937Sjkim    }
753151937Sjkim
754151937Sjkim    /* Compare original AML to the newly created AML resource list */
755151937Sjkim
756151937Sjkim    OriginalAml = ReturnObj.Pointer;
757151937Sjkim
758151937Sjkim    AcpiDmCompareAmlResources (
759193267Sjkim        OriginalAml->Buffer.Pointer, (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length,
760193267Sjkim        NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length);
761151937Sjkim
762151937Sjkim    /* Cleanup and exit */
763151937Sjkim
764167802Sjkim    ACPI_FREE (NewAml.Pointer);
765151937SjkimExit2:
766167802Sjkim    ACPI_FREE (ResourceObj.Pointer);
767151937SjkimExit1:
768167802Sjkim    ACPI_FREE (ReturnObj.Pointer);
769151937Sjkim    return (Status);
770151937Sjkim}
771151937Sjkim
772151937Sjkim
773151937Sjkim/*******************************************************************************
774151937Sjkim *
775228110Sjkim * FUNCTION:    AcpiDbResourceCallback
77673561Smsmith *
777228110Sjkim * PARAMETERS:  ACPI_WALK_RESOURCE_CALLBACK
77873561Smsmith *
779228110Sjkim * RETURN:      Status
78073561Smsmith *
781228110Sjkim * DESCRIPTION: Simple callback to exercise AcpiWalkResources
78273561Smsmith *
78373561Smsmith ******************************************************************************/
78473561Smsmith
785228110Sjkimstatic ACPI_STATUS
786228110SjkimAcpiDbResourceCallback (
787228110Sjkim    ACPI_RESOURCE           *Resource,
788228110Sjkim    void                    *Context)
78973561Smsmith{
790228110Sjkim
791228110Sjkim    return (AE_OK);
792228110Sjkim}
793228110Sjkim
794228110Sjkim
795228110Sjkim/*******************************************************************************
796228110Sjkim *
797228110Sjkim * FUNCTION:    AcpiDbDeviceResources
798228110Sjkim *
799228110Sjkim * PARAMETERS:  ACPI_WALK_CALLBACK
800228110Sjkim *
801228110Sjkim * RETURN:      Status
802228110Sjkim *
803228110Sjkim * DESCRIPTION: Display the _PRT/_CRS/_PRS resources for a device object.
804228110Sjkim *
805228110Sjkim ******************************************************************************/
806228110Sjkim
807228110Sjkimstatic ACPI_STATUS
808228110SjkimAcpiDbDeviceResources (
809228110Sjkim    ACPI_HANDLE             ObjHandle,
810228110Sjkim    UINT32                  NestingLevel,
811228110Sjkim    void                    *Context,
812228110Sjkim    void                    **ReturnValue)
813228110Sjkim{
814151937Sjkim    ACPI_NAMESPACE_NODE     *Node;
815228110Sjkim    ACPI_NAMESPACE_NODE     *PrtNode = NULL;
816228110Sjkim    ACPI_NAMESPACE_NODE     *CrsNode = NULL;
817228110Sjkim    ACPI_NAMESPACE_NODE     *PrsNode = NULL;
818228110Sjkim    ACPI_NAMESPACE_NODE     *AeiNode = NULL;
819228110Sjkim    char                    *ParentPath;
820228110Sjkim    ACPI_BUFFER             ReturnObj;
82173561Smsmith    ACPI_STATUS             Status;
82273561Smsmith
82373561Smsmith
824228110Sjkim    Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
825228110Sjkim    ParentPath = AcpiNsGetExternalPathname (Node);
826228110Sjkim    if (!ParentPath)
827228110Sjkim    {
828228110Sjkim        return (AE_NO_MEMORY);
829228110Sjkim    }
83073561Smsmith
831228110Sjkim    /* Get handles to the resource methods for this device */
83273561Smsmith
833228110Sjkim    (void) AcpiGetHandle (Node, METHOD_NAME__PRT, ACPI_CAST_PTR (ACPI_HANDLE, &PrtNode));
834228110Sjkim    (void) AcpiGetHandle (Node, METHOD_NAME__CRS, ACPI_CAST_PTR (ACPI_HANDLE, &CrsNode));
835228110Sjkim    (void) AcpiGetHandle (Node, METHOD_NAME__PRS, ACPI_CAST_PTR (ACPI_HANDLE, &PrsNode));
836228110Sjkim    (void) AcpiGetHandle (Node, METHOD_NAME__AEI, ACPI_CAST_PTR (ACPI_HANDLE, &AeiNode));
837228110Sjkim    if (!PrtNode && !CrsNode && !PrsNode && !AeiNode)
838151937Sjkim    {
839228110Sjkim        goto Cleanup;   /* Nothing to do */
840151937Sjkim    }
84173561Smsmith
842228110Sjkim    AcpiOsPrintf ("\nDevice: %s\n", ParentPath);
843228110Sjkim
84473561Smsmith    /* Prepare for a return object of arbitrary size */
84573561Smsmith
846151937Sjkim    ReturnObj.Pointer = AcpiGbl_DbBuffer;
847151937Sjkim    ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
84873561Smsmith
849228110Sjkim
85077424Smsmith    /* _PRT */
85177424Smsmith
852228110Sjkim    if (PrtNode)
853228110Sjkim    {
854228110Sjkim        AcpiOsPrintf ("Evaluating _PRT\n");
85577424Smsmith
856228110Sjkim        Status = AcpiEvaluateObject (PrtNode, NULL, NULL, &ReturnObj);
857228110Sjkim        if (ACPI_FAILURE (Status))
858228110Sjkim        {
859228110Sjkim            AcpiOsPrintf ("Could not evaluate _PRT: %s\n",
860228110Sjkim                AcpiFormatException (Status));
861228110Sjkim            goto GetCrs;
862228110Sjkim        }
863151937Sjkim
864228110Sjkim        ReturnObj.Pointer = AcpiGbl_DbBuffer;
865228110Sjkim        ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
86673561Smsmith
867228110Sjkim        Status = AcpiGetIrqRoutingTable (Node, &ReturnObj);
868228110Sjkim        if (ACPI_FAILURE (Status))
869228110Sjkim        {
870228110Sjkim            AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n",
871228110Sjkim                AcpiFormatException (Status));
872228110Sjkim            goto GetCrs;
873228110Sjkim        }
87473561Smsmith
875228110Sjkim        AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer));
87677424Smsmith    }
87777424Smsmith
87877424Smsmith
87977424Smsmith    /* _CRS */
88083174Smsmith
88183174SmsmithGetCrs:
882228110Sjkim    if (CrsNode)
883228110Sjkim    {
884228110Sjkim        AcpiOsPrintf ("Evaluating _CRS\n");
88577424Smsmith
886228110Sjkim        ReturnObj.Pointer = AcpiGbl_DbBuffer;
887228110Sjkim        ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
88877424Smsmith
889228110Sjkim        Status = AcpiEvaluateObject (CrsNode, NULL, NULL, &ReturnObj);
890228110Sjkim        if (ACPI_FAILURE (Status))
891228110Sjkim        {
892228110Sjkim            AcpiOsPrintf ("Could not evaluate _CRS: %s\n",
893228110Sjkim                AcpiFormatException (Status));
894228110Sjkim            goto GetPrs;
895228110Sjkim        }
896151937Sjkim
897228110Sjkim        /* This code is here to exercise the AcpiWalkResources interface */
89877424Smsmith
899228110Sjkim        Status = AcpiWalkResources (Node, METHOD_NAME__CRS,
900228110Sjkim            AcpiDbResourceCallback, NULL);
901228110Sjkim        if (ACPI_FAILURE (Status))
902228110Sjkim        {
903228110Sjkim            AcpiOsPrintf ("AcpiWalkResources failed: %s\n",
904228110Sjkim                AcpiFormatException (Status));
905228110Sjkim            goto GetPrs;
906228110Sjkim        }
90777424Smsmith
908228110Sjkim        /* Get the _CRS resource list */
909151937Sjkim
910228110Sjkim        ReturnObj.Pointer = AcpiGbl_DbBuffer;
911228110Sjkim        ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
91277424Smsmith
913228110Sjkim        Status = AcpiGetCurrentResources (Node, &ReturnObj);
914228110Sjkim        if (ACPI_FAILURE (Status))
915228110Sjkim        {
916228110Sjkim            AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
917228110Sjkim                AcpiFormatException (Status));
918228110Sjkim            goto GetPrs;
919228110Sjkim        }
920151937Sjkim
921228110Sjkim        /* Dump the _CRS resource list */
922151937Sjkim
923228110Sjkim        AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
924228110Sjkim            ReturnObj.Pointer));
925151937Sjkim
926228110Sjkim        /*
927228110Sjkim         * Perform comparison of original AML to newly created AML. This tests both
928228110Sjkim         * the AML->Resource conversion and the Resource->Aml conversion.
929228110Sjkim         */
930228110Sjkim        Status = AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS);
931151937Sjkim
932228110Sjkim        /* Execute _SRS with the resource list */
933228110Sjkim
934228110Sjkim        Status = AcpiSetCurrentResources (Node, &ReturnObj);
935228110Sjkim        if (ACPI_FAILURE (Status))
936228110Sjkim        {
937228110Sjkim            AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n",
938228110Sjkim                AcpiFormatException (Status));
939228110Sjkim            goto GetPrs;
940228110Sjkim        }
94191116Smsmith    }
94283174Smsmith
94391116Smsmith
94477424Smsmith    /* _PRS */
94583174Smsmith
94683174SmsmithGetPrs:
947228110Sjkim    if (PrsNode)
948228110Sjkim    {
949228110Sjkim        AcpiOsPrintf ("Evaluating _PRS\n");
95077424Smsmith
951228110Sjkim        ReturnObj.Pointer = AcpiGbl_DbBuffer;
952228110Sjkim        ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
95377424Smsmith
954228110Sjkim        Status = AcpiEvaluateObject (PrsNode, NULL, NULL, &ReturnObj);
955228110Sjkim        if (ACPI_FAILURE (Status))
956228110Sjkim        {
957228110Sjkim            AcpiOsPrintf ("Could not evaluate _PRS: %s\n",
958228110Sjkim                AcpiFormatException (Status));
959228110Sjkim            goto GetAei;
960228110Sjkim        }
961151937Sjkim
962228110Sjkim        ReturnObj.Pointer = AcpiGbl_DbBuffer;
963228110Sjkim        ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
964228110Sjkim
965228110Sjkim        Status = AcpiGetPossibleResources (Node, &ReturnObj);
966228110Sjkim        if (ACPI_FAILURE (Status))
967228110Sjkim        {
968228110Sjkim            AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n",
969228110Sjkim                AcpiFormatException (Status));
970228110Sjkim            goto GetAei;
971228110Sjkim        }
972228110Sjkim
973228110Sjkim        AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer));
97473561Smsmith    }
97573561Smsmith
97677424Smsmith
977228110Sjkim    /* _AEI */
978228110Sjkim
979228110SjkimGetAei:
980228110Sjkim    if (AeiNode)
98173561Smsmith    {
982228110Sjkim        AcpiOsPrintf ("Evaluating _AEI\n");
983228110Sjkim
984228110Sjkim        ReturnObj.Pointer = AcpiGbl_DbBuffer;
985228110Sjkim        ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
986228110Sjkim
987228110Sjkim        Status = AcpiEvaluateObject (AeiNode, NULL, NULL, &ReturnObj);
988228110Sjkim        if (ACPI_FAILURE (Status))
989228110Sjkim        {
990228110Sjkim            AcpiOsPrintf ("Could not evaluate _AEI: %s\n",
991228110Sjkim                AcpiFormatException (Status));
992228110Sjkim            goto Cleanup;
993228110Sjkim        }
994228110Sjkim
995228110Sjkim        ReturnObj.Pointer = AcpiGbl_DbBuffer;
996228110Sjkim        ReturnObj.Length  = ACPI_DEBUG_BUFFER_SIZE;
997228110Sjkim
998228110Sjkim        Status = AcpiGetEventResources (Node, &ReturnObj);
999228110Sjkim        if (ACPI_FAILURE (Status))
1000228110Sjkim        {
1001228110Sjkim            AcpiOsPrintf ("AcpiGetEventResources failed: %s\n",
1002228110Sjkim                AcpiFormatException (Status));
1003228110Sjkim            goto Cleanup;
1004228110Sjkim        }
1005228110Sjkim
1006228110Sjkim        AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer));
100773561Smsmith    }
100877424Smsmith
1009151937Sjkim
101073561SmsmithCleanup:
1011228110Sjkim    ACPI_FREE (ParentPath);
1012228110Sjkim    return (AE_OK);
1013228110Sjkim}
101473561Smsmith
1015228110Sjkim
1016228110Sjkim/*******************************************************************************
1017228110Sjkim *
1018228110Sjkim * FUNCTION:    AcpiDbDisplayResources
1019228110Sjkim *
1020228110Sjkim * PARAMETERS:  ObjectArg       - String object name or object pointer.
1021228110Sjkim *                                "*" means "display resources for all devices"
1022228110Sjkim *
1023228110Sjkim * RETURN:      None
1024228110Sjkim *
1025228110Sjkim * DESCRIPTION: Display the resource objects associated with a device.
1026228110Sjkim *
1027228110Sjkim ******************************************************************************/
1028228110Sjkim
1029228110Sjkimvoid
1030228110SjkimAcpiDbDisplayResources (
1031228110Sjkim    char                    *ObjectArg)
1032228110Sjkim{
1033228110Sjkim    ACPI_NAMESPACE_NODE     *Node;
1034228110Sjkim
1035228110Sjkim
1036228110Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
1037228110Sjkim    AcpiDbgLevel |= ACPI_LV_RESOURCES;
1038228110Sjkim
1039228110Sjkim    /* Asterisk means "display resources for all devices" */
1040228110Sjkim
1041228110Sjkim    if (!ACPI_STRCMP (ObjectArg, "*"))
1042228110Sjkim    {
1043228110Sjkim        (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
1044228110Sjkim                    ACPI_UINT32_MAX, AcpiDbDeviceResources, NULL, NULL, NULL);
1045228110Sjkim    }
1046228110Sjkim    else
1047228110Sjkim    {
1048228110Sjkim        /* Convert string to object pointer */
1049228110Sjkim
1050228110Sjkim        Node = AcpiDbConvertToNode (ObjectArg);
1051228110Sjkim        if (Node)
1052228110Sjkim        {
1053228110Sjkim            if (Node->Type != ACPI_TYPE_DEVICE)
1054228110Sjkim            {
1055228110Sjkim                AcpiOsPrintf ("%4.4s: Name is not a device object (%s)\n",
1056228110Sjkim                    Node->Name.Ascii, AcpiUtGetTypeName (Node->Type));
1057228110Sjkim            }
1058228110Sjkim            else
1059228110Sjkim            {
1060228110Sjkim                (void) AcpiDbDeviceResources (Node, 0, NULL, NULL);
1061228110Sjkim            }
1062228110Sjkim        }
1063228110Sjkim    }
1064228110Sjkim
106591116Smsmith    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
106673561Smsmith}
106773561Smsmith
106873561Smsmith
1069231844Sjkim#if (!ACPI_REDUCED_HARDWARE)
107099679Siwasaki/*******************************************************************************
107199679Siwasaki *
1072114237Snjl * FUNCTION:    AcpiDbGenerateGpe
1073114237Snjl *
1074151937Sjkim * PARAMETERS:  GpeArg          - Raw GPE number, ascii string
1075151937Sjkim *              BlockArg        - GPE block number, ascii string
1076151937Sjkim *                                0 or 1 for FADT GPE blocks
1077114237Snjl *
1078114237Snjl * RETURN:      None
1079114237Snjl *
1080114237Snjl * DESCRIPTION: Generate a GPE
1081114237Snjl *
1082114237Snjl ******************************************************************************/
1083114237Snjl
1084114237Snjlvoid
1085114237SnjlAcpiDbGenerateGpe (
1086114237Snjl    char                    *GpeArg,
1087114237Snjl    char                    *BlockArg)
1088114237Snjl{
1089114237Snjl    UINT32                  BlockNumber;
1090114237Snjl    UINT32                  GpeNumber;
1091114237Snjl    ACPI_GPE_EVENT_INFO     *GpeEventInfo;
1092114237Snjl
1093114237Snjl
1094117521Snjl    GpeNumber   = ACPI_STRTOUL (GpeArg, NULL, 0);
1095117521Snjl    BlockNumber = ACPI_STRTOUL (BlockArg, NULL, 0);
1096114237Snjl
1097114237Snjl
1098151937Sjkim    GpeEventInfo = AcpiEvGetGpeEventInfo (ACPI_TO_POINTER (BlockNumber),
1099151937Sjkim        GpeNumber);
1100114237Snjl    if (!GpeEventInfo)
1101114237Snjl    {
1102114237Snjl        AcpiOsPrintf ("Invalid GPE\n");
1103114237Snjl        return;
1104114237Snjl    }
1105114237Snjl
1106216471Sjkim    (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber);
1107114237Snjl}
1108231844Sjkim#endif /* !ACPI_REDUCED_HARDWARE */
1109114237Snjl
1110102550Siwasaki#endif /* ACPI_DEBUGGER */
1111