dbcmds.c revision 241973
167754Smsmith/******************************************************************************* 267754Smsmith * 3218590Sjkim * Module Name: dbcmds - Miscellaneous debug commands and output routines 467754Smsmith * 567754Smsmith ******************************************************************************/ 667754Smsmith 7217365Sjkim/* 8229989Sjkim * Copyright (C) 2000 - 2012, Intel Corp. 970243Smsmith * All rights reserved. 1067754Smsmith * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 2567754Smsmith * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 2967754Smsmith * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 4367754Smsmith 4467754Smsmith 45193341Sjkim#include <contrib/dev/acpica/include/acpi.h> 46193341Sjkim#include <contrib/dev/acpica/include/accommon.h> 47193341Sjkim#include <contrib/dev/acpica/include/acevents.h> 48193341Sjkim#include <contrib/dev/acpica/include/acdebug.h> 49228110Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 50193341Sjkim#include <contrib/dev/acpica/include/acresrc.h> 51193341Sjkim#include <contrib/dev/acpica/include/actables.h> 52138287Smarks 53102550Siwasaki#ifdef ACPI_DEBUGGER 5467754Smsmith 55102550Siwasaki#define _COMPONENT ACPI_CA_DEBUGGER 5691116Smsmith ACPI_MODULE_NAME ("dbcmds") 5767754Smsmith 58198237Sjkim 59151937Sjkim/* Local prototypes */ 6067754Smsmith 61151937Sjkimstatic void 62151937SjkimAcpiDmCompareAmlResources ( 63151937Sjkim UINT8 *Aml1Buffer, 64151937Sjkim ACPI_RSDESC_SIZE Aml1BufferLength, 65151937Sjkim UINT8 *Aml2Buffer, 66151937Sjkim ACPI_RSDESC_SIZE Aml2BufferLength); 67151937Sjkim 68151937Sjkimstatic ACPI_STATUS 69151937SjkimAcpiDmTestResourceConversion ( 70151937Sjkim ACPI_NAMESPACE_NODE *Node, 71151937Sjkim char *Name); 72151937Sjkim 73228110Sjkimstatic ACPI_STATUS 74228110SjkimAcpiDbResourceCallback ( 75228110Sjkim ACPI_RESOURCE *Resource, 76228110Sjkim void *Context); 77151937Sjkim 78228110Sjkimstatic ACPI_STATUS 79228110SjkimAcpiDbDeviceResources ( 80228110Sjkim ACPI_HANDLE ObjHandle, 81228110Sjkim UINT32 NestingLevel, 82228110Sjkim void *Context, 83228110Sjkim void **ReturnValue); 84228110Sjkim 85228110Sjkim 86138287Smarks/******************************************************************************* 87138287Smarks * 88151937Sjkim * FUNCTION: AcpiDbConvertToNode 89151937Sjkim * 90151937Sjkim * PARAMETERS: InString - String to convert 91151937Sjkim * 92151937Sjkim * RETURN: Pointer to a NS node 93151937Sjkim * 94241973Sjkim * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or 95151937Sjkim * alpha strings. 96151937Sjkim * 97151937Sjkim ******************************************************************************/ 98151937Sjkim 99218590SjkimACPI_NAMESPACE_NODE * 100151937SjkimAcpiDbConvertToNode ( 101151937Sjkim char *InString) 102151937Sjkim{ 103151937Sjkim ACPI_NAMESPACE_NODE *Node; 104151937Sjkim 105151937Sjkim 106151937Sjkim if ((*InString >= 0x30) && (*InString <= 0x39)) 107151937Sjkim { 108151937Sjkim /* Numeric argument, convert */ 109151937Sjkim 110151937Sjkim Node = ACPI_TO_POINTER (ACPI_STRTOUL (InString, NULL, 16)); 111151937Sjkim if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE))) 112151937Sjkim { 113151937Sjkim AcpiOsPrintf ("Address %p is invalid in this address space\n", 114151937Sjkim Node); 115151937Sjkim return (NULL); 116151937Sjkim } 117151937Sjkim 118151937Sjkim /* Make sure pointer is valid NS node */ 119151937Sjkim 120151937Sjkim if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED) 121151937Sjkim { 122151937Sjkim AcpiOsPrintf ("Address %p is not a valid NS node [%s]\n", 123151937Sjkim Node, AcpiUtGetDescriptorName (Node)); 124151937Sjkim return (NULL); 125151937Sjkim } 126151937Sjkim } 127151937Sjkim else 128151937Sjkim { 129151937Sjkim /* Alpha argument */ 130151937Sjkim /* The parameter is a name string that must be resolved to a 131151937Sjkim * Named obj 132151937Sjkim */ 133151937Sjkim Node = AcpiDbLocalNsLookup (InString); 134151937Sjkim if (!Node) 135151937Sjkim { 136151937Sjkim Node = AcpiGbl_RootNode; 137151937Sjkim } 138151937Sjkim } 139151937Sjkim 140151937Sjkim return (Node); 141151937Sjkim} 142151937Sjkim 143151937Sjkim 144151937Sjkim/******************************************************************************* 145151937Sjkim * 146138287Smarks * FUNCTION: AcpiDbSleep 147138287Smarks * 148138287Smarks * PARAMETERS: ObjectArg - Desired sleep state (0-5) 149138287Smarks * 150138287Smarks * RETURN: Status 151138287Smarks * 152138287Smarks * DESCRIPTION: Simulate a sleep/wake sequence 153138287Smarks * 154138287Smarks ******************************************************************************/ 155138287Smarks 156129684SnjlACPI_STATUS 157129684SnjlAcpiDbSleep ( 158129684Snjl char *ObjectArg) 159129684Snjl{ 160129684Snjl ACPI_STATUS Status; 161129684Snjl UINT8 SleepState; 162129684Snjl 163129684Snjl 164231844Sjkim ACPI_FUNCTION_TRACE (AcpiDbSleep); 165231844Sjkim 166231844Sjkim 167129684Snjl SleepState = (UINT8) ACPI_STRTOUL (ObjectArg, NULL, 0); 168129684Snjl 169129684Snjl AcpiOsPrintf ("**** Prepare to sleep ****\n"); 170129684Snjl Status = AcpiEnterSleepStatePrep (SleepState); 171129684Snjl if (ACPI_FAILURE (Status)) 172129684Snjl { 173231844Sjkim goto ErrorExit; 174129684Snjl } 175129684Snjl 176129684Snjl AcpiOsPrintf ("**** Going to sleep ****\n"); 177239340Sjkim Status = AcpiEnterSleepState (SleepState); 178129684Snjl if (ACPI_FAILURE (Status)) 179129684Snjl { 180231844Sjkim goto ErrorExit; 181129684Snjl } 182129684Snjl 183231844Sjkim AcpiOsPrintf ("**** Prepare to return from sleep ****\n"); 184239340Sjkim Status = AcpiLeaveSleepStatePrep (SleepState); 185231844Sjkim if (ACPI_FAILURE (Status)) 186231844Sjkim { 187231844Sjkim goto ErrorExit; 188231844Sjkim } 189231844Sjkim 190231844Sjkim AcpiOsPrintf ("**** Returning from sleep ****\n"); 191129684Snjl Status = AcpiLeaveSleepState (SleepState); 192231844Sjkim if (ACPI_FAILURE (Status)) 193231844Sjkim { 194231844Sjkim goto ErrorExit; 195231844Sjkim } 196129684Snjl 197241973Sjkim return_ACPI_STATUS (Status); 198231844Sjkim 199231844Sjkim 200231844SjkimErrorExit: 201231844Sjkim 202231844Sjkim ACPI_EXCEPTION ((AE_INFO, Status, "During sleep test")); 203241973Sjkim return_ACPI_STATUS (Status); 204129684Snjl} 205129684Snjl 206231844Sjkim 20767754Smsmith/******************************************************************************* 20867754Smsmith * 20977424Smsmith * FUNCTION: AcpiDbDisplayLocks 21077424Smsmith * 21177424Smsmith * PARAMETERS: None 21277424Smsmith * 21377424Smsmith * RETURN: None 21477424Smsmith * 21577424Smsmith * DESCRIPTION: Display information about internal mutexes. 21677424Smsmith * 21777424Smsmith ******************************************************************************/ 21877424Smsmith 21977424Smsmithvoid 220151937SjkimAcpiDbDisplayLocks ( 221151937Sjkim void) 22277424Smsmith{ 22377424Smsmith UINT32 i; 22477424Smsmith 22577424Smsmith 226167802Sjkim for (i = 0; i < ACPI_MAX_MUTEX; i++) 22777424Smsmith { 22877424Smsmith AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i), 229167802Sjkim AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED 230167802Sjkim ? "Locked" : "Unlocked"); 23177424Smsmith } 23277424Smsmith} 23377424Smsmith 23477424Smsmith 23577424Smsmith/******************************************************************************* 23677424Smsmith * 23767754Smsmith * FUNCTION: AcpiDbDisplayTableInfo 23867754Smsmith * 23967754Smsmith * PARAMETERS: TableArg - String with name of table to be displayed 24067754Smsmith * 24167754Smsmith * RETURN: None 24267754Smsmith * 243241973Sjkim * DESCRIPTION: Display information about loaded tables. Current 24467754Smsmith * implementation displays all loaded tables. 24567754Smsmith * 24667754Smsmith ******************************************************************************/ 24767754Smsmith 24867754Smsmithvoid 24967754SmsmithAcpiDbDisplayTableInfo ( 250114237Snjl char *TableArg) 25167754Smsmith{ 252193267Sjkim UINT32 i; 253117521Snjl ACPI_TABLE_DESC *TableDesc; 254193267Sjkim ACPI_STATUS Status; 25567754Smsmith 25667754Smsmith 257238381Sjkim /* Header */ 258238381Sjkim 259238381Sjkim AcpiOsPrintf ("Idx ID Status Type Sig Address Len Header\n"); 260238381Sjkim 261193267Sjkim /* Walk the entire root table list */ 262193267Sjkim 263207344Sjkim for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++) 26467754Smsmith { 265167802Sjkim TableDesc = &AcpiGbl_RootTableList.Tables[i]; 266167802Sjkim 267238381Sjkim /* Index and Table ID */ 268238381Sjkim 269238381Sjkim AcpiOsPrintf ("%3u %.2u ", i, TableDesc->OwnerId); 270238381Sjkim 271238381Sjkim /* Decode the table flags */ 272238381Sjkim 273238381Sjkim if (!(TableDesc->Flags & ACPI_TABLE_IS_LOADED)) 274238381Sjkim { 275238381Sjkim AcpiOsPrintf ("NotLoaded "); 276238381Sjkim } 277238381Sjkim else 278238381Sjkim { 279238381Sjkim AcpiOsPrintf (" Loaded "); 280238381Sjkim } 281238381Sjkim 282238381Sjkim switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) 283238381Sjkim { 284238381Sjkim case ACPI_TABLE_ORIGIN_UNKNOWN: 285238381Sjkim AcpiOsPrintf ("Unknown "); 286238381Sjkim break; 287238381Sjkim 288238381Sjkim case ACPI_TABLE_ORIGIN_MAPPED: 289238381Sjkim AcpiOsPrintf ("Mapped "); 290238381Sjkim break; 291238381Sjkim 292238381Sjkim case ACPI_TABLE_ORIGIN_ALLOCATED: 293238381Sjkim AcpiOsPrintf ("Allocated "); 294238381Sjkim break; 295238381Sjkim 296238381Sjkim case ACPI_TABLE_ORIGIN_OVERRIDE: 297238381Sjkim AcpiOsPrintf ("Override "); 298238381Sjkim break; 299238381Sjkim 300238381Sjkim default: 301238381Sjkim AcpiOsPrintf ("INVALID "); 302238381Sjkim break; 303238381Sjkim } 304238381Sjkim 305193267Sjkim /* Make sure that the table is mapped */ 306193267Sjkim 307193267Sjkim Status = AcpiTbVerifyTable (TableDesc); 308193267Sjkim if (ACPI_FAILURE (Status)) 30967754Smsmith { 310193267Sjkim return; 31167754Smsmith } 312193267Sjkim 313193267Sjkim /* Dump the table header */ 314193267Sjkim 315193267Sjkim if (TableDesc->Pointer) 316193267Sjkim { 317193267Sjkim AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer); 318193267Sjkim } 319193267Sjkim else 320193267Sjkim { 321193267Sjkim /* If the pointer is null, the table has been unloaded */ 322193267Sjkim 323193267Sjkim ACPI_INFO ((AE_INFO, "%4.4s - Table has been unloaded", 324193267Sjkim TableDesc->Signature.Ascii)); 325193267Sjkim } 32667754Smsmith } 32767754Smsmith} 32867754Smsmith 32967754Smsmith 33067754Smsmith/******************************************************************************* 33167754Smsmith * 33267754Smsmith * FUNCTION: AcpiDbUnloadAcpiTable 33367754Smsmith * 334238381Sjkim * PARAMETERS: ObjectName - Namespace pathname for an object that 335238381Sjkim * is owned by the table to be unloaded 33667754Smsmith * 337238381Sjkim * RETURN: None 33867754Smsmith * 339238381Sjkim * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned 340238381Sjkim * by the table. 34167754Smsmith * 34267754Smsmith ******************************************************************************/ 34367754Smsmith 34467754Smsmithvoid 34567754SmsmithAcpiDbUnloadAcpiTable ( 346238381Sjkim char *ObjectName) 34767754Smsmith{ 348238381Sjkim ACPI_NAMESPACE_NODE *Node; 34967754Smsmith ACPI_STATUS Status; 35067754Smsmith 35167754Smsmith 352238381Sjkim /* Translate name to an Named object */ 35367754Smsmith 354238381Sjkim Node = AcpiDbConvertToNode (ObjectName); 355238381Sjkim if (!Node) 35667754Smsmith { 357238381Sjkim AcpiOsPrintf ("Could not find [%s] in namespace\n", 358238381Sjkim ObjectName); 359238381Sjkim return; 360238381Sjkim } 36167754Smsmith 362238381Sjkim Status = AcpiUnloadParentTable (ACPI_CAST_PTR (ACPI_HANDLE, Node)); 363238381Sjkim if (ACPI_SUCCESS (Status)) 364238381Sjkim { 365238381Sjkim AcpiOsPrintf ("Parent of [%s] (%p) unloaded and uninstalled\n", 366238381Sjkim ObjectName, Node); 36767754Smsmith } 368238381Sjkim else 369238381Sjkim { 370238381Sjkim AcpiOsPrintf ("%s, while unloading parent table of [%s]\n", 371238381Sjkim AcpiFormatException (Status), ObjectName); 372238381Sjkim } 37367754Smsmith} 37467754Smsmith 37567754Smsmith 37667754Smsmith/******************************************************************************* 37767754Smsmith * 37867754Smsmith * FUNCTION: AcpiDbSendNotify 37967754Smsmith * 38067754Smsmith * PARAMETERS: Name - Name of ACPI object to send the notify to 38167754Smsmith * Value - Value of the notify to send. 38267754Smsmith * 38367754Smsmith * RETURN: None 38467754Smsmith * 385241973Sjkim * DESCRIPTION: Send an ACPI notification. The value specified is sent to the 38667754Smsmith * named object as an ACPI notify. 38767754Smsmith * 38867754Smsmith ******************************************************************************/ 38967754Smsmith 39067754Smsmithvoid 39167754SmsmithAcpiDbSendNotify ( 392114237Snjl char *Name, 39367754Smsmith UINT32 Value) 39467754Smsmith{ 39567754Smsmith ACPI_NAMESPACE_NODE *Node; 39699679Siwasaki ACPI_STATUS Status; 39767754Smsmith 39867754Smsmith 39967754Smsmith /* Translate name to an Named object */ 40067754Smsmith 401151937Sjkim Node = AcpiDbConvertToNode (Name); 40267754Smsmith if (!Node) 40367754Smsmith { 40467754Smsmith return; 40567754Smsmith } 40667754Smsmith 407234623Sjkim /* Dispatch the notify if legal */ 40867754Smsmith 409234623Sjkim if (AcpiEvIsNotifyObject (Node)) 41067754Smsmith { 41199679Siwasaki Status = AcpiEvQueueNotifyRequest (Node, Value); 41299679Siwasaki if (ACPI_FAILURE (Status)) 41399679Siwasaki { 41499679Siwasaki AcpiOsPrintf ("Could not queue notify\n"); 41599679Siwasaki } 41667754Smsmith } 417234623Sjkim else 418234623Sjkim { 419234623Sjkim AcpiOsPrintf ("Named object [%4.4s] Type %s, must be Device/Thermal/Processor type\n", 420234623Sjkim AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type)); 421234623Sjkim } 42267754Smsmith} 42367754Smsmith 42467754Smsmith 42567754Smsmith/******************************************************************************* 42667754Smsmith * 427210976Sjkim * FUNCTION: AcpiDbDisplayInterfaces 428210976Sjkim * 429210976Sjkim * PARAMETERS: ActionArg - Null, "install", or "remove" 430210976Sjkim * InterfaceNameArg - Name for install/remove options 431210976Sjkim * 432210976Sjkim * RETURN: None 433210976Sjkim * 434210976Sjkim * DESCRIPTION: Display or modify the global _OSI interface list 435210976Sjkim * 436210976Sjkim ******************************************************************************/ 437210976Sjkim 438210976Sjkimvoid 439210976SjkimAcpiDbDisplayInterfaces ( 440210976Sjkim char *ActionArg, 441210976Sjkim char *InterfaceNameArg) 442210976Sjkim{ 443210976Sjkim ACPI_INTERFACE_INFO *NextInterface; 444210976Sjkim char *SubString; 445210976Sjkim ACPI_STATUS Status; 446210976Sjkim 447210976Sjkim 448210976Sjkim /* If no arguments, just display current interface list */ 449210976Sjkim 450210976Sjkim if (!ActionArg) 451210976Sjkim { 452210976Sjkim (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, 453210976Sjkim ACPI_WAIT_FOREVER); 454210976Sjkim 455210976Sjkim NextInterface = AcpiGbl_SupportedInterfaces; 456210976Sjkim 457210976Sjkim while (NextInterface) 458210976Sjkim { 459210976Sjkim if (!(NextInterface->Flags & ACPI_OSI_INVALID)) 460210976Sjkim { 461210976Sjkim AcpiOsPrintf ("%s\n", NextInterface->Name); 462210976Sjkim } 463210976Sjkim NextInterface = NextInterface->Next; 464210976Sjkim } 465210976Sjkim 466210976Sjkim AcpiOsReleaseMutex (AcpiGbl_OsiMutex); 467210976Sjkim return; 468210976Sjkim } 469210976Sjkim 470210976Sjkim /* If ActionArg exists, so must InterfaceNameArg */ 471210976Sjkim 472210976Sjkim if (!InterfaceNameArg) 473210976Sjkim { 474210976Sjkim AcpiOsPrintf ("Missing Interface Name argument\n"); 475210976Sjkim return; 476210976Sjkim } 477210976Sjkim 478210976Sjkim /* Uppercase the action for match below */ 479210976Sjkim 480210976Sjkim AcpiUtStrupr (ActionArg); 481210976Sjkim 482210976Sjkim /* Install - install an interface */ 483210976Sjkim 484210976Sjkim SubString = ACPI_STRSTR ("INSTALL", ActionArg); 485210976Sjkim if (SubString) 486210976Sjkim { 487210976Sjkim Status = AcpiInstallInterface (InterfaceNameArg); 488210976Sjkim if (ACPI_FAILURE (Status)) 489210976Sjkim { 490210976Sjkim AcpiOsPrintf ("%s, while installing \"%s\"\n", 491210976Sjkim AcpiFormatException (Status), InterfaceNameArg); 492210976Sjkim } 493210976Sjkim return; 494210976Sjkim } 495210976Sjkim 496210976Sjkim /* Remove - remove an interface */ 497210976Sjkim 498210976Sjkim SubString = ACPI_STRSTR ("REMOVE", ActionArg); 499210976Sjkim if (SubString) 500210976Sjkim { 501210976Sjkim Status = AcpiRemoveInterface (InterfaceNameArg); 502210976Sjkim if (ACPI_FAILURE (Status)) 503210976Sjkim { 504210976Sjkim AcpiOsPrintf ("%s, while removing \"%s\"\n", 505210976Sjkim AcpiFormatException (Status), InterfaceNameArg); 506210976Sjkim } 507210976Sjkim return; 508210976Sjkim } 509210976Sjkim 510210976Sjkim /* Invalid ActionArg */ 511210976Sjkim 512210976Sjkim AcpiOsPrintf ("Invalid action argument: %s\n", ActionArg); 513210976Sjkim return; 514210976Sjkim} 515210976Sjkim 516210976Sjkim 517210976Sjkim/******************************************************************************* 518210976Sjkim * 519228110Sjkim * FUNCTION: AcpiDbDisplayTemplate 520228110Sjkim * 521228110Sjkim * PARAMETERS: BufferArg - Buffer name or addrss 522228110Sjkim * 523228110Sjkim * RETURN: None 524228110Sjkim * 525228110Sjkim * DESCRIPTION: Dump a buffer that contains a resource template 526228110Sjkim * 527228110Sjkim ******************************************************************************/ 528228110Sjkim 529228110Sjkimvoid 530228110SjkimAcpiDbDisplayTemplate ( 531228110Sjkim char *BufferArg) 532228110Sjkim{ 533228110Sjkim ACPI_NAMESPACE_NODE *Node; 534228110Sjkim ACPI_STATUS Status; 535228110Sjkim ACPI_BUFFER ReturnObj; 536228110Sjkim 537228110Sjkim 538228110Sjkim /* Translate BufferArg to an Named object */ 539228110Sjkim 540228110Sjkim Node = AcpiDbConvertToNode (BufferArg); 541228110Sjkim if (!Node || (Node == AcpiGbl_RootNode)) 542228110Sjkim { 543228110Sjkim AcpiOsPrintf ("Invalid argument: %s\n", BufferArg); 544228110Sjkim return; 545228110Sjkim } 546228110Sjkim 547228110Sjkim /* We must have a buffer object */ 548228110Sjkim 549228110Sjkim if (Node->Type != ACPI_TYPE_BUFFER) 550228110Sjkim { 551228110Sjkim AcpiOsPrintf ("Not a Buffer object, cannot be a template: %s\n", 552228110Sjkim BufferArg); 553228110Sjkim return; 554228110Sjkim } 555228110Sjkim 556228110Sjkim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 557228110Sjkim ReturnObj.Pointer = AcpiGbl_DbBuffer; 558228110Sjkim 559228110Sjkim /* Attempt to convert the raw buffer to a resource list */ 560228110Sjkim 561228110Sjkim Status = AcpiRsCreateResourceList (Node->Object, &ReturnObj); 562228110Sjkim 563228110Sjkim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 564228110Sjkim AcpiDbgLevel |= ACPI_LV_RESOURCES; 565228110Sjkim 566228110Sjkim if (ACPI_FAILURE (Status)) 567228110Sjkim { 568228110Sjkim AcpiOsPrintf ("Could not convert Buffer to a resource list: %s, %s\n", 569228110Sjkim BufferArg, AcpiFormatException (Status)); 570228110Sjkim goto DumpBuffer; 571228110Sjkim } 572228110Sjkim 573228110Sjkim /* Now we can dump the resource list */ 574228110Sjkim 575228110Sjkim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, 576228110Sjkim ReturnObj.Pointer)); 577228110Sjkim 578228110SjkimDumpBuffer: 579228110Sjkim AcpiOsPrintf ("\nRaw data buffer:\n"); 580241973Sjkim AcpiUtDebugDumpBuffer ((UINT8 *) Node->Object->Buffer.Pointer, 581228110Sjkim Node->Object->Buffer.Length, 582228110Sjkim DB_BYTE_DISPLAY, ACPI_UINT32_MAX); 583228110Sjkim 584228110Sjkim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 585228110Sjkim return; 586228110Sjkim} 587228110Sjkim 588228110Sjkim 589228110Sjkim/******************************************************************************* 590228110Sjkim * 591151937Sjkim * FUNCTION: AcpiDmCompareAmlResources 592151937Sjkim * 593151937Sjkim * PARAMETERS: Aml1Buffer - Contains first resource list 594151937Sjkim * Aml1BufferLength - Length of first resource list 595151937Sjkim * Aml2Buffer - Contains second resource list 596151937Sjkim * Aml2BufferLength - Length of second resource list 597151937Sjkim * 598151937Sjkim * RETURN: None 599151937Sjkim * 600151937Sjkim * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in 601151937Sjkim * order to isolate a miscompare to an individual resource) 602151937Sjkim * 603151937Sjkim ******************************************************************************/ 604151937Sjkim 605151937Sjkimstatic void 606151937SjkimAcpiDmCompareAmlResources ( 607151937Sjkim UINT8 *Aml1Buffer, 608151937Sjkim ACPI_RSDESC_SIZE Aml1BufferLength, 609151937Sjkim UINT8 *Aml2Buffer, 610151937Sjkim ACPI_RSDESC_SIZE Aml2BufferLength) 611151937Sjkim{ 612151937Sjkim UINT8 *Aml1; 613151937Sjkim UINT8 *Aml2; 614228110Sjkim UINT8 *Aml1End; 615228110Sjkim UINT8 *Aml2End; 616151937Sjkim ACPI_RSDESC_SIZE Aml1Length; 617151937Sjkim ACPI_RSDESC_SIZE Aml2Length; 618151937Sjkim ACPI_RSDESC_SIZE Offset = 0; 619151937Sjkim UINT8 ResourceType; 620151937Sjkim UINT32 Count = 0; 621228110Sjkim UINT32 i; 622151937Sjkim 623151937Sjkim 624151937Sjkim /* Compare overall buffer sizes (may be different due to size rounding) */ 625151937Sjkim 626151937Sjkim if (Aml1BufferLength != Aml2BufferLength) 627151937Sjkim { 628151937Sjkim AcpiOsPrintf ( 629228110Sjkim "**** Buffer length mismatch in converted AML: Original %X, New %X ****\n", 630151937Sjkim Aml1BufferLength, Aml2BufferLength); 631151937Sjkim } 632151937Sjkim 633151937Sjkim Aml1 = Aml1Buffer; 634151937Sjkim Aml2 = Aml2Buffer; 635228110Sjkim Aml1End = Aml1Buffer + Aml1BufferLength; 636228110Sjkim Aml2End = Aml2Buffer + Aml2BufferLength; 637151937Sjkim 638151937Sjkim /* Walk the descriptor lists, comparing each descriptor */ 639151937Sjkim 640228110Sjkim while ((Aml1 < Aml1End) && (Aml2 < Aml2End)) 641151937Sjkim { 642151937Sjkim /* Get the lengths of each descriptor */ 643151937Sjkim 644151937Sjkim Aml1Length = AcpiUtGetDescriptorLength (Aml1); 645151937Sjkim Aml2Length = AcpiUtGetDescriptorLength (Aml2); 646151937Sjkim ResourceType = AcpiUtGetResourceType (Aml1); 647151937Sjkim 648151937Sjkim /* Check for descriptor length match */ 649151937Sjkim 650151937Sjkim if (Aml1Length != Aml2Length) 651151937Sjkim { 652151937Sjkim AcpiOsPrintf ( 653228110Sjkim "**** Length mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X Len1 %X, Len2 %X ****\n", 654151937Sjkim Count, ResourceType, Offset, Aml1Length, Aml2Length); 655151937Sjkim } 656151937Sjkim 657151937Sjkim /* Check for descriptor byte match */ 658151937Sjkim 659167802Sjkim else if (ACPI_MEMCMP (Aml1, Aml2, Aml1Length)) 660151937Sjkim { 661151937Sjkim AcpiOsPrintf ( 662151937Sjkim "**** Data mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X ****\n", 663151937Sjkim Count, ResourceType, Offset); 664228110Sjkim 665228110Sjkim for (i = 0; i < Aml1Length; i++) 666228110Sjkim { 667228110Sjkim if (Aml1[i] != Aml2[i]) 668228110Sjkim { 669228110Sjkim AcpiOsPrintf ("Mismatch at byte offset %.2X: is %2.2X, should be %2.2X\n", 670228110Sjkim i, Aml2[i], Aml1[i]); 671228110Sjkim } 672228110Sjkim } 673151937Sjkim } 674151937Sjkim 675151937Sjkim /* Exit on EndTag descriptor */ 676151937Sjkim 677151937Sjkim if (ResourceType == ACPI_RESOURCE_NAME_END_TAG) 678151937Sjkim { 679151937Sjkim return; 680151937Sjkim } 681151937Sjkim 682151937Sjkim /* Point to next descriptor in each buffer */ 683151937Sjkim 684151937Sjkim Count++; 685151937Sjkim Offset += Aml1Length; 686151937Sjkim Aml1 += Aml1Length; 687167802Sjkim Aml2 += Aml2Length; 688151937Sjkim } 689151937Sjkim} 690151937Sjkim 691151937Sjkim 692151937Sjkim/******************************************************************************* 693151937Sjkim * 694151937Sjkim * FUNCTION: AcpiDmTestResourceConversion 695151937Sjkim * 696151937Sjkim * PARAMETERS: Node - Parent device node 697151937Sjkim * Name - resource method name (_CRS) 698151937Sjkim * 699151937Sjkim * RETURN: Status 700151937Sjkim * 701151937Sjkim * DESCRIPTION: Compare the original AML with a conversion of the AML to 702151937Sjkim * internal resource list, then back to AML. 703151937Sjkim * 704151937Sjkim ******************************************************************************/ 705151937Sjkim 706151937Sjkimstatic ACPI_STATUS 707151937SjkimAcpiDmTestResourceConversion ( 708151937Sjkim ACPI_NAMESPACE_NODE *Node, 709151937Sjkim char *Name) 710151937Sjkim{ 711151937Sjkim ACPI_STATUS Status; 712151937Sjkim ACPI_BUFFER ReturnObj; 713151937Sjkim ACPI_BUFFER ResourceObj; 714151937Sjkim ACPI_BUFFER NewAml; 715151937Sjkim ACPI_OBJECT *OriginalAml; 716151937Sjkim 717151937Sjkim 718151937Sjkim AcpiOsPrintf ("Resource Conversion Comparison:\n"); 719151937Sjkim 720151937Sjkim NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 721151937Sjkim ReturnObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 722151937Sjkim ResourceObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 723151937Sjkim 724151937Sjkim /* Get the original _CRS AML resource template */ 725151937Sjkim 726151937Sjkim Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnObj); 727151937Sjkim if (ACPI_FAILURE (Status)) 728151937Sjkim { 729151937Sjkim AcpiOsPrintf ("Could not obtain %s: %s\n", 730151937Sjkim Name, AcpiFormatException (Status)); 731151937Sjkim return (Status); 732151937Sjkim } 733151937Sjkim 734151937Sjkim /* Get the AML resource template, converted to internal resource structs */ 735151937Sjkim 736151937Sjkim Status = AcpiGetCurrentResources (Node, &ResourceObj); 737151937Sjkim if (ACPI_FAILURE (Status)) 738151937Sjkim { 739151937Sjkim AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n", 740151937Sjkim AcpiFormatException (Status)); 741151937Sjkim goto Exit1; 742151937Sjkim } 743151937Sjkim 744151937Sjkim /* Convert internal resource list to external AML resource template */ 745151937Sjkim 746151937Sjkim Status = AcpiRsCreateAmlResources (ResourceObj.Pointer, &NewAml); 747151937Sjkim if (ACPI_FAILURE (Status)) 748151937Sjkim { 749151937Sjkim AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n", 750151937Sjkim AcpiFormatException (Status)); 751151937Sjkim goto Exit2; 752151937Sjkim } 753151937Sjkim 754151937Sjkim /* Compare original AML to the newly created AML resource list */ 755151937Sjkim 756151937Sjkim OriginalAml = ReturnObj.Pointer; 757151937Sjkim 758151937Sjkim AcpiDmCompareAmlResources ( 759193267Sjkim OriginalAml->Buffer.Pointer, (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length, 760193267Sjkim NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length); 761151937Sjkim 762151937Sjkim /* Cleanup and exit */ 763151937Sjkim 764167802Sjkim ACPI_FREE (NewAml.Pointer); 765151937SjkimExit2: 766167802Sjkim ACPI_FREE (ResourceObj.Pointer); 767151937SjkimExit1: 768167802Sjkim ACPI_FREE (ReturnObj.Pointer); 769151937Sjkim return (Status); 770151937Sjkim} 771151937Sjkim 772151937Sjkim 773151937Sjkim/******************************************************************************* 774151937Sjkim * 775228110Sjkim * FUNCTION: AcpiDbResourceCallback 77673561Smsmith * 777228110Sjkim * PARAMETERS: ACPI_WALK_RESOURCE_CALLBACK 77873561Smsmith * 779228110Sjkim * RETURN: Status 78073561Smsmith * 781228110Sjkim * DESCRIPTION: Simple callback to exercise AcpiWalkResources 78273561Smsmith * 78373561Smsmith ******************************************************************************/ 78473561Smsmith 785228110Sjkimstatic ACPI_STATUS 786228110SjkimAcpiDbResourceCallback ( 787228110Sjkim ACPI_RESOURCE *Resource, 788228110Sjkim void *Context) 78973561Smsmith{ 790228110Sjkim 791228110Sjkim return (AE_OK); 792228110Sjkim} 793228110Sjkim 794228110Sjkim 795228110Sjkim/******************************************************************************* 796228110Sjkim * 797228110Sjkim * FUNCTION: AcpiDbDeviceResources 798228110Sjkim * 799228110Sjkim * PARAMETERS: ACPI_WALK_CALLBACK 800228110Sjkim * 801228110Sjkim * RETURN: Status 802228110Sjkim * 803228110Sjkim * DESCRIPTION: Display the _PRT/_CRS/_PRS resources for a device object. 804228110Sjkim * 805228110Sjkim ******************************************************************************/ 806228110Sjkim 807228110Sjkimstatic ACPI_STATUS 808228110SjkimAcpiDbDeviceResources ( 809228110Sjkim ACPI_HANDLE ObjHandle, 810228110Sjkim UINT32 NestingLevel, 811228110Sjkim void *Context, 812228110Sjkim void **ReturnValue) 813228110Sjkim{ 814151937Sjkim ACPI_NAMESPACE_NODE *Node; 815228110Sjkim ACPI_NAMESPACE_NODE *PrtNode = NULL; 816228110Sjkim ACPI_NAMESPACE_NODE *CrsNode = NULL; 817228110Sjkim ACPI_NAMESPACE_NODE *PrsNode = NULL; 818228110Sjkim ACPI_NAMESPACE_NODE *AeiNode = NULL; 819228110Sjkim char *ParentPath; 820228110Sjkim ACPI_BUFFER ReturnObj; 82173561Smsmith ACPI_STATUS Status; 82273561Smsmith 82373561Smsmith 824228110Sjkim Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle); 825228110Sjkim ParentPath = AcpiNsGetExternalPathname (Node); 826228110Sjkim if (!ParentPath) 827228110Sjkim { 828228110Sjkim return (AE_NO_MEMORY); 829228110Sjkim } 83073561Smsmith 831228110Sjkim /* Get handles to the resource methods for this device */ 83273561Smsmith 833228110Sjkim (void) AcpiGetHandle (Node, METHOD_NAME__PRT, ACPI_CAST_PTR (ACPI_HANDLE, &PrtNode)); 834228110Sjkim (void) AcpiGetHandle (Node, METHOD_NAME__CRS, ACPI_CAST_PTR (ACPI_HANDLE, &CrsNode)); 835228110Sjkim (void) AcpiGetHandle (Node, METHOD_NAME__PRS, ACPI_CAST_PTR (ACPI_HANDLE, &PrsNode)); 836228110Sjkim (void) AcpiGetHandle (Node, METHOD_NAME__AEI, ACPI_CAST_PTR (ACPI_HANDLE, &AeiNode)); 837228110Sjkim if (!PrtNode && !CrsNode && !PrsNode && !AeiNode) 838151937Sjkim { 839228110Sjkim goto Cleanup; /* Nothing to do */ 840151937Sjkim } 84173561Smsmith 842228110Sjkim AcpiOsPrintf ("\nDevice: %s\n", ParentPath); 843228110Sjkim 84473561Smsmith /* Prepare for a return object of arbitrary size */ 84573561Smsmith 846151937Sjkim ReturnObj.Pointer = AcpiGbl_DbBuffer; 847151937Sjkim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 84873561Smsmith 849228110Sjkim 85077424Smsmith /* _PRT */ 85177424Smsmith 852228110Sjkim if (PrtNode) 853228110Sjkim { 854228110Sjkim AcpiOsPrintf ("Evaluating _PRT\n"); 85577424Smsmith 856228110Sjkim Status = AcpiEvaluateObject (PrtNode, NULL, NULL, &ReturnObj); 857228110Sjkim if (ACPI_FAILURE (Status)) 858228110Sjkim { 859228110Sjkim AcpiOsPrintf ("Could not evaluate _PRT: %s\n", 860228110Sjkim AcpiFormatException (Status)); 861228110Sjkim goto GetCrs; 862228110Sjkim } 863151937Sjkim 864228110Sjkim ReturnObj.Pointer = AcpiGbl_DbBuffer; 865228110Sjkim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 86673561Smsmith 867228110Sjkim Status = AcpiGetIrqRoutingTable (Node, &ReturnObj); 868228110Sjkim if (ACPI_FAILURE (Status)) 869228110Sjkim { 870228110Sjkim AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n", 871228110Sjkim AcpiFormatException (Status)); 872228110Sjkim goto GetCrs; 873228110Sjkim } 87473561Smsmith 875228110Sjkim AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer)); 87677424Smsmith } 87777424Smsmith 87877424Smsmith 87977424Smsmith /* _CRS */ 88083174Smsmith 88183174SmsmithGetCrs: 882228110Sjkim if (CrsNode) 883228110Sjkim { 884228110Sjkim AcpiOsPrintf ("Evaluating _CRS\n"); 88577424Smsmith 886228110Sjkim ReturnObj.Pointer = AcpiGbl_DbBuffer; 887228110Sjkim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 88877424Smsmith 889228110Sjkim Status = AcpiEvaluateObject (CrsNode, NULL, NULL, &ReturnObj); 890228110Sjkim if (ACPI_FAILURE (Status)) 891228110Sjkim { 892228110Sjkim AcpiOsPrintf ("Could not evaluate _CRS: %s\n", 893228110Sjkim AcpiFormatException (Status)); 894228110Sjkim goto GetPrs; 895228110Sjkim } 896151937Sjkim 897228110Sjkim /* This code is here to exercise the AcpiWalkResources interface */ 89877424Smsmith 899228110Sjkim Status = AcpiWalkResources (Node, METHOD_NAME__CRS, 900228110Sjkim AcpiDbResourceCallback, NULL); 901228110Sjkim if (ACPI_FAILURE (Status)) 902228110Sjkim { 903228110Sjkim AcpiOsPrintf ("AcpiWalkResources failed: %s\n", 904228110Sjkim AcpiFormatException (Status)); 905228110Sjkim goto GetPrs; 906228110Sjkim } 90777424Smsmith 908228110Sjkim /* Get the _CRS resource list */ 909151937Sjkim 910228110Sjkim ReturnObj.Pointer = AcpiGbl_DbBuffer; 911228110Sjkim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 91277424Smsmith 913228110Sjkim Status = AcpiGetCurrentResources (Node, &ReturnObj); 914228110Sjkim if (ACPI_FAILURE (Status)) 915228110Sjkim { 916228110Sjkim AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n", 917228110Sjkim AcpiFormatException (Status)); 918228110Sjkim goto GetPrs; 919228110Sjkim } 920151937Sjkim 921228110Sjkim /* Dump the _CRS resource list */ 922151937Sjkim 923228110Sjkim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, 924228110Sjkim ReturnObj.Pointer)); 925151937Sjkim 926228110Sjkim /* 927228110Sjkim * Perform comparison of original AML to newly created AML. This tests both 928228110Sjkim * the AML->Resource conversion and the Resource->Aml conversion. 929228110Sjkim */ 930228110Sjkim Status = AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS); 931151937Sjkim 932228110Sjkim /* Execute _SRS with the resource list */ 933228110Sjkim 934228110Sjkim Status = AcpiSetCurrentResources (Node, &ReturnObj); 935228110Sjkim if (ACPI_FAILURE (Status)) 936228110Sjkim { 937228110Sjkim AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n", 938228110Sjkim AcpiFormatException (Status)); 939228110Sjkim goto GetPrs; 940228110Sjkim } 94191116Smsmith } 94283174Smsmith 94391116Smsmith 94477424Smsmith /* _PRS */ 94583174Smsmith 94683174SmsmithGetPrs: 947228110Sjkim if (PrsNode) 948228110Sjkim { 949228110Sjkim AcpiOsPrintf ("Evaluating _PRS\n"); 95077424Smsmith 951228110Sjkim ReturnObj.Pointer = AcpiGbl_DbBuffer; 952228110Sjkim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 95377424Smsmith 954228110Sjkim Status = AcpiEvaluateObject (PrsNode, NULL, NULL, &ReturnObj); 955228110Sjkim if (ACPI_FAILURE (Status)) 956228110Sjkim { 957228110Sjkim AcpiOsPrintf ("Could not evaluate _PRS: %s\n", 958228110Sjkim AcpiFormatException (Status)); 959228110Sjkim goto GetAei; 960228110Sjkim } 961151937Sjkim 962228110Sjkim ReturnObj.Pointer = AcpiGbl_DbBuffer; 963228110Sjkim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 964228110Sjkim 965228110Sjkim Status = AcpiGetPossibleResources (Node, &ReturnObj); 966228110Sjkim if (ACPI_FAILURE (Status)) 967228110Sjkim { 968228110Sjkim AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n", 969228110Sjkim AcpiFormatException (Status)); 970228110Sjkim goto GetAei; 971228110Sjkim } 972228110Sjkim 973228110Sjkim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer)); 97473561Smsmith } 97573561Smsmith 97677424Smsmith 977228110Sjkim /* _AEI */ 978228110Sjkim 979228110SjkimGetAei: 980228110Sjkim if (AeiNode) 98173561Smsmith { 982228110Sjkim AcpiOsPrintf ("Evaluating _AEI\n"); 983228110Sjkim 984228110Sjkim ReturnObj.Pointer = AcpiGbl_DbBuffer; 985228110Sjkim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 986228110Sjkim 987228110Sjkim Status = AcpiEvaluateObject (AeiNode, NULL, NULL, &ReturnObj); 988228110Sjkim if (ACPI_FAILURE (Status)) 989228110Sjkim { 990228110Sjkim AcpiOsPrintf ("Could not evaluate _AEI: %s\n", 991228110Sjkim AcpiFormatException (Status)); 992228110Sjkim goto Cleanup; 993228110Sjkim } 994228110Sjkim 995228110Sjkim ReturnObj.Pointer = AcpiGbl_DbBuffer; 996228110Sjkim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 997228110Sjkim 998228110Sjkim Status = AcpiGetEventResources (Node, &ReturnObj); 999228110Sjkim if (ACPI_FAILURE (Status)) 1000228110Sjkim { 1001228110Sjkim AcpiOsPrintf ("AcpiGetEventResources failed: %s\n", 1002228110Sjkim AcpiFormatException (Status)); 1003228110Sjkim goto Cleanup; 1004228110Sjkim } 1005228110Sjkim 1006228110Sjkim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer)); 100773561Smsmith } 100877424Smsmith 1009151937Sjkim 101073561SmsmithCleanup: 1011228110Sjkim ACPI_FREE (ParentPath); 1012228110Sjkim return (AE_OK); 1013228110Sjkim} 101473561Smsmith 1015228110Sjkim 1016228110Sjkim/******************************************************************************* 1017228110Sjkim * 1018228110Sjkim * FUNCTION: AcpiDbDisplayResources 1019228110Sjkim * 1020228110Sjkim * PARAMETERS: ObjectArg - String object name or object pointer. 1021228110Sjkim * "*" means "display resources for all devices" 1022228110Sjkim * 1023228110Sjkim * RETURN: None 1024228110Sjkim * 1025228110Sjkim * DESCRIPTION: Display the resource objects associated with a device. 1026228110Sjkim * 1027228110Sjkim ******************************************************************************/ 1028228110Sjkim 1029228110Sjkimvoid 1030228110SjkimAcpiDbDisplayResources ( 1031228110Sjkim char *ObjectArg) 1032228110Sjkim{ 1033228110Sjkim ACPI_NAMESPACE_NODE *Node; 1034228110Sjkim 1035228110Sjkim 1036228110Sjkim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 1037228110Sjkim AcpiDbgLevel |= ACPI_LV_RESOURCES; 1038228110Sjkim 1039228110Sjkim /* Asterisk means "display resources for all devices" */ 1040228110Sjkim 1041228110Sjkim if (!ACPI_STRCMP (ObjectArg, "*")) 1042228110Sjkim { 1043228110Sjkim (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, 1044228110Sjkim ACPI_UINT32_MAX, AcpiDbDeviceResources, NULL, NULL, NULL); 1045228110Sjkim } 1046228110Sjkim else 1047228110Sjkim { 1048228110Sjkim /* Convert string to object pointer */ 1049228110Sjkim 1050228110Sjkim Node = AcpiDbConvertToNode (ObjectArg); 1051228110Sjkim if (Node) 1052228110Sjkim { 1053228110Sjkim if (Node->Type != ACPI_TYPE_DEVICE) 1054228110Sjkim { 1055228110Sjkim AcpiOsPrintf ("%4.4s: Name is not a device object (%s)\n", 1056228110Sjkim Node->Name.Ascii, AcpiUtGetTypeName (Node->Type)); 1057228110Sjkim } 1058228110Sjkim else 1059228110Sjkim { 1060228110Sjkim (void) AcpiDbDeviceResources (Node, 0, NULL, NULL); 1061228110Sjkim } 1062228110Sjkim } 1063228110Sjkim } 1064228110Sjkim 106591116Smsmith AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 106673561Smsmith} 106773561Smsmith 106873561Smsmith 1069231844Sjkim#if (!ACPI_REDUCED_HARDWARE) 107099679Siwasaki/******************************************************************************* 107199679Siwasaki * 1072114237Snjl * FUNCTION: AcpiDbGenerateGpe 1073114237Snjl * 1074151937Sjkim * PARAMETERS: GpeArg - Raw GPE number, ascii string 1075151937Sjkim * BlockArg - GPE block number, ascii string 1076151937Sjkim * 0 or 1 for FADT GPE blocks 1077114237Snjl * 1078114237Snjl * RETURN: None 1079114237Snjl * 1080114237Snjl * DESCRIPTION: Generate a GPE 1081114237Snjl * 1082114237Snjl ******************************************************************************/ 1083114237Snjl 1084114237Snjlvoid 1085114237SnjlAcpiDbGenerateGpe ( 1086114237Snjl char *GpeArg, 1087114237Snjl char *BlockArg) 1088114237Snjl{ 1089114237Snjl UINT32 BlockNumber; 1090114237Snjl UINT32 GpeNumber; 1091114237Snjl ACPI_GPE_EVENT_INFO *GpeEventInfo; 1092114237Snjl 1093114237Snjl 1094117521Snjl GpeNumber = ACPI_STRTOUL (GpeArg, NULL, 0); 1095117521Snjl BlockNumber = ACPI_STRTOUL (BlockArg, NULL, 0); 1096114237Snjl 1097114237Snjl 1098151937Sjkim GpeEventInfo = AcpiEvGetGpeEventInfo (ACPI_TO_POINTER (BlockNumber), 1099151937Sjkim GpeNumber); 1100114237Snjl if (!GpeEventInfo) 1101114237Snjl { 1102114237Snjl AcpiOsPrintf ("Invalid GPE\n"); 1103114237Snjl return; 1104114237Snjl } 1105114237Snjl 1106216471Sjkim (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber); 1107114237Snjl} 1108231844Sjkim#endif /* !ACPI_REDUCED_HARDWARE */ 1109114237Snjl 1110102550Siwasaki#endif /* ACPI_DEBUGGER */ 1111