1*a88e22b7SJung-uk Kim /****************************************************************************** 2*a88e22b7SJung-uk Kim * 3*a88e22b7SJung-uk Kim * Module Name: dtfield.c - Code generation for individual source fields 4*a88e22b7SJung-uk Kim * 5*a88e22b7SJung-uk Kim *****************************************************************************/ 6*a88e22b7SJung-uk Kim 7*a88e22b7SJung-uk Kim /****************************************************************************** 8*a88e22b7SJung-uk Kim * 9*a88e22b7SJung-uk Kim * 1. Copyright Notice 10*a88e22b7SJung-uk Kim * 11*a88e22b7SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. 12*a88e22b7SJung-uk Kim * All rights reserved. 13*a88e22b7SJung-uk Kim * 14*a88e22b7SJung-uk Kim * 2. License 15*a88e22b7SJung-uk Kim * 16*a88e22b7SJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 17*a88e22b7SJung-uk Kim * rights. You may have additional license terms from the party that provided 18*a88e22b7SJung-uk Kim * you this software, covering your right to use that party's intellectual 19*a88e22b7SJung-uk Kim * property rights. 20*a88e22b7SJung-uk Kim * 21*a88e22b7SJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22*a88e22b7SJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 23*a88e22b7SJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24*a88e22b7SJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 25*a88e22b7SJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 26*a88e22b7SJung-uk Kim * Code in any form, with the right to sublicense such rights; and 27*a88e22b7SJung-uk Kim * 28*a88e22b7SJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29*a88e22b7SJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 30*a88e22b7SJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 31*a88e22b7SJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 32*a88e22b7SJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 33*a88e22b7SJung-uk Kim * license, and in no event shall the patent license extend to any additions 34*a88e22b7SJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 35*a88e22b7SJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 36*a88e22b7SJung-uk Kim * 37*a88e22b7SJung-uk Kim * The above copyright and patent license is granted only if the following 38*a88e22b7SJung-uk Kim * conditions are met: 39*a88e22b7SJung-uk Kim * 40*a88e22b7SJung-uk Kim * 3. Conditions 41*a88e22b7SJung-uk Kim * 42*a88e22b7SJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43*a88e22b7SJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 44*a88e22b7SJung-uk Kim * Code or modification with rights to further distribute source must include 45*a88e22b7SJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 46*a88e22b7SJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 47*a88e22b7SJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 48*a88e22b7SJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 49*a88e22b7SJung-uk Kim * Code and the date of any change. Licensee must include in that file the 50*a88e22b7SJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 51*a88e22b7SJung-uk Kim * must include a prominent statement that the modification is derived, 52*a88e22b7SJung-uk Kim * directly or indirectly, from Original Intel Code. 53*a88e22b7SJung-uk Kim * 54*a88e22b7SJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55*a88e22b7SJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 56*a88e22b7SJung-uk Kim * Code or modification without rights to further distribute source must 57*a88e22b7SJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 58*a88e22b7SJung-uk Kim * documentation and/or other materials provided with distribution. In 59*a88e22b7SJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 60*a88e22b7SJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 61*a88e22b7SJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 62*a88e22b7SJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 63*a88e22b7SJung-uk Kim * not to intellectual property embodied in modifications its licensee may 64*a88e22b7SJung-uk Kim * make. 65*a88e22b7SJung-uk Kim * 66*a88e22b7SJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 67*a88e22b7SJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 68*a88e22b7SJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 69*a88e22b7SJung-uk Kim * provision in the documentation and/or other materials provided with the 70*a88e22b7SJung-uk Kim * distribution. 71*a88e22b7SJung-uk Kim * 72*a88e22b7SJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 73*a88e22b7SJung-uk Kim * Intel Code. 74*a88e22b7SJung-uk Kim * 75*a88e22b7SJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76*a88e22b7SJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 77*a88e22b7SJung-uk Kim * other dealings in products derived from or relating to the Covered Code 78*a88e22b7SJung-uk Kim * without prior written authorization from Intel. 79*a88e22b7SJung-uk Kim * 80*a88e22b7SJung-uk Kim * 4. Disclaimer and Export Compliance 81*a88e22b7SJung-uk Kim * 82*a88e22b7SJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83*a88e22b7SJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84*a88e22b7SJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85*a88e22b7SJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86*a88e22b7SJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87*a88e22b7SJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88*a88e22b7SJung-uk Kim * PARTICULAR PURPOSE. 89*a88e22b7SJung-uk Kim * 90*a88e22b7SJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91*a88e22b7SJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92*a88e22b7SJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93*a88e22b7SJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94*a88e22b7SJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95*a88e22b7SJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96*a88e22b7SJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97*a88e22b7SJung-uk Kim * LIMITED REMEDY. 98*a88e22b7SJung-uk Kim * 99*a88e22b7SJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 100*a88e22b7SJung-uk Kim * software or system incorporating such software without first obtaining any 101*a88e22b7SJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 102*a88e22b7SJung-uk Kim * any other agency or department of the United States Government. In the 103*a88e22b7SJung-uk Kim * event Licensee exports any such software from the United States or 104*a88e22b7SJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 105*a88e22b7SJung-uk Kim * ensure that the distribution and export/re-export of the software is in 106*a88e22b7SJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 107*a88e22b7SJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108*a88e22b7SJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 109*a88e22b7SJung-uk Kim * software, or service, directly or indirectly, to any country for which the 110*a88e22b7SJung-uk Kim * United States government or any agency thereof requires an export license, 111*a88e22b7SJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 112*a88e22b7SJung-uk Kim * such license, approval or letter. 113*a88e22b7SJung-uk Kim * 114*a88e22b7SJung-uk Kim *****************************************************************************/ 115*a88e22b7SJung-uk Kim 116*a88e22b7SJung-uk Kim #define __DTFIELD_C__ 117*a88e22b7SJung-uk Kim 118*a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 119*a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h> 120*a88e22b7SJung-uk Kim 121*a88e22b7SJung-uk Kim #define _COMPONENT DT_COMPILER 122*a88e22b7SJung-uk Kim ACPI_MODULE_NAME ("dtfield") 123*a88e22b7SJung-uk Kim 124*a88e22b7SJung-uk Kim 125*a88e22b7SJung-uk Kim /* Local prototypes */ 126*a88e22b7SJung-uk Kim 127*a88e22b7SJung-uk Kim static void 128*a88e22b7SJung-uk Kim DtCompileString ( 129*a88e22b7SJung-uk Kim UINT8 *Buffer, 130*a88e22b7SJung-uk Kim DT_FIELD *Field, 131*a88e22b7SJung-uk Kim UINT32 ByteLength); 132*a88e22b7SJung-uk Kim 133*a88e22b7SJung-uk Kim static char * 134*a88e22b7SJung-uk Kim DtNormalizeBuffer ( 135*a88e22b7SJung-uk Kim char *Buffer, 136*a88e22b7SJung-uk Kim UINT32 *Count); 137*a88e22b7SJung-uk Kim 138*a88e22b7SJung-uk Kim 139*a88e22b7SJung-uk Kim /****************************************************************************** 140*a88e22b7SJung-uk Kim * 141*a88e22b7SJung-uk Kim * FUNCTION: DtCompileOneField 142*a88e22b7SJung-uk Kim * 143*a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 144*a88e22b7SJung-uk Kim * Field - Field to be compiled 145*a88e22b7SJung-uk Kim * ByteLength - Byte length of the field 146*a88e22b7SJung-uk Kim * Type - Field type 147*a88e22b7SJung-uk Kim * 148*a88e22b7SJung-uk Kim * RETURN: None 149*a88e22b7SJung-uk Kim * 150*a88e22b7SJung-uk Kim * DESCRIPTION: Compile a field value to binary 151*a88e22b7SJung-uk Kim * 152*a88e22b7SJung-uk Kim *****************************************************************************/ 153*a88e22b7SJung-uk Kim 154*a88e22b7SJung-uk Kim void 155*a88e22b7SJung-uk Kim DtCompileOneField ( 156*a88e22b7SJung-uk Kim UINT8 *Buffer, 157*a88e22b7SJung-uk Kim DT_FIELD *Field, 158*a88e22b7SJung-uk Kim UINT32 ByteLength, 159*a88e22b7SJung-uk Kim UINT8 Type, 160*a88e22b7SJung-uk Kim UINT8 Flags) 161*a88e22b7SJung-uk Kim { 162*a88e22b7SJung-uk Kim 163*a88e22b7SJung-uk Kim switch (Type) 164*a88e22b7SJung-uk Kim { 165*a88e22b7SJung-uk Kim case DT_FIELD_TYPE_INTEGER: 166*a88e22b7SJung-uk Kim DtCompileInteger (Buffer, Field, ByteLength, Flags); 167*a88e22b7SJung-uk Kim break; 168*a88e22b7SJung-uk Kim 169*a88e22b7SJung-uk Kim case DT_FIELD_TYPE_STRING: 170*a88e22b7SJung-uk Kim DtCompileString (Buffer, Field, ByteLength); 171*a88e22b7SJung-uk Kim break; 172*a88e22b7SJung-uk Kim 173*a88e22b7SJung-uk Kim case DT_FIELD_TYPE_BUFFER: 174*a88e22b7SJung-uk Kim DtCompileBuffer (Buffer, Field->Value, Field, ByteLength); 175*a88e22b7SJung-uk Kim break; 176*a88e22b7SJung-uk Kim 177*a88e22b7SJung-uk Kim default: 178*a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid field type"); 179*a88e22b7SJung-uk Kim break; 180*a88e22b7SJung-uk Kim } 181*a88e22b7SJung-uk Kim } 182*a88e22b7SJung-uk Kim 183*a88e22b7SJung-uk Kim 184*a88e22b7SJung-uk Kim /****************************************************************************** 185*a88e22b7SJung-uk Kim * 186*a88e22b7SJung-uk Kim * FUNCTION: DtCompileString 187*a88e22b7SJung-uk Kim * 188*a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 189*a88e22b7SJung-uk Kim * Field - String to be copied to buffer 190*a88e22b7SJung-uk Kim * ByteLength - Maximum length of string 191*a88e22b7SJung-uk Kim * 192*a88e22b7SJung-uk Kim * RETURN: None 193*a88e22b7SJung-uk Kim * 194*a88e22b7SJung-uk Kim * DESCRIPTION: Copy string to the buffer 195*a88e22b7SJung-uk Kim * 196*a88e22b7SJung-uk Kim *****************************************************************************/ 197*a88e22b7SJung-uk Kim 198*a88e22b7SJung-uk Kim static void 199*a88e22b7SJung-uk Kim DtCompileString ( 200*a88e22b7SJung-uk Kim UINT8 *Buffer, 201*a88e22b7SJung-uk Kim DT_FIELD *Field, 202*a88e22b7SJung-uk Kim UINT32 ByteLength) 203*a88e22b7SJung-uk Kim { 204*a88e22b7SJung-uk Kim UINT32 Length; 205*a88e22b7SJung-uk Kim 206*a88e22b7SJung-uk Kim 207*a88e22b7SJung-uk Kim Length = ACPI_STRLEN (Field->Value); 208*a88e22b7SJung-uk Kim 209*a88e22b7SJung-uk Kim /* Check if the string is too long for the field */ 210*a88e22b7SJung-uk Kim 211*a88e22b7SJung-uk Kim if (Length > ByteLength) 212*a88e22b7SJung-uk Kim { 213*a88e22b7SJung-uk Kim sprintf (MsgBuffer, "Maximum %u characters", ByteLength); 214*a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_STRING_LENGTH, Field, MsgBuffer); 215*a88e22b7SJung-uk Kim Length = ByteLength; 216*a88e22b7SJung-uk Kim } 217*a88e22b7SJung-uk Kim 218*a88e22b7SJung-uk Kim ACPI_MEMCPY (Buffer, Field->Value, Length); 219*a88e22b7SJung-uk Kim } 220*a88e22b7SJung-uk Kim 221*a88e22b7SJung-uk Kim 222*a88e22b7SJung-uk Kim /****************************************************************************** 223*a88e22b7SJung-uk Kim * 224*a88e22b7SJung-uk Kim * FUNCTION: DtCompileInteger 225*a88e22b7SJung-uk Kim * 226*a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 227*a88e22b7SJung-uk Kim * Field - Field obj with Integer to be compiled 228*a88e22b7SJung-uk Kim * ByteLength - Byte length of the integer 229*a88e22b7SJung-uk Kim * 230*a88e22b7SJung-uk Kim * RETURN: None 231*a88e22b7SJung-uk Kim * 232*a88e22b7SJung-uk Kim * DESCRIPTION: Compile an integer 233*a88e22b7SJung-uk Kim * 234*a88e22b7SJung-uk Kim *****************************************************************************/ 235*a88e22b7SJung-uk Kim 236*a88e22b7SJung-uk Kim void 237*a88e22b7SJung-uk Kim DtCompileInteger ( 238*a88e22b7SJung-uk Kim UINT8 *Buffer, 239*a88e22b7SJung-uk Kim DT_FIELD *Field, 240*a88e22b7SJung-uk Kim UINT32 ByteLength, 241*a88e22b7SJung-uk Kim UINT8 Flags) 242*a88e22b7SJung-uk Kim { 243*a88e22b7SJung-uk Kim UINT64 Value = 0; 244*a88e22b7SJung-uk Kim UINT64 MaxValue; 245*a88e22b7SJung-uk Kim UINT8 *Hex; 246*a88e22b7SJung-uk Kim char *Message = NULL; 247*a88e22b7SJung-uk Kim ACPI_STATUS Status; 248*a88e22b7SJung-uk Kim int i; 249*a88e22b7SJung-uk Kim 250*a88e22b7SJung-uk Kim 251*a88e22b7SJung-uk Kim /* Byte length must be in range 1-8 */ 252*a88e22b7SJung-uk Kim 253*a88e22b7SJung-uk Kim if ((ByteLength > 8) || (ByteLength == 0)) 254*a88e22b7SJung-uk Kim { 255*a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, 256*a88e22b7SJung-uk Kim "Invalid internal Byte length"); 257*a88e22b7SJung-uk Kim return; 258*a88e22b7SJung-uk Kim } 259*a88e22b7SJung-uk Kim 260*a88e22b7SJung-uk Kim /* Convert string to an actual integer */ 261*a88e22b7SJung-uk Kim 262*a88e22b7SJung-uk Kim Status = DtStrtoul64 (Field->Value, &Value); 263*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 264*a88e22b7SJung-uk Kim { 265*a88e22b7SJung-uk Kim if (Status == AE_LIMIT) 266*a88e22b7SJung-uk Kim { 267*a88e22b7SJung-uk Kim Message = "Constant larger than 64 bits"; 268*a88e22b7SJung-uk Kim } 269*a88e22b7SJung-uk Kim else if (Status == AE_BAD_CHARACTER) 270*a88e22b7SJung-uk Kim { 271*a88e22b7SJung-uk Kim Message = "Invalid character in constant"; 272*a88e22b7SJung-uk Kim } 273*a88e22b7SJung-uk Kim 274*a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_INVALID_HEX_INTEGER, Field, Message); 275*a88e22b7SJung-uk Kim goto Exit; 276*a88e22b7SJung-uk Kim } 277*a88e22b7SJung-uk Kim 278*a88e22b7SJung-uk Kim /* Ensure that reserved fields are set to zero */ 279*a88e22b7SJung-uk Kim /* TBD: should we set to zero, or just make this an ERROR? */ 280*a88e22b7SJung-uk Kim /* TBD: Probably better to use a flag */ 281*a88e22b7SJung-uk Kim 282*a88e22b7SJung-uk Kim if (!ACPI_STRCMP (Field->Name, "Reserved") && 283*a88e22b7SJung-uk Kim (Value != 0)) 284*a88e22b7SJung-uk Kim { 285*a88e22b7SJung-uk Kim DtError (ASL_WARNING, ASL_MSG_RESERVED_VALUE, Field, 286*a88e22b7SJung-uk Kim "Setting to zero"); 287*a88e22b7SJung-uk Kim Value = 0; 288*a88e22b7SJung-uk Kim } 289*a88e22b7SJung-uk Kim 290*a88e22b7SJung-uk Kim /* Check if the value must be non-zero */ 291*a88e22b7SJung-uk Kim 292*a88e22b7SJung-uk Kim if ((Value == 0) && (Flags & DT_NON_ZERO)) 293*a88e22b7SJung-uk Kim { 294*a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_ZERO_VALUE, Field, NULL); 295*a88e22b7SJung-uk Kim } 296*a88e22b7SJung-uk Kim 297*a88e22b7SJung-uk Kim /* 298*a88e22b7SJung-uk Kim * Generate the maximum value for the data type (ByteLength) 299*a88e22b7SJung-uk Kim * Note: construct chosen for maximum portability 300*a88e22b7SJung-uk Kim */ 301*a88e22b7SJung-uk Kim MaxValue = ((UINT64) (-1)) >> (64 - (ByteLength * 8)); 302*a88e22b7SJung-uk Kim 303*a88e22b7SJung-uk Kim /* Validate that the input value is within range of the target */ 304*a88e22b7SJung-uk Kim 305*a88e22b7SJung-uk Kim if (Value > MaxValue) 306*a88e22b7SJung-uk Kim { 307*a88e22b7SJung-uk Kim sprintf (MsgBuffer, "Maximum %u bytes", ByteLength); 308*a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_INTEGER_SIZE, Field, MsgBuffer); 309*a88e22b7SJung-uk Kim } 310*a88e22b7SJung-uk Kim 311*a88e22b7SJung-uk Kim /* 312*a88e22b7SJung-uk Kim * TBD: hard code for ASF! Capabilites field. 313*a88e22b7SJung-uk Kim * 314*a88e22b7SJung-uk Kim * This field is actually a buffer, not a 56-bit integer -- 315*a88e22b7SJung-uk Kim * so, the ordering is reversed. Something should be fixed 316*a88e22b7SJung-uk Kim * so we don't need this code. 317*a88e22b7SJung-uk Kim */ 318*a88e22b7SJung-uk Kim if (ByteLength == 7) 319*a88e22b7SJung-uk Kim { 320*a88e22b7SJung-uk Kim Hex = ACPI_CAST_PTR (UINT8, &Value); 321*a88e22b7SJung-uk Kim for (i = 6; i >= 0; i--) 322*a88e22b7SJung-uk Kim { 323*a88e22b7SJung-uk Kim Buffer[i] = *Hex; 324*a88e22b7SJung-uk Kim Hex++; 325*a88e22b7SJung-uk Kim } 326*a88e22b7SJung-uk Kim return; 327*a88e22b7SJung-uk Kim } 328*a88e22b7SJung-uk Kim 329*a88e22b7SJung-uk Kim Exit: 330*a88e22b7SJung-uk Kim ACPI_MEMCPY (Buffer, &Value, ByteLength); 331*a88e22b7SJung-uk Kim return; 332*a88e22b7SJung-uk Kim } 333*a88e22b7SJung-uk Kim 334*a88e22b7SJung-uk Kim 335*a88e22b7SJung-uk Kim /****************************************************************************** 336*a88e22b7SJung-uk Kim * 337*a88e22b7SJung-uk Kim * FUNCTION: DtNormalizeBuffer 338*a88e22b7SJung-uk Kim * 339*a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Input buffer 340*a88e22b7SJung-uk Kim * Count - Output the count of hex number in 341*a88e22b7SJung-uk Kim * the Buffer 342*a88e22b7SJung-uk Kim * 343*a88e22b7SJung-uk Kim * RETURN: The normalized buffer, freed by caller 344*a88e22b7SJung-uk Kim * 345*a88e22b7SJung-uk Kim * DESCRIPTION: [1A,2B,3C,4D] or 1A, 2B, 3C, 4D will be normalized 346*a88e22b7SJung-uk Kim * to 1A 2B 3C 4D 347*a88e22b7SJung-uk Kim * 348*a88e22b7SJung-uk Kim *****************************************************************************/ 349*a88e22b7SJung-uk Kim 350*a88e22b7SJung-uk Kim static char * 351*a88e22b7SJung-uk Kim DtNormalizeBuffer ( 352*a88e22b7SJung-uk Kim char *Buffer, 353*a88e22b7SJung-uk Kim UINT32 *Count) 354*a88e22b7SJung-uk Kim { 355*a88e22b7SJung-uk Kim char *NewBuffer; 356*a88e22b7SJung-uk Kim char *TmpBuffer; 357*a88e22b7SJung-uk Kim UINT32 BufferCount = 0; 358*a88e22b7SJung-uk Kim BOOLEAN Separator = TRUE; 359*a88e22b7SJung-uk Kim char c; 360*a88e22b7SJung-uk Kim 361*a88e22b7SJung-uk Kim 362*a88e22b7SJung-uk Kim NewBuffer = UtLocalCalloc (ACPI_STRLEN (Buffer) + 1); 363*a88e22b7SJung-uk Kim TmpBuffer = NewBuffer; 364*a88e22b7SJung-uk Kim 365*a88e22b7SJung-uk Kim while ((c = *Buffer++)) 366*a88e22b7SJung-uk Kim { 367*a88e22b7SJung-uk Kim switch (c) 368*a88e22b7SJung-uk Kim { 369*a88e22b7SJung-uk Kim /* Valid separators */ 370*a88e22b7SJung-uk Kim 371*a88e22b7SJung-uk Kim case '[': 372*a88e22b7SJung-uk Kim case ']': 373*a88e22b7SJung-uk Kim case ' ': 374*a88e22b7SJung-uk Kim case ',': 375*a88e22b7SJung-uk Kim Separator = TRUE; 376*a88e22b7SJung-uk Kim break; 377*a88e22b7SJung-uk Kim 378*a88e22b7SJung-uk Kim default: 379*a88e22b7SJung-uk Kim if (Separator) 380*a88e22b7SJung-uk Kim { 381*a88e22b7SJung-uk Kim /* Insert blank as the standard separator */ 382*a88e22b7SJung-uk Kim 383*a88e22b7SJung-uk Kim if (NewBuffer[0]) 384*a88e22b7SJung-uk Kim { 385*a88e22b7SJung-uk Kim *TmpBuffer++ = ' '; 386*a88e22b7SJung-uk Kim BufferCount++; 387*a88e22b7SJung-uk Kim } 388*a88e22b7SJung-uk Kim 389*a88e22b7SJung-uk Kim Separator = FALSE; 390*a88e22b7SJung-uk Kim } 391*a88e22b7SJung-uk Kim 392*a88e22b7SJung-uk Kim *TmpBuffer++ = c; 393*a88e22b7SJung-uk Kim break; 394*a88e22b7SJung-uk Kim } 395*a88e22b7SJung-uk Kim } 396*a88e22b7SJung-uk Kim 397*a88e22b7SJung-uk Kim *Count = BufferCount + 1; 398*a88e22b7SJung-uk Kim return (NewBuffer); 399*a88e22b7SJung-uk Kim } 400*a88e22b7SJung-uk Kim 401*a88e22b7SJung-uk Kim 402*a88e22b7SJung-uk Kim /****************************************************************************** 403*a88e22b7SJung-uk Kim * 404*a88e22b7SJung-uk Kim * FUNCTION: DtCompileBuffer 405*a88e22b7SJung-uk Kim * 406*a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 407*a88e22b7SJung-uk Kim * StringValue - Integer list to be compiled 408*a88e22b7SJung-uk Kim * Field - Current field object 409*a88e22b7SJung-uk Kim * ByteLength - Byte length of the integer list 410*a88e22b7SJung-uk Kim * 411*a88e22b7SJung-uk Kim * RETURN: Count of remaining data in the input list 412*a88e22b7SJung-uk Kim * 413*a88e22b7SJung-uk Kim * DESCRIPTION: Compile and pack an integer list, for example 414*a88e22b7SJung-uk Kim * "AA 1F 20 3B" ==> Buffer[] = {0xAA,0x1F,0x20,0x3B} 415*a88e22b7SJung-uk Kim * 416*a88e22b7SJung-uk Kim *****************************************************************************/ 417*a88e22b7SJung-uk Kim 418*a88e22b7SJung-uk Kim UINT32 419*a88e22b7SJung-uk Kim DtCompileBuffer ( 420*a88e22b7SJung-uk Kim UINT8 *Buffer, 421*a88e22b7SJung-uk Kim char *StringValue, 422*a88e22b7SJung-uk Kim DT_FIELD *Field, 423*a88e22b7SJung-uk Kim UINT32 ByteLength) 424*a88e22b7SJung-uk Kim { 425*a88e22b7SJung-uk Kim ACPI_STATUS Status; 426*a88e22b7SJung-uk Kim char Hex[3]; 427*a88e22b7SJung-uk Kim UINT64 Value; 428*a88e22b7SJung-uk Kim UINT32 i; 429*a88e22b7SJung-uk Kim UINT32 Count; 430*a88e22b7SJung-uk Kim 431*a88e22b7SJung-uk Kim 432*a88e22b7SJung-uk Kim /* Allow several different types of value separators */ 433*a88e22b7SJung-uk Kim 434*a88e22b7SJung-uk Kim StringValue = DtNormalizeBuffer (StringValue, &Count); 435*a88e22b7SJung-uk Kim 436*a88e22b7SJung-uk Kim Hex[2] = 0; 437*a88e22b7SJung-uk Kim for (i = 0; i < Count; i++) 438*a88e22b7SJung-uk Kim { 439*a88e22b7SJung-uk Kim /* Each element of StringValue is three chars */ 440*a88e22b7SJung-uk Kim 441*a88e22b7SJung-uk Kim Hex[0] = StringValue[(3 * i)]; 442*a88e22b7SJung-uk Kim Hex[1] = StringValue[(3 * i) + 1]; 443*a88e22b7SJung-uk Kim 444*a88e22b7SJung-uk Kim /* Convert one hex byte */ 445*a88e22b7SJung-uk Kim 446*a88e22b7SJung-uk Kim Value = 0; 447*a88e22b7SJung-uk Kim Status = DtStrtoul64 (Hex, &Value); 448*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 449*a88e22b7SJung-uk Kim { 450*a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_BUFFER_ELEMENT, Field, MsgBuffer); 451*a88e22b7SJung-uk Kim return (ByteLength - Count); 452*a88e22b7SJung-uk Kim } 453*a88e22b7SJung-uk Kim 454*a88e22b7SJung-uk Kim Buffer[i] = (UINT8) Value; 455*a88e22b7SJung-uk Kim } 456*a88e22b7SJung-uk Kim 457*a88e22b7SJung-uk Kim ACPI_FREE (StringValue); 458*a88e22b7SJung-uk Kim return (ByteLength - Count); 459*a88e22b7SJung-uk Kim } 460*a88e22b7SJung-uk Kim 461*a88e22b7SJung-uk Kim 462*a88e22b7SJung-uk Kim /****************************************************************************** 463*a88e22b7SJung-uk Kim * 464*a88e22b7SJung-uk Kim * FUNCTION: DtCompileFlag 465*a88e22b7SJung-uk Kim * 466*a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 467*a88e22b7SJung-uk Kim * Field - Field to be compiled 468*a88e22b7SJung-uk Kim * Info - Flag info 469*a88e22b7SJung-uk Kim * 470*a88e22b7SJung-uk Kim * RETURN: 471*a88e22b7SJung-uk Kim * 472*a88e22b7SJung-uk Kim * DESCRIPTION: Compile a flag 473*a88e22b7SJung-uk Kim * 474*a88e22b7SJung-uk Kim *****************************************************************************/ 475*a88e22b7SJung-uk Kim 476*a88e22b7SJung-uk Kim void 477*a88e22b7SJung-uk Kim DtCompileFlag ( 478*a88e22b7SJung-uk Kim UINT8 *Buffer, 479*a88e22b7SJung-uk Kim DT_FIELD *Field, 480*a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *Info) 481*a88e22b7SJung-uk Kim { 482*a88e22b7SJung-uk Kim UINT64 Value = 0; 483*a88e22b7SJung-uk Kim UINT32 BitLength = 1; 484*a88e22b7SJung-uk Kim UINT8 BitPosition = 0; 485*a88e22b7SJung-uk Kim ACPI_STATUS Status; 486*a88e22b7SJung-uk Kim 487*a88e22b7SJung-uk Kim 488*a88e22b7SJung-uk Kim Status = DtStrtoul64 (Field->Value, &Value); 489*a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 490*a88e22b7SJung-uk Kim { 491*a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_INVALID_HEX_INTEGER, Field, NULL); 492*a88e22b7SJung-uk Kim } 493*a88e22b7SJung-uk Kim 494*a88e22b7SJung-uk Kim switch (Info->Opcode) 495*a88e22b7SJung-uk Kim { 496*a88e22b7SJung-uk Kim case ACPI_DMT_FLAG0: 497*a88e22b7SJung-uk Kim case ACPI_DMT_FLAG1: 498*a88e22b7SJung-uk Kim case ACPI_DMT_FLAG2: 499*a88e22b7SJung-uk Kim case ACPI_DMT_FLAG3: 500*a88e22b7SJung-uk Kim case ACPI_DMT_FLAG4: 501*a88e22b7SJung-uk Kim case ACPI_DMT_FLAG5: 502*a88e22b7SJung-uk Kim case ACPI_DMT_FLAG6: 503*a88e22b7SJung-uk Kim case ACPI_DMT_FLAG7: 504*a88e22b7SJung-uk Kim 505*a88e22b7SJung-uk Kim BitPosition = Info->Opcode; 506*a88e22b7SJung-uk Kim BitLength = 1; 507*a88e22b7SJung-uk Kim break; 508*a88e22b7SJung-uk Kim 509*a88e22b7SJung-uk Kim case ACPI_DMT_FLAGS0: 510*a88e22b7SJung-uk Kim 511*a88e22b7SJung-uk Kim BitPosition = 0; 512*a88e22b7SJung-uk Kim BitLength = 2; 513*a88e22b7SJung-uk Kim break; 514*a88e22b7SJung-uk Kim 515*a88e22b7SJung-uk Kim 516*a88e22b7SJung-uk Kim case ACPI_DMT_FLAGS2: 517*a88e22b7SJung-uk Kim 518*a88e22b7SJung-uk Kim BitPosition = 2; 519*a88e22b7SJung-uk Kim BitLength = 2; 520*a88e22b7SJung-uk Kim break; 521*a88e22b7SJung-uk Kim 522*a88e22b7SJung-uk Kim default: 523*a88e22b7SJung-uk Kim 524*a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid flag opcode"); 525*a88e22b7SJung-uk Kim break; 526*a88e22b7SJung-uk Kim } 527*a88e22b7SJung-uk Kim 528*a88e22b7SJung-uk Kim /* Check range of the input flag value */ 529*a88e22b7SJung-uk Kim 530*a88e22b7SJung-uk Kim if (Value >= ((UINT64) 1 << BitLength)) 531*a88e22b7SJung-uk Kim { 532*a88e22b7SJung-uk Kim sprintf (MsgBuffer, "Maximum %u bit", BitLength); 533*a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_FLAG_VALUE, Field, MsgBuffer); 534*a88e22b7SJung-uk Kim Value = 0; 535*a88e22b7SJung-uk Kim } 536*a88e22b7SJung-uk Kim 537*a88e22b7SJung-uk Kim *Buffer |= (UINT8) (Value << BitPosition); 538*a88e22b7SJung-uk Kim } 539