1*a159c266SJung-uk Kim 2*a159c266SJung-uk Kim /****************************************************************************** 3*a159c266SJung-uk Kim * 4*a159c266SJung-uk Kim * Module Name: exutils - interpreter/scanner utilities 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 __EXUTILS_C__ 46*a159c266SJung-uk Kim 47*a159c266SJung-uk Kim /* 48*a159c266SJung-uk Kim * DEFINE_AML_GLOBALS is tested in amlcode.h 49*a159c266SJung-uk Kim * to determine whether certain global names should be "defined" or only 50*a159c266SJung-uk Kim * "declared" in the current compilation. This enhances maintainability 51*a159c266SJung-uk Kim * by enabling a single header file to embody all knowledge of the names 52*a159c266SJung-uk Kim * in question. 53*a159c266SJung-uk Kim * 54*a159c266SJung-uk Kim * Exactly one module of any executable should #define DEFINE_GLOBALS 55*a159c266SJung-uk Kim * before #including the header files which use this convention. The 56*a159c266SJung-uk Kim * names in question will be defined and initialized in that module, 57*a159c266SJung-uk Kim * and declared as extern in all other modules which #include those 58*a159c266SJung-uk Kim * header files. 59*a159c266SJung-uk Kim */ 60*a159c266SJung-uk Kim 61*a159c266SJung-uk Kim #define DEFINE_AML_GLOBALS 62*a159c266SJung-uk Kim 63*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 64*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 65*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acinterp.h> 66*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 67*a159c266SJung-uk Kim 68*a159c266SJung-uk Kim #define _COMPONENT ACPI_EXECUTER 69*a159c266SJung-uk Kim ACPI_MODULE_NAME ("exutils") 70*a159c266SJung-uk Kim 71*a159c266SJung-uk Kim /* Local prototypes */ 72*a159c266SJung-uk Kim 73*a159c266SJung-uk Kim static UINT32 74*a159c266SJung-uk Kim AcpiExDigitsNeeded ( 75*a159c266SJung-uk Kim UINT64 Value, 76*a159c266SJung-uk Kim UINT32 Base); 77*a159c266SJung-uk Kim 78*a159c266SJung-uk Kim 79*a159c266SJung-uk Kim #ifndef ACPI_NO_METHOD_EXECUTION 80*a159c266SJung-uk Kim /******************************************************************************* 81*a159c266SJung-uk Kim * 82*a159c266SJung-uk Kim * FUNCTION: AcpiExEnterInterpreter 83*a159c266SJung-uk Kim * 84*a159c266SJung-uk Kim * PARAMETERS: None 85*a159c266SJung-uk Kim * 86*a159c266SJung-uk Kim * RETURN: None 87*a159c266SJung-uk Kim * 88*a159c266SJung-uk Kim * DESCRIPTION: Enter the interpreter execution region. Failure to enter 89*a159c266SJung-uk Kim * the interpreter region is a fatal system error. Used in 90*a159c266SJung-uk Kim * conjunction with ExitInterpreter. 91*a159c266SJung-uk Kim * 92*a159c266SJung-uk Kim ******************************************************************************/ 93*a159c266SJung-uk Kim 94*a159c266SJung-uk Kim void 95*a159c266SJung-uk Kim AcpiExEnterInterpreter ( 96*a159c266SJung-uk Kim void) 97*a159c266SJung-uk Kim { 98*a159c266SJung-uk Kim ACPI_STATUS Status; 99*a159c266SJung-uk Kim 100*a159c266SJung-uk Kim 101*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (ExEnterInterpreter); 102*a159c266SJung-uk Kim 103*a159c266SJung-uk Kim 104*a159c266SJung-uk Kim Status = AcpiUtAcquireMutex (ACPI_MTX_INTERPRETER); 105*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 106*a159c266SJung-uk Kim { 107*a159c266SJung-uk Kim ACPI_ERROR ((AE_INFO, "Could not acquire AML Interpreter mutex")); 108*a159c266SJung-uk Kim } 109*a159c266SJung-uk Kim 110*a159c266SJung-uk Kim return_VOID; 111*a159c266SJung-uk Kim } 112*a159c266SJung-uk Kim 113*a159c266SJung-uk Kim 114*a159c266SJung-uk Kim /******************************************************************************* 115*a159c266SJung-uk Kim * 116*a159c266SJung-uk Kim * FUNCTION: AcpiExReacquireInterpreter 117*a159c266SJung-uk Kim * 118*a159c266SJung-uk Kim * PARAMETERS: None 119*a159c266SJung-uk Kim * 120*a159c266SJung-uk Kim * RETURN: None 121*a159c266SJung-uk Kim * 122*a159c266SJung-uk Kim * DESCRIPTION: Reacquire the interpreter execution region from within the 123*a159c266SJung-uk Kim * interpreter code. Failure to enter the interpreter region is a 124*a159c266SJung-uk Kim * fatal system error. Used in conjuction with 125*a159c266SJung-uk Kim * RelinquishInterpreter 126*a159c266SJung-uk Kim * 127*a159c266SJung-uk Kim ******************************************************************************/ 128*a159c266SJung-uk Kim 129*a159c266SJung-uk Kim void 130*a159c266SJung-uk Kim AcpiExReacquireInterpreter ( 131*a159c266SJung-uk Kim void) 132*a159c266SJung-uk Kim { 133*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (ExReacquireInterpreter); 134*a159c266SJung-uk Kim 135*a159c266SJung-uk Kim 136*a159c266SJung-uk Kim /* 137*a159c266SJung-uk Kim * If the global serialized flag is set, do not release the interpreter, 138*a159c266SJung-uk Kim * since it was not actually released by AcpiExRelinquishInterpreter. 139*a159c266SJung-uk Kim * This forces the interpreter to be single threaded. 140*a159c266SJung-uk Kim */ 141*a159c266SJung-uk Kim if (!AcpiGbl_AllMethodsSerialized) 142*a159c266SJung-uk Kim { 143*a159c266SJung-uk Kim AcpiExEnterInterpreter (); 144*a159c266SJung-uk Kim } 145*a159c266SJung-uk Kim 146*a159c266SJung-uk Kim return_VOID; 147*a159c266SJung-uk Kim } 148*a159c266SJung-uk Kim 149*a159c266SJung-uk Kim 150*a159c266SJung-uk Kim /******************************************************************************* 151*a159c266SJung-uk Kim * 152*a159c266SJung-uk Kim * FUNCTION: AcpiExExitInterpreter 153*a159c266SJung-uk Kim * 154*a159c266SJung-uk Kim * PARAMETERS: None 155*a159c266SJung-uk Kim * 156*a159c266SJung-uk Kim * RETURN: None 157*a159c266SJung-uk Kim * 158*a159c266SJung-uk Kim * DESCRIPTION: Exit the interpreter execution region. This is the top level 159*a159c266SJung-uk Kim * routine used to exit the interpreter when all processing has 160*a159c266SJung-uk Kim * been completed. 161*a159c266SJung-uk Kim * 162*a159c266SJung-uk Kim ******************************************************************************/ 163*a159c266SJung-uk Kim 164*a159c266SJung-uk Kim void 165*a159c266SJung-uk Kim AcpiExExitInterpreter ( 166*a159c266SJung-uk Kim void) 167*a159c266SJung-uk Kim { 168*a159c266SJung-uk Kim ACPI_STATUS Status; 169*a159c266SJung-uk Kim 170*a159c266SJung-uk Kim 171*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (ExExitInterpreter); 172*a159c266SJung-uk Kim 173*a159c266SJung-uk Kim 174*a159c266SJung-uk Kim Status = AcpiUtReleaseMutex (ACPI_MTX_INTERPRETER); 175*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 176*a159c266SJung-uk Kim { 177*a159c266SJung-uk Kim ACPI_ERROR ((AE_INFO, "Could not release AML Interpreter mutex")); 178*a159c266SJung-uk Kim } 179*a159c266SJung-uk Kim 180*a159c266SJung-uk Kim return_VOID; 181*a159c266SJung-uk Kim } 182*a159c266SJung-uk Kim 183*a159c266SJung-uk Kim 184*a159c266SJung-uk Kim /******************************************************************************* 185*a159c266SJung-uk Kim * 186*a159c266SJung-uk Kim * FUNCTION: AcpiExRelinquishInterpreter 187*a159c266SJung-uk Kim * 188*a159c266SJung-uk Kim * PARAMETERS: None 189*a159c266SJung-uk Kim * 190*a159c266SJung-uk Kim * RETURN: None 191*a159c266SJung-uk Kim * 192*a159c266SJung-uk Kim * DESCRIPTION: Exit the interpreter execution region, from within the 193*a159c266SJung-uk Kim * interpreter - before attempting an operation that will possibly 194*a159c266SJung-uk Kim * block the running thread. 195*a159c266SJung-uk Kim * 196*a159c266SJung-uk Kim * Cases where the interpreter is unlocked internally 197*a159c266SJung-uk Kim * 1) Method to be blocked on a Sleep() AML opcode 198*a159c266SJung-uk Kim * 2) Method to be blocked on an Acquire() AML opcode 199*a159c266SJung-uk Kim * 3) Method to be blocked on a Wait() AML opcode 200*a159c266SJung-uk Kim * 4) Method to be blocked to acquire the global lock 201*a159c266SJung-uk Kim * 5) Method to be blocked waiting to execute a serialized control method 202*a159c266SJung-uk Kim * that is currently executing 203*a159c266SJung-uk Kim * 6) About to invoke a user-installed opregion handler 204*a159c266SJung-uk Kim * 205*a159c266SJung-uk Kim ******************************************************************************/ 206*a159c266SJung-uk Kim 207*a159c266SJung-uk Kim void 208*a159c266SJung-uk Kim AcpiExRelinquishInterpreter ( 209*a159c266SJung-uk Kim void) 210*a159c266SJung-uk Kim { 211*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (ExRelinquishInterpreter); 212*a159c266SJung-uk Kim 213*a159c266SJung-uk Kim 214*a159c266SJung-uk Kim /* 215*a159c266SJung-uk Kim * If the global serialized flag is set, do not release the interpreter. 216*a159c266SJung-uk Kim * This forces the interpreter to be single threaded. 217*a159c266SJung-uk Kim */ 218*a159c266SJung-uk Kim if (!AcpiGbl_AllMethodsSerialized) 219*a159c266SJung-uk Kim { 220*a159c266SJung-uk Kim AcpiExExitInterpreter (); 221*a159c266SJung-uk Kim } 222*a159c266SJung-uk Kim 223*a159c266SJung-uk Kim return_VOID; 224*a159c266SJung-uk Kim } 225*a159c266SJung-uk Kim 226*a159c266SJung-uk Kim 227*a159c266SJung-uk Kim /******************************************************************************* 228*a159c266SJung-uk Kim * 229*a159c266SJung-uk Kim * FUNCTION: AcpiExTruncateFor32bitTable 230*a159c266SJung-uk Kim * 231*a159c266SJung-uk Kim * PARAMETERS: ObjDesc - Object to be truncated 232*a159c266SJung-uk Kim * 233*a159c266SJung-uk Kim * RETURN: none 234*a159c266SJung-uk Kim * 235*a159c266SJung-uk Kim * DESCRIPTION: Truncate an ACPI Integer to 32 bits if the execution mode is 236*a159c266SJung-uk Kim * 32-bit, as determined by the revision of the DSDT. 237*a159c266SJung-uk Kim * 238*a159c266SJung-uk Kim ******************************************************************************/ 239*a159c266SJung-uk Kim 240*a159c266SJung-uk Kim void 241*a159c266SJung-uk Kim AcpiExTruncateFor32bitTable ( 242*a159c266SJung-uk Kim ACPI_OPERAND_OBJECT *ObjDesc) 243*a159c266SJung-uk Kim { 244*a159c266SJung-uk Kim 245*a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 246*a159c266SJung-uk Kim 247*a159c266SJung-uk Kim 248*a159c266SJung-uk Kim /* 249*a159c266SJung-uk Kim * Object must be a valid number and we must be executing 250*a159c266SJung-uk Kim * a control method. NS node could be there for AML_INT_NAMEPATH_OP. 251*a159c266SJung-uk Kim */ 252*a159c266SJung-uk Kim if ((!ObjDesc) || 253*a159c266SJung-uk Kim (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) || 254*a159c266SJung-uk Kim (ObjDesc->Common.Type != ACPI_TYPE_INTEGER)) 255*a159c266SJung-uk Kim { 256*a159c266SJung-uk Kim return; 257*a159c266SJung-uk Kim } 258*a159c266SJung-uk Kim 259*a159c266SJung-uk Kim if (AcpiGbl_IntegerByteWidth == 4) 260*a159c266SJung-uk Kim { 261*a159c266SJung-uk Kim /* 262*a159c266SJung-uk Kim * We are running a method that exists in a 32-bit ACPI table. 263*a159c266SJung-uk Kim * Truncate the value to 32 bits by zeroing out the upper 32-bit field 264*a159c266SJung-uk Kim */ 265*a159c266SJung-uk Kim ObjDesc->Integer.Value &= (UINT64) ACPI_UINT32_MAX; 266*a159c266SJung-uk Kim } 267*a159c266SJung-uk Kim } 268*a159c266SJung-uk Kim 269*a159c266SJung-uk Kim 270*a159c266SJung-uk Kim /******************************************************************************* 271*a159c266SJung-uk Kim * 272*a159c266SJung-uk Kim * FUNCTION: AcpiExAcquireGlobalLock 273*a159c266SJung-uk Kim * 274*a159c266SJung-uk Kim * PARAMETERS: FieldFlags - Flags with Lock rule: 275*a159c266SJung-uk Kim * AlwaysLock or NeverLock 276*a159c266SJung-uk Kim * 277*a159c266SJung-uk Kim * RETURN: None 278*a159c266SJung-uk Kim * 279*a159c266SJung-uk Kim * DESCRIPTION: Obtain the ACPI hardware Global Lock, only if the field 280*a159c266SJung-uk Kim * flags specifiy that it is to be obtained before field access. 281*a159c266SJung-uk Kim * 282*a159c266SJung-uk Kim ******************************************************************************/ 283*a159c266SJung-uk Kim 284*a159c266SJung-uk Kim void 285*a159c266SJung-uk Kim AcpiExAcquireGlobalLock ( 286*a159c266SJung-uk Kim UINT32 FieldFlags) 287*a159c266SJung-uk Kim { 288*a159c266SJung-uk Kim ACPI_STATUS Status; 289*a159c266SJung-uk Kim 290*a159c266SJung-uk Kim 291*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (ExAcquireGlobalLock); 292*a159c266SJung-uk Kim 293*a159c266SJung-uk Kim 294*a159c266SJung-uk Kim /* Only use the lock if the AlwaysLock bit is set */ 295*a159c266SJung-uk Kim 296*a159c266SJung-uk Kim if (!(FieldFlags & AML_FIELD_LOCK_RULE_MASK)) 297*a159c266SJung-uk Kim { 298*a159c266SJung-uk Kim return_VOID; 299*a159c266SJung-uk Kim } 300*a159c266SJung-uk Kim 301*a159c266SJung-uk Kim /* Attempt to get the global lock, wait forever */ 302*a159c266SJung-uk Kim 303*a159c266SJung-uk Kim Status = AcpiExAcquireMutexObject (ACPI_WAIT_FOREVER, 304*a159c266SJung-uk Kim AcpiGbl_GlobalLockMutex, AcpiOsGetThreadId ()); 305*a159c266SJung-uk Kim 306*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 307*a159c266SJung-uk Kim { 308*a159c266SJung-uk Kim ACPI_EXCEPTION ((AE_INFO, Status, 309*a159c266SJung-uk Kim "Could not acquire Global Lock")); 310*a159c266SJung-uk Kim } 311*a159c266SJung-uk Kim 312*a159c266SJung-uk Kim return_VOID; 313*a159c266SJung-uk Kim } 314*a159c266SJung-uk Kim 315*a159c266SJung-uk Kim 316*a159c266SJung-uk Kim /******************************************************************************* 317*a159c266SJung-uk Kim * 318*a159c266SJung-uk Kim * FUNCTION: AcpiExReleaseGlobalLock 319*a159c266SJung-uk Kim * 320*a159c266SJung-uk Kim * PARAMETERS: FieldFlags - Flags with Lock rule: 321*a159c266SJung-uk Kim * AlwaysLock or NeverLock 322*a159c266SJung-uk Kim * 323*a159c266SJung-uk Kim * RETURN: None 324*a159c266SJung-uk Kim * 325*a159c266SJung-uk Kim * DESCRIPTION: Release the ACPI hardware Global Lock 326*a159c266SJung-uk Kim * 327*a159c266SJung-uk Kim ******************************************************************************/ 328*a159c266SJung-uk Kim 329*a159c266SJung-uk Kim void 330*a159c266SJung-uk Kim AcpiExReleaseGlobalLock ( 331*a159c266SJung-uk Kim UINT32 FieldFlags) 332*a159c266SJung-uk Kim { 333*a159c266SJung-uk Kim ACPI_STATUS Status; 334*a159c266SJung-uk Kim 335*a159c266SJung-uk Kim 336*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (ExReleaseGlobalLock); 337*a159c266SJung-uk Kim 338*a159c266SJung-uk Kim 339*a159c266SJung-uk Kim /* Only use the lock if the AlwaysLock bit is set */ 340*a159c266SJung-uk Kim 341*a159c266SJung-uk Kim if (!(FieldFlags & AML_FIELD_LOCK_RULE_MASK)) 342*a159c266SJung-uk Kim { 343*a159c266SJung-uk Kim return_VOID; 344*a159c266SJung-uk Kim } 345*a159c266SJung-uk Kim 346*a159c266SJung-uk Kim /* Release the global lock */ 347*a159c266SJung-uk Kim 348*a159c266SJung-uk Kim Status = AcpiExReleaseMutexObject (AcpiGbl_GlobalLockMutex); 349*a159c266SJung-uk Kim if (ACPI_FAILURE (Status)) 350*a159c266SJung-uk Kim { 351*a159c266SJung-uk Kim /* Report the error, but there isn't much else we can do */ 352*a159c266SJung-uk Kim 353*a159c266SJung-uk Kim ACPI_EXCEPTION ((AE_INFO, Status, 354*a159c266SJung-uk Kim "Could not release Global Lock")); 355*a159c266SJung-uk Kim } 356*a159c266SJung-uk Kim 357*a159c266SJung-uk Kim return_VOID; 358*a159c266SJung-uk Kim } 359*a159c266SJung-uk Kim 360*a159c266SJung-uk Kim 361*a159c266SJung-uk Kim /******************************************************************************* 362*a159c266SJung-uk Kim * 363*a159c266SJung-uk Kim * FUNCTION: AcpiExDigitsNeeded 364*a159c266SJung-uk Kim * 365*a159c266SJung-uk Kim * PARAMETERS: Value - Value to be represented 366*a159c266SJung-uk Kim * Base - Base of representation 367*a159c266SJung-uk Kim * 368*a159c266SJung-uk Kim * RETURN: The number of digits. 369*a159c266SJung-uk Kim * 370*a159c266SJung-uk Kim * DESCRIPTION: Calculate the number of digits needed to represent the Value 371*a159c266SJung-uk Kim * in the given Base (Radix) 372*a159c266SJung-uk Kim * 373*a159c266SJung-uk Kim ******************************************************************************/ 374*a159c266SJung-uk Kim 375*a159c266SJung-uk Kim static UINT32 376*a159c266SJung-uk Kim AcpiExDigitsNeeded ( 377*a159c266SJung-uk Kim UINT64 Value, 378*a159c266SJung-uk Kim UINT32 Base) 379*a159c266SJung-uk Kim { 380*a159c266SJung-uk Kim UINT32 NumDigits; 381*a159c266SJung-uk Kim UINT64 CurrentValue; 382*a159c266SJung-uk Kim 383*a159c266SJung-uk Kim 384*a159c266SJung-uk Kim ACPI_FUNCTION_TRACE (ExDigitsNeeded); 385*a159c266SJung-uk Kim 386*a159c266SJung-uk Kim 387*a159c266SJung-uk Kim /* UINT64 is unsigned, so we don't worry about a '-' prefix */ 388*a159c266SJung-uk Kim 389*a159c266SJung-uk Kim if (Value == 0) 390*a159c266SJung-uk Kim { 391*a159c266SJung-uk Kim return_UINT32 (1); 392*a159c266SJung-uk Kim } 393*a159c266SJung-uk Kim 394*a159c266SJung-uk Kim CurrentValue = Value; 395*a159c266SJung-uk Kim NumDigits = 0; 396*a159c266SJung-uk Kim 397*a159c266SJung-uk Kim /* Count the digits in the requested base */ 398*a159c266SJung-uk Kim 399*a159c266SJung-uk Kim while (CurrentValue) 400*a159c266SJung-uk Kim { 401*a159c266SJung-uk Kim (void) AcpiUtShortDivide (CurrentValue, Base, &CurrentValue, NULL); 402*a159c266SJung-uk Kim NumDigits++; 403*a159c266SJung-uk Kim } 404*a159c266SJung-uk Kim 405*a159c266SJung-uk Kim return_UINT32 (NumDigits); 406*a159c266SJung-uk Kim } 407*a159c266SJung-uk Kim 408*a159c266SJung-uk Kim 409*a159c266SJung-uk Kim /******************************************************************************* 410*a159c266SJung-uk Kim * 411*a159c266SJung-uk Kim * FUNCTION: AcpiExEisaIdToString 412*a159c266SJung-uk Kim * 413*a159c266SJung-uk Kim * PARAMETERS: CompressedId - EISAID to be converted 414*a159c266SJung-uk Kim * OutString - Where to put the converted string (8 bytes) 415*a159c266SJung-uk Kim * 416*a159c266SJung-uk Kim * RETURN: None 417*a159c266SJung-uk Kim * 418*a159c266SJung-uk Kim * DESCRIPTION: Convert a numeric EISAID to string representation. Return 419*a159c266SJung-uk Kim * buffer must be large enough to hold the string. The string 420*a159c266SJung-uk Kim * returned is always exactly of length ACPI_EISAID_STRING_SIZE 421*a159c266SJung-uk Kim * (includes null terminator). The EISAID is always 32 bits. 422*a159c266SJung-uk Kim * 423*a159c266SJung-uk Kim ******************************************************************************/ 424*a159c266SJung-uk Kim 425*a159c266SJung-uk Kim void 426*a159c266SJung-uk Kim AcpiExEisaIdToString ( 427*a159c266SJung-uk Kim char *OutString, 428*a159c266SJung-uk Kim UINT64 CompressedId) 429*a159c266SJung-uk Kim { 430*a159c266SJung-uk Kim UINT32 SwappedId; 431*a159c266SJung-uk Kim 432*a159c266SJung-uk Kim 433*a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 434*a159c266SJung-uk Kim 435*a159c266SJung-uk Kim 436*a159c266SJung-uk Kim /* The EISAID should be a 32-bit integer */ 437*a159c266SJung-uk Kim 438*a159c266SJung-uk Kim if (CompressedId > ACPI_UINT32_MAX) 439*a159c266SJung-uk Kim { 440*a159c266SJung-uk Kim ACPI_WARNING ((AE_INFO, 441*a159c266SJung-uk Kim "Expected EISAID is larger than 32 bits: 0x%8.8X%8.8X, truncating", 442*a159c266SJung-uk Kim ACPI_FORMAT_UINT64 (CompressedId))); 443*a159c266SJung-uk Kim } 444*a159c266SJung-uk Kim 445*a159c266SJung-uk Kim /* Swap ID to big-endian to get contiguous bits */ 446*a159c266SJung-uk Kim 447*a159c266SJung-uk Kim SwappedId = AcpiUtDwordByteSwap ((UINT32) CompressedId); 448*a159c266SJung-uk Kim 449*a159c266SJung-uk Kim /* First 3 bytes are uppercase letters. Next 4 bytes are hexadecimal */ 450*a159c266SJung-uk Kim 451*a159c266SJung-uk Kim OutString[0] = (char) (0x40 + (((unsigned long) SwappedId >> 26) & 0x1F)); 452*a159c266SJung-uk Kim OutString[1] = (char) (0x40 + ((SwappedId >> 21) & 0x1F)); 453*a159c266SJung-uk Kim OutString[2] = (char) (0x40 + ((SwappedId >> 16) & 0x1F)); 454*a159c266SJung-uk Kim OutString[3] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 12); 455*a159c266SJung-uk Kim OutString[4] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 8); 456*a159c266SJung-uk Kim OutString[5] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 4); 457*a159c266SJung-uk Kim OutString[6] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 0); 458*a159c266SJung-uk Kim OutString[7] = 0; 459*a159c266SJung-uk Kim } 460*a159c266SJung-uk Kim 461*a159c266SJung-uk Kim 462*a159c266SJung-uk Kim /******************************************************************************* 463*a159c266SJung-uk Kim * 464*a159c266SJung-uk Kim * FUNCTION: AcpiExIntegerToString 465*a159c266SJung-uk Kim * 466*a159c266SJung-uk Kim * PARAMETERS: OutString - Where to put the converted string. At least 467*a159c266SJung-uk Kim * 21 bytes are needed to hold the largest 468*a159c266SJung-uk Kim * possible 64-bit integer. 469*a159c266SJung-uk Kim * Value - Value to be converted 470*a159c266SJung-uk Kim * 471*a159c266SJung-uk Kim * RETURN: None, string 472*a159c266SJung-uk Kim * 473*a159c266SJung-uk Kim * DESCRIPTION: Convert a 64-bit integer to decimal string representation. 474*a159c266SJung-uk Kim * Assumes string buffer is large enough to hold the string. The 475*a159c266SJung-uk Kim * largest string is (ACPI_MAX64_DECIMAL_DIGITS + 1). 476*a159c266SJung-uk Kim * 477*a159c266SJung-uk Kim ******************************************************************************/ 478*a159c266SJung-uk Kim 479*a159c266SJung-uk Kim void 480*a159c266SJung-uk Kim AcpiExIntegerToString ( 481*a159c266SJung-uk Kim char *OutString, 482*a159c266SJung-uk Kim UINT64 Value) 483*a159c266SJung-uk Kim { 484*a159c266SJung-uk Kim UINT32 Count; 485*a159c266SJung-uk Kim UINT32 DigitsNeeded; 486*a159c266SJung-uk Kim UINT32 Remainder; 487*a159c266SJung-uk Kim 488*a159c266SJung-uk Kim 489*a159c266SJung-uk Kim ACPI_FUNCTION_ENTRY (); 490*a159c266SJung-uk Kim 491*a159c266SJung-uk Kim 492*a159c266SJung-uk Kim DigitsNeeded = AcpiExDigitsNeeded (Value, 10); 493*a159c266SJung-uk Kim OutString[DigitsNeeded] = 0; 494*a159c266SJung-uk Kim 495*a159c266SJung-uk Kim for (Count = DigitsNeeded; Count > 0; Count--) 496*a159c266SJung-uk Kim { 497*a159c266SJung-uk Kim (void) AcpiUtShortDivide (Value, 10, &Value, &Remainder); 498*a159c266SJung-uk Kim OutString[Count-1] = (char) ('0' + Remainder);\ 499*a159c266SJung-uk Kim } 500*a159c266SJung-uk Kim } 501*a159c266SJung-uk Kim 502*a159c266SJung-uk Kim 503*a159c266SJung-uk Kim /******************************************************************************* 504*a159c266SJung-uk Kim * 505*a159c266SJung-uk Kim * FUNCTION: AcpiIsValidSpaceId 506*a159c266SJung-uk Kim * 507*a159c266SJung-uk Kim * PARAMETERS: SpaceId - ID to be validated 508*a159c266SJung-uk Kim * 509*a159c266SJung-uk Kim * RETURN: TRUE if valid/supported ID. 510*a159c266SJung-uk Kim * 511*a159c266SJung-uk Kim * DESCRIPTION: Validate an operation region SpaceID. 512*a159c266SJung-uk Kim * 513*a159c266SJung-uk Kim ******************************************************************************/ 514*a159c266SJung-uk Kim 515*a159c266SJung-uk Kim BOOLEAN 516*a159c266SJung-uk Kim AcpiIsValidSpaceId ( 517*a159c266SJung-uk Kim UINT8 SpaceId) 518*a159c266SJung-uk Kim { 519*a159c266SJung-uk Kim 520*a159c266SJung-uk Kim if ((SpaceId >= ACPI_NUM_PREDEFINED_REGIONS) && 521*a159c266SJung-uk Kim (SpaceId < ACPI_USER_REGION_BEGIN) && 522*a159c266SJung-uk Kim (SpaceId != ACPI_ADR_SPACE_DATA_TABLE) && 523*a159c266SJung-uk Kim (SpaceId != ACPI_ADR_SPACE_FIXED_HARDWARE)) 524*a159c266SJung-uk Kim { 525*a159c266SJung-uk Kim return (FALSE); 526*a159c266SJung-uk Kim } 527*a159c266SJung-uk Kim 528*a159c266SJung-uk Kim return (TRUE); 529*a159c266SJung-uk Kim } 530*a159c266SJung-uk Kim 531*a159c266SJung-uk Kim 532*a159c266SJung-uk Kim #endif 533