1218585Sjkim/*******************************************************************************
2218585Sjkim *
3218585Sjkim * Module Name: dbnames - Debugger commands for the acpi namespace
4218585Sjkim *
5218585Sjkim ******************************************************************************/
6218585Sjkim
7218585Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp.
9218585Sjkim * All rights reserved.
10218585Sjkim *
11218585Sjkim * Redistribution and use in source and binary forms, with or without
12218585Sjkim * modification, are permitted provided that the following conditions
13218585Sjkim * are met:
14218585Sjkim * 1. Redistributions of source code must retain the above copyright
15218585Sjkim *    notice, this list of conditions, and the following disclaimer,
16218585Sjkim *    without modification.
17218585Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18218585Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19218585Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20218585Sjkim *    including a substantially similar Disclaimer requirement for further
21218585Sjkim *    binary redistribution.
22218585Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23218585Sjkim *    of any contributors may be used to endorse or promote products derived
24218585Sjkim *    from this software without specific prior written permission.
25218585Sjkim *
26218585Sjkim * Alternatively, this software may be distributed under the terms of the
27218585Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28218585Sjkim * Software Foundation.
29218585Sjkim *
30218585Sjkim * NO WARRANTY
31218585Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32218585Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33218585Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34218585Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35218585Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36218585Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37218585Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38218585Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39218585Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40218585Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41218585Sjkim * POSSIBILITY OF SUCH DAMAGES.
42218585Sjkim */
43218585Sjkim
44218590Sjkim#include <contrib/dev/acpica/include/acpi.h>
45218590Sjkim#include <contrib/dev/acpica/include/accommon.h>
46218590Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
47218590Sjkim#include <contrib/dev/acpica/include/acdebug.h>
48249112Sjkim#include <contrib/dev/acpica/include/acpredef.h>
49218585Sjkim
50218585Sjkim
51218585Sjkim#define _COMPONENT          ACPI_CA_DEBUGGER
52218585Sjkim        ACPI_MODULE_NAME    ("dbnames")
53218585Sjkim
54218585Sjkim
55218585Sjkim/* Local prototypes */
56218585Sjkim
57218585Sjkimstatic ACPI_STATUS
58218585SjkimAcpiDbWalkAndMatchName (
59218585Sjkim    ACPI_HANDLE             ObjHandle,
60218585Sjkim    UINT32                  NestingLevel,
61218585Sjkim    void                    *Context,
62218585Sjkim    void                    **ReturnValue);
63218585Sjkim
64218585Sjkimstatic ACPI_STATUS
65218585SjkimAcpiDbWalkForPredefinedNames (
66218585Sjkim    ACPI_HANDLE             ObjHandle,
67218585Sjkim    UINT32                  NestingLevel,
68218585Sjkim    void                    *Context,
69218585Sjkim    void                    **ReturnValue);
70218585Sjkim
71218585Sjkimstatic ACPI_STATUS
72218585SjkimAcpiDbWalkForSpecificObjects (
73218585Sjkim    ACPI_HANDLE             ObjHandle,
74218585Sjkim    UINT32                  NestingLevel,
75218585Sjkim    void                    *Context,
76218585Sjkim    void                    **ReturnValue);
77218585Sjkim
78218585Sjkimstatic ACPI_STATUS
79306536SjkimAcpiDbWalkForObjectCounts (
80306536Sjkim    ACPI_HANDLE             ObjHandle,
81306536Sjkim    UINT32                  NestingLevel,
82306536Sjkim    void                    *Context,
83306536Sjkim    void                    **ReturnValue);
84306536Sjkim
85306536Sjkimstatic ACPI_STATUS
86218585SjkimAcpiDbIntegrityWalk (
87218585Sjkim    ACPI_HANDLE             ObjHandle,
88218585Sjkim    UINT32                  NestingLevel,
89218585Sjkim    void                    *Context,
90218585Sjkim    void                    **ReturnValue);
91218585Sjkim
92218585Sjkimstatic ACPI_STATUS
93218585SjkimAcpiDbWalkForReferences (
94218585Sjkim    ACPI_HANDLE             ObjHandle,
95218585Sjkim    UINT32                  NestingLevel,
96218585Sjkim    void                    *Context,
97218585Sjkim    void                    **ReturnValue);
98218585Sjkim
99218585Sjkimstatic ACPI_STATUS
100218585SjkimAcpiDbBusWalk (
101218585Sjkim    ACPI_HANDLE             ObjHandle,
102218585Sjkim    UINT32                  NestingLevel,
103218585Sjkim    void                    *Context,
104218585Sjkim    void                    **ReturnValue);
105218585Sjkim
106218585Sjkim/*
107218585Sjkim * Arguments for the Objects command
108218585Sjkim * These object types map directly to the ACPI_TYPES
109218585Sjkim */
110240716Sjkimstatic ACPI_DB_ARGUMENT_INFO    AcpiDbObjectTypes [] =
111218585Sjkim{
112218585Sjkim    {"ANY"},
113218585Sjkim    {"INTEGERS"},
114218585Sjkim    {"STRINGS"},
115218585Sjkim    {"BUFFERS"},
116218585Sjkim    {"PACKAGES"},
117218585Sjkim    {"FIELDS"},
118218585Sjkim    {"DEVICES"},
119218585Sjkim    {"EVENTS"},
120218585Sjkim    {"METHODS"},
121218585Sjkim    {"MUTEXES"},
122218585Sjkim    {"REGIONS"},
123218585Sjkim    {"POWERRESOURCES"},
124218585Sjkim    {"PROCESSORS"},
125218585Sjkim    {"THERMALZONES"},
126218585Sjkim    {"BUFFERFIELDS"},
127218585Sjkim    {"DDBHANDLES"},
128218585Sjkim    {"DEBUG"},
129218585Sjkim    {"REGIONFIELDS"},
130218585Sjkim    {"BANKFIELDS"},
131218585Sjkim    {"INDEXFIELDS"},
132218585Sjkim    {"REFERENCES"},
133306536Sjkim    {"ALIASES"},
134306536Sjkim    {"METHODALIASES"},
135306536Sjkim    {"NOTIFY"},
136306536Sjkim    {"ADDRESSHANDLER"},
137306536Sjkim    {"RESOURCE"},
138306536Sjkim    {"RESOURCEFIELD"},
139306536Sjkim    {"SCOPES"},
140218585Sjkim    {NULL}           /* Must be null terminated */
141218585Sjkim};
142218585Sjkim
143218585Sjkim
144218585Sjkim/*******************************************************************************
145218585Sjkim *
146218585Sjkim * FUNCTION:    AcpiDbSetScope
147218585Sjkim *
148218585Sjkim * PARAMETERS:  Name                - New scope path
149218585Sjkim *
150218585Sjkim * RETURN:      Status
151218585Sjkim *
152218585Sjkim * DESCRIPTION: Set the "current scope" as maintained by this utility.
153218585Sjkim *              The scope is used as a prefix to ACPI paths.
154218585Sjkim *
155218585Sjkim ******************************************************************************/
156218585Sjkim
157218585Sjkimvoid
158218585SjkimAcpiDbSetScope (
159218585Sjkim    char                    *Name)
160218585Sjkim{
161218585Sjkim    ACPI_STATUS             Status;
162218585Sjkim    ACPI_NAMESPACE_NODE     *Node;
163218585Sjkim
164218585Sjkim
165218585Sjkim    if (!Name || Name[0] == 0)
166218585Sjkim    {
167218585Sjkim        AcpiOsPrintf ("Current scope: %s\n", AcpiGbl_DbScopeBuf);
168218585Sjkim        return;
169218585Sjkim    }
170218585Sjkim
171218585Sjkim    AcpiDbPrepNamestring (Name);
172218585Sjkim
173245582Sjkim    if (ACPI_IS_ROOT_PREFIX (Name[0]))
174218585Sjkim    {
175218585Sjkim        /* Validate new scope from the root */
176218585Sjkim
177306536Sjkim        Status = AcpiNsGetNode (AcpiGbl_RootNode, Name,
178306536Sjkim            ACPI_NS_NO_UPSEARCH, &Node);
179218585Sjkim        if (ACPI_FAILURE (Status))
180218585Sjkim        {
181218585Sjkim            goto ErrorExit;
182218585Sjkim        }
183218585Sjkim
184281075Sdim        AcpiGbl_DbScopeBuf[0] = 0;
185218585Sjkim    }
186218585Sjkim    else
187218585Sjkim    {
188218585Sjkim        /* Validate new scope relative to old scope */
189218585Sjkim
190306536Sjkim        Status = AcpiNsGetNode (AcpiGbl_DbScopeNode, Name,
191306536Sjkim            ACPI_NS_NO_UPSEARCH, &Node);
192218585Sjkim        if (ACPI_FAILURE (Status))
193218585Sjkim        {
194218585Sjkim            goto ErrorExit;
195218585Sjkim        }
196281075Sdim    }
197218585Sjkim
198281075Sdim    /* Build the final pathname */
199281075Sdim
200281075Sdim    if (AcpiUtSafeStrcat (AcpiGbl_DbScopeBuf, sizeof (AcpiGbl_DbScopeBuf),
201281075Sdim        Name))
202281075Sdim    {
203281075Sdim        Status = AE_BUFFER_OVERFLOW;
204281075Sdim        goto ErrorExit;
205218585Sjkim    }
206218585Sjkim
207281075Sdim    if (AcpiUtSafeStrcat (AcpiGbl_DbScopeBuf, sizeof (AcpiGbl_DbScopeBuf),
208306536Sjkim            "\\"))
209281075Sdim    {
210281075Sdim        Status = AE_BUFFER_OVERFLOW;
211281075Sdim        goto ErrorExit;
212281075Sdim    }
213281075Sdim
214218585Sjkim    AcpiGbl_DbScopeNode = Node;
215218585Sjkim    AcpiOsPrintf ("New scope: %s\n", AcpiGbl_DbScopeBuf);
216218585Sjkim    return;
217218585Sjkim
218218585SjkimErrorExit:
219218585Sjkim
220218585Sjkim    AcpiOsPrintf ("Could not attach scope: %s, %s\n",
221218585Sjkim        Name, AcpiFormatException (Status));
222218585Sjkim}
223218585Sjkim
224218585Sjkim
225218585Sjkim/*******************************************************************************
226218585Sjkim *
227218585Sjkim * FUNCTION:    AcpiDbDumpNamespace
228218585Sjkim *
229218585Sjkim * PARAMETERS:  StartArg        - Node to begin namespace dump
230218585Sjkim *              DepthArg        - Maximum tree depth to be dumped
231218585Sjkim *
232218585Sjkim * RETURN:      None
233218585Sjkim *
234241973Sjkim * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed
235218585Sjkim *              with type and other information.
236218585Sjkim *
237218585Sjkim ******************************************************************************/
238218585Sjkim
239218585Sjkimvoid
240218585SjkimAcpiDbDumpNamespace (
241218585Sjkim    char                    *StartArg,
242218585Sjkim    char                    *DepthArg)
243218585Sjkim{
244218585Sjkim    ACPI_HANDLE             SubtreeEntry = AcpiGbl_RootNode;
245218585Sjkim    UINT32                  MaxDepth = ACPI_UINT32_MAX;
246218585Sjkim
247218585Sjkim
248218585Sjkim    /* No argument given, just start at the root and dump entire namespace */
249218585Sjkim
250218585Sjkim    if (StartArg)
251218585Sjkim    {
252218585Sjkim        SubtreeEntry = AcpiDbConvertToNode (StartArg);
253218585Sjkim        if (!SubtreeEntry)
254218585Sjkim        {
255218585Sjkim            return;
256218585Sjkim        }
257218585Sjkim
258218585Sjkim        /* Now we can check for the depth argument */
259218585Sjkim
260218585Sjkim        if (DepthArg)
261218585Sjkim        {
262306536Sjkim            MaxDepth = strtoul (DepthArg, NULL, 0);
263218585Sjkim        }
264218585Sjkim    }
265218585Sjkim
266218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
267218585Sjkim    AcpiOsPrintf ("ACPI Namespace (from %4.4s (%p) subtree):\n",
268218585Sjkim        ((ACPI_NAMESPACE_NODE *) SubtreeEntry)->Name.Ascii, SubtreeEntry);
269218585Sjkim
270218585Sjkim    /* Display the subtree */
271218585Sjkim
272218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
273218585Sjkim    AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth,
274218585Sjkim        ACPI_OWNER_ID_MAX, SubtreeEntry);
275218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
276218585Sjkim}
277218585Sjkim
278218585Sjkim
279218585Sjkim/*******************************************************************************
280218585Sjkim *
281254745Sjkim * FUNCTION:    AcpiDbDumpNamespacePaths
282254745Sjkim *
283254745Sjkim * PARAMETERS:  None
284254745Sjkim *
285254745Sjkim * RETURN:      None
286254745Sjkim *
287254745Sjkim * DESCRIPTION: Dump entire namespace with full object pathnames and object
288254745Sjkim *              type information. Alternative to "namespace" command.
289254745Sjkim *
290254745Sjkim ******************************************************************************/
291254745Sjkim
292254745Sjkimvoid
293254745SjkimAcpiDbDumpNamespacePaths (
294254745Sjkim    void)
295254745Sjkim{
296254745Sjkim
297254745Sjkim    AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
298254745Sjkim    AcpiOsPrintf ("ACPI Namespace (from root):\n");
299254745Sjkim
300254745Sjkim    /* Display the entire namespace */
301254745Sjkim
302254745Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
303254745Sjkim    AcpiNsDumpObjectPaths (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY,
304254745Sjkim        ACPI_UINT32_MAX, ACPI_OWNER_ID_MAX, AcpiGbl_RootNode);
305254745Sjkim
306254745Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
307254745Sjkim}
308254745Sjkim
309254745Sjkim
310254745Sjkim/*******************************************************************************
311254745Sjkim *
312218585Sjkim * FUNCTION:    AcpiDbDumpNamespaceByOwner
313218585Sjkim *
314218585Sjkim * PARAMETERS:  OwnerArg        - Owner ID whose nodes will be displayed
315218585Sjkim *              DepthArg        - Maximum tree depth to be dumped
316218585Sjkim *
317218585Sjkim * RETURN:      None
318218585Sjkim *
319218585Sjkim * DESCRIPTION: Dump elements of the namespace that are owned by the OwnerId.
320218585Sjkim *
321218585Sjkim ******************************************************************************/
322218585Sjkim
323218585Sjkimvoid
324218585SjkimAcpiDbDumpNamespaceByOwner (
325218585Sjkim    char                    *OwnerArg,
326218585Sjkim    char                    *DepthArg)
327218585Sjkim{
328218585Sjkim    ACPI_HANDLE             SubtreeEntry = AcpiGbl_RootNode;
329218585Sjkim    UINT32                  MaxDepth = ACPI_UINT32_MAX;
330218585Sjkim    ACPI_OWNER_ID           OwnerId;
331218585Sjkim
332218585Sjkim
333306536Sjkim    OwnerId = (ACPI_OWNER_ID) strtoul (OwnerArg, NULL, 0);
334218585Sjkim
335218585Sjkim    /* Now we can check for the depth argument */
336218585Sjkim
337218585Sjkim    if (DepthArg)
338218585Sjkim    {
339306536Sjkim        MaxDepth = strtoul (DepthArg, NULL, 0);
340218585Sjkim    }
341218585Sjkim
342218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
343218585Sjkim    AcpiOsPrintf ("ACPI Namespace by owner %X:\n", OwnerId);
344218585Sjkim
345218585Sjkim    /* Display the subtree */
346218585Sjkim
347218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
348306536Sjkim    AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth,
349306536Sjkim        OwnerId, SubtreeEntry);
350218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
351218585Sjkim}
352218585Sjkim
353218585Sjkim
354218585Sjkim/*******************************************************************************
355218585Sjkim *
356218585Sjkim * FUNCTION:    AcpiDbWalkAndMatchName
357218585Sjkim *
358218585Sjkim * PARAMETERS:  Callback from WalkNamespace
359218585Sjkim *
360218585Sjkim * RETURN:      Status
361218585Sjkim *
362241973Sjkim * DESCRIPTION: Find a particular name/names within the namespace. Wildcards
363218585Sjkim *              are supported -- '?' matches any character.
364218585Sjkim *
365218585Sjkim ******************************************************************************/
366218585Sjkim
367218585Sjkimstatic ACPI_STATUS
368218585SjkimAcpiDbWalkAndMatchName (
369218585Sjkim    ACPI_HANDLE             ObjHandle,
370218585Sjkim    UINT32                  NestingLevel,
371218585Sjkim    void                    *Context,
372218585Sjkim    void                    **ReturnValue)
373218585Sjkim{
374218585Sjkim    ACPI_STATUS             Status;
375218585Sjkim    char                    *RequestedName = (char *) Context;
376218585Sjkim    UINT32                  i;
377218585Sjkim    ACPI_BUFFER             Buffer;
378218585Sjkim    ACPI_WALK_INFO          Info;
379218585Sjkim
380218585Sjkim
381218585Sjkim    /* Check for a name match */
382218585Sjkim
383218585Sjkim    for (i = 0; i < 4; i++)
384218585Sjkim    {
385218585Sjkim        /* Wildcard support */
386218585Sjkim
387218585Sjkim        if ((RequestedName[i] != '?') &&
388306536Sjkim            (RequestedName[i] != ((ACPI_NAMESPACE_NODE *)
389306536Sjkim                ObjHandle)->Name.Ascii[i]))
390218585Sjkim        {
391218585Sjkim            /* No match, just exit */
392218585Sjkim
393218585Sjkim            return (AE_OK);
394218585Sjkim        }
395218585Sjkim    }
396218585Sjkim
397218585Sjkim    /* Get the full pathname to this object */
398218585Sjkim
399218585Sjkim    Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
400306536Sjkim    Status = AcpiNsHandleToPathname (ObjHandle, &Buffer, TRUE);
401218585Sjkim    if (ACPI_FAILURE (Status))
402218585Sjkim    {
403306536Sjkim        AcpiOsPrintf ("Could Not get pathname for object %p\n",
404306536Sjkim            ObjHandle);
405218585Sjkim    }
406218585Sjkim    else
407218585Sjkim    {
408218585Sjkim        Info.OwnerId = ACPI_OWNER_ID_MAX;
409218585Sjkim        Info.DebugLevel = ACPI_UINT32_MAX;
410218585Sjkim        Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
411218585Sjkim
412218585Sjkim        AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
413218585Sjkim        (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, &Info, NULL);
414218585Sjkim        ACPI_FREE (Buffer.Pointer);
415218585Sjkim    }
416218585Sjkim
417218585Sjkim    return (AE_OK);
418218585Sjkim}
419218585Sjkim
420218585Sjkim
421218585Sjkim/*******************************************************************************
422218585Sjkim *
423218585Sjkim * FUNCTION:    AcpiDbFindNameInNamespace
424218585Sjkim *
425218585Sjkim * PARAMETERS:  NameArg         - The 4-character ACPI name to find.
426218585Sjkim *                                wildcards are supported.
427218585Sjkim *
428218585Sjkim * RETURN:      None
429218585Sjkim *
430218585Sjkim * DESCRIPTION: Search the namespace for a given name (with wildcards)
431218585Sjkim *
432218585Sjkim ******************************************************************************/
433218585Sjkim
434218585SjkimACPI_STATUS
435218585SjkimAcpiDbFindNameInNamespace (
436218585Sjkim    char                    *NameArg)
437218585Sjkim{
438218585Sjkim    char                    AcpiName[5] = "____";
439218585Sjkim    char                    *AcpiNamePtr = AcpiName;
440218585Sjkim
441218585Sjkim
442306536Sjkim    if (strlen (NameArg) > ACPI_NAME_SIZE)
443218585Sjkim    {
444218585Sjkim        AcpiOsPrintf ("Name must be no longer than 4 characters\n");
445218585Sjkim        return (AE_OK);
446218585Sjkim    }
447218585Sjkim
448218585Sjkim    /* Pad out name with underscores as necessary to create a 4-char name */
449218585Sjkim
450218585Sjkim    AcpiUtStrupr (NameArg);
451218585Sjkim    while (*NameArg)
452218585Sjkim    {
453218585Sjkim        *AcpiNamePtr = *NameArg;
454218585Sjkim        AcpiNamePtr++;
455218585Sjkim        NameArg++;
456218585Sjkim    }
457218585Sjkim
458218585Sjkim    /* Walk the namespace from the root */
459218585Sjkim
460306536Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
461306536Sjkim        ACPI_UINT32_MAX, AcpiDbWalkAndMatchName, NULL, AcpiName, NULL);
462218585Sjkim
463218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
464218585Sjkim    return (AE_OK);
465218585Sjkim}
466218585Sjkim
467218585Sjkim
468218585Sjkim/*******************************************************************************
469218585Sjkim *
470218585Sjkim * FUNCTION:    AcpiDbWalkForPredefinedNames
471218585Sjkim *
472218585Sjkim * PARAMETERS:  Callback from WalkNamespace
473218585Sjkim *
474218585Sjkim * RETURN:      Status
475218585Sjkim *
476218585Sjkim * DESCRIPTION: Detect and display predefined ACPI names (names that start with
477218585Sjkim *              an underscore)
478218585Sjkim *
479218585Sjkim ******************************************************************************/
480218585Sjkim
481218585Sjkimstatic ACPI_STATUS
482218585SjkimAcpiDbWalkForPredefinedNames (
483218585Sjkim    ACPI_HANDLE             ObjHandle,
484218585Sjkim    UINT32                  NestingLevel,
485218585Sjkim    void                    *Context,
486218585Sjkim    void                    **ReturnValue)
487218585Sjkim{
488218585Sjkim    ACPI_NAMESPACE_NODE         *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
489218585Sjkim    UINT32                      *Count = (UINT32 *) Context;
490218585Sjkim    const ACPI_PREDEFINED_INFO  *Predefined;
491218585Sjkim    const ACPI_PREDEFINED_INFO  *Package = NULL;
492218585Sjkim    char                        *Pathname;
493249663Sjkim    char                        StringBuffer[48];
494218585Sjkim
495218585Sjkim
496249112Sjkim    Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii);
497218585Sjkim    if (!Predefined)
498218585Sjkim    {
499218585Sjkim        return (AE_OK);
500218585Sjkim    }
501218585Sjkim
502306536Sjkim    Pathname = AcpiNsGetNormalizedPathname (Node, TRUE);
503218585Sjkim    if (!Pathname)
504218585Sjkim    {
505218585Sjkim        return (AE_OK);
506218585Sjkim    }
507218585Sjkim
508218585Sjkim    /* If method returns a package, the info is in the next table entry */
509218585Sjkim
510249112Sjkim    if (Predefined->Info.ExpectedBtypes & ACPI_RTYPE_PACKAGE)
511218585Sjkim    {
512218585Sjkim        Package = Predefined + 1;
513218585Sjkim    }
514218585Sjkim
515249663Sjkim    AcpiUtGetExpectedReturnTypes (StringBuffer,
516249112Sjkim        Predefined->Info.ExpectedBtypes);
517218585Sjkim
518249663Sjkim    AcpiOsPrintf ("%-32s Arguments %X, Return Types: %s", Pathname,
519249663Sjkim        METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList),
520249663Sjkim        StringBuffer);
521249663Sjkim
522218585Sjkim    if (Package)
523218585Sjkim    {
524249663Sjkim        AcpiOsPrintf (" (PkgType %2.2X, ObjType %2.2X, Count %2.2X)",
525218585Sjkim            Package->RetInfo.Type, Package->RetInfo.ObjectType1,
526218585Sjkim            Package->RetInfo.Count1);
527218585Sjkim    }
528218585Sjkim
529218585Sjkim    AcpiOsPrintf("\n");
530218585Sjkim
531249663Sjkim    /* Check that the declared argument count matches the ACPI spec */
532249663Sjkim
533249663Sjkim    AcpiNsCheckAcpiCompliance (Pathname, Node, Predefined);
534249663Sjkim
535218585Sjkim    ACPI_FREE (Pathname);
536218585Sjkim    (*Count)++;
537218585Sjkim    return (AE_OK);
538218585Sjkim}
539218585Sjkim
540218585Sjkim
541218585Sjkim/*******************************************************************************
542218585Sjkim *
543218585Sjkim * FUNCTION:    AcpiDbCheckPredefinedNames
544218585Sjkim *
545218585Sjkim * PARAMETERS:  None
546218585Sjkim *
547218585Sjkim * RETURN:      None
548218585Sjkim *
549218585Sjkim * DESCRIPTION: Validate all predefined names in the namespace
550218585Sjkim *
551218585Sjkim ******************************************************************************/
552218585Sjkim
553218585Sjkimvoid
554218585SjkimAcpiDbCheckPredefinedNames (
555218585Sjkim    void)
556218585Sjkim{
557218585Sjkim    UINT32                  Count = 0;
558218585Sjkim
559218585Sjkim
560218585Sjkim    /* Search all nodes in namespace */
561218585Sjkim
562306536Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
563306536Sjkim        ACPI_UINT32_MAX, AcpiDbWalkForPredefinedNames,
564306536Sjkim        NULL, (void *) &Count, NULL);
565218585Sjkim
566218585Sjkim    AcpiOsPrintf ("Found %u predefined names in the namespace\n", Count);
567218585Sjkim}
568218585Sjkim
569218585Sjkim
570218585Sjkim/*******************************************************************************
571218585Sjkim *
572306536Sjkim * FUNCTION:    AcpiDbWalkForObjectCounts
573306536Sjkim *
574306536Sjkim * PARAMETERS:  Callback from WalkNamespace
575306536Sjkim *
576306536Sjkim * RETURN:      Status
577306536Sjkim *
578306536Sjkim * DESCRIPTION: Display short info about objects in the namespace
579306536Sjkim *
580306536Sjkim ******************************************************************************/
581306536Sjkim
582306536Sjkimstatic ACPI_STATUS
583306536SjkimAcpiDbWalkForObjectCounts (
584306536Sjkim    ACPI_HANDLE             ObjHandle,
585306536Sjkim    UINT32                  NestingLevel,
586306536Sjkim    void                    *Context,
587306536Sjkim    void                    **ReturnValue)
588306536Sjkim{
589306536Sjkim    ACPI_OBJECT_INFO        *Info = (ACPI_OBJECT_INFO *) Context;
590306536Sjkim    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
591306536Sjkim
592306536Sjkim
593306536Sjkim    if (Node->Type > ACPI_TYPE_NS_NODE_MAX)
594306536Sjkim    {
595306536Sjkim        AcpiOsPrintf ("[%4.4s]: Unknown object type %X\n",
596306536Sjkim            Node->Name.Ascii, Node->Type);
597306536Sjkim    }
598306536Sjkim    else
599306536Sjkim    {
600306536Sjkim        Info->Types[Node->Type]++;
601306536Sjkim    }
602306536Sjkim
603306536Sjkim    return (AE_OK);
604306536Sjkim}
605306536Sjkim
606306536Sjkim
607306536Sjkim/*******************************************************************************
608306536Sjkim *
609218585Sjkim * FUNCTION:    AcpiDbWalkForSpecificObjects
610218585Sjkim *
611218585Sjkim * PARAMETERS:  Callback from WalkNamespace
612218585Sjkim *
613218585Sjkim * RETURN:      Status
614218585Sjkim *
615218585Sjkim * DESCRIPTION: Display short info about objects in the namespace
616218585Sjkim *
617218585Sjkim ******************************************************************************/
618218585Sjkim
619218585Sjkimstatic ACPI_STATUS
620218585SjkimAcpiDbWalkForSpecificObjects (
621218585Sjkim    ACPI_HANDLE             ObjHandle,
622218585Sjkim    UINT32                  NestingLevel,
623218585Sjkim    void                    *Context,
624218585Sjkim    void                    **ReturnValue)
625218585Sjkim{
626218585Sjkim    ACPI_WALK_INFO          *Info = (ACPI_WALK_INFO *) Context;
627218585Sjkim    ACPI_BUFFER             Buffer;
628218585Sjkim    ACPI_STATUS             Status;
629218585Sjkim
630218585Sjkim
631218585Sjkim    Info->Count++;
632218585Sjkim
633218585Sjkim    /* Get and display the full pathname to this object */
634218585Sjkim
635218585Sjkim    Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
636306536Sjkim    Status = AcpiNsHandleToPathname (ObjHandle, &Buffer, TRUE);
637218585Sjkim    if (ACPI_FAILURE (Status))
638218585Sjkim    {
639218585Sjkim        AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
640218585Sjkim        return (AE_OK);
641218585Sjkim    }
642218585Sjkim
643218585Sjkim    AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
644218585Sjkim    ACPI_FREE (Buffer.Pointer);
645218585Sjkim
646218585Sjkim    /* Dump short info about the object */
647218585Sjkim
648218585Sjkim    (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, Info, NULL);
649218585Sjkim    return (AE_OK);
650218585Sjkim}
651218585Sjkim
652218585Sjkim
653218585Sjkim/*******************************************************************************
654218585Sjkim *
655218585Sjkim * FUNCTION:    AcpiDbDisplayObjects
656218585Sjkim *
657218585Sjkim * PARAMETERS:  ObjTypeArg          - Type of object to display
658218585Sjkim *              DisplayCountArg     - Max depth to display
659218585Sjkim *
660218585Sjkim * RETURN:      None
661218585Sjkim *
662218585Sjkim * DESCRIPTION: Display objects in the namespace of the requested type
663218585Sjkim *
664218585Sjkim ******************************************************************************/
665218585Sjkim
666218585SjkimACPI_STATUS
667218585SjkimAcpiDbDisplayObjects (
668218585Sjkim    char                    *ObjTypeArg,
669218585Sjkim    char                    *DisplayCountArg)
670218585Sjkim{
671218585Sjkim    ACPI_WALK_INFO          Info;
672218585Sjkim    ACPI_OBJECT_TYPE        Type;
673306536Sjkim    ACPI_OBJECT_INFO        *ObjectInfo;
674306536Sjkim    UINT32                  i;
675306536Sjkim    UINT32                  TotalObjects = 0;
676218585Sjkim
677218585Sjkim
678306536Sjkim    /* No argument means display summary/count of all object types */
679306536Sjkim
680306536Sjkim    if (!ObjTypeArg)
681306536Sjkim    {
682306536Sjkim        ObjectInfo = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_OBJECT_INFO));
683306536Sjkim
684306536Sjkim        /* Walk the namespace from the root */
685306536Sjkim
686306536Sjkim        (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
687306536Sjkim            ACPI_UINT32_MAX, AcpiDbWalkForObjectCounts, NULL,
688306536Sjkim            (void *) ObjectInfo, NULL);
689306536Sjkim
690306536Sjkim        AcpiOsPrintf ("\nSummary of namespace objects:\n\n");
691306536Sjkim
692306536Sjkim        for (i = 0; i < ACPI_TOTAL_TYPES; i++)
693306536Sjkim        {
694306536Sjkim            AcpiOsPrintf ("%8u   %s\n", ObjectInfo->Types[i],
695306536Sjkim                AcpiUtGetTypeName (i));
696306536Sjkim
697306536Sjkim            TotalObjects += ObjectInfo->Types[i];
698306536Sjkim        }
699306536Sjkim
700306536Sjkim        AcpiOsPrintf ("\n%8u   Total namespace objects\n\n",
701306536Sjkim            TotalObjects);
702306536Sjkim
703306536Sjkim        ACPI_FREE (ObjectInfo);
704306536Sjkim        return (AE_OK);
705306536Sjkim    }
706306536Sjkim
707218585Sjkim    /* Get the object type */
708218585Sjkim
709218585Sjkim    Type = AcpiDbMatchArgument (ObjTypeArg, AcpiDbObjectTypes);
710218585Sjkim    if (Type == ACPI_TYPE_NOT_FOUND)
711218585Sjkim    {
712218585Sjkim        AcpiOsPrintf ("Invalid or unsupported argument\n");
713218585Sjkim        return (AE_OK);
714218585Sjkim    }
715218585Sjkim
716218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
717218585Sjkim    AcpiOsPrintf (
718218585Sjkim        "Objects of type [%s] defined in the current ACPI Namespace:\n",
719218585Sjkim        AcpiUtGetTypeName (Type));
720218585Sjkim
721218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
722218585Sjkim
723218585Sjkim    Info.Count = 0;
724218585Sjkim    Info.OwnerId = ACPI_OWNER_ID_MAX;
725218585Sjkim    Info.DebugLevel = ACPI_UINT32_MAX;
726218585Sjkim    Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
727218585Sjkim
728218585Sjkim    /* Walk the namespace from the root */
729218585Sjkim
730218585Sjkim    (void) AcpiWalkNamespace (Type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
731306536Sjkim        AcpiDbWalkForSpecificObjects, NULL, (void *) &Info, NULL);
732218585Sjkim
733218585Sjkim    AcpiOsPrintf (
734218585Sjkim        "\nFound %u objects of type [%s] in the current ACPI Namespace\n",
735218585Sjkim        Info.Count, AcpiUtGetTypeName (Type));
736218585Sjkim
737218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
738218585Sjkim    return (AE_OK);
739218585Sjkim}
740218585Sjkim
741218585Sjkim
742218585Sjkim/*******************************************************************************
743218585Sjkim *
744218585Sjkim * FUNCTION:    AcpiDbIntegrityWalk
745218585Sjkim *
746218585Sjkim * PARAMETERS:  Callback from WalkNamespace
747218585Sjkim *
748218585Sjkim * RETURN:      Status
749218585Sjkim *
750218585Sjkim * DESCRIPTION: Examine one NS node for valid values.
751218585Sjkim *
752218585Sjkim ******************************************************************************/
753218585Sjkim
754218585Sjkimstatic ACPI_STATUS
755218585SjkimAcpiDbIntegrityWalk (
756218585Sjkim    ACPI_HANDLE             ObjHandle,
757218585Sjkim    UINT32                  NestingLevel,
758218585Sjkim    void                    *Context,
759218585Sjkim    void                    **ReturnValue)
760218585Sjkim{
761218585Sjkim    ACPI_INTEGRITY_INFO     *Info = (ACPI_INTEGRITY_INFO *) Context;
762218585Sjkim    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
763218585Sjkim    ACPI_OPERAND_OBJECT     *Object;
764218585Sjkim    BOOLEAN                 Alias = TRUE;
765218585Sjkim
766218585Sjkim
767218585Sjkim    Info->Nodes++;
768218585Sjkim
769218585Sjkim    /* Verify the NS node, and dereference aliases */
770218585Sjkim
771218585Sjkim    while (Alias)
772218585Sjkim    {
773218585Sjkim        if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
774218585Sjkim        {
775306536Sjkim            AcpiOsPrintf (
776306536Sjkim                "Invalid Descriptor Type for Node %p [%s] - "
777306536Sjkim                "is %2.2X should be %2.2X\n",
778306536Sjkim                Node, AcpiUtGetDescriptorName (Node),
779306536Sjkim                ACPI_GET_DESCRIPTOR_TYPE (Node), ACPI_DESC_TYPE_NAMED);
780218585Sjkim            return (AE_OK);
781218585Sjkim        }
782218585Sjkim
783218585Sjkim        if ((Node->Type == ACPI_TYPE_LOCAL_ALIAS)  ||
784218585Sjkim            (Node->Type == ACPI_TYPE_LOCAL_METHOD_ALIAS))
785218585Sjkim        {
786218585Sjkim            Node = (ACPI_NAMESPACE_NODE *) Node->Object;
787218585Sjkim        }
788218585Sjkim        else
789218585Sjkim        {
790218585Sjkim            Alias = FALSE;
791218585Sjkim        }
792218585Sjkim    }
793218585Sjkim
794218585Sjkim    if (Node->Type > ACPI_TYPE_LOCAL_MAX)
795218585Sjkim    {
796218585Sjkim        AcpiOsPrintf ("Invalid Object Type for Node %p, Type = %X\n",
797218585Sjkim            Node, Node->Type);
798218585Sjkim        return (AE_OK);
799218585Sjkim    }
800218585Sjkim
801306536Sjkim    if (!AcpiUtValidNameseg (Node->Name.Ascii))
802218585Sjkim    {
803218585Sjkim        AcpiOsPrintf ("Invalid AcpiName for Node %p\n", Node);
804218585Sjkim        return (AE_OK);
805218585Sjkim    }
806218585Sjkim
807218585Sjkim    Object = AcpiNsGetAttachedObject (Node);
808218585Sjkim    if (Object)
809218585Sjkim    {
810218585Sjkim        Info->Objects++;
811218585Sjkim        if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
812218585Sjkim        {
813218585Sjkim            AcpiOsPrintf ("Invalid Descriptor Type for Object %p [%s]\n",
814218585Sjkim                Object, AcpiUtGetDescriptorName (Object));
815218585Sjkim        }
816218585Sjkim    }
817218585Sjkim
818218585Sjkim    return (AE_OK);
819218585Sjkim}
820218585Sjkim
821218585Sjkim
822218585Sjkim/*******************************************************************************
823218585Sjkim *
824218585Sjkim * FUNCTION:    AcpiDbCheckIntegrity
825218585Sjkim *
826218585Sjkim * PARAMETERS:  None
827218585Sjkim *
828218585Sjkim * RETURN:      None
829218585Sjkim *
830218585Sjkim * DESCRIPTION: Check entire namespace for data structure integrity
831218585Sjkim *
832218585Sjkim ******************************************************************************/
833218585Sjkim
834218585Sjkimvoid
835218585SjkimAcpiDbCheckIntegrity (
836218585Sjkim    void)
837218585Sjkim{
838218585Sjkim    ACPI_INTEGRITY_INFO     Info = {0,0};
839218585Sjkim
840218585Sjkim    /* Search all nodes in namespace */
841218585Sjkim
842306536Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
843306536Sjkim        ACPI_UINT32_MAX, AcpiDbIntegrityWalk, NULL, (void *) &Info, NULL);
844218585Sjkim
845218585Sjkim    AcpiOsPrintf ("Verified %u namespace nodes with %u Objects\n",
846218585Sjkim        Info.Nodes, Info.Objects);
847218585Sjkim}
848218585Sjkim
849218585Sjkim
850218585Sjkim/*******************************************************************************
851218585Sjkim *
852218585Sjkim * FUNCTION:    AcpiDbWalkForReferences
853218585Sjkim *
854218585Sjkim * PARAMETERS:  Callback from WalkNamespace
855218585Sjkim *
856218585Sjkim * RETURN:      Status
857218585Sjkim *
858218585Sjkim * DESCRIPTION: Check if this namespace object refers to the target object
859218585Sjkim *              that is passed in as the context value.
860218585Sjkim *
861218585Sjkim * Note: Currently doesn't check subobjects within the Node's object
862218585Sjkim *
863218585Sjkim ******************************************************************************/
864218585Sjkim
865218585Sjkimstatic ACPI_STATUS
866218585SjkimAcpiDbWalkForReferences (
867218585Sjkim    ACPI_HANDLE             ObjHandle,
868218585Sjkim    UINT32                  NestingLevel,
869218585Sjkim    void                    *Context,
870218585Sjkim    void                    **ReturnValue)
871218585Sjkim{
872218585Sjkim    ACPI_OPERAND_OBJECT     *ObjDesc = (ACPI_OPERAND_OBJECT  *) Context;
873218585Sjkim    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
874218585Sjkim
875218585Sjkim
876218585Sjkim    /* Check for match against the namespace node itself */
877218585Sjkim
878218585Sjkim    if (Node == (void *) ObjDesc)
879218585Sjkim    {
880218585Sjkim        AcpiOsPrintf ("Object is a Node [%4.4s]\n",
881218585Sjkim            AcpiUtGetNodeName (Node));
882218585Sjkim    }
883218585Sjkim
884218585Sjkim    /* Check for match against the object attached to the node */
885218585Sjkim
886218585Sjkim    if (AcpiNsGetAttachedObject (Node) == ObjDesc)
887218585Sjkim    {
888218585Sjkim        AcpiOsPrintf ("Reference at Node->Object %p [%4.4s]\n",
889218585Sjkim            Node, AcpiUtGetNodeName (Node));
890218585Sjkim    }
891218585Sjkim
892218585Sjkim    return (AE_OK);
893218585Sjkim}
894218585Sjkim
895218585Sjkim
896218585Sjkim/*******************************************************************************
897218585Sjkim *
898218585Sjkim * FUNCTION:    AcpiDbFindReferences
899218585Sjkim *
900218585Sjkim * PARAMETERS:  ObjectArg       - String with hex value of the object
901218585Sjkim *
902218585Sjkim * RETURN:      None
903218585Sjkim *
904218585Sjkim * DESCRIPTION: Search namespace for all references to the input object
905218585Sjkim *
906218585Sjkim ******************************************************************************/
907218585Sjkim
908218585Sjkimvoid
909218585SjkimAcpiDbFindReferences (
910218585Sjkim    char                    *ObjectArg)
911218585Sjkim{
912218585Sjkim    ACPI_OPERAND_OBJECT     *ObjDesc;
913252279Sjkim    ACPI_SIZE               Address;
914218585Sjkim
915218585Sjkim
916218585Sjkim    /* Convert string to object pointer */
917218585Sjkim
918306536Sjkim    Address = strtoul (ObjectArg, NULL, 16);
919252279Sjkim    ObjDesc = ACPI_TO_POINTER (Address);
920218585Sjkim
921218585Sjkim    /* Search all nodes in namespace */
922218585Sjkim
923306536Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
924306536Sjkim        ACPI_UINT32_MAX, AcpiDbWalkForReferences, NULL,
925306536Sjkim        (void *) ObjDesc, NULL);
926218585Sjkim}
927218585Sjkim
928218585Sjkim
929218585Sjkim/*******************************************************************************
930218585Sjkim *
931218585Sjkim * FUNCTION:    AcpiDbBusWalk
932218585Sjkim *
933218585Sjkim * PARAMETERS:  Callback from WalkNamespace
934218585Sjkim *
935218585Sjkim * RETURN:      Status
936218585Sjkim *
937218585Sjkim * DESCRIPTION: Display info about device objects that have a corresponding
938218585Sjkim *              _PRT method.
939218585Sjkim *
940218585Sjkim ******************************************************************************/
941218585Sjkim
942218585Sjkimstatic ACPI_STATUS
943218585SjkimAcpiDbBusWalk (
944218585Sjkim    ACPI_HANDLE             ObjHandle,
945218585Sjkim    UINT32                  NestingLevel,
946218585Sjkim    void                    *Context,
947218585Sjkim    void                    **ReturnValue)
948218585Sjkim{
949218585Sjkim    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
950218585Sjkim    ACPI_STATUS             Status;
951218585Sjkim    ACPI_BUFFER             Buffer;
952218585Sjkim    ACPI_NAMESPACE_NODE     *TempNode;
953218585Sjkim    ACPI_DEVICE_INFO        *Info;
954218585Sjkim    UINT32                  i;
955218585Sjkim
956218585Sjkim
957218585Sjkim    if ((Node->Type != ACPI_TYPE_DEVICE) &&
958218585Sjkim        (Node->Type != ACPI_TYPE_PROCESSOR))
959218585Sjkim    {
960218585Sjkim        return (AE_OK);
961218585Sjkim    }
962218585Sjkim
963218585Sjkim    /* Exit if there is no _PRT under this device */
964218585Sjkim
965218585Sjkim    Status = AcpiGetHandle (Node, METHOD_NAME__PRT,
966306536Sjkim        ACPI_CAST_PTR (ACPI_HANDLE, &TempNode));
967218585Sjkim    if (ACPI_FAILURE (Status))
968218585Sjkim    {
969218585Sjkim        return (AE_OK);
970218585Sjkim    }
971218585Sjkim
972218585Sjkim    /* Get the full path to this device object */
973218585Sjkim
974218585Sjkim    Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
975306536Sjkim    Status = AcpiNsHandleToPathname (ObjHandle, &Buffer, TRUE);
976218585Sjkim    if (ACPI_FAILURE (Status))
977218585Sjkim    {
978306536Sjkim        AcpiOsPrintf ("Could Not get pathname for object %p\n",
979306536Sjkim            ObjHandle);
980218585Sjkim        return (AE_OK);
981218585Sjkim    }
982218585Sjkim
983218585Sjkim    Status = AcpiGetObjectInfo (ObjHandle, &Info);
984218585Sjkim    if (ACPI_FAILURE (Status))
985218585Sjkim    {
986218585Sjkim        return (AE_OK);
987218585Sjkim    }
988218585Sjkim
989218585Sjkim    /* Display the full path */
990218585Sjkim
991218585Sjkim    AcpiOsPrintf ("%-32s Type %X", (char *) Buffer.Pointer, Node->Type);
992218585Sjkim    ACPI_FREE (Buffer.Pointer);
993218585Sjkim
994218585Sjkim    if (Info->Flags & ACPI_PCI_ROOT_BRIDGE)
995218585Sjkim    {
996218585Sjkim        AcpiOsPrintf ("  - Is PCI Root Bridge");
997218585Sjkim    }
998218585Sjkim    AcpiOsPrintf ("\n");
999218585Sjkim
1000218585Sjkim    /* _PRT info */
1001218585Sjkim
1002218585Sjkim    AcpiOsPrintf ("_PRT: %p\n", TempNode);
1003218585Sjkim
1004218585Sjkim    /* Dump _ADR, _HID, _UID, _CID */
1005218585Sjkim
1006218585Sjkim    if (Info->Valid & ACPI_VALID_ADR)
1007218585Sjkim    {
1008306536Sjkim        AcpiOsPrintf ("_ADR: %8.8X%8.8X\n",
1009306536Sjkim            ACPI_FORMAT_UINT64 (Info->Address));
1010218585Sjkim    }
1011218585Sjkim    else
1012218585Sjkim    {
1013218585Sjkim        AcpiOsPrintf ("_ADR: <Not Present>\n");
1014218585Sjkim    }
1015218585Sjkim
1016218585Sjkim    if (Info->Valid & ACPI_VALID_HID)
1017218585Sjkim    {
1018218585Sjkim        AcpiOsPrintf ("_HID: %s\n", Info->HardwareId.String);
1019218585Sjkim    }
1020218585Sjkim    else
1021218585Sjkim    {
1022218585Sjkim        AcpiOsPrintf ("_HID: <Not Present>\n");
1023218585Sjkim    }
1024218585Sjkim
1025218585Sjkim    if (Info->Valid & ACPI_VALID_UID)
1026218585Sjkim    {
1027218585Sjkim        AcpiOsPrintf ("_UID: %s\n", Info->UniqueId.String);
1028218585Sjkim    }
1029218585Sjkim    else
1030218585Sjkim    {
1031218585Sjkim        AcpiOsPrintf ("_UID: <Not Present>\n");
1032218585Sjkim    }
1033218585Sjkim
1034218585Sjkim    if (Info->Valid & ACPI_VALID_CID)
1035218585Sjkim    {
1036218585Sjkim        for (i = 0; i < Info->CompatibleIdList.Count; i++)
1037218585Sjkim        {
1038218585Sjkim            AcpiOsPrintf ("_CID: %s\n",
1039218585Sjkim                Info->CompatibleIdList.Ids[i].String);
1040218585Sjkim        }
1041218585Sjkim    }
1042218585Sjkim    else
1043218585Sjkim    {
1044218585Sjkim        AcpiOsPrintf ("_CID: <Not Present>\n");
1045218585Sjkim    }
1046218585Sjkim
1047218585Sjkim    ACPI_FREE (Info);
1048218585Sjkim    return (AE_OK);
1049218585Sjkim}
1050218585Sjkim
1051218585Sjkim
1052218585Sjkim/*******************************************************************************
1053218585Sjkim *
1054218585Sjkim * FUNCTION:    AcpiDbGetBusInfo
1055218585Sjkim *
1056218585Sjkim * PARAMETERS:  None
1057218585Sjkim *
1058218585Sjkim * RETURN:      None
1059218585Sjkim *
1060218585Sjkim * DESCRIPTION: Display info about system busses.
1061218585Sjkim *
1062218585Sjkim ******************************************************************************/
1063218585Sjkim
1064218585Sjkimvoid
1065218585SjkimAcpiDbGetBusInfo (
1066218585Sjkim    void)
1067218585Sjkim{
1068218585Sjkim    /* Search all nodes in namespace */
1069218585Sjkim
1070306536Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
1071306536Sjkim        ACPI_UINT32_MAX, AcpiDbBusWalk, NULL, NULL, NULL);
1072218585Sjkim}
1073