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 /* 8efcc2a30SJung-uk Kim * Copyright (C) 2000 - 2013, 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: 107a9d8d09cSJung-uk Kim 108a88e22b7SJung-uk Kim DtCompileInteger (Buffer, Field, ByteLength, Flags); 109a88e22b7SJung-uk Kim break; 110a88e22b7SJung-uk Kim 111a88e22b7SJung-uk Kim case DT_FIELD_TYPE_STRING: 112a9d8d09cSJung-uk Kim 113a88e22b7SJung-uk Kim DtCompileString (Buffer, Field, ByteLength); 114a88e22b7SJung-uk Kim break; 115a88e22b7SJung-uk Kim 116d244b227SJung-uk Kim case DT_FIELD_TYPE_UUID: 117a9d8d09cSJung-uk Kim 118d244b227SJung-uk Kim Status = DtCompileUuid (Buffer, Field, ByteLength); 119d244b227SJung-uk Kim if (ACPI_SUCCESS (Status)) 120d244b227SJung-uk Kim { 121d244b227SJung-uk Kim break; 122d244b227SJung-uk Kim } 123d244b227SJung-uk Kim 124d244b227SJung-uk Kim /* Fall through. */ 125d244b227SJung-uk Kim 126a88e22b7SJung-uk Kim case DT_FIELD_TYPE_BUFFER: 127a9d8d09cSJung-uk Kim 128a88e22b7SJung-uk Kim DtCompileBuffer (Buffer, Field->Value, Field, ByteLength); 129a88e22b7SJung-uk Kim break; 130a88e22b7SJung-uk Kim 131d244b227SJung-uk Kim case DT_FIELD_TYPE_UNICODE: 132a9d8d09cSJung-uk Kim 133d244b227SJung-uk Kim DtCompileUnicode (Buffer, Field, ByteLength); 134d244b227SJung-uk Kim break; 135d244b227SJung-uk Kim 136d244b227SJung-uk Kim case DT_FIELD_TYPE_DEVICE_PATH: 137a9d8d09cSJung-uk Kim 138d244b227SJung-uk Kim break; 139d244b227SJung-uk Kim 140a88e22b7SJung-uk Kim default: 141a9d8d09cSJung-uk Kim 142a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid field type"); 143a88e22b7SJung-uk Kim break; 144a88e22b7SJung-uk Kim } 145a88e22b7SJung-uk Kim } 146a88e22b7SJung-uk Kim 147a88e22b7SJung-uk Kim 148a88e22b7SJung-uk Kim /****************************************************************************** 149a88e22b7SJung-uk Kim * 150a88e22b7SJung-uk Kim * FUNCTION: DtCompileString 151a88e22b7SJung-uk Kim * 152a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 153a88e22b7SJung-uk Kim * Field - String to be copied to buffer 154a88e22b7SJung-uk Kim * ByteLength - Maximum length of string 155a88e22b7SJung-uk Kim * 156a88e22b7SJung-uk Kim * RETURN: None 157a88e22b7SJung-uk Kim * 158a88e22b7SJung-uk Kim * DESCRIPTION: Copy string to the buffer 159a88e22b7SJung-uk Kim * 160a88e22b7SJung-uk Kim *****************************************************************************/ 161a88e22b7SJung-uk Kim 162a88e22b7SJung-uk Kim static void 163a88e22b7SJung-uk Kim DtCompileString ( 164a88e22b7SJung-uk Kim UINT8 *Buffer, 165a88e22b7SJung-uk Kim DT_FIELD *Field, 166a88e22b7SJung-uk Kim UINT32 ByteLength) 167a88e22b7SJung-uk Kim { 168a88e22b7SJung-uk Kim UINT32 Length; 169a88e22b7SJung-uk Kim 170a88e22b7SJung-uk Kim 171a88e22b7SJung-uk Kim Length = ACPI_STRLEN (Field->Value); 172a88e22b7SJung-uk Kim 173a88e22b7SJung-uk Kim /* Check if the string is too long for the field */ 174a88e22b7SJung-uk Kim 175a88e22b7SJung-uk Kim if (Length > ByteLength) 176a88e22b7SJung-uk Kim { 177a88e22b7SJung-uk Kim sprintf (MsgBuffer, "Maximum %u characters", ByteLength); 178a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_STRING_LENGTH, Field, MsgBuffer); 179a88e22b7SJung-uk Kim Length = ByteLength; 180a88e22b7SJung-uk Kim } 181a88e22b7SJung-uk Kim 182a88e22b7SJung-uk Kim ACPI_MEMCPY (Buffer, Field->Value, Length); 183a88e22b7SJung-uk Kim } 184a88e22b7SJung-uk Kim 185a88e22b7SJung-uk Kim 186a88e22b7SJung-uk Kim /****************************************************************************** 187a88e22b7SJung-uk Kim * 188d244b227SJung-uk Kim * FUNCTION: DtCompileUnicode 189d244b227SJung-uk Kim * 190d244b227SJung-uk Kim * PARAMETERS: Buffer - Output buffer 191d244b227SJung-uk Kim * Field - String to be copied to buffer 192d244b227SJung-uk Kim * ByteLength - Maximum length of string 193d244b227SJung-uk Kim * 194d244b227SJung-uk Kim * RETURN: None 195d244b227SJung-uk Kim * 196d244b227SJung-uk Kim * DESCRIPTION: Convert ASCII string to Unicode string 197d244b227SJung-uk Kim * 198d244b227SJung-uk Kim * Note: The Unicode string is 16 bits per character, no leading signature, 199d244b227SJung-uk Kim * with a 16-bit terminating NULL. 200d244b227SJung-uk Kim * 201d244b227SJung-uk Kim *****************************************************************************/ 202d244b227SJung-uk Kim 203d244b227SJung-uk Kim static void 204d244b227SJung-uk Kim DtCompileUnicode ( 205d244b227SJung-uk Kim UINT8 *Buffer, 206d244b227SJung-uk Kim DT_FIELD *Field, 207d244b227SJung-uk Kim UINT32 ByteLength) 208d244b227SJung-uk Kim { 209d244b227SJung-uk Kim UINT32 Count; 210d244b227SJung-uk Kim UINT32 i; 211d244b227SJung-uk Kim char *AsciiString; 212d244b227SJung-uk Kim UINT16 *UnicodeString; 213d244b227SJung-uk Kim 214d244b227SJung-uk Kim 215d244b227SJung-uk Kim AsciiString = Field->Value; 216d244b227SJung-uk Kim UnicodeString = (UINT16 *) Buffer; 217d244b227SJung-uk Kim Count = ACPI_STRLEN (AsciiString) + 1; 218d244b227SJung-uk Kim 219d244b227SJung-uk Kim /* Convert to Unicode string (including null terminator) */ 220d244b227SJung-uk Kim 221d244b227SJung-uk Kim for (i = 0; i < Count; i++) 222d244b227SJung-uk Kim { 223d244b227SJung-uk Kim UnicodeString[i] = (UINT16) AsciiString[i]; 224d244b227SJung-uk Kim } 225d244b227SJung-uk Kim } 226d244b227SJung-uk Kim 227d244b227SJung-uk Kim 228d244b227SJung-uk Kim /******************************************************************************* 229d244b227SJung-uk Kim * 230d244b227SJung-uk Kim * FUNCTION: DtCompileUuid 231d244b227SJung-uk Kim * 232d244b227SJung-uk Kim * PARAMETERS: Buffer - Output buffer 233d244b227SJung-uk Kim * Field - String to be copied to buffer 234d244b227SJung-uk Kim * ByteLength - Maximum length of string 235d244b227SJung-uk Kim * 236d244b227SJung-uk Kim * RETURN: None 237d244b227SJung-uk Kim * 238d244b227SJung-uk Kim * DESCRIPTION: Convert UUID string to 16-byte buffer 239d244b227SJung-uk Kim * 240d244b227SJung-uk Kim ******************************************************************************/ 241d244b227SJung-uk Kim 242d244b227SJung-uk Kim static ACPI_STATUS 243d244b227SJung-uk Kim DtCompileUuid ( 244d244b227SJung-uk Kim UINT8 *Buffer, 245d244b227SJung-uk Kim DT_FIELD *Field, 246d244b227SJung-uk Kim UINT32 ByteLength) 247d244b227SJung-uk Kim { 248d244b227SJung-uk Kim char *InString; 249d244b227SJung-uk Kim ACPI_STATUS Status; 250d244b227SJung-uk Kim 251d244b227SJung-uk Kim 252d244b227SJung-uk Kim InString = Field->Value; 253d244b227SJung-uk Kim 254d244b227SJung-uk Kim Status = AuValidateUuid (InString); 255d244b227SJung-uk Kim if (ACPI_FAILURE (Status)) 256d244b227SJung-uk Kim { 257d244b227SJung-uk Kim sprintf (MsgBuffer, "%s", Field->Value); 258d244b227SJung-uk Kim DtNameError (ASL_ERROR, ASL_MSG_INVALID_UUID, Field, MsgBuffer); 259d244b227SJung-uk Kim } 260d244b227SJung-uk Kim else 261d244b227SJung-uk Kim { 262d244b227SJung-uk Kim Status = AuConvertStringToUuid (InString, (char *) Buffer); 263d244b227SJung-uk Kim } 264d244b227SJung-uk Kim 265d244b227SJung-uk Kim return (Status); 266d244b227SJung-uk Kim } 267d244b227SJung-uk Kim 268d244b227SJung-uk Kim 269d244b227SJung-uk Kim /****************************************************************************** 270d244b227SJung-uk Kim * 271a88e22b7SJung-uk Kim * FUNCTION: DtCompileInteger 272a88e22b7SJung-uk Kim * 273a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 274a88e22b7SJung-uk Kim * Field - Field obj with Integer to be compiled 275a88e22b7SJung-uk Kim * ByteLength - Byte length of the integer 2760b94ba42SJung-uk Kim * Flags - Additional compile info 277a88e22b7SJung-uk Kim * 278a88e22b7SJung-uk Kim * RETURN: None 279a88e22b7SJung-uk Kim * 2800b94ba42SJung-uk Kim * DESCRIPTION: Compile an integer. Supports integer expressions with C-style 2810b94ba42SJung-uk Kim * operators. 282a88e22b7SJung-uk Kim * 283a88e22b7SJung-uk Kim *****************************************************************************/ 284a88e22b7SJung-uk Kim 285a88e22b7SJung-uk Kim void 286a88e22b7SJung-uk Kim DtCompileInteger ( 287a88e22b7SJung-uk Kim UINT8 *Buffer, 288a88e22b7SJung-uk Kim DT_FIELD *Field, 289a88e22b7SJung-uk Kim UINT32 ByteLength, 290a88e22b7SJung-uk Kim UINT8 Flags) 291a88e22b7SJung-uk Kim { 2920b94ba42SJung-uk Kim UINT64 Value; 293a88e22b7SJung-uk Kim UINT64 MaxValue; 294d052a1ccSJung-uk Kim ACPI_STATUS Status; 295a88e22b7SJung-uk Kim 296a88e22b7SJung-uk Kim 2970b94ba42SJung-uk Kim /* Output buffer byte length must be in range 1-8 */ 298a88e22b7SJung-uk Kim 299a88e22b7SJung-uk Kim if ((ByteLength > 8) || (ByteLength == 0)) 300a88e22b7SJung-uk Kim { 301a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, 302a88e22b7SJung-uk Kim "Invalid internal Byte length"); 303a88e22b7SJung-uk Kim return; 304a88e22b7SJung-uk Kim } 305a88e22b7SJung-uk Kim 3060b94ba42SJung-uk Kim /* Resolve integer expression to a single integer value */ 307a88e22b7SJung-uk Kim 308d052a1ccSJung-uk Kim Status = DtResolveIntegerExpression (Field, &Value); 309d052a1ccSJung-uk Kim if (ACPI_FAILURE (Status)) 310d052a1ccSJung-uk Kim { 311d052a1ccSJung-uk Kim return; 312d052a1ccSJung-uk Kim } 313a88e22b7SJung-uk Kim 314a88e22b7SJung-uk Kim /* Ensure that reserved fields are set to zero */ 315a88e22b7SJung-uk Kim /* TBD: should we set to zero, or just make this an ERROR? */ 316a88e22b7SJung-uk Kim /* TBD: Probably better to use a flag */ 317a88e22b7SJung-uk Kim 318a88e22b7SJung-uk Kim if (!ACPI_STRCMP (Field->Name, "Reserved") && 319a88e22b7SJung-uk Kim (Value != 0)) 320a88e22b7SJung-uk Kim { 321a88e22b7SJung-uk Kim DtError (ASL_WARNING, ASL_MSG_RESERVED_VALUE, Field, 322a88e22b7SJung-uk Kim "Setting to zero"); 323a88e22b7SJung-uk Kim Value = 0; 324a88e22b7SJung-uk Kim } 325a88e22b7SJung-uk Kim 326a88e22b7SJung-uk Kim /* Check if the value must be non-zero */ 327a88e22b7SJung-uk Kim 328a88e22b7SJung-uk Kim if ((Value == 0) && (Flags & DT_NON_ZERO)) 329a88e22b7SJung-uk Kim { 330a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_ZERO_VALUE, Field, NULL); 331a88e22b7SJung-uk Kim } 332a88e22b7SJung-uk Kim 333a88e22b7SJung-uk Kim /* 334a88e22b7SJung-uk Kim * Generate the maximum value for the data type (ByteLength) 335a88e22b7SJung-uk Kim * Note: construct chosen for maximum portability 336a88e22b7SJung-uk Kim */ 337a88e22b7SJung-uk Kim MaxValue = ((UINT64) (-1)) >> (64 - (ByteLength * 8)); 338a88e22b7SJung-uk Kim 339a88e22b7SJung-uk Kim /* Validate that the input value is within range of the target */ 340a88e22b7SJung-uk Kim 341a88e22b7SJung-uk Kim if (Value > MaxValue) 342a88e22b7SJung-uk Kim { 3430b94ba42SJung-uk Kim sprintf (MsgBuffer, "%8.8X%8.8X", ACPI_FORMAT_UINT64 (Value)); 344a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_INTEGER_SIZE, Field, MsgBuffer); 345a88e22b7SJung-uk Kim } 346a88e22b7SJung-uk Kim 347a88e22b7SJung-uk Kim ACPI_MEMCPY (Buffer, &Value, ByteLength); 348a88e22b7SJung-uk Kim return; 349a88e22b7SJung-uk Kim } 350a88e22b7SJung-uk Kim 351a88e22b7SJung-uk Kim 352a88e22b7SJung-uk Kim /****************************************************************************** 353a88e22b7SJung-uk Kim * 354a88e22b7SJung-uk Kim * FUNCTION: DtNormalizeBuffer 355a88e22b7SJung-uk Kim * 356a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Input buffer 357a88e22b7SJung-uk Kim * Count - Output the count of hex number in 358a88e22b7SJung-uk Kim * the Buffer 359a88e22b7SJung-uk Kim * 360a88e22b7SJung-uk Kim * RETURN: The normalized buffer, freed by caller 361a88e22b7SJung-uk Kim * 362a88e22b7SJung-uk Kim * DESCRIPTION: [1A,2B,3C,4D] or 1A, 2B, 3C, 4D will be normalized 363a88e22b7SJung-uk Kim * to 1A 2B 3C 4D 364a88e22b7SJung-uk Kim * 365a88e22b7SJung-uk Kim *****************************************************************************/ 366a88e22b7SJung-uk Kim 367a88e22b7SJung-uk Kim static char * 368a88e22b7SJung-uk Kim DtNormalizeBuffer ( 369a88e22b7SJung-uk Kim char *Buffer, 370a88e22b7SJung-uk Kim UINT32 *Count) 371a88e22b7SJung-uk Kim { 372a88e22b7SJung-uk Kim char *NewBuffer; 373a88e22b7SJung-uk Kim char *TmpBuffer; 374a88e22b7SJung-uk Kim UINT32 BufferCount = 0; 375a88e22b7SJung-uk Kim BOOLEAN Separator = TRUE; 376a88e22b7SJung-uk Kim char c; 377a88e22b7SJung-uk Kim 378a88e22b7SJung-uk Kim 379a88e22b7SJung-uk Kim NewBuffer = UtLocalCalloc (ACPI_STRLEN (Buffer) + 1); 380a88e22b7SJung-uk Kim TmpBuffer = NewBuffer; 381a88e22b7SJung-uk Kim 382a88e22b7SJung-uk Kim while ((c = *Buffer++)) 383a88e22b7SJung-uk Kim { 384a88e22b7SJung-uk Kim switch (c) 385a88e22b7SJung-uk Kim { 386a88e22b7SJung-uk Kim /* Valid separators */ 387a88e22b7SJung-uk Kim 388a88e22b7SJung-uk Kim case '[': 389a88e22b7SJung-uk Kim case ']': 390a88e22b7SJung-uk Kim case ' ': 391a88e22b7SJung-uk Kim case ',': 392a9d8d09cSJung-uk Kim 393a88e22b7SJung-uk Kim Separator = TRUE; 394a88e22b7SJung-uk Kim break; 395a88e22b7SJung-uk Kim 396a88e22b7SJung-uk Kim default: 397a9d8d09cSJung-uk Kim 398a88e22b7SJung-uk Kim if (Separator) 399a88e22b7SJung-uk Kim { 400a88e22b7SJung-uk Kim /* Insert blank as the standard separator */ 401a88e22b7SJung-uk Kim 402a88e22b7SJung-uk Kim if (NewBuffer[0]) 403a88e22b7SJung-uk Kim { 404a88e22b7SJung-uk Kim *TmpBuffer++ = ' '; 405a88e22b7SJung-uk Kim BufferCount++; 406a88e22b7SJung-uk Kim } 407a88e22b7SJung-uk Kim 408a88e22b7SJung-uk Kim Separator = FALSE; 409a88e22b7SJung-uk Kim } 410a88e22b7SJung-uk Kim 411a88e22b7SJung-uk Kim *TmpBuffer++ = c; 412a88e22b7SJung-uk Kim break; 413a88e22b7SJung-uk Kim } 414a88e22b7SJung-uk Kim } 415a88e22b7SJung-uk Kim 416a88e22b7SJung-uk Kim *Count = BufferCount + 1; 417a88e22b7SJung-uk Kim return (NewBuffer); 418a88e22b7SJung-uk Kim } 419a88e22b7SJung-uk Kim 420a88e22b7SJung-uk Kim 421a88e22b7SJung-uk Kim /****************************************************************************** 422a88e22b7SJung-uk Kim * 423a88e22b7SJung-uk Kim * FUNCTION: DtCompileBuffer 424a88e22b7SJung-uk Kim * 425a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 426a88e22b7SJung-uk Kim * StringValue - Integer list to be compiled 427a88e22b7SJung-uk Kim * Field - Current field object 428a88e22b7SJung-uk Kim * ByteLength - Byte length of the integer list 429a88e22b7SJung-uk Kim * 430a88e22b7SJung-uk Kim * RETURN: Count of remaining data in the input list 431a88e22b7SJung-uk Kim * 432a88e22b7SJung-uk Kim * DESCRIPTION: Compile and pack an integer list, for example 433a88e22b7SJung-uk Kim * "AA 1F 20 3B" ==> Buffer[] = {0xAA,0x1F,0x20,0x3B} 434a88e22b7SJung-uk Kim * 435a88e22b7SJung-uk Kim *****************************************************************************/ 436a88e22b7SJung-uk Kim 437a88e22b7SJung-uk Kim UINT32 438a88e22b7SJung-uk Kim DtCompileBuffer ( 439a88e22b7SJung-uk Kim UINT8 *Buffer, 440a88e22b7SJung-uk Kim char *StringValue, 441a88e22b7SJung-uk Kim DT_FIELD *Field, 442a88e22b7SJung-uk Kim UINT32 ByteLength) 443a88e22b7SJung-uk Kim { 444a88e22b7SJung-uk Kim ACPI_STATUS Status; 445a88e22b7SJung-uk Kim char Hex[3]; 446a88e22b7SJung-uk Kim UINT64 Value; 447a88e22b7SJung-uk Kim UINT32 i; 448a88e22b7SJung-uk Kim UINT32 Count; 449a88e22b7SJung-uk Kim 450a88e22b7SJung-uk Kim 451a88e22b7SJung-uk Kim /* Allow several different types of value separators */ 452a88e22b7SJung-uk Kim 453a88e22b7SJung-uk Kim StringValue = DtNormalizeBuffer (StringValue, &Count); 454a88e22b7SJung-uk Kim 455a88e22b7SJung-uk Kim Hex[2] = 0; 456a88e22b7SJung-uk Kim for (i = 0; i < Count; i++) 457a88e22b7SJung-uk Kim { 458a88e22b7SJung-uk Kim /* Each element of StringValue is three chars */ 459a88e22b7SJung-uk Kim 460a88e22b7SJung-uk Kim Hex[0] = StringValue[(3 * i)]; 461a88e22b7SJung-uk Kim Hex[1] = StringValue[(3 * i) + 1]; 462a88e22b7SJung-uk Kim 463a88e22b7SJung-uk Kim /* Convert one hex byte */ 464a88e22b7SJung-uk Kim 465a88e22b7SJung-uk Kim Value = 0; 466a88e22b7SJung-uk Kim Status = DtStrtoul64 (Hex, &Value); 467a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 468a88e22b7SJung-uk Kim { 469a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_BUFFER_ELEMENT, Field, MsgBuffer); 470*8d744e47SJung-uk Kim goto Exit; 471a88e22b7SJung-uk Kim } 472a88e22b7SJung-uk Kim 473a88e22b7SJung-uk Kim Buffer[i] = (UINT8) Value; 474a88e22b7SJung-uk Kim } 475a88e22b7SJung-uk Kim 476*8d744e47SJung-uk Kim Exit: 477a88e22b7SJung-uk Kim ACPI_FREE (StringValue); 478a88e22b7SJung-uk Kim return (ByteLength - Count); 479a88e22b7SJung-uk Kim } 480a88e22b7SJung-uk Kim 481a88e22b7SJung-uk Kim 482a88e22b7SJung-uk Kim /****************************************************************************** 483a88e22b7SJung-uk Kim * 484a88e22b7SJung-uk Kim * FUNCTION: DtCompileFlag 485a88e22b7SJung-uk Kim * 486a88e22b7SJung-uk Kim * PARAMETERS: Buffer - Output buffer 487a88e22b7SJung-uk Kim * Field - Field to be compiled 488a88e22b7SJung-uk Kim * Info - Flag info 489a88e22b7SJung-uk Kim * 490a88e22b7SJung-uk Kim * RETURN: 491a88e22b7SJung-uk Kim * 492a88e22b7SJung-uk Kim * DESCRIPTION: Compile a flag 493a88e22b7SJung-uk Kim * 494a88e22b7SJung-uk Kim *****************************************************************************/ 495a88e22b7SJung-uk Kim 496a88e22b7SJung-uk Kim void 497a88e22b7SJung-uk Kim DtCompileFlag ( 498a88e22b7SJung-uk Kim UINT8 *Buffer, 499a88e22b7SJung-uk Kim DT_FIELD *Field, 500a88e22b7SJung-uk Kim ACPI_DMTABLE_INFO *Info) 501a88e22b7SJung-uk Kim { 502a88e22b7SJung-uk Kim UINT64 Value = 0; 503a88e22b7SJung-uk Kim UINT32 BitLength = 1; 504a88e22b7SJung-uk Kim UINT8 BitPosition = 0; 505a88e22b7SJung-uk Kim ACPI_STATUS Status; 506a88e22b7SJung-uk Kim 507a88e22b7SJung-uk Kim 508a88e22b7SJung-uk Kim Status = DtStrtoul64 (Field->Value, &Value); 509a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 510a88e22b7SJung-uk Kim { 511a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_INVALID_HEX_INTEGER, Field, NULL); 512a88e22b7SJung-uk Kim } 513a88e22b7SJung-uk Kim 514a88e22b7SJung-uk Kim switch (Info->Opcode) 515a88e22b7SJung-uk Kim { 516a88e22b7SJung-uk Kim case ACPI_DMT_FLAG0: 517a88e22b7SJung-uk Kim case ACPI_DMT_FLAG1: 518a88e22b7SJung-uk Kim case ACPI_DMT_FLAG2: 519a88e22b7SJung-uk Kim case ACPI_DMT_FLAG3: 520a88e22b7SJung-uk Kim case ACPI_DMT_FLAG4: 521a88e22b7SJung-uk Kim case ACPI_DMT_FLAG5: 522a88e22b7SJung-uk Kim case ACPI_DMT_FLAG6: 523a88e22b7SJung-uk Kim case ACPI_DMT_FLAG7: 524a88e22b7SJung-uk Kim 525a88e22b7SJung-uk Kim BitPosition = Info->Opcode; 526a88e22b7SJung-uk Kim BitLength = 1; 527a88e22b7SJung-uk Kim break; 528a88e22b7SJung-uk Kim 529a88e22b7SJung-uk Kim case ACPI_DMT_FLAGS0: 530a88e22b7SJung-uk Kim 531a88e22b7SJung-uk Kim BitPosition = 0; 532a88e22b7SJung-uk Kim BitLength = 2; 533a88e22b7SJung-uk Kim break; 534a88e22b7SJung-uk Kim 535a88e22b7SJung-uk Kim 5363f0275a0SJung-uk Kim case ACPI_DMT_FLAGS1: 5373f0275a0SJung-uk Kim 5383f0275a0SJung-uk Kim BitPosition = 1; 5393f0275a0SJung-uk Kim BitLength = 2; 5403f0275a0SJung-uk Kim break; 5413f0275a0SJung-uk Kim 5423f0275a0SJung-uk Kim 543a88e22b7SJung-uk Kim case ACPI_DMT_FLAGS2: 544a88e22b7SJung-uk Kim 545a88e22b7SJung-uk Kim BitPosition = 2; 546a88e22b7SJung-uk Kim BitLength = 2; 547a88e22b7SJung-uk Kim break; 548a88e22b7SJung-uk Kim 5493f0275a0SJung-uk Kim case ACPI_DMT_FLAGS4: 5503f0275a0SJung-uk Kim 5513f0275a0SJung-uk Kim BitPosition = 4; 5523f0275a0SJung-uk Kim BitLength = 2; 5533f0275a0SJung-uk Kim break; 5543f0275a0SJung-uk Kim 555a88e22b7SJung-uk Kim default: 556a88e22b7SJung-uk Kim 557a88e22b7SJung-uk Kim DtFatal (ASL_MSG_COMPILER_INTERNAL, Field, "Invalid flag opcode"); 558a88e22b7SJung-uk Kim break; 559a88e22b7SJung-uk Kim } 560a88e22b7SJung-uk Kim 561a88e22b7SJung-uk Kim /* Check range of the input flag value */ 562a88e22b7SJung-uk Kim 563a88e22b7SJung-uk Kim if (Value >= ((UINT64) 1 << BitLength)) 564a88e22b7SJung-uk Kim { 565a88e22b7SJung-uk Kim sprintf (MsgBuffer, "Maximum %u bit", BitLength); 566a88e22b7SJung-uk Kim DtError (ASL_ERROR, ASL_MSG_FLAG_VALUE, Field, MsgBuffer); 567a88e22b7SJung-uk Kim Value = 0; 568a88e22b7SJung-uk Kim } 569a88e22b7SJung-uk Kim 570a88e22b7SJung-uk Kim *Buffer |= (UINT8) (Value << BitPosition); 571a88e22b7SJung-uk Kim } 572