1*a159c266SJung-uk Kim /******************************************************************************* 2*a159c266SJung-uk Kim * 3*a159c266SJung-uk Kim * Module Name: dmbuffer - AML disassembler, buffer and string support 4*a159c266SJung-uk Kim * 5*a159c266SJung-uk Kim ******************************************************************************/ 6*a159c266SJung-uk Kim 7*a159c266SJung-uk Kim /* 8*a159c266SJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 9*a159c266SJung-uk Kim * All rights reserved. 10*a159c266SJung-uk Kim * 11*a159c266SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12*a159c266SJung-uk Kim * modification, are permitted provided that the following conditions 13*a159c266SJung-uk Kim * are met: 14*a159c266SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15*a159c266SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16*a159c266SJung-uk Kim * without modification. 17*a159c266SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*a159c266SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19*a159c266SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20*a159c266SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21*a159c266SJung-uk Kim * binary redistribution. 22*a159c266SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23*a159c266SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24*a159c266SJung-uk Kim * from this software without specific prior written permission. 25*a159c266SJung-uk Kim * 26*a159c266SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27*a159c266SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28*a159c266SJung-uk Kim * Software Foundation. 29*a159c266SJung-uk Kim * 30*a159c266SJung-uk Kim * NO WARRANTY 31*a159c266SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*a159c266SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*a159c266SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*a159c266SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*a159c266SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*a159c266SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*a159c266SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*a159c266SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*a159c266SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*a159c266SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*a159c266SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42*a159c266SJung-uk Kim */ 43*a159c266SJung-uk Kim 44*a159c266SJung-uk Kim 45*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 46*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 47*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h> 48*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/acparser.h> 49*a159c266SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 50*a159c266SJung-uk Kim 51*a159c266SJung-uk Kim 52*a159c266SJung-uk Kim #ifdef ACPI_DISASSEMBLER 53*a159c266SJung-uk Kim 54*a159c266SJung-uk Kim #define _COMPONENT ACPI_CA_DEBUGGER 55*a159c266SJung-uk Kim ACPI_MODULE_NAME ("dmbuffer") 56*a159c266SJung-uk Kim 57*a159c266SJung-uk Kim /* Local prototypes */ 58*a159c266SJung-uk Kim 59*a159c266SJung-uk Kim static void 60*a159c266SJung-uk Kim AcpiDmUnicode ( 61*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op); 62*a159c266SJung-uk Kim 63*a159c266SJung-uk Kim static void 64*a159c266SJung-uk Kim AcpiDmIsEisaIdElement ( 65*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op); 66*a159c266SJung-uk Kim 67*a159c266SJung-uk Kim 68*a159c266SJung-uk Kim /******************************************************************************* 69*a159c266SJung-uk Kim * 70*a159c266SJung-uk Kim * FUNCTION: AcpiDmDisasmByteList 71*a159c266SJung-uk Kim * 72*a159c266SJung-uk Kim * PARAMETERS: Level - Current source code indentation level 73*a159c266SJung-uk Kim * ByteData - Pointer to the byte list 74*a159c266SJung-uk Kim * ByteCount - Length of the byte list 75*a159c266SJung-uk Kim * 76*a159c266SJung-uk Kim * RETURN: None 77*a159c266SJung-uk Kim * 78*a159c266SJung-uk Kim * DESCRIPTION: Dump an AML "ByteList" in Hex format. 8 bytes per line, prefixed 79*a159c266SJung-uk Kim * with the hex buffer offset. 80*a159c266SJung-uk Kim * 81*a159c266SJung-uk Kim ******************************************************************************/ 82*a159c266SJung-uk Kim 83*a159c266SJung-uk Kim void 84*a159c266SJung-uk Kim AcpiDmDisasmByteList ( 85*a159c266SJung-uk Kim UINT32 Level, 86*a159c266SJung-uk Kim UINT8 *ByteData, 87*a159c266SJung-uk Kim UINT32 ByteCount) 88*a159c266SJung-uk Kim { 89*a159c266SJung-uk Kim UINT32 i; 90*a159c266SJung-uk Kim 91*a159c266SJung-uk Kim 92*a159c266SJung-uk Kim if (!ByteCount) 93*a159c266SJung-uk Kim { 94*a159c266SJung-uk Kim return; 95*a159c266SJung-uk Kim } 96*a159c266SJung-uk Kim 97*a159c266SJung-uk Kim /* Dump the byte list */ 98*a159c266SJung-uk Kim 99*a159c266SJung-uk Kim for (i = 0; i < ByteCount; i++) 100*a159c266SJung-uk Kim { 101*a159c266SJung-uk Kim /* New line every 8 bytes */ 102*a159c266SJung-uk Kim 103*a159c266SJung-uk Kim if (((i % 8) == 0) && (i < ByteCount)) 104*a159c266SJung-uk Kim { 105*a159c266SJung-uk Kim if (i > 0) 106*a159c266SJung-uk Kim { 107*a159c266SJung-uk Kim AcpiOsPrintf ("\n"); 108*a159c266SJung-uk Kim } 109*a159c266SJung-uk Kim 110*a159c266SJung-uk Kim AcpiDmIndent (Level); 111*a159c266SJung-uk Kim if (ByteCount > 8) 112*a159c266SJung-uk Kim { 113*a159c266SJung-uk Kim AcpiOsPrintf ("/* %04X */ ", i); 114*a159c266SJung-uk Kim } 115*a159c266SJung-uk Kim } 116*a159c266SJung-uk Kim 117*a159c266SJung-uk Kim AcpiOsPrintf (" 0x%2.2X", (UINT32) ByteData[i]); 118*a159c266SJung-uk Kim 119*a159c266SJung-uk Kim /* Add comma if there are more bytes to display */ 120*a159c266SJung-uk Kim 121*a159c266SJung-uk Kim if (i < (ByteCount -1)) 122*a159c266SJung-uk Kim { 123*a159c266SJung-uk Kim AcpiOsPrintf (","); 124*a159c266SJung-uk Kim } 125*a159c266SJung-uk Kim } 126*a159c266SJung-uk Kim 127*a159c266SJung-uk Kim if (Level) 128*a159c266SJung-uk Kim { 129*a159c266SJung-uk Kim AcpiOsPrintf ("\n"); 130*a159c266SJung-uk Kim } 131*a159c266SJung-uk Kim } 132*a159c266SJung-uk Kim 133*a159c266SJung-uk Kim 134*a159c266SJung-uk Kim /******************************************************************************* 135*a159c266SJung-uk Kim * 136*a159c266SJung-uk Kim * FUNCTION: AcpiDmByteList 137*a159c266SJung-uk Kim * 138*a159c266SJung-uk Kim * PARAMETERS: Info - Parse tree walk info 139*a159c266SJung-uk Kim * Op - Byte list op 140*a159c266SJung-uk Kim * 141*a159c266SJung-uk Kim * RETURN: None 142*a159c266SJung-uk Kim * 143*a159c266SJung-uk Kim * DESCRIPTION: Dump a buffer byte list, handling the various types of buffers. 144*a159c266SJung-uk Kim * Buffer type must be already set in the Op DisasmOpcode. 145*a159c266SJung-uk Kim * 146*a159c266SJung-uk Kim ******************************************************************************/ 147*a159c266SJung-uk Kim 148*a159c266SJung-uk Kim void 149*a159c266SJung-uk Kim AcpiDmByteList ( 150*a159c266SJung-uk Kim ACPI_OP_WALK_INFO *Info, 151*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op) 152*a159c266SJung-uk Kim { 153*a159c266SJung-uk Kim UINT8 *ByteData; 154*a159c266SJung-uk Kim UINT32 ByteCount; 155*a159c266SJung-uk Kim 156*a159c266SJung-uk Kim 157*a159c266SJung-uk Kim ByteData = Op->Named.Data; 158*a159c266SJung-uk Kim ByteCount = (UINT32) Op->Common.Value.Integer; 159*a159c266SJung-uk Kim 160*a159c266SJung-uk Kim /* 161*a159c266SJung-uk Kim * The byte list belongs to a buffer, and can be produced by either 162*a159c266SJung-uk Kim * a ResourceTemplate, Unicode, quoted string, or a plain byte list. 163*a159c266SJung-uk Kim */ 164*a159c266SJung-uk Kim switch (Op->Common.Parent->Common.DisasmOpcode) 165*a159c266SJung-uk Kim { 166*a159c266SJung-uk Kim case ACPI_DASM_RESOURCE: 167*a159c266SJung-uk Kim 168*a159c266SJung-uk Kim AcpiDmResourceTemplate (Info, Op->Common.Parent, ByteData, ByteCount); 169*a159c266SJung-uk Kim break; 170*a159c266SJung-uk Kim 171*a159c266SJung-uk Kim case ACPI_DASM_STRING: 172*a159c266SJung-uk Kim 173*a159c266SJung-uk Kim AcpiDmIndent (Info->Level); 174*a159c266SJung-uk Kim AcpiUtPrintString ((char *) ByteData, ACPI_UINT8_MAX); 175*a159c266SJung-uk Kim AcpiOsPrintf ("\n"); 176*a159c266SJung-uk Kim break; 177*a159c266SJung-uk Kim 178*a159c266SJung-uk Kim case ACPI_DASM_UNICODE: 179*a159c266SJung-uk Kim 180*a159c266SJung-uk Kim AcpiDmUnicode (Op); 181*a159c266SJung-uk Kim break; 182*a159c266SJung-uk Kim 183*a159c266SJung-uk Kim case ACPI_DASM_BUFFER: 184*a159c266SJung-uk Kim default: 185*a159c266SJung-uk Kim 186*a159c266SJung-uk Kim /* 187*a159c266SJung-uk Kim * Not a resource, string, or unicode string. 188*a159c266SJung-uk Kim * Just dump the buffer 189*a159c266SJung-uk Kim */ 190*a159c266SJung-uk Kim AcpiDmDisasmByteList (Info->Level, ByteData, ByteCount); 191*a159c266SJung-uk Kim break; 192*a159c266SJung-uk Kim } 193*a159c266SJung-uk Kim } 194*a159c266SJung-uk Kim 195*a159c266SJung-uk Kim 196*a159c266SJung-uk Kim /******************************************************************************* 197*a159c266SJung-uk Kim * 198*a159c266SJung-uk Kim * FUNCTION: AcpiDmIsUnicodeBuffer 199*a159c266SJung-uk Kim * 200*a159c266SJung-uk Kim * PARAMETERS: Op - Buffer Object to be examined 201*a159c266SJung-uk Kim * 202*a159c266SJung-uk Kim * RETURN: TRUE if buffer contains a UNICODE string 203*a159c266SJung-uk Kim * 204*a159c266SJung-uk Kim * DESCRIPTION: Determine if a buffer Op contains a Unicode string 205*a159c266SJung-uk Kim * 206*a159c266SJung-uk Kim ******************************************************************************/ 207*a159c266SJung-uk Kim 208*a159c266SJung-uk Kim BOOLEAN 209*a159c266SJung-uk Kim AcpiDmIsUnicodeBuffer ( 210*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op) 211*a159c266SJung-uk Kim { 212*a159c266SJung-uk Kim UINT8 *ByteData; 213*a159c266SJung-uk Kim UINT32 ByteCount; 214*a159c266SJung-uk Kim UINT32 WordCount; 215*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *SizeOp; 216*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 217*a159c266SJung-uk Kim UINT32 i; 218*a159c266SJung-uk Kim 219*a159c266SJung-uk Kim 220*a159c266SJung-uk Kim /* Buffer size is the buffer argument */ 221*a159c266SJung-uk Kim 222*a159c266SJung-uk Kim SizeOp = Op->Common.Value.Arg; 223*a159c266SJung-uk Kim 224*a159c266SJung-uk Kim /* Next, the initializer byte list to examine */ 225*a159c266SJung-uk Kim 226*a159c266SJung-uk Kim NextOp = SizeOp->Common.Next; 227*a159c266SJung-uk Kim if (!NextOp) 228*a159c266SJung-uk Kim { 229*a159c266SJung-uk Kim return (FALSE); 230*a159c266SJung-uk Kim } 231*a159c266SJung-uk Kim 232*a159c266SJung-uk Kim /* Extract the byte list info */ 233*a159c266SJung-uk Kim 234*a159c266SJung-uk Kim ByteData = NextOp->Named.Data; 235*a159c266SJung-uk Kim ByteCount = (UINT32) NextOp->Common.Value.Integer; 236*a159c266SJung-uk Kim WordCount = ACPI_DIV_2 (ByteCount); 237*a159c266SJung-uk Kim 238*a159c266SJung-uk Kim /* 239*a159c266SJung-uk Kim * Unicode string must have an even number of bytes and last 240*a159c266SJung-uk Kim * word must be zero 241*a159c266SJung-uk Kim */ 242*a159c266SJung-uk Kim if ((!ByteCount) || 243*a159c266SJung-uk Kim (ByteCount < 4) || 244*a159c266SJung-uk Kim (ByteCount & 1) || 245*a159c266SJung-uk Kim ((UINT16 *) (void *) ByteData)[WordCount - 1] != 0) 246*a159c266SJung-uk Kim { 247*a159c266SJung-uk Kim return (FALSE); 248*a159c266SJung-uk Kim } 249*a159c266SJung-uk Kim 250*a159c266SJung-uk Kim /* For each word, 1st byte must be ascii, 2nd byte must be zero */ 251*a159c266SJung-uk Kim 252*a159c266SJung-uk Kim for (i = 0; i < (ByteCount - 2); i += 2) 253*a159c266SJung-uk Kim { 254*a159c266SJung-uk Kim if ((!ACPI_IS_PRINT (ByteData[i])) || 255*a159c266SJung-uk Kim (ByteData[(ACPI_SIZE) i + 1] != 0)) 256*a159c266SJung-uk Kim { 257*a159c266SJung-uk Kim return (FALSE); 258*a159c266SJung-uk Kim } 259*a159c266SJung-uk Kim } 260*a159c266SJung-uk Kim 261*a159c266SJung-uk Kim /* Ignore the Size argument in the disassembly of this buffer op */ 262*a159c266SJung-uk Kim 263*a159c266SJung-uk Kim SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 264*a159c266SJung-uk Kim return (TRUE); 265*a159c266SJung-uk Kim } 266*a159c266SJung-uk Kim 267*a159c266SJung-uk Kim 268*a159c266SJung-uk Kim /******************************************************************************* 269*a159c266SJung-uk Kim * 270*a159c266SJung-uk Kim * FUNCTION: AcpiDmIsStringBuffer 271*a159c266SJung-uk Kim * 272*a159c266SJung-uk Kim * PARAMETERS: Op - Buffer Object to be examined 273*a159c266SJung-uk Kim * 274*a159c266SJung-uk Kim * RETURN: TRUE if buffer contains a ASCII string, FALSE otherwise 275*a159c266SJung-uk Kim * 276*a159c266SJung-uk Kim * DESCRIPTION: Determine if a buffer Op contains a ASCII string 277*a159c266SJung-uk Kim * 278*a159c266SJung-uk Kim ******************************************************************************/ 279*a159c266SJung-uk Kim 280*a159c266SJung-uk Kim BOOLEAN 281*a159c266SJung-uk Kim AcpiDmIsStringBuffer ( 282*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op) 283*a159c266SJung-uk Kim { 284*a159c266SJung-uk Kim UINT8 *ByteData; 285*a159c266SJung-uk Kim UINT32 ByteCount; 286*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *SizeOp; 287*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 288*a159c266SJung-uk Kim UINT32 i; 289*a159c266SJung-uk Kim 290*a159c266SJung-uk Kim 291*a159c266SJung-uk Kim /* Buffer size is the buffer argument */ 292*a159c266SJung-uk Kim 293*a159c266SJung-uk Kim SizeOp = Op->Common.Value.Arg; 294*a159c266SJung-uk Kim 295*a159c266SJung-uk Kim /* Next, the initializer byte list to examine */ 296*a159c266SJung-uk Kim 297*a159c266SJung-uk Kim NextOp = SizeOp->Common.Next; 298*a159c266SJung-uk Kim if (!NextOp) 299*a159c266SJung-uk Kim { 300*a159c266SJung-uk Kim return (FALSE); 301*a159c266SJung-uk Kim } 302*a159c266SJung-uk Kim 303*a159c266SJung-uk Kim /* Extract the byte list info */ 304*a159c266SJung-uk Kim 305*a159c266SJung-uk Kim ByteData = NextOp->Named.Data; 306*a159c266SJung-uk Kim ByteCount = (UINT32) NextOp->Common.Value.Integer; 307*a159c266SJung-uk Kim 308*a159c266SJung-uk Kim /* Last byte must be the null terminator */ 309*a159c266SJung-uk Kim 310*a159c266SJung-uk Kim if ((!ByteCount) || 311*a159c266SJung-uk Kim (ByteCount < 2) || 312*a159c266SJung-uk Kim (ByteData[ByteCount-1] != 0)) 313*a159c266SJung-uk Kim { 314*a159c266SJung-uk Kim return (FALSE); 315*a159c266SJung-uk Kim } 316*a159c266SJung-uk Kim 317*a159c266SJung-uk Kim for (i = 0; i < (ByteCount - 1); i++) 318*a159c266SJung-uk Kim { 319*a159c266SJung-uk Kim /* TBD: allow some escapes (non-ascii chars). 320*a159c266SJung-uk Kim * they will be handled in the string output routine 321*a159c266SJung-uk Kim */ 322*a159c266SJung-uk Kim 323*a159c266SJung-uk Kim if (!ACPI_IS_PRINT (ByteData[i])) 324*a159c266SJung-uk Kim { 325*a159c266SJung-uk Kim return (FALSE); 326*a159c266SJung-uk Kim } 327*a159c266SJung-uk Kim } 328*a159c266SJung-uk Kim 329*a159c266SJung-uk Kim return (TRUE); 330*a159c266SJung-uk Kim } 331*a159c266SJung-uk Kim 332*a159c266SJung-uk Kim 333*a159c266SJung-uk Kim /******************************************************************************* 334*a159c266SJung-uk Kim * 335*a159c266SJung-uk Kim * FUNCTION: AcpiDmUnicode 336*a159c266SJung-uk Kim * 337*a159c266SJung-uk Kim * PARAMETERS: Op - Byte List op containing Unicode string 338*a159c266SJung-uk Kim * 339*a159c266SJung-uk Kim * RETURN: None 340*a159c266SJung-uk Kim * 341*a159c266SJung-uk Kim * DESCRIPTION: Dump Unicode string as a standard ASCII string. (Remove 342*a159c266SJung-uk Kim * the extra zero bytes). 343*a159c266SJung-uk Kim * 344*a159c266SJung-uk Kim ******************************************************************************/ 345*a159c266SJung-uk Kim 346*a159c266SJung-uk Kim static void 347*a159c266SJung-uk Kim AcpiDmUnicode ( 348*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op) 349*a159c266SJung-uk Kim { 350*a159c266SJung-uk Kim UINT16 *WordData; 351*a159c266SJung-uk Kim UINT32 WordCount; 352*a159c266SJung-uk Kim UINT32 i; 353*a159c266SJung-uk Kim 354*a159c266SJung-uk Kim 355*a159c266SJung-uk Kim /* Extract the buffer info as a WORD buffer */ 356*a159c266SJung-uk Kim 357*a159c266SJung-uk Kim WordData = ACPI_CAST_PTR (UINT16, Op->Named.Data); 358*a159c266SJung-uk Kim WordCount = ACPI_DIV_2 (((UINT32) Op->Common.Value.Integer)); 359*a159c266SJung-uk Kim 360*a159c266SJung-uk Kim 361*a159c266SJung-uk Kim AcpiOsPrintf ("\""); 362*a159c266SJung-uk Kim 363*a159c266SJung-uk Kim /* Write every other byte as an ASCII character */ 364*a159c266SJung-uk Kim 365*a159c266SJung-uk Kim for (i = 0; i < (WordCount - 1); i++) 366*a159c266SJung-uk Kim { 367*a159c266SJung-uk Kim AcpiOsPrintf ("%c", (int) WordData[i]); 368*a159c266SJung-uk Kim } 369*a159c266SJung-uk Kim 370*a159c266SJung-uk Kim AcpiOsPrintf ("\")"); 371*a159c266SJung-uk Kim } 372*a159c266SJung-uk Kim 373*a159c266SJung-uk Kim 374*a159c266SJung-uk Kim /******************************************************************************* 375*a159c266SJung-uk Kim * 376*a159c266SJung-uk Kim * FUNCTION: AcpiDmIsEisaIdElement 377*a159c266SJung-uk Kim * 378*a159c266SJung-uk Kim * PARAMETERS: Op - Op to be examined 379*a159c266SJung-uk Kim * 380*a159c266SJung-uk Kim * RETURN: None 381*a159c266SJung-uk Kim * 382*a159c266SJung-uk Kim * DESCRIPTION: Determine if an Op (argument to _HID or _CID) can be converted 383*a159c266SJung-uk Kim * to an EISA ID. 384*a159c266SJung-uk Kim * 385*a159c266SJung-uk Kim ******************************************************************************/ 386*a159c266SJung-uk Kim 387*a159c266SJung-uk Kim static void 388*a159c266SJung-uk Kim AcpiDmIsEisaIdElement ( 389*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op) 390*a159c266SJung-uk Kim { 391*a159c266SJung-uk Kim UINT32 BigEndianId; 392*a159c266SJung-uk Kim UINT32 Prefix[3]; 393*a159c266SJung-uk Kim UINT32 i; 394*a159c266SJung-uk Kim 395*a159c266SJung-uk Kim 396*a159c266SJung-uk Kim /* The parameter must be either a word or a dword */ 397*a159c266SJung-uk Kim 398*a159c266SJung-uk Kim if ((Op->Common.AmlOpcode != AML_DWORD_OP) && 399*a159c266SJung-uk Kim (Op->Common.AmlOpcode != AML_WORD_OP)) 400*a159c266SJung-uk Kim { 401*a159c266SJung-uk Kim return; 402*a159c266SJung-uk Kim } 403*a159c266SJung-uk Kim 404*a159c266SJung-uk Kim /* Swap from little-endian to big-endian to simplify conversion */ 405*a159c266SJung-uk Kim 406*a159c266SJung-uk Kim BigEndianId = AcpiUtDwordByteSwap ((UINT32) Op->Common.Value.Integer); 407*a159c266SJung-uk Kim 408*a159c266SJung-uk Kim /* Create the 3 leading ASCII letters */ 409*a159c266SJung-uk Kim 410*a159c266SJung-uk Kim Prefix[0] = ((BigEndianId >> 26) & 0x1F) + 0x40; 411*a159c266SJung-uk Kim Prefix[1] = ((BigEndianId >> 21) & 0x1F) + 0x40; 412*a159c266SJung-uk Kim Prefix[2] = ((BigEndianId >> 16) & 0x1F) + 0x40; 413*a159c266SJung-uk Kim 414*a159c266SJung-uk Kim /* Verify that all 3 are ascii and alpha */ 415*a159c266SJung-uk Kim 416*a159c266SJung-uk Kim for (i = 0; i < 3; i++) 417*a159c266SJung-uk Kim { 418*a159c266SJung-uk Kim if (!ACPI_IS_ASCII (Prefix[i]) || 419*a159c266SJung-uk Kim !ACPI_IS_ALPHA (Prefix[i])) 420*a159c266SJung-uk Kim { 421*a159c266SJung-uk Kim return; 422*a159c266SJung-uk Kim } 423*a159c266SJung-uk Kim } 424*a159c266SJung-uk Kim 425*a159c266SJung-uk Kim /* OK - mark this node as convertable to an EISA ID */ 426*a159c266SJung-uk Kim 427*a159c266SJung-uk Kim Op->Common.DisasmOpcode = ACPI_DASM_EISAID; 428*a159c266SJung-uk Kim } 429*a159c266SJung-uk Kim 430*a159c266SJung-uk Kim 431*a159c266SJung-uk Kim /******************************************************************************* 432*a159c266SJung-uk Kim * 433*a159c266SJung-uk Kim * FUNCTION: AcpiDmIsEisaId 434*a159c266SJung-uk Kim * 435*a159c266SJung-uk Kim * PARAMETERS: Op - Op to be examined 436*a159c266SJung-uk Kim * 437*a159c266SJung-uk Kim * RETURN: None 438*a159c266SJung-uk Kim * 439*a159c266SJung-uk Kim * DESCRIPTION: Determine if a Name() Op can be converted to an EisaId. 440*a159c266SJung-uk Kim * 441*a159c266SJung-uk Kim ******************************************************************************/ 442*a159c266SJung-uk Kim 443*a159c266SJung-uk Kim void 444*a159c266SJung-uk Kim AcpiDmIsEisaId ( 445*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *Op) 446*a159c266SJung-uk Kim { 447*a159c266SJung-uk Kim UINT32 Name; 448*a159c266SJung-uk Kim ACPI_PARSE_OBJECT *NextOp; 449*a159c266SJung-uk Kim 450*a159c266SJung-uk Kim 451*a159c266SJung-uk Kim /* Get the NameSegment */ 452*a159c266SJung-uk Kim 453*a159c266SJung-uk Kim Name = AcpiPsGetName (Op); 454*a159c266SJung-uk Kim if (!Name) 455*a159c266SJung-uk Kim { 456*a159c266SJung-uk Kim return; 457*a159c266SJung-uk Kim } 458*a159c266SJung-uk Kim 459*a159c266SJung-uk Kim NextOp = AcpiPsGetDepthNext (NULL, Op); 460*a159c266SJung-uk Kim if (!NextOp) 461*a159c266SJung-uk Kim { 462*a159c266SJung-uk Kim return; 463*a159c266SJung-uk Kim } 464*a159c266SJung-uk Kim 465*a159c266SJung-uk Kim /* Check for _HID - has one argument */ 466*a159c266SJung-uk Kim 467*a159c266SJung-uk Kim if (ACPI_COMPARE_NAME (&Name, METHOD_NAME__HID)) 468*a159c266SJung-uk Kim { 469*a159c266SJung-uk Kim AcpiDmIsEisaIdElement (NextOp); 470*a159c266SJung-uk Kim return; 471*a159c266SJung-uk Kim } 472*a159c266SJung-uk Kim 473*a159c266SJung-uk Kim /* Exit if not _CID */ 474*a159c266SJung-uk Kim 475*a159c266SJung-uk Kim if (!ACPI_COMPARE_NAME (&Name, METHOD_NAME__CID)) 476*a159c266SJung-uk Kim { 477*a159c266SJung-uk Kim return; 478*a159c266SJung-uk Kim } 479*a159c266SJung-uk Kim 480*a159c266SJung-uk Kim /* _CID can contain a single argument or a package */ 481*a159c266SJung-uk Kim 482*a159c266SJung-uk Kim if (NextOp->Common.AmlOpcode != AML_PACKAGE_OP) 483*a159c266SJung-uk Kim { 484*a159c266SJung-uk Kim AcpiDmIsEisaIdElement (NextOp); 485*a159c266SJung-uk Kim return; 486*a159c266SJung-uk Kim } 487*a159c266SJung-uk Kim 488*a159c266SJung-uk Kim /* _CID with Package: get the package length */ 489*a159c266SJung-uk Kim 490*a159c266SJung-uk Kim NextOp = AcpiPsGetDepthNext (NULL, NextOp); 491*a159c266SJung-uk Kim 492*a159c266SJung-uk Kim /* Don't need to use the length, just walk the peer list */ 493*a159c266SJung-uk Kim 494*a159c266SJung-uk Kim NextOp = NextOp->Common.Next; 495*a159c266SJung-uk Kim while (NextOp) 496*a159c266SJung-uk Kim { 497*a159c266SJung-uk Kim AcpiDmIsEisaIdElement (NextOp); 498*a159c266SJung-uk Kim NextOp = NextOp->Common.Next; 499*a159c266SJung-uk Kim } 500*a159c266SJung-uk Kim } 501*a159c266SJung-uk Kim 502*a159c266SJung-uk Kim 503*a159c266SJung-uk Kim /******************************************************************************* 504*a159c266SJung-uk Kim * 505*a159c266SJung-uk Kim * FUNCTION: AcpiDmEisaId 506*a159c266SJung-uk Kim * 507*a159c266SJung-uk Kim * PARAMETERS: EncodedId - Raw encoded EISA ID. 508*a159c266SJung-uk Kim * 509*a159c266SJung-uk Kim * RETURN: None 510*a159c266SJung-uk Kim * 511*a159c266SJung-uk Kim * DESCRIPTION: Convert an encoded EISAID back to the original ASCII String. 512*a159c266SJung-uk Kim * 513*a159c266SJung-uk Kim ******************************************************************************/ 514*a159c266SJung-uk Kim 515*a159c266SJung-uk Kim void 516*a159c266SJung-uk Kim AcpiDmEisaId ( 517*a159c266SJung-uk Kim UINT32 EncodedId) 518*a159c266SJung-uk Kim { 519*a159c266SJung-uk Kim UINT32 BigEndianId; 520*a159c266SJung-uk Kim 521*a159c266SJung-uk Kim 522*a159c266SJung-uk Kim /* Swap from little-endian to big-endian to simplify conversion */ 523*a159c266SJung-uk Kim 524*a159c266SJung-uk Kim BigEndianId = AcpiUtDwordByteSwap (EncodedId); 525*a159c266SJung-uk Kim 526*a159c266SJung-uk Kim 527*a159c266SJung-uk Kim /* Split to form "AAANNNN" string */ 528*a159c266SJung-uk Kim 529*a159c266SJung-uk Kim AcpiOsPrintf ("EisaId (\"%c%c%c%4.4X\")", 530*a159c266SJung-uk Kim 531*a159c266SJung-uk Kim /* Three Alpha characters (AAA), 5 bits each */ 532*a159c266SJung-uk Kim 533*a159c266SJung-uk Kim (int) ((BigEndianId >> 26) & 0x1F) + 0x40, 534*a159c266SJung-uk Kim (int) ((BigEndianId >> 21) & 0x1F) + 0x40, 535*a159c266SJung-uk Kim (int) ((BigEndianId >> 16) & 0x1F) + 0x40, 536*a159c266SJung-uk Kim 537*a159c266SJung-uk Kim /* Numeric part (NNNN) is simply the lower 16 bits */ 538*a159c266SJung-uk Kim 539*a159c266SJung-uk Kim (UINT32) (BigEndianId & 0xFFFF)); 540*a159c266SJung-uk Kim } 541*a159c266SJung-uk Kim 542*a159c266SJung-uk Kim #endif 543