1a88e22b7SJung-uk Kim /****************************************************************************** 2a88e22b7SJung-uk Kim * 3a88e22b7SJung-uk Kim * Module Name: dtfield.c - Code generation for individual source fields 4a88e22b7SJung-uk Kim * 5a88e22b7SJung-uk Kim *****************************************************************************/ 6a88e22b7SJung-uk Kim 7d244b227SJung-uk Kim /* 8d244b227SJung-uk Kim * Copyright (C) 2000 - 2011, Intel Corp. 9a88e22b7SJung-uk Kim * All rights reserved. 10a88e22b7SJung-uk Kim * 11d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 13d244b227SJung-uk Kim * are met: 14d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16d244b227SJung-uk Kim * without modification. 17d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21d244b227SJung-uk Kim * binary redistribution. 22d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24d244b227SJung-uk Kim * from this software without specific prior written permission. 25a88e22b7SJung-uk Kim * 26d244b227SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28d244b227SJung-uk Kim * Software Foundation. 29a88e22b7SJung-uk Kim * 30d244b227SJung-uk Kim * NO WARRANTY 31d244b227SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32d244b227SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33d244b227SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34d244b227SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35d244b227SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36d244b227SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37d244b227SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38d244b227SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39d244b227SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40d244b227SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41d244b227SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42d244b227SJung-uk Kim */ 43a88e22b7SJung-uk Kim 44a88e22b7SJung-uk Kim #define __DTFIELD_C__ 45a88e22b7SJung-uk Kim 46a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 47a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h> 48a88e22b7SJung-uk Kim 49a88e22b7SJung-uk Kim #define _COMPONENT DT_COMPILER 50a88e22b7SJung-uk Kim ACPI_MODULE_NAME ("dtfield") 51a88e22b7SJung-uk Kim 52a88e22b7SJung-uk Kim 53a88e22b7SJung-uk Kim /* Local prototypes */ 54a88e22b7SJung-uk Kim 55a88e22b7SJung-uk Kim static void 56a88e22b7SJung-uk Kim DtCompileString ( 57a88e22b7SJung-uk Kim UINT8 *Buffer, 58a88e22b7SJung-uk Kim DT_FIELD *Field, 59a88e22b7SJung-uk Kim UINT32 ByteLength); 60a88e22b7SJung-uk Kim 61d244b227SJung-uk Kim static void 62d244b227SJung-uk Kim DtCompileUnicode ( 63d244b227SJung-uk Kim UINT8 *Buffer, 64d244b227SJung-uk Kim DT_FIELD *Field, 65d244b227SJung-uk Kim UINT32 ByteLength); 66d244b227SJung-uk Kim 67d244b227SJung-uk Kim static ACPI_STATUS 68d244b227SJung-uk Kim DtCompileUuid ( 69d244b227SJung-uk Kim UINT8 *Buffer, 70d244b227SJung-uk Kim DT_FIELD *Field, 71d244b227SJung-uk Kim UINT32 ByteLength); 72d244b227SJung-uk Kim 73a88e22b7SJung-uk Kim static char * 74a88e22b7SJung-uk Kim DtNormalizeBuffer ( 75a88e22b7SJung-uk Kim char *Buffer, 76a88e22b7SJung-uk Kim UINT32 *Count); 77a88e22b7SJung-uk Kim 78a88e22b7SJung-uk Kim 79a88e22b7SJung-uk Kim /****************************************************************************** 80a88e22b7SJung-uk Kim * 81a88e22b7SJung-uk Kim * FUNCTION: DtCompileOneField 82a88e22b7SJung-uk Kim * 83a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 84a88e22b7SJung-uk Kim * Field - Field to be compiled 85a88e22b7SJung-uk Kim * ByteLength - Byte length of the field 86a88e22b7SJung-uk Kim * Type - Field type 87a88e22b7SJung-uk Kim * 88a88e22b7SJung-uk Kim * RETURN: None 89a88e22b7SJung-uk Kim * 90a88e22b7SJung-uk Kim * DESCRIPTION: Compile a field value to binary 91a88e22b7SJung-uk Kim * 92a88e22b7SJung-uk Kim *****************************************************************************/ 93a88e22b7SJung-uk Kim 94a88e22b7SJung-uk Kim void 95a88e22b7SJung-uk Kim DtCompileOneField ( 96a88e22b7SJung-uk Kim UINT8 *Buffer, 97a88e22b7SJung-uk Kim DT_FIELD *Field, 98a88e22b7SJung-uk Kim UINT32 ByteLength, 99a88e22b7SJung-uk Kim UINT8 Type, 100a88e22b7SJung-uk Kim UINT8 Flags) 101a88e22b7SJung-uk Kim { 102d244b227SJung-uk Kim ACPI_STATUS Status; 103a88e22b7SJung-uk Kim 104a88e22b7SJung-uk Kim switch (Type) 105a88e22b7SJung-uk Kim { 106a88e22b7SJung-uk Kim case DT_FIELD_TYPE_INTEGER: 107a88e22b7SJung-uk Kim DtCompileInteger (Buffer, Field, ByteLength, Flags); 108a88e22b7SJung-uk Kim break; 109a88e22b7SJung-uk Kim 110a88e22b7SJung-uk Kim case DT_FIELD_TYPE_STRING: 111a88e22b7SJung-uk Kim DtCompileString (Buffer, Field, ByteLength); 112a88e22b7SJung-uk Kim break; 113a88e22b7SJung-uk Kim 114d244b227SJung-uk Kim case DT_FIELD_TYPE_UUID: 115d244b227SJung-uk Kim Status = DtCompileUuid (Buffer, Field, ByteLength); 116d244b227SJung-uk Kim if (ACPI_SUCCESS (Status)) 117d244b227SJung-uk Kim { 118d244b227SJung-uk Kim break; 119d244b227SJung-uk Kim } 120d244b227SJung-uk Kim 121d244b227SJung-uk Kim /* Fall through. */ 122d244b227SJung-uk Kim 123a88e22b7SJung-uk Kim case DT_FIELD_TYPE_BUFFER: 124a88e22b7SJung-uk Kim DtCompileBuffer (Buffer, Field->Value, Field, ByteLength); 125a88e22b7SJung-uk Kim break; 126a88e22b7SJung-uk Kim 127d244b227SJung-uk Kim case DT_FIELD_TYPE_UNICODE: 128d244b227SJung-uk Kim DtCompileUnicode (Buffer, Field, ByteLength); 129d244b227SJung-uk Kim break; 130d244b227SJung-uk Kim 131d244b227SJung-uk Kim case DT_FIELD_TYPE_DEVICE_PATH: 132d244b227SJung-uk Kim break; 133d244b227SJung-uk Kim 134a88e22b7SJung-uk Kim default: 135a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid field type"); 136a88e22b7SJung-uk Kim break; 137a88e22b7SJung-uk Kim } 138a88e22b7SJung-uk Kim } 139a88e22b7SJung-uk Kim 140a88e22b7SJung-uk Kim 141a88e22b7SJung-uk Kim /****************************************************************************** 142a88e22b7SJung-uk Kim * 143a88e22b7SJung-uk Kim * FUNCTION: DtCompileString 144a88e22b7SJung-uk Kim * 145a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 146a88e22b7SJung-uk Kim * Field - String to be copied to buffer 147a88e22b7SJung-uk Kim * ByteLength - Maximum length of string 148a88e22b7SJung-uk Kim * 149a88e22b7SJung-uk Kim * RETURN: None 150a88e22b7SJung-uk Kim * 151a88e22b7SJung-uk Kim * DESCRIPTION: Copy string to the buffer 152a88e22b7SJung-uk Kim * 153a88e22b7SJung-uk Kim *****************************************************************************/ 154a88e22b7SJung-uk Kim 155a88e22b7SJung-uk Kim static void 156a88e22b7SJung-uk Kim DtCompileString ( 157a88e22b7SJung-uk Kim UINT8 *Buffer, 158a88e22b7SJung-uk Kim DT_FIELD *Field, 159a88e22b7SJung-uk Kim UINT32 ByteLength) 160a88e22b7SJung-uk Kim { 161a88e22b7SJung-uk Kim UINT32 Length; 162a88e22b7SJung-uk Kim 163a88e22b7SJung-uk Kim 164a88e22b7SJung-uk Kim Length = ACPI_STRLEN (Field->Value); 165a88e22b7SJung-uk Kim 166a88e22b7SJung-uk Kim /* Check if the string is too long for the field */ 167a88e22b7SJung-uk Kim 168a88e22b7SJung-uk Kim if (Length > ByteLength) 169a88e22b7SJung-uk Kim { 170a88e22b7SJung-uk Kim sprintf (MsgBuffer, "Maximum %u characters", ByteLength); 171a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_STRING_LENGTH, Field, MsgBuffer); 172a88e22b7SJung-uk Kim Length = ByteLength; 173a88e22b7SJung-uk Kim } 174a88e22b7SJung-uk Kim 175a88e22b7SJung-uk Kim ACPI_MEMCPY (Buffer, Field->Value, Length); 176a88e22b7SJung-uk Kim } 177a88e22b7SJung-uk Kim 178a88e22b7SJung-uk Kim 179a88e22b7SJung-uk Kim /****************************************************************************** 180a88e22b7SJung-uk Kim * 181d244b227SJung-uk Kim * FUNCTION: DtCompileUnicode 182d244b227SJung-uk Kim * 183d244b227SJung-uk Kim * PARAMETERS: Buffer - Output buffer 184d244b227SJung-uk Kim * Field - String to be copied to buffer 185d244b227SJung-uk Kim * ByteLength - Maximum length of string 186d244b227SJung-uk Kim * 187d244b227SJung-uk Kim * RETURN: None 188d244b227SJung-uk Kim * 189d244b227SJung-uk Kim * DESCRIPTION: Convert ASCII string to Unicode string 190d244b227SJung-uk Kim * 191d244b227SJung-uk Kim * Note: The Unicode string is 16 bits per character, no leading signature, 192d244b227SJung-uk Kim * with a 16-bit terminating NULL. 193d244b227SJung-uk Kim * 194d244b227SJung-uk Kim *****************************************************************************/ 195d244b227SJung-uk Kim 196d244b227SJung-uk Kim static void 197d244b227SJung-uk Kim DtCompileUnicode ( 198d244b227SJung-uk Kim UINT8 *Buffer, 199d244b227SJung-uk Kim DT_FIELD *Field, 200d244b227SJung-uk Kim UINT32 ByteLength) 201d244b227SJung-uk Kim { 202d244b227SJung-uk Kim UINT32 Count; 203d244b227SJung-uk Kim UINT32 i; 204d244b227SJung-uk Kim char *AsciiString; 205d244b227SJung-uk Kim UINT16 *UnicodeString; 206d244b227SJung-uk Kim 207d244b227SJung-uk Kim 208d244b227SJung-uk Kim AsciiString = Field->Value; 209d244b227SJung-uk Kim UnicodeString = (UINT16 *) Buffer; 210d244b227SJung-uk Kim Count = ACPI_STRLEN (AsciiString) + 1; 211d244b227SJung-uk Kim 212d244b227SJung-uk Kim /* Convert to Unicode string (including null terminator) */ 213d244b227SJung-uk Kim 214d244b227SJung-uk Kim for (i = 0; i < Count; i++) 215d244b227SJung-uk Kim { 216d244b227SJung-uk Kim UnicodeString[i] = (UINT16) AsciiString[i]; 217d244b227SJung-uk Kim } 218d244b227SJung-uk Kim } 219d244b227SJung-uk Kim 220d244b227SJung-uk Kim 221d244b227SJung-uk Kim /******************************************************************************* 222d244b227SJung-uk Kim * 223d244b227SJung-uk Kim * FUNCTION: DtCompileUuid 224d244b227SJung-uk Kim * 225d244b227SJung-uk Kim * PARAMETERS: Buffer - Output buffer 226d244b227SJung-uk Kim * Field - String to be copied to buffer 227d244b227SJung-uk Kim * ByteLength - Maximum length of string 228d244b227SJung-uk Kim * 229d244b227SJung-uk Kim * RETURN: None 230d244b227SJung-uk Kim * 231d244b227SJung-uk Kim * DESCRIPTION: Convert UUID string to 16-byte buffer 232d244b227SJung-uk Kim * 233d244b227SJung-uk Kim ******************************************************************************/ 234d244b227SJung-uk Kim 235d244b227SJung-uk Kim static ACPI_STATUS 236d244b227SJung-uk Kim DtCompileUuid ( 237d244b227SJung-uk Kim UINT8 *Buffer, 238d244b227SJung-uk Kim DT_FIELD *Field, 239d244b227SJung-uk Kim UINT32 ByteLength) 240d244b227SJung-uk Kim { 241d244b227SJung-uk Kim char *InString; 242d244b227SJung-uk Kim ACPI_STATUS Status; 243d244b227SJung-uk Kim 244d244b227SJung-uk Kim 245d244b227SJung-uk Kim InString = Field->Value; 246d244b227SJung-uk Kim 247d244b227SJung-uk Kim Status = AuValidateUuid (InString); 248d244b227SJung-uk Kim if (ACPI_FAILURE (Status)) 249d244b227SJung-uk Kim { 250d244b227SJung-uk Kim sprintf (MsgBuffer, "%s", Field->Value); 251d244b227SJung-uk Kim DtNameError (ASL_ERROR, ASL_MSG_INVALID_UUID, Field, MsgBuffer); 252d244b227SJung-uk Kim } 253d244b227SJung-uk Kim else 254d244b227SJung-uk Kim { 255d244b227SJung-uk Kim Status = AuConvertStringToUuid (InString, (char *) Buffer); 256d244b227SJung-uk Kim } 257d244b227SJung-uk Kim 258d244b227SJung-uk Kim return (Status); 259d244b227SJung-uk Kim } 260d244b227SJung-uk Kim 261d244b227SJung-uk Kim 262d244b227SJung-uk Kim /****************************************************************************** 263d244b227SJung-uk Kim * 264a88e22b7SJung-uk Kim * FUNCTION: DtCompileInteger 265a88e22b7SJung-uk Kim * 266a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 267a88e22b7SJung-uk Kim * Field - Field obj with Integer to be compiled 268a88e22b7SJung-uk Kim * ByteLength - Byte length of the integer 2690b94ba42SJung-uk Kim * Flags - Additional compile info 270a88e22b7SJung-uk Kim * 271a88e22b7SJung-uk Kim * RETURN: None 272a88e22b7SJung-uk Kim * 2730b94ba42SJung-uk Kim * DESCRIPTION: Compile an integer. Supports integer expressions with C-style 2740b94ba42SJung-uk Kim * operators. 275a88e22b7SJung-uk Kim * 276a88e22b7SJung-uk Kim *****************************************************************************/ 277a88e22b7SJung-uk Kim 278a88e22b7SJung-uk Kim void 279a88e22b7SJung-uk Kim DtCompileInteger ( 280a88e22b7SJung-uk Kim UINT8 *Buffer, 281a88e22b7SJung-uk Kim DT_FIELD *Field, 282a88e22b7SJung-uk Kim UINT32 ByteLength, 283a88e22b7SJung-uk Kim UINT8 Flags) 284a88e22b7SJung-uk Kim { 2850b94ba42SJung-uk Kim UINT64 Value; 286a88e22b7SJung-uk Kim UINT64 MaxValue; 287d052a1ccSJung-uk Kim ACPI_STATUS Status; 288a88e22b7SJung-uk Kim 289a88e22b7SJung-uk Kim 2900b94ba42SJung-uk Kim /* Output buffer byte length must be in range 1-8 */ 291a88e22b7SJung-uk Kim 292a88e22b7SJung-uk Kim if ((ByteLength > 8) || (ByteLength == 0)) 293a88e22b7SJung-uk Kim { 294a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, 295a88e22b7SJung-uk Kim "Invalid internal Byte length"); 296a88e22b7SJung-uk Kim return; 297a88e22b7SJung-uk Kim } 298a88e22b7SJung-uk Kim 2990b94ba42SJung-uk Kim /* Resolve integer expression to a single integer value */ 300a88e22b7SJung-uk Kim 301d052a1ccSJung-uk Kim Status = DtResolveIntegerExpression (Field, &Value); 302d052a1ccSJung-uk Kim if (ACPI_FAILURE (Status)) 303d052a1ccSJung-uk Kim { 304d052a1ccSJung-uk Kim return; 305d052a1ccSJung-uk Kim } 306a88e22b7SJung-uk Kim 307a88e22b7SJung-uk Kim /* Ensure that reserved fields are set to zero */ 308a88e22b7SJung-uk Kim /* TBD: should we set to zero, or just make this an ERROR? */ 309a88e22b7SJung-uk Kim /* TBD: Probably better to use a flag */ 310a88e22b7SJung-uk Kim 311a88e22b7SJung-uk Kim if (!ACPI_STRCMP (Field->Name, "Reserved") && 312a88e22b7SJung-uk Kim (Value != 0)) 313a88e22b7SJung-uk Kim { 314a88e22b7SJung-uk Kim DtError (ASL_WARNING, ASL_MSG_RESERVED_VALUE, Field, 315a88e22b7SJung-uk Kim "Setting to zero"); 316a88e22b7SJung-uk Kim Value = 0; 317a88e22b7SJung-uk Kim } 318a88e22b7SJung-uk Kim 319a88e22b7SJung-uk Kim /* Check if the value must be non-zero */ 320a88e22b7SJung-uk Kim 321a88e22b7SJung-uk Kim if ((Value == 0) && (Flags & DT_NON_ZERO)) 322a88e22b7SJung-uk Kim { 323a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_ZERO_VALUE, Field, NULL); 324a88e22b7SJung-uk Kim } 325a88e22b7SJung-uk Kim 326a88e22b7SJung-uk Kim /* 327a88e22b7SJung-uk Kim * Generate the maximum value for the data type (ByteLength) 328a88e22b7SJung-uk Kim * Note: construct chosen for maximum portability 329a88e22b7SJung-uk Kim */ 330a88e22b7SJung-uk Kim MaxValue = ((UINT64) (-1)) >> (64 - (ByteLength * 8)); 331a88e22b7SJung-uk Kim 332a88e22b7SJung-uk Kim /* Validate that the input value is within range of the target */ 333a88e22b7SJung-uk Kim 334a88e22b7SJung-uk Kim if (Value > MaxValue) 335a88e22b7SJung-uk Kim { 3360b94ba42SJung-uk Kim sprintf (MsgBuffer, "%8.8X%8.8X", ACPI_FORMAT_UINT64 (Value)); 337a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_INTEGER_SIZE, Field, MsgBuffer); 338a88e22b7SJung-uk Kim } 339a88e22b7SJung-uk Kim 340a88e22b7SJung-uk Kim ACPI_MEMCPY (Buffer, &Value, ByteLength); 341a88e22b7SJung-uk Kim return; 342a88e22b7SJung-uk Kim } 343a88e22b7SJung-uk Kim 344a88e22b7SJung-uk Kim 345a88e22b7SJung-uk Kim /****************************************************************************** 346a88e22b7SJung-uk Kim * 347a88e22b7SJung-uk Kim * FUNCTION: DtNormalizeBuffer 348a88e22b7SJung-uk Kim * 349a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Input buffer 350a88e22b7SJung-uk Kim * Count - Output the count of hex number in 351a88e22b7SJung-uk Kim * the Buffer 352a88e22b7SJung-uk Kim * 353a88e22b7SJung-uk Kim * RETURN: The normalized buffer, freed by caller 354a88e22b7SJung-uk Kim * 355a88e22b7SJung-uk Kim * DESCRIPTION: [1A,2B,3C,4D] or 1A, 2B, 3C, 4D will be normalized 356a88e22b7SJung-uk Kim * to 1A 2B 3C 4D 357a88e22b7SJung-uk Kim * 358a88e22b7SJung-uk Kim *****************************************************************************/ 359a88e22b7SJung-uk Kim 360a88e22b7SJung-uk Kim static char * 361a88e22b7SJung-uk Kim DtNormalizeBuffer ( 362a88e22b7SJung-uk Kim char *Buffer, 363a88e22b7SJung-uk Kim UINT32 *Count) 364a88e22b7SJung-uk Kim { 365a88e22b7SJung-uk Kim char *NewBuffer; 366a88e22b7SJung-uk Kim char *TmpBuffer; 367a88e22b7SJung-uk Kim UINT32 BufferCount = 0; 368a88e22b7SJung-uk Kim BOOLEAN Separator = TRUE; 369a88e22b7SJung-uk Kim char c; 370a88e22b7SJung-uk Kim 371a88e22b7SJung-uk Kim 372a88e22b7SJung-uk Kim NewBuffer = UtLocalCalloc (ACPI_STRLEN (Buffer) + 1); 373a88e22b7SJung-uk Kim TmpBuffer = NewBuffer; 374a88e22b7SJung-uk Kim 375a88e22b7SJung-uk Kim while ((c = *Buffer++)) 376a88e22b7SJung-uk Kim { 377a88e22b7SJung-uk Kim switch (c) 378a88e22b7SJung-uk Kim { 379a88e22b7SJung-uk Kim /* Valid separators */ 380a88e22b7SJung-uk Kim 381a88e22b7SJung-uk Kim case '[': 382a88e22b7SJung-uk Kim case ']': 383a88e22b7SJung-uk Kim case ' ': 384a88e22b7SJung-uk Kim case ',': 385a88e22b7SJung-uk Kim Separator = TRUE; 386a88e22b7SJung-uk Kim break; 387a88e22b7SJung-uk Kim 388a88e22b7SJung-uk Kim default: 389a88e22b7SJung-uk Kim if (Separator) 390a88e22b7SJung-uk Kim { 391a88e22b7SJung-uk Kim /* Insert blank as the standard separator */ 392a88e22b7SJung-uk Kim 393a88e22b7SJung-uk Kim if (NewBuffer[0]) 394a88e22b7SJung-uk Kim { 395a88e22b7SJung-uk Kim *TmpBuffer++ = ' '; 396a88e22b7SJung-uk Kim BufferCount++; 397a88e22b7SJung-uk Kim } 398a88e22b7SJung-uk Kim 399a88e22b7SJung-uk Kim Separator = FALSE; 400a88e22b7SJung-uk Kim } 401a88e22b7SJung-uk Kim 402a88e22b7SJung-uk Kim *TmpBuffer++ = c; 403a88e22b7SJung-uk Kim break; 404a88e22b7SJung-uk Kim } 405a88e22b7SJung-uk Kim } 406a88e22b7SJung-uk Kim 407a88e22b7SJung-uk Kim *Count = BufferCount + 1; 408a88e22b7SJung-uk Kim return (NewBuffer); 409a88e22b7SJung-uk Kim } 410a88e22b7SJung-uk Kim 411a88e22b7SJung-uk Kim 412a88e22b7SJung-uk Kim /****************************************************************************** 413a88e22b7SJung-uk Kim * 414a88e22b7SJung-uk Kim * FUNCTION: DtCompileBuffer 415a88e22b7SJung-uk Kim * 416a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 417a88e22b7SJung-uk Kim * StringValue - Integer list to be compiled 418a88e22b7SJung-uk Kim * Field - Current field object 419a88e22b7SJung-uk Kim * ByteLength - Byte length of the integer list 420a88e22b7SJung-uk Kim * 421a88e22b7SJung-uk Kim * RETURN: Count of remaining data in the input list 422a88e22b7SJung-uk Kim * 423a88e22b7SJung-uk Kim * DESCRIPTION: Compile and pack an integer list, for example 424a88e22b7SJung-uk Kim * "AA 1F 20 3B" ==> Buffer[] = {0xAA,0x1F,0x20,0x3B} 425a88e22b7SJung-uk Kim * 426a88e22b7SJung-uk Kim *****************************************************************************/ 427a88e22b7SJung-uk Kim 428a88e22b7SJung-uk Kim UINT32 429a88e22b7SJung-uk Kim DtCompileBuffer ( 430a88e22b7SJung-uk Kim UINT8 *Buffer, 431a88e22b7SJung-uk Kim char *StringValue, 432a88e22b7SJung-uk Kim DT_FIELD *Field, 433a88e22b7SJung-uk Kim UINT32 ByteLength) 434a88e22b7SJung-uk Kim { 435a88e22b7SJung-uk Kim ACPI_STATUS Status; 436a88e22b7SJung-uk Kim char Hex[3]; 437a88e22b7SJung-uk Kim UINT64 Value; 438a88e22b7SJung-uk Kim UINT32 i; 439a88e22b7SJung-uk Kim UINT32 Count; 440a88e22b7SJung-uk Kim 441a88e22b7SJung-uk Kim 442a88e22b7SJung-uk Kim /* Allow several different types of value separators */ 443a88e22b7SJung-uk Kim 444a88e22b7SJung-uk Kim StringValue = DtNormalizeBuffer (StringValue, &Count); 445a88e22b7SJung-uk Kim 446a88e22b7SJung-uk Kim Hex[2] = 0; 447a88e22b7SJung-uk Kim for (i = 0; i < Count; i++) 448a88e22b7SJung-uk Kim { 449a88e22b7SJung-uk Kim /* Each element of StringValue is three chars */ 450a88e22b7SJung-uk Kim 451a88e22b7SJung-uk Kim Hex[0] = StringValue[(3 * i)]; 452a88e22b7SJung-uk Kim Hex[1] = StringValue[(3 * i) + 1]; 453a88e22b7SJung-uk Kim 454a88e22b7SJung-uk Kim /* Convert one hex byte */ 455a88e22b7SJung-uk Kim 456a88e22b7SJung-uk Kim Value = 0; 457a88e22b7SJung-uk Kim Status = DtStrtoul64 (Hex, &Value); 458a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 459a88e22b7SJung-uk Kim { 460a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_BUFFER_ELEMENT, Field, MsgBuffer); 461a88e22b7SJung-uk Kim return (ByteLength - Count); 462a88e22b7SJung-uk Kim } 463a88e22b7SJung-uk Kim 464a88e22b7SJung-uk Kim Buffer[i] = (UINT8) Value; 465a88e22b7SJung-uk Kim } 466a88e22b7SJung-uk Kim 467a88e22b7SJung-uk Kim ACPI_FREE (StringValue); 468a88e22b7SJung-uk Kim return (ByteLength - Count); 469a88e22b7SJung-uk Kim } 470a88e22b7SJung-uk Kim 471a88e22b7SJung-uk Kim 472a88e22b7SJung-uk Kim /****************************************************************************** 473a88e22b7SJung-uk Kim * 474a88e22b7SJung-uk Kim * FUNCTION: DtCompileFlag 475a88e22b7SJung-uk Kim * 476a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 477a88e22b7SJung-uk Kim * Field - Field to be compiled 478a88e22b7SJung-uk Kim * Info - Flag info 479a88e22b7SJung-uk Kim * 480a88e22b7SJung-uk Kim * RETURN: 481a88e22b7SJung-uk Kim * 482a88e22b7SJung-uk Kim * DESCRIPTION: Compile a flag 483a88e22b7SJung-uk Kim * 484a88e22b7SJung-uk Kim *****************************************************************************/ 485a88e22b7SJung-uk Kim 486a88e22b7SJung-uk Kim void 487a88e22b7SJung-uk Kim DtCompileFlag ( 488a88e22b7SJung-uk Kim UINT8 *Buffer, 489a88e22b7SJung-uk Kim DT_FIELD *Field, 490a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *Info) 491a88e22b7SJung-uk Kim { 492a88e22b7SJung-uk Kim UINT64 Value = 0; 493a88e22b7SJung-uk Kim UINT32 BitLength = 1; 494a88e22b7SJung-uk Kim UINT8 BitPosition = 0; 495a88e22b7SJung-uk Kim ACPI_STATUS Status; 496a88e22b7SJung-uk Kim 497a88e22b7SJung-uk Kim 498a88e22b7SJung-uk Kim Status = DtStrtoul64 (Field->Value, &Value); 499a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 500a88e22b7SJung-uk Kim { 501a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_INVALID_HEX_INTEGER, Field, NULL); 502a88e22b7SJung-uk Kim } 503a88e22b7SJung-uk Kim 504a88e22b7SJung-uk Kim switch (Info->Opcode) 505a88e22b7SJung-uk Kim { 506a88e22b7SJung-uk Kim case ACPI_DMT_FLAG0: 507a88e22b7SJung-uk Kim case ACPI_DMT_FLAG1: 508a88e22b7SJung-uk Kim case ACPI_DMT_FLAG2: 509a88e22b7SJung-uk Kim case ACPI_DMT_FLAG3: 510a88e22b7SJung-uk Kim case ACPI_DMT_FLAG4: 511a88e22b7SJung-uk Kim case ACPI_DMT_FLAG5: 512a88e22b7SJung-uk Kim case ACPI_DMT_FLAG6: 513a88e22b7SJung-uk Kim case ACPI_DMT_FLAG7: 514a88e22b7SJung-uk Kim 515a88e22b7SJung-uk Kim BitPosition = Info->Opcode; 516a88e22b7SJung-uk Kim BitLength = 1; 517a88e22b7SJung-uk Kim break; 518a88e22b7SJung-uk Kim 519a88e22b7SJung-uk Kim case ACPI_DMT_FLAGS0: 520a88e22b7SJung-uk Kim 521a88e22b7SJung-uk Kim BitPosition = 0; 522a88e22b7SJung-uk Kim BitLength = 2; 523a88e22b7SJung-uk Kim break; 524a88e22b7SJung-uk Kim 525a88e22b7SJung-uk Kim 526*3f0275a0SJung-uk Kim case ACPI_DMT_FLAGS1: 527*3f0275a0SJung-uk Kim 528*3f0275a0SJung-uk Kim BitPosition = 1; 529*3f0275a0SJung-uk Kim BitLength = 2; 530*3f0275a0SJung-uk Kim break; 531*3f0275a0SJung-uk Kim 532*3f0275a0SJung-uk Kim 533a88e22b7SJung-uk Kim case ACPI_DMT_FLAGS2: 534a88e22b7SJung-uk Kim 535a88e22b7SJung-uk Kim BitPosition = 2; 536a88e22b7SJung-uk Kim BitLength = 2; 537a88e22b7SJung-uk Kim break; 538a88e22b7SJung-uk Kim 539*3f0275a0SJung-uk Kim case ACPI_DMT_FLAGS4: 540*3f0275a0SJung-uk Kim 541*3f0275a0SJung-uk Kim BitPosition = 4; 542*3f0275a0SJung-uk Kim BitLength = 2; 543*3f0275a0SJung-uk Kim break; 544*3f0275a0SJung-uk Kim 545a88e22b7SJung-uk Kim default: 546a88e22b7SJung-uk Kim 547a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid flag opcode"); 548a88e22b7SJung-uk Kim break; 549a88e22b7SJung-uk Kim } 550a88e22b7SJung-uk Kim 551a88e22b7SJung-uk Kim /* Check range of the input flag value */ 552a88e22b7SJung-uk Kim 553a88e22b7SJung-uk Kim if (Value >= ((UINT64) 1 << BitLength)) 554a88e22b7SJung-uk Kim { 555a88e22b7SJung-uk Kim sprintf (MsgBuffer, "Maximum %u bit", BitLength); 556a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_FLAG_VALUE, Field, MsgBuffer); 557a88e22b7SJung-uk Kim Value = 0; 558a88e22b7SJung-uk Kim } 559a88e22b7SJung-uk Kim 560a88e22b7SJung-uk Kim *Buffer |= (UINT8) (Value << BitPosition); 561a88e22b7SJung-uk Kim } 562