1ae115bc7Smrj /******************************************************************************* 2ae115bc7Smrj * 3ae115bc7Smrj * Module Name: dmbuffer - AML disassembler, buffer and string support 4ae115bc7Smrj * 5ae115bc7Smrj ******************************************************************************/ 6ae115bc7Smrj 726f3cdf0SGordon Ross /* 8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp. 9ae115bc7Smrj * All rights reserved. 10ae115bc7Smrj * 1126f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without 1226f3cdf0SGordon Ross * modification, are permitted provided that the following conditions 1326f3cdf0SGordon Ross * are met: 1426f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright 1526f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer, 1626f3cdf0SGordon Ross * without modification. 1726f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1826f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below 1926f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon 2026f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further 2126f3cdf0SGordon Ross * binary redistribution. 2226f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names 2326f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived 2426f3cdf0SGordon Ross * from this software without specific prior written permission. 25ae115bc7Smrj * 2626f3cdf0SGordon Ross * Alternatively, this software may be distributed under the terms of the 2726f3cdf0SGordon Ross * GNU General Public License ("GPL") version 2 as published by the Free 2826f3cdf0SGordon Ross * Software Foundation. 29ae115bc7Smrj * 3026f3cdf0SGordon Ross * NO WARRANTY 3126f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3226f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3326f3cdf0SGordon Ross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3426f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3526f3cdf0SGordon Ross * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3626f3cdf0SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3726f3cdf0SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3826f3cdf0SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3926f3cdf0SGordon Ross * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 4026f3cdf0SGordon Ross * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 4126f3cdf0SGordon Ross * POSSIBILITY OF SUCH DAMAGES. 4226f3cdf0SGordon Ross */ 43ae115bc7Smrj 44ae115bc7Smrj #include "acpi.h" 45aa2aa9a6SDana Myers #include "accommon.h" 46*385cc6b4SJerry Jelinek #include "acutils.h" 47ae115bc7Smrj #include "acdisasm.h" 48ae115bc7Smrj #include "acparser.h" 49ae115bc7Smrj #include "amlcode.h" 50*385cc6b4SJerry Jelinek #include "acinterp.h" 51ae115bc7Smrj 52ae115bc7Smrj 53ae115bc7Smrj #define _COMPONENT ACPI_CA_DEBUGGER 54ae115bc7Smrj ACPI_MODULE_NAME ("dmbuffer") 55ae115bc7Smrj 56ae115bc7Smrj /* Local prototypes */ 57ae115bc7Smrj 58ae115bc7Smrj static void 59*385cc6b4SJerry Jelinek AcpiDmUuid ( 60*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *Op); 61*385cc6b4SJerry Jelinek 62*385cc6b4SJerry Jelinek static void 63ae115bc7Smrj AcpiDmUnicode ( 64ae115bc7Smrj ACPI_PARSE_OBJECT *Op); 65ae115bc7Smrj 66aa2aa9a6SDana Myers static void 67*385cc6b4SJerry Jelinek AcpiDmGetHardwareIdType ( 68aa2aa9a6SDana Myers ACPI_PARSE_OBJECT *Op); 69aa2aa9a6SDana Myers 70*385cc6b4SJerry Jelinek static void 71*385cc6b4SJerry Jelinek AcpiDmPldBuffer ( 72*385cc6b4SJerry Jelinek UINT32 Level, 73*385cc6b4SJerry Jelinek UINT8 *ByteData, 74*385cc6b4SJerry Jelinek UINT32 ByteCount); 75*385cc6b4SJerry Jelinek 76*385cc6b4SJerry Jelinek static const char * 77*385cc6b4SJerry Jelinek AcpiDmFindNameByIndex ( 78*385cc6b4SJerry Jelinek UINT64 Index, 79*385cc6b4SJerry Jelinek const char **List); 80*385cc6b4SJerry Jelinek 81*385cc6b4SJerry Jelinek 82*385cc6b4SJerry Jelinek #define ACPI_BUFFER_BYTES_PER_LINE 8 83*385cc6b4SJerry Jelinek 84ae115bc7Smrj 85ae115bc7Smrj /******************************************************************************* 86ae115bc7Smrj * 87ae115bc7Smrj * FUNCTION: AcpiDmDisasmByteList 88ae115bc7Smrj * 89ae115bc7Smrj * PARAMETERS: Level - Current source code indentation level 90ae115bc7Smrj * ByteData - Pointer to the byte list 91ae115bc7Smrj * ByteCount - Length of the byte list 92ae115bc7Smrj * 93ae115bc7Smrj * RETURN: None 94ae115bc7Smrj * 95db2bae30SDana Myers * DESCRIPTION: Dump an AML "ByteList" in Hex format. 8 bytes per line, prefixed 96db2bae30SDana Myers * with the hex buffer offset. 97ae115bc7Smrj * 98ae115bc7Smrj ******************************************************************************/ 99ae115bc7Smrj 100ae115bc7Smrj void 101ae115bc7Smrj AcpiDmDisasmByteList ( 102ae115bc7Smrj UINT32 Level, 103ae115bc7Smrj UINT8 *ByteData, 104ae115bc7Smrj UINT32 ByteCount) 105ae115bc7Smrj { 106ae115bc7Smrj UINT32 i; 107*385cc6b4SJerry Jelinek UINT32 j; 108*385cc6b4SJerry Jelinek UINT32 CurrentIndex; 109*385cc6b4SJerry Jelinek UINT8 BufChar; 110ae115bc7Smrj 111ae115bc7Smrj 112ae115bc7Smrj if (!ByteCount) 113ae115bc7Smrj { 114ae115bc7Smrj return; 115ae115bc7Smrj } 116ae115bc7Smrj 117*385cc6b4SJerry Jelinek for (i = 0; i < ByteCount; i += ACPI_BUFFER_BYTES_PER_LINE) 118ae115bc7Smrj { 119*385cc6b4SJerry Jelinek /* Line indent and offset prefix for each new line */ 120db2bae30SDana Myers 121db2bae30SDana Myers AcpiDmIndent (Level); 122*385cc6b4SJerry Jelinek if (ByteCount > ACPI_BUFFER_BYTES_PER_LINE) 123db2bae30SDana Myers { 124db2bae30SDana Myers AcpiOsPrintf ("/* %04X */ ", i); 125db2bae30SDana Myers } 126*385cc6b4SJerry Jelinek 127*385cc6b4SJerry Jelinek /* Dump the actual hex values */ 128*385cc6b4SJerry Jelinek 129*385cc6b4SJerry Jelinek for (j = 0; j < ACPI_BUFFER_BYTES_PER_LINE; j++) 130*385cc6b4SJerry Jelinek { 131*385cc6b4SJerry Jelinek CurrentIndex = i + j; 132*385cc6b4SJerry Jelinek if (CurrentIndex >= ByteCount) 133*385cc6b4SJerry Jelinek { 134*385cc6b4SJerry Jelinek /* Dump fill spaces */ 135*385cc6b4SJerry Jelinek 136*385cc6b4SJerry Jelinek AcpiOsPrintf (" "); 137*385cc6b4SJerry Jelinek continue; 138db2bae30SDana Myers } 139db2bae30SDana Myers 140*385cc6b4SJerry Jelinek AcpiOsPrintf (" 0x%2.2X", ByteData[CurrentIndex]); 141ae115bc7Smrj 142ae115bc7Smrj /* Add comma if there are more bytes to display */ 143ae115bc7Smrj 144*385cc6b4SJerry Jelinek if (CurrentIndex < (ByteCount - 1)) 145ae115bc7Smrj { 146ae115bc7Smrj AcpiOsPrintf (","); 147ae115bc7Smrj } 148*385cc6b4SJerry Jelinek else 149*385cc6b4SJerry Jelinek { 150*385cc6b4SJerry Jelinek AcpiOsPrintf (" "); 151*385cc6b4SJerry Jelinek } 152ae115bc7Smrj } 153ae115bc7Smrj 154*385cc6b4SJerry Jelinek /* Dump the ASCII equivalents within a comment */ 155*385cc6b4SJerry Jelinek 156*385cc6b4SJerry Jelinek AcpiOsPrintf (" /* "); 157*385cc6b4SJerry Jelinek for (j = 0; j < ACPI_BUFFER_BYTES_PER_LINE; j++) 158ae115bc7Smrj { 159*385cc6b4SJerry Jelinek CurrentIndex = i + j; 160*385cc6b4SJerry Jelinek if (CurrentIndex >= ByteCount) 161*385cc6b4SJerry Jelinek { 162*385cc6b4SJerry Jelinek break; 163*385cc6b4SJerry Jelinek } 164*385cc6b4SJerry Jelinek 165*385cc6b4SJerry Jelinek BufChar = ByteData[CurrentIndex]; 166*385cc6b4SJerry Jelinek if (isprint (BufChar)) 167*385cc6b4SJerry Jelinek { 168*385cc6b4SJerry Jelinek AcpiOsPrintf ("%c", BufChar); 169*385cc6b4SJerry Jelinek } 170*385cc6b4SJerry Jelinek else 171*385cc6b4SJerry Jelinek { 172*385cc6b4SJerry Jelinek AcpiOsPrintf ("."); 173*385cc6b4SJerry Jelinek } 174*385cc6b4SJerry Jelinek } 175*385cc6b4SJerry Jelinek 176*385cc6b4SJerry Jelinek /* Finished with this line */ 177*385cc6b4SJerry Jelinek 178*385cc6b4SJerry Jelinek AcpiOsPrintf (" */\n"); 179ae115bc7Smrj } 180ae115bc7Smrj } 181ae115bc7Smrj 182ae115bc7Smrj 183ae115bc7Smrj /******************************************************************************* 184ae115bc7Smrj * 185ae115bc7Smrj * FUNCTION: AcpiDmByteList 186ae115bc7Smrj * 187ae115bc7Smrj * PARAMETERS: Info - Parse tree walk info 188ae115bc7Smrj * Op - Byte list op 189ae115bc7Smrj * 190ae115bc7Smrj * RETURN: None 191ae115bc7Smrj * 192ae115bc7Smrj * DESCRIPTION: Dump a buffer byte list, handling the various types of buffers. 193ae115bc7Smrj * Buffer type must be already set in the Op DisasmOpcode. 194ae115bc7Smrj * 195ae115bc7Smrj ******************************************************************************/ 196ae115bc7Smrj 197ae115bc7Smrj void 198ae115bc7Smrj AcpiDmByteList ( 199ae115bc7Smrj ACPI_OP_WALK_INFO *Info, 200ae115bc7Smrj ACPI_PARSE_OBJECT *Op) 201ae115bc7Smrj { 202ae115bc7Smrj UINT8 *ByteData; 203ae115bc7Smrj UINT32 ByteCount; 204ae115bc7Smrj 205ae115bc7Smrj 206ae115bc7Smrj ByteData = Op->Named.Data; 207ae115bc7Smrj ByteCount = (UINT32) Op->Common.Value.Integer; 208ae115bc7Smrj 209ae115bc7Smrj /* 210ae115bc7Smrj * The byte list belongs to a buffer, and can be produced by either 211ae115bc7Smrj * a ResourceTemplate, Unicode, quoted string, or a plain byte list. 212ae115bc7Smrj */ 213ae115bc7Smrj switch (Op->Common.Parent->Common.DisasmOpcode) 214ae115bc7Smrj { 215ae115bc7Smrj case ACPI_DASM_RESOURCE: 216ae115bc7Smrj 217*385cc6b4SJerry Jelinek AcpiDmResourceTemplate ( 218*385cc6b4SJerry Jelinek Info, Op->Common.Parent, ByteData, ByteCount); 219ae115bc7Smrj break; 220ae115bc7Smrj 221ae115bc7Smrj case ACPI_DASM_STRING: 222ae115bc7Smrj 223ae115bc7Smrj AcpiDmIndent (Info->Level); 224*385cc6b4SJerry Jelinek AcpiUtPrintString ((char *) ByteData, ACPI_UINT16_MAX); 225ae115bc7Smrj AcpiOsPrintf ("\n"); 226ae115bc7Smrj break; 227ae115bc7Smrj 228*385cc6b4SJerry Jelinek case ACPI_DASM_UUID: 229*385cc6b4SJerry Jelinek 230*385cc6b4SJerry Jelinek AcpiDmUuid (Op); 231*385cc6b4SJerry Jelinek break; 232*385cc6b4SJerry Jelinek 233ae115bc7Smrj case ACPI_DASM_UNICODE: 234ae115bc7Smrj 235ae115bc7Smrj AcpiDmUnicode (Op); 236ae115bc7Smrj break; 237ae115bc7Smrj 238*385cc6b4SJerry Jelinek case ACPI_DASM_PLD_METHOD: 239*385cc6b4SJerry Jelinek #if 0 240*385cc6b4SJerry Jelinek AcpiDmDisasmByteList (Info->Level, ByteData, ByteCount); 241*385cc6b4SJerry Jelinek #endif 242*385cc6b4SJerry Jelinek AcpiDmPldBuffer (Info->Level, ByteData, ByteCount); 243*385cc6b4SJerry Jelinek break; 244*385cc6b4SJerry Jelinek 245ae115bc7Smrj case ACPI_DASM_BUFFER: 246ae115bc7Smrj default: 247ae115bc7Smrj /* 248ae115bc7Smrj * Not a resource, string, or unicode string. 249ae115bc7Smrj * Just dump the buffer 250ae115bc7Smrj */ 251ae115bc7Smrj AcpiDmDisasmByteList (Info->Level, ByteData, ByteCount); 252ae115bc7Smrj break; 253ae115bc7Smrj } 254ae115bc7Smrj } 255ae115bc7Smrj 256ae115bc7Smrj 257ae115bc7Smrj /******************************************************************************* 258ae115bc7Smrj * 259*385cc6b4SJerry Jelinek * FUNCTION: AcpiDmIsUuidBuffer 260*385cc6b4SJerry Jelinek * 261*385cc6b4SJerry Jelinek * PARAMETERS: Op - Buffer Object to be examined 262*385cc6b4SJerry Jelinek * 263*385cc6b4SJerry Jelinek * RETURN: TRUE if buffer contains a UUID 264*385cc6b4SJerry Jelinek * 265*385cc6b4SJerry Jelinek * DESCRIPTION: Determine if a buffer Op contains a UUID 266*385cc6b4SJerry Jelinek * 267*385cc6b4SJerry Jelinek * To help determine whether the buffer is a UUID versus a raw data buffer, 268*385cc6b4SJerry Jelinek * there a are a couple bytes we can look at: 269*385cc6b4SJerry Jelinek * 270*385cc6b4SJerry Jelinek * xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx 271*385cc6b4SJerry Jelinek * 272*385cc6b4SJerry Jelinek * The variant covered by the UUID specification is indicated by the two most 273*385cc6b4SJerry Jelinek * significant bits of N being 1 0 (i.e., the hexadecimal N will always be 274*385cc6b4SJerry Jelinek * 8, 9, A, or B). 275*385cc6b4SJerry Jelinek * 276*385cc6b4SJerry Jelinek * The variant covered by the UUID specification has five versions. For this 277*385cc6b4SJerry Jelinek * variant, the four bits of M indicates the UUID version (i.e., the 278*385cc6b4SJerry Jelinek * hexadecimal M will be either 1, 2, 3, 4, or 5). 279*385cc6b4SJerry Jelinek * 280*385cc6b4SJerry Jelinek ******************************************************************************/ 281*385cc6b4SJerry Jelinek 282*385cc6b4SJerry Jelinek BOOLEAN 283*385cc6b4SJerry Jelinek AcpiDmIsUuidBuffer ( 284*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *Op) 285*385cc6b4SJerry Jelinek { 286*385cc6b4SJerry Jelinek UINT8 *ByteData; 287*385cc6b4SJerry Jelinek UINT32 ByteCount; 288*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *SizeOp; 289*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *NextOp; 290*385cc6b4SJerry Jelinek 291*385cc6b4SJerry Jelinek 292*385cc6b4SJerry Jelinek /* Buffer size is the buffer argument */ 293*385cc6b4SJerry Jelinek 294*385cc6b4SJerry Jelinek SizeOp = Op->Common.Value.Arg; 295*385cc6b4SJerry Jelinek 296*385cc6b4SJerry Jelinek /* Next, the initializer byte list to examine */ 297*385cc6b4SJerry Jelinek 298*385cc6b4SJerry Jelinek NextOp = SizeOp->Common.Next; 299*385cc6b4SJerry Jelinek if (!NextOp) 300*385cc6b4SJerry Jelinek { 301*385cc6b4SJerry Jelinek return (FALSE); 302*385cc6b4SJerry Jelinek } 303*385cc6b4SJerry Jelinek 304*385cc6b4SJerry Jelinek /* Extract the byte list info */ 305*385cc6b4SJerry Jelinek 306*385cc6b4SJerry Jelinek ByteData = NextOp->Named.Data; 307*385cc6b4SJerry Jelinek ByteCount = (UINT32) NextOp->Common.Value.Integer; 308*385cc6b4SJerry Jelinek 309*385cc6b4SJerry Jelinek /* Byte count must be exactly 16 */ 310*385cc6b4SJerry Jelinek 311*385cc6b4SJerry Jelinek if (ByteCount != UUID_BUFFER_LENGTH) 312*385cc6b4SJerry Jelinek { 313*385cc6b4SJerry Jelinek return (FALSE); 314*385cc6b4SJerry Jelinek } 315*385cc6b4SJerry Jelinek 316*385cc6b4SJerry Jelinek /* Check for valid "M" and "N" values (see function header above) */ 317*385cc6b4SJerry Jelinek 318*385cc6b4SJerry Jelinek if (((ByteData[7] & 0xF0) == 0x00) || /* M={1,2,3,4,5} */ 319*385cc6b4SJerry Jelinek ((ByteData[7] & 0xF0) > 0x50) || 320*385cc6b4SJerry Jelinek ((ByteData[8] & 0xF0) < 0x80) || /* N={8,9,A,B} */ 321*385cc6b4SJerry Jelinek ((ByteData[8] & 0xF0) > 0xB0)) 322*385cc6b4SJerry Jelinek { 323*385cc6b4SJerry Jelinek return (FALSE); 324*385cc6b4SJerry Jelinek } 325*385cc6b4SJerry Jelinek 326*385cc6b4SJerry Jelinek /* Ignore the Size argument in the disassembly of this buffer op */ 327*385cc6b4SJerry Jelinek 328*385cc6b4SJerry Jelinek SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 329*385cc6b4SJerry Jelinek return (TRUE); 330*385cc6b4SJerry Jelinek } 331*385cc6b4SJerry Jelinek 332*385cc6b4SJerry Jelinek 333*385cc6b4SJerry Jelinek /******************************************************************************* 334*385cc6b4SJerry Jelinek * 335*385cc6b4SJerry Jelinek * FUNCTION: AcpiDmUuid 336*385cc6b4SJerry Jelinek * 337*385cc6b4SJerry Jelinek * PARAMETERS: Op - Byte List op containing a UUID 338*385cc6b4SJerry Jelinek * 339*385cc6b4SJerry Jelinek * RETURN: None 340*385cc6b4SJerry Jelinek * 341*385cc6b4SJerry Jelinek * DESCRIPTION: Dump a buffer containing a UUID as a standard ASCII string. 342*385cc6b4SJerry Jelinek * 343*385cc6b4SJerry Jelinek * Output Format: 344*385cc6b4SJerry Jelinek * In its canonical form, the UUID is represented by a string containing 32 345*385cc6b4SJerry Jelinek * lowercase hexadecimal digits, displayed in 5 groups separated by hyphens. 346*385cc6b4SJerry Jelinek * The complete form is 8-4-4-4-12 for a total of 36 characters (32 347*385cc6b4SJerry Jelinek * alphanumeric characters representing hex digits and 4 hyphens). In bytes, 348*385cc6b4SJerry Jelinek * 4-2-2-2-6. Example: 349*385cc6b4SJerry Jelinek * 350*385cc6b4SJerry Jelinek * ToUUID ("107ededd-d381-4fd7-8da9-08e9a6c79644") 351*385cc6b4SJerry Jelinek * 352*385cc6b4SJerry Jelinek ******************************************************************************/ 353*385cc6b4SJerry Jelinek 354*385cc6b4SJerry Jelinek static void 355*385cc6b4SJerry Jelinek AcpiDmUuid ( 356*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *Op) 357*385cc6b4SJerry Jelinek { 358*385cc6b4SJerry Jelinek UINT8 *Data; 359*385cc6b4SJerry Jelinek const char *Description; 360*385cc6b4SJerry Jelinek 361*385cc6b4SJerry Jelinek 362*385cc6b4SJerry Jelinek Data = ACPI_CAST_PTR (UINT8, Op->Named.Data); 363*385cc6b4SJerry Jelinek 364*385cc6b4SJerry Jelinek /* Emit the 36-byte UUID string in the proper format/order */ 365*385cc6b4SJerry Jelinek 366*385cc6b4SJerry Jelinek AcpiOsPrintf ( 367*385cc6b4SJerry Jelinek "\"%2.2x%2.2x%2.2x%2.2x-" 368*385cc6b4SJerry Jelinek "%2.2x%2.2x-" 369*385cc6b4SJerry Jelinek "%2.2x%2.2x-" 370*385cc6b4SJerry Jelinek "%2.2x%2.2x-" 371*385cc6b4SJerry Jelinek "%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x\")", 372*385cc6b4SJerry Jelinek Data[3], Data[2], Data[1], Data[0], 373*385cc6b4SJerry Jelinek Data[5], Data[4], 374*385cc6b4SJerry Jelinek Data[7], Data[6], 375*385cc6b4SJerry Jelinek Data[8], Data[9], 376*385cc6b4SJerry Jelinek Data[10], Data[11], Data[12], Data[13], Data[14], Data[15]); 377*385cc6b4SJerry Jelinek 378*385cc6b4SJerry Jelinek #ifdef ACPI_APPLICATION 379*385cc6b4SJerry Jelinek /* Dump the UUID description string if available */ 380*385cc6b4SJerry Jelinek 381*385cc6b4SJerry Jelinek Description = AcpiAhMatchUuid (Data); 382*385cc6b4SJerry Jelinek if (Description) 383*385cc6b4SJerry Jelinek { 384*385cc6b4SJerry Jelinek AcpiOsPrintf (" /* %s */", Description); 385*385cc6b4SJerry Jelinek } 386*385cc6b4SJerry Jelinek #endif 387*385cc6b4SJerry Jelinek } 388*385cc6b4SJerry Jelinek 389*385cc6b4SJerry Jelinek 390*385cc6b4SJerry Jelinek /******************************************************************************* 391*385cc6b4SJerry Jelinek * 392ae115bc7Smrj * FUNCTION: AcpiDmIsUnicodeBuffer 393ae115bc7Smrj * 394ae115bc7Smrj * PARAMETERS: Op - Buffer Object to be examined 395ae115bc7Smrj * 396ae115bc7Smrj * RETURN: TRUE if buffer contains a UNICODE string 397ae115bc7Smrj * 398ae115bc7Smrj * DESCRIPTION: Determine if a buffer Op contains a Unicode string 399ae115bc7Smrj * 400ae115bc7Smrj ******************************************************************************/ 401ae115bc7Smrj 402ae115bc7Smrj BOOLEAN 403ae115bc7Smrj AcpiDmIsUnicodeBuffer ( 404ae115bc7Smrj ACPI_PARSE_OBJECT *Op) 405ae115bc7Smrj { 406ae115bc7Smrj UINT8 *ByteData; 407ae115bc7Smrj UINT32 ByteCount; 408ae115bc7Smrj UINT32 WordCount; 409ae115bc7Smrj ACPI_PARSE_OBJECT *SizeOp; 410ae115bc7Smrj ACPI_PARSE_OBJECT *NextOp; 411db2bae30SDana Myers UINT32 i; 412ae115bc7Smrj 413ae115bc7Smrj 414ae115bc7Smrj /* Buffer size is the buffer argument */ 415ae115bc7Smrj 416ae115bc7Smrj SizeOp = Op->Common.Value.Arg; 417ae115bc7Smrj 418ae115bc7Smrj /* Next, the initializer byte list to examine */ 419ae115bc7Smrj 420ae115bc7Smrj NextOp = SizeOp->Common.Next; 421ae115bc7Smrj if (!NextOp) 422ae115bc7Smrj { 423ae115bc7Smrj return (FALSE); 424ae115bc7Smrj } 425ae115bc7Smrj 426ae115bc7Smrj /* Extract the byte list info */ 427ae115bc7Smrj 428ae115bc7Smrj ByteData = NextOp->Named.Data; 429ae115bc7Smrj ByteCount = (UINT32) NextOp->Common.Value.Integer; 430ae115bc7Smrj WordCount = ACPI_DIV_2 (ByteCount); 431ae115bc7Smrj 432ae115bc7Smrj /* 433ae115bc7Smrj * Unicode string must have an even number of bytes and last 434ae115bc7Smrj * word must be zero 435ae115bc7Smrj */ 436ae115bc7Smrj if ((!ByteCount) || 437ae115bc7Smrj (ByteCount < 4) || 438ae115bc7Smrj (ByteCount & 1) || 439ae115bc7Smrj ((UINT16 *) (void *) ByteData)[WordCount - 1] != 0) 440ae115bc7Smrj { 441ae115bc7Smrj return (FALSE); 442ae115bc7Smrj } 443ae115bc7Smrj 444*385cc6b4SJerry Jelinek /* For each word, 1st byte must be ascii (1-0x7F), 2nd byte must be zero */ 445ae115bc7Smrj 446ae115bc7Smrj for (i = 0; i < (ByteCount - 2); i += 2) 447ae115bc7Smrj { 448*385cc6b4SJerry Jelinek if ((ByteData[i] == 0) || 449*385cc6b4SJerry Jelinek (ByteData[i] > 0x7F) || 450db2bae30SDana Myers (ByteData[(ACPI_SIZE) i + 1] != 0)) 451ae115bc7Smrj { 452ae115bc7Smrj return (FALSE); 453ae115bc7Smrj } 454ae115bc7Smrj } 455ae115bc7Smrj 456ae115bc7Smrj /* Ignore the Size argument in the disassembly of this buffer op */ 457ae115bc7Smrj 458ae115bc7Smrj SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 459ae115bc7Smrj return (TRUE); 460ae115bc7Smrj } 461ae115bc7Smrj 462ae115bc7Smrj 463ae115bc7Smrj /******************************************************************************* 464ae115bc7Smrj * 465ae115bc7Smrj * FUNCTION: AcpiDmIsStringBuffer 466ae115bc7Smrj * 467ae115bc7Smrj * PARAMETERS: Op - Buffer Object to be examined 468ae115bc7Smrj * 469ae115bc7Smrj * RETURN: TRUE if buffer contains a ASCII string, FALSE otherwise 470ae115bc7Smrj * 471ae115bc7Smrj * DESCRIPTION: Determine if a buffer Op contains a ASCII string 472ae115bc7Smrj * 473ae115bc7Smrj ******************************************************************************/ 474ae115bc7Smrj 475ae115bc7Smrj BOOLEAN 476ae115bc7Smrj AcpiDmIsStringBuffer ( 477ae115bc7Smrj ACPI_PARSE_OBJECT *Op) 478ae115bc7Smrj { 479ae115bc7Smrj UINT8 *ByteData; 480ae115bc7Smrj UINT32 ByteCount; 481ae115bc7Smrj ACPI_PARSE_OBJECT *SizeOp; 482ae115bc7Smrj ACPI_PARSE_OBJECT *NextOp; 483ae115bc7Smrj UINT32 i; 484ae115bc7Smrj 485ae115bc7Smrj 486ae115bc7Smrj /* Buffer size is the buffer argument */ 487ae115bc7Smrj 488ae115bc7Smrj SizeOp = Op->Common.Value.Arg; 489ae115bc7Smrj 490ae115bc7Smrj /* Next, the initializer byte list to examine */ 491ae115bc7Smrj 492ae115bc7Smrj NextOp = SizeOp->Common.Next; 493ae115bc7Smrj if (!NextOp) 494ae115bc7Smrj { 495ae115bc7Smrj return (FALSE); 496ae115bc7Smrj } 497ae115bc7Smrj 498ae115bc7Smrj /* Extract the byte list info */ 499ae115bc7Smrj 500ae115bc7Smrj ByteData = NextOp->Named.Data; 501ae115bc7Smrj ByteCount = (UINT32) NextOp->Common.Value.Integer; 502ae115bc7Smrj 503ae115bc7Smrj /* Last byte must be the null terminator */ 504ae115bc7Smrj 505ae115bc7Smrj if ((!ByteCount) || 506ae115bc7Smrj (ByteCount < 2) || 507ae115bc7Smrj (ByteData[ByteCount-1] != 0)) 508ae115bc7Smrj { 509ae115bc7Smrj return (FALSE); 510ae115bc7Smrj } 511ae115bc7Smrj 512ae115bc7Smrj for (i = 0; i < (ByteCount - 1); i++) 513ae115bc7Smrj { 514ae115bc7Smrj /* TBD: allow some escapes (non-ascii chars). 515ae115bc7Smrj * they will be handled in the string output routine 516ae115bc7Smrj */ 517ae115bc7Smrj 518*385cc6b4SJerry Jelinek if (!isprint (ByteData[i])) 519ae115bc7Smrj { 520ae115bc7Smrj return (FALSE); 521ae115bc7Smrj } 522ae115bc7Smrj } 523ae115bc7Smrj 524ae115bc7Smrj return (TRUE); 525ae115bc7Smrj } 526ae115bc7Smrj 527ae115bc7Smrj 528ae115bc7Smrj /******************************************************************************* 529ae115bc7Smrj * 530*385cc6b4SJerry Jelinek * FUNCTION: AcpiDmIsPldBuffer 531*385cc6b4SJerry Jelinek * 532*385cc6b4SJerry Jelinek * PARAMETERS: Op - Buffer Object to be examined 533*385cc6b4SJerry Jelinek * 534*385cc6b4SJerry Jelinek * RETURN: TRUE if buffer contains a ASCII string, FALSE otherwise 535*385cc6b4SJerry Jelinek * 536*385cc6b4SJerry Jelinek * DESCRIPTION: Determine if a buffer Op contains a _PLD structure 537*385cc6b4SJerry Jelinek * 538*385cc6b4SJerry Jelinek ******************************************************************************/ 539*385cc6b4SJerry Jelinek 540*385cc6b4SJerry Jelinek BOOLEAN 541*385cc6b4SJerry Jelinek AcpiDmIsPldBuffer ( 542*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *Op) 543*385cc6b4SJerry Jelinek { 544*385cc6b4SJerry Jelinek ACPI_NAMESPACE_NODE *Node; 545*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *SizeOp; 546*385cc6b4SJerry Jelinek ACPI_PARSE_OBJECT *ParentOp; 547*385cc6b4SJerry Jelinek 548*385cc6b4SJerry Jelinek 549*385cc6b4SJerry Jelinek /* Buffer size is the buffer argument */ 550*385cc6b4SJerry Jelinek 551*385cc6b4SJerry Jelinek SizeOp = Op->Common.Value.Arg; 552*385cc6b4SJerry Jelinek 553*385cc6b4SJerry Jelinek ParentOp = Op->Common.Parent; 554*385cc6b4SJerry Jelinek if (!ParentOp) 555*385cc6b4SJerry Jelinek { 556*385cc6b4SJerry Jelinek return (FALSE); 557*385cc6b4SJerry Jelinek } 558*385cc6b4SJerry Jelinek 559*385cc6b4SJerry Jelinek /* Check for form: Name(_PLD, Buffer() {}). Not legal, however */ 560*385cc6b4SJerry Jelinek 561*385cc6b4SJerry Jelinek if (ParentOp->Common.AmlOpcode == AML_NAME_OP) 562*385cc6b4SJerry Jelinek { 563*385cc6b4SJerry Jelinek Node = ParentOp->Common.Node; 564*385cc6b4SJerry Jelinek 565*385cc6b4SJerry Jelinek if (ACPI_COMPARE_NAME (Node->Name.Ascii, METHOD_NAME__PLD)) 566*385cc6b4SJerry Jelinek { 567*385cc6b4SJerry Jelinek /* Ignore the Size argument in the disassembly of this buffer op */ 568*385cc6b4SJerry Jelinek 569*385cc6b4SJerry Jelinek SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 570*385cc6b4SJerry Jelinek return (TRUE); 571*385cc6b4SJerry Jelinek } 572*385cc6b4SJerry Jelinek 573*385cc6b4SJerry Jelinek return (FALSE); 574*385cc6b4SJerry Jelinek } 575*385cc6b4SJerry Jelinek 576*385cc6b4SJerry Jelinek /* Check for proper form: Name(_PLD, Package() {Buffer() {}}) */ 577*385cc6b4SJerry Jelinek 578*385cc6b4SJerry Jelinek if (ParentOp->Common.AmlOpcode == AML_PACKAGE_OP) 579*385cc6b4SJerry Jelinek { 580*385cc6b4SJerry Jelinek ParentOp = ParentOp->Common.Parent; 581*385cc6b4SJerry Jelinek if (!ParentOp) 582*385cc6b4SJerry Jelinek { 583*385cc6b4SJerry Jelinek return (FALSE); 584*385cc6b4SJerry Jelinek } 585*385cc6b4SJerry Jelinek 586*385cc6b4SJerry Jelinek if (ParentOp->Common.AmlOpcode == AML_NAME_OP) 587*385cc6b4SJerry Jelinek { 588*385cc6b4SJerry Jelinek Node = ParentOp->Common.Node; 589*385cc6b4SJerry Jelinek 590*385cc6b4SJerry Jelinek if (ACPI_COMPARE_NAME (Node->Name.Ascii, METHOD_NAME__PLD)) 591*385cc6b4SJerry Jelinek { 592*385cc6b4SJerry Jelinek /* Ignore the Size argument in the disassembly of this buffer op */ 593*385cc6b4SJerry Jelinek 594*385cc6b4SJerry Jelinek SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE; 595*385cc6b4SJerry Jelinek return (TRUE); 596*385cc6b4SJerry Jelinek } 597*385cc6b4SJerry Jelinek } 598*385cc6b4SJerry Jelinek } 599*385cc6b4SJerry Jelinek 600*385cc6b4SJerry Jelinek return (FALSE); 601*385cc6b4SJerry Jelinek } 602*385cc6b4SJerry Jelinek 603*385cc6b4SJerry Jelinek 604*385cc6b4SJerry Jelinek /******************************************************************************* 605*385cc6b4SJerry Jelinek * 606*385cc6b4SJerry Jelinek * FUNCTION: AcpiDmFindNameByIndex 607*385cc6b4SJerry Jelinek * 608*385cc6b4SJerry Jelinek * PARAMETERS: Index - Index of array to check 609*385cc6b4SJerry Jelinek * List - Array to reference 610*385cc6b4SJerry Jelinek * 611*385cc6b4SJerry Jelinek * RETURN: String from List or empty string 612*385cc6b4SJerry Jelinek * 613*385cc6b4SJerry Jelinek * DESCRIPTION: Finds and returns the char string located at the given index 614*385cc6b4SJerry Jelinek * position in List. 615*385cc6b4SJerry Jelinek * 616*385cc6b4SJerry Jelinek ******************************************************************************/ 617*385cc6b4SJerry Jelinek 618*385cc6b4SJerry Jelinek static const char * 619*385cc6b4SJerry Jelinek AcpiDmFindNameByIndex ( 620*385cc6b4SJerry Jelinek UINT64 Index, 621*385cc6b4SJerry Jelinek const char **List) 622*385cc6b4SJerry Jelinek { 623*385cc6b4SJerry Jelinek const char *NameString; 624*385cc6b4SJerry Jelinek UINT32 i; 625*385cc6b4SJerry Jelinek 626*385cc6b4SJerry Jelinek 627*385cc6b4SJerry Jelinek /* Bounds check */ 628*385cc6b4SJerry Jelinek 629*385cc6b4SJerry Jelinek NameString = List[0]; 630*385cc6b4SJerry Jelinek i = 0; 631*385cc6b4SJerry Jelinek 632*385cc6b4SJerry Jelinek while (NameString) 633*385cc6b4SJerry Jelinek { 634*385cc6b4SJerry Jelinek i++; 635*385cc6b4SJerry Jelinek NameString = List[i]; 636*385cc6b4SJerry Jelinek } 637*385cc6b4SJerry Jelinek 638*385cc6b4SJerry Jelinek if (Index >= i) 639*385cc6b4SJerry Jelinek { 640*385cc6b4SJerry Jelinek /* TBD: Add error msg */ 641*385cc6b4SJerry Jelinek 642*385cc6b4SJerry Jelinek return (""); 643*385cc6b4SJerry Jelinek } 644*385cc6b4SJerry Jelinek 645*385cc6b4SJerry Jelinek return (List[Index]); 646*385cc6b4SJerry Jelinek } 647*385cc6b4SJerry Jelinek 648*385cc6b4SJerry Jelinek 649*385cc6b4SJerry Jelinek /******************************************************************************* 650*385cc6b4SJerry Jelinek * 651*385cc6b4SJerry Jelinek * FUNCTION: AcpiDmPldBuffer 652*385cc6b4SJerry Jelinek * 653*385cc6b4SJerry Jelinek * PARAMETERS: Level - Current source code indentation level 654*385cc6b4SJerry Jelinek * ByteData - Pointer to the byte list 655*385cc6b4SJerry Jelinek * ByteCount - Length of the byte list 656*385cc6b4SJerry Jelinek * 657*385cc6b4SJerry Jelinek * RETURN: None 658*385cc6b4SJerry Jelinek * 659*385cc6b4SJerry Jelinek * DESCRIPTION: Dump and format the contents of a _PLD buffer object 660*385cc6b4SJerry Jelinek * 661*385cc6b4SJerry Jelinek ******************************************************************************/ 662*385cc6b4SJerry Jelinek 663*385cc6b4SJerry Jelinek #define ACPI_PLD_OUTPUT08 "%*.s%-22s = 0x%X,\n", ACPI_MUL_4 (Level), " " 664*385cc6b4SJerry Jelinek #define ACPI_PLD_OUTPUT08P "%*.s%-22s = 0x%X)\n", ACPI_MUL_4 (Level), " " 665*385cc6b4SJerry Jelinek #define ACPI_PLD_OUTPUT16 "%*.s%-22s = 0x%X,\n", ACPI_MUL_4 (Level), " " 666*385cc6b4SJerry Jelinek #define ACPI_PLD_OUTPUT16P "%*.s%-22s = 0x%X)\n", ACPI_MUL_4 (Level), " " 667*385cc6b4SJerry Jelinek #define ACPI_PLD_OUTPUT24 "%*.s%-22s = 0x%X,\n", ACPI_MUL_4 (Level), " " 668*385cc6b4SJerry Jelinek #define ACPI_PLD_OUTPUTSTR "%*.s%-22s = \"%s\",\n", ACPI_MUL_4 (Level), " " 669*385cc6b4SJerry Jelinek 670*385cc6b4SJerry Jelinek static void 671*385cc6b4SJerry Jelinek AcpiDmPldBuffer ( 672*385cc6b4SJerry Jelinek UINT32 Level, 673*385cc6b4SJerry Jelinek UINT8 *ByteData, 674*385cc6b4SJerry Jelinek UINT32 ByteCount) 675*385cc6b4SJerry Jelinek { 676*385cc6b4SJerry Jelinek ACPI_PLD_INFO *PldInfo; 677*385cc6b4SJerry Jelinek ACPI_STATUS Status; 678*385cc6b4SJerry Jelinek 679*385cc6b4SJerry Jelinek 680*385cc6b4SJerry Jelinek /* Check for valid byte count */ 681*385cc6b4SJerry Jelinek 682*385cc6b4SJerry Jelinek if (ByteCount < ACPI_PLD_REV1_BUFFER_SIZE) 683*385cc6b4SJerry Jelinek { 684*385cc6b4SJerry Jelinek return; 685*385cc6b4SJerry Jelinek } 686*385cc6b4SJerry Jelinek 687*385cc6b4SJerry Jelinek /* Convert _PLD buffer to local _PLD struct */ 688*385cc6b4SJerry Jelinek 689*385cc6b4SJerry Jelinek Status = AcpiDecodePldBuffer (ByteData, ByteCount, &PldInfo); 690*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status)) 691*385cc6b4SJerry Jelinek { 692*385cc6b4SJerry Jelinek return; 693*385cc6b4SJerry Jelinek } 694*385cc6b4SJerry Jelinek 695*385cc6b4SJerry Jelinek AcpiOsPrintf ("\n"); 696*385cc6b4SJerry Jelinek 697*385cc6b4SJerry Jelinek /* First 32-bit dword */ 698*385cc6b4SJerry Jelinek 699*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Revision", PldInfo->Revision); 700*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_IgnoreColor", PldInfo->IgnoreColor); 701*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Red", PldInfo->Red); 702*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Green", PldInfo->Green); 703*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Blue", PldInfo->Blue); 704*385cc6b4SJerry Jelinek 705*385cc6b4SJerry Jelinek /* Second 32-bit dword */ 706*385cc6b4SJerry Jelinek 707*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT16, "PLD_Width", PldInfo->Width); 708*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT16, "PLD_Height", PldInfo->Height); 709*385cc6b4SJerry Jelinek 710*385cc6b4SJerry Jelinek /* Third 32-bit dword */ 711*385cc6b4SJerry Jelinek 712*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_UserVisible", PldInfo->UserVisible); 713*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Dock", PldInfo->Dock); 714*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Lid", PldInfo->Lid); 715*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUTSTR, "PLD_Panel", 716*385cc6b4SJerry Jelinek AcpiDmFindNameByIndex(PldInfo->Panel, AcpiGbl_PldPanelList)); 717*385cc6b4SJerry Jelinek 718*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUTSTR, "PLD_VerticalPosition", 719*385cc6b4SJerry Jelinek AcpiDmFindNameByIndex(PldInfo->VerticalPosition, AcpiGbl_PldVerticalPositionList)); 720*385cc6b4SJerry Jelinek 721*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUTSTR, "PLD_HorizontalPosition", 722*385cc6b4SJerry Jelinek AcpiDmFindNameByIndex(PldInfo->HorizontalPosition, AcpiGbl_PldHorizontalPositionList)); 723*385cc6b4SJerry Jelinek 724*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUTSTR, "PLD_Shape", 725*385cc6b4SJerry Jelinek AcpiDmFindNameByIndex(PldInfo->Shape, AcpiGbl_PldShapeList)); 726*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_GroupOrientation", PldInfo->GroupOrientation); 727*385cc6b4SJerry Jelinek 728*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_GroupToken", PldInfo->GroupToken); 729*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_GroupPosition", PldInfo->GroupPosition); 730*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Bay", PldInfo->Bay); 731*385cc6b4SJerry Jelinek 732*385cc6b4SJerry Jelinek /* Fourth 32-bit dword */ 733*385cc6b4SJerry Jelinek 734*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Ejectable", PldInfo->Ejectable); 735*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_EjectRequired", PldInfo->OspmEjectRequired); 736*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_CabinetNumber", PldInfo->CabinetNumber); 737*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_CardCageNumber", PldInfo->CardCageNumber); 738*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Reference", PldInfo->Reference); 739*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Rotation", PldInfo->Rotation); 740*385cc6b4SJerry Jelinek 741*385cc6b4SJerry Jelinek if (ByteCount >= ACPI_PLD_REV2_BUFFER_SIZE) 742*385cc6b4SJerry Jelinek { 743*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08, "PLD_Order", PldInfo->Order); 744*385cc6b4SJerry Jelinek 745*385cc6b4SJerry Jelinek /* Fifth 32-bit dword */ 746*385cc6b4SJerry Jelinek 747*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT16, "PLD_VerticalOffset", PldInfo->VerticalOffset); 748*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT16P, "PLD_HorizontalOffset", PldInfo->HorizontalOffset); 749*385cc6b4SJerry Jelinek } 750*385cc6b4SJerry Jelinek else /* Rev 1 buffer */ 751*385cc6b4SJerry Jelinek { 752*385cc6b4SJerry Jelinek AcpiOsPrintf (ACPI_PLD_OUTPUT08P, "PLD_Order", PldInfo->Order); 753*385cc6b4SJerry Jelinek } 754*385cc6b4SJerry Jelinek 755*385cc6b4SJerry Jelinek ACPI_FREE (PldInfo); 756*385cc6b4SJerry Jelinek } 757*385cc6b4SJerry Jelinek 758*385cc6b4SJerry Jelinek 759*385cc6b4SJerry Jelinek /******************************************************************************* 760*385cc6b4SJerry Jelinek * 761ae115bc7Smrj * FUNCTION: AcpiDmUnicode 762ae115bc7Smrj * 763ae115bc7Smrj * PARAMETERS: Op - Byte List op containing Unicode string 764ae115bc7Smrj * 765ae115bc7Smrj * RETURN: None 766ae115bc7Smrj * 767ae115bc7Smrj * DESCRIPTION: Dump Unicode string as a standard ASCII string. (Remove 768ae115bc7Smrj * the extra zero bytes). 769ae115bc7Smrj * 770ae115bc7Smrj ******************************************************************************/ 771ae115bc7Smrj 772ae115bc7Smrj static void 773ae115bc7Smrj AcpiDmUnicode ( 774ae115bc7Smrj ACPI_PARSE_OBJECT *Op) 775ae115bc7Smrj { 776ae115bc7Smrj UINT16 *WordData; 777ae115bc7Smrj UINT32 WordCount; 778ae115bc7Smrj UINT32 i; 779*385cc6b4SJerry Jelinek int OutputValue; 780ae115bc7Smrj 781ae115bc7Smrj 782ae115bc7Smrj /* Extract the buffer info as a WORD buffer */ 783ae115bc7Smrj 784ae115bc7Smrj WordData = ACPI_CAST_PTR (UINT16, Op->Named.Data); 785ae115bc7Smrj WordCount = ACPI_DIV_2 (((UINT32) Op->Common.Value.Integer)); 786ae115bc7Smrj 787ae115bc7Smrj /* Write every other byte as an ASCII character */ 788ae115bc7Smrj 789*385cc6b4SJerry Jelinek AcpiOsPrintf ("\""); 790ae115bc7Smrj for (i = 0; i < (WordCount - 1); i++) 791ae115bc7Smrj { 792*385cc6b4SJerry Jelinek OutputValue = (int) WordData[i]; 793*385cc6b4SJerry Jelinek 794*385cc6b4SJerry Jelinek /* Handle values that must be escaped */ 795*385cc6b4SJerry Jelinek 796*385cc6b4SJerry Jelinek if ((OutputValue == '\"') || 797*385cc6b4SJerry Jelinek (OutputValue == '\\')) 798*385cc6b4SJerry Jelinek { 799*385cc6b4SJerry Jelinek AcpiOsPrintf ("\\%c", OutputValue); 800*385cc6b4SJerry Jelinek } 801*385cc6b4SJerry Jelinek else if (!isprint (OutputValue)) 802*385cc6b4SJerry Jelinek { 803*385cc6b4SJerry Jelinek AcpiOsPrintf ("\\x%2.2X", OutputValue); 804*385cc6b4SJerry Jelinek } 805*385cc6b4SJerry Jelinek else 806*385cc6b4SJerry Jelinek { 807*385cc6b4SJerry Jelinek AcpiOsPrintf ("%c", OutputValue); 808*385cc6b4SJerry Jelinek } 809ae115bc7Smrj } 810ae115bc7Smrj 811ae115bc7Smrj AcpiOsPrintf ("\")"); 812ae115bc7Smrj } 813ae115bc7Smrj 814ae115bc7Smrj 815ae115bc7Smrj /******************************************************************************* 816ae115bc7Smrj * 817*385cc6b4SJerry Jelinek * FUNCTION: AcpiDmGetHardwareIdType 818ae115bc7Smrj * 819ae115bc7Smrj * PARAMETERS: Op - Op to be examined 820ae115bc7Smrj * 821ae115bc7Smrj * RETURN: None 822ae115bc7Smrj * 823*385cc6b4SJerry Jelinek * DESCRIPTION: Determine the type of the argument to a _HID or _CID 824*385cc6b4SJerry Jelinek * 1) Strings are allowed 825*385cc6b4SJerry Jelinek * 2) If Integer, determine if it is a valid EISAID 826ae115bc7Smrj * 827ae115bc7Smrj ******************************************************************************/ 828ae115bc7Smrj 829aa2aa9a6SDana Myers static void 830*385cc6b4SJerry Jelinek AcpiDmGetHardwareIdType ( 831ae115bc7Smrj ACPI_PARSE_OBJECT *Op) 832ae115bc7Smrj { 833ae115bc7Smrj UINT32 BigEndianId; 834ae115bc7Smrj UINT32 Prefix[3]; 835db2bae30SDana Myers UINT32 i; 836ae115bc7Smrj 837ae115bc7Smrj 838*385cc6b4SJerry Jelinek switch (Op->Common.AmlOpcode) 839ae115bc7Smrj { 840*385cc6b4SJerry Jelinek case AML_STRING_OP: 841*385cc6b4SJerry Jelinek 842*385cc6b4SJerry Jelinek /* Mark this string as an _HID/_CID string */ 843*385cc6b4SJerry Jelinek 844*385cc6b4SJerry Jelinek Op->Common.DisasmOpcode = ACPI_DASM_HID_STRING; 845*385cc6b4SJerry Jelinek break; 846*385cc6b4SJerry Jelinek 847*385cc6b4SJerry Jelinek case AML_WORD_OP: 848*385cc6b4SJerry Jelinek case AML_DWORD_OP: 849*385cc6b4SJerry Jelinek 850*385cc6b4SJerry Jelinek /* Determine if a Word/Dword is a valid encoded EISAID */ 851ae115bc7Smrj 852ae115bc7Smrj /* Swap from little-endian to big-endian to simplify conversion */ 853ae115bc7Smrj 854db2bae30SDana Myers BigEndianId = AcpiUtDwordByteSwap ((UINT32) Op->Common.Value.Integer); 855ae115bc7Smrj 856ae115bc7Smrj /* Create the 3 leading ASCII letters */ 857ae115bc7Smrj 858ae115bc7Smrj Prefix[0] = ((BigEndianId >> 26) & 0x1F) + 0x40; 859ae115bc7Smrj Prefix[1] = ((BigEndianId >> 21) & 0x1F) + 0x40; 860ae115bc7Smrj Prefix[2] = ((BigEndianId >> 16) & 0x1F) + 0x40; 861ae115bc7Smrj 862ae115bc7Smrj /* Verify that all 3 are ascii and alpha */ 863ae115bc7Smrj 864ae115bc7Smrj for (i = 0; i < 3; i++) 865ae115bc7Smrj { 866ae115bc7Smrj if (!ACPI_IS_ASCII (Prefix[i]) || 867*385cc6b4SJerry Jelinek !isalpha (Prefix[i])) 868ae115bc7Smrj { 869ae115bc7Smrj return; 870ae115bc7Smrj } 871ae115bc7Smrj } 872ae115bc7Smrj 873*385cc6b4SJerry Jelinek /* Mark this node as convertable to an EISA ID string */ 874ae115bc7Smrj 875db2bae30SDana Myers Op->Common.DisasmOpcode = ACPI_DASM_EISAID; 876*385cc6b4SJerry Jelinek break; 877*385cc6b4SJerry Jelinek 878*385cc6b4SJerry Jelinek default: 879*385cc6b4SJerry Jelinek break; 880*385cc6b4SJerry Jelinek } 881db2bae30SDana Myers } 882db2bae30SDana Myers 883db2bae30SDana Myers 884db2bae30SDana Myers /******************************************************************************* 885db2bae30SDana Myers * 886*385cc6b4SJerry Jelinek * FUNCTION: AcpiDmCheckForHardwareId 887db2bae30SDana Myers * 888db2bae30SDana Myers * PARAMETERS: Op - Op to be examined 889db2bae30SDana Myers * 890db2bae30SDana Myers * RETURN: None 891db2bae30SDana Myers * 892*385cc6b4SJerry Jelinek * DESCRIPTION: Determine if a Name() Op is a _HID/_CID. 893db2bae30SDana Myers * 894db2bae30SDana Myers ******************************************************************************/ 895db2bae30SDana Myers 896db2bae30SDana Myers void 897*385cc6b4SJerry Jelinek AcpiDmCheckForHardwareId ( 898db2bae30SDana Myers ACPI_PARSE_OBJECT *Op) 899db2bae30SDana Myers { 900db2bae30SDana Myers UINT32 Name; 901db2bae30SDana Myers ACPI_PARSE_OBJECT *NextOp; 902db2bae30SDana Myers 903db2bae30SDana Myers 904db2bae30SDana Myers /* Get the NameSegment */ 905db2bae30SDana Myers 906db2bae30SDana Myers Name = AcpiPsGetName (Op); 907db2bae30SDana Myers if (!Name) 908db2bae30SDana Myers { 909db2bae30SDana Myers return; 910db2bae30SDana Myers } 911db2bae30SDana Myers 912db2bae30SDana Myers NextOp = AcpiPsGetDepthNext (NULL, Op); 913db2bae30SDana Myers if (!NextOp) 914db2bae30SDana Myers { 915db2bae30SDana Myers return; 916db2bae30SDana Myers } 917db2bae30SDana Myers 918db2bae30SDana Myers /* Check for _HID - has one argument */ 919db2bae30SDana Myers 920db2bae30SDana Myers if (ACPI_COMPARE_NAME (&Name, METHOD_NAME__HID)) 921db2bae30SDana Myers { 922*385cc6b4SJerry Jelinek AcpiDmGetHardwareIdType (NextOp); 923db2bae30SDana Myers return; 924db2bae30SDana Myers } 925db2bae30SDana Myers 926db2bae30SDana Myers /* Exit if not _CID */ 927db2bae30SDana Myers 928db2bae30SDana Myers if (!ACPI_COMPARE_NAME (&Name, METHOD_NAME__CID)) 929db2bae30SDana Myers { 930db2bae30SDana Myers return; 931db2bae30SDana Myers } 932db2bae30SDana Myers 933db2bae30SDana Myers /* _CID can contain a single argument or a package */ 934db2bae30SDana Myers 935db2bae30SDana Myers if (NextOp->Common.AmlOpcode != AML_PACKAGE_OP) 936db2bae30SDana Myers { 937*385cc6b4SJerry Jelinek AcpiDmGetHardwareIdType (NextOp); 938db2bae30SDana Myers return; 939db2bae30SDana Myers } 940db2bae30SDana Myers 941*385cc6b4SJerry Jelinek /* _CID with Package: get the package length, check all elements */ 942db2bae30SDana Myers 943db2bae30SDana Myers NextOp = AcpiPsGetDepthNext (NULL, NextOp); 944*385cc6b4SJerry Jelinek if (!NextOp) 945*385cc6b4SJerry Jelinek { 946*385cc6b4SJerry Jelinek return; 947*385cc6b4SJerry Jelinek } 948db2bae30SDana Myers 949db2bae30SDana Myers /* Don't need to use the length, just walk the peer list */ 950db2bae30SDana Myers 951db2bae30SDana Myers NextOp = NextOp->Common.Next; 952db2bae30SDana Myers while (NextOp) 953db2bae30SDana Myers { 954*385cc6b4SJerry Jelinek AcpiDmGetHardwareIdType (NextOp); 955db2bae30SDana Myers NextOp = NextOp->Common.Next; 956db2bae30SDana Myers } 957ae115bc7Smrj } 958ae115bc7Smrj 959ae115bc7Smrj 960ae115bc7Smrj /******************************************************************************* 961ae115bc7Smrj * 962*385cc6b4SJerry Jelinek * FUNCTION: AcpiDmDecompressEisaId 963ae115bc7Smrj * 964ae115bc7Smrj * PARAMETERS: EncodedId - Raw encoded EISA ID. 965ae115bc7Smrj * 966ae115bc7Smrj * RETURN: None 967ae115bc7Smrj * 968*385cc6b4SJerry Jelinek * DESCRIPTION: Convert an encoded EISAID back to the original ASCII String 969*385cc6b4SJerry Jelinek * and emit the correct ASL statement. If the ID is known, emit 970*385cc6b4SJerry Jelinek * a description of the ID as a comment. 971ae115bc7Smrj * 972ae115bc7Smrj ******************************************************************************/ 973ae115bc7Smrj 974ae115bc7Smrj void 975*385cc6b4SJerry Jelinek AcpiDmDecompressEisaId ( 976ae115bc7Smrj UINT32 EncodedId) 977ae115bc7Smrj { 978*385cc6b4SJerry Jelinek char IdBuffer[ACPI_EISAID_STRING_SIZE]; 979*385cc6b4SJerry Jelinek const AH_DEVICE_ID *Info; 980ae115bc7Smrj 981ae115bc7Smrj 982*385cc6b4SJerry Jelinek /* Convert EISAID to a string an emit the statement */ 983ae115bc7Smrj 984*385cc6b4SJerry Jelinek AcpiExEisaIdToString (IdBuffer, EncodedId); 985*385cc6b4SJerry Jelinek AcpiOsPrintf ("EisaId (\"%s\")", IdBuffer); 986ae115bc7Smrj 987*385cc6b4SJerry Jelinek /* If we know about the ID, emit the description */ 988ae115bc7Smrj 989*385cc6b4SJerry Jelinek Info = AcpiAhMatchHardwareId (IdBuffer); 990*385cc6b4SJerry Jelinek if (Info) 991*385cc6b4SJerry Jelinek { 992*385cc6b4SJerry Jelinek AcpiOsPrintf (" /* %s */", Info->Description); 993ae115bc7Smrj } 994*385cc6b4SJerry Jelinek } 995