1218585Sjkim/*******************************************************************************
2218585Sjkim *
3218585Sjkim * Module Name: dbnames - Debugger commands for the acpi namespace
4218585Sjkim *
5218585Sjkim ******************************************************************************/
6218585Sjkim
7316303Sjkim/******************************************************************************
8316303Sjkim *
9316303Sjkim * 1. Copyright Notice
10316303Sjkim *
11316303Sjkim * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp.
12218585Sjkim * All rights reserved.
13218585Sjkim *
14316303Sjkim * 2. License
15316303Sjkim *
16316303Sjkim * 2.1. This is your license from Intel Corp. under its intellectual property
17316303Sjkim * rights. You may have additional license terms from the party that provided
18316303Sjkim * you this software, covering your right to use that party's intellectual
19316303Sjkim * property rights.
20316303Sjkim *
21316303Sjkim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22316303Sjkim * copy of the source code appearing in this file ("Covered Code") an
23316303Sjkim * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24316303Sjkim * base code distributed originally by Intel ("Original Intel Code") to copy,
25316303Sjkim * make derivatives, distribute, use and display any portion of the Covered
26316303Sjkim * Code in any form, with the right to sublicense such rights; and
27316303Sjkim *
28316303Sjkim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29316303Sjkim * license (with the right to sublicense), under only those claims of Intel
30316303Sjkim * patents that are infringed by the Original Intel Code, to make, use, sell,
31316303Sjkim * offer to sell, and import the Covered Code and derivative works thereof
32316303Sjkim * solely to the minimum extent necessary to exercise the above copyright
33316303Sjkim * license, and in no event shall the patent license extend to any additions
34316303Sjkim * to or modifications of the Original Intel Code. No other license or right
35316303Sjkim * is granted directly or by implication, estoppel or otherwise;
36316303Sjkim *
37316303Sjkim * The above copyright and patent license is granted only if the following
38316303Sjkim * conditions are met:
39316303Sjkim *
40316303Sjkim * 3. Conditions
41316303Sjkim *
42316303Sjkim * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43316303Sjkim * Redistribution of source code of any substantial portion of the Covered
44316303Sjkim * Code or modification with rights to further distribute source must include
45316303Sjkim * the above Copyright Notice, the above License, this list of Conditions,
46316303Sjkim * and the following Disclaimer and Export Compliance provision. In addition,
47316303Sjkim * Licensee must cause all Covered Code to which Licensee contributes to
48316303Sjkim * contain a file documenting the changes Licensee made to create that Covered
49316303Sjkim * Code and the date of any change. Licensee must include in that file the
50316303Sjkim * documentation of any changes made by any predecessor Licensee. Licensee
51316303Sjkim * must include a prominent statement that the modification is derived,
52316303Sjkim * directly or indirectly, from Original Intel Code.
53316303Sjkim *
54316303Sjkim * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55316303Sjkim * Redistribution of source code of any substantial portion of the Covered
56316303Sjkim * Code or modification without rights to further distribute source must
57316303Sjkim * include the following Disclaimer and Export Compliance provision in the
58316303Sjkim * documentation and/or other materials provided with distribution. In
59316303Sjkim * addition, Licensee may not authorize further sublicense of source of any
60316303Sjkim * portion of the Covered Code, and must include terms to the effect that the
61316303Sjkim * license from Licensee to its licensee is limited to the intellectual
62316303Sjkim * property embodied in the software Licensee provides to its licensee, and
63316303Sjkim * not to intellectual property embodied in modifications its licensee may
64316303Sjkim * make.
65316303Sjkim *
66316303Sjkim * 3.3. Redistribution of Executable. Redistribution in executable form of any
67316303Sjkim * substantial portion of the Covered Code or modification must reproduce the
68316303Sjkim * above Copyright Notice, and the following Disclaimer and Export Compliance
69316303Sjkim * provision in the documentation and/or other materials provided with the
70316303Sjkim * distribution.
71316303Sjkim *
72316303Sjkim * 3.4. Intel retains all right, title, and interest in and to the Original
73316303Sjkim * Intel Code.
74316303Sjkim *
75316303Sjkim * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76316303Sjkim * Intel shall be used in advertising or otherwise to promote the sale, use or
77316303Sjkim * other dealings in products derived from or relating to the Covered Code
78316303Sjkim * without prior written authorization from Intel.
79316303Sjkim *
80316303Sjkim * 4. Disclaimer and Export Compliance
81316303Sjkim *
82316303Sjkim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83316303Sjkim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84316303Sjkim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85316303Sjkim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86316303Sjkim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87316303Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88316303Sjkim * PARTICULAR PURPOSE.
89316303Sjkim *
90316303Sjkim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91316303Sjkim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92316303Sjkim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93316303Sjkim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94316303Sjkim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95316303Sjkim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96316303Sjkim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97316303Sjkim * LIMITED REMEDY.
98316303Sjkim *
99316303Sjkim * 4.3. Licensee shall not export, either directly or indirectly, any of this
100316303Sjkim * software or system incorporating such software without first obtaining any
101316303Sjkim * required license or other approval from the U. S. Department of Commerce or
102316303Sjkim * any other agency or department of the United States Government. In the
103316303Sjkim * event Licensee exports any such software from the United States or
104316303Sjkim * re-exports any such software from a foreign destination, Licensee shall
105316303Sjkim * ensure that the distribution and export/re-export of the software is in
106316303Sjkim * compliance with all laws, regulations, orders, or other restrictions of the
107316303Sjkim * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108316303Sjkim * any of its subsidiaries will export/re-export any technical data, process,
109316303Sjkim * software, or service, directly or indirectly, to any country for which the
110316303Sjkim * United States government or any agency thereof requires an export license,
111316303Sjkim * other governmental approval, or letter of assurance, without first obtaining
112316303Sjkim * such license, approval or letter.
113316303Sjkim *
114316303Sjkim *****************************************************************************
115316303Sjkim *
116316303Sjkim * Alternatively, you may choose to be licensed under the terms of the
117316303Sjkim * following license:
118316303Sjkim *
119218585Sjkim * Redistribution and use in source and binary forms, with or without
120218585Sjkim * modification, are permitted provided that the following conditions
121218585Sjkim * are met:
122218585Sjkim * 1. Redistributions of source code must retain the above copyright
123218585Sjkim *    notice, this list of conditions, and the following disclaimer,
124218585Sjkim *    without modification.
125218585Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126218585Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
127218585Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
128218585Sjkim *    including a substantially similar Disclaimer requirement for further
129218585Sjkim *    binary redistribution.
130218585Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
131218585Sjkim *    of any contributors may be used to endorse or promote products derived
132218585Sjkim *    from this software without specific prior written permission.
133218585Sjkim *
134316303Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135316303Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136316303Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137316303Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138316303Sjkim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139316303Sjkim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140316303Sjkim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141316303Sjkim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142316303Sjkim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143316303Sjkim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144316303Sjkim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145316303Sjkim *
146316303Sjkim * Alternatively, you may choose to be licensed under the terms of the
147218585Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
148218585Sjkim * Software Foundation.
149218585Sjkim *
150316303Sjkim *****************************************************************************/
151218585Sjkim
152218590Sjkim#include <contrib/dev/acpica/include/acpi.h>
153218590Sjkim#include <contrib/dev/acpica/include/accommon.h>
154218590Sjkim#include <contrib/dev/acpica/include/acnamesp.h>
155218590Sjkim#include <contrib/dev/acpica/include/acdebug.h>
156249112Sjkim#include <contrib/dev/acpica/include/acpredef.h>
157218585Sjkim
158218585Sjkim
159218585Sjkim#define _COMPONENT          ACPI_CA_DEBUGGER
160218585Sjkim        ACPI_MODULE_NAME    ("dbnames")
161218585Sjkim
162218585Sjkim
163218585Sjkim/* Local prototypes */
164218585Sjkim
165218585Sjkimstatic ACPI_STATUS
166218585SjkimAcpiDbWalkAndMatchName (
167218585Sjkim    ACPI_HANDLE             ObjHandle,
168218585Sjkim    UINT32                  NestingLevel,
169218585Sjkim    void                    *Context,
170218585Sjkim    void                    **ReturnValue);
171218585Sjkim
172218585Sjkimstatic ACPI_STATUS
173218585SjkimAcpiDbWalkForPredefinedNames (
174218585Sjkim    ACPI_HANDLE             ObjHandle,
175218585Sjkim    UINT32                  NestingLevel,
176218585Sjkim    void                    *Context,
177218585Sjkim    void                    **ReturnValue);
178218585Sjkim
179218585Sjkimstatic ACPI_STATUS
180218585SjkimAcpiDbWalkForSpecificObjects (
181218585Sjkim    ACPI_HANDLE             ObjHandle,
182218585Sjkim    UINT32                  NestingLevel,
183218585Sjkim    void                    *Context,
184218585Sjkim    void                    **ReturnValue);
185218585Sjkim
186218585Sjkimstatic ACPI_STATUS
187287168SjkimAcpiDbWalkForObjectCounts (
188287168Sjkim    ACPI_HANDLE             ObjHandle,
189287168Sjkim    UINT32                  NestingLevel,
190287168Sjkim    void                    *Context,
191287168Sjkim    void                    **ReturnValue);
192287168Sjkim
193287168Sjkimstatic ACPI_STATUS
194218585SjkimAcpiDbIntegrityWalk (
195218585Sjkim    ACPI_HANDLE             ObjHandle,
196218585Sjkim    UINT32                  NestingLevel,
197218585Sjkim    void                    *Context,
198218585Sjkim    void                    **ReturnValue);
199218585Sjkim
200218585Sjkimstatic ACPI_STATUS
201218585SjkimAcpiDbWalkForReferences (
202218585Sjkim    ACPI_HANDLE             ObjHandle,
203218585Sjkim    UINT32                  NestingLevel,
204218585Sjkim    void                    *Context,
205218585Sjkim    void                    **ReturnValue);
206218585Sjkim
207218585Sjkimstatic ACPI_STATUS
208218585SjkimAcpiDbBusWalk (
209218585Sjkim    ACPI_HANDLE             ObjHandle,
210218585Sjkim    UINT32                  NestingLevel,
211218585Sjkim    void                    *Context,
212218585Sjkim    void                    **ReturnValue);
213218585Sjkim
214218585Sjkim/*
215218585Sjkim * Arguments for the Objects command
216218585Sjkim * These object types map directly to the ACPI_TYPES
217218585Sjkim */
218240716Sjkimstatic ACPI_DB_ARGUMENT_INFO    AcpiDbObjectTypes [] =
219218585Sjkim{
220218585Sjkim    {"ANY"},
221218585Sjkim    {"INTEGERS"},
222218585Sjkim    {"STRINGS"},
223218585Sjkim    {"BUFFERS"},
224218585Sjkim    {"PACKAGES"},
225218585Sjkim    {"FIELDS"},
226218585Sjkim    {"DEVICES"},
227218585Sjkim    {"EVENTS"},
228218585Sjkim    {"METHODS"},
229218585Sjkim    {"MUTEXES"},
230218585Sjkim    {"REGIONS"},
231218585Sjkim    {"POWERRESOURCES"},
232218585Sjkim    {"PROCESSORS"},
233218585Sjkim    {"THERMALZONES"},
234218585Sjkim    {"BUFFERFIELDS"},
235218585Sjkim    {"DDBHANDLES"},
236218585Sjkim    {"DEBUG"},
237218585Sjkim    {"REGIONFIELDS"},
238218585Sjkim    {"BANKFIELDS"},
239218585Sjkim    {"INDEXFIELDS"},
240218585Sjkim    {"REFERENCES"},
241287168Sjkim    {"ALIASES"},
242287168Sjkim    {"METHODALIASES"},
243287168Sjkim    {"NOTIFY"},
244287168Sjkim    {"ADDRESSHANDLER"},
245287168Sjkim    {"RESOURCE"},
246287168Sjkim    {"RESOURCEFIELD"},
247287168Sjkim    {"SCOPES"},
248218585Sjkim    {NULL}           /* Must be null terminated */
249218585Sjkim};
250218585Sjkim
251218585Sjkim
252218585Sjkim/*******************************************************************************
253218585Sjkim *
254218585Sjkim * FUNCTION:    AcpiDbSetScope
255218585Sjkim *
256218585Sjkim * PARAMETERS:  Name                - New scope path
257218585Sjkim *
258218585Sjkim * RETURN:      Status
259218585Sjkim *
260218585Sjkim * DESCRIPTION: Set the "current scope" as maintained by this utility.
261218585Sjkim *              The scope is used as a prefix to ACPI paths.
262218585Sjkim *
263218585Sjkim ******************************************************************************/
264218585Sjkim
265218585Sjkimvoid
266218585SjkimAcpiDbSetScope (
267218585Sjkim    char                    *Name)
268218585Sjkim{
269218585Sjkim    ACPI_STATUS             Status;
270218585Sjkim    ACPI_NAMESPACE_NODE     *Node;
271218585Sjkim
272218585Sjkim
273218585Sjkim    if (!Name || Name[0] == 0)
274218585Sjkim    {
275218585Sjkim        AcpiOsPrintf ("Current scope: %s\n", AcpiGbl_DbScopeBuf);
276218585Sjkim        return;
277218585Sjkim    }
278218585Sjkim
279218585Sjkim    AcpiDbPrepNamestring (Name);
280218585Sjkim
281245582Sjkim    if (ACPI_IS_ROOT_PREFIX (Name[0]))
282218585Sjkim    {
283218585Sjkim        /* Validate new scope from the root */
284218585Sjkim
285287168Sjkim        Status = AcpiNsGetNode (AcpiGbl_RootNode, Name,
286287168Sjkim            ACPI_NS_NO_UPSEARCH, &Node);
287218585Sjkim        if (ACPI_FAILURE (Status))
288218585Sjkim        {
289218585Sjkim            goto ErrorExit;
290218585Sjkim        }
291218585Sjkim
292272444Sjkim        AcpiGbl_DbScopeBuf[0] = 0;
293218585Sjkim    }
294218585Sjkim    else
295218585Sjkim    {
296218585Sjkim        /* Validate new scope relative to old scope */
297218585Sjkim
298287168Sjkim        Status = AcpiNsGetNode (AcpiGbl_DbScopeNode, Name,
299287168Sjkim            ACPI_NS_NO_UPSEARCH, &Node);
300218585Sjkim        if (ACPI_FAILURE (Status))
301218585Sjkim        {
302218585Sjkim            goto ErrorExit;
303218585Sjkim        }
304272444Sjkim    }
305218585Sjkim
306272444Sjkim    /* Build the final pathname */
307272444Sjkim
308272444Sjkim    if (AcpiUtSafeStrcat (AcpiGbl_DbScopeBuf, sizeof (AcpiGbl_DbScopeBuf),
309298714Sjkim        Name))
310272444Sjkim    {
311272444Sjkim        Status = AE_BUFFER_OVERFLOW;
312272444Sjkim        goto ErrorExit;
313218585Sjkim    }
314218585Sjkim
315272444Sjkim    if (AcpiUtSafeStrcat (AcpiGbl_DbScopeBuf, sizeof (AcpiGbl_DbScopeBuf),
316287168Sjkim            "\\"))
317272444Sjkim    {
318272444Sjkim        Status = AE_BUFFER_OVERFLOW;
319272444Sjkim        goto ErrorExit;
320272444Sjkim    }
321272444Sjkim
322218585Sjkim    AcpiGbl_DbScopeNode = Node;
323218585Sjkim    AcpiOsPrintf ("New scope: %s\n", AcpiGbl_DbScopeBuf);
324218585Sjkim    return;
325218585Sjkim
326218585SjkimErrorExit:
327218585Sjkim
328218585Sjkim    AcpiOsPrintf ("Could not attach scope: %s, %s\n",
329218585Sjkim        Name, AcpiFormatException (Status));
330218585Sjkim}
331218585Sjkim
332218585Sjkim
333218585Sjkim/*******************************************************************************
334218585Sjkim *
335218585Sjkim * FUNCTION:    AcpiDbDumpNamespace
336218585Sjkim *
337218585Sjkim * PARAMETERS:  StartArg        - Node to begin namespace dump
338218585Sjkim *              DepthArg        - Maximum tree depth to be dumped
339218585Sjkim *
340218585Sjkim * RETURN:      None
341218585Sjkim *
342241973Sjkim * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed
343218585Sjkim *              with type and other information.
344218585Sjkim *
345218585Sjkim ******************************************************************************/
346218585Sjkim
347218585Sjkimvoid
348218585SjkimAcpiDbDumpNamespace (
349218585Sjkim    char                    *StartArg,
350218585Sjkim    char                    *DepthArg)
351218585Sjkim{
352218585Sjkim    ACPI_HANDLE             SubtreeEntry = AcpiGbl_RootNode;
353218585Sjkim    UINT32                  MaxDepth = ACPI_UINT32_MAX;
354218585Sjkim
355218585Sjkim
356218585Sjkim    /* No argument given, just start at the root and dump entire namespace */
357218585Sjkim
358218585Sjkim    if (StartArg)
359218585Sjkim    {
360218585Sjkim        SubtreeEntry = AcpiDbConvertToNode (StartArg);
361218585Sjkim        if (!SubtreeEntry)
362218585Sjkim        {
363218585Sjkim            return;
364218585Sjkim        }
365218585Sjkim
366218585Sjkim        /* Now we can check for the depth argument */
367218585Sjkim
368218585Sjkim        if (DepthArg)
369218585Sjkim        {
370284583Sjkim            MaxDepth = strtoul (DepthArg, NULL, 0);
371218585Sjkim        }
372218585Sjkim    }
373218585Sjkim
374218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
375218585Sjkim    AcpiOsPrintf ("ACPI Namespace (from %4.4s (%p) subtree):\n",
376218585Sjkim        ((ACPI_NAMESPACE_NODE *) SubtreeEntry)->Name.Ascii, SubtreeEntry);
377218585Sjkim
378218585Sjkim    /* Display the subtree */
379218585Sjkim
380218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
381218585Sjkim    AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth,
382218585Sjkim        ACPI_OWNER_ID_MAX, SubtreeEntry);
383218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
384218585Sjkim}
385218585Sjkim
386218585Sjkim
387218585Sjkim/*******************************************************************************
388218585Sjkim *
389254745Sjkim * FUNCTION:    AcpiDbDumpNamespacePaths
390254745Sjkim *
391254745Sjkim * PARAMETERS:  None
392254745Sjkim *
393254745Sjkim * RETURN:      None
394254745Sjkim *
395254745Sjkim * DESCRIPTION: Dump entire namespace with full object pathnames and object
396254745Sjkim *              type information. Alternative to "namespace" command.
397254745Sjkim *
398254745Sjkim ******************************************************************************/
399254745Sjkim
400254745Sjkimvoid
401254745SjkimAcpiDbDumpNamespacePaths (
402254745Sjkim    void)
403254745Sjkim{
404254745Sjkim
405254745Sjkim    AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
406254745Sjkim    AcpiOsPrintf ("ACPI Namespace (from root):\n");
407254745Sjkim
408254745Sjkim    /* Display the entire namespace */
409254745Sjkim
410254745Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
411254745Sjkim    AcpiNsDumpObjectPaths (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY,
412254745Sjkim        ACPI_UINT32_MAX, ACPI_OWNER_ID_MAX, AcpiGbl_RootNode);
413254745Sjkim
414254745Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
415254745Sjkim}
416254745Sjkim
417254745Sjkim
418254745Sjkim/*******************************************************************************
419254745Sjkim *
420218585Sjkim * FUNCTION:    AcpiDbDumpNamespaceByOwner
421218585Sjkim *
422218585Sjkim * PARAMETERS:  OwnerArg        - Owner ID whose nodes will be displayed
423218585Sjkim *              DepthArg        - Maximum tree depth to be dumped
424218585Sjkim *
425218585Sjkim * RETURN:      None
426218585Sjkim *
427218585Sjkim * DESCRIPTION: Dump elements of the namespace that are owned by the OwnerId.
428218585Sjkim *
429218585Sjkim ******************************************************************************/
430218585Sjkim
431218585Sjkimvoid
432218585SjkimAcpiDbDumpNamespaceByOwner (
433218585Sjkim    char                    *OwnerArg,
434218585Sjkim    char                    *DepthArg)
435218585Sjkim{
436218585Sjkim    ACPI_HANDLE             SubtreeEntry = AcpiGbl_RootNode;
437218585Sjkim    UINT32                  MaxDepth = ACPI_UINT32_MAX;
438218585Sjkim    ACPI_OWNER_ID           OwnerId;
439218585Sjkim
440218585Sjkim
441284583Sjkim    OwnerId = (ACPI_OWNER_ID) strtoul (OwnerArg, NULL, 0);
442218585Sjkim
443218585Sjkim    /* Now we can check for the depth argument */
444218585Sjkim
445218585Sjkim    if (DepthArg)
446218585Sjkim    {
447284583Sjkim        MaxDepth = strtoul (DepthArg, NULL, 0);
448218585Sjkim    }
449218585Sjkim
450218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
451218585Sjkim    AcpiOsPrintf ("ACPI Namespace by owner %X:\n", OwnerId);
452218585Sjkim
453218585Sjkim    /* Display the subtree */
454218585Sjkim
455218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
456287168Sjkim    AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth,
457287168Sjkim        OwnerId, SubtreeEntry);
458218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
459218585Sjkim}
460218585Sjkim
461218585Sjkim
462218585Sjkim/*******************************************************************************
463218585Sjkim *
464218585Sjkim * FUNCTION:    AcpiDbWalkAndMatchName
465218585Sjkim *
466218585Sjkim * PARAMETERS:  Callback from WalkNamespace
467218585Sjkim *
468218585Sjkim * RETURN:      Status
469218585Sjkim *
470241973Sjkim * DESCRIPTION: Find a particular name/names within the namespace. Wildcards
471218585Sjkim *              are supported -- '?' matches any character.
472218585Sjkim *
473218585Sjkim ******************************************************************************/
474218585Sjkim
475218585Sjkimstatic ACPI_STATUS
476218585SjkimAcpiDbWalkAndMatchName (
477218585Sjkim    ACPI_HANDLE             ObjHandle,
478218585Sjkim    UINT32                  NestingLevel,
479218585Sjkim    void                    *Context,
480218585Sjkim    void                    **ReturnValue)
481218585Sjkim{
482218585Sjkim    ACPI_STATUS             Status;
483218585Sjkim    char                    *RequestedName = (char *) Context;
484218585Sjkim    UINT32                  i;
485218585Sjkim    ACPI_BUFFER             Buffer;
486218585Sjkim    ACPI_WALK_INFO          Info;
487218585Sjkim
488218585Sjkim
489218585Sjkim    /* Check for a name match */
490218585Sjkim
491218585Sjkim    for (i = 0; i < 4; i++)
492218585Sjkim    {
493218585Sjkim        /* Wildcard support */
494218585Sjkim
495218585Sjkim        if ((RequestedName[i] != '?') &&
496287168Sjkim            (RequestedName[i] != ((ACPI_NAMESPACE_NODE *)
497287168Sjkim                ObjHandle)->Name.Ascii[i]))
498218585Sjkim        {
499218585Sjkim            /* No match, just exit */
500218585Sjkim
501218585Sjkim            return (AE_OK);
502218585Sjkim        }
503218585Sjkim    }
504218585Sjkim
505218585Sjkim    /* Get the full pathname to this object */
506218585Sjkim
507218585Sjkim    Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
508287168Sjkim    Status = AcpiNsHandleToPathname (ObjHandle, &Buffer, TRUE);
509218585Sjkim    if (ACPI_FAILURE (Status))
510218585Sjkim    {
511287168Sjkim        AcpiOsPrintf ("Could Not get pathname for object %p\n",
512287168Sjkim            ObjHandle);
513218585Sjkim    }
514218585Sjkim    else
515218585Sjkim    {
516218585Sjkim        Info.OwnerId = ACPI_OWNER_ID_MAX;
517218585Sjkim        Info.DebugLevel = ACPI_UINT32_MAX;
518218585Sjkim        Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
519218585Sjkim
520218585Sjkim        AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
521218585Sjkim        (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, &Info, NULL);
522218585Sjkim        ACPI_FREE (Buffer.Pointer);
523218585Sjkim    }
524218585Sjkim
525218585Sjkim    return (AE_OK);
526218585Sjkim}
527218585Sjkim
528218585Sjkim
529218585Sjkim/*******************************************************************************
530218585Sjkim *
531218585Sjkim * FUNCTION:    AcpiDbFindNameInNamespace
532218585Sjkim *
533218585Sjkim * PARAMETERS:  NameArg         - The 4-character ACPI name to find.
534218585Sjkim *                                wildcards are supported.
535218585Sjkim *
536218585Sjkim * RETURN:      None
537218585Sjkim *
538218585Sjkim * DESCRIPTION: Search the namespace for a given name (with wildcards)
539218585Sjkim *
540218585Sjkim ******************************************************************************/
541218585Sjkim
542218585SjkimACPI_STATUS
543218585SjkimAcpiDbFindNameInNamespace (
544218585Sjkim    char                    *NameArg)
545218585Sjkim{
546218585Sjkim    char                    AcpiName[5] = "____";
547218585Sjkim    char                    *AcpiNamePtr = AcpiName;
548218585Sjkim
549218585Sjkim
550287168Sjkim    if (strlen (NameArg) > ACPI_NAME_SIZE)
551218585Sjkim    {
552218585Sjkim        AcpiOsPrintf ("Name must be no longer than 4 characters\n");
553218585Sjkim        return (AE_OK);
554218585Sjkim    }
555218585Sjkim
556218585Sjkim    /* Pad out name with underscores as necessary to create a 4-char name */
557218585Sjkim
558218585Sjkim    AcpiUtStrupr (NameArg);
559218585Sjkim    while (*NameArg)
560218585Sjkim    {
561218585Sjkim        *AcpiNamePtr = *NameArg;
562218585Sjkim        AcpiNamePtr++;
563218585Sjkim        NameArg++;
564218585Sjkim    }
565218585Sjkim
566218585Sjkim    /* Walk the namespace from the root */
567218585Sjkim
568287168Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
569287168Sjkim        ACPI_UINT32_MAX, AcpiDbWalkAndMatchName, NULL, AcpiName, NULL);
570218585Sjkim
571218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
572218585Sjkim    return (AE_OK);
573218585Sjkim}
574218585Sjkim
575218585Sjkim
576218585Sjkim/*******************************************************************************
577218585Sjkim *
578218585Sjkim * FUNCTION:    AcpiDbWalkForPredefinedNames
579218585Sjkim *
580218585Sjkim * PARAMETERS:  Callback from WalkNamespace
581218585Sjkim *
582218585Sjkim * RETURN:      Status
583218585Sjkim *
584218585Sjkim * DESCRIPTION: Detect and display predefined ACPI names (names that start with
585218585Sjkim *              an underscore)
586218585Sjkim *
587218585Sjkim ******************************************************************************/
588218585Sjkim
589218585Sjkimstatic ACPI_STATUS
590218585SjkimAcpiDbWalkForPredefinedNames (
591218585Sjkim    ACPI_HANDLE             ObjHandle,
592218585Sjkim    UINT32                  NestingLevel,
593218585Sjkim    void                    *Context,
594218585Sjkim    void                    **ReturnValue)
595218585Sjkim{
596218585Sjkim    ACPI_NAMESPACE_NODE         *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
597218585Sjkim    UINT32                      *Count = (UINT32 *) Context;
598218585Sjkim    const ACPI_PREDEFINED_INFO  *Predefined;
599218585Sjkim    const ACPI_PREDEFINED_INFO  *Package = NULL;
600218585Sjkim    char                        *Pathname;
601249663Sjkim    char                        StringBuffer[48];
602218585Sjkim
603218585Sjkim
604249112Sjkim    Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii);
605218585Sjkim    if (!Predefined)
606218585Sjkim    {
607218585Sjkim        return (AE_OK);
608218585Sjkim    }
609218585Sjkim
610298714Sjkim    Pathname = AcpiNsGetNormalizedPathname (Node, TRUE);
611218585Sjkim    if (!Pathname)
612218585Sjkim    {
613218585Sjkim        return (AE_OK);
614218585Sjkim    }
615218585Sjkim
616218585Sjkim    /* If method returns a package, the info is in the next table entry */
617218585Sjkim
618249112Sjkim    if (Predefined->Info.ExpectedBtypes & ACPI_RTYPE_PACKAGE)
619218585Sjkim    {
620218585Sjkim        Package = Predefined + 1;
621218585Sjkim    }
622218585Sjkim
623249663Sjkim    AcpiUtGetExpectedReturnTypes (StringBuffer,
624249112Sjkim        Predefined->Info.ExpectedBtypes);
625218585Sjkim
626249663Sjkim    AcpiOsPrintf ("%-32s Arguments %X, Return Types: %s", Pathname,
627249663Sjkim        METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList),
628249663Sjkim        StringBuffer);
629249663Sjkim
630218585Sjkim    if (Package)
631218585Sjkim    {
632249663Sjkim        AcpiOsPrintf (" (PkgType %2.2X, ObjType %2.2X, Count %2.2X)",
633218585Sjkim            Package->RetInfo.Type, Package->RetInfo.ObjectType1,
634218585Sjkim            Package->RetInfo.Count1);
635218585Sjkim    }
636218585Sjkim
637218585Sjkim    AcpiOsPrintf("\n");
638218585Sjkim
639249663Sjkim    /* Check that the declared argument count matches the ACPI spec */
640249663Sjkim
641249663Sjkim    AcpiNsCheckAcpiCompliance (Pathname, Node, Predefined);
642249663Sjkim
643218585Sjkim    ACPI_FREE (Pathname);
644218585Sjkim    (*Count)++;
645218585Sjkim    return (AE_OK);
646218585Sjkim}
647218585Sjkim
648218585Sjkim
649218585Sjkim/*******************************************************************************
650218585Sjkim *
651218585Sjkim * FUNCTION:    AcpiDbCheckPredefinedNames
652218585Sjkim *
653218585Sjkim * PARAMETERS:  None
654218585Sjkim *
655218585Sjkim * RETURN:      None
656218585Sjkim *
657218585Sjkim * DESCRIPTION: Validate all predefined names in the namespace
658218585Sjkim *
659218585Sjkim ******************************************************************************/
660218585Sjkim
661218585Sjkimvoid
662218585SjkimAcpiDbCheckPredefinedNames (
663218585Sjkim    void)
664218585Sjkim{
665218585Sjkim    UINT32                  Count = 0;
666218585Sjkim
667218585Sjkim
668218585Sjkim    /* Search all nodes in namespace */
669218585Sjkim
670287168Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
671298714Sjkim        ACPI_UINT32_MAX, AcpiDbWalkForPredefinedNames,
672298714Sjkim        NULL, (void *) &Count, NULL);
673218585Sjkim
674218585Sjkim    AcpiOsPrintf ("Found %u predefined names in the namespace\n", Count);
675218585Sjkim}
676218585Sjkim
677218585Sjkim
678218585Sjkim/*******************************************************************************
679218585Sjkim *
680287168Sjkim * FUNCTION:    AcpiDbWalkForObjectCounts
681287168Sjkim *
682287168Sjkim * PARAMETERS:  Callback from WalkNamespace
683287168Sjkim *
684287168Sjkim * RETURN:      Status
685287168Sjkim *
686287168Sjkim * DESCRIPTION: Display short info about objects in the namespace
687287168Sjkim *
688287168Sjkim ******************************************************************************/
689287168Sjkim
690287168Sjkimstatic ACPI_STATUS
691287168SjkimAcpiDbWalkForObjectCounts (
692287168Sjkim    ACPI_HANDLE             ObjHandle,
693287168Sjkim    UINT32                  NestingLevel,
694287168Sjkim    void                    *Context,
695287168Sjkim    void                    **ReturnValue)
696287168Sjkim{
697287168Sjkim    ACPI_OBJECT_INFO        *Info = (ACPI_OBJECT_INFO *) Context;
698287168Sjkim    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
699287168Sjkim
700287168Sjkim
701287168Sjkim    if (Node->Type > ACPI_TYPE_NS_NODE_MAX)
702287168Sjkim    {
703287168Sjkim        AcpiOsPrintf ("[%4.4s]: Unknown object type %X\n",
704287168Sjkim            Node->Name.Ascii, Node->Type);
705287168Sjkim    }
706287168Sjkim    else
707287168Sjkim    {
708287168Sjkim        Info->Types[Node->Type]++;
709287168Sjkim    }
710287168Sjkim
711287168Sjkim    return (AE_OK);
712287168Sjkim}
713287168Sjkim
714287168Sjkim
715287168Sjkim/*******************************************************************************
716287168Sjkim *
717218585Sjkim * FUNCTION:    AcpiDbWalkForSpecificObjects
718218585Sjkim *
719218585Sjkim * PARAMETERS:  Callback from WalkNamespace
720218585Sjkim *
721218585Sjkim * RETURN:      Status
722218585Sjkim *
723218585Sjkim * DESCRIPTION: Display short info about objects in the namespace
724218585Sjkim *
725218585Sjkim ******************************************************************************/
726218585Sjkim
727218585Sjkimstatic ACPI_STATUS
728218585SjkimAcpiDbWalkForSpecificObjects (
729218585Sjkim    ACPI_HANDLE             ObjHandle,
730218585Sjkim    UINT32                  NestingLevel,
731218585Sjkim    void                    *Context,
732218585Sjkim    void                    **ReturnValue)
733218585Sjkim{
734218585Sjkim    ACPI_WALK_INFO          *Info = (ACPI_WALK_INFO *) Context;
735218585Sjkim    ACPI_BUFFER             Buffer;
736218585Sjkim    ACPI_STATUS             Status;
737218585Sjkim
738218585Sjkim
739218585Sjkim    Info->Count++;
740218585Sjkim
741218585Sjkim    /* Get and display the full pathname to this object */
742218585Sjkim
743218585Sjkim    Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
744287168Sjkim    Status = AcpiNsHandleToPathname (ObjHandle, &Buffer, TRUE);
745218585Sjkim    if (ACPI_FAILURE (Status))
746218585Sjkim    {
747218585Sjkim        AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
748218585Sjkim        return (AE_OK);
749218585Sjkim    }
750218585Sjkim
751218585Sjkim    AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
752218585Sjkim    ACPI_FREE (Buffer.Pointer);
753218585Sjkim
754218585Sjkim    /* Dump short info about the object */
755218585Sjkim
756218585Sjkim    (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, Info, NULL);
757218585Sjkim    return (AE_OK);
758218585Sjkim}
759218585Sjkim
760218585Sjkim
761218585Sjkim/*******************************************************************************
762218585Sjkim *
763218585Sjkim * FUNCTION:    AcpiDbDisplayObjects
764218585Sjkim *
765218585Sjkim * PARAMETERS:  ObjTypeArg          - Type of object to display
766218585Sjkim *              DisplayCountArg     - Max depth to display
767218585Sjkim *
768218585Sjkim * RETURN:      None
769218585Sjkim *
770218585Sjkim * DESCRIPTION: Display objects in the namespace of the requested type
771218585Sjkim *
772218585Sjkim ******************************************************************************/
773218585Sjkim
774218585SjkimACPI_STATUS
775218585SjkimAcpiDbDisplayObjects (
776218585Sjkim    char                    *ObjTypeArg,
777218585Sjkim    char                    *DisplayCountArg)
778218585Sjkim{
779218585Sjkim    ACPI_WALK_INFO          Info;
780218585Sjkim    ACPI_OBJECT_TYPE        Type;
781287168Sjkim    ACPI_OBJECT_INFO        *ObjectInfo;
782287168Sjkim    UINT32                  i;
783287168Sjkim    UINT32                  TotalObjects = 0;
784218585Sjkim
785218585Sjkim
786287168Sjkim    /* No argument means display summary/count of all object types */
787287168Sjkim
788287168Sjkim    if (!ObjTypeArg)
789287168Sjkim    {
790287168Sjkim        ObjectInfo = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_OBJECT_INFO));
791287168Sjkim
792287168Sjkim        /* Walk the namespace from the root */
793287168Sjkim
794287168Sjkim        (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
795287168Sjkim            ACPI_UINT32_MAX, AcpiDbWalkForObjectCounts, NULL,
796287168Sjkim            (void *) ObjectInfo, NULL);
797287168Sjkim
798287168Sjkim        AcpiOsPrintf ("\nSummary of namespace objects:\n\n");
799287168Sjkim
800287168Sjkim        for (i = 0; i < ACPI_TOTAL_TYPES; i++)
801287168Sjkim        {
802287168Sjkim            AcpiOsPrintf ("%8u   %s\n", ObjectInfo->Types[i],
803287168Sjkim                AcpiUtGetTypeName (i));
804287168Sjkim
805287168Sjkim            TotalObjects += ObjectInfo->Types[i];
806287168Sjkim        }
807287168Sjkim
808287168Sjkim        AcpiOsPrintf ("\n%8u   Total namespace objects\n\n",
809287168Sjkim            TotalObjects);
810287168Sjkim
811287168Sjkim        ACPI_FREE (ObjectInfo);
812287168Sjkim        return (AE_OK);
813287168Sjkim    }
814287168Sjkim
815218585Sjkim    /* Get the object type */
816218585Sjkim
817218585Sjkim    Type = AcpiDbMatchArgument (ObjTypeArg, AcpiDbObjectTypes);
818218585Sjkim    if (Type == ACPI_TYPE_NOT_FOUND)
819218585Sjkim    {
820218585Sjkim        AcpiOsPrintf ("Invalid or unsupported argument\n");
821218585Sjkim        return (AE_OK);
822218585Sjkim    }
823218585Sjkim
824218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
825218585Sjkim    AcpiOsPrintf (
826218585Sjkim        "Objects of type [%s] defined in the current ACPI Namespace:\n",
827218585Sjkim        AcpiUtGetTypeName (Type));
828218585Sjkim
829218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
830218585Sjkim
831218585Sjkim    Info.Count = 0;
832218585Sjkim    Info.OwnerId = ACPI_OWNER_ID_MAX;
833218585Sjkim    Info.DebugLevel = ACPI_UINT32_MAX;
834218585Sjkim    Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
835218585Sjkim
836218585Sjkim    /* Walk the namespace from the root */
837218585Sjkim
838218585Sjkim    (void) AcpiWalkNamespace (Type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
839287168Sjkim        AcpiDbWalkForSpecificObjects, NULL, (void *) &Info, NULL);
840218585Sjkim
841218585Sjkim    AcpiOsPrintf (
842218585Sjkim        "\nFound %u objects of type [%s] in the current ACPI Namespace\n",
843218585Sjkim        Info.Count, AcpiUtGetTypeName (Type));
844218585Sjkim
845218585Sjkim    AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
846218585Sjkim    return (AE_OK);
847218585Sjkim}
848218585Sjkim
849218585Sjkim
850218585Sjkim/*******************************************************************************
851218585Sjkim *
852218585Sjkim * FUNCTION:    AcpiDbIntegrityWalk
853218585Sjkim *
854218585Sjkim * PARAMETERS:  Callback from WalkNamespace
855218585Sjkim *
856218585Sjkim * RETURN:      Status
857218585Sjkim *
858218585Sjkim * DESCRIPTION: Examine one NS node for valid values.
859218585Sjkim *
860218585Sjkim ******************************************************************************/
861218585Sjkim
862218585Sjkimstatic ACPI_STATUS
863218585SjkimAcpiDbIntegrityWalk (
864218585Sjkim    ACPI_HANDLE             ObjHandle,
865218585Sjkim    UINT32                  NestingLevel,
866218585Sjkim    void                    *Context,
867218585Sjkim    void                    **ReturnValue)
868218585Sjkim{
869218585Sjkim    ACPI_INTEGRITY_INFO     *Info = (ACPI_INTEGRITY_INFO *) Context;
870218585Sjkim    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
871218585Sjkim    ACPI_OPERAND_OBJECT     *Object;
872218585Sjkim    BOOLEAN                 Alias = TRUE;
873218585Sjkim
874218585Sjkim
875218585Sjkim    Info->Nodes++;
876218585Sjkim
877218585Sjkim    /* Verify the NS node, and dereference aliases */
878218585Sjkim
879218585Sjkim    while (Alias)
880218585Sjkim    {
881218585Sjkim        if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
882218585Sjkim        {
883287168Sjkim            AcpiOsPrintf (
884287168Sjkim                "Invalid Descriptor Type for Node %p [%s] - "
885287168Sjkim                "is %2.2X should be %2.2X\n",
886287168Sjkim                Node, AcpiUtGetDescriptorName (Node),
887287168Sjkim                ACPI_GET_DESCRIPTOR_TYPE (Node), ACPI_DESC_TYPE_NAMED);
888218585Sjkim            return (AE_OK);
889218585Sjkim        }
890218585Sjkim
891218585Sjkim        if ((Node->Type == ACPI_TYPE_LOCAL_ALIAS)  ||
892218585Sjkim            (Node->Type == ACPI_TYPE_LOCAL_METHOD_ALIAS))
893218585Sjkim        {
894218585Sjkim            Node = (ACPI_NAMESPACE_NODE *) Node->Object;
895218585Sjkim        }
896218585Sjkim        else
897218585Sjkim        {
898218585Sjkim            Alias = FALSE;
899218585Sjkim        }
900218585Sjkim    }
901218585Sjkim
902218585Sjkim    if (Node->Type > ACPI_TYPE_LOCAL_MAX)
903218585Sjkim    {
904218585Sjkim        AcpiOsPrintf ("Invalid Object Type for Node %p, Type = %X\n",
905218585Sjkim            Node, Node->Type);
906218585Sjkim        return (AE_OK);
907218585Sjkim    }
908218585Sjkim
909298714Sjkim    if (!AcpiUtValidNameseg (Node->Name.Ascii))
910218585Sjkim    {
911218585Sjkim        AcpiOsPrintf ("Invalid AcpiName for Node %p\n", Node);
912218585Sjkim        return (AE_OK);
913218585Sjkim    }
914218585Sjkim
915218585Sjkim    Object = AcpiNsGetAttachedObject (Node);
916218585Sjkim    if (Object)
917218585Sjkim    {
918218585Sjkim        Info->Objects++;
919218585Sjkim        if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
920218585Sjkim        {
921218585Sjkim            AcpiOsPrintf ("Invalid Descriptor Type for Object %p [%s]\n",
922218585Sjkim                Object, AcpiUtGetDescriptorName (Object));
923218585Sjkim        }
924218585Sjkim    }
925218585Sjkim
926218585Sjkim    return (AE_OK);
927218585Sjkim}
928218585Sjkim
929218585Sjkim
930218585Sjkim/*******************************************************************************
931218585Sjkim *
932218585Sjkim * FUNCTION:    AcpiDbCheckIntegrity
933218585Sjkim *
934218585Sjkim * PARAMETERS:  None
935218585Sjkim *
936218585Sjkim * RETURN:      None
937218585Sjkim *
938218585Sjkim * DESCRIPTION: Check entire namespace for data structure integrity
939218585Sjkim *
940218585Sjkim ******************************************************************************/
941218585Sjkim
942218585Sjkimvoid
943218585SjkimAcpiDbCheckIntegrity (
944218585Sjkim    void)
945218585Sjkim{
946218585Sjkim    ACPI_INTEGRITY_INFO     Info = {0,0};
947218585Sjkim
948218585Sjkim    /* Search all nodes in namespace */
949218585Sjkim
950287168Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
951287168Sjkim        ACPI_UINT32_MAX, AcpiDbIntegrityWalk, NULL, (void *) &Info, NULL);
952218585Sjkim
953218585Sjkim    AcpiOsPrintf ("Verified %u namespace nodes with %u Objects\n",
954218585Sjkim        Info.Nodes, Info.Objects);
955218585Sjkim}
956218585Sjkim
957218585Sjkim
958218585Sjkim/*******************************************************************************
959218585Sjkim *
960218585Sjkim * FUNCTION:    AcpiDbWalkForReferences
961218585Sjkim *
962218585Sjkim * PARAMETERS:  Callback from WalkNamespace
963218585Sjkim *
964218585Sjkim * RETURN:      Status
965218585Sjkim *
966218585Sjkim * DESCRIPTION: Check if this namespace object refers to the target object
967218585Sjkim *              that is passed in as the context value.
968218585Sjkim *
969218585Sjkim * Note: Currently doesn't check subobjects within the Node's object
970218585Sjkim *
971218585Sjkim ******************************************************************************/
972218585Sjkim
973218585Sjkimstatic ACPI_STATUS
974218585SjkimAcpiDbWalkForReferences (
975218585Sjkim    ACPI_HANDLE             ObjHandle,
976218585Sjkim    UINT32                  NestingLevel,
977218585Sjkim    void                    *Context,
978218585Sjkim    void                    **ReturnValue)
979218585Sjkim{
980218585Sjkim    ACPI_OPERAND_OBJECT     *ObjDesc = (ACPI_OPERAND_OBJECT  *) Context;
981218585Sjkim    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
982218585Sjkim
983218585Sjkim
984218585Sjkim    /* Check for match against the namespace node itself */
985218585Sjkim
986218585Sjkim    if (Node == (void *) ObjDesc)
987218585Sjkim    {
988218585Sjkim        AcpiOsPrintf ("Object is a Node [%4.4s]\n",
989218585Sjkim            AcpiUtGetNodeName (Node));
990218585Sjkim    }
991218585Sjkim
992218585Sjkim    /* Check for match against the object attached to the node */
993218585Sjkim
994218585Sjkim    if (AcpiNsGetAttachedObject (Node) == ObjDesc)
995218585Sjkim    {
996218585Sjkim        AcpiOsPrintf ("Reference at Node->Object %p [%4.4s]\n",
997218585Sjkim            Node, AcpiUtGetNodeName (Node));
998218585Sjkim    }
999218585Sjkim
1000218585Sjkim    return (AE_OK);
1001218585Sjkim}
1002218585Sjkim
1003218585Sjkim
1004218585Sjkim/*******************************************************************************
1005218585Sjkim *
1006218585Sjkim * FUNCTION:    AcpiDbFindReferences
1007218585Sjkim *
1008218585Sjkim * PARAMETERS:  ObjectArg       - String with hex value of the object
1009218585Sjkim *
1010218585Sjkim * RETURN:      None
1011218585Sjkim *
1012218585Sjkim * DESCRIPTION: Search namespace for all references to the input object
1013218585Sjkim *
1014218585Sjkim ******************************************************************************/
1015218585Sjkim
1016218585Sjkimvoid
1017218585SjkimAcpiDbFindReferences (
1018218585Sjkim    char                    *ObjectArg)
1019218585Sjkim{
1020218585Sjkim    ACPI_OPERAND_OBJECT     *ObjDesc;
1021252279Sjkim    ACPI_SIZE               Address;
1022218585Sjkim
1023218585Sjkim
1024218585Sjkim    /* Convert string to object pointer */
1025218585Sjkim
1026284583Sjkim    Address = strtoul (ObjectArg, NULL, 16);
1027252279Sjkim    ObjDesc = ACPI_TO_POINTER (Address);
1028218585Sjkim
1029218585Sjkim    /* Search all nodes in namespace */
1030218585Sjkim
1031287168Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
1032287168Sjkim        ACPI_UINT32_MAX, AcpiDbWalkForReferences, NULL,
1033287168Sjkim        (void *) ObjDesc, NULL);
1034218585Sjkim}
1035218585Sjkim
1036218585Sjkim
1037218585Sjkim/*******************************************************************************
1038218585Sjkim *
1039218585Sjkim * FUNCTION:    AcpiDbBusWalk
1040218585Sjkim *
1041218585Sjkim * PARAMETERS:  Callback from WalkNamespace
1042218585Sjkim *
1043218585Sjkim * RETURN:      Status
1044218585Sjkim *
1045218585Sjkim * DESCRIPTION: Display info about device objects that have a corresponding
1046218585Sjkim *              _PRT method.
1047218585Sjkim *
1048218585Sjkim ******************************************************************************/
1049218585Sjkim
1050218585Sjkimstatic ACPI_STATUS
1051218585SjkimAcpiDbBusWalk (
1052218585Sjkim    ACPI_HANDLE             ObjHandle,
1053218585Sjkim    UINT32                  NestingLevel,
1054218585Sjkim    void                    *Context,
1055218585Sjkim    void                    **ReturnValue)
1056218585Sjkim{
1057218585Sjkim    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
1058218585Sjkim    ACPI_STATUS             Status;
1059218585Sjkim    ACPI_BUFFER             Buffer;
1060218585Sjkim    ACPI_NAMESPACE_NODE     *TempNode;
1061218585Sjkim    ACPI_DEVICE_INFO        *Info;
1062218585Sjkim    UINT32                  i;
1063218585Sjkim
1064218585Sjkim
1065218585Sjkim    if ((Node->Type != ACPI_TYPE_DEVICE) &&
1066218585Sjkim        (Node->Type != ACPI_TYPE_PROCESSOR))
1067218585Sjkim    {
1068218585Sjkim        return (AE_OK);
1069218585Sjkim    }
1070218585Sjkim
1071218585Sjkim    /* Exit if there is no _PRT under this device */
1072218585Sjkim
1073218585Sjkim    Status = AcpiGetHandle (Node, METHOD_NAME__PRT,
1074298714Sjkim        ACPI_CAST_PTR (ACPI_HANDLE, &TempNode));
1075218585Sjkim    if (ACPI_FAILURE (Status))
1076218585Sjkim    {
1077218585Sjkim        return (AE_OK);
1078218585Sjkim    }
1079218585Sjkim
1080218585Sjkim    /* Get the full path to this device object */
1081218585Sjkim
1082218585Sjkim    Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
1083287168Sjkim    Status = AcpiNsHandleToPathname (ObjHandle, &Buffer, TRUE);
1084218585Sjkim    if (ACPI_FAILURE (Status))
1085218585Sjkim    {
1086287168Sjkim        AcpiOsPrintf ("Could Not get pathname for object %p\n",
1087287168Sjkim            ObjHandle);
1088218585Sjkim        return (AE_OK);
1089218585Sjkim    }
1090218585Sjkim
1091218585Sjkim    Status = AcpiGetObjectInfo (ObjHandle, &Info);
1092218585Sjkim    if (ACPI_FAILURE (Status))
1093218585Sjkim    {
1094218585Sjkim        return (AE_OK);
1095218585Sjkim    }
1096218585Sjkim
1097218585Sjkim    /* Display the full path */
1098218585Sjkim
1099218585Sjkim    AcpiOsPrintf ("%-32s Type %X", (char *) Buffer.Pointer, Node->Type);
1100218585Sjkim    ACPI_FREE (Buffer.Pointer);
1101218585Sjkim
1102218585Sjkim    if (Info->Flags & ACPI_PCI_ROOT_BRIDGE)
1103218585Sjkim    {
1104218585Sjkim        AcpiOsPrintf ("  - Is PCI Root Bridge");
1105218585Sjkim    }
1106218585Sjkim    AcpiOsPrintf ("\n");
1107218585Sjkim
1108218585Sjkim    /* _PRT info */
1109218585Sjkim
1110218585Sjkim    AcpiOsPrintf ("_PRT: %p\n", TempNode);
1111218585Sjkim
1112218585Sjkim    /* Dump _ADR, _HID, _UID, _CID */
1113218585Sjkim
1114218585Sjkim    if (Info->Valid & ACPI_VALID_ADR)
1115218585Sjkim    {
1116287168Sjkim        AcpiOsPrintf ("_ADR: %8.8X%8.8X\n",
1117287168Sjkim            ACPI_FORMAT_UINT64 (Info->Address));
1118218585Sjkim    }
1119218585Sjkim    else
1120218585Sjkim    {
1121218585Sjkim        AcpiOsPrintf ("_ADR: <Not Present>\n");
1122218585Sjkim    }
1123218585Sjkim
1124218585Sjkim    if (Info->Valid & ACPI_VALID_HID)
1125218585Sjkim    {
1126218585Sjkim        AcpiOsPrintf ("_HID: %s\n", Info->HardwareId.String);
1127218585Sjkim    }
1128218585Sjkim    else
1129218585Sjkim    {
1130218585Sjkim        AcpiOsPrintf ("_HID: <Not Present>\n");
1131218585Sjkim    }
1132218585Sjkim
1133218585Sjkim    if (Info->Valid & ACPI_VALID_UID)
1134218585Sjkim    {
1135218585Sjkim        AcpiOsPrintf ("_UID: %s\n", Info->UniqueId.String);
1136218585Sjkim    }
1137218585Sjkim    else
1138218585Sjkim    {
1139218585Sjkim        AcpiOsPrintf ("_UID: <Not Present>\n");
1140218585Sjkim    }
1141218585Sjkim
1142218585Sjkim    if (Info->Valid & ACPI_VALID_CID)
1143218585Sjkim    {
1144218585Sjkim        for (i = 0; i < Info->CompatibleIdList.Count; i++)
1145218585Sjkim        {
1146218585Sjkim            AcpiOsPrintf ("_CID: %s\n",
1147218585Sjkim                Info->CompatibleIdList.Ids[i].String);
1148218585Sjkim        }
1149218585Sjkim    }
1150218585Sjkim    else
1151218585Sjkim    {
1152218585Sjkim        AcpiOsPrintf ("_CID: <Not Present>\n");
1153218585Sjkim    }
1154218585Sjkim
1155218585Sjkim    ACPI_FREE (Info);
1156218585Sjkim    return (AE_OK);
1157218585Sjkim}
1158218585Sjkim
1159218585Sjkim
1160218585Sjkim/*******************************************************************************
1161218585Sjkim *
1162218585Sjkim * FUNCTION:    AcpiDbGetBusInfo
1163218585Sjkim *
1164218585Sjkim * PARAMETERS:  None
1165218585Sjkim *
1166218585Sjkim * RETURN:      None
1167218585Sjkim *
1168218585Sjkim * DESCRIPTION: Display info about system busses.
1169218585Sjkim *
1170218585Sjkim ******************************************************************************/
1171218585Sjkim
1172218585Sjkimvoid
1173218585SjkimAcpiDbGetBusInfo (
1174218585Sjkim    void)
1175218585Sjkim{
1176218585Sjkim    /* Search all nodes in namespace */
1177218585Sjkim
1178287168Sjkim    (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
1179287168Sjkim        ACPI_UINT32_MAX, AcpiDbBusWalk, NULL, NULL, NULL);
1180218585Sjkim}
1181