1a159c266SJung-uk Kim /******************************************************************************* 2a159c266SJung-uk Kim * 3a159c266SJung-uk Kim * Module Name: dbcmds - Miscellaneous debug commands and output routines 4a159c266SJung-uk Kim * 5a159c266SJung-uk Kim ******************************************************************************/ 6a159c266SJung-uk Kim 7a159c266SJung-uk Kim /* 8a159c266SJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 9a159c266SJung-uk Kim * All rights reserved. 10a159c266SJung-uk Kim * 11a159c266SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12a159c266SJung-uk Kim * modification, are permitted provided that the following conditions 13a159c266SJung-uk Kim * are met: 14a159c266SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15a159c266SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16a159c266SJung-uk Kim * without modification. 17a159c266SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18a159c266SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19a159c266SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20a159c266SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21a159c266SJung-uk Kim * binary redistribution. 22a159c266SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23a159c266SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24a159c266SJung-uk Kim * from this software without specific prior written permission. 25a159c266SJung-uk Kim * 26a159c266SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27a159c266SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28a159c266SJung-uk Kim * Software Foundation. 29a159c266SJung-uk Kim * 30a159c266SJung-uk Kim * NO WARRANTY 31a159c266SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32a159c266SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33a159c266SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34a159c266SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35a159c266SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36a159c266SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37a159c266SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38a159c266SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39a159c266SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40a159c266SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41a159c266SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42a159c266SJung-uk Kim */ 43a159c266SJung-uk Kim 44a159c266SJung-uk Kim 45a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 46a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 47a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acevents.h> 48a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h> 49a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 50a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acresrc.h> 51a159c266SJung-uk Kim #include <contrib/dev/acpica/include/actables.h> 52a159c266SJung-uk Kim 53a159c266SJung-uk Kim #ifdef ACPI_DEBUGGER 54a159c266SJung-uk Kim 55a159c266SJung-uk Kim #define _COMPONENT ACPI_CA_DEBUGGER 56a159c266SJung-uk Kim ACPI_MODULE_NAME ("dbcmds") 57a159c266SJung-uk Kim 58a159c266SJung-uk Kim 59a159c266SJung-uk Kim /* Local prototypes */ 60a159c266SJung-uk Kim 61a159c266SJung-uk Kim static void 62a159c266SJung-uk Kim AcpiDmCompareAmlResources ( 63a159c266SJung-uk Kim UINT8 *Aml1Buffer, 64a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml1BufferLength, 65a159c266SJung-uk Kim UINT8 *Aml2Buffer, 66a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml2BufferLength); 67a159c266SJung-uk Kim 68a159c266SJung-uk Kim static ACPI_STATUS 69a159c266SJung-uk Kim AcpiDmTestResourceConversion ( 70a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node, 71a159c266SJung-uk Kim char *Name); 72a159c266SJung-uk Kim 73a159c266SJung-uk Kim static ACPI_STATUS 74a159c266SJung-uk Kim AcpiDbResourceCallback ( 75a159c266SJung-uk Kim ACPI_RESOURCE *Resource, 76a159c266SJung-uk Kim void *Context); 77a159c266SJung-uk Kim 78a159c266SJung-uk Kim static ACPI_STATUS 79a159c266SJung-uk Kim AcpiDbDeviceResources ( 80a159c266SJung-uk Kim ACPI_HANDLE ObjHandle, 81a159c266SJung-uk Kim UINT32 NestingLevel, 82a159c266SJung-uk Kim void *Context, 83a159c266SJung-uk Kim void **ReturnValue); 84a159c266SJung-uk Kim 85a159c266SJung-uk Kim 86a159c266SJung-uk Kim /******************************************************************************* 87a159c266SJung-uk Kim * 88a159c266SJung-uk Kim * FUNCTION: AcpiDbConvertToNode 89a159c266SJung-uk Kim * 90a159c266SJung-uk Kim * PARAMETERS: InString - String to convert 91a159c266SJung-uk Kim * 92a159c266SJung-uk Kim * RETURN: Pointer to a NS node 93a159c266SJung-uk Kim * 94a159c266SJung-uk Kim * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or 95a159c266SJung-uk Kim * alpha strings. 96a159c266SJung-uk Kim * 97a159c266SJung-uk Kim ******************************************************************************/ 98a159c266SJung-uk Kim 99a159c266SJung-uk Kim ACPI_NAMESPACE_NODE * 100a159c266SJung-uk Kim AcpiDbConvertToNode ( 101a159c266SJung-uk Kim char *InString) 102a159c266SJung-uk Kim { 103a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 104a159c266SJung-uk Kim 105a159c266SJung-uk Kim 106a159c266SJung-uk Kim if ((*InString >= 0x30) && (*InString <= 0x39)) 107a159c266SJung-uk Kim { 108a159c266SJung-uk Kim /* Numeric argument, convert */ 109a159c266SJung-uk Kim 110a159c266SJung-uk Kim Node = ACPI_TO_POINTER (ACPI_STRTOUL (InString, NULL, 16)); 111a159c266SJung-uk Kim if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE))) 112a159c266SJung-uk Kim { 113a159c266SJung-uk Kim AcpiOsPrintf ("Address %p is invalid in this address space\n", 114a159c266SJung-uk Kim Node); 115a159c266SJung-uk Kim return (NULL); 116a159c266SJung-uk Kim } 117a159c266SJung-uk Kim 118a159c266SJung-uk Kim /* Make sure pointer is valid NS node */ 119a159c266SJung-uk Kim 120a159c266SJung-uk Kim if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED) 121a159c266SJung-uk Kim { 122a159c266SJung-uk Kim AcpiOsPrintf ("Address %p is not a valid NS node [%s]\n", 123a159c266SJung-uk Kim Node, AcpiUtGetDescriptorName (Node)); 124a159c266SJung-uk Kim return (NULL); 125a159c266SJung-uk Kim } 126a159c266SJung-uk Kim } 127a159c266SJung-uk Kim else 128a159c266SJung-uk Kim { 129a159c266SJung-uk Kim /* Alpha argument */ 130a159c266SJung-uk Kim /* The parameter is a name string that must be resolved to a 131a159c266SJung-uk Kim * Named obj 132a159c266SJung-uk Kim */ 133a159c266SJung-uk Kim Node = AcpiDbLocalNsLookup (InString); 134a159c266SJung-uk Kim if (!Node) 135a159c266SJung-uk Kim { 136a159c266SJung-uk Kim Node = AcpiGbl_RootNode; 137a159c266SJung-uk Kim } 138a159c266SJung-uk Kim } 139a159c266SJung-uk Kim 140a159c266SJung-uk Kim return (Node); 141a159c266SJung-uk Kim } 142a159c266SJung-uk Kim 143a159c266SJung-uk Kim 144a159c266SJung-uk Kim /******************************************************************************* 145a159c266SJung-uk Kim * 146a159c266SJung-uk Kim * FUNCTION: AcpiDbSleep 147a159c266SJung-uk Kim * 148a159c266SJung-uk Kim * PARAMETERS: ObjectArg - Desired sleep state (0-5) 149a159c266SJung-uk Kim * 150a159c266SJung-uk Kim * RETURN: Status 151a159c266SJung-uk Kim * 152a159c266SJung-uk Kim * DESCRIPTION: Simulate a sleep/wake sequence 153a159c266SJung-uk Kim * 154a159c266SJung-uk Kim ******************************************************************************/ 155a159c266SJung-uk Kim 156a159c266SJung-uk Kim ACPI_STATUS 157a159c266SJung-uk Kim AcpiDbSleep ( 158a159c266SJung-uk Kim char *ObjectArg) 159a159c266SJung-uk Kim { 160a159c266SJung-uk Kim ACPI_STATUS Status; 161a159c266SJung-uk Kim UINT8 SleepState; 162a159c266SJung-uk Kim 163a159c266SJung-uk Kim 164a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (AcpiDbSleep); 165a159c266SJung-uk Kim 166a159c266SJung-uk Kim 167a159c266SJung-uk Kim SleepState = (UINT8) ACPI_STRTOUL (ObjectArg, NULL, 0); 168a159c266SJung-uk Kim 169a159c266SJung-uk Kim AcpiOsPrintf ("**** Prepare to sleep ****\n"); 170a159c266SJung-uk Kim Status = AcpiEnterSleepStatePrep (SleepState); 171a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 172a159c266SJung-uk Kim { 173a159c266SJung-uk Kim goto ErrorExit; 174a159c266SJung-uk Kim } 175a159c266SJung-uk Kim 176a159c266SJung-uk Kim AcpiOsPrintf ("**** Going to sleep ****\n"); 177*4c52cad2SJung-uk Kim Status = AcpiEnterSleepState (SleepState, ACPI_NO_OPTIONAL_METHODS); 178a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 179a159c266SJung-uk Kim { 180a159c266SJung-uk Kim goto ErrorExit; 181a159c266SJung-uk Kim } 182a159c266SJung-uk Kim 183a159c266SJung-uk Kim AcpiOsPrintf ("**** Prepare to return from sleep ****\n"); 184*4c52cad2SJung-uk Kim Status = AcpiLeaveSleepStatePrep (SleepState, ACPI_NO_OPTIONAL_METHODS); 185a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 186a159c266SJung-uk Kim { 187a159c266SJung-uk Kim goto ErrorExit; 188a159c266SJung-uk Kim } 189a159c266SJung-uk Kim 190a159c266SJung-uk Kim AcpiOsPrintf ("**** Returning from sleep ****\n"); 191a159c266SJung-uk Kim Status = AcpiLeaveSleepState (SleepState); 192a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 193a159c266SJung-uk Kim { 194a159c266SJung-uk Kim goto ErrorExit; 195a159c266SJung-uk Kim } 196a159c266SJung-uk Kim 197a159c266SJung-uk Kim return (Status); 198a159c266SJung-uk Kim 199a159c266SJung-uk Kim 200a159c266SJung-uk Kim ErrorExit: 201a159c266SJung-uk Kim 202a159c266SJung-uk Kim ACPI_EXCEPTION ((AE_INFO, Status, "During sleep test")); 203a159c266SJung-uk Kim return (Status); 204a159c266SJung-uk Kim } 205a159c266SJung-uk Kim 206a159c266SJung-uk Kim 207a159c266SJung-uk Kim /******************************************************************************* 208a159c266SJung-uk Kim * 209a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayLocks 210a159c266SJung-uk Kim * 211a159c266SJung-uk Kim * PARAMETERS: None 212a159c266SJung-uk Kim * 213a159c266SJung-uk Kim * RETURN: None 214a159c266SJung-uk Kim * 215a159c266SJung-uk Kim * DESCRIPTION: Display information about internal mutexes. 216a159c266SJung-uk Kim * 217a159c266SJung-uk Kim ******************************************************************************/ 218a159c266SJung-uk Kim 219a159c266SJung-uk Kim void 220a159c266SJung-uk Kim AcpiDbDisplayLocks ( 221a159c266SJung-uk Kim void) 222a159c266SJung-uk Kim { 223a159c266SJung-uk Kim UINT32 i; 224a159c266SJung-uk Kim 225a159c266SJung-uk Kim 226a159c266SJung-uk Kim for (i = 0; i < ACPI_MAX_MUTEX; i++) 227a159c266SJung-uk Kim { 228a159c266SJung-uk Kim AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i), 229a159c266SJung-uk Kim AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED 230a159c266SJung-uk Kim ? "Locked" : "Unlocked"); 231a159c266SJung-uk Kim } 232a159c266SJung-uk Kim } 233a159c266SJung-uk Kim 234a159c266SJung-uk Kim 235a159c266SJung-uk Kim /******************************************************************************* 236a159c266SJung-uk Kim * 237a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayTableInfo 238a159c266SJung-uk Kim * 239a159c266SJung-uk Kim * PARAMETERS: TableArg - String with name of table to be displayed 240a159c266SJung-uk Kim * 241a159c266SJung-uk Kim * RETURN: None 242a159c266SJung-uk Kim * 243a159c266SJung-uk Kim * DESCRIPTION: Display information about loaded tables. Current 244a159c266SJung-uk Kim * implementation displays all loaded tables. 245a159c266SJung-uk Kim * 246a159c266SJung-uk Kim ******************************************************************************/ 247a159c266SJung-uk Kim 248a159c266SJung-uk Kim void 249a159c266SJung-uk Kim AcpiDbDisplayTableInfo ( 250a159c266SJung-uk Kim char *TableArg) 251a159c266SJung-uk Kim { 252a159c266SJung-uk Kim UINT32 i; 253a159c266SJung-uk Kim ACPI_TABLE_DESC *TableDesc; 254a159c266SJung-uk Kim ACPI_STATUS Status; 255a159c266SJung-uk Kim 256a159c266SJung-uk Kim 257a159c266SJung-uk Kim /* Walk the entire root table list */ 258a159c266SJung-uk Kim 259a159c266SJung-uk Kim for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++) 260a159c266SJung-uk Kim { 261a159c266SJung-uk Kim TableDesc = &AcpiGbl_RootTableList.Tables[i]; 262a159c266SJung-uk Kim AcpiOsPrintf ("%u ", i); 263a159c266SJung-uk Kim 264a159c266SJung-uk Kim /* Make sure that the table is mapped */ 265a159c266SJung-uk Kim 266a159c266SJung-uk Kim Status = AcpiTbVerifyTable (TableDesc); 267a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 268a159c266SJung-uk Kim { 269a159c266SJung-uk Kim return; 270a159c266SJung-uk Kim } 271a159c266SJung-uk Kim 272a159c266SJung-uk Kim /* Dump the table header */ 273a159c266SJung-uk Kim 274a159c266SJung-uk Kim if (TableDesc->Pointer) 275a159c266SJung-uk Kim { 276a159c266SJung-uk Kim AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer); 277a159c266SJung-uk Kim } 278a159c266SJung-uk Kim else 279a159c266SJung-uk Kim { 280a159c266SJung-uk Kim /* If the pointer is null, the table has been unloaded */ 281a159c266SJung-uk Kim 282a159c266SJung-uk Kim ACPI_INFO ((AE_INFO, "%4.4s - Table has been unloaded", 283a159c266SJung-uk Kim TableDesc->Signature.Ascii)); 284a159c266SJung-uk Kim } 285a159c266SJung-uk Kim } 286a159c266SJung-uk Kim } 287a159c266SJung-uk Kim 288a159c266SJung-uk Kim 289a159c266SJung-uk Kim /******************************************************************************* 290a159c266SJung-uk Kim * 291a159c266SJung-uk Kim * FUNCTION: AcpiDbUnloadAcpiTable 292a159c266SJung-uk Kim * 293a159c266SJung-uk Kim * PARAMETERS: TableArg - Name of the table to be unloaded 294a159c266SJung-uk Kim * InstanceArg - Which instance of the table to unload (if 295a159c266SJung-uk Kim * there are multiple tables of the same type) 296a159c266SJung-uk Kim * 297a159c266SJung-uk Kim * RETURN: Nonde 298a159c266SJung-uk Kim * 299a159c266SJung-uk Kim * DESCRIPTION: Unload an ACPI table. 300a159c266SJung-uk Kim * Instance is not implemented 301a159c266SJung-uk Kim * 302a159c266SJung-uk Kim ******************************************************************************/ 303a159c266SJung-uk Kim 304a159c266SJung-uk Kim void 305a159c266SJung-uk Kim AcpiDbUnloadAcpiTable ( 306a159c266SJung-uk Kim char *TableArg, 307a159c266SJung-uk Kim char *InstanceArg) 308a159c266SJung-uk Kim { 309a159c266SJung-uk Kim /* TBD: Need to reimplement for new data structures */ 310a159c266SJung-uk Kim 311a159c266SJung-uk Kim #if 0 312a159c266SJung-uk Kim UINT32 i; 313a159c266SJung-uk Kim ACPI_STATUS Status; 314a159c266SJung-uk Kim 315a159c266SJung-uk Kim 316a159c266SJung-uk Kim /* Search all tables for the target type */ 317a159c266SJung-uk Kim 318a159c266SJung-uk Kim for (i = 0; i < (ACPI_TABLE_ID_MAX+1); i++) 319a159c266SJung-uk Kim { 320a159c266SJung-uk Kim if (!ACPI_STRNCMP (TableArg, AcpiGbl_TableData[i].Signature, 321a159c266SJung-uk Kim AcpiGbl_TableData[i].SigLength)) 322a159c266SJung-uk Kim { 323a159c266SJung-uk Kim /* Found the table, unload it */ 324a159c266SJung-uk Kim 325a159c266SJung-uk Kim Status = AcpiUnloadTable (i); 326a159c266SJung-uk Kim if (ACPI_SUCCESS (Status)) 327a159c266SJung-uk Kim { 328a159c266SJung-uk Kim AcpiOsPrintf ("[%s] unloaded and uninstalled\n", TableArg); 329a159c266SJung-uk Kim } 330a159c266SJung-uk Kim else 331a159c266SJung-uk Kim { 332a159c266SJung-uk Kim AcpiOsPrintf ("%s, while unloading [%s]\n", 333a159c266SJung-uk Kim AcpiFormatException (Status), TableArg); 334a159c266SJung-uk Kim } 335a159c266SJung-uk Kim 336a159c266SJung-uk Kim return; 337a159c266SJung-uk Kim } 338a159c266SJung-uk Kim } 339a159c266SJung-uk Kim 340a159c266SJung-uk Kim AcpiOsPrintf ("Unknown table type [%s]\n", TableArg); 341a159c266SJung-uk Kim #endif 342a159c266SJung-uk Kim } 343a159c266SJung-uk Kim 344a159c266SJung-uk Kim 345a159c266SJung-uk Kim /******************************************************************************* 346a159c266SJung-uk Kim * 347a159c266SJung-uk Kim * FUNCTION: AcpiDbSendNotify 348a159c266SJung-uk Kim * 349a159c266SJung-uk Kim * PARAMETERS: Name - Name of ACPI object to send the notify to 350a159c266SJung-uk Kim * Value - Value of the notify to send. 351a159c266SJung-uk Kim * 352a159c266SJung-uk Kim * RETURN: None 353a159c266SJung-uk Kim * 354a159c266SJung-uk Kim * DESCRIPTION: Send an ACPI notification. The value specified is sent to the 355a159c266SJung-uk Kim * named object as an ACPI notify. 356a159c266SJung-uk Kim * 357a159c266SJung-uk Kim ******************************************************************************/ 358a159c266SJung-uk Kim 359a159c266SJung-uk Kim void 360a159c266SJung-uk Kim AcpiDbSendNotify ( 361a159c266SJung-uk Kim char *Name, 362a159c266SJung-uk Kim UINT32 Value) 363a159c266SJung-uk Kim { 364a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 365a159c266SJung-uk Kim ACPI_STATUS Status; 366a159c266SJung-uk Kim 367a159c266SJung-uk Kim 368a159c266SJung-uk Kim /* Translate name to an Named object */ 369a159c266SJung-uk Kim 370a159c266SJung-uk Kim Node = AcpiDbConvertToNode (Name); 371a159c266SJung-uk Kim if (!Node) 372a159c266SJung-uk Kim { 373a159c266SJung-uk Kim return; 374a159c266SJung-uk Kim } 375a159c266SJung-uk Kim 376a159c266SJung-uk Kim /* Decode Named object type */ 377a159c266SJung-uk Kim 378a159c266SJung-uk Kim switch (Node->Type) 379a159c266SJung-uk Kim { 380a159c266SJung-uk Kim case ACPI_TYPE_DEVICE: 381a159c266SJung-uk Kim case ACPI_TYPE_THERMAL: 382a159c266SJung-uk Kim 383a159c266SJung-uk Kim /* Send the notify */ 384a159c266SJung-uk Kim 385a159c266SJung-uk Kim Status = AcpiEvQueueNotifyRequest (Node, Value); 386a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 387a159c266SJung-uk Kim { 388a159c266SJung-uk Kim AcpiOsPrintf ("Could not queue notify\n"); 389a159c266SJung-uk Kim } 390a159c266SJung-uk Kim break; 391a159c266SJung-uk Kim 392a159c266SJung-uk Kim default: 393a159c266SJung-uk Kim AcpiOsPrintf ("Named object is not a device or a thermal object\n"); 394a159c266SJung-uk Kim break; 395a159c266SJung-uk Kim } 396a159c266SJung-uk Kim } 397a159c266SJung-uk Kim 398a159c266SJung-uk Kim 399a159c266SJung-uk Kim /******************************************************************************* 400a159c266SJung-uk Kim * 401a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayInterfaces 402a159c266SJung-uk Kim * 403a159c266SJung-uk Kim * PARAMETERS: ActionArg - Null, "install", or "remove" 404a159c266SJung-uk Kim * InterfaceNameArg - Name for install/remove options 405a159c266SJung-uk Kim * 406a159c266SJung-uk Kim * RETURN: None 407a159c266SJung-uk Kim * 408a159c266SJung-uk Kim * DESCRIPTION: Display or modify the global _OSI interface list 409a159c266SJung-uk Kim * 410a159c266SJung-uk Kim ******************************************************************************/ 411a159c266SJung-uk Kim 412a159c266SJung-uk Kim void 413a159c266SJung-uk Kim AcpiDbDisplayInterfaces ( 414a159c266SJung-uk Kim char *ActionArg, 415a159c266SJung-uk Kim char *InterfaceNameArg) 416a159c266SJung-uk Kim { 417a159c266SJung-uk Kim ACPI_INTERFACE_INFO *NextInterface; 418a159c266SJung-uk Kim char *SubString; 419a159c266SJung-uk Kim ACPI_STATUS Status; 420a159c266SJung-uk Kim 421a159c266SJung-uk Kim 422a159c266SJung-uk Kim /* If no arguments, just display current interface list */ 423a159c266SJung-uk Kim 424a159c266SJung-uk Kim if (!ActionArg) 425a159c266SJung-uk Kim { 426a159c266SJung-uk Kim (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, 427a159c266SJung-uk Kim ACPI_WAIT_FOREVER); 428a159c266SJung-uk Kim 429a159c266SJung-uk Kim NextInterface = AcpiGbl_SupportedInterfaces; 430a159c266SJung-uk Kim 431a159c266SJung-uk Kim while (NextInterface) 432a159c266SJung-uk Kim { 433a159c266SJung-uk Kim if (!(NextInterface->Flags & ACPI_OSI_INVALID)) 434a159c266SJung-uk Kim { 435a159c266SJung-uk Kim AcpiOsPrintf ("%s\n", NextInterface->Name); 436a159c266SJung-uk Kim } 437a159c266SJung-uk Kim NextInterface = NextInterface->Next; 438a159c266SJung-uk Kim } 439a159c266SJung-uk Kim 440a159c266SJung-uk Kim AcpiOsReleaseMutex (AcpiGbl_OsiMutex); 441a159c266SJung-uk Kim return; 442a159c266SJung-uk Kim } 443a159c266SJung-uk Kim 444a159c266SJung-uk Kim /* If ActionArg exists, so must InterfaceNameArg */ 445a159c266SJung-uk Kim 446a159c266SJung-uk Kim if (!InterfaceNameArg) 447a159c266SJung-uk Kim { 448a159c266SJung-uk Kim AcpiOsPrintf ("Missing Interface Name argument\n"); 449a159c266SJung-uk Kim return; 450a159c266SJung-uk Kim } 451a159c266SJung-uk Kim 452a159c266SJung-uk Kim /* Uppercase the action for match below */ 453a159c266SJung-uk Kim 454a159c266SJung-uk Kim AcpiUtStrupr (ActionArg); 455a159c266SJung-uk Kim 456a159c266SJung-uk Kim /* Install - install an interface */ 457a159c266SJung-uk Kim 458a159c266SJung-uk Kim SubString = ACPI_STRSTR ("INSTALL", ActionArg); 459a159c266SJung-uk Kim if (SubString) 460a159c266SJung-uk Kim { 461a159c266SJung-uk Kim Status = AcpiInstallInterface (InterfaceNameArg); 462a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 463a159c266SJung-uk Kim { 464a159c266SJung-uk Kim AcpiOsPrintf ("%s, while installing \"%s\"\n", 465a159c266SJung-uk Kim AcpiFormatException (Status), InterfaceNameArg); 466a159c266SJung-uk Kim } 467a159c266SJung-uk Kim return; 468a159c266SJung-uk Kim } 469a159c266SJung-uk Kim 470a159c266SJung-uk Kim /* Remove - remove an interface */ 471a159c266SJung-uk Kim 472a159c266SJung-uk Kim SubString = ACPI_STRSTR ("REMOVE", ActionArg); 473a159c266SJung-uk Kim if (SubString) 474a159c266SJung-uk Kim { 475a159c266SJung-uk Kim Status = AcpiRemoveInterface (InterfaceNameArg); 476a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 477a159c266SJung-uk Kim { 478a159c266SJung-uk Kim AcpiOsPrintf ("%s, while removing \"%s\"\n", 479a159c266SJung-uk Kim AcpiFormatException (Status), InterfaceNameArg); 480a159c266SJung-uk Kim } 481a159c266SJung-uk Kim return; 482a159c266SJung-uk Kim } 483a159c266SJung-uk Kim 484a159c266SJung-uk Kim /* Invalid ActionArg */ 485a159c266SJung-uk Kim 486a159c266SJung-uk Kim AcpiOsPrintf ("Invalid action argument: %s\n", ActionArg); 487a159c266SJung-uk Kim return; 488a159c266SJung-uk Kim } 489a159c266SJung-uk Kim 490a159c266SJung-uk Kim 491a159c266SJung-uk Kim /******************************************************************************* 492a159c266SJung-uk Kim * 493a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayTemplate 494a159c266SJung-uk Kim * 495a159c266SJung-uk Kim * PARAMETERS: BufferArg - Buffer name or addrss 496a159c266SJung-uk Kim * 497a159c266SJung-uk Kim * RETURN: None 498a159c266SJung-uk Kim * 499a159c266SJung-uk Kim * DESCRIPTION: Dump a buffer that contains a resource template 500a159c266SJung-uk Kim * 501a159c266SJung-uk Kim ******************************************************************************/ 502a159c266SJung-uk Kim 503a159c266SJung-uk Kim void 504a159c266SJung-uk Kim AcpiDbDisplayTemplate ( 505a159c266SJung-uk Kim char *BufferArg) 506a159c266SJung-uk Kim { 507a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 508a159c266SJung-uk Kim ACPI_STATUS Status; 509a159c266SJung-uk Kim ACPI_BUFFER ReturnObj; 510a159c266SJung-uk Kim 511a159c266SJung-uk Kim 512a159c266SJung-uk Kim /* Translate BufferArg to an Named object */ 513a159c266SJung-uk Kim 514a159c266SJung-uk Kim Node = AcpiDbConvertToNode (BufferArg); 515a159c266SJung-uk Kim if (!Node || (Node == AcpiGbl_RootNode)) 516a159c266SJung-uk Kim { 517a159c266SJung-uk Kim AcpiOsPrintf ("Invalid argument: %s\n", BufferArg); 518a159c266SJung-uk Kim return; 519a159c266SJung-uk Kim } 520a159c266SJung-uk Kim 521a159c266SJung-uk Kim /* We must have a buffer object */ 522a159c266SJung-uk Kim 523a159c266SJung-uk Kim if (Node->Type != ACPI_TYPE_BUFFER) 524a159c266SJung-uk Kim { 525a159c266SJung-uk Kim AcpiOsPrintf ("Not a Buffer object, cannot be a template: %s\n", 526a159c266SJung-uk Kim BufferArg); 527a159c266SJung-uk Kim return; 528a159c266SJung-uk Kim } 529a159c266SJung-uk Kim 530a159c266SJung-uk Kim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 531a159c266SJung-uk Kim ReturnObj.Pointer = AcpiGbl_DbBuffer; 532a159c266SJung-uk Kim 533a159c266SJung-uk Kim /* Attempt to convert the raw buffer to a resource list */ 534a159c266SJung-uk Kim 535a159c266SJung-uk Kim Status = AcpiRsCreateResourceList (Node->Object, &ReturnObj); 536a159c266SJung-uk Kim 537a159c266SJung-uk Kim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 538a159c266SJung-uk Kim AcpiDbgLevel |= ACPI_LV_RESOURCES; 539a159c266SJung-uk Kim 540a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 541a159c266SJung-uk Kim { 542a159c266SJung-uk Kim AcpiOsPrintf ("Could not convert Buffer to a resource list: %s, %s\n", 543a159c266SJung-uk Kim BufferArg, AcpiFormatException (Status)); 544a159c266SJung-uk Kim goto DumpBuffer; 545a159c266SJung-uk Kim } 546a159c266SJung-uk Kim 547a159c266SJung-uk Kim /* Now we can dump the resource list */ 548a159c266SJung-uk Kim 549a159c266SJung-uk Kim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, 550a159c266SJung-uk Kim ReturnObj.Pointer)); 551a159c266SJung-uk Kim 552a159c266SJung-uk Kim DumpBuffer: 553a159c266SJung-uk Kim AcpiOsPrintf ("\nRaw data buffer:\n"); 554a159c266SJung-uk Kim AcpiUtDumpBuffer ((UINT8 *) Node->Object->Buffer.Pointer, 555a159c266SJung-uk Kim Node->Object->Buffer.Length, 556a159c266SJung-uk Kim DB_BYTE_DISPLAY, ACPI_UINT32_MAX); 557a159c266SJung-uk Kim 558a159c266SJung-uk Kim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 559a159c266SJung-uk Kim return; 560a159c266SJung-uk Kim } 561a159c266SJung-uk Kim 562a159c266SJung-uk Kim 563a159c266SJung-uk Kim /******************************************************************************* 564a159c266SJung-uk Kim * 565a159c266SJung-uk Kim * FUNCTION: AcpiDmCompareAmlResources 566a159c266SJung-uk Kim * 567a159c266SJung-uk Kim * PARAMETERS: Aml1Buffer - Contains first resource list 568a159c266SJung-uk Kim * Aml1BufferLength - Length of first resource list 569a159c266SJung-uk Kim * Aml2Buffer - Contains second resource list 570a159c266SJung-uk Kim * Aml2BufferLength - Length of second resource list 571a159c266SJung-uk Kim * 572a159c266SJung-uk Kim * RETURN: None 573a159c266SJung-uk Kim * 574a159c266SJung-uk Kim * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in 575a159c266SJung-uk Kim * order to isolate a miscompare to an individual resource) 576a159c266SJung-uk Kim * 577a159c266SJung-uk Kim ******************************************************************************/ 578a159c266SJung-uk Kim 579a159c266SJung-uk Kim static void 580a159c266SJung-uk Kim AcpiDmCompareAmlResources ( 581a159c266SJung-uk Kim UINT8 *Aml1Buffer, 582a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml1BufferLength, 583a159c266SJung-uk Kim UINT8 *Aml2Buffer, 584a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml2BufferLength) 585a159c266SJung-uk Kim { 586a159c266SJung-uk Kim UINT8 *Aml1; 587a159c266SJung-uk Kim UINT8 *Aml2; 588a159c266SJung-uk Kim UINT8 *Aml1End; 589a159c266SJung-uk Kim UINT8 *Aml2End; 590a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml1Length; 591a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml2Length; 592a159c266SJung-uk Kim ACPI_RSDESC_SIZE Offset = 0; 593a159c266SJung-uk Kim UINT8 ResourceType; 594a159c266SJung-uk Kim UINT32 Count = 0; 595a159c266SJung-uk Kim UINT32 i; 596a159c266SJung-uk Kim 597a159c266SJung-uk Kim 598a159c266SJung-uk Kim /* Compare overall buffer sizes (may be different due to size rounding) */ 599a159c266SJung-uk Kim 600a159c266SJung-uk Kim if (Aml1BufferLength != Aml2BufferLength) 601a159c266SJung-uk Kim { 602a159c266SJung-uk Kim AcpiOsPrintf ( 603a159c266SJung-uk Kim "**** Buffer length mismatch in converted AML: Original %X, New %X ****\n", 604a159c266SJung-uk Kim Aml1BufferLength, Aml2BufferLength); 605a159c266SJung-uk Kim } 606a159c266SJung-uk Kim 607a159c266SJung-uk Kim Aml1 = Aml1Buffer; 608a159c266SJung-uk Kim Aml2 = Aml2Buffer; 609a159c266SJung-uk Kim Aml1End = Aml1Buffer + Aml1BufferLength; 610a159c266SJung-uk Kim Aml2End = Aml2Buffer + Aml2BufferLength; 611a159c266SJung-uk Kim 612a159c266SJung-uk Kim /* Walk the descriptor lists, comparing each descriptor */ 613a159c266SJung-uk Kim 614a159c266SJung-uk Kim while ((Aml1 < Aml1End) && (Aml2 < Aml2End)) 615a159c266SJung-uk Kim { 616a159c266SJung-uk Kim /* Get the lengths of each descriptor */ 617a159c266SJung-uk Kim 618a159c266SJung-uk Kim Aml1Length = AcpiUtGetDescriptorLength (Aml1); 619a159c266SJung-uk Kim Aml2Length = AcpiUtGetDescriptorLength (Aml2); 620a159c266SJung-uk Kim ResourceType = AcpiUtGetResourceType (Aml1); 621a159c266SJung-uk Kim 622a159c266SJung-uk Kim /* Check for descriptor length match */ 623a159c266SJung-uk Kim 624a159c266SJung-uk Kim if (Aml1Length != Aml2Length) 625a159c266SJung-uk Kim { 626a159c266SJung-uk Kim AcpiOsPrintf ( 627a159c266SJung-uk Kim "**** Length mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X Len1 %X, Len2 %X ****\n", 628a159c266SJung-uk Kim Count, ResourceType, Offset, Aml1Length, Aml2Length); 629a159c266SJung-uk Kim } 630a159c266SJung-uk Kim 631a159c266SJung-uk Kim /* Check for descriptor byte match */ 632a159c266SJung-uk Kim 633a159c266SJung-uk Kim else if (ACPI_MEMCMP (Aml1, Aml2, Aml1Length)) 634a159c266SJung-uk Kim { 635a159c266SJung-uk Kim AcpiOsPrintf ( 636a159c266SJung-uk Kim "**** Data mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X ****\n", 637a159c266SJung-uk Kim Count, ResourceType, Offset); 638a159c266SJung-uk Kim 639a159c266SJung-uk Kim for (i = 0; i < Aml1Length; i++) 640a159c266SJung-uk Kim { 641a159c266SJung-uk Kim if (Aml1[i] != Aml2[i]) 642a159c266SJung-uk Kim { 643a159c266SJung-uk Kim AcpiOsPrintf ("Mismatch at byte offset %.2X: is %2.2X, should be %2.2X\n", 644a159c266SJung-uk Kim i, Aml2[i], Aml1[i]); 645a159c266SJung-uk Kim } 646a159c266SJung-uk Kim } 647a159c266SJung-uk Kim } 648a159c266SJung-uk Kim 649a159c266SJung-uk Kim /* Exit on EndTag descriptor */ 650a159c266SJung-uk Kim 651a159c266SJung-uk Kim if (ResourceType == ACPI_RESOURCE_NAME_END_TAG) 652a159c266SJung-uk Kim { 653a159c266SJung-uk Kim return; 654a159c266SJung-uk Kim } 655a159c266SJung-uk Kim 656a159c266SJung-uk Kim /* Point to next descriptor in each buffer */ 657a159c266SJung-uk Kim 658a159c266SJung-uk Kim Count++; 659a159c266SJung-uk Kim Offset += Aml1Length; 660a159c266SJung-uk Kim Aml1 += Aml1Length; 661a159c266SJung-uk Kim Aml2 += Aml2Length; 662a159c266SJung-uk Kim } 663a159c266SJung-uk Kim } 664a159c266SJung-uk Kim 665a159c266SJung-uk Kim 666a159c266SJung-uk Kim /******************************************************************************* 667a159c266SJung-uk Kim * 668a159c266SJung-uk Kim * FUNCTION: AcpiDmTestResourceConversion 669a159c266SJung-uk Kim * 670a159c266SJung-uk Kim * PARAMETERS: Node - Parent device node 671a159c266SJung-uk Kim * Name - resource method name (_CRS) 672a159c266SJung-uk Kim * 673a159c266SJung-uk Kim * RETURN: Status 674a159c266SJung-uk Kim * 675a159c266SJung-uk Kim * DESCRIPTION: Compare the original AML with a conversion of the AML to 676a159c266SJung-uk Kim * internal resource list, then back to AML. 677a159c266SJung-uk Kim * 678a159c266SJung-uk Kim ******************************************************************************/ 679a159c266SJung-uk Kim 680a159c266SJung-uk Kim static ACPI_STATUS 681a159c266SJung-uk Kim AcpiDmTestResourceConversion ( 682a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node, 683a159c266SJung-uk Kim char *Name) 684a159c266SJung-uk Kim { 685a159c266SJung-uk Kim ACPI_STATUS Status; 686a159c266SJung-uk Kim ACPI_BUFFER ReturnObj; 687a159c266SJung-uk Kim ACPI_BUFFER ResourceObj; 688a159c266SJung-uk Kim ACPI_BUFFER NewAml; 689a159c266SJung-uk Kim ACPI_OBJECT *OriginalAml; 690a159c266SJung-uk Kim 691a159c266SJung-uk Kim 692a159c266SJung-uk Kim AcpiOsPrintf ("Resource Conversion Comparison:\n"); 693a159c266SJung-uk Kim 694a159c266SJung-uk Kim NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 695a159c266SJung-uk Kim ReturnObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 696a159c266SJung-uk Kim ResourceObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 697a159c266SJung-uk Kim 698a159c266SJung-uk Kim /* Get the original _CRS AML resource template */ 699a159c266SJung-uk Kim 700a159c266SJung-uk Kim Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnObj); 701a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 702a159c266SJung-uk Kim { 703a159c266SJung-uk Kim AcpiOsPrintf ("Could not obtain %s: %s\n", 704a159c266SJung-uk Kim Name, AcpiFormatException (Status)); 705a159c266SJung-uk Kim return (Status); 706a159c266SJung-uk Kim } 707a159c266SJung-uk Kim 708a159c266SJung-uk Kim /* Get the AML resource template, converted to internal resource structs */ 709a159c266SJung-uk Kim 710a159c266SJung-uk Kim Status = AcpiGetCurrentResources (Node, &ResourceObj); 711a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 712a159c266SJung-uk Kim { 713a159c266SJung-uk Kim AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n", 714a159c266SJung-uk Kim AcpiFormatException (Status)); 715a159c266SJung-uk Kim goto Exit1; 716a159c266SJung-uk Kim } 717a159c266SJung-uk Kim 718a159c266SJung-uk Kim /* Convert internal resource list to external AML resource template */ 719a159c266SJung-uk Kim 720a159c266SJung-uk Kim Status = AcpiRsCreateAmlResources (ResourceObj.Pointer, &NewAml); 721a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 722a159c266SJung-uk Kim { 723a159c266SJung-uk Kim AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n", 724a159c266SJung-uk Kim AcpiFormatException (Status)); 725a159c266SJung-uk Kim goto Exit2; 726a159c266SJung-uk Kim } 727a159c266SJung-uk Kim 728a159c266SJung-uk Kim /* Compare original AML to the newly created AML resource list */ 729a159c266SJung-uk Kim 730a159c266SJung-uk Kim OriginalAml = ReturnObj.Pointer; 731a159c266SJung-uk Kim 732a159c266SJung-uk Kim AcpiDmCompareAmlResources ( 733a159c266SJung-uk Kim OriginalAml->Buffer.Pointer, (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length, 734a159c266SJung-uk Kim NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length); 735a159c266SJung-uk Kim 736a159c266SJung-uk Kim /* Cleanup and exit */ 737a159c266SJung-uk Kim 738a159c266SJung-uk Kim ACPI_FREE (NewAml.Pointer); 739a159c266SJung-uk Kim Exit2: 740a159c266SJung-uk Kim ACPI_FREE (ResourceObj.Pointer); 741a159c266SJung-uk Kim Exit1: 742a159c266SJung-uk Kim ACPI_FREE (ReturnObj.Pointer); 743a159c266SJung-uk Kim return (Status); 744a159c266SJung-uk Kim } 745a159c266SJung-uk Kim 746a159c266SJung-uk Kim 747a159c266SJung-uk Kim /******************************************************************************* 748a159c266SJung-uk Kim * 749a159c266SJung-uk Kim * FUNCTION: AcpiDbResourceCallback 750a159c266SJung-uk Kim * 751a159c266SJung-uk Kim * PARAMETERS: ACPI_WALK_RESOURCE_CALLBACK 752a159c266SJung-uk Kim * 753a159c266SJung-uk Kim * RETURN: Status 754a159c266SJung-uk Kim * 755a159c266SJung-uk Kim * DESCRIPTION: Simple callback to exercise AcpiWalkResources 756a159c266SJung-uk Kim * 757a159c266SJung-uk Kim ******************************************************************************/ 758a159c266SJung-uk Kim 759a159c266SJung-uk Kim static ACPI_STATUS 760a159c266SJung-uk Kim AcpiDbResourceCallback ( 761a159c266SJung-uk Kim ACPI_RESOURCE *Resource, 762a159c266SJung-uk Kim void *Context) 763a159c266SJung-uk Kim { 764a159c266SJung-uk Kim 765a159c266SJung-uk Kim return (AE_OK); 766a159c266SJung-uk Kim } 767a159c266SJung-uk Kim 768a159c266SJung-uk Kim 769a159c266SJung-uk Kim /******************************************************************************* 770a159c266SJung-uk Kim * 771a159c266SJung-uk Kim * FUNCTION: AcpiDbDeviceResources 772a159c266SJung-uk Kim * 773a159c266SJung-uk Kim * PARAMETERS: ACPI_WALK_CALLBACK 774a159c266SJung-uk Kim * 775a159c266SJung-uk Kim * RETURN: Status 776a159c266SJung-uk Kim * 777a159c266SJung-uk Kim * DESCRIPTION: Display the _PRT/_CRS/_PRS resources for a device object. 778a159c266SJung-uk Kim * 779a159c266SJung-uk Kim ******************************************************************************/ 780a159c266SJung-uk Kim 781a159c266SJung-uk Kim static ACPI_STATUS 782a159c266SJung-uk Kim AcpiDbDeviceResources ( 783a159c266SJung-uk Kim ACPI_HANDLE ObjHandle, 784a159c266SJung-uk Kim UINT32 NestingLevel, 785a159c266SJung-uk Kim void *Context, 786a159c266SJung-uk Kim void **ReturnValue) 787a159c266SJung-uk Kim { 788a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 789a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *PrtNode = NULL; 790a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *CrsNode = NULL; 791a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *PrsNode = NULL; 792a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *AeiNode = NULL; 793a159c266SJung-uk Kim char *ParentPath; 794a159c266SJung-uk Kim ACPI_BUFFER ReturnObj; 795a159c266SJung-uk Kim ACPI_STATUS Status; 796a159c266SJung-uk Kim 797a159c266SJung-uk Kim 798a159c266SJung-uk Kim Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle); 799a159c266SJung-uk Kim ParentPath = AcpiNsGetExternalPathname (Node); 800a159c266SJung-uk Kim if (!ParentPath) 801a159c266SJung-uk Kim { 802a159c266SJung-uk Kim return (AE_NO_MEMORY); 803a159c266SJung-uk Kim } 804a159c266SJung-uk Kim 805a159c266SJung-uk Kim /* Get handles to the resource methods for this device */ 806a159c266SJung-uk Kim 807a159c266SJung-uk Kim (void) AcpiGetHandle (Node, METHOD_NAME__PRT, ACPI_CAST_PTR (ACPI_HANDLE, &PrtNode)); 808a159c266SJung-uk Kim (void) AcpiGetHandle (Node, METHOD_NAME__CRS, ACPI_CAST_PTR (ACPI_HANDLE, &CrsNode)); 809a159c266SJung-uk Kim (void) AcpiGetHandle (Node, METHOD_NAME__PRS, ACPI_CAST_PTR (ACPI_HANDLE, &PrsNode)); 810a159c266SJung-uk Kim (void) AcpiGetHandle (Node, METHOD_NAME__AEI, ACPI_CAST_PTR (ACPI_HANDLE, &AeiNode)); 811a159c266SJung-uk Kim if (!PrtNode && !CrsNode && !PrsNode && !AeiNode) 812a159c266SJung-uk Kim { 813a159c266SJung-uk Kim goto Cleanup; /* Nothing to do */ 814a159c266SJung-uk Kim } 815a159c266SJung-uk Kim 816a159c266SJung-uk Kim AcpiOsPrintf ("\nDevice: %s\n", ParentPath); 817a159c266SJung-uk Kim 818a159c266SJung-uk Kim /* Prepare for a return object of arbitrary size */ 819a159c266SJung-uk Kim 820a159c266SJung-uk Kim ReturnObj.Pointer = AcpiGbl_DbBuffer; 821a159c266SJung-uk Kim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 822a159c266SJung-uk Kim 823a159c266SJung-uk Kim 824a159c266SJung-uk Kim /* _PRT */ 825a159c266SJung-uk Kim 826a159c266SJung-uk Kim if (PrtNode) 827a159c266SJung-uk Kim { 828a159c266SJung-uk Kim AcpiOsPrintf ("Evaluating _PRT\n"); 829a159c266SJung-uk Kim 830a159c266SJung-uk Kim Status = AcpiEvaluateObject (PrtNode, NULL, NULL, &ReturnObj); 831a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 832a159c266SJung-uk Kim { 833a159c266SJung-uk Kim AcpiOsPrintf ("Could not evaluate _PRT: %s\n", 834a159c266SJung-uk Kim AcpiFormatException (Status)); 835a159c266SJung-uk Kim goto GetCrs; 836a159c266SJung-uk Kim } 837a159c266SJung-uk Kim 838a159c266SJung-uk Kim ReturnObj.Pointer = AcpiGbl_DbBuffer; 839a159c266SJung-uk Kim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 840a159c266SJung-uk Kim 841a159c266SJung-uk Kim Status = AcpiGetIrqRoutingTable (Node, &ReturnObj); 842a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 843a159c266SJung-uk Kim { 844a159c266SJung-uk Kim AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n", 845a159c266SJung-uk Kim AcpiFormatException (Status)); 846a159c266SJung-uk Kim goto GetCrs; 847a159c266SJung-uk Kim } 848a159c266SJung-uk Kim 849a159c266SJung-uk Kim AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer)); 850a159c266SJung-uk Kim } 851a159c266SJung-uk Kim 852a159c266SJung-uk Kim 853a159c266SJung-uk Kim /* _CRS */ 854a159c266SJung-uk Kim 855a159c266SJung-uk Kim GetCrs: 856a159c266SJung-uk Kim if (CrsNode) 857a159c266SJung-uk Kim { 858a159c266SJung-uk Kim AcpiOsPrintf ("Evaluating _CRS\n"); 859a159c266SJung-uk Kim 860a159c266SJung-uk Kim ReturnObj.Pointer = AcpiGbl_DbBuffer; 861a159c266SJung-uk Kim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 862a159c266SJung-uk Kim 863a159c266SJung-uk Kim Status = AcpiEvaluateObject (CrsNode, NULL, NULL, &ReturnObj); 864a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 865a159c266SJung-uk Kim { 866a159c266SJung-uk Kim AcpiOsPrintf ("Could not evaluate _CRS: %s\n", 867a159c266SJung-uk Kim AcpiFormatException (Status)); 868a159c266SJung-uk Kim goto GetPrs; 869a159c266SJung-uk Kim } 870a159c266SJung-uk Kim 871a159c266SJung-uk Kim /* This code is here to exercise the AcpiWalkResources interface */ 872a159c266SJung-uk Kim 873a159c266SJung-uk Kim Status = AcpiWalkResources (Node, METHOD_NAME__CRS, 874a159c266SJung-uk Kim AcpiDbResourceCallback, NULL); 875a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 876a159c266SJung-uk Kim { 877a159c266SJung-uk Kim AcpiOsPrintf ("AcpiWalkResources failed: %s\n", 878a159c266SJung-uk Kim AcpiFormatException (Status)); 879a159c266SJung-uk Kim goto GetPrs; 880a159c266SJung-uk Kim } 881a159c266SJung-uk Kim 882a159c266SJung-uk Kim /* Get the _CRS resource list */ 883a159c266SJung-uk Kim 884a159c266SJung-uk Kim ReturnObj.Pointer = AcpiGbl_DbBuffer; 885a159c266SJung-uk Kim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 886a159c266SJung-uk Kim 887a159c266SJung-uk Kim Status = AcpiGetCurrentResources (Node, &ReturnObj); 888a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 889a159c266SJung-uk Kim { 890a159c266SJung-uk Kim AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n", 891a159c266SJung-uk Kim AcpiFormatException (Status)); 892a159c266SJung-uk Kim goto GetPrs; 893a159c266SJung-uk Kim } 894a159c266SJung-uk Kim 895a159c266SJung-uk Kim /* Dump the _CRS resource list */ 896a159c266SJung-uk Kim 897a159c266SJung-uk Kim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, 898a159c266SJung-uk Kim ReturnObj.Pointer)); 899a159c266SJung-uk Kim 900a159c266SJung-uk Kim /* 901a159c266SJung-uk Kim * Perform comparison of original AML to newly created AML. This tests both 902a159c266SJung-uk Kim * the AML->Resource conversion and the Resource->Aml conversion. 903a159c266SJung-uk Kim */ 904a159c266SJung-uk Kim Status = AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS); 905a159c266SJung-uk Kim 906a159c266SJung-uk Kim /* Execute _SRS with the resource list */ 907a159c266SJung-uk Kim 908a159c266SJung-uk Kim Status = AcpiSetCurrentResources (Node, &ReturnObj); 909a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 910a159c266SJung-uk Kim { 911a159c266SJung-uk Kim AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n", 912a159c266SJung-uk Kim AcpiFormatException (Status)); 913a159c266SJung-uk Kim goto GetPrs; 914a159c266SJung-uk Kim } 915a159c266SJung-uk Kim } 916a159c266SJung-uk Kim 917a159c266SJung-uk Kim 918a159c266SJung-uk Kim /* _PRS */ 919a159c266SJung-uk Kim 920a159c266SJung-uk Kim GetPrs: 921a159c266SJung-uk Kim if (PrsNode) 922a159c266SJung-uk Kim { 923a159c266SJung-uk Kim AcpiOsPrintf ("Evaluating _PRS\n"); 924a159c266SJung-uk Kim 925a159c266SJung-uk Kim ReturnObj.Pointer = AcpiGbl_DbBuffer; 926a159c266SJung-uk Kim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 927a159c266SJung-uk Kim 928a159c266SJung-uk Kim Status = AcpiEvaluateObject (PrsNode, NULL, NULL, &ReturnObj); 929a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 930a159c266SJung-uk Kim { 931a159c266SJung-uk Kim AcpiOsPrintf ("Could not evaluate _PRS: %s\n", 932a159c266SJung-uk Kim AcpiFormatException (Status)); 933a159c266SJung-uk Kim goto GetAei; 934a159c266SJung-uk Kim } 935a159c266SJung-uk Kim 936a159c266SJung-uk Kim ReturnObj.Pointer = AcpiGbl_DbBuffer; 937a159c266SJung-uk Kim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 938a159c266SJung-uk Kim 939a159c266SJung-uk Kim Status = AcpiGetPossibleResources (Node, &ReturnObj); 940a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 941a159c266SJung-uk Kim { 942a159c266SJung-uk Kim AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n", 943a159c266SJung-uk Kim AcpiFormatException (Status)); 944a159c266SJung-uk Kim goto GetAei; 945a159c266SJung-uk Kim } 946a159c266SJung-uk Kim 947a159c266SJung-uk Kim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer)); 948a159c266SJung-uk Kim } 949a159c266SJung-uk Kim 950a159c266SJung-uk Kim 951a159c266SJung-uk Kim /* _AEI */ 952a159c266SJung-uk Kim 953a159c266SJung-uk Kim GetAei: 954a159c266SJung-uk Kim if (AeiNode) 955a159c266SJung-uk Kim { 956a159c266SJung-uk Kim AcpiOsPrintf ("Evaluating _AEI\n"); 957a159c266SJung-uk Kim 958a159c266SJung-uk Kim ReturnObj.Pointer = AcpiGbl_DbBuffer; 959a159c266SJung-uk Kim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 960a159c266SJung-uk Kim 961a159c266SJung-uk Kim Status = AcpiEvaluateObject (AeiNode, NULL, NULL, &ReturnObj); 962a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 963a159c266SJung-uk Kim { 964a159c266SJung-uk Kim AcpiOsPrintf ("Could not evaluate _AEI: %s\n", 965a159c266SJung-uk Kim AcpiFormatException (Status)); 966a159c266SJung-uk Kim goto Cleanup; 967a159c266SJung-uk Kim } 968a159c266SJung-uk Kim 969a159c266SJung-uk Kim ReturnObj.Pointer = AcpiGbl_DbBuffer; 970a159c266SJung-uk Kim ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE; 971a159c266SJung-uk Kim 972a159c266SJung-uk Kim Status = AcpiGetEventResources (Node, &ReturnObj); 973a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 974a159c266SJung-uk Kim { 975a159c266SJung-uk Kim AcpiOsPrintf ("AcpiGetEventResources failed: %s\n", 976a159c266SJung-uk Kim AcpiFormatException (Status)); 977a159c266SJung-uk Kim goto Cleanup; 978a159c266SJung-uk Kim } 979a159c266SJung-uk Kim 980a159c266SJung-uk Kim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer)); 981a159c266SJung-uk Kim } 982a159c266SJung-uk Kim 983a159c266SJung-uk Kim 984a159c266SJung-uk Kim Cleanup: 985a159c266SJung-uk Kim ACPI_FREE (ParentPath); 986a159c266SJung-uk Kim return (AE_OK); 987a159c266SJung-uk Kim } 988a159c266SJung-uk Kim 989a159c266SJung-uk Kim 990a159c266SJung-uk Kim /******************************************************************************* 991a159c266SJung-uk Kim * 992a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayResources 993a159c266SJung-uk Kim * 994a159c266SJung-uk Kim * PARAMETERS: ObjectArg - String object name or object pointer. 995a159c266SJung-uk Kim * "*" means "display resources for all devices" 996a159c266SJung-uk Kim * 997a159c266SJung-uk Kim * RETURN: None 998a159c266SJung-uk Kim * 999a159c266SJung-uk Kim * DESCRIPTION: Display the resource objects associated with a device. 1000a159c266SJung-uk Kim * 1001a159c266SJung-uk Kim ******************************************************************************/ 1002a159c266SJung-uk Kim 1003a159c266SJung-uk Kim void 1004a159c266SJung-uk Kim AcpiDbDisplayResources ( 1005a159c266SJung-uk Kim char *ObjectArg) 1006a159c266SJung-uk Kim { 1007a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 1008a159c266SJung-uk Kim 1009a159c266SJung-uk Kim 1010a159c266SJung-uk Kim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 1011a159c266SJung-uk Kim AcpiDbgLevel |= ACPI_LV_RESOURCES; 1012a159c266SJung-uk Kim 1013a159c266SJung-uk Kim /* Asterisk means "display resources for all devices" */ 1014a159c266SJung-uk Kim 1015a159c266SJung-uk Kim if (!ACPI_STRCMP (ObjectArg, "*")) 1016a159c266SJung-uk Kim { 1017a159c266SJung-uk Kim (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, 1018a159c266SJung-uk Kim ACPI_UINT32_MAX, AcpiDbDeviceResources, NULL, NULL, NULL); 1019a159c266SJung-uk Kim } 1020a159c266SJung-uk Kim else 1021a159c266SJung-uk Kim { 1022a159c266SJung-uk Kim /* Convert string to object pointer */ 1023a159c266SJung-uk Kim 1024a159c266SJung-uk Kim Node = AcpiDbConvertToNode (ObjectArg); 1025a159c266SJung-uk Kim if (Node) 1026a159c266SJung-uk Kim { 1027a159c266SJung-uk Kim if (Node->Type != ACPI_TYPE_DEVICE) 1028a159c266SJung-uk Kim { 1029a159c266SJung-uk Kim AcpiOsPrintf ("%4.4s: Name is not a device object (%s)\n", 1030a159c266SJung-uk Kim Node->Name.Ascii, AcpiUtGetTypeName (Node->Type)); 1031a159c266SJung-uk Kim } 1032a159c266SJung-uk Kim else 1033a159c266SJung-uk Kim { 1034a159c266SJung-uk Kim (void) AcpiDbDeviceResources (Node, 0, NULL, NULL); 1035a159c266SJung-uk Kim } 1036a159c266SJung-uk Kim } 1037a159c266SJung-uk Kim } 1038a159c266SJung-uk Kim 1039a159c266SJung-uk Kim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 1040a159c266SJung-uk Kim } 1041a159c266SJung-uk Kim 1042a159c266SJung-uk Kim 1043a159c266SJung-uk Kim #if (!ACPI_REDUCED_HARDWARE) 1044a159c266SJung-uk Kim /******************************************************************************* 1045a159c266SJung-uk Kim * 1046a159c266SJung-uk Kim * FUNCTION: AcpiDbGenerateGpe 1047a159c266SJung-uk Kim * 1048a159c266SJung-uk Kim * PARAMETERS: GpeArg - Raw GPE number, ascii string 1049a159c266SJung-uk Kim * BlockArg - GPE block number, ascii string 1050a159c266SJung-uk Kim * 0 or 1 for FADT GPE blocks 1051a159c266SJung-uk Kim * 1052a159c266SJung-uk Kim * RETURN: None 1053a159c266SJung-uk Kim * 1054a159c266SJung-uk Kim * DESCRIPTION: Generate a GPE 1055a159c266SJung-uk Kim * 1056a159c266SJung-uk Kim ******************************************************************************/ 1057a159c266SJung-uk Kim 1058a159c266SJung-uk Kim void 1059a159c266SJung-uk Kim AcpiDbGenerateGpe ( 1060a159c266SJung-uk Kim char *GpeArg, 1061a159c266SJung-uk Kim char *BlockArg) 1062a159c266SJung-uk Kim { 1063a159c266SJung-uk Kim UINT32 BlockNumber; 1064a159c266SJung-uk Kim UINT32 GpeNumber; 1065a159c266SJung-uk Kim ACPI_GPE_EVENT_INFO *GpeEventInfo; 1066a159c266SJung-uk Kim 1067a159c266SJung-uk Kim 1068a159c266SJung-uk Kim GpeNumber = ACPI_STRTOUL (GpeArg, NULL, 0); 1069a159c266SJung-uk Kim BlockNumber = ACPI_STRTOUL (BlockArg, NULL, 0); 1070a159c266SJung-uk Kim 1071a159c266SJung-uk Kim 1072a159c266SJung-uk Kim GpeEventInfo = AcpiEvGetGpeEventInfo (ACPI_TO_POINTER (BlockNumber), 1073a159c266SJung-uk Kim GpeNumber); 1074a159c266SJung-uk Kim if (!GpeEventInfo) 1075a159c266SJung-uk Kim { 1076a159c266SJung-uk Kim AcpiOsPrintf ("Invalid GPE\n"); 1077a159c266SJung-uk Kim return; 1078a159c266SJung-uk Kim } 1079a159c266SJung-uk Kim 1080a159c266SJung-uk Kim (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber); 1081a159c266SJung-uk Kim } 1082a159c266SJung-uk Kim #endif /* !ACPI_REDUCED_HARDWARE */ 1083a159c266SJung-uk Kim 1084a159c266SJung-uk Kim #endif /* ACPI_DEBUGGER */ 1085