167754Smsmith/******************************************************************************* 267754Smsmith * 3218590Sjkim * Module Name: dbcmds - Miscellaneous debug commands and output routines 467754Smsmith * 567754Smsmith ******************************************************************************/ 667754Smsmith 7217365Sjkim/* 8281075Sdim * Copyright (C) 2000 - 2015, 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 52102550Siwasaki#ifdef ACPI_DEBUGGER 5367754Smsmith 54102550Siwasaki#define _COMPONENT ACPI_CA_DEBUGGER 5591116Smsmith ACPI_MODULE_NAME ("dbcmds") 5667754Smsmith 57198237Sjkim 58151937Sjkim/* Local prototypes */ 5967754Smsmith 60151937Sjkimstatic void 61151937SjkimAcpiDmCompareAmlResources ( 62151937Sjkim UINT8 *Aml1Buffer, 63151937Sjkim ACPI_RSDESC_SIZE Aml1BufferLength, 64151937Sjkim UINT8 *Aml2Buffer, 65151937Sjkim ACPI_RSDESC_SIZE Aml2BufferLength); 66151937Sjkim 67151937Sjkimstatic ACPI_STATUS 68151937SjkimAcpiDmTestResourceConversion ( 69151937Sjkim ACPI_NAMESPACE_NODE *Node, 70151937Sjkim char *Name); 71151937Sjkim 72228110Sjkimstatic ACPI_STATUS 73228110SjkimAcpiDbResourceCallback ( 74228110Sjkim ACPI_RESOURCE *Resource, 75228110Sjkim void *Context); 76151937Sjkim 77228110Sjkimstatic ACPI_STATUS 78228110SjkimAcpiDbDeviceResources ( 79228110Sjkim ACPI_HANDLE ObjHandle, 80228110Sjkim UINT32 NestingLevel, 81228110Sjkim void *Context, 82228110Sjkim void **ReturnValue); 83228110Sjkim 84245582Sjkimstatic void 85245582SjkimAcpiDbDoOneSleepState ( 86245582Sjkim UINT8 SleepState); 87228110Sjkim 88245582Sjkim 89138287Smarks/******************************************************************************* 90138287Smarks * 91151937Sjkim * FUNCTION: AcpiDbConvertToNode 92151937Sjkim * 93245582Sjkim * PARAMETERS: InString - String to convert 94151937Sjkim * 95151937Sjkim * RETURN: Pointer to a NS node 96151937Sjkim * 97241973Sjkim * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or 98245582Sjkim * alphanumeric strings. 99151937Sjkim * 100151937Sjkim ******************************************************************************/ 101151937Sjkim 102218590SjkimACPI_NAMESPACE_NODE * 103151937SjkimAcpiDbConvertToNode ( 104151937Sjkim char *InString) 105151937Sjkim{ 106151937Sjkim ACPI_NAMESPACE_NODE *Node; 107252279Sjkim ACPI_SIZE Address; 108151937Sjkim 109151937Sjkim 110151937Sjkim if ((*InString >= 0x30) && (*InString <= 0x39)) 111151937Sjkim { 112151937Sjkim /* Numeric argument, convert */ 113151937Sjkim 114252279Sjkim Address = ACPI_STRTOUL (InString, NULL, 16); 115252279Sjkim Node = ACPI_TO_POINTER (Address); 116151937Sjkim if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE))) 117151937Sjkim { 118281075Sdim AcpiOsPrintf ("Address %p is invalid", 119151937Sjkim Node); 120151937Sjkim return (NULL); 121151937Sjkim } 122151937Sjkim 123151937Sjkim /* Make sure pointer is valid NS node */ 124151937Sjkim 125151937Sjkim if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED) 126151937Sjkim { 127281075Sdim AcpiOsPrintf ("Address %p is not a valid namespace node [%s]\n", 128151937Sjkim Node, AcpiUtGetDescriptorName (Node)); 129151937Sjkim return (NULL); 130151937Sjkim } 131151937Sjkim } 132151937Sjkim else 133151937Sjkim { 134245582Sjkim /* 135245582Sjkim * Alpha argument: The parameter is a name string that must be 136245582Sjkim * resolved to a Namespace object. 137151937Sjkim */ 138151937Sjkim Node = AcpiDbLocalNsLookup (InString); 139151937Sjkim if (!Node) 140151937Sjkim { 141281075Sdim AcpiOsPrintf ("Could not find [%s] in namespace, defaulting to root node\n", 142281075Sdim InString); 143151937Sjkim Node = AcpiGbl_RootNode; 144151937Sjkim } 145151937Sjkim } 146151937Sjkim 147151937Sjkim return (Node); 148151937Sjkim} 149151937Sjkim 150151937Sjkim 151151937Sjkim/******************************************************************************* 152151937Sjkim * 153138287Smarks * FUNCTION: AcpiDbSleep 154138287Smarks * 155245582Sjkim * PARAMETERS: ObjectArg - Desired sleep state (0-5). NULL means 156245582Sjkim * invoke all possible sleep states. 157138287Smarks * 158138287Smarks * RETURN: Status 159138287Smarks * 160245582Sjkim * DESCRIPTION: Simulate sleep/wake sequences 161138287Smarks * 162138287Smarks ******************************************************************************/ 163138287Smarks 164129684SnjlACPI_STATUS 165129684SnjlAcpiDbSleep ( 166129684Snjl char *ObjectArg) 167129684Snjl{ 168129684Snjl UINT8 SleepState; 169245582Sjkim UINT32 i; 170129684Snjl 171129684Snjl 172231844Sjkim ACPI_FUNCTION_TRACE (AcpiDbSleep); 173231844Sjkim 174231844Sjkim 175245582Sjkim /* Null input (no arguments) means to invoke all sleep states */ 176245582Sjkim 177245582Sjkim if (!ObjectArg) 178245582Sjkim { 179245582Sjkim AcpiOsPrintf ("Invoking all possible sleep states, 0-%d\n", 180245582Sjkim ACPI_S_STATES_MAX); 181245582Sjkim 182245582Sjkim for (i = 0; i <= ACPI_S_STATES_MAX; i++) 183245582Sjkim { 184245582Sjkim AcpiDbDoOneSleepState ((UINT8) i); 185245582Sjkim } 186245582Sjkim 187245582Sjkim return_ACPI_STATUS (AE_OK); 188245582Sjkim } 189245582Sjkim 190245582Sjkim /* Convert argument to binary and invoke the sleep state */ 191245582Sjkim 192129684Snjl SleepState = (UINT8) ACPI_STRTOUL (ObjectArg, NULL, 0); 193245582Sjkim AcpiDbDoOneSleepState (SleepState); 194245582Sjkim return_ACPI_STATUS (AE_OK); 195245582Sjkim} 196129684Snjl 197245582Sjkim 198245582Sjkim/******************************************************************************* 199245582Sjkim * 200245582Sjkim * FUNCTION: AcpiDbDoOneSleepState 201245582Sjkim * 202245582Sjkim * PARAMETERS: SleepState - Desired sleep state (0-5) 203245582Sjkim * 204245582Sjkim * RETURN: Status 205245582Sjkim * 206245582Sjkim * DESCRIPTION: Simulate a sleep/wake sequence 207245582Sjkim * 208245582Sjkim ******************************************************************************/ 209245582Sjkim 210245582Sjkimstatic void 211245582SjkimAcpiDbDoOneSleepState ( 212245582Sjkim UINT8 SleepState) 213245582Sjkim{ 214245582Sjkim ACPI_STATUS Status; 215245582Sjkim UINT8 SleepTypeA; 216245582Sjkim UINT8 SleepTypeB; 217245582Sjkim 218245582Sjkim 219245582Sjkim /* Validate parameter */ 220245582Sjkim 221245582Sjkim if (SleepState > ACPI_S_STATES_MAX) 222245582Sjkim { 223245582Sjkim AcpiOsPrintf ("Sleep state %d out of range (%d max)\n", 224245582Sjkim SleepState, ACPI_S_STATES_MAX); 225245582Sjkim return; 226245582Sjkim } 227245582Sjkim 228245582Sjkim AcpiOsPrintf ("\n---- Invoking sleep state S%d (%s):\n", 229245582Sjkim SleepState, AcpiGbl_SleepStateNames[SleepState]); 230245582Sjkim 231245582Sjkim /* Get the values for the sleep type registers (for display only) */ 232245582Sjkim 233245582Sjkim Status = AcpiGetSleepTypeData (SleepState, &SleepTypeA, &SleepTypeB); 234245582Sjkim if (ACPI_FAILURE (Status)) 235245582Sjkim { 236245582Sjkim AcpiOsPrintf ("Could not evaluate [%s] method, %s\n", 237245582Sjkim AcpiGbl_SleepStateNames[SleepState], 238245582Sjkim AcpiFormatException (Status)); 239245582Sjkim return; 240245582Sjkim } 241245582Sjkim 242245582Sjkim AcpiOsPrintf ( 243245582Sjkim "Register values for sleep state S%d: Sleep-A: %.2X, Sleep-B: %.2X\n", 244245582Sjkim SleepState, SleepTypeA, SleepTypeB); 245245582Sjkim 246245582Sjkim /* Invoke the various sleep/wake interfaces */ 247245582Sjkim 248245582Sjkim AcpiOsPrintf ("**** Sleep: Prepare to sleep (S%d) ****\n", 249245582Sjkim SleepState); 250129684Snjl Status = AcpiEnterSleepStatePrep (SleepState); 251129684Snjl if (ACPI_FAILURE (Status)) 252129684Snjl { 253231844Sjkim goto ErrorExit; 254129684Snjl } 255129684Snjl 256245582Sjkim AcpiOsPrintf ("**** Sleep: Going to sleep (S%d) ****\n", 257245582Sjkim SleepState); 258239340Sjkim Status = AcpiEnterSleepState (SleepState); 259129684Snjl if (ACPI_FAILURE (Status)) 260129684Snjl { 261231844Sjkim goto ErrorExit; 262129684Snjl } 263129684Snjl 264245582Sjkim AcpiOsPrintf ("**** Wake: Prepare to return from sleep (S%d) ****\n", 265245582Sjkim SleepState); 266239340Sjkim Status = AcpiLeaveSleepStatePrep (SleepState); 267231844Sjkim if (ACPI_FAILURE (Status)) 268231844Sjkim { 269231844Sjkim goto ErrorExit; 270231844Sjkim } 271231844Sjkim 272245582Sjkim AcpiOsPrintf ("**** Wake: Return from sleep (S%d) ****\n", 273245582Sjkim SleepState); 274129684Snjl Status = AcpiLeaveSleepState (SleepState); 275231844Sjkim if (ACPI_FAILURE (Status)) 276231844Sjkim { 277231844Sjkim goto ErrorExit; 278231844Sjkim } 279129684Snjl 280245582Sjkim return; 281231844Sjkim 282231844Sjkim 283231844SjkimErrorExit: 284245582Sjkim ACPI_EXCEPTION ((AE_INFO, Status, "During invocation of sleep state S%d", 285245582Sjkim SleepState)); 286129684Snjl} 287129684Snjl 288231844Sjkim 28967754Smsmith/******************************************************************************* 29067754Smsmith * 29177424Smsmith * FUNCTION: AcpiDbDisplayLocks 29277424Smsmith * 29377424Smsmith * PARAMETERS: None 29477424Smsmith * 29577424Smsmith * RETURN: None 29677424Smsmith * 29777424Smsmith * DESCRIPTION: Display information about internal mutexes. 29877424Smsmith * 29977424Smsmith ******************************************************************************/ 30077424Smsmith 30177424Smsmithvoid 302151937SjkimAcpiDbDisplayLocks ( 303151937Sjkim void) 30477424Smsmith{ 30577424Smsmith UINT32 i; 30677424Smsmith 30777424Smsmith 308167802Sjkim for (i = 0; i < ACPI_MAX_MUTEX; i++) 30977424Smsmith { 31077424Smsmith AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i), 311167802Sjkim AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED 312167802Sjkim ? "Locked" : "Unlocked"); 31377424Smsmith } 31477424Smsmith} 31577424Smsmith 31677424Smsmith 31777424Smsmith/******************************************************************************* 31877424Smsmith * 31967754Smsmith * FUNCTION: AcpiDbDisplayTableInfo 32067754Smsmith * 321245582Sjkim * PARAMETERS: TableArg - Name of table to be displayed 32267754Smsmith * 32367754Smsmith * RETURN: None 32467754Smsmith * 325241973Sjkim * DESCRIPTION: Display information about loaded tables. Current 32667754Smsmith * implementation displays all loaded tables. 32767754Smsmith * 32867754Smsmith ******************************************************************************/ 32967754Smsmith 33067754Smsmithvoid 33167754SmsmithAcpiDbDisplayTableInfo ( 332114237Snjl char *TableArg) 33367754Smsmith{ 334193267Sjkim UINT32 i; 335117521Snjl ACPI_TABLE_DESC *TableDesc; 336193267Sjkim ACPI_STATUS Status; 33767754Smsmith 33867754Smsmith 339238381Sjkim /* Header */ 340238381Sjkim 341281075Sdim AcpiOsPrintf ("Idx ID Status Type TableHeader (Sig, Address, Length)\n"); 342238381Sjkim 343193267Sjkim /* Walk the entire root table list */ 344193267Sjkim 345207344Sjkim for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++) 34667754Smsmith { 347167802Sjkim TableDesc = &AcpiGbl_RootTableList.Tables[i]; 348167802Sjkim 349238381Sjkim /* Index and Table ID */ 350238381Sjkim 351238381Sjkim AcpiOsPrintf ("%3u %.2u ", i, TableDesc->OwnerId); 352238381Sjkim 353238381Sjkim /* Decode the table flags */ 354238381Sjkim 355238381Sjkim if (!(TableDesc->Flags & ACPI_TABLE_IS_LOADED)) 356238381Sjkim { 357238381Sjkim AcpiOsPrintf ("NotLoaded "); 358238381Sjkim } 359238381Sjkim else 360238381Sjkim { 361238381Sjkim AcpiOsPrintf (" Loaded "); 362238381Sjkim } 363238381Sjkim 364238381Sjkim switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) 365238381Sjkim { 366281075Sdim case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: 367250838Sjkim 368281075Sdim AcpiOsPrintf ("External/virtual "); 369238381Sjkim break; 370238381Sjkim 371281075Sdim case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL: 372250838Sjkim 373281075Sdim AcpiOsPrintf ("Internal/physical "); 374238381Sjkim break; 375238381Sjkim 376281075Sdim case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: 377250838Sjkim 378281075Sdim AcpiOsPrintf ("Internal/virtual "); 379238381Sjkim break; 380238381Sjkim 381238381Sjkim default: 382250838Sjkim 383281075Sdim AcpiOsPrintf ("INVALID TYPE "); 384238381Sjkim break; 385238381Sjkim } 386238381Sjkim 387193267Sjkim /* Make sure that the table is mapped */ 388193267Sjkim 389281075Sdim Status = AcpiTbValidateTable (TableDesc); 390193267Sjkim if (ACPI_FAILURE (Status)) 39167754Smsmith { 392193267Sjkim return; 39367754Smsmith } 394193267Sjkim 395193267Sjkim /* Dump the table header */ 396193267Sjkim 397193267Sjkim if (TableDesc->Pointer) 398193267Sjkim { 399193267Sjkim AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer); 400193267Sjkim } 401193267Sjkim else 402193267Sjkim { 403193267Sjkim /* If the pointer is null, the table has been unloaded */ 404193267Sjkim 405193267Sjkim ACPI_INFO ((AE_INFO, "%4.4s - Table has been unloaded", 406193267Sjkim TableDesc->Signature.Ascii)); 407193267Sjkim } 40867754Smsmith } 40967754Smsmith} 41067754Smsmith 41167754Smsmith 41267754Smsmith/******************************************************************************* 41367754Smsmith * 41467754Smsmith * FUNCTION: AcpiDbUnloadAcpiTable 41567754Smsmith * 416238381Sjkim * PARAMETERS: ObjectName - Namespace pathname for an object that 417238381Sjkim * is owned by the table to be unloaded 41867754Smsmith * 419238381Sjkim * RETURN: None 42067754Smsmith * 421238381Sjkim * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned 422238381Sjkim * by the table. 42367754Smsmith * 42467754Smsmith ******************************************************************************/ 42567754Smsmith 42667754Smsmithvoid 42767754SmsmithAcpiDbUnloadAcpiTable ( 428238381Sjkim char *ObjectName) 42967754Smsmith{ 430238381Sjkim ACPI_NAMESPACE_NODE *Node; 43167754Smsmith ACPI_STATUS Status; 43267754Smsmith 43367754Smsmith 434238381Sjkim /* Translate name to an Named object */ 43567754Smsmith 436238381Sjkim Node = AcpiDbConvertToNode (ObjectName); 437238381Sjkim if (!Node) 43867754Smsmith { 439238381Sjkim return; 440238381Sjkim } 44167754Smsmith 442238381Sjkim Status = AcpiUnloadParentTable (ACPI_CAST_PTR (ACPI_HANDLE, Node)); 443238381Sjkim if (ACPI_SUCCESS (Status)) 444238381Sjkim { 445238381Sjkim AcpiOsPrintf ("Parent of [%s] (%p) unloaded and uninstalled\n", 446238381Sjkim ObjectName, Node); 44767754Smsmith } 448238381Sjkim else 449238381Sjkim { 450238381Sjkim AcpiOsPrintf ("%s, while unloading parent table of [%s]\n", 451238381Sjkim AcpiFormatException (Status), ObjectName); 452238381Sjkim } 45367754Smsmith} 45467754Smsmith 45567754Smsmith 45667754Smsmith/******************************************************************************* 45767754Smsmith * 45867754Smsmith * FUNCTION: AcpiDbSendNotify 45967754Smsmith * 460245582Sjkim * PARAMETERS: Name - Name of ACPI object where to send notify 461245582Sjkim * Value - Value of the notify to send. 46267754Smsmith * 46367754Smsmith * RETURN: None 46467754Smsmith * 465241973Sjkim * DESCRIPTION: Send an ACPI notification. The value specified is sent to the 46667754Smsmith * named object as an ACPI notify. 46767754Smsmith * 46867754Smsmith ******************************************************************************/ 46967754Smsmith 47067754Smsmithvoid 47167754SmsmithAcpiDbSendNotify ( 472114237Snjl char *Name, 47367754Smsmith UINT32 Value) 47467754Smsmith{ 47567754Smsmith ACPI_NAMESPACE_NODE *Node; 47699679Siwasaki ACPI_STATUS Status; 47767754Smsmith 47867754Smsmith 47967754Smsmith /* Translate name to an Named object */ 48067754Smsmith 481151937Sjkim Node = AcpiDbConvertToNode (Name); 48267754Smsmith if (!Node) 48367754Smsmith { 48467754Smsmith return; 48567754Smsmith } 48667754Smsmith 487234623Sjkim /* Dispatch the notify if legal */ 48867754Smsmith 489234623Sjkim if (AcpiEvIsNotifyObject (Node)) 49067754Smsmith { 49199679Siwasaki Status = AcpiEvQueueNotifyRequest (Node, Value); 49299679Siwasaki if (ACPI_FAILURE (Status)) 49399679Siwasaki { 49499679Siwasaki AcpiOsPrintf ("Could not queue notify\n"); 49599679Siwasaki } 49667754Smsmith } 497234623Sjkim else 498234623Sjkim { 499245582Sjkim AcpiOsPrintf ( 500245582Sjkim "Named object [%4.4s] Type %s, must be Device/Thermal/Processor type\n", 501234623Sjkim AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type)); 502234623Sjkim } 50367754Smsmith} 50467754Smsmith 50567754Smsmith 50667754Smsmith/******************************************************************************* 50767754Smsmith * 508210976Sjkim * FUNCTION: AcpiDbDisplayInterfaces 509210976Sjkim * 510210976Sjkim * PARAMETERS: ActionArg - Null, "install", or "remove" 511210976Sjkim * InterfaceNameArg - Name for install/remove options 512210976Sjkim * 513210976Sjkim * RETURN: None 514210976Sjkim * 515210976Sjkim * DESCRIPTION: Display or modify the global _OSI interface list 516210976Sjkim * 517210976Sjkim ******************************************************************************/ 518210976Sjkim 519210976Sjkimvoid 520210976SjkimAcpiDbDisplayInterfaces ( 521210976Sjkim char *ActionArg, 522210976Sjkim char *InterfaceNameArg) 523210976Sjkim{ 524210976Sjkim ACPI_INTERFACE_INFO *NextInterface; 525210976Sjkim char *SubString; 526210976Sjkim ACPI_STATUS Status; 527210976Sjkim 528210976Sjkim 529210976Sjkim /* If no arguments, just display current interface list */ 530210976Sjkim 531210976Sjkim if (!ActionArg) 532210976Sjkim { 533210976Sjkim (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, 534210976Sjkim ACPI_WAIT_FOREVER); 535210976Sjkim 536210976Sjkim NextInterface = AcpiGbl_SupportedInterfaces; 537210976Sjkim while (NextInterface) 538210976Sjkim { 539210976Sjkim if (!(NextInterface->Flags & ACPI_OSI_INVALID)) 540210976Sjkim { 541210976Sjkim AcpiOsPrintf ("%s\n", NextInterface->Name); 542210976Sjkim } 543210976Sjkim NextInterface = NextInterface->Next; 544210976Sjkim } 545210976Sjkim 546210976Sjkim AcpiOsReleaseMutex (AcpiGbl_OsiMutex); 547210976Sjkim return; 548210976Sjkim } 549210976Sjkim 550210976Sjkim /* If ActionArg exists, so must InterfaceNameArg */ 551210976Sjkim 552210976Sjkim if (!InterfaceNameArg) 553210976Sjkim { 554210976Sjkim AcpiOsPrintf ("Missing Interface Name argument\n"); 555210976Sjkim return; 556210976Sjkim } 557210976Sjkim 558210976Sjkim /* Uppercase the action for match below */ 559210976Sjkim 560210976Sjkim AcpiUtStrupr (ActionArg); 561210976Sjkim 562210976Sjkim /* Install - install an interface */ 563210976Sjkim 564210976Sjkim SubString = ACPI_STRSTR ("INSTALL", ActionArg); 565210976Sjkim if (SubString) 566210976Sjkim { 567210976Sjkim Status = AcpiInstallInterface (InterfaceNameArg); 568210976Sjkim if (ACPI_FAILURE (Status)) 569210976Sjkim { 570210976Sjkim AcpiOsPrintf ("%s, while installing \"%s\"\n", 571210976Sjkim AcpiFormatException (Status), InterfaceNameArg); 572210976Sjkim } 573210976Sjkim return; 574210976Sjkim } 575210976Sjkim 576210976Sjkim /* Remove - remove an interface */ 577210976Sjkim 578210976Sjkim SubString = ACPI_STRSTR ("REMOVE", ActionArg); 579210976Sjkim if (SubString) 580210976Sjkim { 581210976Sjkim Status = AcpiRemoveInterface (InterfaceNameArg); 582210976Sjkim if (ACPI_FAILURE (Status)) 583210976Sjkim { 584210976Sjkim AcpiOsPrintf ("%s, while removing \"%s\"\n", 585210976Sjkim AcpiFormatException (Status), InterfaceNameArg); 586210976Sjkim } 587210976Sjkim return; 588210976Sjkim } 589210976Sjkim 590210976Sjkim /* Invalid ActionArg */ 591210976Sjkim 592210976Sjkim AcpiOsPrintf ("Invalid action argument: %s\n", ActionArg); 593210976Sjkim return; 594210976Sjkim} 595210976Sjkim 596210976Sjkim 597210976Sjkim/******************************************************************************* 598210976Sjkim * 599228110Sjkim * FUNCTION: AcpiDbDisplayTemplate 600228110Sjkim * 601245582Sjkim * PARAMETERS: BufferArg - Buffer name or address 602228110Sjkim * 603228110Sjkim * RETURN: None 604228110Sjkim * 605228110Sjkim * DESCRIPTION: Dump a buffer that contains a resource template 606228110Sjkim * 607228110Sjkim ******************************************************************************/ 608228110Sjkim 609228110Sjkimvoid 610228110SjkimAcpiDbDisplayTemplate ( 611228110Sjkim char *BufferArg) 612228110Sjkim{ 613228110Sjkim ACPI_NAMESPACE_NODE *Node; 614228110Sjkim ACPI_STATUS Status; 615245582Sjkim ACPI_BUFFER ReturnBuffer; 616228110Sjkim 617228110Sjkim 618228110Sjkim /* Translate BufferArg to an Named object */ 619228110Sjkim 620228110Sjkim Node = AcpiDbConvertToNode (BufferArg); 621228110Sjkim if (!Node || (Node == AcpiGbl_RootNode)) 622228110Sjkim { 623228110Sjkim AcpiOsPrintf ("Invalid argument: %s\n", BufferArg); 624228110Sjkim return; 625228110Sjkim } 626228110Sjkim 627228110Sjkim /* We must have a buffer object */ 628228110Sjkim 629228110Sjkim if (Node->Type != ACPI_TYPE_BUFFER) 630228110Sjkim { 631228110Sjkim AcpiOsPrintf ("Not a Buffer object, cannot be a template: %s\n", 632228110Sjkim BufferArg); 633228110Sjkim return; 634228110Sjkim } 635228110Sjkim 636245582Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 637245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 638228110Sjkim 639228110Sjkim /* Attempt to convert the raw buffer to a resource list */ 640228110Sjkim 641245582Sjkim Status = AcpiRsCreateResourceList (Node->Object, &ReturnBuffer); 642228110Sjkim 643228110Sjkim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 644228110Sjkim AcpiDbgLevel |= ACPI_LV_RESOURCES; 645228110Sjkim 646228110Sjkim if (ACPI_FAILURE (Status)) 647228110Sjkim { 648228110Sjkim AcpiOsPrintf ("Could not convert Buffer to a resource list: %s, %s\n", 649228110Sjkim BufferArg, AcpiFormatException (Status)); 650228110Sjkim goto DumpBuffer; 651228110Sjkim } 652228110Sjkim 653228110Sjkim /* Now we can dump the resource list */ 654228110Sjkim 655228110Sjkim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, 656245582Sjkim ReturnBuffer.Pointer)); 657228110Sjkim 658228110SjkimDumpBuffer: 659228110Sjkim AcpiOsPrintf ("\nRaw data buffer:\n"); 660241973Sjkim AcpiUtDebugDumpBuffer ((UINT8 *) Node->Object->Buffer.Pointer, 661228110Sjkim Node->Object->Buffer.Length, 662228110Sjkim DB_BYTE_DISPLAY, ACPI_UINT32_MAX); 663228110Sjkim 664228110Sjkim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 665228110Sjkim return; 666228110Sjkim} 667228110Sjkim 668228110Sjkim 669228110Sjkim/******************************************************************************* 670228110Sjkim * 671151937Sjkim * FUNCTION: AcpiDmCompareAmlResources 672151937Sjkim * 673151937Sjkim * PARAMETERS: Aml1Buffer - Contains first resource list 674151937Sjkim * Aml1BufferLength - Length of first resource list 675151937Sjkim * Aml2Buffer - Contains second resource list 676151937Sjkim * Aml2BufferLength - Length of second resource list 677151937Sjkim * 678151937Sjkim * RETURN: None 679151937Sjkim * 680151937Sjkim * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in 681151937Sjkim * order to isolate a miscompare to an individual resource) 682151937Sjkim * 683151937Sjkim ******************************************************************************/ 684151937Sjkim 685151937Sjkimstatic void 686151937SjkimAcpiDmCompareAmlResources ( 687151937Sjkim UINT8 *Aml1Buffer, 688151937Sjkim ACPI_RSDESC_SIZE Aml1BufferLength, 689151937Sjkim UINT8 *Aml2Buffer, 690151937Sjkim ACPI_RSDESC_SIZE Aml2BufferLength) 691151937Sjkim{ 692151937Sjkim UINT8 *Aml1; 693151937Sjkim UINT8 *Aml2; 694228110Sjkim UINT8 *Aml1End; 695228110Sjkim UINT8 *Aml2End; 696151937Sjkim ACPI_RSDESC_SIZE Aml1Length; 697151937Sjkim ACPI_RSDESC_SIZE Aml2Length; 698151937Sjkim ACPI_RSDESC_SIZE Offset = 0; 699151937Sjkim UINT8 ResourceType; 700151937Sjkim UINT32 Count = 0; 701228110Sjkim UINT32 i; 702151937Sjkim 703151937Sjkim 704151937Sjkim /* Compare overall buffer sizes (may be different due to size rounding) */ 705151937Sjkim 706151937Sjkim if (Aml1BufferLength != Aml2BufferLength) 707151937Sjkim { 708151937Sjkim AcpiOsPrintf ( 709228110Sjkim "**** Buffer length mismatch in converted AML: Original %X, New %X ****\n", 710151937Sjkim Aml1BufferLength, Aml2BufferLength); 711151937Sjkim } 712151937Sjkim 713151937Sjkim Aml1 = Aml1Buffer; 714151937Sjkim Aml2 = Aml2Buffer; 715228110Sjkim Aml1End = Aml1Buffer + Aml1BufferLength; 716228110Sjkim Aml2End = Aml2Buffer + Aml2BufferLength; 717151937Sjkim 718151937Sjkim /* Walk the descriptor lists, comparing each descriptor */ 719151937Sjkim 720228110Sjkim while ((Aml1 < Aml1End) && (Aml2 < Aml2End)) 721151937Sjkim { 722151937Sjkim /* Get the lengths of each descriptor */ 723151937Sjkim 724151937Sjkim Aml1Length = AcpiUtGetDescriptorLength (Aml1); 725151937Sjkim Aml2Length = AcpiUtGetDescriptorLength (Aml2); 726151937Sjkim ResourceType = AcpiUtGetResourceType (Aml1); 727151937Sjkim 728151937Sjkim /* Check for descriptor length match */ 729151937Sjkim 730151937Sjkim if (Aml1Length != Aml2Length) 731151937Sjkim { 732151937Sjkim AcpiOsPrintf ( 733228110Sjkim "**** Length mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X Len1 %X, Len2 %X ****\n", 734151937Sjkim Count, ResourceType, Offset, Aml1Length, Aml2Length); 735151937Sjkim } 736151937Sjkim 737151937Sjkim /* Check for descriptor byte match */ 738151937Sjkim 739167802Sjkim else if (ACPI_MEMCMP (Aml1, Aml2, Aml1Length)) 740151937Sjkim { 741151937Sjkim AcpiOsPrintf ( 742151937Sjkim "**** Data mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X ****\n", 743151937Sjkim Count, ResourceType, Offset); 744228110Sjkim 745228110Sjkim for (i = 0; i < Aml1Length; i++) 746228110Sjkim { 747228110Sjkim if (Aml1[i] != Aml2[i]) 748228110Sjkim { 749245582Sjkim AcpiOsPrintf ( 750245582Sjkim "Mismatch at byte offset %.2X: is %2.2X, should be %2.2X\n", 751228110Sjkim i, Aml2[i], Aml1[i]); 752228110Sjkim } 753228110Sjkim } 754151937Sjkim } 755151937Sjkim 756151937Sjkim /* Exit on EndTag descriptor */ 757151937Sjkim 758151937Sjkim if (ResourceType == ACPI_RESOURCE_NAME_END_TAG) 759151937Sjkim { 760151937Sjkim return; 761151937Sjkim } 762151937Sjkim 763151937Sjkim /* Point to next descriptor in each buffer */ 764151937Sjkim 765151937Sjkim Count++; 766151937Sjkim Offset += Aml1Length; 767151937Sjkim Aml1 += Aml1Length; 768167802Sjkim Aml2 += Aml2Length; 769151937Sjkim } 770151937Sjkim} 771151937Sjkim 772151937Sjkim 773151937Sjkim/******************************************************************************* 774151937Sjkim * 775151937Sjkim * FUNCTION: AcpiDmTestResourceConversion 776151937Sjkim * 777245582Sjkim * PARAMETERS: Node - Parent device node 778245582Sjkim * Name - resource method name (_CRS) 779151937Sjkim * 780151937Sjkim * RETURN: Status 781151937Sjkim * 782151937Sjkim * DESCRIPTION: Compare the original AML with a conversion of the AML to 783151937Sjkim * internal resource list, then back to AML. 784151937Sjkim * 785151937Sjkim ******************************************************************************/ 786151937Sjkim 787151937Sjkimstatic ACPI_STATUS 788151937SjkimAcpiDmTestResourceConversion ( 789151937Sjkim ACPI_NAMESPACE_NODE *Node, 790151937Sjkim char *Name) 791151937Sjkim{ 792151937Sjkim ACPI_STATUS Status; 793245582Sjkim ACPI_BUFFER ReturnBuffer; 794245582Sjkim ACPI_BUFFER ResourceBuffer; 795151937Sjkim ACPI_BUFFER NewAml; 796151937Sjkim ACPI_OBJECT *OriginalAml; 797151937Sjkim 798151937Sjkim 799151937Sjkim AcpiOsPrintf ("Resource Conversion Comparison:\n"); 800151937Sjkim 801151937Sjkim NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 802245582Sjkim ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 803245582Sjkim ResourceBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 804151937Sjkim 805151937Sjkim /* Get the original _CRS AML resource template */ 806151937Sjkim 807245582Sjkim Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnBuffer); 808151937Sjkim if (ACPI_FAILURE (Status)) 809151937Sjkim { 810151937Sjkim AcpiOsPrintf ("Could not obtain %s: %s\n", 811151937Sjkim Name, AcpiFormatException (Status)); 812151937Sjkim return (Status); 813151937Sjkim } 814151937Sjkim 815151937Sjkim /* Get the AML resource template, converted to internal resource structs */ 816151937Sjkim 817245582Sjkim Status = AcpiGetCurrentResources (Node, &ResourceBuffer); 818151937Sjkim if (ACPI_FAILURE (Status)) 819151937Sjkim { 820151937Sjkim AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n", 821151937Sjkim AcpiFormatException (Status)); 822151937Sjkim goto Exit1; 823151937Sjkim } 824151937Sjkim 825151937Sjkim /* Convert internal resource list to external AML resource template */ 826151937Sjkim 827281075Sdim Status = AcpiRsCreateAmlResources (&ResourceBuffer, &NewAml); 828151937Sjkim if (ACPI_FAILURE (Status)) 829151937Sjkim { 830151937Sjkim AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n", 831151937Sjkim AcpiFormatException (Status)); 832151937Sjkim goto Exit2; 833151937Sjkim } 834151937Sjkim 835151937Sjkim /* Compare original AML to the newly created AML resource list */ 836151937Sjkim 837245582Sjkim OriginalAml = ReturnBuffer.Pointer; 838151937Sjkim 839281075Sdim AcpiDmCompareAmlResources (OriginalAml->Buffer.Pointer, 840281075Sdim (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length, 841193267Sjkim NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length); 842151937Sjkim 843151937Sjkim /* Cleanup and exit */ 844151937Sjkim 845167802Sjkim ACPI_FREE (NewAml.Pointer); 846151937SjkimExit2: 847245582Sjkim ACPI_FREE (ResourceBuffer.Pointer); 848151937SjkimExit1: 849245582Sjkim ACPI_FREE (ReturnBuffer.Pointer); 850151937Sjkim return (Status); 851151937Sjkim} 852151937Sjkim 853151937Sjkim 854151937Sjkim/******************************************************************************* 855151937Sjkim * 856228110Sjkim * FUNCTION: AcpiDbResourceCallback 85773561Smsmith * 858228110Sjkim * PARAMETERS: ACPI_WALK_RESOURCE_CALLBACK 85973561Smsmith * 860228110Sjkim * RETURN: Status 86173561Smsmith * 862245582Sjkim * DESCRIPTION: Simple callback to exercise AcpiWalkResources and 863245582Sjkim * AcpiWalkResourceBuffer. 86473561Smsmith * 86573561Smsmith ******************************************************************************/ 86673561Smsmith 867228110Sjkimstatic ACPI_STATUS 868228110SjkimAcpiDbResourceCallback ( 869228110Sjkim ACPI_RESOURCE *Resource, 870228110Sjkim void *Context) 87173561Smsmith{ 872228110Sjkim 873228110Sjkim return (AE_OK); 874228110Sjkim} 875228110Sjkim 876228110Sjkim 877228110Sjkim/******************************************************************************* 878228110Sjkim * 879228110Sjkim * FUNCTION: AcpiDbDeviceResources 880228110Sjkim * 881228110Sjkim * PARAMETERS: ACPI_WALK_CALLBACK 882228110Sjkim * 883228110Sjkim * RETURN: Status 884228110Sjkim * 885228110Sjkim * DESCRIPTION: Display the _PRT/_CRS/_PRS resources for a device object. 886228110Sjkim * 887228110Sjkim ******************************************************************************/ 888228110Sjkim 889228110Sjkimstatic ACPI_STATUS 890228110SjkimAcpiDbDeviceResources ( 891228110Sjkim ACPI_HANDLE ObjHandle, 892228110Sjkim UINT32 NestingLevel, 893228110Sjkim void *Context, 894228110Sjkim void **ReturnValue) 895228110Sjkim{ 896151937Sjkim ACPI_NAMESPACE_NODE *Node; 897228110Sjkim ACPI_NAMESPACE_NODE *PrtNode = NULL; 898228110Sjkim ACPI_NAMESPACE_NODE *CrsNode = NULL; 899228110Sjkim ACPI_NAMESPACE_NODE *PrsNode = NULL; 900228110Sjkim ACPI_NAMESPACE_NODE *AeiNode = NULL; 901228110Sjkim char *ParentPath; 902245582Sjkim ACPI_BUFFER ReturnBuffer; 90373561Smsmith ACPI_STATUS Status; 90473561Smsmith 90573561Smsmith 906228110Sjkim Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle); 907228110Sjkim ParentPath = AcpiNsGetExternalPathname (Node); 908228110Sjkim if (!ParentPath) 909228110Sjkim { 910228110Sjkim return (AE_NO_MEMORY); 911228110Sjkim } 91273561Smsmith 913228110Sjkim /* Get handles to the resource methods for this device */ 91473561Smsmith 915228110Sjkim (void) AcpiGetHandle (Node, METHOD_NAME__PRT, ACPI_CAST_PTR (ACPI_HANDLE, &PrtNode)); 916228110Sjkim (void) AcpiGetHandle (Node, METHOD_NAME__CRS, ACPI_CAST_PTR (ACPI_HANDLE, &CrsNode)); 917228110Sjkim (void) AcpiGetHandle (Node, METHOD_NAME__PRS, ACPI_CAST_PTR (ACPI_HANDLE, &PrsNode)); 918228110Sjkim (void) AcpiGetHandle (Node, METHOD_NAME__AEI, ACPI_CAST_PTR (ACPI_HANDLE, &AeiNode)); 919228110Sjkim if (!PrtNode && !CrsNode && !PrsNode && !AeiNode) 920151937Sjkim { 921228110Sjkim goto Cleanup; /* Nothing to do */ 922151937Sjkim } 92373561Smsmith 924228110Sjkim AcpiOsPrintf ("\nDevice: %s\n", ParentPath); 925228110Sjkim 92673561Smsmith /* Prepare for a return object of arbitrary size */ 92773561Smsmith 928245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 929245582Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 93073561Smsmith 931228110Sjkim 93277424Smsmith /* _PRT */ 93377424Smsmith 934228110Sjkim if (PrtNode) 935228110Sjkim { 936228110Sjkim AcpiOsPrintf ("Evaluating _PRT\n"); 93777424Smsmith 938245582Sjkim Status = AcpiEvaluateObject (PrtNode, NULL, NULL, &ReturnBuffer); 939228110Sjkim if (ACPI_FAILURE (Status)) 940228110Sjkim { 941228110Sjkim AcpiOsPrintf ("Could not evaluate _PRT: %s\n", 942228110Sjkim AcpiFormatException (Status)); 943228110Sjkim goto GetCrs; 944228110Sjkim } 945151937Sjkim 946245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 947245582Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 94873561Smsmith 949245582Sjkim Status = AcpiGetIrqRoutingTable (Node, &ReturnBuffer); 950228110Sjkim if (ACPI_FAILURE (Status)) 951228110Sjkim { 952228110Sjkim AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n", 953228110Sjkim AcpiFormatException (Status)); 954228110Sjkim goto GetCrs; 955228110Sjkim } 95673561Smsmith 957228110Sjkim AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer)); 95877424Smsmith } 95977424Smsmith 96077424Smsmith 96177424Smsmith /* _CRS */ 96283174Smsmith 96383174SmsmithGetCrs: 964228110Sjkim if (CrsNode) 965228110Sjkim { 966228110Sjkim AcpiOsPrintf ("Evaluating _CRS\n"); 96777424Smsmith 968245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 969245582Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 97077424Smsmith 971245582Sjkim Status = AcpiEvaluateObject (CrsNode, NULL, NULL, &ReturnBuffer); 972228110Sjkim if (ACPI_FAILURE (Status)) 973228110Sjkim { 974228110Sjkim AcpiOsPrintf ("Could not evaluate _CRS: %s\n", 975228110Sjkim AcpiFormatException (Status)); 976228110Sjkim goto GetPrs; 977228110Sjkim } 978151937Sjkim 979245582Sjkim /* This code exercises the AcpiWalkResources interface */ 98077424Smsmith 981228110Sjkim Status = AcpiWalkResources (Node, METHOD_NAME__CRS, 982228110Sjkim AcpiDbResourceCallback, NULL); 983228110Sjkim if (ACPI_FAILURE (Status)) 984228110Sjkim { 985228110Sjkim AcpiOsPrintf ("AcpiWalkResources failed: %s\n", 986228110Sjkim AcpiFormatException (Status)); 987228110Sjkim goto GetPrs; 988228110Sjkim } 98977424Smsmith 990245582Sjkim /* Get the _CRS resource list (test ALLOCATE buffer) */ 991151937Sjkim 992245582Sjkim ReturnBuffer.Pointer = NULL; 993245582Sjkim ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 99477424Smsmith 995245582Sjkim Status = AcpiGetCurrentResources (Node, &ReturnBuffer); 996228110Sjkim if (ACPI_FAILURE (Status)) 997228110Sjkim { 998228110Sjkim AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n", 999228110Sjkim AcpiFormatException (Status)); 1000228110Sjkim goto GetPrs; 1001228110Sjkim } 1002151937Sjkim 1003245582Sjkim /* This code exercises the AcpiWalkResourceBuffer interface */ 1004245582Sjkim 1005245582Sjkim Status = AcpiWalkResourceBuffer (&ReturnBuffer, 1006245582Sjkim AcpiDbResourceCallback, NULL); 1007245582Sjkim if (ACPI_FAILURE (Status)) 1008245582Sjkim { 1009245582Sjkim AcpiOsPrintf ("AcpiWalkResourceBuffer failed: %s\n", 1010245582Sjkim AcpiFormatException (Status)); 1011245582Sjkim goto EndCrs; 1012245582Sjkim } 1013245582Sjkim 1014228110Sjkim /* Dump the _CRS resource list */ 1015151937Sjkim 1016228110Sjkim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, 1017245582Sjkim ReturnBuffer.Pointer)); 1018151937Sjkim 1019228110Sjkim /* 1020245582Sjkim * Perform comparison of original AML to newly created AML. This 1021245582Sjkim * tests both the AML->Resource conversion and the Resource->AML 1022245582Sjkim * conversion. 1023228110Sjkim */ 1024245582Sjkim (void) AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS); 1025151937Sjkim 1026228110Sjkim /* Execute _SRS with the resource list */ 1027228110Sjkim 1028246849Sjkim AcpiOsPrintf ("Evaluating _SRS\n"); 1029246849Sjkim 1030245582Sjkim Status = AcpiSetCurrentResources (Node, &ReturnBuffer); 1031228110Sjkim if (ACPI_FAILURE (Status)) 1032228110Sjkim { 1033228110Sjkim AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n", 1034228110Sjkim AcpiFormatException (Status)); 1035245582Sjkim goto EndCrs; 1036228110Sjkim } 1037245582Sjkim 1038245582SjkimEndCrs: 1039281075Sdim ACPI_FREE (ReturnBuffer.Pointer); 104091116Smsmith } 104183174Smsmith 104291116Smsmith 104377424Smsmith /* _PRS */ 104483174Smsmith 104583174SmsmithGetPrs: 1046228110Sjkim if (PrsNode) 1047228110Sjkim { 1048228110Sjkim AcpiOsPrintf ("Evaluating _PRS\n"); 104977424Smsmith 1050245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1051245582Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 105277424Smsmith 1053245582Sjkim Status = AcpiEvaluateObject (PrsNode, NULL, NULL, &ReturnBuffer); 1054228110Sjkim if (ACPI_FAILURE (Status)) 1055228110Sjkim { 1056228110Sjkim AcpiOsPrintf ("Could not evaluate _PRS: %s\n", 1057228110Sjkim AcpiFormatException (Status)); 1058228110Sjkim goto GetAei; 1059228110Sjkim } 1060151937Sjkim 1061245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1062245582Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1063228110Sjkim 1064245582Sjkim Status = AcpiGetPossibleResources (Node, &ReturnBuffer); 1065228110Sjkim if (ACPI_FAILURE (Status)) 1066228110Sjkim { 1067228110Sjkim AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n", 1068228110Sjkim AcpiFormatException (Status)); 1069228110Sjkim goto GetAei; 1070228110Sjkim } 1071228110Sjkim 1072228110Sjkim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer)); 107373561Smsmith } 107473561Smsmith 107577424Smsmith 1076228110Sjkim /* _AEI */ 1077228110Sjkim 1078228110SjkimGetAei: 1079228110Sjkim if (AeiNode) 108073561Smsmith { 1081228110Sjkim AcpiOsPrintf ("Evaluating _AEI\n"); 1082228110Sjkim 1083245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1084245582Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1085228110Sjkim 1086245582Sjkim Status = AcpiEvaluateObject (AeiNode, NULL, NULL, &ReturnBuffer); 1087228110Sjkim if (ACPI_FAILURE (Status)) 1088228110Sjkim { 1089228110Sjkim AcpiOsPrintf ("Could not evaluate _AEI: %s\n", 1090228110Sjkim AcpiFormatException (Status)); 1091228110Sjkim goto Cleanup; 1092228110Sjkim } 1093228110Sjkim 1094245582Sjkim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1095245582Sjkim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1096228110Sjkim 1097245582Sjkim Status = AcpiGetEventResources (Node, &ReturnBuffer); 1098228110Sjkim if (ACPI_FAILURE (Status)) 1099228110Sjkim { 1100228110Sjkim AcpiOsPrintf ("AcpiGetEventResources failed: %s\n", 1101228110Sjkim AcpiFormatException (Status)); 1102228110Sjkim goto Cleanup; 1103228110Sjkim } 1104228110Sjkim 1105228110Sjkim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer)); 110673561Smsmith } 110777424Smsmith 1108151937Sjkim 110973561SmsmithCleanup: 1110228110Sjkim ACPI_FREE (ParentPath); 1111228110Sjkim return (AE_OK); 1112228110Sjkim} 111373561Smsmith 1114228110Sjkim 1115228110Sjkim/******************************************************************************* 1116228110Sjkim * 1117228110Sjkim * FUNCTION: AcpiDbDisplayResources 1118228110Sjkim * 1119245582Sjkim * PARAMETERS: ObjectArg - String object name or object pointer. 1120246849Sjkim * NULL or "*" means "display resources for 1121246849Sjkim * all devices" 1122228110Sjkim * 1123228110Sjkim * RETURN: None 1124228110Sjkim * 1125228110Sjkim * DESCRIPTION: Display the resource objects associated with a device. 1126228110Sjkim * 1127228110Sjkim ******************************************************************************/ 1128228110Sjkim 1129228110Sjkimvoid 1130228110SjkimAcpiDbDisplayResources ( 1131228110Sjkim char *ObjectArg) 1132228110Sjkim{ 1133228110Sjkim ACPI_NAMESPACE_NODE *Node; 1134228110Sjkim 1135228110Sjkim 1136228110Sjkim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 1137228110Sjkim AcpiDbgLevel |= ACPI_LV_RESOURCES; 1138228110Sjkim 1139228110Sjkim /* Asterisk means "display resources for all devices" */ 1140228110Sjkim 1141246849Sjkim if (!ObjectArg || (!ACPI_STRCMP (ObjectArg, "*"))) 1142228110Sjkim { 1143228110Sjkim (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, 1144228110Sjkim ACPI_UINT32_MAX, AcpiDbDeviceResources, NULL, NULL, NULL); 1145228110Sjkim } 1146228110Sjkim else 1147228110Sjkim { 1148228110Sjkim /* Convert string to object pointer */ 1149228110Sjkim 1150228110Sjkim Node = AcpiDbConvertToNode (ObjectArg); 1151228110Sjkim if (Node) 1152228110Sjkim { 1153228110Sjkim if (Node->Type != ACPI_TYPE_DEVICE) 1154228110Sjkim { 1155228110Sjkim AcpiOsPrintf ("%4.4s: Name is not a device object (%s)\n", 1156228110Sjkim Node->Name.Ascii, AcpiUtGetTypeName (Node->Type)); 1157228110Sjkim } 1158228110Sjkim else 1159228110Sjkim { 1160228110Sjkim (void) AcpiDbDeviceResources (Node, 0, NULL, NULL); 1161228110Sjkim } 1162228110Sjkim } 1163228110Sjkim } 1164228110Sjkim 116591116Smsmith AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 116673561Smsmith} 116773561Smsmith 116873561Smsmith 1169231844Sjkim#if (!ACPI_REDUCED_HARDWARE) 117099679Siwasaki/******************************************************************************* 117199679Siwasaki * 1172114237Snjl * FUNCTION: AcpiDbGenerateGpe 1173114237Snjl * 1174245582Sjkim * PARAMETERS: GpeArg - Raw GPE number, ascii string 1175245582Sjkim * BlockArg - GPE block number, ascii string 1176245582Sjkim * 0 or 1 for FADT GPE blocks 1177114237Snjl * 1178114237Snjl * RETURN: None 1179114237Snjl * 1180245582Sjkim * DESCRIPTION: Simulate firing of a GPE 1181114237Snjl * 1182114237Snjl ******************************************************************************/ 1183114237Snjl 1184114237Snjlvoid 1185114237SnjlAcpiDbGenerateGpe ( 1186114237Snjl char *GpeArg, 1187114237Snjl char *BlockArg) 1188114237Snjl{ 1189281075Sdim UINT32 BlockNumber = 0; 1190114237Snjl UINT32 GpeNumber; 1191114237Snjl ACPI_GPE_EVENT_INFO *GpeEventInfo; 1192114237Snjl 1193114237Snjl 1194281075Sdim GpeNumber = ACPI_STRTOUL (GpeArg, NULL, 0); 1195114237Snjl 1196281075Sdim /* 1197281075Sdim * If no block arg, or block arg == 0 or 1, use the FADT-defined 1198281075Sdim * GPE blocks. 1199281075Sdim */ 1200281075Sdim if (BlockArg) 1201281075Sdim { 1202281075Sdim BlockNumber = ACPI_STRTOUL (BlockArg, NULL, 0); 1203281075Sdim if (BlockNumber == 1) 1204281075Sdim { 1205281075Sdim BlockNumber = 0; 1206281075Sdim } 1207281075Sdim } 1208114237Snjl 1209151937Sjkim GpeEventInfo = AcpiEvGetGpeEventInfo (ACPI_TO_POINTER (BlockNumber), 1210151937Sjkim GpeNumber); 1211114237Snjl if (!GpeEventInfo) 1212114237Snjl { 1213114237Snjl AcpiOsPrintf ("Invalid GPE\n"); 1214114237Snjl return; 1215114237Snjl } 1216114237Snjl 1217216471Sjkim (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber); 1218114237Snjl} 1219254745Sjkim 1220254745Sjkimvoid 1221254745SjkimAcpiDbGenerateSci ( 1222254745Sjkim void) 1223254745Sjkim{ 1224254745Sjkim AcpiEvSciDispatch (); 1225254745Sjkim} 1226254745Sjkim 1227231844Sjkim#endif /* !ACPI_REDUCED_HARDWARE */ 1228114237Snjl 1229102550Siwasaki#endif /* ACPI_DEBUGGER */ 1230