1*a159c266SJung-uk Kim 2*a159c266SJung-uk Kim /****************************************************************************** 3*a159c266SJung-uk Kim * 4*a159c266SJung-uk Kim * Module Name: exsystem - Interface to OS services 5*a159c266SJung-uk Kim * 6*a159c266SJung-uk Kim *****************************************************************************/ 7*a159c266SJung-uk Kim 8*a159c266SJung-uk Kim /* 9*a159c266SJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 10*a159c266SJung-uk Kim * All rights reserved. 11*a159c266SJung-uk Kim * 12*a159c266SJung-uk Kim * Redistribution and use in source and binary forms, with or without 13*a159c266SJung-uk Kim * modification, are permitted provided that the following conditions 14*a159c266SJung-uk Kim * are met: 15*a159c266SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 16*a159c266SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 17*a159c266SJung-uk Kim * without modification. 18*a159c266SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19*a159c266SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 20*a159c266SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 21*a159c266SJung-uk Kim * including a substantially similar Disclaimer requirement for further 22*a159c266SJung-uk Kim * binary redistribution. 23*a159c266SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 24*a159c266SJung-uk Kim * of any contributors may be used to endorse or promote products derived 25*a159c266SJung-uk Kim * from this software without specific prior written permission. 26*a159c266SJung-uk Kim * 27*a159c266SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 28*a159c266SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 29*a159c266SJung-uk Kim * Software Foundation. 30*a159c266SJung-uk Kim * 31*a159c266SJung-uk Kim * NO WARRANTY 32*a159c266SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33*a159c266SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34*a159c266SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35*a159c266SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36*a159c266SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37*a159c266SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38*a159c266SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39*a159c266SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40*a159c266SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41*a159c266SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42*a159c266SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 43*a159c266SJung-uk Kim */ 44*a159c266SJung-uk Kim 45*a159c266SJung-uk Kim #define __EXSYSTEM_C__ 46*a159c266SJung-uk Kim 47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 48*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 49*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acinterp.h> 50*a159c266SJung-uk Kim 51*a159c266SJung-uk Kim #define _COMPONENT ACPI_EXECUTER 52*a159c266SJung-uk Kim ACPI_MODULE_NAME ("exsystem") 53*a159c266SJung-uk Kim 54*a159c266SJung-uk Kim 55*a159c266SJung-uk Kim /******************************************************************************* 56*a159c266SJung-uk Kim * 57*a159c266SJung-uk Kim * FUNCTION: AcpiExSystemWaitSemaphore 58*a159c266SJung-uk Kim * 59*a159c266SJung-uk Kim * PARAMETERS: Semaphore - Semaphore to wait on 60*a159c266SJung-uk Kim * Timeout - Max time to wait 61*a159c266SJung-uk Kim * 62*a159c266SJung-uk Kim * RETURN: Status 63*a159c266SJung-uk Kim * 64*a159c266SJung-uk Kim * DESCRIPTION: Implements a semaphore wait with a check to see if the 65*a159c266SJung-uk Kim * semaphore is available immediately. If it is not, the 66*a159c266SJung-uk Kim * interpreter is released before waiting. 67*a159c266SJung-uk Kim * 68*a159c266SJung-uk Kim ******************************************************************************/ 69*a159c266SJung-uk Kim 70*a159c266SJung-uk Kim ACPI_STATUS 71*a159c266SJung-uk Kim AcpiExSystemWaitSemaphore ( 72*a159c266SJung-uk Kim ACPI_SEMAPHORE Semaphore, 73*a159c266SJung-uk Kim UINT16 Timeout) 74*a159c266SJung-uk Kim { 75*a159c266SJung-uk Kim ACPI_STATUS Status; 76*a159c266SJung-uk Kim 77*a159c266SJung-uk Kim 78*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (ExSystemWaitSemaphore); 79*a159c266SJung-uk Kim 80*a159c266SJung-uk Kim 81*a159c266SJung-uk Kim Status = AcpiOsWaitSemaphore (Semaphore, 1, ACPI_DO_NOT_WAIT); 82*a159c266SJung-uk Kim if (ACPI_SUCCESS (Status)) 83*a159c266SJung-uk Kim { 84*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 85*a159c266SJung-uk Kim } 86*a159c266SJung-uk Kim 87*a159c266SJung-uk Kim if (Status == AE_TIME) 88*a159c266SJung-uk Kim { 89*a159c266SJung-uk Kim /* We must wait, so unlock the interpreter */ 90*a159c266SJung-uk Kim 91*a159c266SJung-uk Kim AcpiExRelinquishInterpreter (); 92*a159c266SJung-uk Kim 93*a159c266SJung-uk Kim Status = AcpiOsWaitSemaphore (Semaphore, 1, Timeout); 94*a159c266SJung-uk Kim 95*a159c266SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 96*a159c266SJung-uk Kim "*** Thread awake after blocking, %s\n", 97*a159c266SJung-uk Kim AcpiFormatException (Status))); 98*a159c266SJung-uk Kim 99*a159c266SJung-uk Kim /* Reacquire the interpreter */ 100*a159c266SJung-uk Kim 101*a159c266SJung-uk Kim AcpiExReacquireInterpreter (); 102*a159c266SJung-uk Kim } 103*a159c266SJung-uk Kim 104*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 105*a159c266SJung-uk Kim } 106*a159c266SJung-uk Kim 107*a159c266SJung-uk Kim 108*a159c266SJung-uk Kim /******************************************************************************* 109*a159c266SJung-uk Kim * 110*a159c266SJung-uk Kim * FUNCTION: AcpiExSystemWaitMutex 111*a159c266SJung-uk Kim * 112*a159c266SJung-uk Kim * PARAMETERS: Mutex - Mutex to wait on 113*a159c266SJung-uk Kim * Timeout - Max time to wait 114*a159c266SJung-uk Kim * 115*a159c266SJung-uk Kim * RETURN: Status 116*a159c266SJung-uk Kim * 117*a159c266SJung-uk Kim * DESCRIPTION: Implements a mutex wait with a check to see if the 118*a159c266SJung-uk Kim * mutex is available immediately. If it is not, the 119*a159c266SJung-uk Kim * interpreter is released before waiting. 120*a159c266SJung-uk Kim * 121*a159c266SJung-uk Kim ******************************************************************************/ 122*a159c266SJung-uk Kim 123*a159c266SJung-uk Kim ACPI_STATUS 124*a159c266SJung-uk Kim AcpiExSystemWaitMutex ( 125*a159c266SJung-uk Kim ACPI_MUTEX Mutex, 126*a159c266SJung-uk Kim UINT16 Timeout) 127*a159c266SJung-uk Kim { 128*a159c266SJung-uk Kim ACPI_STATUS Status; 129*a159c266SJung-uk Kim 130*a159c266SJung-uk Kim 131*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (ExSystemWaitMutex); 132*a159c266SJung-uk Kim 133*a159c266SJung-uk Kim 134*a159c266SJung-uk Kim Status = AcpiOsAcquireMutex (Mutex, ACPI_DO_NOT_WAIT); 135*a159c266SJung-uk Kim if (ACPI_SUCCESS (Status)) 136*a159c266SJung-uk Kim { 137*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 138*a159c266SJung-uk Kim } 139*a159c266SJung-uk Kim 140*a159c266SJung-uk Kim if (Status == AE_TIME) 141*a159c266SJung-uk Kim { 142*a159c266SJung-uk Kim /* We must wait, so unlock the interpreter */ 143*a159c266SJung-uk Kim 144*a159c266SJung-uk Kim AcpiExRelinquishInterpreter (); 145*a159c266SJung-uk Kim 146*a159c266SJung-uk Kim Status = AcpiOsAcquireMutex (Mutex, Timeout); 147*a159c266SJung-uk Kim 148*a159c266SJung-uk Kim ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, 149*a159c266SJung-uk Kim "*** Thread awake after blocking, %s\n", 150*a159c266SJung-uk Kim AcpiFormatException (Status))); 151*a159c266SJung-uk Kim 152*a159c266SJung-uk Kim /* Reacquire the interpreter */ 153*a159c266SJung-uk Kim 154*a159c266SJung-uk Kim AcpiExReacquireInterpreter (); 155*a159c266SJung-uk Kim } 156*a159c266SJung-uk Kim 157*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 158*a159c266SJung-uk Kim } 159*a159c266SJung-uk Kim 160*a159c266SJung-uk Kim 161*a159c266SJung-uk Kim /******************************************************************************* 162*a159c266SJung-uk Kim * 163*a159c266SJung-uk Kim * FUNCTION: AcpiExSystemDoStall 164*a159c266SJung-uk Kim * 165*a159c266SJung-uk Kim * PARAMETERS: HowLong - The amount of time to stall, 166*a159c266SJung-uk Kim * in microseconds 167*a159c266SJung-uk Kim * 168*a159c266SJung-uk Kim * RETURN: Status 169*a159c266SJung-uk Kim * 170*a159c266SJung-uk Kim * DESCRIPTION: Suspend running thread for specified amount of time. 171*a159c266SJung-uk Kim * Note: ACPI specification requires that Stall() does not 172*a159c266SJung-uk Kim * relinquish the processor, and delays longer than 100 usec 173*a159c266SJung-uk Kim * should use Sleep() instead. We allow stalls up to 255 usec 174*a159c266SJung-uk Kim * for compatibility with other interpreters and existing BIOSs. 175*a159c266SJung-uk Kim * 176*a159c266SJung-uk Kim ******************************************************************************/ 177*a159c266SJung-uk Kim 178*a159c266SJung-uk Kim ACPI_STATUS 179*a159c266SJung-uk Kim AcpiExSystemDoStall ( 180*a159c266SJung-uk Kim UINT32 HowLong) 181*a159c266SJung-uk Kim { 182*a159c266SJung-uk Kim ACPI_STATUS Status = AE_OK; 183*a159c266SJung-uk Kim 184*a159c266SJung-uk Kim 185*a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 186*a159c266SJung-uk Kim 187*a159c266SJung-uk Kim 188*a159c266SJung-uk Kim if (HowLong > 255) /* 255 microseconds */ 189*a159c266SJung-uk Kim { 190*a159c266SJung-uk Kim /* 191*a159c266SJung-uk Kim * Longer than 255 usec, this is an error 192*a159c266SJung-uk Kim * 193*a159c266SJung-uk Kim * (ACPI specifies 100 usec as max, but this gives some slack in 194*a159c266SJung-uk Kim * order to support existing BIOSs) 195*a159c266SJung-uk Kim */ 196*a159c266SJung-uk Kim ACPI_ERROR ((AE_INFO, "Time parameter is too large (%u)", 197*a159c266SJung-uk Kim HowLong)); 198*a159c266SJung-uk Kim Status = AE_AML_OPERAND_VALUE; 199*a159c266SJung-uk Kim } 200*a159c266SJung-uk Kim else 201*a159c266SJung-uk Kim { 202*a159c266SJung-uk Kim AcpiOsStall (HowLong); 203*a159c266SJung-uk Kim } 204*a159c266SJung-uk Kim 205*a159c266SJung-uk Kim return (Status); 206*a159c266SJung-uk Kim } 207*a159c266SJung-uk Kim 208*a159c266SJung-uk Kim 209*a159c266SJung-uk Kim /******************************************************************************* 210*a159c266SJung-uk Kim * 211*a159c266SJung-uk Kim * FUNCTION: AcpiExSystemDoSleep 212*a159c266SJung-uk Kim * 213*a159c266SJung-uk Kim * PARAMETERS: HowLong - The amount of time to sleep, 214*a159c266SJung-uk Kim * in milliseconds 215*a159c266SJung-uk Kim * 216*a159c266SJung-uk Kim * RETURN: None 217*a159c266SJung-uk Kim * 218*a159c266SJung-uk Kim * DESCRIPTION: Sleep the running thread for specified amount of time. 219*a159c266SJung-uk Kim * 220*a159c266SJung-uk Kim ******************************************************************************/ 221*a159c266SJung-uk Kim 222*a159c266SJung-uk Kim ACPI_STATUS 223*a159c266SJung-uk Kim AcpiExSystemDoSleep ( 224*a159c266SJung-uk Kim UINT64 HowLong) 225*a159c266SJung-uk Kim { 226*a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 227*a159c266SJung-uk Kim 228*a159c266SJung-uk Kim 229*a159c266SJung-uk Kim /* Since this thread will sleep, we must release the interpreter */ 230*a159c266SJung-uk Kim 231*a159c266SJung-uk Kim AcpiExRelinquishInterpreter (); 232*a159c266SJung-uk Kim 233*a159c266SJung-uk Kim /* 234*a159c266SJung-uk Kim * For compatibility with other ACPI implementations and to prevent 235*a159c266SJung-uk Kim * accidental deep sleeps, limit the sleep time to something reasonable. 236*a159c266SJung-uk Kim */ 237*a159c266SJung-uk Kim if (HowLong > ACPI_MAX_SLEEP) 238*a159c266SJung-uk Kim { 239*a159c266SJung-uk Kim HowLong = ACPI_MAX_SLEEP; 240*a159c266SJung-uk Kim } 241*a159c266SJung-uk Kim 242*a159c266SJung-uk Kim AcpiOsSleep (HowLong); 243*a159c266SJung-uk Kim 244*a159c266SJung-uk Kim /* And now we must get the interpreter again */ 245*a159c266SJung-uk Kim 246*a159c266SJung-uk Kim AcpiExReacquireInterpreter (); 247*a159c266SJung-uk Kim return (AE_OK); 248*a159c266SJung-uk Kim } 249*a159c266SJung-uk Kim 250*a159c266SJung-uk Kim 251*a159c266SJung-uk Kim /******************************************************************************* 252*a159c266SJung-uk Kim * 253*a159c266SJung-uk Kim * FUNCTION: AcpiExSystemSignalEvent 254*a159c266SJung-uk Kim * 255*a159c266SJung-uk Kim * PARAMETERS: ObjDesc - The object descriptor for this op 256*a159c266SJung-uk Kim * 257*a159c266SJung-uk Kim * RETURN: Status 258*a159c266SJung-uk Kim * 259*a159c266SJung-uk Kim * DESCRIPTION: Provides an access point to perform synchronization operations 260*a159c266SJung-uk Kim * within the AML. 261*a159c266SJung-uk Kim * 262*a159c266SJung-uk Kim ******************************************************************************/ 263*a159c266SJung-uk Kim 264*a159c266SJung-uk Kim ACPI_STATUS 265*a159c266SJung-uk Kim AcpiExSystemSignalEvent ( 266*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *ObjDesc) 267*a159c266SJung-uk Kim { 268*a159c266SJung-uk Kim ACPI_STATUS Status = AE_OK; 269*a159c266SJung-uk Kim 270*a159c266SJung-uk Kim 271*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (ExSystemSignalEvent); 272*a159c266SJung-uk Kim 273*a159c266SJung-uk Kim 274*a159c266SJung-uk Kim if (ObjDesc) 275*a159c266SJung-uk Kim { 276*a159c266SJung-uk Kim Status = AcpiOsSignalSemaphore (ObjDesc->Event.OsSemaphore, 1); 277*a159c266SJung-uk Kim } 278*a159c266SJung-uk Kim 279*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 280*a159c266SJung-uk Kim } 281*a159c266SJung-uk Kim 282*a159c266SJung-uk Kim 283*a159c266SJung-uk Kim /******************************************************************************* 284*a159c266SJung-uk Kim * 285*a159c266SJung-uk Kim * FUNCTION: AcpiExSystemWaitEvent 286*a159c266SJung-uk Kim * 287*a159c266SJung-uk Kim * PARAMETERS: TimeDesc - The 'time to delay' object descriptor 288*a159c266SJung-uk Kim * ObjDesc - The object descriptor for this op 289*a159c266SJung-uk Kim * 290*a159c266SJung-uk Kim * RETURN: Status 291*a159c266SJung-uk Kim * 292*a159c266SJung-uk Kim * DESCRIPTION: Provides an access point to perform synchronization operations 293*a159c266SJung-uk Kim * within the AML. This operation is a request to wait for an 294*a159c266SJung-uk Kim * event. 295*a159c266SJung-uk Kim * 296*a159c266SJung-uk Kim ******************************************************************************/ 297*a159c266SJung-uk Kim 298*a159c266SJung-uk Kim ACPI_STATUS 299*a159c266SJung-uk Kim AcpiExSystemWaitEvent ( 300*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *TimeDesc, 301*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *ObjDesc) 302*a159c266SJung-uk Kim { 303*a159c266SJung-uk Kim ACPI_STATUS Status = AE_OK; 304*a159c266SJung-uk Kim 305*a159c266SJung-uk Kim 306*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (ExSystemWaitEvent); 307*a159c266SJung-uk Kim 308*a159c266SJung-uk Kim 309*a159c266SJung-uk Kim if (ObjDesc) 310*a159c266SJung-uk Kim { 311*a159c266SJung-uk Kim Status = AcpiExSystemWaitSemaphore (ObjDesc->Event.OsSemaphore, 312*a159c266SJung-uk Kim (UINT16) TimeDesc->Integer.Value); 313*a159c266SJung-uk Kim } 314*a159c266SJung-uk Kim 315*a159c266SJung-uk Kim return_ACPI_STATUS (Status); 316*a159c266SJung-uk Kim } 317*a159c266SJung-uk Kim 318*a159c266SJung-uk Kim 319*a159c266SJung-uk Kim /******************************************************************************* 320*a159c266SJung-uk Kim * 321*a159c266SJung-uk Kim * FUNCTION: AcpiExSystemResetEvent 322*a159c266SJung-uk Kim * 323*a159c266SJung-uk Kim * PARAMETERS: ObjDesc - The object descriptor for this op 324*a159c266SJung-uk Kim * 325*a159c266SJung-uk Kim * RETURN: Status 326*a159c266SJung-uk Kim * 327*a159c266SJung-uk Kim * DESCRIPTION: Reset an event to a known state. 328*a159c266SJung-uk Kim * 329*a159c266SJung-uk Kim ******************************************************************************/ 330*a159c266SJung-uk Kim 331*a159c266SJung-uk Kim ACPI_STATUS 332*a159c266SJung-uk Kim AcpiExSystemResetEvent ( 333*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *ObjDesc) 334*a159c266SJung-uk Kim { 335*a159c266SJung-uk Kim ACPI_STATUS Status = AE_OK; 336*a159c266SJung-uk Kim ACPI_SEMAPHORE TempSemaphore; 337*a159c266SJung-uk Kim 338*a159c266SJung-uk Kim 339*a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 340*a159c266SJung-uk Kim 341*a159c266SJung-uk Kim 342*a159c266SJung-uk Kim /* 343*a159c266SJung-uk Kim * We are going to simply delete the existing semaphore and 344*a159c266SJung-uk Kim * create a new one! 345*a159c266SJung-uk Kim */ 346*a159c266SJung-uk Kim Status = AcpiOsCreateSemaphore (ACPI_NO_UNIT_LIMIT, 0, &TempSemaphore); 347*a159c266SJung-uk Kim if (ACPI_SUCCESS (Status)) 348*a159c266SJung-uk Kim { 349*a159c266SJung-uk Kim (void) AcpiOsDeleteSemaphore (ObjDesc->Event.OsSemaphore); 350*a159c266SJung-uk Kim ObjDesc->Event.OsSemaphore = TempSemaphore; 351*a159c266SJung-uk Kim } 352*a159c266SJung-uk Kim 353*a159c266SJung-uk Kim return (Status); 354*a159c266SJung-uk Kim } 355*a159c266SJung-uk Kim 356