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