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 /* 81c0e1b6dSJung-uk Kim * Copyright (C) 2000 - 2015, 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 #include <contrib/dev/acpica/include/acpi.h> 45a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 46a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acevents.h> 47a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h> 48a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 49a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acresrc.h> 50a159c266SJung-uk Kim #include <contrib/dev/acpica/include/actables.h> 51a159c266SJung-uk Kim 52a159c266SJung-uk Kim 53a159c266SJung-uk Kim #define _COMPONENT ACPI_CA_DEBUGGER 54a159c266SJung-uk Kim ACPI_MODULE_NAME ("dbcmds") 55a159c266SJung-uk Kim 56a159c266SJung-uk Kim 57a159c266SJung-uk Kim /* Local prototypes */ 58a159c266SJung-uk Kim 59a159c266SJung-uk Kim static void 60a159c266SJung-uk Kim AcpiDmCompareAmlResources ( 61a159c266SJung-uk Kim UINT8 *Aml1Buffer, 62a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml1BufferLength, 63a159c266SJung-uk Kim UINT8 *Aml2Buffer, 64a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml2BufferLength); 65a159c266SJung-uk Kim 66a159c266SJung-uk Kim static ACPI_STATUS 67a159c266SJung-uk Kim AcpiDmTestResourceConversion ( 68a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node, 69a159c266SJung-uk Kim char *Name); 70a159c266SJung-uk Kim 71a159c266SJung-uk Kim static ACPI_STATUS 72a159c266SJung-uk Kim AcpiDbResourceCallback ( 73a159c266SJung-uk Kim ACPI_RESOURCE *Resource, 74a159c266SJung-uk Kim void *Context); 75a159c266SJung-uk Kim 76a159c266SJung-uk Kim static ACPI_STATUS 77a159c266SJung-uk Kim AcpiDbDeviceResources ( 78a159c266SJung-uk Kim ACPI_HANDLE ObjHandle, 79a159c266SJung-uk Kim UINT32 NestingLevel, 80a159c266SJung-uk Kim void *Context, 81a159c266SJung-uk Kim void **ReturnValue); 82a159c266SJung-uk Kim 83efcc2a30SJung-uk Kim static void 84efcc2a30SJung-uk Kim AcpiDbDoOneSleepState ( 85efcc2a30SJung-uk Kim UINT8 SleepState); 86efcc2a30SJung-uk Kim 87a159c266SJung-uk Kim 88fe0f0bbbSJung-uk Kim static char *AcpiDbTraceMethodName = NULL; 89fe0f0bbbSJung-uk Kim 90*70e6ab8fSJung-uk Kim 91a159c266SJung-uk Kim /******************************************************************************* 92a159c266SJung-uk Kim * 93a159c266SJung-uk Kim * FUNCTION: AcpiDbConvertToNode 94a159c266SJung-uk Kim * 95a159c266SJung-uk Kim * PARAMETERS: InString - String to convert 96a159c266SJung-uk Kim * 97a159c266SJung-uk Kim * RETURN: Pointer to a NS node 98a159c266SJung-uk Kim * 99a159c266SJung-uk Kim * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or 100efcc2a30SJung-uk Kim * alphanumeric strings. 101a159c266SJung-uk Kim * 102a159c266SJung-uk Kim ******************************************************************************/ 103a159c266SJung-uk Kim 104a159c266SJung-uk Kim ACPI_NAMESPACE_NODE * 105a159c266SJung-uk Kim AcpiDbConvertToNode ( 106a159c266SJung-uk Kim char *InString) 107a159c266SJung-uk Kim { 108a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 1098d744e47SJung-uk Kim ACPI_SIZE Address; 110a159c266SJung-uk Kim 111a159c266SJung-uk Kim 112a159c266SJung-uk Kim if ((*InString >= 0x30) && (*InString <= 0x39)) 113a159c266SJung-uk Kim { 114a159c266SJung-uk Kim /* Numeric argument, convert */ 115a159c266SJung-uk Kim 1165ef50723SJung-uk Kim Address = strtoul (InString, NULL, 16); 1178d744e47SJung-uk Kim Node = ACPI_TO_POINTER (Address); 118a159c266SJung-uk Kim if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE))) 119a159c266SJung-uk Kim { 120313a0c13SJung-uk Kim AcpiOsPrintf ("Address %p is invalid", 121a159c266SJung-uk Kim Node); 122a159c266SJung-uk Kim return (NULL); 123a159c266SJung-uk Kim } 124a159c266SJung-uk Kim 125a159c266SJung-uk Kim /* Make sure pointer is valid NS node */ 126a159c266SJung-uk Kim 127a159c266SJung-uk Kim if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED) 128a159c266SJung-uk Kim { 129313a0c13SJung-uk Kim AcpiOsPrintf ("Address %p is not a valid namespace node [%s]\n", 130a159c266SJung-uk Kim Node, AcpiUtGetDescriptorName (Node)); 131a159c266SJung-uk Kim return (NULL); 132a159c266SJung-uk Kim } 133a159c266SJung-uk Kim } 134a159c266SJung-uk Kim else 135a159c266SJung-uk Kim { 136efcc2a30SJung-uk Kim /* 137efcc2a30SJung-uk Kim * Alpha argument: The parameter is a name string that must be 138efcc2a30SJung-uk Kim * resolved to a Namespace object. 139a159c266SJung-uk Kim */ 140a159c266SJung-uk Kim Node = AcpiDbLocalNsLookup (InString); 141a159c266SJung-uk Kim if (!Node) 142a159c266SJung-uk Kim { 143*70e6ab8fSJung-uk Kim AcpiOsPrintf ( 144*70e6ab8fSJung-uk Kim "Could not find [%s] in namespace, defaulting to root node\n", 145313a0c13SJung-uk Kim InString); 146a159c266SJung-uk Kim Node = AcpiGbl_RootNode; 147a159c266SJung-uk Kim } 148a159c266SJung-uk Kim } 149a159c266SJung-uk Kim 150a159c266SJung-uk Kim return (Node); 151a159c266SJung-uk Kim } 152a159c266SJung-uk Kim 153a159c266SJung-uk Kim 154a159c266SJung-uk Kim /******************************************************************************* 155a159c266SJung-uk Kim * 156a159c266SJung-uk Kim * FUNCTION: AcpiDbSleep 157a159c266SJung-uk Kim * 158efcc2a30SJung-uk Kim * PARAMETERS: ObjectArg - Desired sleep state (0-5). NULL means 159efcc2a30SJung-uk Kim * invoke all possible sleep states. 160a159c266SJung-uk Kim * 161a159c266SJung-uk Kim * RETURN: Status 162a159c266SJung-uk Kim * 163efcc2a30SJung-uk Kim * DESCRIPTION: Simulate sleep/wake sequences 164a159c266SJung-uk Kim * 165a159c266SJung-uk Kim ******************************************************************************/ 166a159c266SJung-uk Kim 167a159c266SJung-uk Kim ACPI_STATUS 168a159c266SJung-uk Kim AcpiDbSleep ( 169a159c266SJung-uk Kim char *ObjectArg) 170a159c266SJung-uk Kim { 171a159c266SJung-uk Kim UINT8 SleepState; 172efcc2a30SJung-uk Kim UINT32 i; 173a159c266SJung-uk Kim 174a159c266SJung-uk Kim 175a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (AcpiDbSleep); 176a159c266SJung-uk Kim 177a159c266SJung-uk Kim 178efcc2a30SJung-uk Kim /* Null input (no arguments) means to invoke all sleep states */ 179a159c266SJung-uk Kim 180efcc2a30SJung-uk Kim if (!ObjectArg) 181efcc2a30SJung-uk Kim { 182efcc2a30SJung-uk Kim AcpiOsPrintf ("Invoking all possible sleep states, 0-%d\n", 183efcc2a30SJung-uk Kim ACPI_S_STATES_MAX); 184efcc2a30SJung-uk Kim 185efcc2a30SJung-uk Kim for (i = 0; i <= ACPI_S_STATES_MAX; i++) 186efcc2a30SJung-uk Kim { 187efcc2a30SJung-uk Kim AcpiDbDoOneSleepState ((UINT8) i); 188efcc2a30SJung-uk Kim } 189efcc2a30SJung-uk Kim 190efcc2a30SJung-uk Kim return_ACPI_STATUS (AE_OK); 191efcc2a30SJung-uk Kim } 192efcc2a30SJung-uk Kim 193efcc2a30SJung-uk Kim /* Convert argument to binary and invoke the sleep state */ 194efcc2a30SJung-uk Kim 1955ef50723SJung-uk Kim SleepState = (UINT8) strtoul (ObjectArg, NULL, 0); 196efcc2a30SJung-uk Kim AcpiDbDoOneSleepState (SleepState); 197efcc2a30SJung-uk Kim return_ACPI_STATUS (AE_OK); 198efcc2a30SJung-uk Kim } 199efcc2a30SJung-uk Kim 200efcc2a30SJung-uk Kim 201efcc2a30SJung-uk Kim /******************************************************************************* 202efcc2a30SJung-uk Kim * 203efcc2a30SJung-uk Kim * FUNCTION: AcpiDbDoOneSleepState 204efcc2a30SJung-uk Kim * 205efcc2a30SJung-uk Kim * PARAMETERS: SleepState - Desired sleep state (0-5) 206efcc2a30SJung-uk Kim * 207*70e6ab8fSJung-uk Kim * RETURN: None 208efcc2a30SJung-uk Kim * 209efcc2a30SJung-uk Kim * DESCRIPTION: Simulate a sleep/wake sequence 210efcc2a30SJung-uk Kim * 211efcc2a30SJung-uk Kim ******************************************************************************/ 212efcc2a30SJung-uk Kim 213efcc2a30SJung-uk Kim static void 214efcc2a30SJung-uk Kim AcpiDbDoOneSleepState ( 215efcc2a30SJung-uk Kim UINT8 SleepState) 216efcc2a30SJung-uk Kim { 217efcc2a30SJung-uk Kim ACPI_STATUS Status; 218efcc2a30SJung-uk Kim UINT8 SleepTypeA; 219efcc2a30SJung-uk Kim UINT8 SleepTypeB; 220efcc2a30SJung-uk Kim 221efcc2a30SJung-uk Kim 222efcc2a30SJung-uk Kim /* Validate parameter */ 223efcc2a30SJung-uk Kim 224efcc2a30SJung-uk Kim if (SleepState > ACPI_S_STATES_MAX) 225efcc2a30SJung-uk Kim { 226efcc2a30SJung-uk Kim AcpiOsPrintf ("Sleep state %d out of range (%d max)\n", 227efcc2a30SJung-uk Kim SleepState, ACPI_S_STATES_MAX); 228efcc2a30SJung-uk Kim return; 229efcc2a30SJung-uk Kim } 230efcc2a30SJung-uk Kim 231efcc2a30SJung-uk Kim AcpiOsPrintf ("\n---- Invoking sleep state S%d (%s):\n", 232efcc2a30SJung-uk Kim SleepState, AcpiGbl_SleepStateNames[SleepState]); 233efcc2a30SJung-uk Kim 234efcc2a30SJung-uk Kim /* Get the values for the sleep type registers (for display only) */ 235efcc2a30SJung-uk Kim 236efcc2a30SJung-uk Kim Status = AcpiGetSleepTypeData (SleepState, &SleepTypeA, &SleepTypeB); 237efcc2a30SJung-uk Kim if (ACPI_FAILURE (Status)) 238efcc2a30SJung-uk Kim { 239efcc2a30SJung-uk Kim AcpiOsPrintf ("Could not evaluate [%s] method, %s\n", 240efcc2a30SJung-uk Kim AcpiGbl_SleepStateNames[SleepState], 241efcc2a30SJung-uk Kim AcpiFormatException (Status)); 242efcc2a30SJung-uk Kim return; 243efcc2a30SJung-uk Kim } 244efcc2a30SJung-uk Kim 245efcc2a30SJung-uk Kim AcpiOsPrintf ( 246efcc2a30SJung-uk Kim "Register values for sleep state S%d: Sleep-A: %.2X, Sleep-B: %.2X\n", 247efcc2a30SJung-uk Kim SleepState, SleepTypeA, SleepTypeB); 248efcc2a30SJung-uk Kim 249efcc2a30SJung-uk Kim /* Invoke the various sleep/wake interfaces */ 250efcc2a30SJung-uk Kim 251efcc2a30SJung-uk Kim AcpiOsPrintf ("**** Sleep: Prepare to sleep (S%d) ****\n", 252efcc2a30SJung-uk Kim SleepState); 253a159c266SJung-uk Kim Status = AcpiEnterSleepStatePrep (SleepState); 254a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 255a159c266SJung-uk Kim { 256a159c266SJung-uk Kim goto ErrorExit; 257a159c266SJung-uk Kim } 258a159c266SJung-uk Kim 259efcc2a30SJung-uk Kim AcpiOsPrintf ("**** Sleep: Going to sleep (S%d) ****\n", 260efcc2a30SJung-uk Kim SleepState); 2611df130f1SJung-uk Kim Status = AcpiEnterSleepState (SleepState); 262a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 263a159c266SJung-uk Kim { 264a159c266SJung-uk Kim goto ErrorExit; 265a159c266SJung-uk Kim } 266a159c266SJung-uk Kim 267efcc2a30SJung-uk Kim AcpiOsPrintf ("**** Wake: Prepare to return from sleep (S%d) ****\n", 268efcc2a30SJung-uk Kim SleepState); 2691df130f1SJung-uk Kim Status = AcpiLeaveSleepStatePrep (SleepState); 270a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 271a159c266SJung-uk Kim { 272a159c266SJung-uk Kim goto ErrorExit; 273a159c266SJung-uk Kim } 274a159c266SJung-uk Kim 275efcc2a30SJung-uk Kim AcpiOsPrintf ("**** Wake: Return from sleep (S%d) ****\n", 276efcc2a30SJung-uk Kim SleepState); 277a159c266SJung-uk Kim Status = AcpiLeaveSleepState (SleepState); 278a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 279a159c266SJung-uk Kim { 280a159c266SJung-uk Kim goto ErrorExit; 281a159c266SJung-uk Kim } 282a159c266SJung-uk Kim 283efcc2a30SJung-uk Kim return; 284a159c266SJung-uk Kim 285a159c266SJung-uk Kim 286a159c266SJung-uk Kim ErrorExit: 287efcc2a30SJung-uk Kim ACPI_EXCEPTION ((AE_INFO, Status, "During invocation of sleep state S%d", 288efcc2a30SJung-uk Kim SleepState)); 289a159c266SJung-uk Kim } 290a159c266SJung-uk Kim 291a159c266SJung-uk Kim 292a159c266SJung-uk Kim /******************************************************************************* 293a159c266SJung-uk Kim * 294a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayLocks 295a159c266SJung-uk Kim * 296a159c266SJung-uk Kim * PARAMETERS: None 297a159c266SJung-uk Kim * 298a159c266SJung-uk Kim * RETURN: None 299a159c266SJung-uk Kim * 300a159c266SJung-uk Kim * DESCRIPTION: Display information about internal mutexes. 301a159c266SJung-uk Kim * 302a159c266SJung-uk Kim ******************************************************************************/ 303a159c266SJung-uk Kim 304a159c266SJung-uk Kim void 305a159c266SJung-uk Kim AcpiDbDisplayLocks ( 306a159c266SJung-uk Kim void) 307a159c266SJung-uk Kim { 308a159c266SJung-uk Kim UINT32 i; 309a159c266SJung-uk Kim 310a159c266SJung-uk Kim 311a159c266SJung-uk Kim for (i = 0; i < ACPI_MAX_MUTEX; i++) 312a159c266SJung-uk Kim { 313a159c266SJung-uk Kim AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i), 314a159c266SJung-uk Kim AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED 315a159c266SJung-uk Kim ? "Locked" : "Unlocked"); 316a159c266SJung-uk Kim } 317a159c266SJung-uk Kim } 318a159c266SJung-uk Kim 319a159c266SJung-uk Kim 320a159c266SJung-uk Kim /******************************************************************************* 321a159c266SJung-uk Kim * 322a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayTableInfo 323a159c266SJung-uk Kim * 324efcc2a30SJung-uk Kim * PARAMETERS: TableArg - Name of table to be displayed 325a159c266SJung-uk Kim * 326a159c266SJung-uk Kim * RETURN: None 327a159c266SJung-uk Kim * 328a159c266SJung-uk Kim * DESCRIPTION: Display information about loaded tables. Current 329a159c266SJung-uk Kim * implementation displays all loaded tables. 330a159c266SJung-uk Kim * 331a159c266SJung-uk Kim ******************************************************************************/ 332a159c266SJung-uk Kim 333a159c266SJung-uk Kim void 334a159c266SJung-uk Kim AcpiDbDisplayTableInfo ( 335a159c266SJung-uk Kim char *TableArg) 336a159c266SJung-uk Kim { 337a159c266SJung-uk Kim UINT32 i; 338a159c266SJung-uk Kim ACPI_TABLE_DESC *TableDesc; 339a159c266SJung-uk Kim ACPI_STATUS Status; 340a159c266SJung-uk Kim 341a159c266SJung-uk Kim 342e8241eabSJung-uk Kim /* Header */ 343e8241eabSJung-uk Kim 344*70e6ab8fSJung-uk Kim AcpiOsPrintf ("Idx ID Status Type " 345*70e6ab8fSJung-uk Kim "TableHeader (Sig, Address, Length, Misc)\n"); 346e8241eabSJung-uk Kim 347a159c266SJung-uk Kim /* Walk the entire root table list */ 348a159c266SJung-uk Kim 349a159c266SJung-uk Kim for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++) 350a159c266SJung-uk Kim { 351a159c266SJung-uk Kim TableDesc = &AcpiGbl_RootTableList.Tables[i]; 352e8241eabSJung-uk Kim 353e8241eabSJung-uk Kim /* Index and Table ID */ 354e8241eabSJung-uk Kim 355e8241eabSJung-uk Kim AcpiOsPrintf ("%3u %.2u ", i, TableDesc->OwnerId); 356e8241eabSJung-uk Kim 357e8241eabSJung-uk Kim /* Decode the table flags */ 358e8241eabSJung-uk Kim 359e8241eabSJung-uk Kim if (!(TableDesc->Flags & ACPI_TABLE_IS_LOADED)) 360e8241eabSJung-uk Kim { 361e8241eabSJung-uk Kim AcpiOsPrintf ("NotLoaded "); 362e8241eabSJung-uk Kim } 363e8241eabSJung-uk Kim else 364e8241eabSJung-uk Kim { 365e8241eabSJung-uk Kim AcpiOsPrintf (" Loaded "); 366e8241eabSJung-uk Kim } 367e8241eabSJung-uk Kim 368e8241eabSJung-uk Kim switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) 369e8241eabSJung-uk Kim { 370313a0c13SJung-uk Kim case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: 371a9d8d09cSJung-uk Kim 372313a0c13SJung-uk Kim AcpiOsPrintf ("External/virtual "); 373e8241eabSJung-uk Kim break; 374e8241eabSJung-uk Kim 375313a0c13SJung-uk Kim case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL: 376a9d8d09cSJung-uk Kim 377313a0c13SJung-uk Kim AcpiOsPrintf ("Internal/physical "); 378e8241eabSJung-uk Kim break; 379e8241eabSJung-uk Kim 380313a0c13SJung-uk Kim case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: 381a9d8d09cSJung-uk Kim 382313a0c13SJung-uk Kim AcpiOsPrintf ("Internal/virtual "); 383e8241eabSJung-uk Kim break; 384e8241eabSJung-uk Kim 385e8241eabSJung-uk Kim default: 386a9d8d09cSJung-uk Kim 387313a0c13SJung-uk Kim AcpiOsPrintf ("INVALID TYPE "); 388e8241eabSJung-uk Kim break; 389e8241eabSJung-uk Kim } 390a159c266SJung-uk Kim 391a159c266SJung-uk Kim /* Make sure that the table is mapped */ 392a159c266SJung-uk Kim 393313a0c13SJung-uk Kim Status = AcpiTbValidateTable (TableDesc); 394a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 395a159c266SJung-uk Kim { 396a159c266SJung-uk Kim return; 397a159c266SJung-uk Kim } 398a159c266SJung-uk Kim 399a159c266SJung-uk Kim /* Dump the table header */ 400a159c266SJung-uk Kim 401a159c266SJung-uk Kim if (TableDesc->Pointer) 402a159c266SJung-uk Kim { 403a159c266SJung-uk Kim AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer); 404a159c266SJung-uk Kim } 405a159c266SJung-uk Kim else 406a159c266SJung-uk Kim { 407a159c266SJung-uk Kim /* If the pointer is null, the table has been unloaded */ 408a159c266SJung-uk Kim 409a159c266SJung-uk Kim ACPI_INFO ((AE_INFO, "%4.4s - Table has been unloaded", 410a159c266SJung-uk Kim TableDesc->Signature.Ascii)); 411a159c266SJung-uk Kim } 412a159c266SJung-uk Kim } 413a159c266SJung-uk Kim } 414a159c266SJung-uk Kim 415a159c266SJung-uk Kim 416a159c266SJung-uk Kim /******************************************************************************* 417a159c266SJung-uk Kim * 418a159c266SJung-uk Kim * FUNCTION: AcpiDbUnloadAcpiTable 419a159c266SJung-uk Kim * 420e8241eabSJung-uk Kim * PARAMETERS: ObjectName - Namespace pathname for an object that 421e8241eabSJung-uk Kim * is owned by the table to be unloaded 422a159c266SJung-uk Kim * 423e8241eabSJung-uk Kim * RETURN: None 424a159c266SJung-uk Kim * 425e8241eabSJung-uk Kim * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned 426e8241eabSJung-uk Kim * by the table. 427a159c266SJung-uk Kim * 428a159c266SJung-uk Kim ******************************************************************************/ 429a159c266SJung-uk Kim 430a159c266SJung-uk Kim void 431a159c266SJung-uk Kim AcpiDbUnloadAcpiTable ( 432e8241eabSJung-uk Kim char *ObjectName) 433a159c266SJung-uk Kim { 434e8241eabSJung-uk Kim ACPI_NAMESPACE_NODE *Node; 435a159c266SJung-uk Kim ACPI_STATUS Status; 436a159c266SJung-uk Kim 437a159c266SJung-uk Kim 438e8241eabSJung-uk Kim /* Translate name to an Named object */ 439a159c266SJung-uk Kim 440e8241eabSJung-uk Kim Node = AcpiDbConvertToNode (ObjectName); 441e8241eabSJung-uk Kim if (!Node) 442a159c266SJung-uk Kim { 443e8241eabSJung-uk Kim return; 444e8241eabSJung-uk Kim } 445a159c266SJung-uk Kim 446e8241eabSJung-uk Kim Status = AcpiUnloadParentTable (ACPI_CAST_PTR (ACPI_HANDLE, Node)); 447a159c266SJung-uk Kim if (ACPI_SUCCESS (Status)) 448a159c266SJung-uk Kim { 449e8241eabSJung-uk Kim AcpiOsPrintf ("Parent of [%s] (%p) unloaded and uninstalled\n", 450e8241eabSJung-uk Kim ObjectName, Node); 451a159c266SJung-uk Kim } 452a159c266SJung-uk Kim else 453a159c266SJung-uk Kim { 454e8241eabSJung-uk Kim AcpiOsPrintf ("%s, while unloading parent table of [%s]\n", 455e8241eabSJung-uk Kim AcpiFormatException (Status), ObjectName); 456a159c266SJung-uk Kim } 457a159c266SJung-uk Kim } 458a159c266SJung-uk Kim 459a159c266SJung-uk Kim 460a159c266SJung-uk Kim /******************************************************************************* 461a159c266SJung-uk Kim * 462a159c266SJung-uk Kim * FUNCTION: AcpiDbSendNotify 463a159c266SJung-uk Kim * 464efcc2a30SJung-uk Kim * PARAMETERS: Name - Name of ACPI object where to send notify 465a159c266SJung-uk Kim * Value - Value of the notify to send. 466a159c266SJung-uk Kim * 467a159c266SJung-uk Kim * RETURN: None 468a159c266SJung-uk Kim * 469a159c266SJung-uk Kim * DESCRIPTION: Send an ACPI notification. The value specified is sent to the 470a159c266SJung-uk Kim * named object as an ACPI notify. 471a159c266SJung-uk Kim * 472a159c266SJung-uk Kim ******************************************************************************/ 473a159c266SJung-uk Kim 474a159c266SJung-uk Kim void 475a159c266SJung-uk Kim AcpiDbSendNotify ( 476a159c266SJung-uk Kim char *Name, 477a159c266SJung-uk Kim UINT32 Value) 478a159c266SJung-uk Kim { 479a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 480a159c266SJung-uk Kim ACPI_STATUS Status; 481a159c266SJung-uk Kim 482a159c266SJung-uk Kim 483a159c266SJung-uk Kim /* Translate name to an Named object */ 484a159c266SJung-uk Kim 485a159c266SJung-uk Kim Node = AcpiDbConvertToNode (Name); 486a159c266SJung-uk Kim if (!Node) 487a159c266SJung-uk Kim { 488a159c266SJung-uk Kim return; 489a159c266SJung-uk Kim } 490a159c266SJung-uk Kim 491eef1b955SJung-uk Kim /* Dispatch the notify if legal */ 492a159c266SJung-uk Kim 493eef1b955SJung-uk Kim if (AcpiEvIsNotifyObject (Node)) 494a159c266SJung-uk Kim { 495a159c266SJung-uk Kim Status = AcpiEvQueueNotifyRequest (Node, Value); 496a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 497a159c266SJung-uk Kim { 498a159c266SJung-uk Kim AcpiOsPrintf ("Could not queue notify\n"); 499a159c266SJung-uk Kim } 500eef1b955SJung-uk Kim } 501eef1b955SJung-uk Kim else 502eef1b955SJung-uk Kim { 503efcc2a30SJung-uk Kim AcpiOsPrintf ( 504*70e6ab8fSJung-uk Kim "Named object [%4.4s] Type %s, " 505*70e6ab8fSJung-uk Kim "must be Device/Thermal/Processor type\n", 506eef1b955SJung-uk Kim AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type)); 507a159c266SJung-uk Kim } 508a159c266SJung-uk Kim } 509a159c266SJung-uk Kim 510a159c266SJung-uk Kim 511a159c266SJung-uk Kim /******************************************************************************* 512a159c266SJung-uk Kim * 513a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayInterfaces 514a159c266SJung-uk Kim * 515a159c266SJung-uk Kim * PARAMETERS: ActionArg - Null, "install", or "remove" 516a159c266SJung-uk Kim * InterfaceNameArg - Name for install/remove options 517a159c266SJung-uk Kim * 518a159c266SJung-uk Kim * RETURN: None 519a159c266SJung-uk Kim * 520a159c266SJung-uk Kim * DESCRIPTION: Display or modify the global _OSI interface list 521a159c266SJung-uk Kim * 522a159c266SJung-uk Kim ******************************************************************************/ 523a159c266SJung-uk Kim 524a159c266SJung-uk Kim void 525a159c266SJung-uk Kim AcpiDbDisplayInterfaces ( 526a159c266SJung-uk Kim char *ActionArg, 527a159c266SJung-uk Kim char *InterfaceNameArg) 528a159c266SJung-uk Kim { 529a159c266SJung-uk Kim ACPI_INTERFACE_INFO *NextInterface; 530a159c266SJung-uk Kim char *SubString; 531a159c266SJung-uk Kim ACPI_STATUS Status; 532a159c266SJung-uk Kim 533a159c266SJung-uk Kim 534a159c266SJung-uk Kim /* If no arguments, just display current interface list */ 535a159c266SJung-uk Kim 536a159c266SJung-uk Kim if (!ActionArg) 537a159c266SJung-uk Kim { 538*70e6ab8fSJung-uk Kim (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER); 539a159c266SJung-uk Kim 540a159c266SJung-uk Kim NextInterface = AcpiGbl_SupportedInterfaces; 541a159c266SJung-uk Kim while (NextInterface) 542a159c266SJung-uk Kim { 543a159c266SJung-uk Kim if (!(NextInterface->Flags & ACPI_OSI_INVALID)) 544a159c266SJung-uk Kim { 545a159c266SJung-uk Kim AcpiOsPrintf ("%s\n", NextInterface->Name); 546a159c266SJung-uk Kim } 547*70e6ab8fSJung-uk Kim 548a159c266SJung-uk Kim NextInterface = NextInterface->Next; 549a159c266SJung-uk Kim } 550a159c266SJung-uk Kim 551a159c266SJung-uk Kim AcpiOsReleaseMutex (AcpiGbl_OsiMutex); 552a159c266SJung-uk Kim return; 553a159c266SJung-uk Kim } 554a159c266SJung-uk Kim 555a159c266SJung-uk Kim /* If ActionArg exists, so must InterfaceNameArg */ 556a159c266SJung-uk Kim 557a159c266SJung-uk Kim if (!InterfaceNameArg) 558a159c266SJung-uk Kim { 559a159c266SJung-uk Kim AcpiOsPrintf ("Missing Interface Name argument\n"); 560a159c266SJung-uk Kim return; 561a159c266SJung-uk Kim } 562a159c266SJung-uk Kim 563a159c266SJung-uk Kim /* Uppercase the action for match below */ 564a159c266SJung-uk Kim 565a159c266SJung-uk Kim AcpiUtStrupr (ActionArg); 566a159c266SJung-uk Kim 567a159c266SJung-uk Kim /* Install - install an interface */ 568a159c266SJung-uk Kim 5695ef50723SJung-uk Kim SubString = strstr ("INSTALL", ActionArg); 570a159c266SJung-uk Kim if (SubString) 571a159c266SJung-uk Kim { 572a159c266SJung-uk Kim Status = AcpiInstallInterface (InterfaceNameArg); 573a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 574a159c266SJung-uk Kim { 575a159c266SJung-uk Kim AcpiOsPrintf ("%s, while installing \"%s\"\n", 576a159c266SJung-uk Kim AcpiFormatException (Status), InterfaceNameArg); 577a159c266SJung-uk Kim } 578a159c266SJung-uk Kim return; 579a159c266SJung-uk Kim } 580a159c266SJung-uk Kim 581a159c266SJung-uk Kim /* Remove - remove an interface */ 582a159c266SJung-uk Kim 5835ef50723SJung-uk Kim SubString = strstr ("REMOVE", ActionArg); 584a159c266SJung-uk Kim if (SubString) 585a159c266SJung-uk Kim { 586a159c266SJung-uk Kim Status = AcpiRemoveInterface (InterfaceNameArg); 587a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 588a159c266SJung-uk Kim { 589a159c266SJung-uk Kim AcpiOsPrintf ("%s, while removing \"%s\"\n", 590a159c266SJung-uk Kim AcpiFormatException (Status), InterfaceNameArg); 591a159c266SJung-uk Kim } 592a159c266SJung-uk Kim return; 593a159c266SJung-uk Kim } 594a159c266SJung-uk Kim 595a159c266SJung-uk Kim /* Invalid ActionArg */ 596a159c266SJung-uk Kim 597a159c266SJung-uk Kim AcpiOsPrintf ("Invalid action argument: %s\n", ActionArg); 598a159c266SJung-uk Kim return; 599a159c266SJung-uk Kim } 600a159c266SJung-uk Kim 601a159c266SJung-uk Kim 602a159c266SJung-uk Kim /******************************************************************************* 603a159c266SJung-uk Kim * 604a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayTemplate 605a159c266SJung-uk Kim * 606efcc2a30SJung-uk Kim * PARAMETERS: BufferArg - Buffer name or address 607a159c266SJung-uk Kim * 608a159c266SJung-uk Kim * RETURN: None 609a159c266SJung-uk Kim * 610a159c266SJung-uk Kim * DESCRIPTION: Dump a buffer that contains a resource template 611a159c266SJung-uk Kim * 612a159c266SJung-uk Kim ******************************************************************************/ 613a159c266SJung-uk Kim 614a159c266SJung-uk Kim void 615a159c266SJung-uk Kim AcpiDbDisplayTemplate ( 616a159c266SJung-uk Kim char *BufferArg) 617a159c266SJung-uk Kim { 618a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 619a159c266SJung-uk Kim ACPI_STATUS Status; 620efcc2a30SJung-uk Kim ACPI_BUFFER ReturnBuffer; 621a159c266SJung-uk Kim 622a159c266SJung-uk Kim 623a159c266SJung-uk Kim /* Translate BufferArg to an Named object */ 624a159c266SJung-uk Kim 625a159c266SJung-uk Kim Node = AcpiDbConvertToNode (BufferArg); 626a159c266SJung-uk Kim if (!Node || (Node == AcpiGbl_RootNode)) 627a159c266SJung-uk Kim { 628a159c266SJung-uk Kim AcpiOsPrintf ("Invalid argument: %s\n", BufferArg); 629a159c266SJung-uk Kim return; 630a159c266SJung-uk Kim } 631a159c266SJung-uk Kim 632a159c266SJung-uk Kim /* We must have a buffer object */ 633a159c266SJung-uk Kim 634a159c266SJung-uk Kim if (Node->Type != ACPI_TYPE_BUFFER) 635a159c266SJung-uk Kim { 636a159c266SJung-uk Kim AcpiOsPrintf ("Not a Buffer object, cannot be a template: %s\n", 637a159c266SJung-uk Kim BufferArg); 638a159c266SJung-uk Kim return; 639a159c266SJung-uk Kim } 640a159c266SJung-uk Kim 641efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 642efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 643a159c266SJung-uk Kim 644a159c266SJung-uk Kim /* Attempt to convert the raw buffer to a resource list */ 645a159c266SJung-uk Kim 646efcc2a30SJung-uk Kim Status = AcpiRsCreateResourceList (Node->Object, &ReturnBuffer); 647a159c266SJung-uk Kim 648a159c266SJung-uk Kim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 649a159c266SJung-uk Kim AcpiDbgLevel |= ACPI_LV_RESOURCES; 650a159c266SJung-uk Kim 651a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 652a159c266SJung-uk Kim { 653*70e6ab8fSJung-uk Kim AcpiOsPrintf ( 654*70e6ab8fSJung-uk Kim "Could not convert Buffer to a resource list: %s, %s\n", 655a159c266SJung-uk Kim BufferArg, AcpiFormatException (Status)); 656a159c266SJung-uk Kim goto DumpBuffer; 657a159c266SJung-uk Kim } 658a159c266SJung-uk Kim 659a159c266SJung-uk Kim /* Now we can dump the resource list */ 660a159c266SJung-uk Kim 661a159c266SJung-uk Kim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, 662efcc2a30SJung-uk Kim ReturnBuffer.Pointer)); 663a159c266SJung-uk Kim 664a159c266SJung-uk Kim DumpBuffer: 665a159c266SJung-uk Kim AcpiOsPrintf ("\nRaw data buffer:\n"); 6668ef1a331SJung-uk Kim AcpiUtDebugDumpBuffer ((UINT8 *) Node->Object->Buffer.Pointer, 667a159c266SJung-uk Kim Node->Object->Buffer.Length, 668a159c266SJung-uk Kim DB_BYTE_DISPLAY, ACPI_UINT32_MAX); 669a159c266SJung-uk Kim 670a159c266SJung-uk Kim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 671a159c266SJung-uk Kim return; 672a159c266SJung-uk Kim } 673a159c266SJung-uk Kim 674a159c266SJung-uk Kim 675a159c266SJung-uk Kim /******************************************************************************* 676a159c266SJung-uk Kim * 677a159c266SJung-uk Kim * FUNCTION: AcpiDmCompareAmlResources 678a159c266SJung-uk Kim * 679a159c266SJung-uk Kim * PARAMETERS: Aml1Buffer - Contains first resource list 680a159c266SJung-uk Kim * Aml1BufferLength - Length of first resource list 681a159c266SJung-uk Kim * Aml2Buffer - Contains second resource list 682a159c266SJung-uk Kim * Aml2BufferLength - Length of second resource list 683a159c266SJung-uk Kim * 684a159c266SJung-uk Kim * RETURN: None 685a159c266SJung-uk Kim * 686a159c266SJung-uk Kim * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in 687a159c266SJung-uk Kim * order to isolate a miscompare to an individual resource) 688a159c266SJung-uk Kim * 689a159c266SJung-uk Kim ******************************************************************************/ 690a159c266SJung-uk Kim 691a159c266SJung-uk Kim static void 692a159c266SJung-uk Kim AcpiDmCompareAmlResources ( 693a159c266SJung-uk Kim UINT8 *Aml1Buffer, 694a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml1BufferLength, 695a159c266SJung-uk Kim UINT8 *Aml2Buffer, 696a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml2BufferLength) 697a159c266SJung-uk Kim { 698a159c266SJung-uk Kim UINT8 *Aml1; 699a159c266SJung-uk Kim UINT8 *Aml2; 700a159c266SJung-uk Kim UINT8 *Aml1End; 701a159c266SJung-uk Kim UINT8 *Aml2End; 702a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml1Length; 703a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml2Length; 704a159c266SJung-uk Kim ACPI_RSDESC_SIZE Offset = 0; 705a159c266SJung-uk Kim UINT8 ResourceType; 706a159c266SJung-uk Kim UINT32 Count = 0; 707a159c266SJung-uk Kim UINT32 i; 708a159c266SJung-uk Kim 709a159c266SJung-uk Kim 710a159c266SJung-uk Kim /* Compare overall buffer sizes (may be different due to size rounding) */ 711a159c266SJung-uk Kim 712a159c266SJung-uk Kim if (Aml1BufferLength != Aml2BufferLength) 713a159c266SJung-uk Kim { 714a159c266SJung-uk Kim AcpiOsPrintf ( 715*70e6ab8fSJung-uk Kim "**** Buffer length mismatch in converted " 716*70e6ab8fSJung-uk Kim "AML: Original %X, New %X ****\n", 717a159c266SJung-uk Kim Aml1BufferLength, Aml2BufferLength); 718a159c266SJung-uk Kim } 719a159c266SJung-uk Kim 720a159c266SJung-uk Kim Aml1 = Aml1Buffer; 721a159c266SJung-uk Kim Aml2 = Aml2Buffer; 722a159c266SJung-uk Kim Aml1End = Aml1Buffer + Aml1BufferLength; 723a159c266SJung-uk Kim Aml2End = Aml2Buffer + Aml2BufferLength; 724a159c266SJung-uk Kim 725a159c266SJung-uk Kim /* Walk the descriptor lists, comparing each descriptor */ 726a159c266SJung-uk Kim 727a159c266SJung-uk Kim while ((Aml1 < Aml1End) && (Aml2 < Aml2End)) 728a159c266SJung-uk Kim { 729a159c266SJung-uk Kim /* Get the lengths of each descriptor */ 730a159c266SJung-uk Kim 731a159c266SJung-uk Kim Aml1Length = AcpiUtGetDescriptorLength (Aml1); 732a159c266SJung-uk Kim Aml2Length = AcpiUtGetDescriptorLength (Aml2); 733a159c266SJung-uk Kim ResourceType = AcpiUtGetResourceType (Aml1); 734a159c266SJung-uk Kim 735a159c266SJung-uk Kim /* Check for descriptor length match */ 736a159c266SJung-uk Kim 737a159c266SJung-uk Kim if (Aml1Length != Aml2Length) 738a159c266SJung-uk Kim { 739a159c266SJung-uk Kim AcpiOsPrintf ( 740*70e6ab8fSJung-uk Kim "**** Length mismatch in descriptor [%.2X] type %2.2X, " 741*70e6ab8fSJung-uk Kim "Offset %8.8X Len1 %X, Len2 %X ****\n", 742a159c266SJung-uk Kim Count, ResourceType, Offset, Aml1Length, Aml2Length); 743a159c266SJung-uk Kim } 744a159c266SJung-uk Kim 745a159c266SJung-uk Kim /* Check for descriptor byte match */ 746a159c266SJung-uk Kim 7475ef50723SJung-uk Kim else if (memcmp (Aml1, Aml2, Aml1Length)) 748a159c266SJung-uk Kim { 749a159c266SJung-uk Kim AcpiOsPrintf ( 750*70e6ab8fSJung-uk Kim "**** Data mismatch in descriptor [%.2X] type %2.2X, " 751*70e6ab8fSJung-uk Kim "Offset %8.8X ****\n", 752a159c266SJung-uk Kim Count, ResourceType, Offset); 753a159c266SJung-uk Kim 754a159c266SJung-uk Kim for (i = 0; i < Aml1Length; i++) 755a159c266SJung-uk Kim { 756a159c266SJung-uk Kim if (Aml1[i] != Aml2[i]) 757a159c266SJung-uk Kim { 758efcc2a30SJung-uk Kim AcpiOsPrintf ( 759*70e6ab8fSJung-uk Kim "Mismatch at byte offset %.2X: is %2.2X, " 760*70e6ab8fSJung-uk Kim "should be %2.2X\n", 761a159c266SJung-uk Kim i, Aml2[i], Aml1[i]); 762a159c266SJung-uk Kim } 763a159c266SJung-uk Kim } 764a159c266SJung-uk Kim } 765a159c266SJung-uk Kim 766a159c266SJung-uk Kim /* Exit on EndTag descriptor */ 767a159c266SJung-uk Kim 768a159c266SJung-uk Kim if (ResourceType == ACPI_RESOURCE_NAME_END_TAG) 769a159c266SJung-uk Kim { 770a159c266SJung-uk Kim return; 771a159c266SJung-uk Kim } 772a159c266SJung-uk Kim 773a159c266SJung-uk Kim /* Point to next descriptor in each buffer */ 774a159c266SJung-uk Kim 775a159c266SJung-uk Kim Count++; 776a159c266SJung-uk Kim Offset += Aml1Length; 777a159c266SJung-uk Kim Aml1 += Aml1Length; 778a159c266SJung-uk Kim Aml2 += Aml2Length; 779a159c266SJung-uk Kim } 780a159c266SJung-uk Kim } 781a159c266SJung-uk Kim 782a159c266SJung-uk Kim 783a159c266SJung-uk Kim /******************************************************************************* 784a159c266SJung-uk Kim * 785a159c266SJung-uk Kim * FUNCTION: AcpiDmTestResourceConversion 786a159c266SJung-uk Kim * 787a159c266SJung-uk Kim * PARAMETERS: Node - Parent device node 788a159c266SJung-uk Kim * Name - resource method name (_CRS) 789a159c266SJung-uk Kim * 790a159c266SJung-uk Kim * RETURN: Status 791a159c266SJung-uk Kim * 792a159c266SJung-uk Kim * DESCRIPTION: Compare the original AML with a conversion of the AML to 793a159c266SJung-uk Kim * internal resource list, then back to AML. 794a159c266SJung-uk Kim * 795a159c266SJung-uk Kim ******************************************************************************/ 796a159c266SJung-uk Kim 797a159c266SJung-uk Kim static ACPI_STATUS 798a159c266SJung-uk Kim AcpiDmTestResourceConversion ( 799a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node, 800a159c266SJung-uk Kim char *Name) 801a159c266SJung-uk Kim { 802a159c266SJung-uk Kim ACPI_STATUS Status; 803efcc2a30SJung-uk Kim ACPI_BUFFER ReturnBuffer; 804efcc2a30SJung-uk Kim ACPI_BUFFER ResourceBuffer; 805a159c266SJung-uk Kim ACPI_BUFFER NewAml; 806a159c266SJung-uk Kim ACPI_OBJECT *OriginalAml; 807a159c266SJung-uk Kim 808a159c266SJung-uk Kim 809a159c266SJung-uk Kim AcpiOsPrintf ("Resource Conversion Comparison:\n"); 810a159c266SJung-uk Kim 811a159c266SJung-uk Kim NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 812efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 813efcc2a30SJung-uk Kim ResourceBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 814a159c266SJung-uk Kim 815a159c266SJung-uk Kim /* Get the original _CRS AML resource template */ 816a159c266SJung-uk Kim 817efcc2a30SJung-uk Kim Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnBuffer); 818a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 819a159c266SJung-uk Kim { 820a159c266SJung-uk Kim AcpiOsPrintf ("Could not obtain %s: %s\n", 821a159c266SJung-uk Kim Name, AcpiFormatException (Status)); 822a159c266SJung-uk Kim return (Status); 823a159c266SJung-uk Kim } 824a159c266SJung-uk Kim 825a159c266SJung-uk Kim /* Get the AML resource template, converted to internal resource structs */ 826a159c266SJung-uk Kim 827efcc2a30SJung-uk Kim Status = AcpiGetCurrentResources (Node, &ResourceBuffer); 828a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 829a159c266SJung-uk Kim { 830a159c266SJung-uk Kim AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n", 831a159c266SJung-uk Kim AcpiFormatException (Status)); 832a159c266SJung-uk Kim goto Exit1; 833a159c266SJung-uk Kim } 834a159c266SJung-uk Kim 835a159c266SJung-uk Kim /* Convert internal resource list to external AML resource template */ 836a159c266SJung-uk Kim 837313a0c13SJung-uk Kim Status = AcpiRsCreateAmlResources (&ResourceBuffer, &NewAml); 838a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 839a159c266SJung-uk Kim { 840a159c266SJung-uk Kim AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n", 841a159c266SJung-uk Kim AcpiFormatException (Status)); 842a159c266SJung-uk Kim goto Exit2; 843a159c266SJung-uk Kim } 844a159c266SJung-uk Kim 845a159c266SJung-uk Kim /* Compare original AML to the newly created AML resource list */ 846a159c266SJung-uk Kim 847efcc2a30SJung-uk Kim OriginalAml = ReturnBuffer.Pointer; 848a159c266SJung-uk Kim 849313a0c13SJung-uk Kim AcpiDmCompareAmlResources (OriginalAml->Buffer.Pointer, 850313a0c13SJung-uk Kim (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length, 851a159c266SJung-uk Kim NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length); 852a159c266SJung-uk Kim 853a159c266SJung-uk Kim /* Cleanup and exit */ 854a159c266SJung-uk Kim 855a159c266SJung-uk Kim ACPI_FREE (NewAml.Pointer); 856a159c266SJung-uk Kim Exit2: 857efcc2a30SJung-uk Kim ACPI_FREE (ResourceBuffer.Pointer); 858a159c266SJung-uk Kim Exit1: 859efcc2a30SJung-uk Kim ACPI_FREE (ReturnBuffer.Pointer); 860a159c266SJung-uk Kim return (Status); 861a159c266SJung-uk Kim } 862a159c266SJung-uk Kim 863a159c266SJung-uk Kim 864a159c266SJung-uk Kim /******************************************************************************* 865a159c266SJung-uk Kim * 866a159c266SJung-uk Kim * FUNCTION: AcpiDbResourceCallback 867a159c266SJung-uk Kim * 868a159c266SJung-uk Kim * PARAMETERS: ACPI_WALK_RESOURCE_CALLBACK 869a159c266SJung-uk Kim * 870a159c266SJung-uk Kim * RETURN: Status 871a159c266SJung-uk Kim * 872efcc2a30SJung-uk Kim * DESCRIPTION: Simple callback to exercise AcpiWalkResources and 873efcc2a30SJung-uk Kim * AcpiWalkResourceBuffer. 874a159c266SJung-uk Kim * 875a159c266SJung-uk Kim ******************************************************************************/ 876a159c266SJung-uk Kim 877a159c266SJung-uk Kim static ACPI_STATUS 878a159c266SJung-uk Kim AcpiDbResourceCallback ( 879a159c266SJung-uk Kim ACPI_RESOURCE *Resource, 880a159c266SJung-uk Kim void *Context) 881a159c266SJung-uk Kim { 882a159c266SJung-uk Kim 883a159c266SJung-uk Kim return (AE_OK); 884a159c266SJung-uk Kim } 885a159c266SJung-uk Kim 886a159c266SJung-uk Kim 887a159c266SJung-uk Kim /******************************************************************************* 888a159c266SJung-uk Kim * 889a159c266SJung-uk Kim * FUNCTION: AcpiDbDeviceResources 890a159c266SJung-uk Kim * 891a159c266SJung-uk Kim * PARAMETERS: ACPI_WALK_CALLBACK 892a159c266SJung-uk Kim * 893a159c266SJung-uk Kim * RETURN: Status 894a159c266SJung-uk Kim * 895a159c266SJung-uk Kim * DESCRIPTION: Display the _PRT/_CRS/_PRS resources for a device object. 896a159c266SJung-uk Kim * 897a159c266SJung-uk Kim ******************************************************************************/ 898a159c266SJung-uk Kim 899a159c266SJung-uk Kim static ACPI_STATUS 900a159c266SJung-uk Kim AcpiDbDeviceResources ( 901a159c266SJung-uk Kim ACPI_HANDLE ObjHandle, 902a159c266SJung-uk Kim UINT32 NestingLevel, 903a159c266SJung-uk Kim void *Context, 904a159c266SJung-uk Kim void **ReturnValue) 905a159c266SJung-uk Kim { 906a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 907a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *PrtNode = NULL; 908a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *CrsNode = NULL; 909a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *PrsNode = NULL; 910a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *AeiNode = NULL; 911a159c266SJung-uk Kim char *ParentPath; 912efcc2a30SJung-uk Kim ACPI_BUFFER ReturnBuffer; 913a159c266SJung-uk Kim ACPI_STATUS Status; 914a159c266SJung-uk Kim 915a159c266SJung-uk Kim 916a159c266SJung-uk Kim Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle); 917a159c266SJung-uk Kim ParentPath = AcpiNsGetExternalPathname (Node); 918a159c266SJung-uk Kim if (!ParentPath) 919a159c266SJung-uk Kim { 920a159c266SJung-uk Kim return (AE_NO_MEMORY); 921a159c266SJung-uk Kim } 922a159c266SJung-uk Kim 923a159c266SJung-uk Kim /* Get handles to the resource methods for this device */ 924a159c266SJung-uk Kim 925*70e6ab8fSJung-uk Kim (void) AcpiGetHandle (Node, METHOD_NAME__PRT, 926*70e6ab8fSJung-uk Kim ACPI_CAST_PTR (ACPI_HANDLE, &PrtNode)); 927*70e6ab8fSJung-uk Kim (void) AcpiGetHandle (Node, METHOD_NAME__CRS, 928*70e6ab8fSJung-uk Kim ACPI_CAST_PTR (ACPI_HANDLE, &CrsNode)); 929*70e6ab8fSJung-uk Kim (void) AcpiGetHandle (Node, METHOD_NAME__PRS, 930*70e6ab8fSJung-uk Kim ACPI_CAST_PTR (ACPI_HANDLE, &PrsNode)); 931*70e6ab8fSJung-uk Kim (void) AcpiGetHandle (Node, METHOD_NAME__AEI, 932*70e6ab8fSJung-uk Kim ACPI_CAST_PTR (ACPI_HANDLE, &AeiNode)); 933*70e6ab8fSJung-uk Kim 934a159c266SJung-uk Kim if (!PrtNode && !CrsNode && !PrsNode && !AeiNode) 935a159c266SJung-uk Kim { 936a159c266SJung-uk Kim goto Cleanup; /* Nothing to do */ 937a159c266SJung-uk Kim } 938a159c266SJung-uk Kim 939a159c266SJung-uk Kim AcpiOsPrintf ("\nDevice: %s\n", ParentPath); 940a159c266SJung-uk Kim 941a159c266SJung-uk Kim /* Prepare for a return object of arbitrary size */ 942a159c266SJung-uk Kim 943efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 944efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 945a159c266SJung-uk Kim 946a159c266SJung-uk Kim 947a159c266SJung-uk Kim /* _PRT */ 948a159c266SJung-uk Kim 949a159c266SJung-uk Kim if (PrtNode) 950a159c266SJung-uk Kim { 951a159c266SJung-uk Kim AcpiOsPrintf ("Evaluating _PRT\n"); 952a159c266SJung-uk Kim 953efcc2a30SJung-uk Kim Status = AcpiEvaluateObject (PrtNode, NULL, NULL, &ReturnBuffer); 954a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 955a159c266SJung-uk Kim { 956a159c266SJung-uk Kim AcpiOsPrintf ("Could not evaluate _PRT: %s\n", 957a159c266SJung-uk Kim AcpiFormatException (Status)); 958a159c266SJung-uk Kim goto GetCrs; 959a159c266SJung-uk Kim } 960a159c266SJung-uk Kim 961efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 962efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 963a159c266SJung-uk Kim 964efcc2a30SJung-uk Kim Status = AcpiGetIrqRoutingTable (Node, &ReturnBuffer); 965a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 966a159c266SJung-uk Kim { 967a159c266SJung-uk Kim AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n", 968a159c266SJung-uk Kim AcpiFormatException (Status)); 969a159c266SJung-uk Kim goto GetCrs; 970a159c266SJung-uk Kim } 971a159c266SJung-uk Kim 972a159c266SJung-uk Kim AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer)); 973a159c266SJung-uk Kim } 974a159c266SJung-uk Kim 975a159c266SJung-uk Kim 976a159c266SJung-uk Kim /* _CRS */ 977a159c266SJung-uk Kim 978a159c266SJung-uk Kim GetCrs: 979a159c266SJung-uk Kim if (CrsNode) 980a159c266SJung-uk Kim { 981a159c266SJung-uk Kim AcpiOsPrintf ("Evaluating _CRS\n"); 982a159c266SJung-uk Kim 983efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 984efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 985a159c266SJung-uk Kim 986efcc2a30SJung-uk Kim Status = AcpiEvaluateObject (CrsNode, NULL, NULL, &ReturnBuffer); 987a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 988a159c266SJung-uk Kim { 989a159c266SJung-uk Kim AcpiOsPrintf ("Could not evaluate _CRS: %s\n", 990a159c266SJung-uk Kim AcpiFormatException (Status)); 991a159c266SJung-uk Kim goto GetPrs; 992a159c266SJung-uk Kim } 993a159c266SJung-uk Kim 994efcc2a30SJung-uk Kim /* This code exercises the AcpiWalkResources interface */ 995a159c266SJung-uk Kim 996a159c266SJung-uk Kim Status = AcpiWalkResources (Node, METHOD_NAME__CRS, 997a159c266SJung-uk Kim AcpiDbResourceCallback, NULL); 998a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 999a159c266SJung-uk Kim { 1000a159c266SJung-uk Kim AcpiOsPrintf ("AcpiWalkResources failed: %s\n", 1001a159c266SJung-uk Kim AcpiFormatException (Status)); 1002a159c266SJung-uk Kim goto GetPrs; 1003a159c266SJung-uk Kim } 1004a159c266SJung-uk Kim 1005efcc2a30SJung-uk Kim /* Get the _CRS resource list (test ALLOCATE buffer) */ 1006a159c266SJung-uk Kim 1007efcc2a30SJung-uk Kim ReturnBuffer.Pointer = NULL; 1008efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 1009a159c266SJung-uk Kim 1010efcc2a30SJung-uk Kim Status = AcpiGetCurrentResources (Node, &ReturnBuffer); 1011a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1012a159c266SJung-uk Kim { 1013a159c266SJung-uk Kim AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n", 1014a159c266SJung-uk Kim AcpiFormatException (Status)); 1015a159c266SJung-uk Kim goto GetPrs; 1016a159c266SJung-uk Kim } 1017a159c266SJung-uk Kim 1018efcc2a30SJung-uk Kim /* This code exercises the AcpiWalkResourceBuffer interface */ 1019efcc2a30SJung-uk Kim 1020efcc2a30SJung-uk Kim Status = AcpiWalkResourceBuffer (&ReturnBuffer, 1021efcc2a30SJung-uk Kim AcpiDbResourceCallback, NULL); 1022efcc2a30SJung-uk Kim if (ACPI_FAILURE (Status)) 1023efcc2a30SJung-uk Kim { 1024efcc2a30SJung-uk Kim AcpiOsPrintf ("AcpiWalkResourceBuffer failed: %s\n", 1025efcc2a30SJung-uk Kim AcpiFormatException (Status)); 1026efcc2a30SJung-uk Kim goto EndCrs; 1027efcc2a30SJung-uk Kim } 1028efcc2a30SJung-uk Kim 1029a159c266SJung-uk Kim /* Dump the _CRS resource list */ 1030a159c266SJung-uk Kim 1031a159c266SJung-uk Kim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, 1032efcc2a30SJung-uk Kim ReturnBuffer.Pointer)); 1033a159c266SJung-uk Kim 1034a159c266SJung-uk Kim /* 1035efcc2a30SJung-uk Kim * Perform comparison of original AML to newly created AML. This 1036efcc2a30SJung-uk Kim * tests both the AML->Resource conversion and the Resource->AML 1037efcc2a30SJung-uk Kim * conversion. 1038a159c266SJung-uk Kim */ 1039efcc2a30SJung-uk Kim (void) AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS); 1040a159c266SJung-uk Kim 1041a159c266SJung-uk Kim /* Execute _SRS with the resource list */ 1042a159c266SJung-uk Kim 10439c48c75eSJung-uk Kim AcpiOsPrintf ("Evaluating _SRS\n"); 10449c48c75eSJung-uk Kim 1045efcc2a30SJung-uk Kim Status = AcpiSetCurrentResources (Node, &ReturnBuffer); 1046a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1047a159c266SJung-uk Kim { 1048a159c266SJung-uk Kim AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n", 1049a159c266SJung-uk Kim AcpiFormatException (Status)); 1050efcc2a30SJung-uk Kim goto EndCrs; 1051a159c266SJung-uk Kim } 1052efcc2a30SJung-uk Kim 1053efcc2a30SJung-uk Kim EndCrs: 1054313a0c13SJung-uk Kim ACPI_FREE (ReturnBuffer.Pointer); 1055a159c266SJung-uk Kim } 1056a159c266SJung-uk Kim 1057a159c266SJung-uk Kim 1058a159c266SJung-uk Kim /* _PRS */ 1059a159c266SJung-uk Kim 1060a159c266SJung-uk Kim GetPrs: 1061a159c266SJung-uk Kim if (PrsNode) 1062a159c266SJung-uk Kim { 1063a159c266SJung-uk Kim AcpiOsPrintf ("Evaluating _PRS\n"); 1064a159c266SJung-uk Kim 1065efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1066efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1067a159c266SJung-uk Kim 1068efcc2a30SJung-uk Kim Status = AcpiEvaluateObject (PrsNode, NULL, NULL, &ReturnBuffer); 1069a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1070a159c266SJung-uk Kim { 1071a159c266SJung-uk Kim AcpiOsPrintf ("Could not evaluate _PRS: %s\n", 1072a159c266SJung-uk Kim AcpiFormatException (Status)); 1073a159c266SJung-uk Kim goto GetAei; 1074a159c266SJung-uk Kim } 1075a159c266SJung-uk Kim 1076efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1077efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1078a159c266SJung-uk Kim 1079efcc2a30SJung-uk Kim Status = AcpiGetPossibleResources (Node, &ReturnBuffer); 1080a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1081a159c266SJung-uk Kim { 1082a159c266SJung-uk Kim AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n", 1083a159c266SJung-uk Kim AcpiFormatException (Status)); 1084a159c266SJung-uk Kim goto GetAei; 1085a159c266SJung-uk Kim } 1086a159c266SJung-uk Kim 1087*70e6ab8fSJung-uk Kim AcpiRsDumpResourceList (ACPI_CAST_PTR ( 1088*70e6ab8fSJung-uk Kim ACPI_RESOURCE, AcpiGbl_DbBuffer)); 1089a159c266SJung-uk Kim } 1090a159c266SJung-uk Kim 1091a159c266SJung-uk Kim 1092a159c266SJung-uk Kim /* _AEI */ 1093a159c266SJung-uk Kim 1094a159c266SJung-uk Kim GetAei: 1095a159c266SJung-uk Kim if (AeiNode) 1096a159c266SJung-uk Kim { 1097a159c266SJung-uk Kim AcpiOsPrintf ("Evaluating _AEI\n"); 1098a159c266SJung-uk Kim 1099efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1100efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1101a159c266SJung-uk Kim 1102efcc2a30SJung-uk Kim Status = AcpiEvaluateObject (AeiNode, NULL, NULL, &ReturnBuffer); 1103a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1104a159c266SJung-uk Kim { 1105a159c266SJung-uk Kim AcpiOsPrintf ("Could not evaluate _AEI: %s\n", 1106a159c266SJung-uk Kim AcpiFormatException (Status)); 1107a159c266SJung-uk Kim goto Cleanup; 1108a159c266SJung-uk Kim } 1109a159c266SJung-uk Kim 1110efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1111efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1112a159c266SJung-uk Kim 1113efcc2a30SJung-uk Kim Status = AcpiGetEventResources (Node, &ReturnBuffer); 1114a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1115a159c266SJung-uk Kim { 1116a159c266SJung-uk Kim AcpiOsPrintf ("AcpiGetEventResources failed: %s\n", 1117a159c266SJung-uk Kim AcpiFormatException (Status)); 1118a159c266SJung-uk Kim goto Cleanup; 1119a159c266SJung-uk Kim } 1120a159c266SJung-uk Kim 1121*70e6ab8fSJung-uk Kim AcpiRsDumpResourceList (ACPI_CAST_PTR ( 1122*70e6ab8fSJung-uk Kim ACPI_RESOURCE, AcpiGbl_DbBuffer)); 1123a159c266SJung-uk Kim } 1124a159c266SJung-uk Kim 1125a159c266SJung-uk Kim 1126a159c266SJung-uk Kim Cleanup: 1127a159c266SJung-uk Kim ACPI_FREE (ParentPath); 1128a159c266SJung-uk Kim return (AE_OK); 1129a159c266SJung-uk Kim } 1130a159c266SJung-uk Kim 1131a159c266SJung-uk Kim 1132a159c266SJung-uk Kim /******************************************************************************* 1133a159c266SJung-uk Kim * 1134a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayResources 1135a159c266SJung-uk Kim * 1136a159c266SJung-uk Kim * PARAMETERS: ObjectArg - String object name or object pointer. 11379c48c75eSJung-uk Kim * NULL or "*" means "display resources for 11389c48c75eSJung-uk Kim * all devices" 1139a159c266SJung-uk Kim * 1140a159c266SJung-uk Kim * RETURN: None 1141a159c266SJung-uk Kim * 1142a159c266SJung-uk Kim * DESCRIPTION: Display the resource objects associated with a device. 1143a159c266SJung-uk Kim * 1144a159c266SJung-uk Kim ******************************************************************************/ 1145a159c266SJung-uk Kim 1146a159c266SJung-uk Kim void 1147a159c266SJung-uk Kim AcpiDbDisplayResources ( 1148a159c266SJung-uk Kim char *ObjectArg) 1149a159c266SJung-uk Kim { 1150a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 1151a159c266SJung-uk Kim 1152a159c266SJung-uk Kim 1153a159c266SJung-uk Kim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 1154a159c266SJung-uk Kim AcpiDbgLevel |= ACPI_LV_RESOURCES; 1155a159c266SJung-uk Kim 1156a159c266SJung-uk Kim /* Asterisk means "display resources for all devices" */ 1157a159c266SJung-uk Kim 11585ef50723SJung-uk Kim if (!ObjectArg || (!strcmp (ObjectArg, "*"))) 1159a159c266SJung-uk Kim { 1160a159c266SJung-uk Kim (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, 1161a159c266SJung-uk Kim ACPI_UINT32_MAX, AcpiDbDeviceResources, NULL, NULL, NULL); 1162a159c266SJung-uk Kim } 1163a159c266SJung-uk Kim else 1164a159c266SJung-uk Kim { 1165a159c266SJung-uk Kim /* Convert string to object pointer */ 1166a159c266SJung-uk Kim 1167a159c266SJung-uk Kim Node = AcpiDbConvertToNode (ObjectArg); 1168a159c266SJung-uk Kim if (Node) 1169a159c266SJung-uk Kim { 1170a159c266SJung-uk Kim if (Node->Type != ACPI_TYPE_DEVICE) 1171a159c266SJung-uk Kim { 1172*70e6ab8fSJung-uk Kim AcpiOsPrintf ( 1173*70e6ab8fSJung-uk Kim "%4.4s: Name is not a device object (%s)\n", 1174a159c266SJung-uk Kim Node->Name.Ascii, AcpiUtGetTypeName (Node->Type)); 1175a159c266SJung-uk Kim } 1176a159c266SJung-uk Kim else 1177a159c266SJung-uk Kim { 1178a159c266SJung-uk Kim (void) AcpiDbDeviceResources (Node, 0, NULL, NULL); 1179a159c266SJung-uk Kim } 1180a159c266SJung-uk Kim } 1181a159c266SJung-uk Kim } 1182a159c266SJung-uk Kim 1183a159c266SJung-uk Kim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 1184a159c266SJung-uk Kim } 1185a159c266SJung-uk Kim 1186a159c266SJung-uk Kim 1187a159c266SJung-uk Kim #if (!ACPI_REDUCED_HARDWARE) 1188a159c266SJung-uk Kim /******************************************************************************* 1189a159c266SJung-uk Kim * 1190a159c266SJung-uk Kim * FUNCTION: AcpiDbGenerateGpe 1191a159c266SJung-uk Kim * 1192a159c266SJung-uk Kim * PARAMETERS: GpeArg - Raw GPE number, ascii string 1193a159c266SJung-uk Kim * BlockArg - GPE block number, ascii string 1194a159c266SJung-uk Kim * 0 or 1 for FADT GPE blocks 1195a159c266SJung-uk Kim * 1196a159c266SJung-uk Kim * RETURN: None 1197a159c266SJung-uk Kim * 1198efcc2a30SJung-uk Kim * DESCRIPTION: Simulate firing of a GPE 1199a159c266SJung-uk Kim * 1200a159c266SJung-uk Kim ******************************************************************************/ 1201a159c266SJung-uk Kim 1202a159c266SJung-uk Kim void 1203a159c266SJung-uk Kim AcpiDbGenerateGpe ( 1204a159c266SJung-uk Kim char *GpeArg, 1205a159c266SJung-uk Kim char *BlockArg) 1206a159c266SJung-uk Kim { 1207313a0c13SJung-uk Kim UINT32 BlockNumber = 0; 1208a159c266SJung-uk Kim UINT32 GpeNumber; 1209a159c266SJung-uk Kim ACPI_GPE_EVENT_INFO *GpeEventInfo; 1210a159c266SJung-uk Kim 1211a159c266SJung-uk Kim 12125ef50723SJung-uk Kim GpeNumber = strtoul (GpeArg, NULL, 0); 1213a159c266SJung-uk Kim 1214313a0c13SJung-uk Kim /* 1215313a0c13SJung-uk Kim * If no block arg, or block arg == 0 or 1, use the FADT-defined 1216313a0c13SJung-uk Kim * GPE blocks. 1217313a0c13SJung-uk Kim */ 1218313a0c13SJung-uk Kim if (BlockArg) 1219313a0c13SJung-uk Kim { 12205ef50723SJung-uk Kim BlockNumber = strtoul (BlockArg, NULL, 0); 1221313a0c13SJung-uk Kim if (BlockNumber == 1) 1222313a0c13SJung-uk Kim { 1223313a0c13SJung-uk Kim BlockNumber = 0; 1224313a0c13SJung-uk Kim } 1225313a0c13SJung-uk Kim } 1226a159c266SJung-uk Kim 1227a159c266SJung-uk Kim GpeEventInfo = AcpiEvGetGpeEventInfo (ACPI_TO_POINTER (BlockNumber), 1228a159c266SJung-uk Kim GpeNumber); 1229a159c266SJung-uk Kim if (!GpeEventInfo) 1230a159c266SJung-uk Kim { 1231a159c266SJung-uk Kim AcpiOsPrintf ("Invalid GPE\n"); 1232a159c266SJung-uk Kim return; 1233a159c266SJung-uk Kim } 1234a159c266SJung-uk Kim 1235a159c266SJung-uk Kim (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber); 1236a159c266SJung-uk Kim } 123779c6d946SJung-uk Kim 1238*70e6ab8fSJung-uk Kim 1239*70e6ab8fSJung-uk Kim /******************************************************************************* 1240*70e6ab8fSJung-uk Kim * 1241*70e6ab8fSJung-uk Kim * FUNCTION: AcpiDbGenerateSci 1242*70e6ab8fSJung-uk Kim * 1243*70e6ab8fSJung-uk Kim * PARAMETERS: None 1244*70e6ab8fSJung-uk Kim * 1245*70e6ab8fSJung-uk Kim * RETURN: None 1246*70e6ab8fSJung-uk Kim * 1247*70e6ab8fSJung-uk Kim * DESCRIPTION: Simulate an SCI -- just call the SCI dispatch. 1248*70e6ab8fSJung-uk Kim * 1249*70e6ab8fSJung-uk Kim ******************************************************************************/ 1250*70e6ab8fSJung-uk Kim 125179c6d946SJung-uk Kim void 125279c6d946SJung-uk Kim AcpiDbGenerateSci ( 125379c6d946SJung-uk Kim void) 125479c6d946SJung-uk Kim { 125579c6d946SJung-uk Kim AcpiEvSciDispatch (); 125679c6d946SJung-uk Kim } 125779c6d946SJung-uk Kim 1258a159c266SJung-uk Kim #endif /* !ACPI_REDUCED_HARDWARE */ 1259a159c266SJung-uk Kim 1260fe0f0bbbSJung-uk Kim 1261fe0f0bbbSJung-uk Kim /******************************************************************************* 1262fe0f0bbbSJung-uk Kim * 1263fe0f0bbbSJung-uk Kim * FUNCTION: AcpiDbTrace 1264fe0f0bbbSJung-uk Kim * 1265fe0f0bbbSJung-uk Kim * PARAMETERS: EnableArg - ENABLE/AML to enable tracer 1266fe0f0bbbSJung-uk Kim * DISABLE to disable tracer 1267fe0f0bbbSJung-uk Kim * MethodArg - Method to trace 1268fe0f0bbbSJung-uk Kim * OnceArg - Whether trace once 1269fe0f0bbbSJung-uk Kim * 1270fe0f0bbbSJung-uk Kim * RETURN: None 1271fe0f0bbbSJung-uk Kim * 1272fe0f0bbbSJung-uk Kim * DESCRIPTION: Control method tracing facility 1273fe0f0bbbSJung-uk Kim * 1274fe0f0bbbSJung-uk Kim ******************************************************************************/ 1275fe0f0bbbSJung-uk Kim 1276fe0f0bbbSJung-uk Kim void 1277fe0f0bbbSJung-uk Kim AcpiDbTrace ( 1278fe0f0bbbSJung-uk Kim char *EnableArg, 1279fe0f0bbbSJung-uk Kim char *MethodArg, 1280fe0f0bbbSJung-uk Kim char *OnceArg) 1281fe0f0bbbSJung-uk Kim { 1282fe0f0bbbSJung-uk Kim UINT32 DebugLevel = 0; 1283fe0f0bbbSJung-uk Kim UINT32 DebugLayer = 0; 1284fe0f0bbbSJung-uk Kim UINT32 Flags = 0; 1285fe0f0bbbSJung-uk Kim 1286fe0f0bbbSJung-uk Kim 1287fe0f0bbbSJung-uk Kim if (EnableArg) 1288fe0f0bbbSJung-uk Kim { 1289fe0f0bbbSJung-uk Kim AcpiUtStrupr (EnableArg); 1290fe0f0bbbSJung-uk Kim } 1291*70e6ab8fSJung-uk Kim 1292fe0f0bbbSJung-uk Kim if (OnceArg) 1293fe0f0bbbSJung-uk Kim { 1294fe0f0bbbSJung-uk Kim AcpiUtStrupr (OnceArg); 1295fe0f0bbbSJung-uk Kim } 1296*70e6ab8fSJung-uk Kim 1297fe0f0bbbSJung-uk Kim if (MethodArg) 1298fe0f0bbbSJung-uk Kim { 1299fe0f0bbbSJung-uk Kim if (AcpiDbTraceMethodName) 1300fe0f0bbbSJung-uk Kim { 1301fe0f0bbbSJung-uk Kim ACPI_FREE (AcpiDbTraceMethodName); 1302fe0f0bbbSJung-uk Kim AcpiDbTraceMethodName = NULL; 1303fe0f0bbbSJung-uk Kim } 1304*70e6ab8fSJung-uk Kim 1305fe0f0bbbSJung-uk Kim AcpiDbTraceMethodName = ACPI_ALLOCATE (strlen (MethodArg) + 1); 1306fe0f0bbbSJung-uk Kim if (!AcpiDbTraceMethodName) 1307fe0f0bbbSJung-uk Kim { 1308*70e6ab8fSJung-uk Kim AcpiOsPrintf ("Failed to allocate method name (%s)\n", 1309*70e6ab8fSJung-uk Kim MethodArg); 1310fe0f0bbbSJung-uk Kim return; 1311fe0f0bbbSJung-uk Kim } 1312*70e6ab8fSJung-uk Kim 1313fe0f0bbbSJung-uk Kim strcpy (AcpiDbTraceMethodName, MethodArg); 1314fe0f0bbbSJung-uk Kim } 1315*70e6ab8fSJung-uk Kim 1316fe0f0bbbSJung-uk Kim if (!strcmp (EnableArg, "ENABLE") || 1317fe0f0bbbSJung-uk Kim !strcmp (EnableArg, "METHOD") || 1318fe0f0bbbSJung-uk Kim !strcmp (EnableArg, "OPCODE")) 1319fe0f0bbbSJung-uk Kim { 1320fe0f0bbbSJung-uk Kim if (!strcmp (EnableArg, "ENABLE")) 1321fe0f0bbbSJung-uk Kim { 1322fe0f0bbbSJung-uk Kim /* Inherit current console settings */ 1323fe0f0bbbSJung-uk Kim 1324fe0f0bbbSJung-uk Kim DebugLevel = AcpiGbl_DbConsoleDebugLevel; 1325fe0f0bbbSJung-uk Kim DebugLayer = AcpiDbgLayer; 1326fe0f0bbbSJung-uk Kim } 1327fe0f0bbbSJung-uk Kim else 1328fe0f0bbbSJung-uk Kim { 1329fe0f0bbbSJung-uk Kim /* Restrict console output to trace points only */ 1330fe0f0bbbSJung-uk Kim 1331fe0f0bbbSJung-uk Kim DebugLevel = ACPI_LV_TRACE_POINT; 1332fe0f0bbbSJung-uk Kim DebugLayer = ACPI_EXECUTER; 1333fe0f0bbbSJung-uk Kim } 1334fe0f0bbbSJung-uk Kim 1335fe0f0bbbSJung-uk Kim Flags = ACPI_TRACE_ENABLED; 1336*70e6ab8fSJung-uk Kim 1337fe0f0bbbSJung-uk Kim if (!strcmp (EnableArg, "OPCODE")) 1338fe0f0bbbSJung-uk Kim { 1339fe0f0bbbSJung-uk Kim Flags |= ACPI_TRACE_OPCODE; 1340fe0f0bbbSJung-uk Kim } 1341*70e6ab8fSJung-uk Kim 1342fe0f0bbbSJung-uk Kim if (OnceArg && !strcmp (OnceArg, "ONCE")) 1343fe0f0bbbSJung-uk Kim { 1344fe0f0bbbSJung-uk Kim Flags |= ACPI_TRACE_ONESHOT; 1345fe0f0bbbSJung-uk Kim } 1346fe0f0bbbSJung-uk Kim } 1347fe0f0bbbSJung-uk Kim 1348fe0f0bbbSJung-uk Kim (void) AcpiDebugTrace (AcpiDbTraceMethodName, 1349fe0f0bbbSJung-uk Kim DebugLevel, DebugLayer, Flags); 1350fe0f0bbbSJung-uk Kim } 1351