167754Smsmith/******************************************************************************* 267754Smsmith * 3218590Sjkim * Module Name: dbcmds - Miscellaneous debug commands and output routines 467754Smsmith * 567754Smsmith ******************************************************************************/ 667754Smsmith 7217365Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, 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 44193341Sjkim#include <contrib/dev/acpica/include/acpi.h> 45193341Sjkim#include <contrib/dev/acpica/include/accommon.h> 46193341Sjkim#include <contrib/dev/acpica/include/acevents.h> 47193341Sjkim#include <contrib/dev/acpica/include/acdebug.h> 48228110Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 49193341Sjkim#include <contrib/dev/acpica/include/acresrc.h> 50193341Sjkim#include <contrib/dev/acpica/include/actables.h> 51138287Smarks 5267754Smsmith 53102550Siwasaki#define _COMPONENT ACPI_CA_DEBUGGER 5491116Smsmith ACPI_MODULE_NAME ("dbcmds") 5567754Smsmith 56198237Sjkim 57151937Sjkim/* Local prototypes */ 5867754Smsmith 59151937Sjkimstatic void 60151937SjkimAcpiDmCompareAmlResources ( 61151937Sjkim UINT8 *Aml1Buffer, 62151937Sjkim ACPI_RSDESC_SIZE Aml1BufferLength, 63151937Sjkim UINT8 *Aml2Buffer, 64151937Sjkim ACPI_RSDESC_SIZE Aml2BufferLength); 65151937Sjkim 66151937Sjkimstatic ACPI_STATUS 67151937SjkimAcpiDmTestResourceConversion ( 68151937Sjkim ACPI_NAMESPACE_NODE *Node, 69151937Sjkim char *Name); 70151937Sjkim 71228110Sjkimstatic ACPI_STATUS 72228110SjkimAcpiDbResourceCallback ( 73228110Sjkim ACPI_RESOURCE *Resource, 74228110Sjkim void *Context); 75151937Sjkim 76228110Sjkimstatic ACPI_STATUS 77228110SjkimAcpiDbDeviceResources ( 78228110Sjkim ACPI_HANDLE ObjHandle, 79228110Sjkim UINT32 NestingLevel, 80228110Sjkim void *Context, 81228110Sjkim void **ReturnValue); 82228110Sjkim 83245582Sjkimstatic void 84245582SjkimAcpiDbDoOneSleepState ( 85245582Sjkim UINT8 SleepState); 86228110Sjkim 87245582Sjkim 88306536Sjkimstatic char *AcpiDbTraceMethodName = NULL; 89306536Sjkim 90306536Sjkim 91138287Smarks/******************************************************************************* 92138287Smarks * 93151937Sjkim * FUNCTION: AcpiDbConvertToNode 94151937Sjkim * 95245582Sjkim * PARAMETERS: InString - String to convert 96151937Sjkim * 97151937Sjkim * RETURN: Pointer to a NS node 98151937Sjkim * 99241973Sjkim * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or 100245582Sjkim * alphanumeric strings. 101151937Sjkim * 102151937Sjkim ******************************************************************************/ 103151937Sjkim 104218590SjkimACPI_NAMESPACE_NODE * 105151937SjkimAcpiDbConvertToNode ( 106151937Sjkim char *InString) 107151937Sjkim{ 108151937Sjkim ACPI_NAMESPACE_NODE *Node; 109252279Sjkim ACPI_SIZE Address; 110151937Sjkim 111151937Sjkim 112151937Sjkim if ((*InString >= 0x30) && (*InString <= 0x39)) 113151937Sjkim { 114151937Sjkim /* Numeric argument, convert */ 115151937Sjkim 116306536Sjkim Address = strtoul (InString, NULL, 16); 117252279Sjkim Node = ACPI_TO_POINTER (Address); 118151937Sjkim if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE))) 119151937Sjkim { 120306536Sjkim AcpiOsPrintf ("Address %p is invalid", Node); 121151937Sjkim return (NULL); 122151937Sjkim } 123151937Sjkim 124151937Sjkim /* Make sure pointer is valid NS node */ 125151937Sjkim 126151937Sjkim if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED) 127151937Sjkim { 128281075Sdim AcpiOsPrintf ("Address %p is not a valid namespace node [%s]\n", 129306536Sjkim Node, AcpiUtGetDescriptorName (Node)); 130151937Sjkim return (NULL); 131151937Sjkim } 132151937Sjkim } 133151937Sjkim else 134151937Sjkim { 135245582Sjkim /* 136245582Sjkim * Alpha argument: The parameter is a name string that must be 137245582Sjkim * resolved to a Namespace object. 138151937Sjkim */ 139151937Sjkim Node = AcpiDbLocalNsLookup (InString); 140151937Sjkim if (!Node) 141151937Sjkim { 142306536Sjkim AcpiOsPrintf ( 143306536Sjkim "Could not find [%s] in namespace, defaulting to root node\n", 144281075Sdim InString); 145151937Sjkim Node = AcpiGbl_RootNode; 146151937Sjkim } 147151937Sjkim } 148151937Sjkim 149151937Sjkim return (Node); 150151937Sjkim} 151151937Sjkim 152151937Sjkim 153151937Sjkim/******************************************************************************* 154151937Sjkim * 155138287Smarks * FUNCTION: AcpiDbSleep 156138287Smarks * 157245582Sjkim * PARAMETERS: ObjectArg - Desired sleep state (0-5). NULL means 158245582Sjkim * invoke all possible sleep states. 159138287Smarks * 160138287Smarks * RETURN: Status 161138287Smarks * 162245582Sjkim * DESCRIPTION: Simulate sleep/wake sequences 163138287Smarks * 164138287Smarks ******************************************************************************/ 165138287Smarks 166129684SnjlACPI_STATUS 167129684SnjlAcpiDbSleep ( 168129684Snjl char *ObjectArg) 169129684Snjl{ 170129684Snjl UINT8 SleepState; 171245582Sjkim UINT32 i; 172129684Snjl 173129684Snjl 174231844Sjkim ACPI_FUNCTION_TRACE (AcpiDbSleep); 175231844Sjkim 176231844Sjkim 177245582Sjkim /* Null input (no arguments) means to invoke all sleep states */ 178245582Sjkim 179245582Sjkim if (!ObjectArg) 180245582Sjkim { 181245582Sjkim AcpiOsPrintf ("Invoking all possible sleep states, 0-%d\n", 182245582Sjkim ACPI_S_STATES_MAX); 183245582Sjkim 184245582Sjkim for (i = 0; i <= ACPI_S_STATES_MAX; i++) 185245582Sjkim { 186245582Sjkim AcpiDbDoOneSleepState ((UINT8) i); 187245582Sjkim } 188245582Sjkim 189245582Sjkim return_ACPI_STATUS (AE_OK); 190245582Sjkim } 191245582Sjkim 192245582Sjkim /* Convert argument to binary and invoke the sleep state */ 193245582Sjkim 194306536Sjkim SleepState = (UINT8) strtoul (ObjectArg, NULL, 0); 195245582Sjkim AcpiDbDoOneSleepState (SleepState); 196245582Sjkim return_ACPI_STATUS (AE_OK); 197245582Sjkim} 198129684Snjl 199245582Sjkim 200245582Sjkim/******************************************************************************* 201245582Sjkim * 202245582Sjkim * FUNCTION: AcpiDbDoOneSleepState 203245582Sjkim * 204245582Sjkim * PARAMETERS: SleepState - Desired sleep state (0-5) 205245582Sjkim * 206306536Sjkim * RETURN: None 207245582Sjkim * 208245582Sjkim * DESCRIPTION: Simulate a sleep/wake sequence 209245582Sjkim * 210245582Sjkim ******************************************************************************/ 211245582Sjkim 212245582Sjkimstatic void 213245582SjkimAcpiDbDoOneSleepState ( 214245582Sjkim UINT8 SleepState) 215245582Sjkim{ 216245582Sjkim ACPI_STATUS Status; 217245582Sjkim UINT8 SleepTypeA; 218245582Sjkim UINT8 SleepTypeB; 219245582Sjkim 220245582Sjkim 221245582Sjkim /* Validate parameter */ 222245582Sjkim 223245582Sjkim if (SleepState > ACPI_S_STATES_MAX) 224245582Sjkim { 225245582Sjkim AcpiOsPrintf ("Sleep state %d out of range (%d max)\n", 226245582Sjkim SleepState, ACPI_S_STATES_MAX); 227245582Sjkim return; 228245582Sjkim } 229245582Sjkim 230245582Sjkim AcpiOsPrintf ("\n---- Invoking sleep state S%d (%s):\n", 231245582Sjkim SleepState, AcpiGbl_SleepStateNames[SleepState]); 232245582Sjkim 233245582Sjkim /* Get the values for the sleep type registers (for display only) */ 234245582Sjkim 235245582Sjkim Status = AcpiGetSleepTypeData (SleepState, &SleepTypeA, &SleepTypeB); 236245582Sjkim if (ACPI_FAILURE (Status)) 237245582Sjkim { 238245582Sjkim AcpiOsPrintf ("Could not evaluate [%s] method, %s\n", 239245582Sjkim AcpiGbl_SleepStateNames[SleepState], 240245582Sjkim AcpiFormatException (Status)); 241245582Sjkim return; 242245582Sjkim } 243245582Sjkim 244245582Sjkim AcpiOsPrintf ( 245245582Sjkim "Register values for sleep state S%d: Sleep-A: %.2X, Sleep-B: %.2X\n", 246245582Sjkim SleepState, SleepTypeA, SleepTypeB); 247245582Sjkim 248245582Sjkim /* Invoke the various sleep/wake interfaces */ 249245582Sjkim 250245582Sjkim AcpiOsPrintf ("**** Sleep: Prepare to sleep (S%d) ****\n", 251245582Sjkim SleepState); 252129684Snjl Status = AcpiEnterSleepStatePrep (SleepState); 253129684Snjl if (ACPI_FAILURE (Status)) 254129684Snjl { 255231844Sjkim goto ErrorExit; 256129684Snjl } 257129684Snjl 258245582Sjkim AcpiOsPrintf ("**** Sleep: Going to sleep (S%d) ****\n", 259245582Sjkim SleepState); 260239340Sjkim Status = AcpiEnterSleepState (SleepState); 261129684Snjl if (ACPI_FAILURE (Status)) 262129684Snjl { 263231844Sjkim goto ErrorExit; 264129684Snjl } 265129684Snjl 266245582Sjkim AcpiOsPrintf ("**** Wake: Prepare to return from sleep (S%d) ****\n", 267245582Sjkim SleepState); 268239340Sjkim Status = AcpiLeaveSleepStatePrep (SleepState); 269231844Sjkim if (ACPI_FAILURE (Status)) 270231844Sjkim { 271231844Sjkim goto ErrorExit; 272231844Sjkim } 273231844Sjkim 274245582Sjkim AcpiOsPrintf ("**** Wake: Return from sleep (S%d) ****\n", 275245582Sjkim SleepState); 276129684Snjl Status = AcpiLeaveSleepState (SleepState); 277231844Sjkim if (ACPI_FAILURE (Status)) 278231844Sjkim { 279231844Sjkim goto ErrorExit; 280231844Sjkim } 281129684Snjl 282245582Sjkim return; 283231844Sjkim 284231844Sjkim 285231844SjkimErrorExit: 286245582Sjkim ACPI_EXCEPTION ((AE_INFO, Status, "During invocation of sleep state S%d", 287245582Sjkim SleepState)); 288129684Snjl} 289129684Snjl 290231844Sjkim 29167754Smsmith/******************************************************************************* 29267754Smsmith * 29377424Smsmith * FUNCTION: AcpiDbDisplayLocks 29477424Smsmith * 29577424Smsmith * PARAMETERS: None 29677424Smsmith * 29777424Smsmith * RETURN: None 29877424Smsmith * 29977424Smsmith * DESCRIPTION: Display information about internal mutexes. 30077424Smsmith * 30177424Smsmith ******************************************************************************/ 30277424Smsmith 30377424Smsmithvoid 304151937SjkimAcpiDbDisplayLocks ( 305151937Sjkim void) 30677424Smsmith{ 30777424Smsmith UINT32 i; 30877424Smsmith 30977424Smsmith 310167802Sjkim for (i = 0; i < ACPI_MAX_MUTEX; i++) 31177424Smsmith { 31277424Smsmith AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i), 313167802Sjkim AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED 314167802Sjkim ? "Locked" : "Unlocked"); 31577424Smsmith } 31677424Smsmith} 31777424Smsmith 31877424Smsmith 31977424Smsmith/******************************************************************************* 32077424Smsmith * 32167754Smsmith * FUNCTION: AcpiDbDisplayTableInfo 32267754Smsmith * 323245582Sjkim * PARAMETERS: TableArg - Name of table to be displayed 32467754Smsmith * 32567754Smsmith * RETURN: None 32667754Smsmith * 327241973Sjkim * DESCRIPTION: Display information about loaded tables. Current 32867754Smsmith * implementation displays all loaded tables. 32967754Smsmith * 33067754Smsmith ******************************************************************************/ 33167754Smsmith 33267754Smsmithvoid 33367754SmsmithAcpiDbDisplayTableInfo ( 334114237Snjl char *TableArg) 33567754Smsmith{ 336193267Sjkim UINT32 i; 337117521Snjl ACPI_TABLE_DESC *TableDesc; 338193267Sjkim ACPI_STATUS Status; 33967754Smsmith 34067754Smsmith 341238381Sjkim /* Header */ 342238381Sjkim 343306536Sjkim AcpiOsPrintf ("Idx ID Status Type " 344306536Sjkim "TableHeader (Sig, Address, Length, Misc)\n"); 345238381Sjkim 346193267Sjkim /* Walk the entire root table list */ 347193267Sjkim 348207344Sjkim for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++) 34967754Smsmith { 350167802Sjkim TableDesc = &AcpiGbl_RootTableList.Tables[i]; 351167802Sjkim 352238381Sjkim /* Index and Table ID */ 353238381Sjkim 354238381Sjkim AcpiOsPrintf ("%3u %.2u ", i, TableDesc->OwnerId); 355238381Sjkim 356238381Sjkim /* Decode the table flags */ 357238381Sjkim 358238381Sjkim if (!(TableDesc->Flags & ACPI_TABLE_IS_LOADED)) 359238381Sjkim { 360238381Sjkim AcpiOsPrintf ("NotLoaded "); 361238381Sjkim } 362238381Sjkim else 363238381Sjkim { 364238381Sjkim AcpiOsPrintf (" Loaded "); 365238381Sjkim } 366238381Sjkim 367238381Sjkim switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) 368238381Sjkim { 369281075Sdim case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: 370250838Sjkim 371281075Sdim AcpiOsPrintf ("External/virtual "); 372238381Sjkim break; 373238381Sjkim 374281075Sdim case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL: 375250838Sjkim 376281075Sdim AcpiOsPrintf ("Internal/physical "); 377238381Sjkim break; 378238381Sjkim 379281075Sdim case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: 380250838Sjkim 381281075Sdim AcpiOsPrintf ("Internal/virtual "); 382238381Sjkim break; 383238381Sjkim 384238381Sjkim default: 385250838Sjkim 386281075Sdim AcpiOsPrintf ("INVALID TYPE "); 387238381Sjkim break; 388238381Sjkim } 389238381Sjkim 390193267Sjkim /* Make sure that the table is mapped */ 391193267Sjkim 392281075Sdim Status = AcpiTbValidateTable (TableDesc); 393193267Sjkim if (ACPI_FAILURE (Status)) 39467754Smsmith { 395193267Sjkim return; 39667754Smsmith } 397193267Sjkim 398193267Sjkim /* Dump the table header */ 399193267Sjkim 400193267Sjkim if (TableDesc->Pointer) 401193267Sjkim { 402193267Sjkim AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer); 403193267Sjkim } 404193267Sjkim else 405193267Sjkim { 406193267Sjkim /* If the pointer is null, the table has been unloaded */ 407193267Sjkim 408306536Sjkim ACPI_INFO (("%4.4s - Table has been unloaded", 409193267Sjkim TableDesc->Signature.Ascii)); 410193267Sjkim } 41167754Smsmith } 41267754Smsmith} 41367754Smsmith 41467754Smsmith 41567754Smsmith/******************************************************************************* 41667754Smsmith * 41767754Smsmith * FUNCTION: AcpiDbUnloadAcpiTable 41867754Smsmith * 419238381Sjkim * PARAMETERS: ObjectName - Namespace pathname for an object that 420238381Sjkim * is owned by the table to be unloaded 42167754Smsmith * 422238381Sjkim * RETURN: None 42367754Smsmith * 424238381Sjkim * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned 425238381Sjkim * by the table. 42667754Smsmith * 42767754Smsmith ******************************************************************************/ 42867754Smsmith 42967754Smsmithvoid 43067754SmsmithAcpiDbUnloadAcpiTable ( 431238381Sjkim char *ObjectName) 43267754Smsmith{ 433238381Sjkim ACPI_NAMESPACE_NODE *Node; 43467754Smsmith ACPI_STATUS Status; 43567754Smsmith 43667754Smsmith 437238381Sjkim /* Translate name to an Named object */ 43867754Smsmith 439238381Sjkim Node = AcpiDbConvertToNode (ObjectName); 440238381Sjkim if (!Node) 44167754Smsmith { 442238381Sjkim return; 443238381Sjkim } 44467754Smsmith 445238381Sjkim Status = AcpiUnloadParentTable (ACPI_CAST_PTR (ACPI_HANDLE, Node)); 446238381Sjkim if (ACPI_SUCCESS (Status)) 447238381Sjkim { 448238381Sjkim AcpiOsPrintf ("Parent of [%s] (%p) unloaded and uninstalled\n", 449238381Sjkim ObjectName, Node); 45067754Smsmith } 451238381Sjkim else 452238381Sjkim { 453238381Sjkim AcpiOsPrintf ("%s, while unloading parent table of [%s]\n", 454238381Sjkim AcpiFormatException (Status), ObjectName); 455238381Sjkim } 45667754Smsmith} 45767754Smsmith 45867754Smsmith 45967754Smsmith/******************************************************************************* 46067754Smsmith * 46167754Smsmith * FUNCTION: AcpiDbSendNotify 46267754Smsmith * 463245582Sjkim * PARAMETERS: Name - Name of ACPI object where to send notify 464245582Sjkim * Value - Value of the notify to send. 46567754Smsmith * 46667754Smsmith * RETURN: None 46767754Smsmith * 468241973Sjkim * DESCRIPTION: Send an ACPI notification. The value specified is sent to the 46967754Smsmith * named object as an ACPI notify. 47067754Smsmith * 47167754Smsmith ******************************************************************************/ 47267754Smsmith 47367754Smsmithvoid 47467754SmsmithAcpiDbSendNotify ( 475114237Snjl char *Name, 47667754Smsmith UINT32 Value) 47767754Smsmith{ 47867754Smsmith ACPI_NAMESPACE_NODE *Node; 47999679Siwasaki ACPI_STATUS Status; 48067754Smsmith 48167754Smsmith 48267754Smsmith /* Translate name to an Named object */ 48367754Smsmith 484151937Sjkim Node = AcpiDbConvertToNode (Name); 48567754Smsmith if (!Node) 48667754Smsmith { 48767754Smsmith return; 48867754Smsmith } 48967754Smsmith 490234623Sjkim /* Dispatch the notify if legal */ 49167754Smsmith 492234623Sjkim if (AcpiEvIsNotifyObject (Node)) 49367754Smsmith { 49499679Siwasaki Status = AcpiEvQueueNotifyRequest (Node, Value); 49599679Siwasaki if (ACPI_FAILURE (Status)) 49699679Siwasaki { 49799679Siwasaki AcpiOsPrintf ("Could not queue notify\n"); 49899679Siwasaki } 49967754Smsmith } 500234623Sjkim else 501234623Sjkim { 502245582Sjkim AcpiOsPrintf ( 503306536Sjkim "Named object [%4.4s] Type %s, " 504306536Sjkim "must be Device/Thermal/Processor type\n", 505234623Sjkim AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type)); 506234623Sjkim } 50767754Smsmith} 50867754Smsmith 50967754Smsmith 51067754Smsmith/******************************************************************************* 51167754Smsmith * 512210976Sjkim * FUNCTION: AcpiDbDisplayInterfaces 513210976Sjkim * 514210976Sjkim * PARAMETERS: ActionArg - Null, "install", or "remove" 515210976Sjkim * InterfaceNameArg - Name for install/remove options 516210976Sjkim * 517210976Sjkim * RETURN: None 518210976Sjkim * 519210976Sjkim * DESCRIPTION: Display or modify the global _OSI interface list 520210976Sjkim * 521210976Sjkim ******************************************************************************/ 522210976Sjkim 523210976Sjkimvoid 524210976SjkimAcpiDbDisplayInterfaces ( 525210976Sjkim char *ActionArg, 526210976Sjkim char *InterfaceNameArg) 527210976Sjkim{ 528210976Sjkim ACPI_INTERFACE_INFO *NextInterface; 529210976Sjkim char *SubString; 530210976Sjkim ACPI_STATUS Status; 531210976Sjkim 532210976Sjkim 533210976Sjkim /* If no arguments, just display current interface list */ 534210976Sjkim 535210976Sjkim if (!ActionArg) 536210976Sjkim { 537306536Sjkim (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER); 538210976Sjkim 539210976Sjkim NextInterface = AcpiGbl_SupportedInterfaces; 540210976Sjkim while (NextInterface) 541210976Sjkim { 542210976Sjkim if (!(NextInterface->Flags & ACPI_OSI_INVALID)) 543210976Sjkim { 544210976Sjkim AcpiOsPrintf ("%s\n", NextInterface->Name); 545210976Sjkim } 546306536Sjkim 547210976Sjkim NextInterface = NextInterface->Next; 548210976Sjkim } 549210976Sjkim 550210976Sjkim AcpiOsReleaseMutex (AcpiGbl_OsiMutex); 551210976Sjkim return; 552210976Sjkim } 553210976Sjkim 554210976Sjkim /* If ActionArg exists, so must InterfaceNameArg */ 555210976Sjkim 556210976Sjkim if (!InterfaceNameArg) 557210976Sjkim { 558210976Sjkim AcpiOsPrintf ("Missing Interface Name argument\n"); 559210976Sjkim return; 560210976Sjkim } 561210976Sjkim 562210976Sjkim /* Uppercase the action for match below */ 563210976Sjkim 564210976Sjkim AcpiUtStrupr (ActionArg); 565210976Sjkim 566210976Sjkim /* Install - install an interface */ 567210976Sjkim 568306536Sjkim SubString = strstr ("INSTALL", ActionArg); 569210976Sjkim if (SubString) 570210976Sjkim { 571210976Sjkim Status = AcpiInstallInterface (InterfaceNameArg); 572210976Sjkim if (ACPI_FAILURE (Status)) 573210976Sjkim { 574210976Sjkim AcpiOsPrintf ("%s, while installing \"%s\"\n", 575210976Sjkim AcpiFormatException (Status), InterfaceNameArg); 576210976Sjkim } 577210976Sjkim return; 578210976Sjkim } 579210976Sjkim 580210976Sjkim /* Remove - remove an interface */ 581210976Sjkim 582306536Sjkim SubString = strstr ("REMOVE", ActionArg); 583210976Sjkim if (SubString) 584210976Sjkim { 585210976Sjkim Status = AcpiRemoveInterface (InterfaceNameArg); 586210976Sjkim if (ACPI_FAILURE (Status)) 587210976Sjkim { 588210976Sjkim AcpiOsPrintf ("%s, while removing \"%s\"\n", 589210976Sjkim AcpiFormatException (Status), InterfaceNameArg); 590210976Sjkim } 591210976Sjkim return; 592210976Sjkim } 593210976Sjkim 594210976Sjkim /* Invalid ActionArg */ 595210976Sjkim 596210976Sjkim AcpiOsPrintf ("Invalid action argument: %s\n", ActionArg); 597210976Sjkim return; 598210976Sjkim} 599210976Sjkim 600210976Sjkim 601210976Sjkim/******************************************************************************* 602210976Sjkim * 603228110Sjkim * FUNCTION: AcpiDbDisplayTemplate 604228110Sjkim * 605245582Sjkim * PARAMETERS: BufferArg - Buffer name or address 606228110Sjkim * 607228110Sjkim * RETURN: None 608228110Sjkim * 609228110Sjkim * DESCRIPTION: Dump a buffer that contains a resource template 610228110Sjkim * 611228110Sjkim ******************************************************************************/ 612228110Sjkim 613228110Sjkimvoid 614228110SjkimAcpiDbDisplayTemplate ( 615228110Sjkim char *BufferArg) 616228110Sjkim{ 617228110Sjkim ACPI_NAMESPACE_NODE *Node; 618228110Sjkim ACPI_STATUS Status; 619245582Sjkim ACPI_BUFFER ReturnBuffer; 620228110Sjkim 621228110Sjkim 622228110Sjkim /* Translate BufferArg to an Named object */ 623228110Sjkim 624228110Sjkim Node = AcpiDbConvertToNode (BufferArg); 625228110Sjkim if (!Node || (Node == AcpiGbl_RootNode)) 626228110Sjkim { 627228110Sjkim AcpiOsPrintf ("Invalid argument: %s\n", BufferArg); 628228110Sjkim return; 629228110Sjkim } 630228110Sjkim 631228110Sjkim /* We must have a buffer object */ 632228110Sjkim 633228110Sjkim if (Node->Type != ACPI_TYPE_BUFFER) 634228110Sjkim { 635228110Sjkim AcpiOsPrintf ("Not a Buffer object, cannot be a template: %s\n", 636228110Sjkim BufferArg); 637228110Sjkim return; 638228110Sjkim } 639228110Sjkim 640245582Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 641245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 642228110Sjkim 643228110Sjkim /* Attempt to convert the raw buffer to a resource list */ 644228110Sjkim 645245582Sjkim Status = AcpiRsCreateResourceList (Node->Object, &ReturnBuffer); 646228110Sjkim 647228110Sjkim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 648228110Sjkim AcpiDbgLevel |= ACPI_LV_RESOURCES; 649228110Sjkim 650228110Sjkim if (ACPI_FAILURE (Status)) 651228110Sjkim { 652306536Sjkim AcpiOsPrintf ( 653306536Sjkim "Could not convert Buffer to a resource list: %s, %s\n", 654228110Sjkim BufferArg, AcpiFormatException (Status)); 655228110Sjkim goto DumpBuffer; 656228110Sjkim } 657228110Sjkim 658228110Sjkim /* Now we can dump the resource list */ 659228110Sjkim 660228110Sjkim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, 661245582Sjkim ReturnBuffer.Pointer)); 662228110Sjkim 663228110SjkimDumpBuffer: 664228110Sjkim AcpiOsPrintf ("\nRaw data buffer:\n"); 665241973Sjkim AcpiUtDebugDumpBuffer ((UINT8 *) Node->Object->Buffer.Pointer, 666228110Sjkim Node->Object->Buffer.Length, 667228110Sjkim DB_BYTE_DISPLAY, ACPI_UINT32_MAX); 668228110Sjkim 669228110Sjkim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 670228110Sjkim return; 671228110Sjkim} 672228110Sjkim 673228110Sjkim 674228110Sjkim/******************************************************************************* 675228110Sjkim * 676151937Sjkim * FUNCTION: AcpiDmCompareAmlResources 677151937Sjkim * 678151937Sjkim * PARAMETERS: Aml1Buffer - Contains first resource list 679151937Sjkim * Aml1BufferLength - Length of first resource list 680151937Sjkim * Aml2Buffer - Contains second resource list 681151937Sjkim * Aml2BufferLength - Length of second resource list 682151937Sjkim * 683151937Sjkim * RETURN: None 684151937Sjkim * 685151937Sjkim * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in 686151937Sjkim * order to isolate a miscompare to an individual resource) 687151937Sjkim * 688151937Sjkim ******************************************************************************/ 689151937Sjkim 690151937Sjkimstatic void 691151937SjkimAcpiDmCompareAmlResources ( 692151937Sjkim UINT8 *Aml1Buffer, 693151937Sjkim ACPI_RSDESC_SIZE Aml1BufferLength, 694151937Sjkim UINT8 *Aml2Buffer, 695151937Sjkim ACPI_RSDESC_SIZE Aml2BufferLength) 696151937Sjkim{ 697151937Sjkim UINT8 *Aml1; 698151937Sjkim UINT8 *Aml2; 699228110Sjkim UINT8 *Aml1End; 700228110Sjkim UINT8 *Aml2End; 701151937Sjkim ACPI_RSDESC_SIZE Aml1Length; 702151937Sjkim ACPI_RSDESC_SIZE Aml2Length; 703151937Sjkim ACPI_RSDESC_SIZE Offset = 0; 704151937Sjkim UINT8 ResourceType; 705151937Sjkim UINT32 Count = 0; 706228110Sjkim UINT32 i; 707151937Sjkim 708151937Sjkim 709151937Sjkim /* Compare overall buffer sizes (may be different due to size rounding) */ 710151937Sjkim 711151937Sjkim if (Aml1BufferLength != Aml2BufferLength) 712151937Sjkim { 713151937Sjkim AcpiOsPrintf ( 714306536Sjkim "**** Buffer length mismatch in converted " 715306536Sjkim "AML: Original %X, New %X ****\n", 716151937Sjkim Aml1BufferLength, Aml2BufferLength); 717151937Sjkim } 718151937Sjkim 719151937Sjkim Aml1 = Aml1Buffer; 720151937Sjkim Aml2 = Aml2Buffer; 721228110Sjkim Aml1End = Aml1Buffer + Aml1BufferLength; 722228110Sjkim Aml2End = Aml2Buffer + Aml2BufferLength; 723151937Sjkim 724151937Sjkim /* Walk the descriptor lists, comparing each descriptor */ 725151937Sjkim 726228110Sjkim while ((Aml1 < Aml1End) && (Aml2 < Aml2End)) 727151937Sjkim { 728151937Sjkim /* Get the lengths of each descriptor */ 729151937Sjkim 730151937Sjkim Aml1Length = AcpiUtGetDescriptorLength (Aml1); 731151937Sjkim Aml2Length = AcpiUtGetDescriptorLength (Aml2); 732151937Sjkim ResourceType = AcpiUtGetResourceType (Aml1); 733151937Sjkim 734151937Sjkim /* Check for descriptor length match */ 735151937Sjkim 736151937Sjkim if (Aml1Length != Aml2Length) 737151937Sjkim { 738151937Sjkim AcpiOsPrintf ( 739306536Sjkim "**** Length mismatch in descriptor [%.2X] type %2.2X, " 740306536Sjkim "Offset %8.8X Len1 %X, Len2 %X ****\n", 741151937Sjkim Count, ResourceType, Offset, Aml1Length, Aml2Length); 742151937Sjkim } 743151937Sjkim 744151937Sjkim /* Check for descriptor byte match */ 745151937Sjkim 746306536Sjkim else if (memcmp (Aml1, Aml2, Aml1Length)) 747151937Sjkim { 748151937Sjkim AcpiOsPrintf ( 749306536Sjkim "**** Data mismatch in descriptor [%.2X] type %2.2X, " 750306536Sjkim "Offset %8.8X ****\n", 751151937Sjkim Count, ResourceType, Offset); 752228110Sjkim 753228110Sjkim for (i = 0; i < Aml1Length; i++) 754228110Sjkim { 755228110Sjkim if (Aml1[i] != Aml2[i]) 756228110Sjkim { 757245582Sjkim AcpiOsPrintf ( 758306536Sjkim "Mismatch at byte offset %.2X: is %2.2X, " 759306536Sjkim "should be %2.2X\n", 760228110Sjkim i, Aml2[i], Aml1[i]); 761228110Sjkim } 762228110Sjkim } 763151937Sjkim } 764151937Sjkim 765151937Sjkim /* Exit on EndTag descriptor */ 766151937Sjkim 767151937Sjkim if (ResourceType == ACPI_RESOURCE_NAME_END_TAG) 768151937Sjkim { 769151937Sjkim return; 770151937Sjkim } 771151937Sjkim 772151937Sjkim /* Point to next descriptor in each buffer */ 773151937Sjkim 774151937Sjkim Count++; 775151937Sjkim Offset += Aml1Length; 776151937Sjkim Aml1 += Aml1Length; 777167802Sjkim Aml2 += Aml2Length; 778151937Sjkim } 779151937Sjkim} 780151937Sjkim 781151937Sjkim 782151937Sjkim/******************************************************************************* 783151937Sjkim * 784151937Sjkim * FUNCTION: AcpiDmTestResourceConversion 785151937Sjkim * 786245582Sjkim * PARAMETERS: Node - Parent device node 787245582Sjkim * Name - resource method name (_CRS) 788151937Sjkim * 789151937Sjkim * RETURN: Status 790151937Sjkim * 791151937Sjkim * DESCRIPTION: Compare the original AML with a conversion of the AML to 792151937Sjkim * internal resource list, then back to AML. 793151937Sjkim * 794151937Sjkim ******************************************************************************/ 795151937Sjkim 796151937Sjkimstatic ACPI_STATUS 797151937SjkimAcpiDmTestResourceConversion ( 798151937Sjkim ACPI_NAMESPACE_NODE *Node, 799151937Sjkim char *Name) 800151937Sjkim{ 801151937Sjkim ACPI_STATUS Status; 802245582Sjkim ACPI_BUFFER ReturnBuffer; 803245582Sjkim ACPI_BUFFER ResourceBuffer; 804151937Sjkim ACPI_BUFFER NewAml; 805151937Sjkim ACPI_OBJECT *OriginalAml; 806151937Sjkim 807151937Sjkim 808151937Sjkim AcpiOsPrintf ("Resource Conversion Comparison:\n"); 809151937Sjkim 810151937Sjkim NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 811245582Sjkim ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 812245582Sjkim ResourceBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 813151937Sjkim 814151937Sjkim /* Get the original _CRS AML resource template */ 815151937Sjkim 816245582Sjkim Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnBuffer); 817151937Sjkim if (ACPI_FAILURE (Status)) 818151937Sjkim { 819151937Sjkim AcpiOsPrintf ("Could not obtain %s: %s\n", 820151937Sjkim Name, AcpiFormatException (Status)); 821151937Sjkim return (Status); 822151937Sjkim } 823151937Sjkim 824151937Sjkim /* Get the AML resource template, converted to internal resource structs */ 825151937Sjkim 826245582Sjkim Status = AcpiGetCurrentResources (Node, &ResourceBuffer); 827151937Sjkim if (ACPI_FAILURE (Status)) 828151937Sjkim { 829151937Sjkim AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n", 830151937Sjkim AcpiFormatException (Status)); 831151937Sjkim goto Exit1; 832151937Sjkim } 833151937Sjkim 834151937Sjkim /* Convert internal resource list to external AML resource template */ 835151937Sjkim 836281075Sdim Status = AcpiRsCreateAmlResources (&ResourceBuffer, &NewAml); 837151937Sjkim if (ACPI_FAILURE (Status)) 838151937Sjkim { 839151937Sjkim AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n", 840151937Sjkim AcpiFormatException (Status)); 841151937Sjkim goto Exit2; 842151937Sjkim } 843151937Sjkim 844151937Sjkim /* Compare original AML to the newly created AML resource list */ 845151937Sjkim 846245582Sjkim OriginalAml = ReturnBuffer.Pointer; 847151937Sjkim 848281075Sdim AcpiDmCompareAmlResources (OriginalAml->Buffer.Pointer, 849281075Sdim (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length, 850193267Sjkim NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length); 851151937Sjkim 852151937Sjkim /* Cleanup and exit */ 853151937Sjkim 854167802Sjkim ACPI_FREE (NewAml.Pointer); 855151937SjkimExit2: 856245582Sjkim ACPI_FREE (ResourceBuffer.Pointer); 857151937SjkimExit1: 858245582Sjkim ACPI_FREE (ReturnBuffer.Pointer); 859151937Sjkim return (Status); 860151937Sjkim} 861151937Sjkim 862151937Sjkim 863151937Sjkim/******************************************************************************* 864151937Sjkim * 865228110Sjkim * FUNCTION: AcpiDbResourceCallback 86673561Smsmith * 867228110Sjkim * PARAMETERS: ACPI_WALK_RESOURCE_CALLBACK 86873561Smsmith * 869228110Sjkim * RETURN: Status 87073561Smsmith * 871245582Sjkim * DESCRIPTION: Simple callback to exercise AcpiWalkResources and 872245582Sjkim * AcpiWalkResourceBuffer. 87373561Smsmith * 87473561Smsmith ******************************************************************************/ 87573561Smsmith 876228110Sjkimstatic ACPI_STATUS 877228110SjkimAcpiDbResourceCallback ( 878228110Sjkim ACPI_RESOURCE *Resource, 879228110Sjkim void *Context) 88073561Smsmith{ 881228110Sjkim 882228110Sjkim return (AE_OK); 883228110Sjkim} 884228110Sjkim 885228110Sjkim 886228110Sjkim/******************************************************************************* 887228110Sjkim * 888228110Sjkim * FUNCTION: AcpiDbDeviceResources 889228110Sjkim * 890228110Sjkim * PARAMETERS: ACPI_WALK_CALLBACK 891228110Sjkim * 892228110Sjkim * RETURN: Status 893228110Sjkim * 894228110Sjkim * DESCRIPTION: Display the _PRT/_CRS/_PRS resources for a device object. 895228110Sjkim * 896228110Sjkim ******************************************************************************/ 897228110Sjkim 898228110Sjkimstatic ACPI_STATUS 899228110SjkimAcpiDbDeviceResources ( 900228110Sjkim ACPI_HANDLE ObjHandle, 901228110Sjkim UINT32 NestingLevel, 902228110Sjkim void *Context, 903228110Sjkim void **ReturnValue) 904228110Sjkim{ 905151937Sjkim ACPI_NAMESPACE_NODE *Node; 906228110Sjkim ACPI_NAMESPACE_NODE *PrtNode = NULL; 907228110Sjkim ACPI_NAMESPACE_NODE *CrsNode = NULL; 908228110Sjkim ACPI_NAMESPACE_NODE *PrsNode = NULL; 909228110Sjkim ACPI_NAMESPACE_NODE *AeiNode = NULL; 910228110Sjkim char *ParentPath; 911245582Sjkim ACPI_BUFFER ReturnBuffer; 91273561Smsmith ACPI_STATUS Status; 91373561Smsmith 91473561Smsmith 915228110Sjkim Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle); 916306536Sjkim ParentPath = AcpiNsGetNormalizedPathname (Node, TRUE); 917228110Sjkim if (!ParentPath) 918228110Sjkim { 919228110Sjkim return (AE_NO_MEMORY); 920228110Sjkim } 92173561Smsmith 922228110Sjkim /* Get handles to the resource methods for this device */ 92373561Smsmith 924306536Sjkim (void) AcpiGetHandle (Node, METHOD_NAME__PRT, 925306536Sjkim ACPI_CAST_PTR (ACPI_HANDLE, &PrtNode)); 926306536Sjkim (void) AcpiGetHandle (Node, METHOD_NAME__CRS, 927306536Sjkim ACPI_CAST_PTR (ACPI_HANDLE, &CrsNode)); 928306536Sjkim (void) AcpiGetHandle (Node, METHOD_NAME__PRS, 929306536Sjkim ACPI_CAST_PTR (ACPI_HANDLE, &PrsNode)); 930306536Sjkim (void) AcpiGetHandle (Node, METHOD_NAME__AEI, 931306536Sjkim ACPI_CAST_PTR (ACPI_HANDLE, &AeiNode)); 932306536Sjkim 933228110Sjkim if (!PrtNode && !CrsNode && !PrsNode && !AeiNode) 934151937Sjkim { 935228110Sjkim goto Cleanup; /* Nothing to do */ 936151937Sjkim } 93773561Smsmith 938228110Sjkim AcpiOsPrintf ("\nDevice: %s\n", ParentPath); 939228110Sjkim 94073561Smsmith /* Prepare for a return object of arbitrary size */ 94173561Smsmith 942245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 943245582Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 94473561Smsmith 945228110Sjkim 94677424Smsmith /* _PRT */ 94777424Smsmith 948228110Sjkim if (PrtNode) 949228110Sjkim { 950228110Sjkim AcpiOsPrintf ("Evaluating _PRT\n"); 95177424Smsmith 952245582Sjkim Status = AcpiEvaluateObject (PrtNode, NULL, NULL, &ReturnBuffer); 953228110Sjkim if (ACPI_FAILURE (Status)) 954228110Sjkim { 955228110Sjkim AcpiOsPrintf ("Could not evaluate _PRT: %s\n", 956228110Sjkim AcpiFormatException (Status)); 957228110Sjkim goto GetCrs; 958228110Sjkim } 959151937Sjkim 960245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 961245582Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 96273561Smsmith 963245582Sjkim Status = AcpiGetIrqRoutingTable (Node, &ReturnBuffer); 964228110Sjkim if (ACPI_FAILURE (Status)) 965228110Sjkim { 966228110Sjkim AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n", 967228110Sjkim AcpiFormatException (Status)); 968228110Sjkim goto GetCrs; 969228110Sjkim } 97073561Smsmith 971228110Sjkim AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer)); 97277424Smsmith } 97377424Smsmith 97477424Smsmith 97577424Smsmith /* _CRS */ 97683174Smsmith 97783174SmsmithGetCrs: 978228110Sjkim if (CrsNode) 979228110Sjkim { 980228110Sjkim AcpiOsPrintf ("Evaluating _CRS\n"); 98177424Smsmith 982245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 983245582Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 98477424Smsmith 985245582Sjkim Status = AcpiEvaluateObject (CrsNode, NULL, NULL, &ReturnBuffer); 986228110Sjkim if (ACPI_FAILURE (Status)) 987228110Sjkim { 988228110Sjkim AcpiOsPrintf ("Could not evaluate _CRS: %s\n", 989228110Sjkim AcpiFormatException (Status)); 990228110Sjkim goto GetPrs; 991228110Sjkim } 992151937Sjkim 993245582Sjkim /* This code exercises the AcpiWalkResources interface */ 99477424Smsmith 995228110Sjkim Status = AcpiWalkResources (Node, METHOD_NAME__CRS, 996228110Sjkim AcpiDbResourceCallback, NULL); 997228110Sjkim if (ACPI_FAILURE (Status)) 998228110Sjkim { 999228110Sjkim AcpiOsPrintf ("AcpiWalkResources failed: %s\n", 1000228110Sjkim AcpiFormatException (Status)); 1001228110Sjkim goto GetPrs; 1002228110Sjkim } 100377424Smsmith 1004245582Sjkim /* Get the _CRS resource list (test ALLOCATE buffer) */ 1005151937Sjkim 1006245582Sjkim ReturnBuffer.Pointer = NULL; 1007306536Sjkim ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 100877424Smsmith 1009245582Sjkim Status = AcpiGetCurrentResources (Node, &ReturnBuffer); 1010228110Sjkim if (ACPI_FAILURE (Status)) 1011228110Sjkim { 1012228110Sjkim AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n", 1013228110Sjkim AcpiFormatException (Status)); 1014228110Sjkim goto GetPrs; 1015228110Sjkim } 1016151937Sjkim 1017245582Sjkim /* This code exercises the AcpiWalkResourceBuffer interface */ 1018245582Sjkim 1019245582Sjkim Status = AcpiWalkResourceBuffer (&ReturnBuffer, 1020245582Sjkim AcpiDbResourceCallback, NULL); 1021245582Sjkim if (ACPI_FAILURE (Status)) 1022245582Sjkim { 1023245582Sjkim AcpiOsPrintf ("AcpiWalkResourceBuffer failed: %s\n", 1024245582Sjkim AcpiFormatException (Status)); 1025245582Sjkim goto EndCrs; 1026245582Sjkim } 1027245582Sjkim 1028228110Sjkim /* Dump the _CRS resource list */ 1029151937Sjkim 1030228110Sjkim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, 1031245582Sjkim ReturnBuffer.Pointer)); 1032151937Sjkim 1033228110Sjkim /* 1034245582Sjkim * Perform comparison of original AML to newly created AML. This 1035245582Sjkim * tests both the AML->Resource conversion and the Resource->AML 1036245582Sjkim * conversion. 1037228110Sjkim */ 1038245582Sjkim (void) AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS); 1039151937Sjkim 1040228110Sjkim /* Execute _SRS with the resource list */ 1041228110Sjkim 1042246849Sjkim AcpiOsPrintf ("Evaluating _SRS\n"); 1043246849Sjkim 1044245582Sjkim Status = AcpiSetCurrentResources (Node, &ReturnBuffer); 1045228110Sjkim if (ACPI_FAILURE (Status)) 1046228110Sjkim { 1047228110Sjkim AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n", 1048228110Sjkim AcpiFormatException (Status)); 1049245582Sjkim goto EndCrs; 1050228110Sjkim } 1051245582Sjkim 1052245582SjkimEndCrs: 1053281075Sdim ACPI_FREE (ReturnBuffer.Pointer); 105491116Smsmith } 105583174Smsmith 105691116Smsmith 105777424Smsmith /* _PRS */ 105883174Smsmith 105983174SmsmithGetPrs: 1060228110Sjkim if (PrsNode) 1061228110Sjkim { 1062228110Sjkim AcpiOsPrintf ("Evaluating _PRS\n"); 106377424Smsmith 1064245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1065245582Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 106677424Smsmith 1067245582Sjkim Status = AcpiEvaluateObject (PrsNode, NULL, NULL, &ReturnBuffer); 1068228110Sjkim if (ACPI_FAILURE (Status)) 1069228110Sjkim { 1070228110Sjkim AcpiOsPrintf ("Could not evaluate _PRS: %s\n", 1071228110Sjkim AcpiFormatException (Status)); 1072228110Sjkim goto GetAei; 1073228110Sjkim } 1074151937Sjkim 1075245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1076306536Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1077228110Sjkim 1078245582Sjkim Status = AcpiGetPossibleResources (Node, &ReturnBuffer); 1079228110Sjkim if (ACPI_FAILURE (Status)) 1080228110Sjkim { 1081228110Sjkim AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n", 1082228110Sjkim AcpiFormatException (Status)); 1083228110Sjkim goto GetAei; 1084228110Sjkim } 1085228110Sjkim 1086306536Sjkim AcpiRsDumpResourceList (ACPI_CAST_PTR ( 1087306536Sjkim ACPI_RESOURCE, AcpiGbl_DbBuffer)); 108873561Smsmith } 108973561Smsmith 109077424Smsmith 1091228110Sjkim /* _AEI */ 1092228110Sjkim 1093228110SjkimGetAei: 1094228110Sjkim if (AeiNode) 109573561Smsmith { 1096228110Sjkim AcpiOsPrintf ("Evaluating _AEI\n"); 1097228110Sjkim 1098245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1099306536Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1100228110Sjkim 1101245582Sjkim Status = AcpiEvaluateObject (AeiNode, NULL, NULL, &ReturnBuffer); 1102228110Sjkim if (ACPI_FAILURE (Status)) 1103228110Sjkim { 1104228110Sjkim AcpiOsPrintf ("Could not evaluate _AEI: %s\n", 1105228110Sjkim AcpiFormatException (Status)); 1106228110Sjkim goto Cleanup; 1107228110Sjkim } 1108228110Sjkim 1109245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1110306536Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1111228110Sjkim 1112245582Sjkim Status = AcpiGetEventResources (Node, &ReturnBuffer); 1113228110Sjkim if (ACPI_FAILURE (Status)) 1114228110Sjkim { 1115228110Sjkim AcpiOsPrintf ("AcpiGetEventResources failed: %s\n", 1116228110Sjkim AcpiFormatException (Status)); 1117228110Sjkim goto Cleanup; 1118228110Sjkim } 1119228110Sjkim 1120306536Sjkim AcpiRsDumpResourceList (ACPI_CAST_PTR ( 1121306536Sjkim ACPI_RESOURCE, AcpiGbl_DbBuffer)); 112273561Smsmith } 112377424Smsmith 1124151937Sjkim 112573561SmsmithCleanup: 1126228110Sjkim ACPI_FREE (ParentPath); 1127228110Sjkim return (AE_OK); 1128228110Sjkim} 112973561Smsmith 1130228110Sjkim 1131228110Sjkim/******************************************************************************* 1132228110Sjkim * 1133228110Sjkim * FUNCTION: AcpiDbDisplayResources 1134228110Sjkim * 1135245582Sjkim * PARAMETERS: ObjectArg - String object name or object pointer. 1136246849Sjkim * NULL or "*" means "display resources for 1137246849Sjkim * all devices" 1138228110Sjkim * 1139228110Sjkim * RETURN: None 1140228110Sjkim * 1141228110Sjkim * DESCRIPTION: Display the resource objects associated with a device. 1142228110Sjkim * 1143228110Sjkim ******************************************************************************/ 1144228110Sjkim 1145228110Sjkimvoid 1146228110SjkimAcpiDbDisplayResources ( 1147228110Sjkim char *ObjectArg) 1148228110Sjkim{ 1149228110Sjkim ACPI_NAMESPACE_NODE *Node; 1150228110Sjkim 1151228110Sjkim 1152228110Sjkim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 1153228110Sjkim AcpiDbgLevel |= ACPI_LV_RESOURCES; 1154228110Sjkim 1155228110Sjkim /* Asterisk means "display resources for all devices" */ 1156228110Sjkim 1157306536Sjkim if (!ObjectArg || (!strcmp (ObjectArg, "*"))) 1158228110Sjkim { 1159228110Sjkim (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, 1160306536Sjkim ACPI_UINT32_MAX, AcpiDbDeviceResources, NULL, NULL, NULL); 1161228110Sjkim } 1162228110Sjkim else 1163228110Sjkim { 1164228110Sjkim /* Convert string to object pointer */ 1165228110Sjkim 1166228110Sjkim Node = AcpiDbConvertToNode (ObjectArg); 1167228110Sjkim if (Node) 1168228110Sjkim { 1169228110Sjkim if (Node->Type != ACPI_TYPE_DEVICE) 1170228110Sjkim { 1171306536Sjkim AcpiOsPrintf ( 1172306536Sjkim "%4.4s: Name is not a device object (%s)\n", 1173228110Sjkim Node->Name.Ascii, AcpiUtGetTypeName (Node->Type)); 1174228110Sjkim } 1175228110Sjkim else 1176228110Sjkim { 1177228110Sjkim (void) AcpiDbDeviceResources (Node, 0, NULL, NULL); 1178228110Sjkim } 1179228110Sjkim } 1180228110Sjkim } 1181228110Sjkim 118291116Smsmith AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 118373561Smsmith} 118473561Smsmith 118573561Smsmith 1186231844Sjkim#if (!ACPI_REDUCED_HARDWARE) 118799679Siwasaki/******************************************************************************* 118899679Siwasaki * 1189114237Snjl * FUNCTION: AcpiDbGenerateGpe 1190114237Snjl * 1191245582Sjkim * PARAMETERS: GpeArg - Raw GPE number, ascii string 1192245582Sjkim * BlockArg - GPE block number, ascii string 1193245582Sjkim * 0 or 1 for FADT GPE blocks 1194114237Snjl * 1195114237Snjl * RETURN: None 1196114237Snjl * 1197245582Sjkim * DESCRIPTION: Simulate firing of a GPE 1198114237Snjl * 1199114237Snjl ******************************************************************************/ 1200114237Snjl 1201114237Snjlvoid 1202114237SnjlAcpiDbGenerateGpe ( 1203114237Snjl char *GpeArg, 1204114237Snjl char *BlockArg) 1205114237Snjl{ 1206281075Sdim UINT32 BlockNumber = 0; 1207114237Snjl UINT32 GpeNumber; 1208114237Snjl ACPI_GPE_EVENT_INFO *GpeEventInfo; 1209114237Snjl 1210114237Snjl 1211306536Sjkim GpeNumber = strtoul (GpeArg, NULL, 0); 1212114237Snjl 1213281075Sdim /* 1214281075Sdim * If no block arg, or block arg == 0 or 1, use the FADT-defined 1215281075Sdim * GPE blocks. 1216281075Sdim */ 1217281075Sdim if (BlockArg) 1218281075Sdim { 1219306536Sjkim BlockNumber = strtoul (BlockArg, NULL, 0); 1220281075Sdim if (BlockNumber == 1) 1221281075Sdim { 1222281075Sdim BlockNumber = 0; 1223281075Sdim } 1224281075Sdim } 1225114237Snjl 1226306536Sjkim GpeEventInfo = AcpiEvGetGpeEventInfo ( 1227306536Sjkim ACPI_TO_POINTER (BlockNumber), GpeNumber); 1228114237Snjl if (!GpeEventInfo) 1229114237Snjl { 1230114237Snjl AcpiOsPrintf ("Invalid GPE\n"); 1231114237Snjl return; 1232114237Snjl } 1233114237Snjl 1234216471Sjkim (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber); 1235114237Snjl} 1236254745Sjkim 1237306536Sjkim 1238306536Sjkim/******************************************************************************* 1239306536Sjkim * 1240306536Sjkim * FUNCTION: AcpiDbGenerateSci 1241306536Sjkim * 1242306536Sjkim * PARAMETERS: None 1243306536Sjkim * 1244306536Sjkim * RETURN: None 1245306536Sjkim * 1246306536Sjkim * DESCRIPTION: Simulate an SCI -- just call the SCI dispatch. 1247306536Sjkim * 1248306536Sjkim ******************************************************************************/ 1249306536Sjkim 1250254745Sjkimvoid 1251254745SjkimAcpiDbGenerateSci ( 1252254745Sjkim void) 1253254745Sjkim{ 1254254745Sjkim AcpiEvSciDispatch (); 1255254745Sjkim} 1256254745Sjkim 1257231844Sjkim#endif /* !ACPI_REDUCED_HARDWARE */ 1258114237Snjl 1259306536Sjkim 1260306536Sjkim/******************************************************************************* 1261306536Sjkim * 1262306536Sjkim * FUNCTION: AcpiDbTrace 1263306536Sjkim * 1264306536Sjkim * PARAMETERS: EnableArg - ENABLE/AML to enable tracer 1265306536Sjkim * DISABLE to disable tracer 1266306536Sjkim * MethodArg - Method to trace 1267306536Sjkim * OnceArg - Whether trace once 1268306536Sjkim * 1269306536Sjkim * RETURN: None 1270306536Sjkim * 1271306536Sjkim * DESCRIPTION: Control method tracing facility 1272306536Sjkim * 1273306536Sjkim ******************************************************************************/ 1274306536Sjkim 1275306536Sjkimvoid 1276306536SjkimAcpiDbTrace ( 1277306536Sjkim char *EnableArg, 1278306536Sjkim char *MethodArg, 1279306536Sjkim char *OnceArg) 1280306536Sjkim{ 1281306536Sjkim UINT32 DebugLevel = 0; 1282306536Sjkim UINT32 DebugLayer = 0; 1283306536Sjkim UINT32 Flags = 0; 1284306536Sjkim 1285306536Sjkim 1286306536Sjkim AcpiUtStrupr (EnableArg); 1287306536Sjkim AcpiUtStrupr (OnceArg); 1288306536Sjkim 1289306536Sjkim if (MethodArg) 1290306536Sjkim { 1291306536Sjkim if (AcpiDbTraceMethodName) 1292306536Sjkim { 1293306536Sjkim ACPI_FREE (AcpiDbTraceMethodName); 1294306536Sjkim AcpiDbTraceMethodName = NULL; 1295306536Sjkim } 1296306536Sjkim 1297306536Sjkim AcpiDbTraceMethodName = ACPI_ALLOCATE (strlen (MethodArg) + 1); 1298306536Sjkim if (!AcpiDbTraceMethodName) 1299306536Sjkim { 1300306536Sjkim AcpiOsPrintf ("Failed to allocate method name (%s)\n", 1301306536Sjkim MethodArg); 1302306536Sjkim return; 1303306536Sjkim } 1304306536Sjkim 1305306536Sjkim strcpy (AcpiDbTraceMethodName, MethodArg); 1306306536Sjkim } 1307306536Sjkim 1308306536Sjkim if (!strcmp (EnableArg, "ENABLE") || 1309306536Sjkim !strcmp (EnableArg, "METHOD") || 1310306536Sjkim !strcmp (EnableArg, "OPCODE")) 1311306536Sjkim { 1312306536Sjkim if (!strcmp (EnableArg, "ENABLE")) 1313306536Sjkim { 1314306536Sjkim /* Inherit current console settings */ 1315306536Sjkim 1316306536Sjkim DebugLevel = AcpiGbl_DbConsoleDebugLevel; 1317306536Sjkim DebugLayer = AcpiDbgLayer; 1318306536Sjkim } 1319306536Sjkim else 1320306536Sjkim { 1321306536Sjkim /* Restrict console output to trace points only */ 1322306536Sjkim 1323306536Sjkim DebugLevel = ACPI_LV_TRACE_POINT; 1324306536Sjkim DebugLayer = ACPI_EXECUTER; 1325306536Sjkim } 1326306536Sjkim 1327306536Sjkim Flags = ACPI_TRACE_ENABLED; 1328306536Sjkim 1329306536Sjkim if (!strcmp (EnableArg, "OPCODE")) 1330306536Sjkim { 1331306536Sjkim Flags |= ACPI_TRACE_OPCODE; 1332306536Sjkim } 1333306536Sjkim 1334306536Sjkim if (OnceArg && !strcmp (OnceArg, "ONCE")) 1335306536Sjkim { 1336306536Sjkim Flags |= ACPI_TRACE_ONESHOT; 1337306536Sjkim } 1338306536Sjkim } 1339306536Sjkim 1340306536Sjkim (void) AcpiDebugTrace (AcpiDbTraceMethodName, 1341306536Sjkim DebugLevel, DebugLayer, Flags); 1342306536Sjkim} 1343