1100966Siwasaki/******************************************************************************* 2100966Siwasaki * 3100966Siwasaki * Module Name: dmbuffer - AML disassembler, buffer and string support 4100966Siwasaki * 5100966Siwasaki ******************************************************************************/ 6100966Siwasaki 7217365Sjkim/* 8217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp. 9100966Siwasaki * All rights reserved. 10100966Siwasaki * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 25100966Siwasaki * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 29100966Siwasaki * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 43100966Siwasaki 44100966Siwasaki 45193341Sjkim#include <contrib/dev/acpica/include/acpi.h> 46193341Sjkim#include <contrib/dev/acpica/include/accommon.h> 47193341Sjkim#include <contrib/dev/acpica/include/acdisasm.h> 48193341Sjkim#include <contrib/dev/acpica/include/acparser.h> 49193341Sjkim#include <contrib/dev/acpica/include/amlcode.h> 50100966Siwasaki 51100966Siwasaki 52100966Siwasaki#ifdef ACPI_DISASSEMBLER 53100966Siwasaki 54102550Siwasaki#define _COMPONENT ACPI_CA_DEBUGGER 55100966Siwasaki ACPI_MODULE_NAME ("dmbuffer") 56100966Siwasaki 57151937Sjkim/* Local prototypes */ 58100966Siwasaki 59151937Sjkimstatic void 60151937SjkimAcpiDmUnicode ( 61151937Sjkim ACPI_PARSE_OBJECT *Op); 62151937Sjkim 63193267Sjkimstatic void 64193267SjkimAcpiDmIsEisaIdElement ( 65193267Sjkim ACPI_PARSE_OBJECT *Op); 66151937Sjkim 67193267Sjkim 68100966Siwasaki/******************************************************************************* 69100966Siwasaki * 70100966Siwasaki * FUNCTION: AcpiDmDisasmByteList 71100966Siwasaki * 72100966Siwasaki * PARAMETERS: Level - Current source code indentation level 73100966Siwasaki * ByteData - Pointer to the byte list 74100966Siwasaki * ByteCount - Length of the byte list 75100966Siwasaki * 76100966Siwasaki * RETURN: None 77100966Siwasaki * 78167802Sjkim * DESCRIPTION: Dump an AML "ByteList" in Hex format. 8 bytes per line, prefixed 79167802Sjkim * with the hex buffer offset. 80100966Siwasaki * 81100966Siwasaki ******************************************************************************/ 82100966Siwasaki 83100966Siwasakivoid 84100966SiwasakiAcpiDmDisasmByteList ( 85100966Siwasaki UINT32 Level, 86100966Siwasaki UINT8 *ByteData, 87100966Siwasaki UINT32 ByteCount) 88100966Siwasaki{ 89100966Siwasaki UINT32 i; 90100966Siwasaki 91100966Siwasaki 92167802Sjkim if (!ByteCount) 93167802Sjkim { 94167802Sjkim return; 95167802Sjkim } 96100966Siwasaki 97100966Siwasaki /* Dump the byte list */ 98100966Siwasaki 99100966Siwasaki for (i = 0; i < ByteCount; i++) 100100966Siwasaki { 101167802Sjkim /* New line every 8 bytes */ 102167802Sjkim 103167802Sjkim if (((i % 8) == 0) && (i < ByteCount)) 104167802Sjkim { 105167802Sjkim if (i > 0) 106167802Sjkim { 107167802Sjkim AcpiOsPrintf ("\n"); 108167802Sjkim } 109167802Sjkim 110167802Sjkim AcpiDmIndent (Level); 111167802Sjkim if (ByteCount > 7) 112167802Sjkim { 113167802Sjkim AcpiOsPrintf ("/* %04X */ ", i); 114167802Sjkim } 115167802Sjkim } 116167802Sjkim 117100966Siwasaki AcpiOsPrintf ("0x%2.2X", (UINT32) ByteData[i]); 118100966Siwasaki 119100966Siwasaki /* Add comma if there are more bytes to display */ 120100966Siwasaki 121100966Siwasaki if (i < (ByteCount -1)) 122100966Siwasaki { 123100966Siwasaki AcpiOsPrintf (", "); 124100966Siwasaki } 125100966Siwasaki } 126100966Siwasaki 127100966Siwasaki if (Level) 128100966Siwasaki { 129100966Siwasaki AcpiOsPrintf ("\n"); 130100966Siwasaki } 131100966Siwasaki} 132100966Siwasaki 133100966Siwasaki 134100966Siwasaki/******************************************************************************* 135100966Siwasaki * 136100966Siwasaki * FUNCTION: AcpiDmByteList 137100966Siwasaki * 138100966Siwasaki * PARAMETERS: Info - Parse tree walk info 139100966Siwasaki * Op - Byte list op 140100966Siwasaki * 141100966Siwasaki * RETURN: None 142100966Siwasaki * 143100966Siwasaki * DESCRIPTION: Dump a buffer byte list, handling the various types of buffers. 144100966Siwasaki * Buffer type must be already set in the Op DisasmOpcode. 145100966Siwasaki * 146100966Siwasaki ******************************************************************************/ 147100966Siwasaki 148100966Siwasakivoid 149100966SiwasakiAcpiDmByteList ( 150100966Siwasaki ACPI_OP_WALK_INFO *Info, 151100966Siwasaki ACPI_PARSE_OBJECT *Op) 152100966Siwasaki{ 153100966Siwasaki UINT8 *ByteData; 154100966Siwasaki UINT32 ByteCount; 155100966Siwasaki 156100966Siwasaki 157100966Siwasaki ByteData = Op->Named.Data; 158117521Snjl ByteCount = (UINT32) Op->Common.Value.Integer; 159100966Siwasaki 160100966Siwasaki /* 161100966Siwasaki * The byte list belongs to a buffer, and can be produced by either 162100966Siwasaki * a ResourceTemplate, Unicode, quoted string, or a plain byte list. 163100966Siwasaki */ 164100966Siwasaki switch (Op->Common.Parent->Common.DisasmOpcode) 165100966Siwasaki { 166100966Siwasaki case ACPI_DASM_RESOURCE: 167100966Siwasaki 168167802Sjkim AcpiDmResourceTemplate (Info, Op->Common.Parent, ByteData, ByteCount); 169100966Siwasaki break; 170100966Siwasaki 171100966Siwasaki case ACPI_DASM_STRING: 172100966Siwasaki 173100966Siwasaki AcpiDmIndent (Info->Level); 174107325Siwasaki AcpiUtPrintString ((char *) ByteData, ACPI_UINT8_MAX); 175100966Siwasaki AcpiOsPrintf ("\n"); 176100966Siwasaki break; 177100966Siwasaki 178100966Siwasaki case ACPI_DASM_UNICODE: 179100966Siwasaki 180100966Siwasaki AcpiDmUnicode (Op); 181100966Siwasaki break; 182100966Siwasaki 183100966Siwasaki case ACPI_DASM_BUFFER: 184100966Siwasaki default: 185100966Siwasaki 186100966Siwasaki /* 187100966Siwasaki * Not a resource, string, or unicode string. 188100966Siwasaki * Just dump the buffer 189100966Siwasaki */ 190100966Siwasaki AcpiDmDisasmByteList (Info->Level, ByteData, ByteCount); 191100966Siwasaki break; 192100966Siwasaki } 193100966Siwasaki} 194100966Siwasaki 195100966Siwasaki 196100966Siwasaki/******************************************************************************* 197100966Siwasaki * 198100966Siwasaki * FUNCTION: AcpiDmIsUnicodeBuffer 199100966Siwasaki * 200100966Siwasaki * PARAMETERS: Op - Buffer Object to be examined 201100966Siwasaki * 202100966Siwasaki * RETURN: TRUE if buffer contains a UNICODE string 203100966Siwasaki * 204100966Siwasaki * DESCRIPTION: Determine if a buffer Op contains a Unicode string 205100966Siwasaki * 206100966Siwasaki ******************************************************************************/ 207100966Siwasaki 208100966SiwasakiBOOLEAN 209100966SiwasakiAcpiDmIsUnicodeBuffer ( 210100966Siwasaki ACPI_PARSE_OBJECT *Op) 211100966Siwasaki{ 212100966Siwasaki UINT8 *ByteData; 213100966Siwasaki UINT32 ByteCount; 214100966Siwasaki UINT32 WordCount; 215100966Siwasaki ACPI_PARSE_OBJECT *SizeOp; 216100966Siwasaki ACPI_PARSE_OBJECT *NextOp; 217193267Sjkim UINT32 i; 218100966Siwasaki 219100966Siwasaki 220100966Siwasaki /* Buffer size is the buffer argument */ 221100966Siwasaki 222100966Siwasaki SizeOp = Op->Common.Value.Arg; 223100966Siwasaki 224100966Siwasaki /* Next, the initializer byte list to examine */ 225100966Siwasaki 226100966Siwasaki NextOp = SizeOp->Common.Next; 227100966Siwasaki if (!NextOp) 228100966Siwasaki { 229100966Siwasaki return (FALSE); 230100966Siwasaki } 231100966Siwasaki 232100966Siwasaki /* Extract the byte list info */ 233100966Siwasaki 234100966Siwasaki ByteData = NextOp->Named.Data; 235117521Snjl ByteCount = (UINT32) NextOp->Common.Value.Integer; 236100966Siwasaki WordCount = ACPI_DIV_2 (ByteCount); 237100966Siwasaki 238100966Siwasaki /* 239100966Siwasaki * Unicode string must have an even number of bytes and last 240100966Siwasaki * word must be zero 241100966Siwasaki */ 242100966Siwasaki if ((!ByteCount) || 243100966Siwasaki (ByteCount < 4) || 244100966Siwasaki (ByteCount & 1) || 245100966Siwasaki ((UINT16 *) (void *) ByteData)[WordCount - 1] != 0) 246100966Siwasaki { 247100966Siwasaki return (FALSE); 248100966Siwasaki } 249100966Siwasaki 250100966Siwasaki /* For each word, 1st byte must be ascii, 2nd byte must be zero */ 251100966Siwasaki 252100966Siwasaki for (i = 0; i < (ByteCount - 2); i += 2) 253100966Siwasaki { 254100966Siwasaki if ((!ACPI_IS_PRINT (ByteData[i])) || 255193267Sjkim (ByteData[(ACPI_SIZE) i + 1] != 0)) 256100966Siwasaki { 257100966Siwasaki return (FALSE); 258100966Siwasaki } 259100966Siwasaki } 260100966Siwasaki 261100966Siwasaki /* Ignore the Size argument in the disassembly of this buffer op */ 262100966Siwasaki 263100966Siwasaki SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 264100966Siwasaki return (TRUE); 265100966Siwasaki} 266100966Siwasaki 267100966Siwasaki 268100966Siwasaki/******************************************************************************* 269100966Siwasaki * 270100966Siwasaki * FUNCTION: AcpiDmIsStringBuffer 271100966Siwasaki * 272100966Siwasaki * PARAMETERS: Op - Buffer Object to be examined 273100966Siwasaki * 274151937Sjkim * RETURN: TRUE if buffer contains a ASCII string, FALSE otherwise 275100966Siwasaki * 276100966Siwasaki * DESCRIPTION: Determine if a buffer Op contains a ASCII string 277100966Siwasaki * 278100966Siwasaki ******************************************************************************/ 279100966Siwasaki 280100966SiwasakiBOOLEAN 281100966SiwasakiAcpiDmIsStringBuffer ( 282100966Siwasaki ACPI_PARSE_OBJECT *Op) 283100966Siwasaki{ 284100966Siwasaki UINT8 *ByteData; 285100966Siwasaki UINT32 ByteCount; 286100966Siwasaki ACPI_PARSE_OBJECT *SizeOp; 287100966Siwasaki ACPI_PARSE_OBJECT *NextOp; 288100966Siwasaki UINT32 i; 289100966Siwasaki 290100966Siwasaki 291100966Siwasaki /* Buffer size is the buffer argument */ 292100966Siwasaki 293100966Siwasaki SizeOp = Op->Common.Value.Arg; 294100966Siwasaki 295100966Siwasaki /* Next, the initializer byte list to examine */ 296100966Siwasaki 297100966Siwasaki NextOp = SizeOp->Common.Next; 298100966Siwasaki if (!NextOp) 299100966Siwasaki { 300100966Siwasaki return (FALSE); 301100966Siwasaki } 302100966Siwasaki 303100966Siwasaki /* Extract the byte list info */ 304100966Siwasaki 305100966Siwasaki ByteData = NextOp->Named.Data; 306117521Snjl ByteCount = (UINT32) NextOp->Common.Value.Integer; 307100966Siwasaki 308100966Siwasaki /* Last byte must be the null terminator */ 309100966Siwasaki 310100966Siwasaki if ((!ByteCount) || 311100966Siwasaki (ByteCount < 2) || 312100966Siwasaki (ByteData[ByteCount-1] != 0)) 313100966Siwasaki { 314100966Siwasaki return (FALSE); 315100966Siwasaki } 316100966Siwasaki 317100966Siwasaki for (i = 0; i < (ByteCount - 1); i++) 318100966Siwasaki { 319100966Siwasaki /* TBD: allow some escapes (non-ascii chars). 320100966Siwasaki * they will be handled in the string output routine 321100966Siwasaki */ 322100966Siwasaki 323100966Siwasaki if (!ACPI_IS_PRINT (ByteData[i])) 324100966Siwasaki { 325100966Siwasaki return (FALSE); 326100966Siwasaki } 327100966Siwasaki } 328100966Siwasaki 329100966Siwasaki return (TRUE); 330100966Siwasaki} 331100966Siwasaki 332100966Siwasaki 333100966Siwasaki/******************************************************************************* 334100966Siwasaki * 335100966Siwasaki * FUNCTION: AcpiDmUnicode 336100966Siwasaki * 337100966Siwasaki * PARAMETERS: Op - Byte List op containing Unicode string 338100966Siwasaki * 339100966Siwasaki * RETURN: None 340100966Siwasaki * 341100966Siwasaki * DESCRIPTION: Dump Unicode string as a standard ASCII string. (Remove 342100966Siwasaki * the extra zero bytes). 343100966Siwasaki * 344100966Siwasaki ******************************************************************************/ 345100966Siwasaki 346151937Sjkimstatic void 347100966SiwasakiAcpiDmUnicode ( 348100966Siwasaki ACPI_PARSE_OBJECT *Op) 349100966Siwasaki{ 350100966Siwasaki UINT16 *WordData; 351100966Siwasaki UINT32 WordCount; 352100966Siwasaki UINT32 i; 353100966Siwasaki 354100966Siwasaki 355100966Siwasaki /* Extract the buffer info as a WORD buffer */ 356100966Siwasaki 357100966Siwasaki WordData = ACPI_CAST_PTR (UINT16, Op->Named.Data); 358117521Snjl WordCount = ACPI_DIV_2 (((UINT32) Op->Common.Value.Integer)); 359100966Siwasaki 360100966Siwasaki 361100966Siwasaki AcpiOsPrintf ("\""); 362100966Siwasaki 363100966Siwasaki /* Write every other byte as an ASCII character */ 364100966Siwasaki 365100966Siwasaki for (i = 0; i < (WordCount - 1); i++) 366100966Siwasaki { 367100966Siwasaki AcpiOsPrintf ("%c", (int) WordData[i]); 368100966Siwasaki } 369100966Siwasaki 370100966Siwasaki AcpiOsPrintf ("\")"); 371100966Siwasaki} 372100966Siwasaki 373100966Siwasaki 374100966Siwasaki/******************************************************************************* 375100966Siwasaki * 376193267Sjkim * FUNCTION: AcpiDmIsEisaIdElement 377100966Siwasaki * 378100966Siwasaki * PARAMETERS: Op - Op to be examined 379100966Siwasaki * 380100966Siwasaki * RETURN: None 381100966Siwasaki * 382193267Sjkim * DESCRIPTION: Determine if an Op (argument to _HID or _CID) can be converted 383193267Sjkim * to an EISA ID. 384100966Siwasaki * 385100966Siwasaki ******************************************************************************/ 386100966Siwasaki 387193267Sjkimstatic void 388193267SjkimAcpiDmIsEisaIdElement ( 389100966Siwasaki ACPI_PARSE_OBJECT *Op) 390100966Siwasaki{ 391100966Siwasaki UINT32 BigEndianId; 392100966Siwasaki UINT32 Prefix[3]; 393193267Sjkim UINT32 i; 394100966Siwasaki 395100966Siwasaki 396100966Siwasaki /* The parameter must be either a word or a dword */ 397100966Siwasaki 398193267Sjkim if ((Op->Common.AmlOpcode != AML_DWORD_OP) && 399193267Sjkim (Op->Common.AmlOpcode != AML_WORD_OP)) 400100966Siwasaki { 401100966Siwasaki return; 402100966Siwasaki } 403100966Siwasaki 404100966Siwasaki /* Swap from little-endian to big-endian to simplify conversion */ 405100966Siwasaki 406193267Sjkim BigEndianId = AcpiUtDwordByteSwap ((UINT32) Op->Common.Value.Integer); 407100966Siwasaki 408100966Siwasaki /* Create the 3 leading ASCII letters */ 409100966Siwasaki 410100966Siwasaki Prefix[0] = ((BigEndianId >> 26) & 0x1F) + 0x40; 411100966Siwasaki Prefix[1] = ((BigEndianId >> 21) & 0x1F) + 0x40; 412100966Siwasaki Prefix[2] = ((BigEndianId >> 16) & 0x1F) + 0x40; 413100966Siwasaki 414100966Siwasaki /* Verify that all 3 are ascii and alpha */ 415100966Siwasaki 416100966Siwasaki for (i = 0; i < 3; i++) 417100966Siwasaki { 418100966Siwasaki if (!ACPI_IS_ASCII (Prefix[i]) || 419100966Siwasaki !ACPI_IS_ALPHA (Prefix[i])) 420100966Siwasaki { 421100966Siwasaki return; 422100966Siwasaki } 423100966Siwasaki } 424100966Siwasaki 425100966Siwasaki /* OK - mark this node as convertable to an EISA ID */ 426100966Siwasaki 427193267Sjkim Op->Common.DisasmOpcode = ACPI_DASM_EISAID; 428100966Siwasaki} 429100966Siwasaki 430100966Siwasaki 431100966Siwasaki/******************************************************************************* 432100966Siwasaki * 433193267Sjkim * FUNCTION: AcpiDmIsEisaId 434193267Sjkim * 435193267Sjkim * PARAMETERS: Op - Op to be examined 436193267Sjkim * 437193267Sjkim * RETURN: None 438193267Sjkim * 439193267Sjkim * DESCRIPTION: Determine if a Name() Op can be converted to an EisaId. 440193267Sjkim * 441193267Sjkim ******************************************************************************/ 442193267Sjkim 443193267Sjkimvoid 444193267SjkimAcpiDmIsEisaId ( 445193267Sjkim ACPI_PARSE_OBJECT *Op) 446193267Sjkim{ 447193267Sjkim UINT32 Name; 448193267Sjkim ACPI_PARSE_OBJECT *NextOp; 449193267Sjkim 450193267Sjkim 451193267Sjkim /* Get the NameSegment */ 452193267Sjkim 453193267Sjkim Name = AcpiPsGetName (Op); 454193267Sjkim if (!Name) 455193267Sjkim { 456193267Sjkim return; 457193267Sjkim } 458193267Sjkim 459193267Sjkim NextOp = AcpiPsGetDepthNext (NULL, Op); 460193267Sjkim if (!NextOp) 461193267Sjkim { 462193267Sjkim return; 463193267Sjkim } 464193267Sjkim 465193267Sjkim /* Check for _HID - has one argument */ 466193267Sjkim 467193267Sjkim if (ACPI_COMPARE_NAME (&Name, METHOD_NAME__HID)) 468193267Sjkim { 469193267Sjkim AcpiDmIsEisaIdElement (NextOp); 470193267Sjkim return; 471193267Sjkim } 472193267Sjkim 473193267Sjkim /* Exit if not _CID */ 474193267Sjkim 475193267Sjkim if (!ACPI_COMPARE_NAME (&Name, METHOD_NAME__CID)) 476193267Sjkim { 477193267Sjkim return; 478193267Sjkim } 479193267Sjkim 480193267Sjkim /* _CID can contain a single argument or a package */ 481193267Sjkim 482193267Sjkim if (NextOp->Common.AmlOpcode != AML_PACKAGE_OP) 483193267Sjkim { 484193267Sjkim AcpiDmIsEisaIdElement (NextOp); 485193267Sjkim return; 486193267Sjkim } 487193267Sjkim 488193267Sjkim /* _CID with Package: get the package length */ 489193267Sjkim 490193267Sjkim NextOp = AcpiPsGetDepthNext (NULL, NextOp); 491193267Sjkim 492193267Sjkim /* Don't need to use the length, just walk the peer list */ 493193267Sjkim 494193267Sjkim NextOp = NextOp->Common.Next; 495193267Sjkim while (NextOp) 496193267Sjkim { 497193267Sjkim AcpiDmIsEisaIdElement (NextOp); 498193267Sjkim NextOp = NextOp->Common.Next; 499193267Sjkim } 500193267Sjkim} 501193267Sjkim 502193267Sjkim 503193267Sjkim/******************************************************************************* 504193267Sjkim * 505102550Siwasaki * FUNCTION: AcpiDmEisaId 506100966Siwasaki * 507100966Siwasaki * PARAMETERS: EncodedId - Raw encoded EISA ID. 508100966Siwasaki * 509100966Siwasaki * RETURN: None 510100966Siwasaki * 511100966Siwasaki * DESCRIPTION: Convert an encoded EISAID back to the original ASCII String. 512100966Siwasaki * 513100966Siwasaki ******************************************************************************/ 514100966Siwasaki 515100966Siwasakivoid 516100966SiwasakiAcpiDmEisaId ( 517100966Siwasaki UINT32 EncodedId) 518100966Siwasaki{ 519100966Siwasaki UINT32 BigEndianId; 520100966Siwasaki 521100966Siwasaki 522100966Siwasaki /* Swap from little-endian to big-endian to simplify conversion */ 523100966Siwasaki 524100966Siwasaki BigEndianId = AcpiUtDwordByteSwap (EncodedId); 525100966Siwasaki 526100966Siwasaki 527100966Siwasaki /* Split to form "AAANNNN" string */ 528100966Siwasaki 529100966Siwasaki AcpiOsPrintf ("EisaId (\"%c%c%c%4.4X\")", 530100966Siwasaki 531100966Siwasaki /* Three Alpha characters (AAA), 5 bits each */ 532100966Siwasaki 533100966Siwasaki (int) ((BigEndianId >> 26) & 0x1F) + 0x40, 534100966Siwasaki (int) ((BigEndianId >> 21) & 0x1F) + 0x40, 535100966Siwasaki (int) ((BigEndianId >> 16) & 0x1F) + 0x40, 536100966Siwasaki 537100966Siwasaki /* Numeric part (NNNN) is simply the lower 16 bits */ 538100966Siwasaki 539100966Siwasaki (UINT32) (BigEndianId & 0xFFFF)); 540100966Siwasaki} 541100966Siwasaki 542100966Siwasaki#endif 543