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 70d84335fSJung-uk Kim /****************************************************************************** 80d84335fSJung-uk Kim * 90d84335fSJung-uk Kim * 1. Copyright Notice 100d84335fSJung-uk Kim * 11*722b1667SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2023, Intel Corp. 12a159c266SJung-uk Kim * All rights reserved. 13a159c266SJung-uk Kim * 140d84335fSJung-uk Kim * 2. License 150d84335fSJung-uk Kim * 160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided 180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual 190d84335fSJung-uk Kim * property rights. 200d84335fSJung-uk Kim * 210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 270d84335fSJung-uk Kim * 280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions 340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 360d84335fSJung-uk Kim * 370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following 380d84335fSJung-uk Kim * conditions are met: 390d84335fSJung-uk Kim * 400d84335fSJung-uk Kim * 3. Conditions 410d84335fSJung-uk Kim * 420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include 450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived, 520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code. 530d84335fSJung-uk Kim * 540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must 570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In 590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 640d84335fSJung-uk Kim * make. 650d84335fSJung-uk Kim * 660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the 700d84335fSJung-uk Kim * distribution. 710d84335fSJung-uk Kim * 720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 730d84335fSJung-uk Kim * Intel Code. 740d84335fSJung-uk Kim * 750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 780d84335fSJung-uk Kim * without prior written authorization from Intel. 790d84335fSJung-uk Kim * 800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance 810d84335fSJung-uk Kim * 820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 880d84335fSJung-uk Kim * PARTICULAR PURPOSE. 890d84335fSJung-uk Kim * 900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 970d84335fSJung-uk Kim * LIMITED REMEDY. 980d84335fSJung-uk Kim * 990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any 1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the 1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or 1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license, 1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 1120d84335fSJung-uk Kim * such license, approval or letter. 1130d84335fSJung-uk Kim * 1140d84335fSJung-uk Kim ***************************************************************************** 1150d84335fSJung-uk Kim * 1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 1170d84335fSJung-uk Kim * following license: 1180d84335fSJung-uk Kim * 119a159c266SJung-uk Kim * Redistribution and use in source and binary forms, with or without 120a159c266SJung-uk Kim * modification, are permitted provided that the following conditions 121a159c266SJung-uk Kim * are met: 122a159c266SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 123a159c266SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 124a159c266SJung-uk Kim * without modification. 125a159c266SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126a159c266SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 127a159c266SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 128a159c266SJung-uk Kim * including a substantially similar Disclaimer requirement for further 129a159c266SJung-uk Kim * binary redistribution. 130a159c266SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 131a159c266SJung-uk Kim * of any contributors may be used to endorse or promote products derived 132a159c266SJung-uk Kim * from this software without specific prior written permission. 133a159c266SJung-uk Kim * 1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1450d84335fSJung-uk Kim * 1460d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 147a159c266SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 148a159c266SJung-uk Kim * Software Foundation. 149a159c266SJung-uk Kim * 1500d84335fSJung-uk Kim *****************************************************************************/ 151a159c266SJung-uk Kim 152a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 153a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 154a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acevents.h> 155a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdebug.h> 156a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 157a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acresrc.h> 158a159c266SJung-uk Kim #include <contrib/dev/acpica/include/actables.h> 159a159c266SJung-uk Kim 160a159c266SJung-uk Kim 161a159c266SJung-uk Kim #define _COMPONENT ACPI_CA_DEBUGGER 162a159c266SJung-uk Kim ACPI_MODULE_NAME ("dbcmds") 163a159c266SJung-uk Kim 164a159c266SJung-uk Kim 165a159c266SJung-uk Kim /* Local prototypes */ 166a159c266SJung-uk Kim 167a159c266SJung-uk Kim static void 168a159c266SJung-uk Kim AcpiDmCompareAmlResources ( 169a159c266SJung-uk Kim UINT8 *Aml1Buffer, 170a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml1BufferLength, 171a159c266SJung-uk Kim UINT8 *Aml2Buffer, 172a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml2BufferLength); 173a159c266SJung-uk Kim 174a159c266SJung-uk Kim static ACPI_STATUS 175a159c266SJung-uk Kim AcpiDmTestResourceConversion ( 176a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node, 177a159c266SJung-uk Kim char *Name); 178a159c266SJung-uk Kim 179a159c266SJung-uk Kim static ACPI_STATUS 180a159c266SJung-uk Kim AcpiDbResourceCallback ( 181a159c266SJung-uk Kim ACPI_RESOURCE *Resource, 182a159c266SJung-uk Kim void *Context); 183a159c266SJung-uk Kim 184a159c266SJung-uk Kim static ACPI_STATUS 185a159c266SJung-uk Kim AcpiDbDeviceResources ( 186a159c266SJung-uk Kim ACPI_HANDLE ObjHandle, 187a159c266SJung-uk Kim UINT32 NestingLevel, 188a159c266SJung-uk Kim void *Context, 189a159c266SJung-uk Kim void **ReturnValue); 190a159c266SJung-uk Kim 191efcc2a30SJung-uk Kim static void 192efcc2a30SJung-uk Kim AcpiDbDoOneSleepState ( 193efcc2a30SJung-uk Kim UINT8 SleepState); 194efcc2a30SJung-uk Kim 195a159c266SJung-uk Kim 196fe0f0bbbSJung-uk Kim static char *AcpiDbTraceMethodName = NULL; 197fe0f0bbbSJung-uk Kim 19870e6ab8fSJung-uk Kim 199a159c266SJung-uk Kim /******************************************************************************* 200a159c266SJung-uk Kim * 201a159c266SJung-uk Kim * FUNCTION: AcpiDbConvertToNode 202a159c266SJung-uk Kim * 203a159c266SJung-uk Kim * PARAMETERS: InString - String to convert 204a159c266SJung-uk Kim * 205a159c266SJung-uk Kim * RETURN: Pointer to a NS node 206a159c266SJung-uk Kim * 207a159c266SJung-uk Kim * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or 208efcc2a30SJung-uk Kim * alphanumeric strings. 209a159c266SJung-uk Kim * 210a159c266SJung-uk Kim ******************************************************************************/ 211a159c266SJung-uk Kim 212a159c266SJung-uk Kim ACPI_NAMESPACE_NODE * 213a159c266SJung-uk Kim AcpiDbConvertToNode ( 214a159c266SJung-uk Kim char *InString) 215a159c266SJung-uk Kim { 216a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 2178d744e47SJung-uk Kim ACPI_SIZE Address; 218a159c266SJung-uk Kim 219a159c266SJung-uk Kim 220a159c266SJung-uk Kim if ((*InString >= 0x30) && (*InString <= 0x39)) 221a159c266SJung-uk Kim { 222a159c266SJung-uk Kim /* Numeric argument, convert */ 223a159c266SJung-uk Kim 2245ef50723SJung-uk Kim Address = strtoul (InString, NULL, 16); 2258d744e47SJung-uk Kim Node = ACPI_TO_POINTER (Address); 226a159c266SJung-uk Kim if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE))) 227a159c266SJung-uk Kim { 228f8146b88SJung-uk Kim AcpiOsPrintf ("Address %p is invalid", Node); 229a159c266SJung-uk Kim return (NULL); 230a159c266SJung-uk Kim } 231a159c266SJung-uk Kim 232a159c266SJung-uk Kim /* Make sure pointer is valid NS node */ 233a159c266SJung-uk Kim 234a159c266SJung-uk Kim if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED) 235a159c266SJung-uk Kim { 236313a0c13SJung-uk Kim AcpiOsPrintf ("Address %p is not a valid namespace node [%s]\n", 237a159c266SJung-uk Kim Node, AcpiUtGetDescriptorName (Node)); 238a159c266SJung-uk Kim return (NULL); 239a159c266SJung-uk Kim } 240a159c266SJung-uk Kim } 241a159c266SJung-uk Kim else 242a159c266SJung-uk Kim { 243efcc2a30SJung-uk Kim /* 244efcc2a30SJung-uk Kim * Alpha argument: The parameter is a name string that must be 245efcc2a30SJung-uk Kim * resolved to a Namespace object. 246a159c266SJung-uk Kim */ 247a159c266SJung-uk Kim Node = AcpiDbLocalNsLookup (InString); 248a159c266SJung-uk Kim if (!Node) 249a159c266SJung-uk Kim { 25070e6ab8fSJung-uk Kim AcpiOsPrintf ( 25170e6ab8fSJung-uk Kim "Could not find [%s] in namespace, defaulting to root node\n", 252313a0c13SJung-uk Kim InString); 253a159c266SJung-uk Kim Node = AcpiGbl_RootNode; 254a159c266SJung-uk Kim } 255a159c266SJung-uk Kim } 256a159c266SJung-uk Kim 257a159c266SJung-uk Kim return (Node); 258a159c266SJung-uk Kim } 259a159c266SJung-uk Kim 260a159c266SJung-uk Kim 261a159c266SJung-uk Kim /******************************************************************************* 262a159c266SJung-uk Kim * 263a159c266SJung-uk Kim * FUNCTION: AcpiDbSleep 264a159c266SJung-uk Kim * 265efcc2a30SJung-uk Kim * PARAMETERS: ObjectArg - Desired sleep state (0-5). NULL means 266efcc2a30SJung-uk Kim * invoke all possible sleep states. 267a159c266SJung-uk Kim * 268a159c266SJung-uk Kim * RETURN: Status 269a159c266SJung-uk Kim * 270efcc2a30SJung-uk Kim * DESCRIPTION: Simulate sleep/wake sequences 271a159c266SJung-uk Kim * 272a159c266SJung-uk Kim ******************************************************************************/ 273a159c266SJung-uk Kim 274a159c266SJung-uk Kim ACPI_STATUS 275a159c266SJung-uk Kim AcpiDbSleep ( 276a159c266SJung-uk Kim char *ObjectArg) 277a159c266SJung-uk Kim { 278a159c266SJung-uk Kim UINT8 SleepState; 279efcc2a30SJung-uk Kim UINT32 i; 280a159c266SJung-uk Kim 281a159c266SJung-uk Kim 282a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (AcpiDbSleep); 283a159c266SJung-uk Kim 284a159c266SJung-uk Kim 285efcc2a30SJung-uk Kim /* Null input (no arguments) means to invoke all sleep states */ 286a159c266SJung-uk Kim 287efcc2a30SJung-uk Kim if (!ObjectArg) 288efcc2a30SJung-uk Kim { 289efcc2a30SJung-uk Kim AcpiOsPrintf ("Invoking all possible sleep states, 0-%d\n", 290efcc2a30SJung-uk Kim ACPI_S_STATES_MAX); 291efcc2a30SJung-uk Kim 292efcc2a30SJung-uk Kim for (i = 0; i <= ACPI_S_STATES_MAX; i++) 293efcc2a30SJung-uk Kim { 294efcc2a30SJung-uk Kim AcpiDbDoOneSleepState ((UINT8) i); 295efcc2a30SJung-uk Kim } 296efcc2a30SJung-uk Kim 297efcc2a30SJung-uk Kim return_ACPI_STATUS (AE_OK); 298efcc2a30SJung-uk Kim } 299efcc2a30SJung-uk Kim 300efcc2a30SJung-uk Kim /* Convert argument to binary and invoke the sleep state */ 301efcc2a30SJung-uk Kim 3025ef50723SJung-uk Kim SleepState = (UINT8) strtoul (ObjectArg, NULL, 0); 303efcc2a30SJung-uk Kim AcpiDbDoOneSleepState (SleepState); 304efcc2a30SJung-uk Kim return_ACPI_STATUS (AE_OK); 305efcc2a30SJung-uk Kim } 306efcc2a30SJung-uk Kim 307efcc2a30SJung-uk Kim 308efcc2a30SJung-uk Kim /******************************************************************************* 309efcc2a30SJung-uk Kim * 310efcc2a30SJung-uk Kim * FUNCTION: AcpiDbDoOneSleepState 311efcc2a30SJung-uk Kim * 312efcc2a30SJung-uk Kim * PARAMETERS: SleepState - Desired sleep state (0-5) 313efcc2a30SJung-uk Kim * 31470e6ab8fSJung-uk Kim * RETURN: None 315efcc2a30SJung-uk Kim * 316efcc2a30SJung-uk Kim * DESCRIPTION: Simulate a sleep/wake sequence 317efcc2a30SJung-uk Kim * 318efcc2a30SJung-uk Kim ******************************************************************************/ 319efcc2a30SJung-uk Kim 320efcc2a30SJung-uk Kim static void 321efcc2a30SJung-uk Kim AcpiDbDoOneSleepState ( 322efcc2a30SJung-uk Kim UINT8 SleepState) 323efcc2a30SJung-uk Kim { 324efcc2a30SJung-uk Kim ACPI_STATUS Status; 325efcc2a30SJung-uk Kim UINT8 SleepTypeA; 326efcc2a30SJung-uk Kim UINT8 SleepTypeB; 327efcc2a30SJung-uk Kim 328efcc2a30SJung-uk Kim 329efcc2a30SJung-uk Kim /* Validate parameter */ 330efcc2a30SJung-uk Kim 331efcc2a30SJung-uk Kim if (SleepState > ACPI_S_STATES_MAX) 332efcc2a30SJung-uk Kim { 333efcc2a30SJung-uk Kim AcpiOsPrintf ("Sleep state %d out of range (%d max)\n", 334efcc2a30SJung-uk Kim SleepState, ACPI_S_STATES_MAX); 335efcc2a30SJung-uk Kim return; 336efcc2a30SJung-uk Kim } 337efcc2a30SJung-uk Kim 338efcc2a30SJung-uk Kim AcpiOsPrintf ("\n---- Invoking sleep state S%d (%s):\n", 339efcc2a30SJung-uk Kim SleepState, AcpiGbl_SleepStateNames[SleepState]); 340efcc2a30SJung-uk Kim 341efcc2a30SJung-uk Kim /* Get the values for the sleep type registers (for display only) */ 342efcc2a30SJung-uk Kim 343efcc2a30SJung-uk Kim Status = AcpiGetSleepTypeData (SleepState, &SleepTypeA, &SleepTypeB); 344efcc2a30SJung-uk Kim if (ACPI_FAILURE (Status)) 345efcc2a30SJung-uk Kim { 346efcc2a30SJung-uk Kim AcpiOsPrintf ("Could not evaluate [%s] method, %s\n", 347efcc2a30SJung-uk Kim AcpiGbl_SleepStateNames[SleepState], 348efcc2a30SJung-uk Kim AcpiFormatException (Status)); 349efcc2a30SJung-uk Kim return; 350efcc2a30SJung-uk Kim } 351efcc2a30SJung-uk Kim 352efcc2a30SJung-uk Kim AcpiOsPrintf ( 353efcc2a30SJung-uk Kim "Register values for sleep state S%d: Sleep-A: %.2X, Sleep-B: %.2X\n", 354efcc2a30SJung-uk Kim SleepState, SleepTypeA, SleepTypeB); 355efcc2a30SJung-uk Kim 356efcc2a30SJung-uk Kim /* Invoke the various sleep/wake interfaces */ 357efcc2a30SJung-uk Kim 358efcc2a30SJung-uk Kim AcpiOsPrintf ("**** Sleep: Prepare to sleep (S%d) ****\n", 359efcc2a30SJung-uk Kim SleepState); 360a159c266SJung-uk Kim Status = AcpiEnterSleepStatePrep (SleepState); 361a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 362a159c266SJung-uk Kim { 363a159c266SJung-uk Kim goto ErrorExit; 364a159c266SJung-uk Kim } 365a159c266SJung-uk Kim 366efcc2a30SJung-uk Kim AcpiOsPrintf ("**** Sleep: Going to sleep (S%d) ****\n", 367efcc2a30SJung-uk Kim SleepState); 3681df130f1SJung-uk Kim Status = AcpiEnterSleepState (SleepState); 369a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 370a159c266SJung-uk Kim { 371a159c266SJung-uk Kim goto ErrorExit; 372a159c266SJung-uk Kim } 373a159c266SJung-uk Kim 374efcc2a30SJung-uk Kim AcpiOsPrintf ("**** Wake: Prepare to return from sleep (S%d) ****\n", 375efcc2a30SJung-uk Kim SleepState); 3761df130f1SJung-uk Kim Status = AcpiLeaveSleepStatePrep (SleepState); 377a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 378a159c266SJung-uk Kim { 379a159c266SJung-uk Kim goto ErrorExit; 380a159c266SJung-uk Kim } 381a159c266SJung-uk Kim 382efcc2a30SJung-uk Kim AcpiOsPrintf ("**** Wake: Return from sleep (S%d) ****\n", 383efcc2a30SJung-uk Kim SleepState); 384a159c266SJung-uk Kim Status = AcpiLeaveSleepState (SleepState); 385a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 386a159c266SJung-uk Kim { 387a159c266SJung-uk Kim goto ErrorExit; 388a159c266SJung-uk Kim } 389a159c266SJung-uk Kim 390efcc2a30SJung-uk Kim return; 391a159c266SJung-uk Kim 392a159c266SJung-uk Kim 393a159c266SJung-uk Kim ErrorExit: 394efcc2a30SJung-uk Kim ACPI_EXCEPTION ((AE_INFO, Status, "During invocation of sleep state S%d", 395efcc2a30SJung-uk Kim SleepState)); 396a159c266SJung-uk Kim } 397a159c266SJung-uk Kim 398a159c266SJung-uk Kim 399a159c266SJung-uk Kim /******************************************************************************* 400a159c266SJung-uk Kim * 401a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayLocks 402a159c266SJung-uk Kim * 403a159c266SJung-uk Kim * PARAMETERS: None 404a159c266SJung-uk Kim * 405a159c266SJung-uk Kim * RETURN: None 406a159c266SJung-uk Kim * 407a159c266SJung-uk Kim * DESCRIPTION: Display information about internal mutexes. 408a159c266SJung-uk Kim * 409a159c266SJung-uk Kim ******************************************************************************/ 410a159c266SJung-uk Kim 411a159c266SJung-uk Kim void 412a159c266SJung-uk Kim AcpiDbDisplayLocks ( 413a159c266SJung-uk Kim void) 414a159c266SJung-uk Kim { 415a159c266SJung-uk Kim UINT32 i; 416a159c266SJung-uk Kim 417a159c266SJung-uk Kim 418a159c266SJung-uk Kim for (i = 0; i < ACPI_MAX_MUTEX; i++) 419a159c266SJung-uk Kim { 420a159c266SJung-uk Kim AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i), 421a159c266SJung-uk Kim AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED 422a159c266SJung-uk Kim ? "Locked" : "Unlocked"); 423a159c266SJung-uk Kim } 424a159c266SJung-uk Kim } 425a159c266SJung-uk Kim 426a159c266SJung-uk Kim 427a159c266SJung-uk Kim /******************************************************************************* 428a159c266SJung-uk Kim * 429a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayTableInfo 430a159c266SJung-uk Kim * 431efcc2a30SJung-uk Kim * PARAMETERS: TableArg - Name of table to be displayed 432a159c266SJung-uk Kim * 433a159c266SJung-uk Kim * RETURN: None 434a159c266SJung-uk Kim * 435a159c266SJung-uk Kim * DESCRIPTION: Display information about loaded tables. Current 436a159c266SJung-uk Kim * implementation displays all loaded tables. 437a159c266SJung-uk Kim * 438a159c266SJung-uk Kim ******************************************************************************/ 439a159c266SJung-uk Kim 440a159c266SJung-uk Kim void 441a159c266SJung-uk Kim AcpiDbDisplayTableInfo ( 442a159c266SJung-uk Kim char *TableArg) 443a159c266SJung-uk Kim { 444a159c266SJung-uk Kim UINT32 i; 445a159c266SJung-uk Kim ACPI_TABLE_DESC *TableDesc; 446a159c266SJung-uk Kim ACPI_STATUS Status; 447a159c266SJung-uk Kim 448a159c266SJung-uk Kim 449e8241eabSJung-uk Kim /* Header */ 450e8241eabSJung-uk Kim 45170e6ab8fSJung-uk Kim AcpiOsPrintf ("Idx ID Status Type " 45270e6ab8fSJung-uk Kim "TableHeader (Sig, Address, Length, Misc)\n"); 453e8241eabSJung-uk Kim 454a159c266SJung-uk Kim /* Walk the entire root table list */ 455a159c266SJung-uk Kim 456a159c266SJung-uk Kim for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++) 457a159c266SJung-uk Kim { 458a159c266SJung-uk Kim TableDesc = &AcpiGbl_RootTableList.Tables[i]; 459e8241eabSJung-uk Kim 460e8241eabSJung-uk Kim /* Index and Table ID */ 461e8241eabSJung-uk Kim 462e8241eabSJung-uk Kim AcpiOsPrintf ("%3u %.2u ", i, TableDesc->OwnerId); 463e8241eabSJung-uk Kim 464e8241eabSJung-uk Kim /* Decode the table flags */ 465e8241eabSJung-uk Kim 466e8241eabSJung-uk Kim if (!(TableDesc->Flags & ACPI_TABLE_IS_LOADED)) 467e8241eabSJung-uk Kim { 468e8241eabSJung-uk Kim AcpiOsPrintf ("NotLoaded "); 469e8241eabSJung-uk Kim } 470e8241eabSJung-uk Kim else 471e8241eabSJung-uk Kim { 472e8241eabSJung-uk Kim AcpiOsPrintf (" Loaded "); 473e8241eabSJung-uk Kim } 474e8241eabSJung-uk Kim 475e8241eabSJung-uk Kim switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) 476e8241eabSJung-uk Kim { 477313a0c13SJung-uk Kim case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL: 478a9d8d09cSJung-uk Kim 479313a0c13SJung-uk Kim AcpiOsPrintf ("External/virtual "); 480e8241eabSJung-uk Kim break; 481e8241eabSJung-uk Kim 482313a0c13SJung-uk Kim case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL: 483a9d8d09cSJung-uk Kim 484313a0c13SJung-uk Kim AcpiOsPrintf ("Internal/physical "); 485e8241eabSJung-uk Kim break; 486e8241eabSJung-uk Kim 487313a0c13SJung-uk Kim case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL: 488a9d8d09cSJung-uk Kim 489313a0c13SJung-uk Kim AcpiOsPrintf ("Internal/virtual "); 490e8241eabSJung-uk Kim break; 491e8241eabSJung-uk Kim 492e8241eabSJung-uk Kim default: 493a9d8d09cSJung-uk Kim 494313a0c13SJung-uk Kim AcpiOsPrintf ("INVALID TYPE "); 495e8241eabSJung-uk Kim break; 496e8241eabSJung-uk Kim } 497a159c266SJung-uk Kim 498a159c266SJung-uk Kim /* Make sure that the table is mapped */ 499a159c266SJung-uk Kim 500313a0c13SJung-uk Kim Status = AcpiTbValidateTable (TableDesc); 501a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 502a159c266SJung-uk Kim { 503a159c266SJung-uk Kim return; 504a159c266SJung-uk Kim } 505a159c266SJung-uk Kim 506a159c266SJung-uk Kim /* Dump the table header */ 507a159c266SJung-uk Kim 508a159c266SJung-uk Kim if (TableDesc->Pointer) 509a159c266SJung-uk Kim { 510a159c266SJung-uk Kim AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer); 511a159c266SJung-uk Kim } 512a159c266SJung-uk Kim else 513a159c266SJung-uk Kim { 514a159c266SJung-uk Kim /* If the pointer is null, the table has been unloaded */ 515a159c266SJung-uk Kim 516f8146b88SJung-uk Kim ACPI_INFO (("%4.4s - Table has been unloaded", 517a159c266SJung-uk Kim TableDesc->Signature.Ascii)); 518a159c266SJung-uk Kim } 519a159c266SJung-uk Kim } 520a159c266SJung-uk Kim } 521a159c266SJung-uk Kim 522a159c266SJung-uk Kim 523a159c266SJung-uk Kim /******************************************************************************* 524a159c266SJung-uk Kim * 525a159c266SJung-uk Kim * FUNCTION: AcpiDbUnloadAcpiTable 526a159c266SJung-uk Kim * 527e8241eabSJung-uk Kim * PARAMETERS: ObjectName - Namespace pathname for an object that 528e8241eabSJung-uk Kim * is owned by the table to be unloaded 529a159c266SJung-uk Kim * 530e8241eabSJung-uk Kim * RETURN: None 531a159c266SJung-uk Kim * 532e8241eabSJung-uk Kim * DESCRIPTION: Unload an ACPI table, via any namespace node that is owned 533e8241eabSJung-uk Kim * by the table. 534a159c266SJung-uk Kim * 535a159c266SJung-uk Kim ******************************************************************************/ 536a159c266SJung-uk Kim 537a159c266SJung-uk Kim void 538a159c266SJung-uk Kim AcpiDbUnloadAcpiTable ( 539e8241eabSJung-uk Kim char *ObjectName) 540a159c266SJung-uk Kim { 541e8241eabSJung-uk Kim ACPI_NAMESPACE_NODE *Node; 542a159c266SJung-uk Kim ACPI_STATUS Status; 543a159c266SJung-uk Kim 544a159c266SJung-uk Kim 545e8241eabSJung-uk Kim /* Translate name to an Named object */ 546a159c266SJung-uk Kim 547e8241eabSJung-uk Kim Node = AcpiDbConvertToNode (ObjectName); 548e8241eabSJung-uk Kim if (!Node) 549a159c266SJung-uk Kim { 550e8241eabSJung-uk Kim return; 551e8241eabSJung-uk Kim } 552a159c266SJung-uk Kim 553e8241eabSJung-uk Kim Status = AcpiUnloadParentTable (ACPI_CAST_PTR (ACPI_HANDLE, Node)); 554a159c266SJung-uk Kim if (ACPI_SUCCESS (Status)) 555a159c266SJung-uk Kim { 556e8241eabSJung-uk Kim AcpiOsPrintf ("Parent of [%s] (%p) unloaded and uninstalled\n", 557e8241eabSJung-uk Kim ObjectName, Node); 558a159c266SJung-uk Kim } 559a159c266SJung-uk Kim else 560a159c266SJung-uk Kim { 561e8241eabSJung-uk Kim AcpiOsPrintf ("%s, while unloading parent table of [%s]\n", 562e8241eabSJung-uk Kim AcpiFormatException (Status), ObjectName); 563a159c266SJung-uk Kim } 564a159c266SJung-uk Kim } 565a159c266SJung-uk Kim 566a159c266SJung-uk Kim 567a159c266SJung-uk Kim /******************************************************************************* 568a159c266SJung-uk Kim * 569a159c266SJung-uk Kim * FUNCTION: AcpiDbSendNotify 570a159c266SJung-uk Kim * 571efcc2a30SJung-uk Kim * PARAMETERS: Name - Name of ACPI object where to send notify 572a159c266SJung-uk Kim * Value - Value of the notify to send. 573a159c266SJung-uk Kim * 574a159c266SJung-uk Kim * RETURN: None 575a159c266SJung-uk Kim * 576a159c266SJung-uk Kim * DESCRIPTION: Send an ACPI notification. The value specified is sent to the 577a159c266SJung-uk Kim * named object as an ACPI notify. 578a159c266SJung-uk Kim * 579a159c266SJung-uk Kim ******************************************************************************/ 580a159c266SJung-uk Kim 581a159c266SJung-uk Kim void 582a159c266SJung-uk Kim AcpiDbSendNotify ( 583a159c266SJung-uk Kim char *Name, 584a159c266SJung-uk Kim UINT32 Value) 585a159c266SJung-uk Kim { 586a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 587a159c266SJung-uk Kim ACPI_STATUS Status; 588a159c266SJung-uk Kim 589a159c266SJung-uk Kim 590a159c266SJung-uk Kim /* Translate name to an Named object */ 591a159c266SJung-uk Kim 592a159c266SJung-uk Kim Node = AcpiDbConvertToNode (Name); 593a159c266SJung-uk Kim if (!Node) 594a159c266SJung-uk Kim { 595a159c266SJung-uk Kim return; 596a159c266SJung-uk Kim } 597a159c266SJung-uk Kim 598eef1b955SJung-uk Kim /* Dispatch the notify if legal */ 599a159c266SJung-uk Kim 600eef1b955SJung-uk Kim if (AcpiEvIsNotifyObject (Node)) 601a159c266SJung-uk Kim { 602a159c266SJung-uk Kim Status = AcpiEvQueueNotifyRequest (Node, Value); 603a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 604a159c266SJung-uk Kim { 605a159c266SJung-uk Kim AcpiOsPrintf ("Could not queue notify\n"); 606a159c266SJung-uk Kim } 607eef1b955SJung-uk Kim } 608eef1b955SJung-uk Kim else 609eef1b955SJung-uk Kim { 610efcc2a30SJung-uk Kim AcpiOsPrintf ( 61170e6ab8fSJung-uk Kim "Named object [%4.4s] Type %s, " 61270e6ab8fSJung-uk Kim "must be Device/Thermal/Processor type\n", 613eef1b955SJung-uk Kim AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type)); 614a159c266SJung-uk Kim } 615a159c266SJung-uk Kim } 616a159c266SJung-uk Kim 617a159c266SJung-uk Kim 618a159c266SJung-uk Kim /******************************************************************************* 619a159c266SJung-uk Kim * 620a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayInterfaces 621a159c266SJung-uk Kim * 622a159c266SJung-uk Kim * PARAMETERS: ActionArg - Null, "install", or "remove" 623a159c266SJung-uk Kim * InterfaceNameArg - Name for install/remove options 624a159c266SJung-uk Kim * 625a159c266SJung-uk Kim * RETURN: None 626a159c266SJung-uk Kim * 627a159c266SJung-uk Kim * DESCRIPTION: Display or modify the global _OSI interface list 628a159c266SJung-uk Kim * 629a159c266SJung-uk Kim ******************************************************************************/ 630a159c266SJung-uk Kim 631a159c266SJung-uk Kim void 632a159c266SJung-uk Kim AcpiDbDisplayInterfaces ( 633a159c266SJung-uk Kim char *ActionArg, 634a159c266SJung-uk Kim char *InterfaceNameArg) 635a159c266SJung-uk Kim { 636a159c266SJung-uk Kim ACPI_INTERFACE_INFO *NextInterface; 637a159c266SJung-uk Kim char *SubString; 638a159c266SJung-uk Kim ACPI_STATUS Status; 639a159c266SJung-uk Kim 640a159c266SJung-uk Kim 641a159c266SJung-uk Kim /* If no arguments, just display current interface list */ 642a159c266SJung-uk Kim 643a159c266SJung-uk Kim if (!ActionArg) 644a159c266SJung-uk Kim { 64570e6ab8fSJung-uk Kim (void) AcpiOsAcquireMutex (AcpiGbl_OsiMutex, ACPI_WAIT_FOREVER); 646a159c266SJung-uk Kim 647a159c266SJung-uk Kim NextInterface = AcpiGbl_SupportedInterfaces; 648a159c266SJung-uk Kim while (NextInterface) 649a159c266SJung-uk Kim { 650a159c266SJung-uk Kim if (!(NextInterface->Flags & ACPI_OSI_INVALID)) 651a159c266SJung-uk Kim { 652a159c266SJung-uk Kim AcpiOsPrintf ("%s\n", NextInterface->Name); 653a159c266SJung-uk Kim } 65470e6ab8fSJung-uk Kim 655a159c266SJung-uk Kim NextInterface = NextInterface->Next; 656a159c266SJung-uk Kim } 657a159c266SJung-uk Kim 658a159c266SJung-uk Kim AcpiOsReleaseMutex (AcpiGbl_OsiMutex); 659a159c266SJung-uk Kim return; 660a159c266SJung-uk Kim } 661a159c266SJung-uk Kim 662a159c266SJung-uk Kim /* If ActionArg exists, so must InterfaceNameArg */ 663a159c266SJung-uk Kim 664a159c266SJung-uk Kim if (!InterfaceNameArg) 665a159c266SJung-uk Kim { 666a159c266SJung-uk Kim AcpiOsPrintf ("Missing Interface Name argument\n"); 667a159c266SJung-uk Kim return; 668a159c266SJung-uk Kim } 669a159c266SJung-uk Kim 670a159c266SJung-uk Kim /* Uppercase the action for match below */ 671a159c266SJung-uk Kim 672a159c266SJung-uk Kim AcpiUtStrupr (ActionArg); 673a159c266SJung-uk Kim 674a159c266SJung-uk Kim /* Install - install an interface */ 675a159c266SJung-uk Kim 6765ef50723SJung-uk Kim SubString = strstr ("INSTALL", ActionArg); 677a159c266SJung-uk Kim if (SubString) 678a159c266SJung-uk Kim { 679a159c266SJung-uk Kim Status = AcpiInstallInterface (InterfaceNameArg); 680a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 681a159c266SJung-uk Kim { 682a159c266SJung-uk Kim AcpiOsPrintf ("%s, while installing \"%s\"\n", 683a159c266SJung-uk Kim AcpiFormatException (Status), InterfaceNameArg); 684a159c266SJung-uk Kim } 685a159c266SJung-uk Kim return; 686a159c266SJung-uk Kim } 687a159c266SJung-uk Kim 688a159c266SJung-uk Kim /* Remove - remove an interface */ 689a159c266SJung-uk Kim 6905ef50723SJung-uk Kim SubString = strstr ("REMOVE", ActionArg); 691a159c266SJung-uk Kim if (SubString) 692a159c266SJung-uk Kim { 693a159c266SJung-uk Kim Status = AcpiRemoveInterface (InterfaceNameArg); 694a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 695a159c266SJung-uk Kim { 696a159c266SJung-uk Kim AcpiOsPrintf ("%s, while removing \"%s\"\n", 697a159c266SJung-uk Kim AcpiFormatException (Status), InterfaceNameArg); 698a159c266SJung-uk Kim } 699a159c266SJung-uk Kim return; 700a159c266SJung-uk Kim } 701a159c266SJung-uk Kim 702a159c266SJung-uk Kim /* Invalid ActionArg */ 703a159c266SJung-uk Kim 704a159c266SJung-uk Kim AcpiOsPrintf ("Invalid action argument: %s\n", ActionArg); 705a159c266SJung-uk Kim return; 706a159c266SJung-uk Kim } 707a159c266SJung-uk Kim 708a159c266SJung-uk Kim 709a159c266SJung-uk Kim /******************************************************************************* 710a159c266SJung-uk Kim * 711a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayTemplate 712a159c266SJung-uk Kim * 713efcc2a30SJung-uk Kim * PARAMETERS: BufferArg - Buffer name or address 714a159c266SJung-uk Kim * 715a159c266SJung-uk Kim * RETURN: None 716a159c266SJung-uk Kim * 717a159c266SJung-uk Kim * DESCRIPTION: Dump a buffer that contains a resource template 718a159c266SJung-uk Kim * 719a159c266SJung-uk Kim ******************************************************************************/ 720a159c266SJung-uk Kim 721a159c266SJung-uk Kim void 722a159c266SJung-uk Kim AcpiDbDisplayTemplate ( 723a159c266SJung-uk Kim char *BufferArg) 724a159c266SJung-uk Kim { 725a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 726a159c266SJung-uk Kim ACPI_STATUS Status; 727efcc2a30SJung-uk Kim ACPI_BUFFER ReturnBuffer; 728a159c266SJung-uk Kim 729a159c266SJung-uk Kim 730a159c266SJung-uk Kim /* Translate BufferArg to an Named object */ 731a159c266SJung-uk Kim 732a159c266SJung-uk Kim Node = AcpiDbConvertToNode (BufferArg); 733a159c266SJung-uk Kim if (!Node || (Node == AcpiGbl_RootNode)) 734a159c266SJung-uk Kim { 735a159c266SJung-uk Kim AcpiOsPrintf ("Invalid argument: %s\n", BufferArg); 736a159c266SJung-uk Kim return; 737a159c266SJung-uk Kim } 738a159c266SJung-uk Kim 739a159c266SJung-uk Kim /* We must have a buffer object */ 740a159c266SJung-uk Kim 741a159c266SJung-uk Kim if (Node->Type != ACPI_TYPE_BUFFER) 742a159c266SJung-uk Kim { 743a159c266SJung-uk Kim AcpiOsPrintf ("Not a Buffer object, cannot be a template: %s\n", 744a159c266SJung-uk Kim BufferArg); 745a159c266SJung-uk Kim return; 746a159c266SJung-uk Kim } 747a159c266SJung-uk Kim 748efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 749efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 750a159c266SJung-uk Kim 751a159c266SJung-uk Kim /* Attempt to convert the raw buffer to a resource list */ 752a159c266SJung-uk Kim 753efcc2a30SJung-uk Kim Status = AcpiRsCreateResourceList (Node->Object, &ReturnBuffer); 754a159c266SJung-uk Kim 755a159c266SJung-uk Kim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 756a159c266SJung-uk Kim AcpiDbgLevel |= ACPI_LV_RESOURCES; 757a159c266SJung-uk Kim 758a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 759a159c266SJung-uk Kim { 76070e6ab8fSJung-uk Kim AcpiOsPrintf ( 76170e6ab8fSJung-uk Kim "Could not convert Buffer to a resource list: %s, %s\n", 762a159c266SJung-uk Kim BufferArg, AcpiFormatException (Status)); 763a159c266SJung-uk Kim goto DumpBuffer; 764a159c266SJung-uk Kim } 765a159c266SJung-uk Kim 766a159c266SJung-uk Kim /* Now we can dump the resource list */ 767a159c266SJung-uk Kim 768a159c266SJung-uk Kim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, 769efcc2a30SJung-uk Kim ReturnBuffer.Pointer)); 770a159c266SJung-uk Kim 771a159c266SJung-uk Kim DumpBuffer: 772a159c266SJung-uk Kim AcpiOsPrintf ("\nRaw data buffer:\n"); 7738ef1a331SJung-uk Kim AcpiUtDebugDumpBuffer ((UINT8 *) Node->Object->Buffer.Pointer, 774a159c266SJung-uk Kim Node->Object->Buffer.Length, 775a159c266SJung-uk Kim DB_BYTE_DISPLAY, ACPI_UINT32_MAX); 776a159c266SJung-uk Kim 777a159c266SJung-uk Kim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 778a159c266SJung-uk Kim return; 779a159c266SJung-uk Kim } 780a159c266SJung-uk Kim 781a159c266SJung-uk Kim 782a159c266SJung-uk Kim /******************************************************************************* 783a159c266SJung-uk Kim * 784a159c266SJung-uk Kim * FUNCTION: AcpiDmCompareAmlResources 785a159c266SJung-uk Kim * 786a159c266SJung-uk Kim * PARAMETERS: Aml1Buffer - Contains first resource list 787a159c266SJung-uk Kim * Aml1BufferLength - Length of first resource list 788a159c266SJung-uk Kim * Aml2Buffer - Contains second resource list 789a159c266SJung-uk Kim * Aml2BufferLength - Length of second resource list 790a159c266SJung-uk Kim * 791a159c266SJung-uk Kim * RETURN: None 792a159c266SJung-uk Kim * 793a159c266SJung-uk Kim * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in 794a159c266SJung-uk Kim * order to isolate a miscompare to an individual resource) 795a159c266SJung-uk Kim * 796a159c266SJung-uk Kim ******************************************************************************/ 797a159c266SJung-uk Kim 798a159c266SJung-uk Kim static void 799a159c266SJung-uk Kim AcpiDmCompareAmlResources ( 800a159c266SJung-uk Kim UINT8 *Aml1Buffer, 801a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml1BufferLength, 802a159c266SJung-uk Kim UINT8 *Aml2Buffer, 803a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml2BufferLength) 804a159c266SJung-uk Kim { 805a159c266SJung-uk Kim UINT8 *Aml1; 806a159c266SJung-uk Kim UINT8 *Aml2; 807a159c266SJung-uk Kim UINT8 *Aml1End; 808a159c266SJung-uk Kim UINT8 *Aml2End; 809a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml1Length; 810a159c266SJung-uk Kim ACPI_RSDESC_SIZE Aml2Length; 811a159c266SJung-uk Kim ACPI_RSDESC_SIZE Offset = 0; 812a159c266SJung-uk Kim UINT8 ResourceType; 813a159c266SJung-uk Kim UINT32 Count = 0; 814a159c266SJung-uk Kim UINT32 i; 815a159c266SJung-uk Kim 816a159c266SJung-uk Kim 817a159c266SJung-uk Kim /* Compare overall buffer sizes (may be different due to size rounding) */ 818a159c266SJung-uk Kim 819a159c266SJung-uk Kim if (Aml1BufferLength != Aml2BufferLength) 820a159c266SJung-uk Kim { 821a159c266SJung-uk Kim AcpiOsPrintf ( 82270e6ab8fSJung-uk Kim "**** Buffer length mismatch in converted " 82370e6ab8fSJung-uk Kim "AML: Original %X, New %X ****\n", 824a159c266SJung-uk Kim Aml1BufferLength, Aml2BufferLength); 825a159c266SJung-uk Kim } 826a159c266SJung-uk Kim 827a159c266SJung-uk Kim Aml1 = Aml1Buffer; 828a159c266SJung-uk Kim Aml2 = Aml2Buffer; 829a159c266SJung-uk Kim Aml1End = Aml1Buffer + Aml1BufferLength; 830a159c266SJung-uk Kim Aml2End = Aml2Buffer + Aml2BufferLength; 831a159c266SJung-uk Kim 832a159c266SJung-uk Kim /* Walk the descriptor lists, comparing each descriptor */ 833a159c266SJung-uk Kim 834a159c266SJung-uk Kim while ((Aml1 < Aml1End) && (Aml2 < Aml2End)) 835a159c266SJung-uk Kim { 836a159c266SJung-uk Kim /* Get the lengths of each descriptor */ 837a159c266SJung-uk Kim 838a159c266SJung-uk Kim Aml1Length = AcpiUtGetDescriptorLength (Aml1); 839a159c266SJung-uk Kim Aml2Length = AcpiUtGetDescriptorLength (Aml2); 840a159c266SJung-uk Kim ResourceType = AcpiUtGetResourceType (Aml1); 841a159c266SJung-uk Kim 842a159c266SJung-uk Kim /* Check for descriptor length match */ 843a159c266SJung-uk Kim 844a159c266SJung-uk Kim if (Aml1Length != Aml2Length) 845a159c266SJung-uk Kim { 846a159c266SJung-uk Kim AcpiOsPrintf ( 84770e6ab8fSJung-uk Kim "**** Length mismatch in descriptor [%.2X] type %2.2X, " 84870e6ab8fSJung-uk Kim "Offset %8.8X Len1 %X, Len2 %X ****\n", 849a159c266SJung-uk Kim Count, ResourceType, Offset, Aml1Length, Aml2Length); 850a159c266SJung-uk Kim } 851a159c266SJung-uk Kim 852a159c266SJung-uk Kim /* Check for descriptor byte match */ 853a159c266SJung-uk Kim 8545ef50723SJung-uk Kim else if (memcmp (Aml1, Aml2, Aml1Length)) 855a159c266SJung-uk Kim { 856a159c266SJung-uk Kim AcpiOsPrintf ( 85770e6ab8fSJung-uk Kim "**** Data mismatch in descriptor [%.2X] type %2.2X, " 85870e6ab8fSJung-uk Kim "Offset %8.8X ****\n", 859a159c266SJung-uk Kim Count, ResourceType, Offset); 860a159c266SJung-uk Kim 861a159c266SJung-uk Kim for (i = 0; i < Aml1Length; i++) 862a159c266SJung-uk Kim { 863a159c266SJung-uk Kim if (Aml1[i] != Aml2[i]) 864a159c266SJung-uk Kim { 865efcc2a30SJung-uk Kim AcpiOsPrintf ( 86670e6ab8fSJung-uk Kim "Mismatch at byte offset %.2X: is %2.2X, " 86770e6ab8fSJung-uk Kim "should be %2.2X\n", 868a159c266SJung-uk Kim i, Aml2[i], Aml1[i]); 869a159c266SJung-uk Kim } 870a159c266SJung-uk Kim } 871a159c266SJung-uk Kim } 872a159c266SJung-uk Kim 873a159c266SJung-uk Kim /* Exit on EndTag descriptor */ 874a159c266SJung-uk Kim 875a159c266SJung-uk Kim if (ResourceType == ACPI_RESOURCE_NAME_END_TAG) 876a159c266SJung-uk Kim { 877a159c266SJung-uk Kim return; 878a159c266SJung-uk Kim } 879a159c266SJung-uk Kim 880a159c266SJung-uk Kim /* Point to next descriptor in each buffer */ 881a159c266SJung-uk Kim 882a159c266SJung-uk Kim Count++; 883a159c266SJung-uk Kim Offset += Aml1Length; 884a159c266SJung-uk Kim Aml1 += Aml1Length; 885a159c266SJung-uk Kim Aml2 += Aml2Length; 886a159c266SJung-uk Kim } 887a159c266SJung-uk Kim } 888a159c266SJung-uk Kim 889a159c266SJung-uk Kim 890a159c266SJung-uk Kim /******************************************************************************* 891a159c266SJung-uk Kim * 892a159c266SJung-uk Kim * FUNCTION: AcpiDmTestResourceConversion 893a159c266SJung-uk Kim * 894a159c266SJung-uk Kim * PARAMETERS: Node - Parent device node 895a159c266SJung-uk Kim * Name - resource method name (_CRS) 896a159c266SJung-uk Kim * 897a159c266SJung-uk Kim * RETURN: Status 898a159c266SJung-uk Kim * 899a159c266SJung-uk Kim * DESCRIPTION: Compare the original AML with a conversion of the AML to 900a159c266SJung-uk Kim * internal resource list, then back to AML. 901a159c266SJung-uk Kim * 902a159c266SJung-uk Kim ******************************************************************************/ 903a159c266SJung-uk Kim 904a159c266SJung-uk Kim static ACPI_STATUS 905a159c266SJung-uk Kim AcpiDmTestResourceConversion ( 906a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node, 907a159c266SJung-uk Kim char *Name) 908a159c266SJung-uk Kim { 909a159c266SJung-uk Kim ACPI_STATUS Status; 910efcc2a30SJung-uk Kim ACPI_BUFFER ReturnBuffer; 911efcc2a30SJung-uk Kim ACPI_BUFFER ResourceBuffer; 912a159c266SJung-uk Kim ACPI_BUFFER NewAml; 913a159c266SJung-uk Kim ACPI_OBJECT *OriginalAml; 914a159c266SJung-uk Kim 915a159c266SJung-uk Kim 916a159c266SJung-uk Kim AcpiOsPrintf ("Resource Conversion Comparison:\n"); 917a159c266SJung-uk Kim 918a159c266SJung-uk Kim NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 919efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 920efcc2a30SJung-uk Kim ResourceBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 921a159c266SJung-uk Kim 922a159c266SJung-uk Kim /* Get the original _CRS AML resource template */ 923a159c266SJung-uk Kim 924efcc2a30SJung-uk Kim Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnBuffer); 925a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 926a159c266SJung-uk Kim { 927a159c266SJung-uk Kim AcpiOsPrintf ("Could not obtain %s: %s\n", 928a159c266SJung-uk Kim Name, AcpiFormatException (Status)); 929a159c266SJung-uk Kim return (Status); 930a159c266SJung-uk Kim } 931a159c266SJung-uk Kim 932a159c266SJung-uk Kim /* Get the AML resource template, converted to internal resource structs */ 933a159c266SJung-uk Kim 934efcc2a30SJung-uk Kim Status = AcpiGetCurrentResources (Node, &ResourceBuffer); 935a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 936a159c266SJung-uk Kim { 937a159c266SJung-uk Kim AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n", 938a159c266SJung-uk Kim AcpiFormatException (Status)); 939a159c266SJung-uk Kim goto Exit1; 940a159c266SJung-uk Kim } 941a159c266SJung-uk Kim 942a159c266SJung-uk Kim /* Convert internal resource list to external AML resource template */ 943a159c266SJung-uk Kim 944313a0c13SJung-uk Kim Status = AcpiRsCreateAmlResources (&ResourceBuffer, &NewAml); 945a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 946a159c266SJung-uk Kim { 947a159c266SJung-uk Kim AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n", 948a159c266SJung-uk Kim AcpiFormatException (Status)); 949a159c266SJung-uk Kim goto Exit2; 950a159c266SJung-uk Kim } 951a159c266SJung-uk Kim 952a159c266SJung-uk Kim /* Compare original AML to the newly created AML resource list */ 953a159c266SJung-uk Kim 954efcc2a30SJung-uk Kim OriginalAml = ReturnBuffer.Pointer; 955a159c266SJung-uk Kim 956313a0c13SJung-uk Kim AcpiDmCompareAmlResources (OriginalAml->Buffer.Pointer, 957313a0c13SJung-uk Kim (ACPI_RSDESC_SIZE) OriginalAml->Buffer.Length, 958a159c266SJung-uk Kim NewAml.Pointer, (ACPI_RSDESC_SIZE) NewAml.Length); 959a159c266SJung-uk Kim 960a159c266SJung-uk Kim /* Cleanup and exit */ 961a159c266SJung-uk Kim 962a159c266SJung-uk Kim ACPI_FREE (NewAml.Pointer); 963a159c266SJung-uk Kim Exit2: 964efcc2a30SJung-uk Kim ACPI_FREE (ResourceBuffer.Pointer); 965a159c266SJung-uk Kim Exit1: 966efcc2a30SJung-uk Kim ACPI_FREE (ReturnBuffer.Pointer); 967a159c266SJung-uk Kim return (Status); 968a159c266SJung-uk Kim } 969a159c266SJung-uk Kim 970a159c266SJung-uk Kim 971a159c266SJung-uk Kim /******************************************************************************* 972a159c266SJung-uk Kim * 973a159c266SJung-uk Kim * FUNCTION: AcpiDbResourceCallback 974a159c266SJung-uk Kim * 975a159c266SJung-uk Kim * PARAMETERS: ACPI_WALK_RESOURCE_CALLBACK 976a159c266SJung-uk Kim * 977a159c266SJung-uk Kim * RETURN: Status 978a159c266SJung-uk Kim * 979efcc2a30SJung-uk Kim * DESCRIPTION: Simple callback to exercise AcpiWalkResources and 980efcc2a30SJung-uk Kim * AcpiWalkResourceBuffer. 981a159c266SJung-uk Kim * 982a159c266SJung-uk Kim ******************************************************************************/ 983a159c266SJung-uk Kim 984a159c266SJung-uk Kim static ACPI_STATUS 985a159c266SJung-uk Kim AcpiDbResourceCallback ( 986a159c266SJung-uk Kim ACPI_RESOURCE *Resource, 987a159c266SJung-uk Kim void *Context) 988a159c266SJung-uk Kim { 989a159c266SJung-uk Kim 990a159c266SJung-uk Kim return (AE_OK); 991a159c266SJung-uk Kim } 992a159c266SJung-uk Kim 993a159c266SJung-uk Kim 994a159c266SJung-uk Kim /******************************************************************************* 995a159c266SJung-uk Kim * 996a159c266SJung-uk Kim * FUNCTION: AcpiDbDeviceResources 997a159c266SJung-uk Kim * 998a159c266SJung-uk Kim * PARAMETERS: ACPI_WALK_CALLBACK 999a159c266SJung-uk Kim * 1000a159c266SJung-uk Kim * RETURN: Status 1001a159c266SJung-uk Kim * 1002a159c266SJung-uk Kim * DESCRIPTION: Display the _PRT/_CRS/_PRS resources for a device object. 1003a159c266SJung-uk Kim * 1004a159c266SJung-uk Kim ******************************************************************************/ 1005a159c266SJung-uk Kim 1006a159c266SJung-uk Kim static ACPI_STATUS 1007a159c266SJung-uk Kim AcpiDbDeviceResources ( 1008a159c266SJung-uk Kim ACPI_HANDLE ObjHandle, 1009a159c266SJung-uk Kim UINT32 NestingLevel, 1010a159c266SJung-uk Kim void *Context, 1011a159c266SJung-uk Kim void **ReturnValue) 1012a159c266SJung-uk Kim { 1013a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 1014a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *PrtNode = NULL; 1015a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *CrsNode = NULL; 1016a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *PrsNode = NULL; 1017a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *AeiNode = NULL; 1018a159c266SJung-uk Kim char *ParentPath; 1019efcc2a30SJung-uk Kim ACPI_BUFFER ReturnBuffer; 1020a159c266SJung-uk Kim ACPI_STATUS Status; 1021a159c266SJung-uk Kim 1022a159c266SJung-uk Kim 1023a159c266SJung-uk Kim Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle); 1024f8146b88SJung-uk Kim ParentPath = AcpiNsGetNormalizedPathname (Node, TRUE); 1025a159c266SJung-uk Kim if (!ParentPath) 1026a159c266SJung-uk Kim { 1027a159c266SJung-uk Kim return (AE_NO_MEMORY); 1028a159c266SJung-uk Kim } 1029a159c266SJung-uk Kim 1030a159c266SJung-uk Kim /* Get handles to the resource methods for this device */ 1031a159c266SJung-uk Kim 103270e6ab8fSJung-uk Kim (void) AcpiGetHandle (Node, METHOD_NAME__PRT, 103370e6ab8fSJung-uk Kim ACPI_CAST_PTR (ACPI_HANDLE, &PrtNode)); 103470e6ab8fSJung-uk Kim (void) AcpiGetHandle (Node, METHOD_NAME__CRS, 103570e6ab8fSJung-uk Kim ACPI_CAST_PTR (ACPI_HANDLE, &CrsNode)); 103670e6ab8fSJung-uk Kim (void) AcpiGetHandle (Node, METHOD_NAME__PRS, 103770e6ab8fSJung-uk Kim ACPI_CAST_PTR (ACPI_HANDLE, &PrsNode)); 103870e6ab8fSJung-uk Kim (void) AcpiGetHandle (Node, METHOD_NAME__AEI, 103970e6ab8fSJung-uk Kim ACPI_CAST_PTR (ACPI_HANDLE, &AeiNode)); 104070e6ab8fSJung-uk Kim 1041a159c266SJung-uk Kim if (!PrtNode && !CrsNode && !PrsNode && !AeiNode) 1042a159c266SJung-uk Kim { 1043a159c266SJung-uk Kim goto Cleanup; /* Nothing to do */ 1044a159c266SJung-uk Kim } 1045a159c266SJung-uk Kim 1046a159c266SJung-uk Kim AcpiOsPrintf ("\nDevice: %s\n", ParentPath); 1047a159c266SJung-uk Kim 1048a159c266SJung-uk Kim /* Prepare for a return object of arbitrary size */ 1049a159c266SJung-uk Kim 1050efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1051efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1052a159c266SJung-uk Kim 1053a159c266SJung-uk Kim 1054a159c266SJung-uk Kim /* _PRT */ 1055a159c266SJung-uk Kim 1056a159c266SJung-uk Kim if (PrtNode) 1057a159c266SJung-uk Kim { 1058a159c266SJung-uk Kim AcpiOsPrintf ("Evaluating _PRT\n"); 1059a159c266SJung-uk Kim 1060efcc2a30SJung-uk Kim Status = AcpiEvaluateObject (PrtNode, NULL, NULL, &ReturnBuffer); 1061a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1062a159c266SJung-uk Kim { 1063a159c266SJung-uk Kim AcpiOsPrintf ("Could not evaluate _PRT: %s\n", 1064a159c266SJung-uk Kim AcpiFormatException (Status)); 1065a159c266SJung-uk Kim goto GetCrs; 1066a159c266SJung-uk Kim } 1067a159c266SJung-uk Kim 1068efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1069efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1070a159c266SJung-uk Kim 1071efcc2a30SJung-uk Kim Status = AcpiGetIrqRoutingTable (Node, &ReturnBuffer); 1072a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1073a159c266SJung-uk Kim { 1074a159c266SJung-uk Kim AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n", 1075a159c266SJung-uk Kim AcpiFormatException (Status)); 1076a159c266SJung-uk Kim goto GetCrs; 1077a159c266SJung-uk Kim } 1078a159c266SJung-uk Kim 1079a159c266SJung-uk Kim AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer)); 1080a159c266SJung-uk Kim } 1081a159c266SJung-uk Kim 1082a159c266SJung-uk Kim 1083a159c266SJung-uk Kim /* _CRS */ 1084a159c266SJung-uk Kim 1085a159c266SJung-uk Kim GetCrs: 1086a159c266SJung-uk Kim if (CrsNode) 1087a159c266SJung-uk Kim { 1088a159c266SJung-uk Kim AcpiOsPrintf ("Evaluating _CRS\n"); 1089a159c266SJung-uk Kim 1090efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1091efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1092a159c266SJung-uk Kim 1093efcc2a30SJung-uk Kim Status = AcpiEvaluateObject (CrsNode, NULL, NULL, &ReturnBuffer); 1094a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1095a159c266SJung-uk Kim { 1096a159c266SJung-uk Kim AcpiOsPrintf ("Could not evaluate _CRS: %s\n", 1097a159c266SJung-uk Kim AcpiFormatException (Status)); 1098a159c266SJung-uk Kim goto GetPrs; 1099a159c266SJung-uk Kim } 1100a159c266SJung-uk Kim 1101efcc2a30SJung-uk Kim /* This code exercises the AcpiWalkResources interface */ 1102a159c266SJung-uk Kim 1103a159c266SJung-uk Kim Status = AcpiWalkResources (Node, METHOD_NAME__CRS, 1104a159c266SJung-uk Kim AcpiDbResourceCallback, NULL); 1105a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1106a159c266SJung-uk Kim { 1107a159c266SJung-uk Kim AcpiOsPrintf ("AcpiWalkResources failed: %s\n", 1108a159c266SJung-uk Kim AcpiFormatException (Status)); 1109a159c266SJung-uk Kim goto GetPrs; 1110a159c266SJung-uk Kim } 1111a159c266SJung-uk Kim 1112efcc2a30SJung-uk Kim /* Get the _CRS resource list (test ALLOCATE buffer) */ 1113a159c266SJung-uk Kim 1114efcc2a30SJung-uk Kim ReturnBuffer.Pointer = NULL; 1115efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER; 1116a159c266SJung-uk Kim 1117efcc2a30SJung-uk Kim Status = AcpiGetCurrentResources (Node, &ReturnBuffer); 1118a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1119a159c266SJung-uk Kim { 1120a159c266SJung-uk Kim AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n", 1121a159c266SJung-uk Kim AcpiFormatException (Status)); 1122a159c266SJung-uk Kim goto GetPrs; 1123a159c266SJung-uk Kim } 1124a159c266SJung-uk Kim 1125efcc2a30SJung-uk Kim /* This code exercises the AcpiWalkResourceBuffer interface */ 1126efcc2a30SJung-uk Kim 1127efcc2a30SJung-uk Kim Status = AcpiWalkResourceBuffer (&ReturnBuffer, 1128efcc2a30SJung-uk Kim AcpiDbResourceCallback, NULL); 1129efcc2a30SJung-uk Kim if (ACPI_FAILURE (Status)) 1130efcc2a30SJung-uk Kim { 1131efcc2a30SJung-uk Kim AcpiOsPrintf ("AcpiWalkResourceBuffer failed: %s\n", 1132efcc2a30SJung-uk Kim AcpiFormatException (Status)); 1133efcc2a30SJung-uk Kim goto EndCrs; 1134efcc2a30SJung-uk Kim } 1135efcc2a30SJung-uk Kim 1136a159c266SJung-uk Kim /* Dump the _CRS resource list */ 1137a159c266SJung-uk Kim 1138a159c266SJung-uk Kim AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, 1139efcc2a30SJung-uk Kim ReturnBuffer.Pointer)); 1140a159c266SJung-uk Kim 1141a159c266SJung-uk Kim /* 1142efcc2a30SJung-uk Kim * Perform comparison of original AML to newly created AML. This 1143efcc2a30SJung-uk Kim * tests both the AML->Resource conversion and the Resource->AML 1144efcc2a30SJung-uk Kim * conversion. 1145a159c266SJung-uk Kim */ 1146efcc2a30SJung-uk Kim (void) AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS); 1147a159c266SJung-uk Kim 1148a159c266SJung-uk Kim /* Execute _SRS with the resource list */ 1149a159c266SJung-uk Kim 11509c48c75eSJung-uk Kim AcpiOsPrintf ("Evaluating _SRS\n"); 11519c48c75eSJung-uk Kim 1152efcc2a30SJung-uk Kim Status = AcpiSetCurrentResources (Node, &ReturnBuffer); 1153a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1154a159c266SJung-uk Kim { 1155a159c266SJung-uk Kim AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n", 1156a159c266SJung-uk Kim AcpiFormatException (Status)); 1157efcc2a30SJung-uk Kim goto EndCrs; 1158a159c266SJung-uk Kim } 1159efcc2a30SJung-uk Kim 1160efcc2a30SJung-uk Kim EndCrs: 1161313a0c13SJung-uk Kim ACPI_FREE (ReturnBuffer.Pointer); 1162a159c266SJung-uk Kim } 1163a159c266SJung-uk Kim 1164a159c266SJung-uk Kim 1165a159c266SJung-uk Kim /* _PRS */ 1166a159c266SJung-uk Kim 1167a159c266SJung-uk Kim GetPrs: 1168a159c266SJung-uk Kim if (PrsNode) 1169a159c266SJung-uk Kim { 1170a159c266SJung-uk Kim AcpiOsPrintf ("Evaluating _PRS\n"); 1171a159c266SJung-uk Kim 1172efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1173efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1174a159c266SJung-uk Kim 1175efcc2a30SJung-uk Kim Status = AcpiEvaluateObject (PrsNode, NULL, NULL, &ReturnBuffer); 1176a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1177a159c266SJung-uk Kim { 1178a159c266SJung-uk Kim AcpiOsPrintf ("Could not evaluate _PRS: %s\n", 1179a159c266SJung-uk Kim AcpiFormatException (Status)); 1180a159c266SJung-uk Kim goto GetAei; 1181a159c266SJung-uk Kim } 1182a159c266SJung-uk Kim 1183efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1184efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1185a159c266SJung-uk Kim 1186efcc2a30SJung-uk Kim Status = AcpiGetPossibleResources (Node, &ReturnBuffer); 1187a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1188a159c266SJung-uk Kim { 1189a159c266SJung-uk Kim AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n", 1190a159c266SJung-uk Kim AcpiFormatException (Status)); 1191a159c266SJung-uk Kim goto GetAei; 1192a159c266SJung-uk Kim } 1193a159c266SJung-uk Kim 119470e6ab8fSJung-uk Kim AcpiRsDumpResourceList (ACPI_CAST_PTR ( 119570e6ab8fSJung-uk Kim ACPI_RESOURCE, AcpiGbl_DbBuffer)); 1196a159c266SJung-uk Kim } 1197a159c266SJung-uk Kim 1198a159c266SJung-uk Kim 1199a159c266SJung-uk Kim /* _AEI */ 1200a159c266SJung-uk Kim 1201a159c266SJung-uk Kim GetAei: 1202a159c266SJung-uk Kim if (AeiNode) 1203a159c266SJung-uk Kim { 1204a159c266SJung-uk Kim AcpiOsPrintf ("Evaluating _AEI\n"); 1205a159c266SJung-uk Kim 1206efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1207efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1208a159c266SJung-uk Kim 1209efcc2a30SJung-uk Kim Status = AcpiEvaluateObject (AeiNode, NULL, NULL, &ReturnBuffer); 1210a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1211a159c266SJung-uk Kim { 1212a159c266SJung-uk Kim AcpiOsPrintf ("Could not evaluate _AEI: %s\n", 1213a159c266SJung-uk Kim AcpiFormatException (Status)); 1214a159c266SJung-uk Kim goto Cleanup; 1215a159c266SJung-uk Kim } 1216a159c266SJung-uk Kim 1217efcc2a30SJung-uk Kim ReturnBuffer.Pointer = AcpiGbl_DbBuffer; 1218efcc2a30SJung-uk Kim ReturnBuffer.Length = ACPI_DEBUG_BUFFER_SIZE; 1219a159c266SJung-uk Kim 1220efcc2a30SJung-uk Kim Status = AcpiGetEventResources (Node, &ReturnBuffer); 1221a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 1222a159c266SJung-uk Kim { 1223a159c266SJung-uk Kim AcpiOsPrintf ("AcpiGetEventResources failed: %s\n", 1224a159c266SJung-uk Kim AcpiFormatException (Status)); 1225a159c266SJung-uk Kim goto Cleanup; 1226a159c266SJung-uk Kim } 1227a159c266SJung-uk Kim 122870e6ab8fSJung-uk Kim AcpiRsDumpResourceList (ACPI_CAST_PTR ( 122970e6ab8fSJung-uk Kim ACPI_RESOURCE, AcpiGbl_DbBuffer)); 1230a159c266SJung-uk Kim } 1231a159c266SJung-uk Kim 1232a159c266SJung-uk Kim 1233a159c266SJung-uk Kim Cleanup: 1234a159c266SJung-uk Kim ACPI_FREE (ParentPath); 1235a159c266SJung-uk Kim return (AE_OK); 1236a159c266SJung-uk Kim } 1237a159c266SJung-uk Kim 1238a159c266SJung-uk Kim 1239a159c266SJung-uk Kim /******************************************************************************* 1240a159c266SJung-uk Kim * 1241a159c266SJung-uk Kim * FUNCTION: AcpiDbDisplayResources 1242a159c266SJung-uk Kim * 1243a159c266SJung-uk Kim * PARAMETERS: ObjectArg - String object name or object pointer. 12449c48c75eSJung-uk Kim * NULL or "*" means "display resources for 12459c48c75eSJung-uk Kim * all devices" 1246a159c266SJung-uk Kim * 1247a159c266SJung-uk Kim * RETURN: None 1248a159c266SJung-uk Kim * 1249a159c266SJung-uk Kim * DESCRIPTION: Display the resource objects associated with a device. 1250a159c266SJung-uk Kim * 1251a159c266SJung-uk Kim ******************************************************************************/ 1252a159c266SJung-uk Kim 1253a159c266SJung-uk Kim void 1254a159c266SJung-uk Kim AcpiDbDisplayResources ( 1255a159c266SJung-uk Kim char *ObjectArg) 1256a159c266SJung-uk Kim { 1257a159c266SJung-uk Kim ACPI_NAMESPACE_NODE *Node; 1258a159c266SJung-uk Kim 1259a159c266SJung-uk Kim 1260a159c266SJung-uk Kim AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT); 1261a159c266SJung-uk Kim AcpiDbgLevel |= ACPI_LV_RESOURCES; 1262a159c266SJung-uk Kim 1263a159c266SJung-uk Kim /* Asterisk means "display resources for all devices" */ 1264a159c266SJung-uk Kim 12655ef50723SJung-uk Kim if (!ObjectArg || (!strcmp (ObjectArg, "*"))) 1266a159c266SJung-uk Kim { 1267a159c266SJung-uk Kim (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, 1268a159c266SJung-uk Kim ACPI_UINT32_MAX, AcpiDbDeviceResources, NULL, NULL, NULL); 1269a159c266SJung-uk Kim } 1270a159c266SJung-uk Kim else 1271a159c266SJung-uk Kim { 1272a159c266SJung-uk Kim /* Convert string to object pointer */ 1273a159c266SJung-uk Kim 1274a159c266SJung-uk Kim Node = AcpiDbConvertToNode (ObjectArg); 1275a159c266SJung-uk Kim if (Node) 1276a159c266SJung-uk Kim { 1277a159c266SJung-uk Kim if (Node->Type != ACPI_TYPE_DEVICE) 1278a159c266SJung-uk Kim { 127970e6ab8fSJung-uk Kim AcpiOsPrintf ( 128070e6ab8fSJung-uk Kim "%4.4s: Name is not a device object (%s)\n", 1281a159c266SJung-uk Kim Node->Name.Ascii, AcpiUtGetTypeName (Node->Type)); 1282a159c266SJung-uk Kim } 1283a159c266SJung-uk Kim else 1284a159c266SJung-uk Kim { 1285a159c266SJung-uk Kim (void) AcpiDbDeviceResources (Node, 0, NULL, NULL); 1286a159c266SJung-uk Kim } 1287a159c266SJung-uk Kim } 1288a159c266SJung-uk Kim } 1289a159c266SJung-uk Kim 1290a159c266SJung-uk Kim AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT); 1291a159c266SJung-uk Kim } 1292a159c266SJung-uk Kim 1293a159c266SJung-uk Kim 1294a159c266SJung-uk Kim #if (!ACPI_REDUCED_HARDWARE) 1295a159c266SJung-uk Kim /******************************************************************************* 1296a159c266SJung-uk Kim * 1297a159c266SJung-uk Kim * FUNCTION: AcpiDbGenerateGpe 1298a159c266SJung-uk Kim * 1299a159c266SJung-uk Kim * PARAMETERS: GpeArg - Raw GPE number, ascii string 1300a159c266SJung-uk Kim * BlockArg - GPE block number, ascii string 1301a159c266SJung-uk Kim * 0 or 1 for FADT GPE blocks 1302a159c266SJung-uk Kim * 1303a159c266SJung-uk Kim * RETURN: None 1304a159c266SJung-uk Kim * 1305efcc2a30SJung-uk Kim * DESCRIPTION: Simulate firing of a GPE 1306a159c266SJung-uk Kim * 1307a159c266SJung-uk Kim ******************************************************************************/ 1308a159c266SJung-uk Kim 1309a159c266SJung-uk Kim void 1310a159c266SJung-uk Kim AcpiDbGenerateGpe ( 1311a159c266SJung-uk Kim char *GpeArg, 1312a159c266SJung-uk Kim char *BlockArg) 1313a159c266SJung-uk Kim { 1314313a0c13SJung-uk Kim UINT32 BlockNumber = 0; 1315a159c266SJung-uk Kim UINT32 GpeNumber; 1316a159c266SJung-uk Kim ACPI_GPE_EVENT_INFO *GpeEventInfo; 1317a159c266SJung-uk Kim 1318a159c266SJung-uk Kim 13195ef50723SJung-uk Kim GpeNumber = strtoul (GpeArg, NULL, 0); 1320a159c266SJung-uk Kim 1321313a0c13SJung-uk Kim /* 1322313a0c13SJung-uk Kim * If no block arg, or block arg == 0 or 1, use the FADT-defined 1323313a0c13SJung-uk Kim * GPE blocks. 1324313a0c13SJung-uk Kim */ 1325313a0c13SJung-uk Kim if (BlockArg) 1326313a0c13SJung-uk Kim { 13275ef50723SJung-uk Kim BlockNumber = strtoul (BlockArg, NULL, 0); 1328313a0c13SJung-uk Kim if (BlockNumber == 1) 1329313a0c13SJung-uk Kim { 1330313a0c13SJung-uk Kim BlockNumber = 0; 1331313a0c13SJung-uk Kim } 1332313a0c13SJung-uk Kim } 1333a159c266SJung-uk Kim 1334f8146b88SJung-uk Kim GpeEventInfo = AcpiEvGetGpeEventInfo ( 1335f8146b88SJung-uk Kim ACPI_TO_POINTER (BlockNumber), GpeNumber); 1336a159c266SJung-uk Kim if (!GpeEventInfo) 1337a159c266SJung-uk Kim { 1338a159c266SJung-uk Kim AcpiOsPrintf ("Invalid GPE\n"); 1339a159c266SJung-uk Kim return; 1340a159c266SJung-uk Kim } 1341a159c266SJung-uk Kim 1342a159c266SJung-uk Kim (void) AcpiEvGpeDispatch (NULL, GpeEventInfo, GpeNumber); 1343a159c266SJung-uk Kim } 134479c6d946SJung-uk Kim 134570e6ab8fSJung-uk Kim 134670e6ab8fSJung-uk Kim /******************************************************************************* 134770e6ab8fSJung-uk Kim * 134870e6ab8fSJung-uk Kim * FUNCTION: AcpiDbGenerateSci 134970e6ab8fSJung-uk Kim * 135070e6ab8fSJung-uk Kim * PARAMETERS: None 135170e6ab8fSJung-uk Kim * 135270e6ab8fSJung-uk Kim * RETURN: None 135370e6ab8fSJung-uk Kim * 135470e6ab8fSJung-uk Kim * DESCRIPTION: Simulate an SCI -- just call the SCI dispatch. 135570e6ab8fSJung-uk Kim * 135670e6ab8fSJung-uk Kim ******************************************************************************/ 135770e6ab8fSJung-uk Kim 135879c6d946SJung-uk Kim void 135979c6d946SJung-uk Kim AcpiDbGenerateSci ( 136079c6d946SJung-uk Kim void) 136179c6d946SJung-uk Kim { 136279c6d946SJung-uk Kim AcpiEvSciDispatch (); 136379c6d946SJung-uk Kim } 136479c6d946SJung-uk Kim 1365a159c266SJung-uk Kim #endif /* !ACPI_REDUCED_HARDWARE */ 1366a159c266SJung-uk Kim 1367fe0f0bbbSJung-uk Kim 1368fe0f0bbbSJung-uk Kim /******************************************************************************* 1369fe0f0bbbSJung-uk Kim * 1370fe0f0bbbSJung-uk Kim * FUNCTION: AcpiDbTrace 1371fe0f0bbbSJung-uk Kim * 1372fe0f0bbbSJung-uk Kim * PARAMETERS: EnableArg - ENABLE/AML to enable tracer 1373fe0f0bbbSJung-uk Kim * DISABLE to disable tracer 1374fe0f0bbbSJung-uk Kim * MethodArg - Method to trace 1375fe0f0bbbSJung-uk Kim * OnceArg - Whether trace once 1376fe0f0bbbSJung-uk Kim * 1377fe0f0bbbSJung-uk Kim * RETURN: None 1378fe0f0bbbSJung-uk Kim * 1379fe0f0bbbSJung-uk Kim * DESCRIPTION: Control method tracing facility 1380fe0f0bbbSJung-uk Kim * 1381fe0f0bbbSJung-uk Kim ******************************************************************************/ 1382fe0f0bbbSJung-uk Kim 1383fe0f0bbbSJung-uk Kim void 1384fe0f0bbbSJung-uk Kim AcpiDbTrace ( 1385fe0f0bbbSJung-uk Kim char *EnableArg, 1386fe0f0bbbSJung-uk Kim char *MethodArg, 1387fe0f0bbbSJung-uk Kim char *OnceArg) 1388fe0f0bbbSJung-uk Kim { 1389fe0f0bbbSJung-uk Kim UINT32 DebugLevel = 0; 1390fe0f0bbbSJung-uk Kim UINT32 DebugLayer = 0; 1391fe0f0bbbSJung-uk Kim UINT32 Flags = 0; 1392fe0f0bbbSJung-uk Kim 1393fe0f0bbbSJung-uk Kim 1394fe0f0bbbSJung-uk Kim AcpiUtStrupr (EnableArg); 1395fe0f0bbbSJung-uk Kim AcpiUtStrupr (OnceArg); 139670e6ab8fSJung-uk Kim 1397fe0f0bbbSJung-uk Kim if (MethodArg) 1398fe0f0bbbSJung-uk Kim { 1399fe0f0bbbSJung-uk Kim if (AcpiDbTraceMethodName) 1400fe0f0bbbSJung-uk Kim { 1401fe0f0bbbSJung-uk Kim ACPI_FREE (AcpiDbTraceMethodName); 1402fe0f0bbbSJung-uk Kim AcpiDbTraceMethodName = NULL; 1403fe0f0bbbSJung-uk Kim } 140470e6ab8fSJung-uk Kim 1405fe0f0bbbSJung-uk Kim AcpiDbTraceMethodName = ACPI_ALLOCATE (strlen (MethodArg) + 1); 1406fe0f0bbbSJung-uk Kim if (!AcpiDbTraceMethodName) 1407fe0f0bbbSJung-uk Kim { 140870e6ab8fSJung-uk Kim AcpiOsPrintf ("Failed to allocate method name (%s)\n", 140970e6ab8fSJung-uk Kim MethodArg); 1410fe0f0bbbSJung-uk Kim return; 1411fe0f0bbbSJung-uk Kim } 141270e6ab8fSJung-uk Kim 1413fe0f0bbbSJung-uk Kim strcpy (AcpiDbTraceMethodName, MethodArg); 1414fe0f0bbbSJung-uk Kim } 141570e6ab8fSJung-uk Kim 1416fe0f0bbbSJung-uk Kim if (!strcmp (EnableArg, "ENABLE") || 1417fe0f0bbbSJung-uk Kim !strcmp (EnableArg, "METHOD") || 1418fe0f0bbbSJung-uk Kim !strcmp (EnableArg, "OPCODE")) 1419fe0f0bbbSJung-uk Kim { 1420fe0f0bbbSJung-uk Kim if (!strcmp (EnableArg, "ENABLE")) 1421fe0f0bbbSJung-uk Kim { 1422fe0f0bbbSJung-uk Kim /* Inherit current console settings */ 1423fe0f0bbbSJung-uk Kim 1424fe0f0bbbSJung-uk Kim DebugLevel = AcpiGbl_DbConsoleDebugLevel; 1425fe0f0bbbSJung-uk Kim DebugLayer = AcpiDbgLayer; 1426fe0f0bbbSJung-uk Kim } 1427fe0f0bbbSJung-uk Kim else 1428fe0f0bbbSJung-uk Kim { 1429fe0f0bbbSJung-uk Kim /* Restrict console output to trace points only */ 1430fe0f0bbbSJung-uk Kim 1431fe0f0bbbSJung-uk Kim DebugLevel = ACPI_LV_TRACE_POINT; 1432fe0f0bbbSJung-uk Kim DebugLayer = ACPI_EXECUTER; 1433fe0f0bbbSJung-uk Kim } 1434fe0f0bbbSJung-uk Kim 1435fe0f0bbbSJung-uk Kim Flags = ACPI_TRACE_ENABLED; 143670e6ab8fSJung-uk Kim 1437fe0f0bbbSJung-uk Kim if (!strcmp (EnableArg, "OPCODE")) 1438fe0f0bbbSJung-uk Kim { 1439fe0f0bbbSJung-uk Kim Flags |= ACPI_TRACE_OPCODE; 1440fe0f0bbbSJung-uk Kim } 144170e6ab8fSJung-uk Kim 1442fe0f0bbbSJung-uk Kim if (OnceArg && !strcmp (OnceArg, "ONCE")) 1443fe0f0bbbSJung-uk Kim { 1444fe0f0bbbSJung-uk Kim Flags |= ACPI_TRACE_ONESHOT; 1445fe0f0bbbSJung-uk Kim } 1446fe0f0bbbSJung-uk Kim } 1447fe0f0bbbSJung-uk Kim 1448fe0f0bbbSJung-uk Kim (void) AcpiDebugTrace (AcpiDbTraceMethodName, 1449fe0f0bbbSJung-uk Kim DebugLevel, DebugLayer, Flags); 1450fe0f0bbbSJung-uk Kim } 1451