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