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