dbnames.c revision 249663
1218585Sjkim/******************************************************************************* 2218585Sjkim * 3218585Sjkim * Module Name: dbnames - Debugger commands for the acpi namespace 4218585Sjkim * 5218585Sjkim ******************************************************************************/ 6218585Sjkim 7218585Sjkim/* 8245582Sjkim * Copyright (C) 2000 - 2013, Intel Corp. 9218585Sjkim * All rights reserved. 10218585Sjkim * 11218585Sjkim * Redistribution and use in source and binary forms, with or without 12218585Sjkim * modification, are permitted provided that the following conditions 13218585Sjkim * are met: 14218585Sjkim * 1. Redistributions of source code must retain the above copyright 15218585Sjkim * notice, this list of conditions, and the following disclaimer, 16218585Sjkim * without modification. 17218585Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18218585Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19218585Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20218585Sjkim * including a substantially similar Disclaimer requirement for further 21218585Sjkim * binary redistribution. 22218585Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23218585Sjkim * of any contributors may be used to endorse or promote products derived 24218585Sjkim * from this software without specific prior written permission. 25218585Sjkim * 26218585Sjkim * Alternatively, this software may be distributed under the terms of the 27218585Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28218585Sjkim * Software Foundation. 29218585Sjkim * 30218585Sjkim * NO WARRANTY 31218585Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32218585Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33218585Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34218585Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35218585Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36218585Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37218585Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38218585Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39218585Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40218585Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41218585Sjkim * POSSIBILITY OF SUCH DAMAGES. 42218585Sjkim */ 43218585Sjkim 44218585Sjkim 45218590Sjkim#include <contrib/dev/acpica/include/acpi.h> 46218590Sjkim#include <contrib/dev/acpica/include/accommon.h> 47218590Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 48218590Sjkim#include <contrib/dev/acpica/include/acdebug.h> 49249112Sjkim#include <contrib/dev/acpica/include/acpredef.h> 50218585Sjkim 51218585Sjkim 52218585Sjkim#ifdef ACPI_DEBUGGER 53218585Sjkim 54218585Sjkim#define _COMPONENT ACPI_CA_DEBUGGER 55218585Sjkim ACPI_MODULE_NAME ("dbnames") 56218585Sjkim 57218585Sjkim 58218585Sjkim/* Local prototypes */ 59218585Sjkim 60218585Sjkimstatic ACPI_STATUS 61218585SjkimAcpiDbWalkAndMatchName ( 62218585Sjkim ACPI_HANDLE ObjHandle, 63218585Sjkim UINT32 NestingLevel, 64218585Sjkim void *Context, 65218585Sjkim void **ReturnValue); 66218585Sjkim 67218585Sjkimstatic ACPI_STATUS 68218585SjkimAcpiDbWalkForPredefinedNames ( 69218585Sjkim ACPI_HANDLE ObjHandle, 70218585Sjkim UINT32 NestingLevel, 71218585Sjkim void *Context, 72218585Sjkim void **ReturnValue); 73218585Sjkim 74218585Sjkimstatic ACPI_STATUS 75218585SjkimAcpiDbWalkForSpecificObjects ( 76218585Sjkim ACPI_HANDLE ObjHandle, 77218585Sjkim UINT32 NestingLevel, 78218585Sjkim void *Context, 79218585Sjkim void **ReturnValue); 80218585Sjkim 81218585Sjkimstatic ACPI_STATUS 82218585SjkimAcpiDbIntegrityWalk ( 83218585Sjkim ACPI_HANDLE ObjHandle, 84218585Sjkim UINT32 NestingLevel, 85218585Sjkim void *Context, 86218585Sjkim void **ReturnValue); 87218585Sjkim 88218585Sjkimstatic ACPI_STATUS 89218585SjkimAcpiDbWalkForReferences ( 90218585Sjkim ACPI_HANDLE ObjHandle, 91218585Sjkim UINT32 NestingLevel, 92218585Sjkim void *Context, 93218585Sjkim void **ReturnValue); 94218585Sjkim 95218585Sjkimstatic ACPI_STATUS 96218585SjkimAcpiDbBusWalk ( 97218585Sjkim ACPI_HANDLE ObjHandle, 98218585Sjkim UINT32 NestingLevel, 99218585Sjkim void *Context, 100218585Sjkim void **ReturnValue); 101218585Sjkim 102218585Sjkim/* 103218585Sjkim * Arguments for the Objects command 104218585Sjkim * These object types map directly to the ACPI_TYPES 105218585Sjkim */ 106240716Sjkimstatic ACPI_DB_ARGUMENT_INFO AcpiDbObjectTypes [] = 107218585Sjkim{ 108218585Sjkim {"ANY"}, 109218585Sjkim {"INTEGERS"}, 110218585Sjkim {"STRINGS"}, 111218585Sjkim {"BUFFERS"}, 112218585Sjkim {"PACKAGES"}, 113218585Sjkim {"FIELDS"}, 114218585Sjkim {"DEVICES"}, 115218585Sjkim {"EVENTS"}, 116218585Sjkim {"METHODS"}, 117218585Sjkim {"MUTEXES"}, 118218585Sjkim {"REGIONS"}, 119218585Sjkim {"POWERRESOURCES"}, 120218585Sjkim {"PROCESSORS"}, 121218585Sjkim {"THERMALZONES"}, 122218585Sjkim {"BUFFERFIELDS"}, 123218585Sjkim {"DDBHANDLES"}, 124218585Sjkim {"DEBUG"}, 125218585Sjkim {"REGIONFIELDS"}, 126218585Sjkim {"BANKFIELDS"}, 127218585Sjkim {"INDEXFIELDS"}, 128218585Sjkim {"REFERENCES"}, 129218585Sjkim {"ALIAS"}, 130218585Sjkim {NULL} /* Must be null terminated */ 131218585Sjkim}; 132218585Sjkim 133218585Sjkim 134218585Sjkim/******************************************************************************* 135218585Sjkim * 136218585Sjkim * FUNCTION: AcpiDbSetScope 137218585Sjkim * 138218585Sjkim * PARAMETERS: Name - New scope path 139218585Sjkim * 140218585Sjkim * RETURN: Status 141218585Sjkim * 142218585Sjkim * DESCRIPTION: Set the "current scope" as maintained by this utility. 143218585Sjkim * The scope is used as a prefix to ACPI paths. 144218585Sjkim * 145218585Sjkim ******************************************************************************/ 146218585Sjkim 147218585Sjkimvoid 148218585SjkimAcpiDbSetScope ( 149218585Sjkim char *Name) 150218585Sjkim{ 151218585Sjkim ACPI_STATUS Status; 152218585Sjkim ACPI_NAMESPACE_NODE *Node; 153218585Sjkim 154218585Sjkim 155218585Sjkim if (!Name || Name[0] == 0) 156218585Sjkim { 157218585Sjkim AcpiOsPrintf ("Current scope: %s\n", AcpiGbl_DbScopeBuf); 158218585Sjkim return; 159218585Sjkim } 160218585Sjkim 161218585Sjkim AcpiDbPrepNamestring (Name); 162218585Sjkim 163245582Sjkim if (ACPI_IS_ROOT_PREFIX (Name[0])) 164218585Sjkim { 165218585Sjkim /* Validate new scope from the root */ 166218585Sjkim 167218585Sjkim Status = AcpiNsGetNode (AcpiGbl_RootNode, Name, ACPI_NS_NO_UPSEARCH, 168218585Sjkim &Node); 169218585Sjkim if (ACPI_FAILURE (Status)) 170218585Sjkim { 171218585Sjkim goto ErrorExit; 172218585Sjkim } 173218585Sjkim 174218585Sjkim ACPI_STRCPY (AcpiGbl_DbScopeBuf, Name); 175218585Sjkim ACPI_STRCAT (AcpiGbl_DbScopeBuf, "\\"); 176218585Sjkim } 177218585Sjkim else 178218585Sjkim { 179218585Sjkim /* Validate new scope relative to old scope */ 180218585Sjkim 181218585Sjkim Status = AcpiNsGetNode (AcpiGbl_DbScopeNode, Name, ACPI_NS_NO_UPSEARCH, 182218585Sjkim &Node); 183218585Sjkim if (ACPI_FAILURE (Status)) 184218585Sjkim { 185218585Sjkim goto ErrorExit; 186218585Sjkim } 187218585Sjkim 188218585Sjkim ACPI_STRCAT (AcpiGbl_DbScopeBuf, Name); 189218585Sjkim ACPI_STRCAT (AcpiGbl_DbScopeBuf, "\\"); 190218585Sjkim } 191218585Sjkim 192218585Sjkim AcpiGbl_DbScopeNode = Node; 193218585Sjkim AcpiOsPrintf ("New scope: %s\n", AcpiGbl_DbScopeBuf); 194218585Sjkim return; 195218585Sjkim 196218585SjkimErrorExit: 197218585Sjkim 198218585Sjkim AcpiOsPrintf ("Could not attach scope: %s, %s\n", 199218585Sjkim Name, AcpiFormatException (Status)); 200218585Sjkim} 201218585Sjkim 202218585Sjkim 203218585Sjkim/******************************************************************************* 204218585Sjkim * 205218585Sjkim * FUNCTION: AcpiDbDumpNamespace 206218585Sjkim * 207218585Sjkim * PARAMETERS: StartArg - Node to begin namespace dump 208218585Sjkim * DepthArg - Maximum tree depth to be dumped 209218585Sjkim * 210218585Sjkim * RETURN: None 211218585Sjkim * 212241973Sjkim * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed 213218585Sjkim * with type and other information. 214218585Sjkim * 215218585Sjkim ******************************************************************************/ 216218585Sjkim 217218585Sjkimvoid 218218585SjkimAcpiDbDumpNamespace ( 219218585Sjkim char *StartArg, 220218585Sjkim char *DepthArg) 221218585Sjkim{ 222218585Sjkim ACPI_HANDLE SubtreeEntry = AcpiGbl_RootNode; 223218585Sjkim UINT32 MaxDepth = ACPI_UINT32_MAX; 224218585Sjkim 225218585Sjkim 226218585Sjkim /* No argument given, just start at the root and dump entire namespace */ 227218585Sjkim 228218585Sjkim if (StartArg) 229218585Sjkim { 230218585Sjkim SubtreeEntry = AcpiDbConvertToNode (StartArg); 231218585Sjkim if (!SubtreeEntry) 232218585Sjkim { 233218585Sjkim return; 234218585Sjkim } 235218585Sjkim 236218585Sjkim /* Now we can check for the depth argument */ 237218585Sjkim 238218585Sjkim if (DepthArg) 239218585Sjkim { 240218585Sjkim MaxDepth = ACPI_STRTOUL (DepthArg, NULL, 0); 241218585Sjkim } 242218585Sjkim } 243218585Sjkim 244218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT); 245218585Sjkim AcpiOsPrintf ("ACPI Namespace (from %4.4s (%p) subtree):\n", 246218585Sjkim ((ACPI_NAMESPACE_NODE *) SubtreeEntry)->Name.Ascii, SubtreeEntry); 247218585Sjkim 248218585Sjkim /* Display the subtree */ 249218585Sjkim 250218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 251218585Sjkim AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth, 252218585Sjkim ACPI_OWNER_ID_MAX, SubtreeEntry); 253218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 254218585Sjkim} 255218585Sjkim 256218585Sjkim 257218585Sjkim/******************************************************************************* 258218585Sjkim * 259218585Sjkim * FUNCTION: AcpiDbDumpNamespaceByOwner 260218585Sjkim * 261218585Sjkim * PARAMETERS: OwnerArg - Owner ID whose nodes will be displayed 262218585Sjkim * DepthArg - Maximum tree depth to be dumped 263218585Sjkim * 264218585Sjkim * RETURN: None 265218585Sjkim * 266218585Sjkim * DESCRIPTION: Dump elements of the namespace that are owned by the OwnerId. 267218585Sjkim * 268218585Sjkim ******************************************************************************/ 269218585Sjkim 270218585Sjkimvoid 271218585SjkimAcpiDbDumpNamespaceByOwner ( 272218585Sjkim char *OwnerArg, 273218585Sjkim char *DepthArg) 274218585Sjkim{ 275218585Sjkim ACPI_HANDLE SubtreeEntry = AcpiGbl_RootNode; 276218585Sjkim UINT32 MaxDepth = ACPI_UINT32_MAX; 277218585Sjkim ACPI_OWNER_ID OwnerId; 278218585Sjkim 279218585Sjkim 280218585Sjkim OwnerId = (ACPI_OWNER_ID) ACPI_STRTOUL (OwnerArg, NULL, 0); 281218585Sjkim 282218585Sjkim /* Now we can check for the depth argument */ 283218585Sjkim 284218585Sjkim if (DepthArg) 285218585Sjkim { 286218585Sjkim MaxDepth = ACPI_STRTOUL (DepthArg, NULL, 0); 287218585Sjkim } 288218585Sjkim 289218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT); 290218585Sjkim AcpiOsPrintf ("ACPI Namespace by owner %X:\n", OwnerId); 291218585Sjkim 292218585Sjkim /* Display the subtree */ 293218585Sjkim 294218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 295218585Sjkim AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth, OwnerId, 296218585Sjkim SubtreeEntry); 297218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 298218585Sjkim} 299218585Sjkim 300218585Sjkim 301218585Sjkim/******************************************************************************* 302218585Sjkim * 303218585Sjkim * FUNCTION: AcpiDbWalkAndMatchName 304218585Sjkim * 305218585Sjkim * PARAMETERS: Callback from WalkNamespace 306218585Sjkim * 307218585Sjkim * RETURN: Status 308218585Sjkim * 309241973Sjkim * DESCRIPTION: Find a particular name/names within the namespace. Wildcards 310218585Sjkim * are supported -- '?' matches any character. 311218585Sjkim * 312218585Sjkim ******************************************************************************/ 313218585Sjkim 314218585Sjkimstatic ACPI_STATUS 315218585SjkimAcpiDbWalkAndMatchName ( 316218585Sjkim ACPI_HANDLE ObjHandle, 317218585Sjkim UINT32 NestingLevel, 318218585Sjkim void *Context, 319218585Sjkim void **ReturnValue) 320218585Sjkim{ 321218585Sjkim ACPI_STATUS Status; 322218585Sjkim char *RequestedName = (char *) Context; 323218585Sjkim UINT32 i; 324218585Sjkim ACPI_BUFFER Buffer; 325218585Sjkim ACPI_WALK_INFO Info; 326218585Sjkim 327218585Sjkim 328218585Sjkim /* Check for a name match */ 329218585Sjkim 330218585Sjkim for (i = 0; i < 4; i++) 331218585Sjkim { 332218585Sjkim /* Wildcard support */ 333218585Sjkim 334218585Sjkim if ((RequestedName[i] != '?') && 335218585Sjkim (RequestedName[i] != ((ACPI_NAMESPACE_NODE *) ObjHandle)->Name.Ascii[i])) 336218585Sjkim { 337218585Sjkim /* No match, just exit */ 338218585Sjkim 339218585Sjkim return (AE_OK); 340218585Sjkim } 341218585Sjkim } 342218585Sjkim 343218585Sjkim /* Get the full pathname to this object */ 344218585Sjkim 345218585Sjkim Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 346218585Sjkim Status = AcpiNsHandleToPathname (ObjHandle, &Buffer); 347218585Sjkim if (ACPI_FAILURE (Status)) 348218585Sjkim { 349218585Sjkim AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle); 350218585Sjkim } 351218585Sjkim else 352218585Sjkim { 353218585Sjkim Info.OwnerId = ACPI_OWNER_ID_MAX; 354218585Sjkim Info.DebugLevel = ACPI_UINT32_MAX; 355218585Sjkim Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT; 356218585Sjkim 357218585Sjkim AcpiOsPrintf ("%32s", (char *) Buffer.Pointer); 358218585Sjkim (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, &Info, NULL); 359218585Sjkim ACPI_FREE (Buffer.Pointer); 360218585Sjkim } 361218585Sjkim 362218585Sjkim return (AE_OK); 363218585Sjkim} 364218585Sjkim 365218585Sjkim 366218585Sjkim/******************************************************************************* 367218585Sjkim * 368218585Sjkim * FUNCTION: AcpiDbFindNameInNamespace 369218585Sjkim * 370218585Sjkim * PARAMETERS: NameArg - The 4-character ACPI name to find. 371218585Sjkim * wildcards are supported. 372218585Sjkim * 373218585Sjkim * RETURN: None 374218585Sjkim * 375218585Sjkim * DESCRIPTION: Search the namespace for a given name (with wildcards) 376218585Sjkim * 377218585Sjkim ******************************************************************************/ 378218585Sjkim 379218585SjkimACPI_STATUS 380218585SjkimAcpiDbFindNameInNamespace ( 381218585Sjkim char *NameArg) 382218585Sjkim{ 383218585Sjkim char AcpiName[5] = "____"; 384218585Sjkim char *AcpiNamePtr = AcpiName; 385218585Sjkim 386218585Sjkim 387218585Sjkim if (ACPI_STRLEN (NameArg) > 4) 388218585Sjkim { 389218585Sjkim AcpiOsPrintf ("Name must be no longer than 4 characters\n"); 390218585Sjkim return (AE_OK); 391218585Sjkim } 392218585Sjkim 393218585Sjkim /* Pad out name with underscores as necessary to create a 4-char name */ 394218585Sjkim 395218585Sjkim AcpiUtStrupr (NameArg); 396218585Sjkim while (*NameArg) 397218585Sjkim { 398218585Sjkim *AcpiNamePtr = *NameArg; 399218585Sjkim AcpiNamePtr++; 400218585Sjkim NameArg++; 401218585Sjkim } 402218585Sjkim 403218585Sjkim /* Walk the namespace from the root */ 404218585Sjkim 405218585Sjkim (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 406218585Sjkim AcpiDbWalkAndMatchName, NULL, AcpiName, NULL); 407218585Sjkim 408218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 409218585Sjkim return (AE_OK); 410218585Sjkim} 411218585Sjkim 412218585Sjkim 413218585Sjkim/******************************************************************************* 414218585Sjkim * 415218585Sjkim * FUNCTION: AcpiDbWalkForPredefinedNames 416218585Sjkim * 417218585Sjkim * PARAMETERS: Callback from WalkNamespace 418218585Sjkim * 419218585Sjkim * RETURN: Status 420218585Sjkim * 421218585Sjkim * DESCRIPTION: Detect and display predefined ACPI names (names that start with 422218585Sjkim * an underscore) 423218585Sjkim * 424218585Sjkim ******************************************************************************/ 425218585Sjkim 426218585Sjkimstatic ACPI_STATUS 427218585SjkimAcpiDbWalkForPredefinedNames ( 428218585Sjkim ACPI_HANDLE ObjHandle, 429218585Sjkim UINT32 NestingLevel, 430218585Sjkim void *Context, 431218585Sjkim void **ReturnValue) 432218585Sjkim{ 433218585Sjkim ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; 434218585Sjkim UINT32 *Count = (UINT32 *) Context; 435218585Sjkim const ACPI_PREDEFINED_INFO *Predefined; 436218585Sjkim const ACPI_PREDEFINED_INFO *Package = NULL; 437218585Sjkim char *Pathname; 438249663Sjkim char StringBuffer[48]; 439218585Sjkim 440218585Sjkim 441249112Sjkim Predefined = AcpiUtMatchPredefinedMethod (Node->Name.Ascii); 442218585Sjkim if (!Predefined) 443218585Sjkim { 444218585Sjkim return (AE_OK); 445218585Sjkim } 446218585Sjkim 447218585Sjkim Pathname = AcpiNsGetExternalPathname (Node); 448218585Sjkim if (!Pathname) 449218585Sjkim { 450218585Sjkim return (AE_OK); 451218585Sjkim } 452218585Sjkim 453218585Sjkim /* If method returns a package, the info is in the next table entry */ 454218585Sjkim 455249112Sjkim if (Predefined->Info.ExpectedBtypes & ACPI_RTYPE_PACKAGE) 456218585Sjkim { 457218585Sjkim Package = Predefined + 1; 458218585Sjkim } 459218585Sjkim 460249663Sjkim AcpiUtGetExpectedReturnTypes (StringBuffer, 461249112Sjkim Predefined->Info.ExpectedBtypes); 462218585Sjkim 463249663Sjkim AcpiOsPrintf ("%-32s Arguments %X, Return Types: %s", Pathname, 464249663Sjkim METHOD_GET_ARG_COUNT (Predefined->Info.ArgumentList), 465249663Sjkim StringBuffer); 466249663Sjkim 467218585Sjkim if (Package) 468218585Sjkim { 469249663Sjkim AcpiOsPrintf (" (PkgType %2.2X, ObjType %2.2X, Count %2.2X)", 470218585Sjkim Package->RetInfo.Type, Package->RetInfo.ObjectType1, 471218585Sjkim Package->RetInfo.Count1); 472218585Sjkim } 473218585Sjkim 474218585Sjkim AcpiOsPrintf("\n"); 475218585Sjkim 476249663Sjkim /* Check that the declared argument count matches the ACPI spec */ 477249663Sjkim 478249663Sjkim AcpiNsCheckAcpiCompliance (Pathname, Node, Predefined); 479249663Sjkim 480218585Sjkim ACPI_FREE (Pathname); 481218585Sjkim (*Count)++; 482218585Sjkim return (AE_OK); 483218585Sjkim} 484218585Sjkim 485218585Sjkim 486218585Sjkim/******************************************************************************* 487218585Sjkim * 488218585Sjkim * FUNCTION: AcpiDbCheckPredefinedNames 489218585Sjkim * 490218585Sjkim * PARAMETERS: None 491218585Sjkim * 492218585Sjkim * RETURN: None 493218585Sjkim * 494218585Sjkim * DESCRIPTION: Validate all predefined names in the namespace 495218585Sjkim * 496218585Sjkim ******************************************************************************/ 497218585Sjkim 498218585Sjkimvoid 499218585SjkimAcpiDbCheckPredefinedNames ( 500218585Sjkim void) 501218585Sjkim{ 502218585Sjkim UINT32 Count = 0; 503218585Sjkim 504218585Sjkim 505218585Sjkim /* Search all nodes in namespace */ 506218585Sjkim 507218585Sjkim (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 508218585Sjkim AcpiDbWalkForPredefinedNames, NULL, (void *) &Count, NULL); 509218585Sjkim 510218585Sjkim AcpiOsPrintf ("Found %u predefined names in the namespace\n", Count); 511218585Sjkim} 512218585Sjkim 513218585Sjkim 514218585Sjkim/******************************************************************************* 515218585Sjkim * 516218585Sjkim * FUNCTION: AcpiDbWalkForSpecificObjects 517218585Sjkim * 518218585Sjkim * PARAMETERS: Callback from WalkNamespace 519218585Sjkim * 520218585Sjkim * RETURN: Status 521218585Sjkim * 522218585Sjkim * DESCRIPTION: Display short info about objects in the namespace 523218585Sjkim * 524218585Sjkim ******************************************************************************/ 525218585Sjkim 526218585Sjkimstatic ACPI_STATUS 527218585SjkimAcpiDbWalkForSpecificObjects ( 528218585Sjkim ACPI_HANDLE ObjHandle, 529218585Sjkim UINT32 NestingLevel, 530218585Sjkim void *Context, 531218585Sjkim void **ReturnValue) 532218585Sjkim{ 533218585Sjkim ACPI_WALK_INFO *Info = (ACPI_WALK_INFO *) Context; 534218585Sjkim ACPI_BUFFER Buffer; 535218585Sjkim ACPI_STATUS Status; 536218585Sjkim 537218585Sjkim 538218585Sjkim Info->Count++; 539218585Sjkim 540218585Sjkim /* Get and display the full pathname to this object */ 541218585Sjkim 542218585Sjkim Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 543218585Sjkim Status = AcpiNsHandleToPathname (ObjHandle, &Buffer); 544218585Sjkim if (ACPI_FAILURE (Status)) 545218585Sjkim { 546218585Sjkim AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle); 547218585Sjkim return (AE_OK); 548218585Sjkim } 549218585Sjkim 550218585Sjkim AcpiOsPrintf ("%32s", (char *) Buffer.Pointer); 551218585Sjkim ACPI_FREE (Buffer.Pointer); 552218585Sjkim 553218585Sjkim /* Dump short info about the object */ 554218585Sjkim 555218585Sjkim (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, Info, NULL); 556218585Sjkim return (AE_OK); 557218585Sjkim} 558218585Sjkim 559218585Sjkim 560218585Sjkim/******************************************************************************* 561218585Sjkim * 562218585Sjkim * FUNCTION: AcpiDbDisplayObjects 563218585Sjkim * 564218585Sjkim * PARAMETERS: ObjTypeArg - Type of object to display 565218585Sjkim * DisplayCountArg - Max depth to display 566218585Sjkim * 567218585Sjkim * RETURN: None 568218585Sjkim * 569218585Sjkim * DESCRIPTION: Display objects in the namespace of the requested type 570218585Sjkim * 571218585Sjkim ******************************************************************************/ 572218585Sjkim 573218585SjkimACPI_STATUS 574218585SjkimAcpiDbDisplayObjects ( 575218585Sjkim char *ObjTypeArg, 576218585Sjkim char *DisplayCountArg) 577218585Sjkim{ 578218585Sjkim ACPI_WALK_INFO Info; 579218585Sjkim ACPI_OBJECT_TYPE Type; 580218585Sjkim 581218585Sjkim 582218585Sjkim /* Get the object type */ 583218585Sjkim 584218585Sjkim Type = AcpiDbMatchArgument (ObjTypeArg, AcpiDbObjectTypes); 585218585Sjkim if (Type == ACPI_TYPE_NOT_FOUND) 586218585Sjkim { 587218585Sjkim AcpiOsPrintf ("Invalid or unsupported argument\n"); 588218585Sjkim return (AE_OK); 589218585Sjkim } 590218585Sjkim 591218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT); 592218585Sjkim AcpiOsPrintf ( 593218585Sjkim "Objects of type [%s] defined in the current ACPI Namespace:\n", 594218585Sjkim AcpiUtGetTypeName (Type)); 595218585Sjkim 596218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 597218585Sjkim 598218585Sjkim Info.Count = 0; 599218585Sjkim Info.OwnerId = ACPI_OWNER_ID_MAX; 600218585Sjkim Info.DebugLevel = ACPI_UINT32_MAX; 601218585Sjkim Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT; 602218585Sjkim 603218585Sjkim /* Walk the namespace from the root */ 604218585Sjkim 605218585Sjkim (void) AcpiWalkNamespace (Type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 606218585Sjkim AcpiDbWalkForSpecificObjects, NULL, (void *) &Info, NULL); 607218585Sjkim 608218585Sjkim AcpiOsPrintf ( 609218585Sjkim "\nFound %u objects of type [%s] in the current ACPI Namespace\n", 610218585Sjkim Info.Count, AcpiUtGetTypeName (Type)); 611218585Sjkim 612218585Sjkim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 613218585Sjkim return (AE_OK); 614218585Sjkim} 615218585Sjkim 616218585Sjkim 617218585Sjkim/******************************************************************************* 618218585Sjkim * 619218585Sjkim * FUNCTION: AcpiDbIntegrityWalk 620218585Sjkim * 621218585Sjkim * PARAMETERS: Callback from WalkNamespace 622218585Sjkim * 623218585Sjkim * RETURN: Status 624218585Sjkim * 625218585Sjkim * DESCRIPTION: Examine one NS node for valid values. 626218585Sjkim * 627218585Sjkim ******************************************************************************/ 628218585Sjkim 629218585Sjkimstatic ACPI_STATUS 630218585SjkimAcpiDbIntegrityWalk ( 631218585Sjkim ACPI_HANDLE ObjHandle, 632218585Sjkim UINT32 NestingLevel, 633218585Sjkim void *Context, 634218585Sjkim void **ReturnValue) 635218585Sjkim{ 636218585Sjkim ACPI_INTEGRITY_INFO *Info = (ACPI_INTEGRITY_INFO *) Context; 637218585Sjkim ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; 638218585Sjkim ACPI_OPERAND_OBJECT *Object; 639218585Sjkim BOOLEAN Alias = TRUE; 640218585Sjkim 641218585Sjkim 642218585Sjkim Info->Nodes++; 643218585Sjkim 644218585Sjkim /* Verify the NS node, and dereference aliases */ 645218585Sjkim 646218585Sjkim while (Alias) 647218585Sjkim { 648218585Sjkim if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED) 649218585Sjkim { 650218585Sjkim AcpiOsPrintf ("Invalid Descriptor Type for Node %p [%s] - is %2.2X should be %2.2X\n", 651218585Sjkim Node, AcpiUtGetDescriptorName (Node), ACPI_GET_DESCRIPTOR_TYPE (Node), 652218585Sjkim ACPI_DESC_TYPE_NAMED); 653218585Sjkim return (AE_OK); 654218585Sjkim } 655218585Sjkim 656218585Sjkim if ((Node->Type == ACPI_TYPE_LOCAL_ALIAS) || 657218585Sjkim (Node->Type == ACPI_TYPE_LOCAL_METHOD_ALIAS)) 658218585Sjkim { 659218585Sjkim Node = (ACPI_NAMESPACE_NODE *) Node->Object; 660218585Sjkim } 661218585Sjkim else 662218585Sjkim { 663218585Sjkim Alias = FALSE; 664218585Sjkim } 665218585Sjkim } 666218585Sjkim 667218585Sjkim if (Node->Type > ACPI_TYPE_LOCAL_MAX) 668218585Sjkim { 669218585Sjkim AcpiOsPrintf ("Invalid Object Type for Node %p, Type = %X\n", 670218585Sjkim Node, Node->Type); 671218585Sjkim return (AE_OK); 672218585Sjkim } 673218585Sjkim 674218585Sjkim if (!AcpiUtValidAcpiName (Node->Name.Integer)) 675218585Sjkim { 676218585Sjkim AcpiOsPrintf ("Invalid AcpiName for Node %p\n", Node); 677218585Sjkim return (AE_OK); 678218585Sjkim } 679218585Sjkim 680218585Sjkim Object = AcpiNsGetAttachedObject (Node); 681218585Sjkim if (Object) 682218585Sjkim { 683218585Sjkim Info->Objects++; 684218585Sjkim if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND) 685218585Sjkim { 686218585Sjkim AcpiOsPrintf ("Invalid Descriptor Type for Object %p [%s]\n", 687218585Sjkim Object, AcpiUtGetDescriptorName (Object)); 688218585Sjkim } 689218585Sjkim } 690218585Sjkim 691218585Sjkim return (AE_OK); 692218585Sjkim} 693218585Sjkim 694218585Sjkim 695218585Sjkim/******************************************************************************* 696218585Sjkim * 697218585Sjkim * FUNCTION: AcpiDbCheckIntegrity 698218585Sjkim * 699218585Sjkim * PARAMETERS: None 700218585Sjkim * 701218585Sjkim * RETURN: None 702218585Sjkim * 703218585Sjkim * DESCRIPTION: Check entire namespace for data structure integrity 704218585Sjkim * 705218585Sjkim ******************************************************************************/ 706218585Sjkim 707218585Sjkimvoid 708218585SjkimAcpiDbCheckIntegrity ( 709218585Sjkim void) 710218585Sjkim{ 711218585Sjkim ACPI_INTEGRITY_INFO Info = {0,0}; 712218585Sjkim 713218585Sjkim /* Search all nodes in namespace */ 714218585Sjkim 715218585Sjkim (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 716218585Sjkim AcpiDbIntegrityWalk, NULL, (void *) &Info, NULL); 717218585Sjkim 718218585Sjkim AcpiOsPrintf ("Verified %u namespace nodes with %u Objects\n", 719218585Sjkim Info.Nodes, Info.Objects); 720218585Sjkim} 721218585Sjkim 722218585Sjkim 723218585Sjkim/******************************************************************************* 724218585Sjkim * 725218585Sjkim * FUNCTION: AcpiDbWalkForReferences 726218585Sjkim * 727218585Sjkim * PARAMETERS: Callback from WalkNamespace 728218585Sjkim * 729218585Sjkim * RETURN: Status 730218585Sjkim * 731218585Sjkim * DESCRIPTION: Check if this namespace object refers to the target object 732218585Sjkim * that is passed in as the context value. 733218585Sjkim * 734218585Sjkim * Note: Currently doesn't check subobjects within the Node's object 735218585Sjkim * 736218585Sjkim ******************************************************************************/ 737218585Sjkim 738218585Sjkimstatic ACPI_STATUS 739218585SjkimAcpiDbWalkForReferences ( 740218585Sjkim ACPI_HANDLE ObjHandle, 741218585Sjkim UINT32 NestingLevel, 742218585Sjkim void *Context, 743218585Sjkim void **ReturnValue) 744218585Sjkim{ 745218585Sjkim ACPI_OPERAND_OBJECT *ObjDesc = (ACPI_OPERAND_OBJECT *) Context; 746218585Sjkim ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; 747218585Sjkim 748218585Sjkim 749218585Sjkim /* Check for match against the namespace node itself */ 750218585Sjkim 751218585Sjkim if (Node == (void *) ObjDesc) 752218585Sjkim { 753218585Sjkim AcpiOsPrintf ("Object is a Node [%4.4s]\n", 754218585Sjkim AcpiUtGetNodeName (Node)); 755218585Sjkim } 756218585Sjkim 757218585Sjkim /* Check for match against the object attached to the node */ 758218585Sjkim 759218585Sjkim if (AcpiNsGetAttachedObject (Node) == ObjDesc) 760218585Sjkim { 761218585Sjkim AcpiOsPrintf ("Reference at Node->Object %p [%4.4s]\n", 762218585Sjkim Node, AcpiUtGetNodeName (Node)); 763218585Sjkim } 764218585Sjkim 765218585Sjkim return (AE_OK); 766218585Sjkim} 767218585Sjkim 768218585Sjkim 769218585Sjkim/******************************************************************************* 770218585Sjkim * 771218585Sjkim * FUNCTION: AcpiDbFindReferences 772218585Sjkim * 773218585Sjkim * PARAMETERS: ObjectArg - String with hex value of the object 774218585Sjkim * 775218585Sjkim * RETURN: None 776218585Sjkim * 777218585Sjkim * DESCRIPTION: Search namespace for all references to the input object 778218585Sjkim * 779218585Sjkim ******************************************************************************/ 780218585Sjkim 781218585Sjkimvoid 782218585SjkimAcpiDbFindReferences ( 783218585Sjkim char *ObjectArg) 784218585Sjkim{ 785218585Sjkim ACPI_OPERAND_OBJECT *ObjDesc; 786218585Sjkim 787218585Sjkim 788218585Sjkim /* Convert string to object pointer */ 789218585Sjkim 790218585Sjkim ObjDesc = ACPI_TO_POINTER (ACPI_STRTOUL (ObjectArg, NULL, 16)); 791218585Sjkim 792218585Sjkim /* Search all nodes in namespace */ 793218585Sjkim 794218585Sjkim (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 795218585Sjkim AcpiDbWalkForReferences, NULL, (void *) ObjDesc, NULL); 796218585Sjkim} 797218585Sjkim 798218585Sjkim 799218585Sjkim/******************************************************************************* 800218585Sjkim * 801218585Sjkim * FUNCTION: AcpiDbBusWalk 802218585Sjkim * 803218585Sjkim * PARAMETERS: Callback from WalkNamespace 804218585Sjkim * 805218585Sjkim * RETURN: Status 806218585Sjkim * 807218585Sjkim * DESCRIPTION: Display info about device objects that have a corresponding 808218585Sjkim * _PRT method. 809218585Sjkim * 810218585Sjkim ******************************************************************************/ 811218585Sjkim 812218585Sjkimstatic ACPI_STATUS 813218585SjkimAcpiDbBusWalk ( 814218585Sjkim ACPI_HANDLE ObjHandle, 815218585Sjkim UINT32 NestingLevel, 816218585Sjkim void *Context, 817218585Sjkim void **ReturnValue) 818218585Sjkim{ 819218585Sjkim ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle; 820218585Sjkim ACPI_STATUS Status; 821218585Sjkim ACPI_BUFFER Buffer; 822218585Sjkim ACPI_NAMESPACE_NODE *TempNode; 823218585Sjkim ACPI_DEVICE_INFO *Info; 824218585Sjkim UINT32 i; 825218585Sjkim 826218585Sjkim 827218585Sjkim if ((Node->Type != ACPI_TYPE_DEVICE) && 828218585Sjkim (Node->Type != ACPI_TYPE_PROCESSOR)) 829218585Sjkim { 830218585Sjkim return (AE_OK); 831218585Sjkim } 832218585Sjkim 833218585Sjkim /* Exit if there is no _PRT under this device */ 834218585Sjkim 835218585Sjkim Status = AcpiGetHandle (Node, METHOD_NAME__PRT, 836218585Sjkim ACPI_CAST_PTR (ACPI_HANDLE, &TempNode)); 837218585Sjkim if (ACPI_FAILURE (Status)) 838218585Sjkim { 839218585Sjkim return (AE_OK); 840218585Sjkim } 841218585Sjkim 842218585Sjkim /* Get the full path to this device object */ 843218585Sjkim 844218585Sjkim Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 845218585Sjkim Status = AcpiNsHandleToPathname (ObjHandle, &Buffer); 846218585Sjkim if (ACPI_FAILURE (Status)) 847218585Sjkim { 848218585Sjkim AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle); 849218585Sjkim return (AE_OK); 850218585Sjkim } 851218585Sjkim 852218585Sjkim Status = AcpiGetObjectInfo (ObjHandle, &Info); 853218585Sjkim if (ACPI_FAILURE (Status)) 854218585Sjkim { 855218585Sjkim return (AE_OK); 856218585Sjkim } 857218585Sjkim 858218585Sjkim /* Display the full path */ 859218585Sjkim 860218585Sjkim AcpiOsPrintf ("%-32s Type %X", (char *) Buffer.Pointer, Node->Type); 861218585Sjkim ACPI_FREE (Buffer.Pointer); 862218585Sjkim 863218585Sjkim if (Info->Flags & ACPI_PCI_ROOT_BRIDGE) 864218585Sjkim { 865218585Sjkim AcpiOsPrintf (" - Is PCI Root Bridge"); 866218585Sjkim } 867218585Sjkim AcpiOsPrintf ("\n"); 868218585Sjkim 869218585Sjkim /* _PRT info */ 870218585Sjkim 871218585Sjkim AcpiOsPrintf ("_PRT: %p\n", TempNode); 872218585Sjkim 873218585Sjkim /* Dump _ADR, _HID, _UID, _CID */ 874218585Sjkim 875218585Sjkim if (Info->Valid & ACPI_VALID_ADR) 876218585Sjkim { 877218585Sjkim AcpiOsPrintf ("_ADR: %8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Info->Address)); 878218585Sjkim } 879218585Sjkim else 880218585Sjkim { 881218585Sjkim AcpiOsPrintf ("_ADR: <Not Present>\n"); 882218585Sjkim } 883218585Sjkim 884218585Sjkim if (Info->Valid & ACPI_VALID_HID) 885218585Sjkim { 886218585Sjkim AcpiOsPrintf ("_HID: %s\n", Info->HardwareId.String); 887218585Sjkim } 888218585Sjkim else 889218585Sjkim { 890218585Sjkim AcpiOsPrintf ("_HID: <Not Present>\n"); 891218585Sjkim } 892218585Sjkim 893218585Sjkim if (Info->Valid & ACPI_VALID_UID) 894218585Sjkim { 895218585Sjkim AcpiOsPrintf ("_UID: %s\n", Info->UniqueId.String); 896218585Sjkim } 897218585Sjkim else 898218585Sjkim { 899218585Sjkim AcpiOsPrintf ("_UID: <Not Present>\n"); 900218585Sjkim } 901218585Sjkim 902218585Sjkim if (Info->Valid & ACPI_VALID_CID) 903218585Sjkim { 904218585Sjkim for (i = 0; i < Info->CompatibleIdList.Count; i++) 905218585Sjkim { 906218585Sjkim AcpiOsPrintf ("_CID: %s\n", 907218585Sjkim Info->CompatibleIdList.Ids[i].String); 908218585Sjkim } 909218585Sjkim } 910218585Sjkim else 911218585Sjkim { 912218585Sjkim AcpiOsPrintf ("_CID: <Not Present>\n"); 913218585Sjkim } 914218585Sjkim 915218585Sjkim ACPI_FREE (Info); 916218585Sjkim return (AE_OK); 917218585Sjkim} 918218585Sjkim 919218585Sjkim 920218585Sjkim/******************************************************************************* 921218585Sjkim * 922218585Sjkim * FUNCTION: AcpiDbGetBusInfo 923218585Sjkim * 924218585Sjkim * PARAMETERS: None 925218585Sjkim * 926218585Sjkim * RETURN: None 927218585Sjkim * 928218585Sjkim * DESCRIPTION: Display info about system busses. 929218585Sjkim * 930218585Sjkim ******************************************************************************/ 931218585Sjkim 932218585Sjkimvoid 933218585SjkimAcpiDbGetBusInfo ( 934218585Sjkim void) 935218585Sjkim{ 936218585Sjkim /* Search all nodes in namespace */ 937218585Sjkim 938218585Sjkim (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, 939218585Sjkim AcpiDbBusWalk, NULL, NULL, NULL); 940218585Sjkim} 941218585Sjkim 942218585Sjkim#endif /* ACPI_DEBUGGER */ 943