1db2bae30SDana Myers /****************************************************************************** 2db2bae30SDana Myers * 3db2bae30SDana Myers * Module Name: psxface - Parser external interfaces 4db2bae30SDana Myers * 5db2bae30SDana Myers *****************************************************************************/ 6db2bae30SDana Myers 726f3cdf0SGordon Ross /* 8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp. 9db2bae30SDana Myers * All rights reserved. 10db2bae30SDana Myers * 1126f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without 1226f3cdf0SGordon Ross * modification, are permitted provided that the following conditions 1326f3cdf0SGordon Ross * are met: 1426f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright 1526f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer, 1626f3cdf0SGordon Ross * without modification. 1726f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1826f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below 1926f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon 2026f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further 2126f3cdf0SGordon Ross * binary redistribution. 2226f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names 2326f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived 2426f3cdf0SGordon Ross * from this software without specific prior written permission. 25db2bae30SDana Myers * 2626f3cdf0SGordon Ross * Alternatively, this software may be distributed under the terms of the 2726f3cdf0SGordon Ross * GNU General Public License ("GPL") version 2 as published by the Free 2826f3cdf0SGordon Ross * Software Foundation. 29db2bae30SDana Myers * 3026f3cdf0SGordon Ross * NO WARRANTY 3126f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3226f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3326f3cdf0SGordon Ross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3426f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3526f3cdf0SGordon Ross * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3626f3cdf0SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3726f3cdf0SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3826f3cdf0SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3926f3cdf0SGordon Ross * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 4026f3cdf0SGordon Ross * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4126f3cdf0SGordon Ross * POSSIBILITY OF SUCH DAMAGES. 4226f3cdf0SGordon Ross */ 43db2bae30SDana Myers 44db2bae30SDana Myers #include "acpi.h" 45aa2aa9a6SDana Myers #include "accommon.h" 46db2bae30SDana Myers #include "acparser.h" 47db2bae30SDana Myers #include "acdispat.h" 48db2bae30SDana Myers #include "acinterp.h" 4926f3cdf0SGordon Ross #include "actables.h" 50*385cc6b4SJerry Jelinek #include "acnamesp.h" 51db2bae30SDana Myers 52db2bae30SDana Myers 53db2bae30SDana Myers #define _COMPONENT ACPI_PARSER 54db2bae30SDana Myers ACPI_MODULE_NAME ("psxface") 55db2bae30SDana Myers 56db2bae30SDana Myers /* Local Prototypes */ 57db2bae30SDana Myers 58db2bae30SDana Myers static void 59db2bae30SDana Myers AcpiPsUpdateParameterList ( 60db2bae30SDana Myers ACPI_EVALUATE_INFO *Info, 61db2bae30SDana Myers UINT16 Action); 62db2bae30SDana Myers 63db2bae30SDana Myers 64db2bae30SDana Myers /******************************************************************************* 65db2bae30SDana Myers * 66db2bae30SDana Myers * FUNCTION: AcpiDebugTrace 67db2bae30SDana Myers * 68db2bae30SDana Myers * PARAMETERS: MethodName - Valid ACPI name string 69db2bae30SDana Myers * DebugLevel - Optional level mask. 0 to use default 70db2bae30SDana Myers * DebugLayer - Optional layer mask. 0 to use default 71db2bae30SDana Myers * Flags - bit 1: one shot(1) or persistent(0) 72db2bae30SDana Myers * 73db2bae30SDana Myers * RETURN: Status 74db2bae30SDana Myers * 75db2bae30SDana Myers * DESCRIPTION: External interface to enable debug tracing during control 76db2bae30SDana Myers * method execution 77db2bae30SDana Myers * 78db2bae30SDana Myers ******************************************************************************/ 79db2bae30SDana Myers 80db2bae30SDana Myers ACPI_STATUS 81db2bae30SDana Myers AcpiDebugTrace ( 82*385cc6b4SJerry Jelinek const char *Name, 83db2bae30SDana Myers UINT32 DebugLevel, 84db2bae30SDana Myers UINT32 DebugLayer, 85db2bae30SDana Myers UINT32 Flags) 86db2bae30SDana Myers { 87db2bae30SDana Myers ACPI_STATUS Status; 88db2bae30SDana Myers 89db2bae30SDana Myers 90db2bae30SDana Myers Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); 91db2bae30SDana Myers if (ACPI_FAILURE (Status)) 92db2bae30SDana Myers { 93db2bae30SDana Myers return (Status); 94db2bae30SDana Myers } 95db2bae30SDana Myers 96*385cc6b4SJerry Jelinek AcpiGbl_TraceMethodName = Name; 97db2bae30SDana Myers AcpiGbl_TraceFlags = Flags; 98db2bae30SDana Myers AcpiGbl_TraceDbgLevel = DebugLevel; 99db2bae30SDana Myers AcpiGbl_TraceDbgLayer = DebugLayer; 100*385cc6b4SJerry Jelinek Status = AE_OK; 101db2bae30SDana Myers 102db2bae30SDana Myers (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); 103*385cc6b4SJerry Jelinek return (Status); 104db2bae30SDana Myers } 105db2bae30SDana Myers 106db2bae30SDana Myers 107db2bae30SDana Myers /******************************************************************************* 108db2bae30SDana Myers * 109db2bae30SDana Myers * FUNCTION: AcpiPsExecuteMethod 110db2bae30SDana Myers * 111db2bae30SDana Myers * PARAMETERS: Info - Method info block, contains: 112db2bae30SDana Myers * Node - Method Node to execute 113db2bae30SDana Myers * ObjDesc - Method object 114db2bae30SDana Myers * Parameters - List of parameters to pass to the method, 115db2bae30SDana Myers * terminated by NULL. Params itself may be 116db2bae30SDana Myers * NULL if no parameters are being passed. 117db2bae30SDana Myers * ReturnObject - Where to put method's return value (if 118db2bae30SDana Myers * any). If NULL, no value is returned. 119db2bae30SDana Myers * ParameterType - Type of Parameter list 120db2bae30SDana Myers * ReturnObject - Where to put method's return value (if 121db2bae30SDana Myers * any). If NULL, no value is returned. 122db2bae30SDana Myers * PassNumber - Parse or execute pass 123db2bae30SDana Myers * 124db2bae30SDana Myers * RETURN: Status 125db2bae30SDana Myers * 126db2bae30SDana Myers * DESCRIPTION: Execute a control method 127db2bae30SDana Myers * 128db2bae30SDana Myers ******************************************************************************/ 129db2bae30SDana Myers 130db2bae30SDana Myers ACPI_STATUS 131db2bae30SDana Myers AcpiPsExecuteMethod ( 132db2bae30SDana Myers ACPI_EVALUATE_INFO *Info) 133db2bae30SDana Myers { 134db2bae30SDana Myers ACPI_STATUS Status; 135db2bae30SDana Myers ACPI_PARSE_OBJECT *Op; 136db2bae30SDana Myers ACPI_WALK_STATE *WalkState; 137db2bae30SDana Myers 138db2bae30SDana Myers 139db2bae30SDana Myers ACPI_FUNCTION_TRACE (PsExecuteMethod); 140db2bae30SDana Myers 141db2bae30SDana Myers 14226f3cdf0SGordon Ross /* Quick validation of DSDT header */ 14326f3cdf0SGordon Ross 14426f3cdf0SGordon Ross AcpiTbCheckDsdtHeader (); 14526f3cdf0SGordon Ross 146db2bae30SDana Myers /* Validate the Info and method Node */ 147db2bae30SDana Myers 148*385cc6b4SJerry Jelinek if (!Info || !Info->Node) 149db2bae30SDana Myers { 150db2bae30SDana Myers return_ACPI_STATUS (AE_NULL_ENTRY); 151db2bae30SDana Myers } 152db2bae30SDana Myers 153db2bae30SDana Myers /* Init for new method, wait on concurrency semaphore */ 154db2bae30SDana Myers 155*385cc6b4SJerry Jelinek Status = AcpiDsBeginMethodExecution (Info->Node, Info->ObjDesc, NULL); 156db2bae30SDana Myers if (ACPI_FAILURE (Status)) 157db2bae30SDana Myers { 158db2bae30SDana Myers return_ACPI_STATUS (Status); 159db2bae30SDana Myers } 160db2bae30SDana Myers 161db2bae30SDana Myers /* 162db2bae30SDana Myers * The caller "owns" the parameters, so give each one an extra reference 163db2bae30SDana Myers */ 164db2bae30SDana Myers AcpiPsUpdateParameterList (Info, REF_INCREMENT); 165db2bae30SDana Myers 166db2bae30SDana Myers /* 167db2bae30SDana Myers * Execute the method. Performs parse simultaneously 168db2bae30SDana Myers */ 169db2bae30SDana Myers ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, 170db2bae30SDana Myers "**** Begin Method Parse/Execute [%4.4s] **** Node=%p Obj=%p\n", 171*385cc6b4SJerry Jelinek Info->Node->Name.Ascii, Info->Node, Info->ObjDesc)); 172db2bae30SDana Myers 173db2bae30SDana Myers /* Create and init a Root Node */ 174db2bae30SDana Myers 175*385cc6b4SJerry Jelinek Op = AcpiPsCreateScopeOp (Info->ObjDesc->Method.AmlStart); 176db2bae30SDana Myers if (!Op) 177db2bae30SDana Myers { 178db2bae30SDana Myers Status = AE_NO_MEMORY; 179db2bae30SDana Myers goto Cleanup; 180db2bae30SDana Myers } 181db2bae30SDana Myers 182db2bae30SDana Myers /* Create and initialize a new walk state */ 183db2bae30SDana Myers 184db2bae30SDana Myers Info->PassNumber = ACPI_IMODE_EXECUTE; 185db2bae30SDana Myers WalkState = AcpiDsCreateWalkState ( 186db2bae30SDana Myers Info->ObjDesc->Method.OwnerId, NULL, NULL, NULL); 187db2bae30SDana Myers if (!WalkState) 188db2bae30SDana Myers { 189db2bae30SDana Myers Status = AE_NO_MEMORY; 190db2bae30SDana Myers goto Cleanup; 191db2bae30SDana Myers } 192db2bae30SDana Myers 193*385cc6b4SJerry Jelinek Status = AcpiDsInitAmlWalk (WalkState, Op, Info->Node, 194db2bae30SDana Myers Info->ObjDesc->Method.AmlStart, 195db2bae30SDana Myers Info->ObjDesc->Method.AmlLength, Info, Info->PassNumber); 196db2bae30SDana Myers if (ACPI_FAILURE (Status)) 197db2bae30SDana Myers { 198db2bae30SDana Myers AcpiDsDeleteWalkState (WalkState); 199db2bae30SDana Myers goto Cleanup; 200db2bae30SDana Myers } 201db2bae30SDana Myers 20226f3cdf0SGordon Ross if (Info->ObjDesc->Method.InfoFlags & ACPI_METHOD_MODULE_LEVEL) 20357190917SDana Myers { 20457190917SDana Myers WalkState->ParseFlags |= ACPI_PARSE_MODULE_LEVEL; 20557190917SDana Myers } 20657190917SDana Myers 207aa2aa9a6SDana Myers /* Invoke an internal method if necessary */ 208aa2aa9a6SDana Myers 20926f3cdf0SGordon Ross if (Info->ObjDesc->Method.InfoFlags & ACPI_METHOD_INTERNAL_ONLY) 210aa2aa9a6SDana Myers { 21126f3cdf0SGordon Ross Status = Info->ObjDesc->Method.Dispatch.Implementation (WalkState); 212aa2aa9a6SDana Myers Info->ReturnObject = WalkState->ReturnDesc; 213aa2aa9a6SDana Myers 214aa2aa9a6SDana Myers /* Cleanup states */ 215aa2aa9a6SDana Myers 216aa2aa9a6SDana Myers AcpiDsScopeStackClear (WalkState); 217aa2aa9a6SDana Myers AcpiPsCleanupScope (&WalkState->ParserState); 218aa2aa9a6SDana Myers AcpiDsTerminateControlMethod (WalkState->MethodDesc, WalkState); 219aa2aa9a6SDana Myers AcpiDsDeleteWalkState (WalkState); 220aa2aa9a6SDana Myers goto Cleanup; 221aa2aa9a6SDana Myers } 222aa2aa9a6SDana Myers 223aa2aa9a6SDana Myers /* 224*385cc6b4SJerry Jelinek * Start method evaluation with an implicit return of zero. 225*385cc6b4SJerry Jelinek * This is done for Windows compatibility. 226aa2aa9a6SDana Myers */ 227aa2aa9a6SDana Myers if (AcpiGbl_EnableInterpreterSlack) 228aa2aa9a6SDana Myers { 229aa2aa9a6SDana Myers WalkState->ImplicitReturnObj = 23057190917SDana Myers AcpiUtCreateIntegerObject ((UINT64) 0); 231aa2aa9a6SDana Myers if (!WalkState->ImplicitReturnObj) 232aa2aa9a6SDana Myers { 233aa2aa9a6SDana Myers Status = AE_NO_MEMORY; 234aa2aa9a6SDana Myers AcpiDsDeleteWalkState (WalkState); 235aa2aa9a6SDana Myers goto Cleanup; 236aa2aa9a6SDana Myers } 237aa2aa9a6SDana Myers } 238aa2aa9a6SDana Myers 239db2bae30SDana Myers /* Parse the AML */ 240db2bae30SDana Myers 241db2bae30SDana Myers Status = AcpiPsParseAml (WalkState); 242db2bae30SDana Myers 243db2bae30SDana Myers /* WalkState was deleted by ParseAml */ 244db2bae30SDana Myers 245db2bae30SDana Myers Cleanup: 246db2bae30SDana Myers AcpiPsDeleteParseTree (Op); 247db2bae30SDana Myers 248db2bae30SDana Myers /* Take away the extra reference that we gave the parameters above */ 249db2bae30SDana Myers 250db2bae30SDana Myers AcpiPsUpdateParameterList (Info, REF_DECREMENT); 251db2bae30SDana Myers 252db2bae30SDana Myers /* Exit now if error above */ 253db2bae30SDana Myers 254db2bae30SDana Myers if (ACPI_FAILURE (Status)) 255db2bae30SDana Myers { 256db2bae30SDana Myers return_ACPI_STATUS (Status); 257db2bae30SDana Myers } 258db2bae30SDana Myers 259db2bae30SDana Myers /* 260db2bae30SDana Myers * If the method has returned an object, signal this to the caller with 261db2bae30SDana Myers * a control exception code 262db2bae30SDana Myers */ 263db2bae30SDana Myers if (Info->ReturnObject) 264db2bae30SDana Myers { 265db2bae30SDana Myers ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Method returned ObjDesc=%p\n", 266db2bae30SDana Myers Info->ReturnObject)); 267db2bae30SDana Myers ACPI_DUMP_STACK_ENTRY (Info->ReturnObject); 268db2bae30SDana Myers 269db2bae30SDana Myers Status = AE_CTRL_RETURN_VALUE; 270db2bae30SDana Myers } 271db2bae30SDana Myers 272db2bae30SDana Myers return_ACPI_STATUS (Status); 273db2bae30SDana Myers } 274db2bae30SDana Myers 275db2bae30SDana Myers 276db2bae30SDana Myers /******************************************************************************* 277db2bae30SDana Myers * 278db2bae30SDana Myers * FUNCTION: AcpiPsUpdateParameterList 279db2bae30SDana Myers * 280db2bae30SDana Myers * PARAMETERS: Info - See ACPI_EVALUATE_INFO 281db2bae30SDana Myers * (Used: ParameterType and Parameters) 282db2bae30SDana Myers * Action - Add or Remove reference 283db2bae30SDana Myers * 284db2bae30SDana Myers * RETURN: Status 285db2bae30SDana Myers * 286db2bae30SDana Myers * DESCRIPTION: Update reference count on all method parameter objects 287db2bae30SDana Myers * 288db2bae30SDana Myers ******************************************************************************/ 289db2bae30SDana Myers 290db2bae30SDana Myers static void 291db2bae30SDana Myers AcpiPsUpdateParameterList ( 292db2bae30SDana Myers ACPI_EVALUATE_INFO *Info, 293db2bae30SDana Myers UINT16 Action) 294db2bae30SDana Myers { 295db2bae30SDana Myers UINT32 i; 296db2bae30SDana Myers 297db2bae30SDana Myers 298db2bae30SDana Myers if (Info->Parameters) 299db2bae30SDana Myers { 300db2bae30SDana Myers /* Update reference count for each parameter */ 301db2bae30SDana Myers 302db2bae30SDana Myers for (i = 0; Info->Parameters[i]; i++) 303db2bae30SDana Myers { 304db2bae30SDana Myers /* Ignore errors, just do them all */ 305db2bae30SDana Myers 306*385cc6b4SJerry Jelinek (void) AcpiUtUpdateObjectReference ( 307*385cc6b4SJerry Jelinek Info->Parameters[i], Action); 308db2bae30SDana Myers } 309db2bae30SDana Myers } 310db2bae30SDana Myers } 311