153289f6aSNate Lawson /****************************************************************************** 253289f6aSNate Lawson * 353289f6aSNate Lawson * Module Name: aslopcode - AML opcode generation 453289f6aSNate Lawson * 553289f6aSNate Lawson *****************************************************************************/ 653289f6aSNate Lawson 7d244b227SJung-uk Kim /* 8*1c0e1b6dSJung-uk Kim * Copyright (C) 2000 - 2015, Intel Corp. 953289f6aSNate Lawson * All rights reserved. 1053289f6aSNate Lawson * 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. 2553289f6aSNate Lawson * 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. 2953289f6aSNate Lawson * 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 */ 4353289f6aSNate Lawson 44ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 4553289f6aSNate Lawson #include "aslcompiler.y.h" 46ab6f3bf9SJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 4753289f6aSNate Lawson 4853289f6aSNate Lawson #define _COMPONENT ACPI_COMPILER 4953289f6aSNate Lawson ACPI_MODULE_NAME ("aslopcodes") 5053289f6aSNate Lawson 5153289f6aSNate Lawson 52fba7fc7eSJung-uk Kim /* Local prototypes */ 53fba7fc7eSJung-uk Kim 54fba7fc7eSJung-uk Kim static void 55fba7fc7eSJung-uk Kim OpcDoAccessAs ( 56fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op); 57fba7fc7eSJung-uk Kim 58fba7fc7eSJung-uk Kim static void 593f0275a0SJung-uk Kim OpcDoConnection ( 603f0275a0SJung-uk Kim ACPI_PARSE_OBJECT *Op); 613f0275a0SJung-uk Kim 623f0275a0SJung-uk Kim static void 63fba7fc7eSJung-uk Kim OpcDoUnicode ( 64fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op); 65fba7fc7eSJung-uk Kim 66fba7fc7eSJung-uk Kim static void 67fba7fc7eSJung-uk Kim OpcDoEisaId ( 68fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op); 69fba7fc7eSJung-uk Kim 70fba7fc7eSJung-uk Kim static void 71*1c0e1b6dSJung-uk Kim OpcDoPld ( 72*1c0e1b6dSJung-uk Kim ACPI_PARSE_OBJECT *Op); 73*1c0e1b6dSJung-uk Kim 74*1c0e1b6dSJung-uk Kim static void 75fba7fc7eSJung-uk Kim OpcDoUuId ( 76fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op); 77fba7fc7eSJung-uk Kim 78*1c0e1b6dSJung-uk Kim static UINT8 * 79*1c0e1b6dSJung-uk Kim OpcEncodePldBuffer ( 80*1c0e1b6dSJung-uk Kim ACPI_PLD_INFO *PldInfo); 81*1c0e1b6dSJung-uk Kim 82*1c0e1b6dSJung-uk Kim 83*1c0e1b6dSJung-uk Kim /* ToPld strings */ 84*1c0e1b6dSJung-uk Kim 85*1c0e1b6dSJung-uk Kim static char *AslPldPanelList[] = 86*1c0e1b6dSJung-uk Kim { 87*1c0e1b6dSJung-uk Kim "TOP", 88*1c0e1b6dSJung-uk Kim "BOTTOM", 89*1c0e1b6dSJung-uk Kim "LEFT", 90*1c0e1b6dSJung-uk Kim "RIGHT", 91*1c0e1b6dSJung-uk Kim "FRONT", 92*1c0e1b6dSJung-uk Kim "BACK", 93*1c0e1b6dSJung-uk Kim "UNKNOWN", 94*1c0e1b6dSJung-uk Kim NULL 95*1c0e1b6dSJung-uk Kim }; 96*1c0e1b6dSJung-uk Kim 97*1c0e1b6dSJung-uk Kim static char *AslPldVerticalPositionList[] = 98*1c0e1b6dSJung-uk Kim { 99*1c0e1b6dSJung-uk Kim "UPPER", 100*1c0e1b6dSJung-uk Kim "CENTER", 101*1c0e1b6dSJung-uk Kim "LOWER", 102*1c0e1b6dSJung-uk Kim NULL 103*1c0e1b6dSJung-uk Kim }; 104*1c0e1b6dSJung-uk Kim 105*1c0e1b6dSJung-uk Kim static char *AslPldHorizontalPositionList[] = 106*1c0e1b6dSJung-uk Kim { 107*1c0e1b6dSJung-uk Kim "LEFT", 108*1c0e1b6dSJung-uk Kim "CENTER", 109*1c0e1b6dSJung-uk Kim "RIGHT", 110*1c0e1b6dSJung-uk Kim NULL 111*1c0e1b6dSJung-uk Kim }; 112*1c0e1b6dSJung-uk Kim 113*1c0e1b6dSJung-uk Kim static char *AslPldShapeList[] = 114*1c0e1b6dSJung-uk Kim { 115*1c0e1b6dSJung-uk Kim "ROUND", 116*1c0e1b6dSJung-uk Kim "OVAL", 117*1c0e1b6dSJung-uk Kim "SQUARE", 118*1c0e1b6dSJung-uk Kim "VERTICALRECTANGLE", 119*1c0e1b6dSJung-uk Kim "HORIZONTALRECTANGLE", 120*1c0e1b6dSJung-uk Kim "VERTICALTRAPEZOID", 121*1c0e1b6dSJung-uk Kim "HORIZONTALTRAPEZOID", 122*1c0e1b6dSJung-uk Kim "UNKNOWN", 123*1c0e1b6dSJung-uk Kim "CHAMFERED", 124*1c0e1b6dSJung-uk Kim NULL 125*1c0e1b6dSJung-uk Kim }; 126*1c0e1b6dSJung-uk Kim 127fba7fc7eSJung-uk Kim 128fba7fc7eSJung-uk Kim /******************************************************************************* 129fba7fc7eSJung-uk Kim * 130fba7fc7eSJung-uk Kim * FUNCTION: OpcAmlOpcodeUpdateWalk 131fba7fc7eSJung-uk Kim * 132fba7fc7eSJung-uk Kim * PARAMETERS: ASL_WALK_CALLBACK 133fba7fc7eSJung-uk Kim * 134fba7fc7eSJung-uk Kim * RETURN: Status 135fba7fc7eSJung-uk Kim * 136fba7fc7eSJung-uk Kim * DESCRIPTION: Opcode update walk, ascending callback 137fba7fc7eSJung-uk Kim * 138fba7fc7eSJung-uk Kim ******************************************************************************/ 139fba7fc7eSJung-uk Kim 140fba7fc7eSJung-uk Kim ACPI_STATUS 141fba7fc7eSJung-uk Kim OpcAmlOpcodeUpdateWalk ( 142fba7fc7eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 143fba7fc7eSJung-uk Kim UINT32 Level, 144fba7fc7eSJung-uk Kim void *Context) 145fba7fc7eSJung-uk Kim { 146fba7fc7eSJung-uk Kim 147fba7fc7eSJung-uk Kim /* 148fba7fc7eSJung-uk Kim * Handle the Package() case where the actual opcode cannot be determined 149fba7fc7eSJung-uk Kim * until the PackageLength operand has been folded and minimized. 150fba7fc7eSJung-uk Kim * (PackageOp versus VarPackageOp) 151fba7fc7eSJung-uk Kim * 152fba7fc7eSJung-uk Kim * This is (as of ACPI 3.0) the only case where the AML opcode can change 153fba7fc7eSJung-uk Kim * based upon the value of a parameter. 154fba7fc7eSJung-uk Kim * 155fba7fc7eSJung-uk Kim * The parser always inserts a VarPackage opcode, which can possibly be 156fba7fc7eSJung-uk Kim * optimized to a Package opcode. 157fba7fc7eSJung-uk Kim */ 158fba7fc7eSJung-uk Kim if (Op->Asl.ParseOpcode == PARSEOP_VAR_PACKAGE) 159fba7fc7eSJung-uk Kim { 160fba7fc7eSJung-uk Kim OpnDoPackage (Op); 161fba7fc7eSJung-uk Kim } 162fba7fc7eSJung-uk Kim 163fba7fc7eSJung-uk Kim return (AE_OK); 164fba7fc7eSJung-uk Kim } 165fba7fc7eSJung-uk Kim 166fba7fc7eSJung-uk Kim 16753289f6aSNate Lawson /******************************************************************************* 16853289f6aSNate Lawson * 16953289f6aSNate Lawson * FUNCTION: OpcAmlOpcodeWalk 17053289f6aSNate Lawson * 17153289f6aSNate Lawson * PARAMETERS: ASL_WALK_CALLBACK 17253289f6aSNate Lawson * 17353289f6aSNate Lawson * RETURN: Status 17453289f6aSNate Lawson * 17553289f6aSNate Lawson * DESCRIPTION: Parse tree walk to generate both the AML opcodes and the AML 17653289f6aSNate Lawson * operands. 17753289f6aSNate Lawson * 17853289f6aSNate Lawson ******************************************************************************/ 17953289f6aSNate Lawson 18053289f6aSNate Lawson ACPI_STATUS 18153289f6aSNate Lawson OpcAmlOpcodeWalk ( 18253289f6aSNate Lawson ACPI_PARSE_OBJECT *Op, 18353289f6aSNate Lawson UINT32 Level, 18453289f6aSNate Lawson void *Context) 18553289f6aSNate Lawson { 18653289f6aSNate Lawson 18753289f6aSNate Lawson TotalParseNodes++; 18853289f6aSNate Lawson 18953289f6aSNate Lawson OpcGenerateAmlOpcode (Op); 19053289f6aSNate Lawson OpnGenerateAmlOperands (Op); 19153289f6aSNate Lawson return (AE_OK); 19253289f6aSNate Lawson } 19353289f6aSNate Lawson 19453289f6aSNate Lawson 19553289f6aSNate Lawson /******************************************************************************* 19653289f6aSNate Lawson * 19753289f6aSNate Lawson * FUNCTION: OpcGetIntegerWidth 19853289f6aSNate Lawson * 19953289f6aSNate Lawson * PARAMETERS: Op - DEFINITION BLOCK op 20053289f6aSNate Lawson * 20153289f6aSNate Lawson * RETURN: none 20253289f6aSNate Lawson * 20353289f6aSNate Lawson * DESCRIPTION: Extract integer width from the table revision 20453289f6aSNate Lawson * 20553289f6aSNate Lawson ******************************************************************************/ 20653289f6aSNate Lawson 20753289f6aSNate Lawson void 20853289f6aSNate Lawson OpcGetIntegerWidth ( 20953289f6aSNate Lawson ACPI_PARSE_OBJECT *Op) 21053289f6aSNate Lawson { 21153289f6aSNate Lawson ACPI_PARSE_OBJECT *Child; 21253289f6aSNate Lawson 213fba7fc7eSJung-uk Kim 21453289f6aSNate Lawson if (!Op) 21553289f6aSNate Lawson { 21653289f6aSNate Lawson return; 21753289f6aSNate Lawson } 21853289f6aSNate Lawson 219fba7fc7eSJung-uk Kim if (Gbl_RevisionOverride) 220fba7fc7eSJung-uk Kim { 221fba7fc7eSJung-uk Kim AcpiUtSetIntegerWidth (Gbl_RevisionOverride); 222fba7fc7eSJung-uk Kim } 223fba7fc7eSJung-uk Kim else 224fba7fc7eSJung-uk Kim { 22553289f6aSNate Lawson Child = Op->Asl.Child; 22653289f6aSNate Lawson Child = Child->Asl.Next; 22753289f6aSNate Lawson Child = Child->Asl.Next; 22853289f6aSNate Lawson 22953289f6aSNate Lawson /* Use the revision to set the integer width */ 23053289f6aSNate Lawson 23153289f6aSNate Lawson AcpiUtSetIntegerWidth ((UINT8) Child->Asl.Value.Integer); 23253289f6aSNate Lawson } 233fba7fc7eSJung-uk Kim } 23453289f6aSNate Lawson 23553289f6aSNate Lawson 23653289f6aSNate Lawson /******************************************************************************* 23753289f6aSNate Lawson * 23853289f6aSNate Lawson * FUNCTION: OpcSetOptimalIntegerSize 23953289f6aSNate Lawson * 24053289f6aSNate Lawson * PARAMETERS: Op - A parse tree node 24153289f6aSNate Lawson * 24253289f6aSNate Lawson * RETURN: Integer width, in bytes. Also sets the node AML opcode to the 24353289f6aSNate Lawson * optimal integer AML prefix opcode. 24453289f6aSNate Lawson * 24553289f6aSNate Lawson * DESCRIPTION: Determine the optimal AML encoding of an integer. All leading 24653289f6aSNate Lawson * zeros can be truncated to squeeze the integer into the 24753289f6aSNate Lawson * minimal number of AML bytes. 24853289f6aSNate Lawson * 24953289f6aSNate Lawson ******************************************************************************/ 25053289f6aSNate Lawson 25153289f6aSNate Lawson UINT32 25253289f6aSNate Lawson OpcSetOptimalIntegerSize ( 25353289f6aSNate Lawson ACPI_PARSE_OBJECT *Op) 25453289f6aSNate Lawson { 25553289f6aSNate Lawson 256fba7fc7eSJung-uk Kim #if 0 25753289f6aSNate Lawson /* 258fba7fc7eSJung-uk Kim * TBD: - we don't want to optimize integers in the block header, but the 259fba7fc7eSJung-uk Kim * code below does not work correctly. 260fba7fc7eSJung-uk Kim */ 261c8466860SMark Santcroos if (Op->Asl.Parent && 262c8466860SMark Santcroos Op->Asl.Parent->Asl.Parent && 263c8466860SMark Santcroos (Op->Asl.Parent->Asl.Parent->Asl.ParseOpcode == PARSEOP_DEFINITIONBLOCK)) 264c8466860SMark Santcroos { 2658ef1a331SJung-uk Kim return (0); 266c8466860SMark Santcroos } 267fba7fc7eSJung-uk Kim #endif 268c8466860SMark Santcroos 269c8466860SMark Santcroos /* 27053289f6aSNate Lawson * Check for the special AML integers first - Zero, One, Ones. 27153289f6aSNate Lawson * These are single-byte opcodes that are the smallest possible 27253289f6aSNate Lawson * representation of an integer. 27353289f6aSNate Lawson * 27453289f6aSNate Lawson * This optimization is optional. 27553289f6aSNate Lawson */ 27653289f6aSNate Lawson if (Gbl_IntegerOptimizationFlag) 27753289f6aSNate Lawson { 27853289f6aSNate Lawson switch (Op->Asl.Value.Integer) 27953289f6aSNate Lawson { 28053289f6aSNate Lawson case 0: 28153289f6aSNate Lawson 28253289f6aSNate Lawson Op->Asl.AmlOpcode = AML_ZERO_OP; 283fba7fc7eSJung-uk Kim AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION, 284fba7fc7eSJung-uk Kim Op, "Zero"); 2858ef1a331SJung-uk Kim return (1); 28653289f6aSNate Lawson 28753289f6aSNate Lawson case 1: 28853289f6aSNate Lawson 28953289f6aSNate Lawson Op->Asl.AmlOpcode = AML_ONE_OP; 290fba7fc7eSJung-uk Kim AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION, 291fba7fc7eSJung-uk Kim Op, "One"); 2928ef1a331SJung-uk Kim return (1); 29353289f6aSNate Lawson 29453289f6aSNate Lawson case ACPI_UINT32_MAX: 29553289f6aSNate Lawson 29653289f6aSNate Lawson /* Check for table integer width (32 or 64) */ 29753289f6aSNate Lawson 29853289f6aSNate Lawson if (AcpiGbl_IntegerByteWidth == 4) 29953289f6aSNate Lawson { 30053289f6aSNate Lawson Op->Asl.AmlOpcode = AML_ONES_OP; 301fba7fc7eSJung-uk Kim AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION, 302fba7fc7eSJung-uk Kim Op, "Ones"); 3038ef1a331SJung-uk Kim return (1); 30453289f6aSNate Lawson } 30553289f6aSNate Lawson break; 30653289f6aSNate Lawson 3079a179dd8SJung-uk Kim case ACPI_UINT64_MAX: 30853289f6aSNate Lawson 30953289f6aSNate Lawson /* Check for table integer width (32 or 64) */ 31053289f6aSNate Lawson 31153289f6aSNate Lawson if (AcpiGbl_IntegerByteWidth == 8) 31253289f6aSNate Lawson { 31353289f6aSNate Lawson Op->Asl.AmlOpcode = AML_ONES_OP; 314fba7fc7eSJung-uk Kim AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION, 315fba7fc7eSJung-uk Kim Op, "Ones"); 3168ef1a331SJung-uk Kim return (1); 31753289f6aSNate Lawson } 31853289f6aSNate Lawson break; 31953289f6aSNate Lawson 32053289f6aSNate Lawson default: 321a9d8d09cSJung-uk Kim 32253289f6aSNate Lawson break; 32353289f6aSNate Lawson } 32453289f6aSNate Lawson } 32553289f6aSNate Lawson 32653289f6aSNate Lawson /* Find the best fit using the various AML integer prefixes */ 32753289f6aSNate Lawson 32853289f6aSNate Lawson if (Op->Asl.Value.Integer <= ACPI_UINT8_MAX) 32953289f6aSNate Lawson { 33053289f6aSNate Lawson Op->Asl.AmlOpcode = AML_BYTE_OP; 3318ef1a331SJung-uk Kim return (1); 33253289f6aSNate Lawson } 33353289f6aSNate Lawson if (Op->Asl.Value.Integer <= ACPI_UINT16_MAX) 33453289f6aSNate Lawson { 33553289f6aSNate Lawson Op->Asl.AmlOpcode = AML_WORD_OP; 3368ef1a331SJung-uk Kim return (2); 33753289f6aSNate Lawson } 33853289f6aSNate Lawson if (Op->Asl.Value.Integer <= ACPI_UINT32_MAX) 33953289f6aSNate Lawson { 34053289f6aSNate Lawson Op->Asl.AmlOpcode = AML_DWORD_OP; 3418ef1a331SJung-uk Kim return (4); 34253289f6aSNate Lawson } 34353289f6aSNate Lawson else 34453289f6aSNate Lawson { 345fba7fc7eSJung-uk Kim if (AcpiGbl_IntegerByteWidth == 4) 346fba7fc7eSJung-uk Kim { 347fba7fc7eSJung-uk Kim AslError (ASL_WARNING, ASL_MSG_INTEGER_LENGTH, 348fba7fc7eSJung-uk Kim Op, NULL); 349fba7fc7eSJung-uk Kim 350fba7fc7eSJung-uk Kim if (!Gbl_IgnoreErrors) 351fba7fc7eSJung-uk Kim { 352fba7fc7eSJung-uk Kim /* Truncate the integer to 32-bit */ 353fba7fc7eSJung-uk Kim Op->Asl.AmlOpcode = AML_DWORD_OP; 3548ef1a331SJung-uk Kim return (4); 355fba7fc7eSJung-uk Kim } 356fba7fc7eSJung-uk Kim } 357fba7fc7eSJung-uk Kim 35853289f6aSNate Lawson Op->Asl.AmlOpcode = AML_QWORD_OP; 3598ef1a331SJung-uk Kim return (8); 36053289f6aSNate Lawson } 36153289f6aSNate Lawson } 36253289f6aSNate Lawson 36353289f6aSNate Lawson 36453289f6aSNate Lawson /******************************************************************************* 36553289f6aSNate Lawson * 36653289f6aSNate Lawson * FUNCTION: OpcDoAccessAs 36753289f6aSNate Lawson * 36853289f6aSNate Lawson * PARAMETERS: Op - Parse node 36953289f6aSNate Lawson * 37053289f6aSNate Lawson * RETURN: None 37153289f6aSNate Lawson * 37253289f6aSNate Lawson * DESCRIPTION: Implement the ACCESS_AS ASL keyword. 37353289f6aSNate Lawson * 37453289f6aSNate Lawson ******************************************************************************/ 37553289f6aSNate Lawson 376fba7fc7eSJung-uk Kim static void 37753289f6aSNate Lawson OpcDoAccessAs ( 37853289f6aSNate Lawson ACPI_PARSE_OBJECT *Op) 37953289f6aSNate Lawson { 3803f0275a0SJung-uk Kim ACPI_PARSE_OBJECT *TypeOp; 3813f0275a0SJung-uk Kim ACPI_PARSE_OBJECT *AttribOp; 3823f0275a0SJung-uk Kim ACPI_PARSE_OBJECT *LengthOp; 3833f0275a0SJung-uk Kim UINT8 Attribute; 38453289f6aSNate Lawson 38553289f6aSNate Lawson 38653289f6aSNate Lawson Op->Asl.AmlOpcodeLength = 1; 3873f0275a0SJung-uk Kim TypeOp = Op->Asl.Child; 38853289f6aSNate Lawson 38953289f6aSNate Lawson /* First child is the access type */ 39053289f6aSNate Lawson 3913f0275a0SJung-uk Kim TypeOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE; 3923f0275a0SJung-uk Kim TypeOp->Asl.ParseOpcode = PARSEOP_RAW_DATA; 39353289f6aSNate Lawson 39453289f6aSNate Lawson /* Second child is the optional access attribute */ 39553289f6aSNate Lawson 3963f0275a0SJung-uk Kim AttribOp = TypeOp->Asl.Next; 3973f0275a0SJung-uk Kim if (AttribOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) 39853289f6aSNate Lawson { 3993f0275a0SJung-uk Kim AttribOp->Asl.Value.Integer = 0; 40053289f6aSNate Lawson } 4013f0275a0SJung-uk Kim AttribOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE; 4023f0275a0SJung-uk Kim AttribOp->Asl.ParseOpcode = PARSEOP_RAW_DATA; 4033f0275a0SJung-uk Kim 4043f0275a0SJung-uk Kim /* Only a few AccessAttributes support AccessLength */ 4053f0275a0SJung-uk Kim 4063f0275a0SJung-uk Kim Attribute = (UINT8) AttribOp->Asl.Value.Integer; 4073f0275a0SJung-uk Kim if ((Attribute != AML_FIELD_ATTRIB_MULTIBYTE) && 4083f0275a0SJung-uk Kim (Attribute != AML_FIELD_ATTRIB_RAW_BYTES) && 4093f0275a0SJung-uk Kim (Attribute != AML_FIELD_ATTRIB_RAW_PROCESS)) 4103f0275a0SJung-uk Kim { 4113f0275a0SJung-uk Kim return; 4123f0275a0SJung-uk Kim } 4133f0275a0SJung-uk Kim 4143f0275a0SJung-uk Kim Op->Asl.AmlOpcode = AML_FIELD_EXT_ACCESS_OP; 4153f0275a0SJung-uk Kim 4163f0275a0SJung-uk Kim /* 4173f0275a0SJung-uk Kim * Child of Attributes is the AccessLength (required for Multibyte, 4183f0275a0SJung-uk Kim * RawBytes, RawProcess.) 4193f0275a0SJung-uk Kim */ 4203f0275a0SJung-uk Kim LengthOp = AttribOp->Asl.Child; 4213f0275a0SJung-uk Kim if (!LengthOp) 4223f0275a0SJung-uk Kim { 4233f0275a0SJung-uk Kim return; 4243f0275a0SJung-uk Kim } 4253f0275a0SJung-uk Kim 4263f0275a0SJung-uk Kim /* TBD: probably can remove */ 4273f0275a0SJung-uk Kim 4283f0275a0SJung-uk Kim if (LengthOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) 4293f0275a0SJung-uk Kim { 4303f0275a0SJung-uk Kim LengthOp->Asl.Value.Integer = 16; 4313f0275a0SJung-uk Kim } 4323f0275a0SJung-uk Kim 4333f0275a0SJung-uk Kim LengthOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE; 4343f0275a0SJung-uk Kim LengthOp->Asl.ParseOpcode = PARSEOP_RAW_DATA; 4353f0275a0SJung-uk Kim } 4363f0275a0SJung-uk Kim 4373f0275a0SJung-uk Kim 4383f0275a0SJung-uk Kim /******************************************************************************* 4393f0275a0SJung-uk Kim * 4403f0275a0SJung-uk Kim * FUNCTION: OpcDoConnection 4413f0275a0SJung-uk Kim * 4423f0275a0SJung-uk Kim * PARAMETERS: Op - Parse node 4433f0275a0SJung-uk Kim * 4443f0275a0SJung-uk Kim * RETURN: None 4453f0275a0SJung-uk Kim * 4463f0275a0SJung-uk Kim * DESCRIPTION: Implement the Connection ASL keyword. 4473f0275a0SJung-uk Kim * 4483f0275a0SJung-uk Kim ******************************************************************************/ 4493f0275a0SJung-uk Kim 4503f0275a0SJung-uk Kim static void 4513f0275a0SJung-uk Kim OpcDoConnection ( 4523f0275a0SJung-uk Kim ACPI_PARSE_OBJECT *Op) 4533f0275a0SJung-uk Kim { 4543f0275a0SJung-uk Kim ASL_RESOURCE_NODE *Rnode; 4553f0275a0SJung-uk Kim ACPI_PARSE_OBJECT *BufferOp; 4563f0275a0SJung-uk Kim ACPI_PARSE_OBJECT *BufferLengthOp; 4573f0275a0SJung-uk Kim ACPI_PARSE_OBJECT *BufferDataOp; 458313a0c13SJung-uk Kim ASL_RESOURCE_INFO Info; 4593f0275a0SJung-uk Kim UINT8 State; 4603f0275a0SJung-uk Kim 4613f0275a0SJung-uk Kim 4623f0275a0SJung-uk Kim Op->Asl.AmlOpcodeLength = 1; 4633f0275a0SJung-uk Kim 4643f0275a0SJung-uk Kim if (Op->Asl.Child->Asl.AmlOpcode == AML_INT_NAMEPATH_OP) 4653f0275a0SJung-uk Kim { 4663f0275a0SJung-uk Kim return; 4673f0275a0SJung-uk Kim } 4683f0275a0SJung-uk Kim 4693f0275a0SJung-uk Kim BufferOp = Op->Asl.Child; 4703f0275a0SJung-uk Kim BufferLengthOp = BufferOp->Asl.Child; 4713f0275a0SJung-uk Kim BufferDataOp = BufferLengthOp->Asl.Next; 4723f0275a0SJung-uk Kim 473313a0c13SJung-uk Kim Info.DescriptorTypeOp = BufferDataOp->Asl.Next; 474313a0c13SJung-uk Kim Info.CurrentByteOffset = 0; 4753f0275a0SJung-uk Kim State = ACPI_RSTATE_NORMAL; 476313a0c13SJung-uk Kim Rnode = RsDoOneResourceDescriptor (&Info, &State); 4773f0275a0SJung-uk Kim if (!Rnode) 4783f0275a0SJung-uk Kim { 4793f0275a0SJung-uk Kim return; /* error */ 4803f0275a0SJung-uk Kim } 4813f0275a0SJung-uk Kim 4823f0275a0SJung-uk Kim /* 4833f0275a0SJung-uk Kim * Transform the nodes into the following 4843f0275a0SJung-uk Kim * 4853f0275a0SJung-uk Kim * Op -> AML_BUFFER_OP 4863f0275a0SJung-uk Kim * First Child -> BufferLength 4873f0275a0SJung-uk Kim * Second Child -> Descriptor Buffer (raw byte data) 4883f0275a0SJung-uk Kim */ 4893f0275a0SJung-uk Kim BufferOp->Asl.ParseOpcode = PARSEOP_BUFFER; 4903f0275a0SJung-uk Kim BufferOp->Asl.AmlOpcode = AML_BUFFER_OP; 4913f0275a0SJung-uk Kim BufferOp->Asl.CompileFlags = NODE_AML_PACKAGE | NODE_IS_RESOURCE_DESC; 4923f0275a0SJung-uk Kim UtSetParseOpName (BufferOp); 4933f0275a0SJung-uk Kim 4943f0275a0SJung-uk Kim BufferLengthOp->Asl.ParseOpcode = PARSEOP_INTEGER; 4953f0275a0SJung-uk Kim BufferLengthOp->Asl.Value.Integer = Rnode->BufferLength; 4963f0275a0SJung-uk Kim (void) OpcSetOptimalIntegerSize (BufferLengthOp); 4973f0275a0SJung-uk Kim UtSetParseOpName (BufferLengthOp); 4983f0275a0SJung-uk Kim 4993f0275a0SJung-uk Kim BufferDataOp->Asl.ParseOpcode = PARSEOP_RAW_DATA; 5003f0275a0SJung-uk Kim BufferDataOp->Asl.AmlOpcode = AML_RAW_DATA_CHAIN; 5013f0275a0SJung-uk Kim BufferDataOp->Asl.AmlOpcodeLength = 0; 5023f0275a0SJung-uk Kim BufferDataOp->Asl.AmlLength = Rnode->BufferLength; 5033f0275a0SJung-uk Kim BufferDataOp->Asl.Value.Buffer = (UINT8 *) Rnode; 5043f0275a0SJung-uk Kim UtSetParseOpName (BufferDataOp); 50553289f6aSNate Lawson } 50653289f6aSNate Lawson 50753289f6aSNate Lawson 50853289f6aSNate Lawson /******************************************************************************* 50953289f6aSNate Lawson * 51053289f6aSNate Lawson * FUNCTION: OpcDoUnicode 51153289f6aSNate Lawson * 51253289f6aSNate Lawson * PARAMETERS: Op - Parse node 51353289f6aSNate Lawson * 51453289f6aSNate Lawson * RETURN: None 51553289f6aSNate Lawson * 51653289f6aSNate Lawson * DESCRIPTION: Implement the UNICODE ASL "macro". Convert the input string 51753289f6aSNate Lawson * to a unicode buffer. There is no Unicode AML opcode. 51853289f6aSNate Lawson * 51953289f6aSNate Lawson * Note: The Unicode string is 16 bits per character, no leading signature, 52053289f6aSNate Lawson * with a 16-bit terminating NULL. 52153289f6aSNate Lawson * 52253289f6aSNate Lawson ******************************************************************************/ 52353289f6aSNate Lawson 524fba7fc7eSJung-uk Kim static void 52553289f6aSNate Lawson OpcDoUnicode ( 52653289f6aSNate Lawson ACPI_PARSE_OBJECT *Op) 52753289f6aSNate Lawson { 52853289f6aSNate Lawson ACPI_PARSE_OBJECT *InitializerOp; 52953289f6aSNate Lawson UINT32 Length; 53053289f6aSNate Lawson UINT32 Count; 53153289f6aSNate Lawson UINT32 i; 53253289f6aSNate Lawson UINT8 *AsciiString; 53353289f6aSNate Lawson UINT16 *UnicodeString; 53453289f6aSNate Lawson ACPI_PARSE_OBJECT *BufferLengthOp; 53553289f6aSNate Lawson 53653289f6aSNate Lawson 53753289f6aSNate Lawson /* Change op into a buffer object */ 53853289f6aSNate Lawson 53953289f6aSNate Lawson Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST; 54053289f6aSNate Lawson Op->Asl.ParseOpcode = PARSEOP_BUFFER; 54153289f6aSNate Lawson UtSetParseOpName (Op); 54253289f6aSNate Lawson 54353289f6aSNate Lawson /* Buffer Length is first, followed by the string */ 54453289f6aSNate Lawson 54553289f6aSNate Lawson BufferLengthOp = Op->Asl.Child; 54653289f6aSNate Lawson InitializerOp = BufferLengthOp->Asl.Next; 54753289f6aSNate Lawson 54853289f6aSNate Lawson AsciiString = (UINT8 *) InitializerOp->Asl.Value.String; 54953289f6aSNate Lawson 55053289f6aSNate Lawson /* Create a new buffer for the Unicode string */ 55153289f6aSNate Lawson 55253289f6aSNate Lawson Count = strlen (InitializerOp->Asl.Value.String) + 1; 55353289f6aSNate Lawson Length = Count * sizeof (UINT16); 55453289f6aSNate Lawson UnicodeString = UtLocalCalloc (Length); 55553289f6aSNate Lawson 55653289f6aSNate Lawson /* Convert to Unicode string (including null terminator) */ 55753289f6aSNate Lawson 55853289f6aSNate Lawson for (i = 0; i < Count; i++) 55953289f6aSNate Lawson { 56053289f6aSNate Lawson UnicodeString[i] = (UINT16) AsciiString[i]; 56153289f6aSNate Lawson } 56253289f6aSNate Lawson 56353289f6aSNate Lawson /* 56453289f6aSNate Lawson * Just set the buffer size node to be the buffer length, regardless 56553289f6aSNate Lawson * of whether it was previously an integer or a default_arg placeholder 56653289f6aSNate Lawson */ 56753289f6aSNate Lawson BufferLengthOp->Asl.ParseOpcode = PARSEOP_INTEGER; 56853289f6aSNate Lawson BufferLengthOp->Asl.AmlOpcode = AML_DWORD_OP; 56953289f6aSNate Lawson BufferLengthOp->Asl.Value.Integer = Length; 57053289f6aSNate Lawson UtSetParseOpName (BufferLengthOp); 57153289f6aSNate Lawson 57253289f6aSNate Lawson (void) OpcSetOptimalIntegerSize (BufferLengthOp); 57353289f6aSNate Lawson 57453289f6aSNate Lawson /* The Unicode string is a raw data buffer */ 57553289f6aSNate Lawson 57653289f6aSNate Lawson InitializerOp->Asl.Value.Buffer = (UINT8 *) UnicodeString; 57753289f6aSNate Lawson InitializerOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER; 57853289f6aSNate Lawson InitializerOp->Asl.AmlLength = Length; 57953289f6aSNate Lawson InitializerOp->Asl.ParseOpcode = PARSEOP_RAW_DATA; 58053289f6aSNate Lawson InitializerOp->Asl.Child = NULL; 58153289f6aSNate Lawson UtSetParseOpName (InitializerOp); 58253289f6aSNate Lawson } 58353289f6aSNate Lawson 58453289f6aSNate Lawson 58553289f6aSNate Lawson /******************************************************************************* 58653289f6aSNate Lawson * 58753289f6aSNate Lawson * FUNCTION: OpcDoEisaId 58853289f6aSNate Lawson * 58953289f6aSNate Lawson * PARAMETERS: Op - Parse node 59053289f6aSNate Lawson * 59153289f6aSNate Lawson * RETURN: None 59253289f6aSNate Lawson * 59353289f6aSNate Lawson * DESCRIPTION: Convert a string EISA ID to numeric representation. See the 59453289f6aSNate Lawson * Pnp BIOS Specification for details. Here is an excerpt: 59553289f6aSNate Lawson * 59653289f6aSNate Lawson * A seven character ASCII representation of the product 59753289f6aSNate Lawson * identifier compressed into a 32-bit identifier. The seven 59853289f6aSNate Lawson * character ID consists of a three character manufacturer code, 59953289f6aSNate Lawson * a three character hexadecimal product identifier, and a one 60053289f6aSNate Lawson * character hexadecimal revision number. The manufacturer code 60153289f6aSNate Lawson * is a 3 uppercase character code that is compressed into 3 5-bit 60253289f6aSNate Lawson * values as follows: 60353289f6aSNate Lawson * 1) Find hex ASCII value for each letter 60453289f6aSNate Lawson * 2) Subtract 40h from each ASCII value 6058ef1a331SJung-uk Kim * 3) Retain 5 least significant bits for each letter by 60653289f6aSNate Lawson * discarding upper 3 bits because they are always 0. 60753289f6aSNate Lawson * 4) Compressed code = concatenate 0 and the 3 5-bit values 60853289f6aSNate Lawson * 60953289f6aSNate Lawson * The format of the compressed product identifier is as follows: 61053289f6aSNate Lawson * Byte 0: Bit 7 - Reserved (0) 61153289f6aSNate Lawson * Bits 6-2: - 1st character of compressed mfg code 61253289f6aSNate Lawson * Bits 1-0 - Upper 2 bits of 2nd character of mfg code 61353289f6aSNate Lawson * Byte 1: Bits 7-5 - Lower 3 bits of 2nd character of mfg code 61453289f6aSNate Lawson * Bits 4-0 - 3rd character of mfg code 61553289f6aSNate Lawson * Byte 2: Bits 7-4 - 1st hex digit of product number 61653289f6aSNate Lawson * Bits 3-0 - 2nd hex digit of product number 61753289f6aSNate Lawson * Byte 3: Bits 7-4 - 3st hex digit of product number 61853289f6aSNate Lawson * Bits 3-0 - Hex digit of the revision number 61953289f6aSNate Lawson * 62053289f6aSNate Lawson ******************************************************************************/ 62153289f6aSNate Lawson 622fba7fc7eSJung-uk Kim static void 62353289f6aSNate Lawson OpcDoEisaId ( 62453289f6aSNate Lawson ACPI_PARSE_OBJECT *Op) 62553289f6aSNate Lawson { 62653289f6aSNate Lawson UINT32 EisaId = 0; 62753289f6aSNate Lawson UINT32 BigEndianId; 62853289f6aSNate Lawson char *InString; 62953289f6aSNate Lawson ACPI_STATUS Status = AE_OK; 630a9f12690SJung-uk Kim UINT32 i; 63153289f6aSNate Lawson 63253289f6aSNate Lawson 63353289f6aSNate Lawson InString = (char *) Op->Asl.Value.String; 63453289f6aSNate Lawson 63553289f6aSNate Lawson /* 63653289f6aSNate Lawson * The EISAID string must be exactly 7 characters and of the form 637fba7fc7eSJung-uk Kim * "UUUXXXX" -- 3 uppercase letters and 4 hex digits (e.g., "PNP0001") 63853289f6aSNate Lawson */ 63953289f6aSNate Lawson if (ACPI_STRLEN (InString) != 7) 64053289f6aSNate Lawson { 64153289f6aSNate Lawson Status = AE_BAD_PARAMETER; 64253289f6aSNate Lawson } 64353289f6aSNate Lawson else 64453289f6aSNate Lawson { 64553289f6aSNate Lawson /* Check all 7 characters for correct format */ 64653289f6aSNate Lawson 64753289f6aSNate Lawson for (i = 0; i < 7; i++) 64853289f6aSNate Lawson { 649c8466860SMark Santcroos /* First 3 characters must be uppercase letters */ 65053289f6aSNate Lawson 65153289f6aSNate Lawson if (i < 3) 65253289f6aSNate Lawson { 6539a179dd8SJung-uk Kim if (!isupper ((int) InString[i])) 65453289f6aSNate Lawson { 65553289f6aSNate Lawson Status = AE_BAD_PARAMETER; 65653289f6aSNate Lawson } 65753289f6aSNate Lawson } 65853289f6aSNate Lawson 65953289f6aSNate Lawson /* Last 4 characters must be hex digits */ 66053289f6aSNate Lawson 6619a179dd8SJung-uk Kim else if (!isxdigit ((int) InString[i])) 66253289f6aSNate Lawson { 66353289f6aSNate Lawson Status = AE_BAD_PARAMETER; 66453289f6aSNate Lawson } 66553289f6aSNate Lawson } 66653289f6aSNate Lawson } 66753289f6aSNate Lawson 66853289f6aSNate Lawson if (ACPI_FAILURE (Status)) 66953289f6aSNate Lawson { 67053289f6aSNate Lawson AslError (ASL_ERROR, ASL_MSG_INVALID_EISAID, Op, Op->Asl.Value.String); 67153289f6aSNate Lawson } 67253289f6aSNate Lawson else 67353289f6aSNate Lawson { 67453289f6aSNate Lawson /* Create ID big-endian first (bits are contiguous) */ 67553289f6aSNate Lawson 6761a39cfb0SJung-uk Kim BigEndianId = 67742fecd12SJung-uk Kim (UINT32) ((UINT8) (InString[0] - 0x40)) << 26 | 67842fecd12SJung-uk Kim (UINT32) ((UINT8) (InString[1] - 0x40)) << 21 | 67942fecd12SJung-uk Kim (UINT32) ((UINT8) (InString[2] - 0x40)) << 16 | 68053289f6aSNate Lawson 681313a0c13SJung-uk Kim (AcpiUtAsciiCharToHex (InString[3])) << 12 | 682313a0c13SJung-uk Kim (AcpiUtAsciiCharToHex (InString[4])) << 8 | 683313a0c13SJung-uk Kim (AcpiUtAsciiCharToHex (InString[5])) << 4 | 684313a0c13SJung-uk Kim AcpiUtAsciiCharToHex (InString[6]); 68553289f6aSNate Lawson 68653289f6aSNate Lawson /* Swap to little-endian to get final ID (see function header) */ 68753289f6aSNate Lawson 68853289f6aSNate Lawson EisaId = AcpiUtDwordByteSwap (BigEndianId); 68953289f6aSNate Lawson } 69053289f6aSNate Lawson 69153289f6aSNate Lawson /* 69253289f6aSNate Lawson * Morph the Op into an integer, regardless of whether there 69353289f6aSNate Lawson * was an error in the EISAID string 69453289f6aSNate Lawson */ 69553289f6aSNate Lawson Op->Asl.Value.Integer = EisaId; 69653289f6aSNate Lawson 69753289f6aSNate Lawson Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST; 69853289f6aSNate Lawson Op->Asl.ParseOpcode = PARSEOP_INTEGER; 69953289f6aSNate Lawson (void) OpcSetOptimalIntegerSize (Op); 70053289f6aSNate Lawson 70153289f6aSNate Lawson /* Op is now an integer */ 70253289f6aSNate Lawson 70353289f6aSNate Lawson UtSetParseOpName (Op); 70453289f6aSNate Lawson } 70553289f6aSNate Lawson 70653289f6aSNate Lawson 70753289f6aSNate Lawson /******************************************************************************* 70853289f6aSNate Lawson * 709*1c0e1b6dSJung-uk Kim * FUNCTION: OpcEncodePldBuffer 710*1c0e1b6dSJung-uk Kim * 711*1c0e1b6dSJung-uk Kim * PARAMETERS: PldInfo - _PLD buffer struct (Using local struct) 712*1c0e1b6dSJung-uk Kim * 713*1c0e1b6dSJung-uk Kim * RETURN: Encode _PLD buffer suitable for return value from _PLD 714*1c0e1b6dSJung-uk Kim * 715*1c0e1b6dSJung-uk Kim * DESCRIPTION: Bit-packs a _PLD buffer struct. 716*1c0e1b6dSJung-uk Kim * 717*1c0e1b6dSJung-uk Kim ******************************************************************************/ 718*1c0e1b6dSJung-uk Kim 719*1c0e1b6dSJung-uk Kim static UINT8 * 720*1c0e1b6dSJung-uk Kim OpcEncodePldBuffer ( 721*1c0e1b6dSJung-uk Kim ACPI_PLD_INFO *PldInfo) 722*1c0e1b6dSJung-uk Kim { 723*1c0e1b6dSJung-uk Kim UINT32 *Buffer; 724*1c0e1b6dSJung-uk Kim UINT32 Dword; 725*1c0e1b6dSJung-uk Kim 726*1c0e1b6dSJung-uk Kim 727*1c0e1b6dSJung-uk Kim Buffer = ACPI_ALLOCATE_ZEROED (ACPI_PLD_BUFFER_SIZE); 728*1c0e1b6dSJung-uk Kim if (!Buffer) 729*1c0e1b6dSJung-uk Kim { 730*1c0e1b6dSJung-uk Kim return (NULL); 731*1c0e1b6dSJung-uk Kim } 732*1c0e1b6dSJung-uk Kim 733*1c0e1b6dSJung-uk Kim /* First 32 bits */ 734*1c0e1b6dSJung-uk Kim 735*1c0e1b6dSJung-uk Kim Dword = 0; 736*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_REVISION (&Dword, PldInfo->Revision); 737*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_IGNORE_COLOR (&Dword, PldInfo->IgnoreColor); 738*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_RED (&Dword, PldInfo->Red); 739*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_GREEN (&Dword, PldInfo->Green); 740*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_BLUE (&Dword, PldInfo->Blue); 741*1c0e1b6dSJung-uk Kim ACPI_MOVE_32_TO_32 (&Buffer[0], &Dword); 742*1c0e1b6dSJung-uk Kim 743*1c0e1b6dSJung-uk Kim /* Second 32 bits */ 744*1c0e1b6dSJung-uk Kim 745*1c0e1b6dSJung-uk Kim Dword = 0; 746*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_WIDTH (&Dword, PldInfo->Width); 747*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_HEIGHT (&Dword, PldInfo->Height); 748*1c0e1b6dSJung-uk Kim ACPI_MOVE_32_TO_32 (&Buffer[1], &Dword); 749*1c0e1b6dSJung-uk Kim 750*1c0e1b6dSJung-uk Kim /* Third 32 bits */ 751*1c0e1b6dSJung-uk Kim 752*1c0e1b6dSJung-uk Kim Dword = 0; 753*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_USER_VISIBLE (&Dword, PldInfo->UserVisible); 754*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_DOCK (&Dword, PldInfo->Dock); 755*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_LID (&Dword, PldInfo->Lid); 756*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_PANEL (&Dword, PldInfo->Panel); 757*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_VERTICAL (&Dword, PldInfo->VerticalPosition); 758*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_HORIZONTAL (&Dword, PldInfo->HorizontalPosition); 759*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_SHAPE (&Dword, PldInfo->Shape); 760*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_ORIENTATION (&Dword, PldInfo->GroupOrientation); 761*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_TOKEN (&Dword, PldInfo->GroupToken); 762*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_POSITION (&Dword, PldInfo->GroupPosition); 763*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_BAY (&Dword, PldInfo->Bay); 764*1c0e1b6dSJung-uk Kim ACPI_MOVE_32_TO_32 (&Buffer[2], &Dword); 765*1c0e1b6dSJung-uk Kim 766*1c0e1b6dSJung-uk Kim /* Fourth 32 bits */ 767*1c0e1b6dSJung-uk Kim 768*1c0e1b6dSJung-uk Kim Dword = 0; 769*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_EJECTABLE (&Dword, PldInfo->Ejectable); 770*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_OSPM_EJECT (&Dword, PldInfo->OspmEjectRequired); 771*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_CABINET (&Dword, PldInfo->CabinetNumber); 772*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_CARD_CAGE (&Dword, PldInfo->CardCageNumber); 773*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_REFERENCE (&Dword, PldInfo->Reference); 774*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_ROTATION (&Dword, PldInfo->Rotation); 775*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_ORDER (&Dword, PldInfo->Order); 776*1c0e1b6dSJung-uk Kim ACPI_MOVE_32_TO_32 (&Buffer[3], &Dword); 777*1c0e1b6dSJung-uk Kim 778*1c0e1b6dSJung-uk Kim if (PldInfo->Revision >= 2) 779*1c0e1b6dSJung-uk Kim { 780*1c0e1b6dSJung-uk Kim /* Fifth 32 bits */ 781*1c0e1b6dSJung-uk Kim 782*1c0e1b6dSJung-uk Kim Dword = 0; 783*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_VERT_OFFSET (&Dword, PldInfo->VerticalOffset); 784*1c0e1b6dSJung-uk Kim ACPI_PLD_SET_HORIZ_OFFSET (&Dword, PldInfo->HorizontalOffset); 785*1c0e1b6dSJung-uk Kim ACPI_MOVE_32_TO_32 (&Buffer[4], &Dword); 786*1c0e1b6dSJung-uk Kim } 787*1c0e1b6dSJung-uk Kim 788*1c0e1b6dSJung-uk Kim return (ACPI_CAST_PTR (UINT8, Buffer)); 789*1c0e1b6dSJung-uk Kim } 790*1c0e1b6dSJung-uk Kim 791*1c0e1b6dSJung-uk Kim 792*1c0e1b6dSJung-uk Kim /******************************************************************************* 793*1c0e1b6dSJung-uk Kim * 794*1c0e1b6dSJung-uk Kim * FUNCTION: OpcStrupr (strupr) 795*1c0e1b6dSJung-uk Kim * 796*1c0e1b6dSJung-uk Kim * PARAMETERS: SrcString - The source string to convert 797*1c0e1b6dSJung-uk Kim * 798*1c0e1b6dSJung-uk Kim * RETURN: None 799*1c0e1b6dSJung-uk Kim * 800*1c0e1b6dSJung-uk Kim * DESCRIPTION: Convert string to uppercase 801*1c0e1b6dSJung-uk Kim * 802*1c0e1b6dSJung-uk Kim * NOTE: This is not a POSIX function, so it appears here, not in utclib.c 803*1c0e1b6dSJung-uk Kim * 804*1c0e1b6dSJung-uk Kim ******************************************************************************/ 805*1c0e1b6dSJung-uk Kim 806*1c0e1b6dSJung-uk Kim static void 807*1c0e1b6dSJung-uk Kim OpcStrupr ( 808*1c0e1b6dSJung-uk Kim char *SrcString) 809*1c0e1b6dSJung-uk Kim { 810*1c0e1b6dSJung-uk Kim char *String; 811*1c0e1b6dSJung-uk Kim 812*1c0e1b6dSJung-uk Kim 813*1c0e1b6dSJung-uk Kim if (!SrcString) 814*1c0e1b6dSJung-uk Kim { 815*1c0e1b6dSJung-uk Kim return; 816*1c0e1b6dSJung-uk Kim } 817*1c0e1b6dSJung-uk Kim 818*1c0e1b6dSJung-uk Kim /* Walk entire string, uppercasing the letters */ 819*1c0e1b6dSJung-uk Kim 820*1c0e1b6dSJung-uk Kim for (String = SrcString; *String; String++) 821*1c0e1b6dSJung-uk Kim { 822*1c0e1b6dSJung-uk Kim *String = (char) toupper ((int) *String); 823*1c0e1b6dSJung-uk Kim } 824*1c0e1b6dSJung-uk Kim 825*1c0e1b6dSJung-uk Kim return; 826*1c0e1b6dSJung-uk Kim } 827*1c0e1b6dSJung-uk Kim 828*1c0e1b6dSJung-uk Kim 829*1c0e1b6dSJung-uk Kim /******************************************************************************* 830*1c0e1b6dSJung-uk Kim * 831*1c0e1b6dSJung-uk Kim * FUNCTION: OpcFindName 832*1c0e1b6dSJung-uk Kim * 833*1c0e1b6dSJung-uk Kim * PARAMETERS: List - Array of char strings to be searched 834*1c0e1b6dSJung-uk Kim * Name - Char string to string for 835*1c0e1b6dSJung-uk Kim * Index - Index value to set if found 836*1c0e1b6dSJung-uk Kim * 837*1c0e1b6dSJung-uk Kim * RETURN: TRUE if any names matched, FALSE otherwise 838*1c0e1b6dSJung-uk Kim * 839*1c0e1b6dSJung-uk Kim * DESCRIPTION: Match PLD name to value in lookup table. Sets Value to 840*1c0e1b6dSJung-uk Kim * equivalent parameter value. 841*1c0e1b6dSJung-uk Kim * 842*1c0e1b6dSJung-uk Kim ******************************************************************************/ 843*1c0e1b6dSJung-uk Kim 844*1c0e1b6dSJung-uk Kim static BOOLEAN 845*1c0e1b6dSJung-uk Kim OpcFindName ( 846*1c0e1b6dSJung-uk Kim char **List, 847*1c0e1b6dSJung-uk Kim char *Name, 848*1c0e1b6dSJung-uk Kim UINT64 *Index) 849*1c0e1b6dSJung-uk Kim { 850*1c0e1b6dSJung-uk Kim char *Str; 851*1c0e1b6dSJung-uk Kim UINT32 i; 852*1c0e1b6dSJung-uk Kim 853*1c0e1b6dSJung-uk Kim 854*1c0e1b6dSJung-uk Kim OpcStrupr (Name); 855*1c0e1b6dSJung-uk Kim 856*1c0e1b6dSJung-uk Kim for (i = 0, Str = List[0]; Str; i++, Str = List[i]) 857*1c0e1b6dSJung-uk Kim { 858*1c0e1b6dSJung-uk Kim if (!(ACPI_STRNCMP (Str, Name, ACPI_STRLEN (Name)))) 859*1c0e1b6dSJung-uk Kim { 860*1c0e1b6dSJung-uk Kim *Index = i; 861*1c0e1b6dSJung-uk Kim return (TRUE); 862*1c0e1b6dSJung-uk Kim } 863*1c0e1b6dSJung-uk Kim } 864*1c0e1b6dSJung-uk Kim 865*1c0e1b6dSJung-uk Kim return (FALSE); 866*1c0e1b6dSJung-uk Kim } 867*1c0e1b6dSJung-uk Kim 868*1c0e1b6dSJung-uk Kim 869*1c0e1b6dSJung-uk Kim /******************************************************************************* 870*1c0e1b6dSJung-uk Kim * 871*1c0e1b6dSJung-uk Kim * FUNCTION: OpcDoPld 872*1c0e1b6dSJung-uk Kim * 873*1c0e1b6dSJung-uk Kim * PARAMETERS: Op - Parse node 874*1c0e1b6dSJung-uk Kim * 875*1c0e1b6dSJung-uk Kim * RETURN: None 876*1c0e1b6dSJung-uk Kim * 877*1c0e1b6dSJung-uk Kim * DESCRIPTION: Convert ToPLD macro to 20-byte buffer 878*1c0e1b6dSJung-uk Kim * 879*1c0e1b6dSJung-uk Kim ******************************************************************************/ 880*1c0e1b6dSJung-uk Kim 881*1c0e1b6dSJung-uk Kim static void 882*1c0e1b6dSJung-uk Kim OpcDoPld ( 883*1c0e1b6dSJung-uk Kim ACPI_PARSE_OBJECT *Op) 884*1c0e1b6dSJung-uk Kim { 885*1c0e1b6dSJung-uk Kim UINT8 *Buffer; 886*1c0e1b6dSJung-uk Kim ACPI_PARSE_OBJECT *Node; 887*1c0e1b6dSJung-uk Kim ACPI_PLD_INFO PldInfo; 888*1c0e1b6dSJung-uk Kim ACPI_PARSE_OBJECT *NewOp; 889*1c0e1b6dSJung-uk Kim 890*1c0e1b6dSJung-uk Kim 891*1c0e1b6dSJung-uk Kim if (!Op) 892*1c0e1b6dSJung-uk Kim { 893*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_NOT_EXIST, Op, NULL); 894*1c0e1b6dSJung-uk Kim return; 895*1c0e1b6dSJung-uk Kim } 896*1c0e1b6dSJung-uk Kim 897*1c0e1b6dSJung-uk Kim if (Op->Asl.ParseOpcode != PARSEOP_TOPLD) 898*1c0e1b6dSJung-uk Kim { 899*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Op, NULL); 900*1c0e1b6dSJung-uk Kim return; 901*1c0e1b6dSJung-uk Kim } 902*1c0e1b6dSJung-uk Kim 903*1c0e1b6dSJung-uk Kim Buffer = UtLocalCalloc (ACPI_PLD_BUFFER_SIZE); 904*1c0e1b6dSJung-uk Kim if (!Buffer) 905*1c0e1b6dSJung-uk Kim { 906*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_BUFFER_ALLOCATION, Op, NULL); 907*1c0e1b6dSJung-uk Kim return; 908*1c0e1b6dSJung-uk Kim } 909*1c0e1b6dSJung-uk Kim 910*1c0e1b6dSJung-uk Kim ACPI_MEMSET (&PldInfo, 0, sizeof (ACPI_PLD_INFO)); 911*1c0e1b6dSJung-uk Kim 912*1c0e1b6dSJung-uk Kim Node = Op->Asl.Child; 913*1c0e1b6dSJung-uk Kim while (Node) 914*1c0e1b6dSJung-uk Kim { 915*1c0e1b6dSJung-uk Kim switch (Node->Asl.ParseOpcode) 916*1c0e1b6dSJung-uk Kim { 917*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_REVISION: 918*1c0e1b6dSJung-uk Kim 919*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER) 920*1c0e1b6dSJung-uk Kim { 921*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL); 922*1c0e1b6dSJung-uk Kim break; 923*1c0e1b6dSJung-uk Kim } 924*1c0e1b6dSJung-uk Kim 925*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 127) 926*1c0e1b6dSJung-uk Kim { 927*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 928*1c0e1b6dSJung-uk Kim break; 929*1c0e1b6dSJung-uk Kim } 930*1c0e1b6dSJung-uk Kim 931*1c0e1b6dSJung-uk Kim PldInfo.Revision = (UINT8) Node->Asl.Child->Asl.Value.Integer; 932*1c0e1b6dSJung-uk Kim break; 933*1c0e1b6dSJung-uk Kim 934*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_IGNORECOLOR: 935*1c0e1b6dSJung-uk Kim 936*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER) 937*1c0e1b6dSJung-uk Kim { 938*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL); 939*1c0e1b6dSJung-uk Kim break; 940*1c0e1b6dSJung-uk Kim } 941*1c0e1b6dSJung-uk Kim 942*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 1) 943*1c0e1b6dSJung-uk Kim { 944*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 945*1c0e1b6dSJung-uk Kim break; 946*1c0e1b6dSJung-uk Kim } 947*1c0e1b6dSJung-uk Kim 948*1c0e1b6dSJung-uk Kim PldInfo.IgnoreColor = (UINT8) Node->Asl.Child->Asl.Value.Integer; 949*1c0e1b6dSJung-uk Kim break; 950*1c0e1b6dSJung-uk Kim 951*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_RED: 952*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_GREEN: 953*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_BLUE: 954*1c0e1b6dSJung-uk Kim 955*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER) 956*1c0e1b6dSJung-uk Kim { 957*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 958*1c0e1b6dSJung-uk Kim break; 959*1c0e1b6dSJung-uk Kim } 960*1c0e1b6dSJung-uk Kim 961*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 255) 962*1c0e1b6dSJung-uk Kim { 963*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 964*1c0e1b6dSJung-uk Kim break; 965*1c0e1b6dSJung-uk Kim } 966*1c0e1b6dSJung-uk Kim 967*1c0e1b6dSJung-uk Kim if (Node->Asl.ParseOpcode == PARSEOP_PLD_RED) 968*1c0e1b6dSJung-uk Kim { 969*1c0e1b6dSJung-uk Kim PldInfo.Red = (UINT8) Node->Asl.Child->Asl.Value.Integer; 970*1c0e1b6dSJung-uk Kim } 971*1c0e1b6dSJung-uk Kim else if (Node->Asl.ParseOpcode == PARSEOP_PLD_GREEN) 972*1c0e1b6dSJung-uk Kim { 973*1c0e1b6dSJung-uk Kim PldInfo.Green = (UINT8) Node->Asl.Child->Asl.Value.Integer; 974*1c0e1b6dSJung-uk Kim } 975*1c0e1b6dSJung-uk Kim else /* PARSEOP_PLD_BLUE */ 976*1c0e1b6dSJung-uk Kim { 977*1c0e1b6dSJung-uk Kim PldInfo.Blue = (UINT8) Node->Asl.Child->Asl.Value.Integer; 978*1c0e1b6dSJung-uk Kim } 979*1c0e1b6dSJung-uk Kim break; 980*1c0e1b6dSJung-uk Kim 981*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_WIDTH: 982*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_HEIGHT: 983*1c0e1b6dSJung-uk Kim 984*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER) 985*1c0e1b6dSJung-uk Kim { 986*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL); 987*1c0e1b6dSJung-uk Kim break; 988*1c0e1b6dSJung-uk Kim } 989*1c0e1b6dSJung-uk Kim 990*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 65535) 991*1c0e1b6dSJung-uk Kim { 992*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 993*1c0e1b6dSJung-uk Kim break; 994*1c0e1b6dSJung-uk Kim } 995*1c0e1b6dSJung-uk Kim 996*1c0e1b6dSJung-uk Kim if (Node->Asl.ParseOpcode == PARSEOP_PLD_WIDTH) 997*1c0e1b6dSJung-uk Kim { 998*1c0e1b6dSJung-uk Kim PldInfo.Width = (UINT16) Node->Asl.Child->Asl.Value.Integer; 999*1c0e1b6dSJung-uk Kim } 1000*1c0e1b6dSJung-uk Kim else /* PARSEOP_PLD_HEIGHT */ 1001*1c0e1b6dSJung-uk Kim { 1002*1c0e1b6dSJung-uk Kim PldInfo.Height = (UINT16) Node->Asl.Child->Asl.Value.Integer; 1003*1c0e1b6dSJung-uk Kim } 1004*1c0e1b6dSJung-uk Kim 1005*1c0e1b6dSJung-uk Kim break; 1006*1c0e1b6dSJung-uk Kim 1007*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_USERVISIBLE: 1008*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_DOCK: 1009*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_LID: 1010*1c0e1b6dSJung-uk Kim 1011*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER) 1012*1c0e1b6dSJung-uk Kim { 1013*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL); 1014*1c0e1b6dSJung-uk Kim break; 1015*1c0e1b6dSJung-uk Kim } 1016*1c0e1b6dSJung-uk Kim 1017*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 1) 1018*1c0e1b6dSJung-uk Kim { 1019*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 1020*1c0e1b6dSJung-uk Kim break; 1021*1c0e1b6dSJung-uk Kim } 1022*1c0e1b6dSJung-uk Kim 1023*1c0e1b6dSJung-uk Kim if (Node->Asl.ParseOpcode == PARSEOP_PLD_USERVISIBLE) 1024*1c0e1b6dSJung-uk Kim { 1025*1c0e1b6dSJung-uk Kim PldInfo.UserVisible = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1026*1c0e1b6dSJung-uk Kim } 1027*1c0e1b6dSJung-uk Kim else if (Node->Asl.ParseOpcode == PARSEOP_PLD_DOCK) 1028*1c0e1b6dSJung-uk Kim { 1029*1c0e1b6dSJung-uk Kim PldInfo.Dock = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1030*1c0e1b6dSJung-uk Kim } 1031*1c0e1b6dSJung-uk Kim else 1032*1c0e1b6dSJung-uk Kim { 1033*1c0e1b6dSJung-uk Kim PldInfo.Lid = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1034*1c0e1b6dSJung-uk Kim } 1035*1c0e1b6dSJung-uk Kim 1036*1c0e1b6dSJung-uk Kim break; 1037*1c0e1b6dSJung-uk Kim 1038*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_PANEL: 1039*1c0e1b6dSJung-uk Kim 1040*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode == PARSEOP_INTEGER) 1041*1c0e1b6dSJung-uk Kim { 1042*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 6) 1043*1c0e1b6dSJung-uk Kim { 1044*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 1045*1c0e1b6dSJung-uk Kim break; 1046*1c0e1b6dSJung-uk Kim } 1047*1c0e1b6dSJung-uk Kim } 1048*1c0e1b6dSJung-uk Kim else /* PARSEOP_STRING */ 1049*1c0e1b6dSJung-uk Kim { 1050*1c0e1b6dSJung-uk Kim if (!OpcFindName(AslPldPanelList, 1051*1c0e1b6dSJung-uk Kim Node->Asl.Child->Asl.Value.String, 1052*1c0e1b6dSJung-uk Kim &Node->Asl.Child->Asl.Value.Integer)) 1053*1c0e1b6dSJung-uk Kim { 1054*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_OPERAND, Node, NULL); 1055*1c0e1b6dSJung-uk Kim break; 1056*1c0e1b6dSJung-uk Kim } 1057*1c0e1b6dSJung-uk Kim } 1058*1c0e1b6dSJung-uk Kim 1059*1c0e1b6dSJung-uk Kim PldInfo.Panel = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1060*1c0e1b6dSJung-uk Kim break; 1061*1c0e1b6dSJung-uk Kim 1062*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_VERTICALPOSITION: 1063*1c0e1b6dSJung-uk Kim 1064*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode == PARSEOP_INTEGER) 1065*1c0e1b6dSJung-uk Kim { 1066*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 2) 1067*1c0e1b6dSJung-uk Kim { 1068*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 1069*1c0e1b6dSJung-uk Kim break; 1070*1c0e1b6dSJung-uk Kim } 1071*1c0e1b6dSJung-uk Kim } 1072*1c0e1b6dSJung-uk Kim else /* PARSEOP_STRING */ 1073*1c0e1b6dSJung-uk Kim { 1074*1c0e1b6dSJung-uk Kim if (!OpcFindName(AslPldVerticalPositionList, 1075*1c0e1b6dSJung-uk Kim Node->Asl.Child->Asl.Value.String, 1076*1c0e1b6dSJung-uk Kim &Node->Asl.Child->Asl.Value.Integer)) 1077*1c0e1b6dSJung-uk Kim { 1078*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_OPERAND, Node, NULL); 1079*1c0e1b6dSJung-uk Kim break; 1080*1c0e1b6dSJung-uk Kim } 1081*1c0e1b6dSJung-uk Kim } 1082*1c0e1b6dSJung-uk Kim 1083*1c0e1b6dSJung-uk Kim PldInfo.VerticalPosition = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1084*1c0e1b6dSJung-uk Kim break; 1085*1c0e1b6dSJung-uk Kim 1086*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_HORIZONTALPOSITION: 1087*1c0e1b6dSJung-uk Kim 1088*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode == PARSEOP_INTEGER) 1089*1c0e1b6dSJung-uk Kim { 1090*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 2) 1091*1c0e1b6dSJung-uk Kim { 1092*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 1093*1c0e1b6dSJung-uk Kim break; 1094*1c0e1b6dSJung-uk Kim } 1095*1c0e1b6dSJung-uk Kim } 1096*1c0e1b6dSJung-uk Kim else /* PARSEOP_STRING */ 1097*1c0e1b6dSJung-uk Kim { 1098*1c0e1b6dSJung-uk Kim if (!OpcFindName(AslPldHorizontalPositionList, 1099*1c0e1b6dSJung-uk Kim Node->Asl.Child->Asl.Value.String, 1100*1c0e1b6dSJung-uk Kim &Node->Asl.Child->Asl.Value.Integer)) 1101*1c0e1b6dSJung-uk Kim { 1102*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_OPERAND, Node, NULL); 1103*1c0e1b6dSJung-uk Kim break; 1104*1c0e1b6dSJung-uk Kim } 1105*1c0e1b6dSJung-uk Kim } 1106*1c0e1b6dSJung-uk Kim 1107*1c0e1b6dSJung-uk Kim PldInfo.HorizontalPosition = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1108*1c0e1b6dSJung-uk Kim break; 1109*1c0e1b6dSJung-uk Kim 1110*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_SHAPE: 1111*1c0e1b6dSJung-uk Kim 1112*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode == PARSEOP_INTEGER) 1113*1c0e1b6dSJung-uk Kim { 1114*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 8) 1115*1c0e1b6dSJung-uk Kim { 1116*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 1117*1c0e1b6dSJung-uk Kim break; 1118*1c0e1b6dSJung-uk Kim } 1119*1c0e1b6dSJung-uk Kim } 1120*1c0e1b6dSJung-uk Kim else /* PARSEOP_STRING */ 1121*1c0e1b6dSJung-uk Kim { 1122*1c0e1b6dSJung-uk Kim if (!OpcFindName(AslPldShapeList, 1123*1c0e1b6dSJung-uk Kim Node->Asl.Child->Asl.Value.String, 1124*1c0e1b6dSJung-uk Kim &Node->Asl.Child->Asl.Value.Integer)) 1125*1c0e1b6dSJung-uk Kim { 1126*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_OPERAND, Node, NULL); 1127*1c0e1b6dSJung-uk Kim break; 1128*1c0e1b6dSJung-uk Kim } 1129*1c0e1b6dSJung-uk Kim } 1130*1c0e1b6dSJung-uk Kim 1131*1c0e1b6dSJung-uk Kim PldInfo.Shape = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1132*1c0e1b6dSJung-uk Kim break; 1133*1c0e1b6dSJung-uk Kim 1134*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_GROUPORIENTATION: 1135*1c0e1b6dSJung-uk Kim 1136*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER) 1137*1c0e1b6dSJung-uk Kim { 1138*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL); 1139*1c0e1b6dSJung-uk Kim break; 1140*1c0e1b6dSJung-uk Kim } 1141*1c0e1b6dSJung-uk Kim 1142*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 1) 1143*1c0e1b6dSJung-uk Kim { 1144*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 1145*1c0e1b6dSJung-uk Kim break; 1146*1c0e1b6dSJung-uk Kim } 1147*1c0e1b6dSJung-uk Kim 1148*1c0e1b6dSJung-uk Kim PldInfo.GroupOrientation = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1149*1c0e1b6dSJung-uk Kim break; 1150*1c0e1b6dSJung-uk Kim 1151*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_GROUPTOKEN: 1152*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_GROUPPOSITION: 1153*1c0e1b6dSJung-uk Kim 1154*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER) 1155*1c0e1b6dSJung-uk Kim { 1156*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL); 1157*1c0e1b6dSJung-uk Kim break; 1158*1c0e1b6dSJung-uk Kim } 1159*1c0e1b6dSJung-uk Kim 1160*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 255) 1161*1c0e1b6dSJung-uk Kim { 1162*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 1163*1c0e1b6dSJung-uk Kim break; 1164*1c0e1b6dSJung-uk Kim } 1165*1c0e1b6dSJung-uk Kim 1166*1c0e1b6dSJung-uk Kim 1167*1c0e1b6dSJung-uk Kim if (Node->Asl.ParseOpcode == PARSEOP_PLD_GROUPTOKEN) 1168*1c0e1b6dSJung-uk Kim { 1169*1c0e1b6dSJung-uk Kim PldInfo.GroupToken = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1170*1c0e1b6dSJung-uk Kim } 1171*1c0e1b6dSJung-uk Kim else /* PARSEOP_PLD_GROUPPOSITION */ 1172*1c0e1b6dSJung-uk Kim { 1173*1c0e1b6dSJung-uk Kim PldInfo.GroupPosition = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1174*1c0e1b6dSJung-uk Kim } 1175*1c0e1b6dSJung-uk Kim 1176*1c0e1b6dSJung-uk Kim break; 1177*1c0e1b6dSJung-uk Kim 1178*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_BAY: 1179*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_EJECTABLE: 1180*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_EJECTREQUIRED: 1181*1c0e1b6dSJung-uk Kim 1182*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER) 1183*1c0e1b6dSJung-uk Kim { 1184*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL); 1185*1c0e1b6dSJung-uk Kim break; 1186*1c0e1b6dSJung-uk Kim } 1187*1c0e1b6dSJung-uk Kim 1188*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 1) 1189*1c0e1b6dSJung-uk Kim { 1190*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 1191*1c0e1b6dSJung-uk Kim break; 1192*1c0e1b6dSJung-uk Kim } 1193*1c0e1b6dSJung-uk Kim 1194*1c0e1b6dSJung-uk Kim if (Node->Asl.ParseOpcode == PARSEOP_PLD_BAY) 1195*1c0e1b6dSJung-uk Kim { 1196*1c0e1b6dSJung-uk Kim PldInfo.Bay = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1197*1c0e1b6dSJung-uk Kim } 1198*1c0e1b6dSJung-uk Kim else if (Node->Asl.ParseOpcode == PARSEOP_PLD_EJECTABLE) 1199*1c0e1b6dSJung-uk Kim { 1200*1c0e1b6dSJung-uk Kim PldInfo.Ejectable = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1201*1c0e1b6dSJung-uk Kim } 1202*1c0e1b6dSJung-uk Kim else /* PARSEOP_PLD_EJECTREQUIRED */ 1203*1c0e1b6dSJung-uk Kim { 1204*1c0e1b6dSJung-uk Kim PldInfo.OspmEjectRequired = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1205*1c0e1b6dSJung-uk Kim } 1206*1c0e1b6dSJung-uk Kim 1207*1c0e1b6dSJung-uk Kim break; 1208*1c0e1b6dSJung-uk Kim 1209*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_CABINETNUMBER: 1210*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_CARDCAGENUMBER: 1211*1c0e1b6dSJung-uk Kim 1212*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER) 1213*1c0e1b6dSJung-uk Kim { 1214*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL); 1215*1c0e1b6dSJung-uk Kim break; 1216*1c0e1b6dSJung-uk Kim } 1217*1c0e1b6dSJung-uk Kim 1218*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 255) 1219*1c0e1b6dSJung-uk Kim { 1220*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 1221*1c0e1b6dSJung-uk Kim break; 1222*1c0e1b6dSJung-uk Kim } 1223*1c0e1b6dSJung-uk Kim 1224*1c0e1b6dSJung-uk Kim if (Node->Asl.ParseOpcode == PARSEOP_PLD_CABINETNUMBER) 1225*1c0e1b6dSJung-uk Kim { 1226*1c0e1b6dSJung-uk Kim PldInfo.CabinetNumber = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1227*1c0e1b6dSJung-uk Kim } 1228*1c0e1b6dSJung-uk Kim else /* PARSEOP_PLD_CARDCAGENUMBER */ 1229*1c0e1b6dSJung-uk Kim { 1230*1c0e1b6dSJung-uk Kim PldInfo.CardCageNumber = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1231*1c0e1b6dSJung-uk Kim } 1232*1c0e1b6dSJung-uk Kim 1233*1c0e1b6dSJung-uk Kim break; 1234*1c0e1b6dSJung-uk Kim 1235*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_REFERENCE: 1236*1c0e1b6dSJung-uk Kim 1237*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER) 1238*1c0e1b6dSJung-uk Kim { 1239*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL); 1240*1c0e1b6dSJung-uk Kim break; 1241*1c0e1b6dSJung-uk Kim } 1242*1c0e1b6dSJung-uk Kim 1243*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 1) 1244*1c0e1b6dSJung-uk Kim { 1245*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 1246*1c0e1b6dSJung-uk Kim break; 1247*1c0e1b6dSJung-uk Kim } 1248*1c0e1b6dSJung-uk Kim 1249*1c0e1b6dSJung-uk Kim PldInfo.Reference = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1250*1c0e1b6dSJung-uk Kim break; 1251*1c0e1b6dSJung-uk Kim 1252*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_ROTATION: 1253*1c0e1b6dSJung-uk Kim 1254*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER) 1255*1c0e1b6dSJung-uk Kim { 1256*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL); 1257*1c0e1b6dSJung-uk Kim break; 1258*1c0e1b6dSJung-uk Kim } 1259*1c0e1b6dSJung-uk Kim 1260*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 7) 1261*1c0e1b6dSJung-uk Kim { 1262*1c0e1b6dSJung-uk Kim switch (Node->Asl.Child->Asl.Value.Integer) 1263*1c0e1b6dSJung-uk Kim { 1264*1c0e1b6dSJung-uk Kim case 45: 1265*1c0e1b6dSJung-uk Kim 1266*1c0e1b6dSJung-uk Kim Node->Asl.Child->Asl.Value.Integer = 1; 1267*1c0e1b6dSJung-uk Kim break; 1268*1c0e1b6dSJung-uk Kim 1269*1c0e1b6dSJung-uk Kim case 90: 1270*1c0e1b6dSJung-uk Kim 1271*1c0e1b6dSJung-uk Kim Node->Asl.Child->Asl.Value.Integer = 2; 1272*1c0e1b6dSJung-uk Kim break; 1273*1c0e1b6dSJung-uk Kim 1274*1c0e1b6dSJung-uk Kim case 135: 1275*1c0e1b6dSJung-uk Kim 1276*1c0e1b6dSJung-uk Kim Node->Asl.Child->Asl.Value.Integer = 3; 1277*1c0e1b6dSJung-uk Kim break; 1278*1c0e1b6dSJung-uk Kim 1279*1c0e1b6dSJung-uk Kim case 180: 1280*1c0e1b6dSJung-uk Kim 1281*1c0e1b6dSJung-uk Kim Node->Asl.Child->Asl.Value.Integer = 4; 1282*1c0e1b6dSJung-uk Kim break; 1283*1c0e1b6dSJung-uk Kim 1284*1c0e1b6dSJung-uk Kim case 225: 1285*1c0e1b6dSJung-uk Kim 1286*1c0e1b6dSJung-uk Kim Node->Asl.Child->Asl.Value.Integer = 5; 1287*1c0e1b6dSJung-uk Kim break; 1288*1c0e1b6dSJung-uk Kim 1289*1c0e1b6dSJung-uk Kim case 270: 1290*1c0e1b6dSJung-uk Kim 1291*1c0e1b6dSJung-uk Kim Node->Asl.Child->Asl.Value.Integer = 6; 1292*1c0e1b6dSJung-uk Kim break; 1293*1c0e1b6dSJung-uk Kim 1294*1c0e1b6dSJung-uk Kim case 315: 1295*1c0e1b6dSJung-uk Kim 1296*1c0e1b6dSJung-uk Kim Node->Asl.Child->Asl.Value.Integer = 7; 1297*1c0e1b6dSJung-uk Kim break; 1298*1c0e1b6dSJung-uk Kim 1299*1c0e1b6dSJung-uk Kim default: 1300*1c0e1b6dSJung-uk Kim 1301*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 1302*1c0e1b6dSJung-uk Kim break; 1303*1c0e1b6dSJung-uk Kim } 1304*1c0e1b6dSJung-uk Kim } 1305*1c0e1b6dSJung-uk Kim 1306*1c0e1b6dSJung-uk Kim PldInfo.Rotation = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1307*1c0e1b6dSJung-uk Kim break; 1308*1c0e1b6dSJung-uk Kim 1309*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_ORDER: 1310*1c0e1b6dSJung-uk Kim 1311*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER) 1312*1c0e1b6dSJung-uk Kim { 1313*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL); 1314*1c0e1b6dSJung-uk Kim break; 1315*1c0e1b6dSJung-uk Kim } 1316*1c0e1b6dSJung-uk Kim 1317*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 31) 1318*1c0e1b6dSJung-uk Kim { 1319*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 1320*1c0e1b6dSJung-uk Kim break; 1321*1c0e1b6dSJung-uk Kim } 1322*1c0e1b6dSJung-uk Kim 1323*1c0e1b6dSJung-uk Kim PldInfo.Order = (UINT8) Node->Asl.Child->Asl.Value.Integer; 1324*1c0e1b6dSJung-uk Kim break; 1325*1c0e1b6dSJung-uk Kim 1326*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_VERTICALOFFSET: 1327*1c0e1b6dSJung-uk Kim case PARSEOP_PLD_HORIZONTALOFFSET: 1328*1c0e1b6dSJung-uk Kim 1329*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER) 1330*1c0e1b6dSJung-uk Kim { 1331*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL); 1332*1c0e1b6dSJung-uk Kim break; 1333*1c0e1b6dSJung-uk Kim } 1334*1c0e1b6dSJung-uk Kim 1335*1c0e1b6dSJung-uk Kim if (Node->Asl.Child->Asl.Value.Integer > 65535) 1336*1c0e1b6dSJung-uk Kim { 1337*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL); 1338*1c0e1b6dSJung-uk Kim break; 1339*1c0e1b6dSJung-uk Kim } 1340*1c0e1b6dSJung-uk Kim 1341*1c0e1b6dSJung-uk Kim if (Node->Asl.ParseOpcode == PARSEOP_PLD_VERTICALOFFSET) 1342*1c0e1b6dSJung-uk Kim { 1343*1c0e1b6dSJung-uk Kim PldInfo.VerticalOffset = (UINT16) Node->Asl.Child->Asl.Value.Integer; 1344*1c0e1b6dSJung-uk Kim } 1345*1c0e1b6dSJung-uk Kim else /* PARSEOP_PLD_HORIZONTALOFFSET */ 1346*1c0e1b6dSJung-uk Kim { 1347*1c0e1b6dSJung-uk Kim PldInfo.HorizontalOffset = (UINT16) Node->Asl.Child->Asl.Value.Integer; 1348*1c0e1b6dSJung-uk Kim } 1349*1c0e1b6dSJung-uk Kim 1350*1c0e1b6dSJung-uk Kim break; 1351*1c0e1b6dSJung-uk Kim 1352*1c0e1b6dSJung-uk Kim default: 1353*1c0e1b6dSJung-uk Kim 1354*1c0e1b6dSJung-uk Kim AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL); 1355*1c0e1b6dSJung-uk Kim break; 1356*1c0e1b6dSJung-uk Kim } 1357*1c0e1b6dSJung-uk Kim 1358*1c0e1b6dSJung-uk Kim Node = Node->Asl.Next; 1359*1c0e1b6dSJung-uk Kim } 1360*1c0e1b6dSJung-uk Kim 1361*1c0e1b6dSJung-uk Kim Buffer = OpcEncodePldBuffer(&PldInfo); 1362*1c0e1b6dSJung-uk Kim 1363*1c0e1b6dSJung-uk Kim /* Change Op to a Buffer */ 1364*1c0e1b6dSJung-uk Kim 1365*1c0e1b6dSJung-uk Kim Op->Asl.ParseOpcode = PARSEOP_BUFFER; 1366*1c0e1b6dSJung-uk Kim Op->Common.AmlOpcode = AML_BUFFER_OP; 1367*1c0e1b6dSJung-uk Kim 1368*1c0e1b6dSJung-uk Kim /* Disable further optimization */ 1369*1c0e1b6dSJung-uk Kim 1370*1c0e1b6dSJung-uk Kim Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST; 1371*1c0e1b6dSJung-uk Kim UtSetParseOpName (Op); 1372*1c0e1b6dSJung-uk Kim 1373*1c0e1b6dSJung-uk Kim /* Child node is the buffer length */ 1374*1c0e1b6dSJung-uk Kim 1375*1c0e1b6dSJung-uk Kim NewOp = TrAllocateNode (PARSEOP_INTEGER); 1376*1c0e1b6dSJung-uk Kim 1377*1c0e1b6dSJung-uk Kim NewOp->Asl.AmlOpcode = AML_BYTE_OP; 1378*1c0e1b6dSJung-uk Kim NewOp->Asl.Value.Integer = 20; 1379*1c0e1b6dSJung-uk Kim NewOp->Asl.Parent = Op; 1380*1c0e1b6dSJung-uk Kim 1381*1c0e1b6dSJung-uk Kim Op->Asl.Child = NewOp; 1382*1c0e1b6dSJung-uk Kim Op = NewOp; 1383*1c0e1b6dSJung-uk Kim 1384*1c0e1b6dSJung-uk Kim /* Peer to the child is the raw buffer data */ 1385*1c0e1b6dSJung-uk Kim 1386*1c0e1b6dSJung-uk Kim NewOp = TrAllocateNode (PARSEOP_RAW_DATA); 1387*1c0e1b6dSJung-uk Kim NewOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER; 1388*1c0e1b6dSJung-uk Kim NewOp->Asl.AmlLength = 20; 1389*1c0e1b6dSJung-uk Kim NewOp->Asl.Value.String = ACPI_CAST_PTR (char, Buffer); 1390*1c0e1b6dSJung-uk Kim NewOp->Asl.Parent = Op->Asl.Parent; 1391*1c0e1b6dSJung-uk Kim 1392*1c0e1b6dSJung-uk Kim Op->Asl.Next = NewOp; 1393*1c0e1b6dSJung-uk Kim } 1394*1c0e1b6dSJung-uk Kim 1395*1c0e1b6dSJung-uk Kim 1396*1c0e1b6dSJung-uk Kim /******************************************************************************* 1397*1c0e1b6dSJung-uk Kim * 13983f0275a0SJung-uk Kim * FUNCTION: OpcDoUuId 1399c8466860SMark Santcroos * 1400c8466860SMark Santcroos * PARAMETERS: Op - Parse node 1401c8466860SMark Santcroos * 1402c8466860SMark Santcroos * RETURN: None 1403c8466860SMark Santcroos * 1404fba7fc7eSJung-uk Kim * DESCRIPTION: Convert UUID string to 16-byte buffer 1405c8466860SMark Santcroos * 1406c8466860SMark Santcroos ******************************************************************************/ 1407c8466860SMark Santcroos 1408fba7fc7eSJung-uk Kim static void 1409c8466860SMark Santcroos OpcDoUuId ( 1410c8466860SMark Santcroos ACPI_PARSE_OBJECT *Op) 1411c8466860SMark Santcroos { 1412c8466860SMark Santcroos char *InString; 1413313a0c13SJung-uk Kim UINT8 *Buffer; 1414c8466860SMark Santcroos ACPI_STATUS Status = AE_OK; 1415c8466860SMark Santcroos ACPI_PARSE_OBJECT *NewOp; 1416c8466860SMark Santcroos 1417c8466860SMark Santcroos 1418*1c0e1b6dSJung-uk Kim InString = ACPI_CAST_PTR (char, Op->Asl.Value.String); 1419c8466860SMark Santcroos Buffer = UtLocalCalloc (16); 1420c8466860SMark Santcroos 1421d244b227SJung-uk Kim Status = AuValidateUuid (InString); 1422c8466860SMark Santcroos if (ACPI_FAILURE (Status)) 1423c8466860SMark Santcroos { 1424c8466860SMark Santcroos AslError (ASL_ERROR, ASL_MSG_INVALID_UUID, Op, Op->Asl.Value.String); 1425c8466860SMark Santcroos } 1426d244b227SJung-uk Kim else 1427c8466860SMark Santcroos { 1428313a0c13SJung-uk Kim AcpiUtConvertStringToUuid (InString, Buffer); 1429c8466860SMark Santcroos } 1430c8466860SMark Santcroos 1431c8466860SMark Santcroos /* Change Op to a Buffer */ 1432c8466860SMark Santcroos 1433c8466860SMark Santcroos Op->Asl.ParseOpcode = PARSEOP_BUFFER; 1434c8466860SMark Santcroos Op->Common.AmlOpcode = AML_BUFFER_OP; 1435fba7fc7eSJung-uk Kim 1436fba7fc7eSJung-uk Kim /* Disable further optimization */ 1437fba7fc7eSJung-uk Kim 1438fba7fc7eSJung-uk Kim Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST; 1439c8466860SMark Santcroos UtSetParseOpName (Op); 1440c8466860SMark Santcroos 1441c8466860SMark Santcroos /* Child node is the buffer length */ 1442c8466860SMark Santcroos 1443c8466860SMark Santcroos NewOp = TrAllocateNode (PARSEOP_INTEGER); 1444c8466860SMark Santcroos 1445c8466860SMark Santcroos NewOp->Asl.AmlOpcode = AML_BYTE_OP; 1446c8466860SMark Santcroos NewOp->Asl.Value.Integer = 16; 1447c8466860SMark Santcroos NewOp->Asl.Parent = Op; 1448c8466860SMark Santcroos 1449c8466860SMark Santcroos Op->Asl.Child = NewOp; 1450c8466860SMark Santcroos Op = NewOp; 1451c8466860SMark Santcroos 1452c8466860SMark Santcroos /* Peer to the child is the raw buffer data */ 1453c8466860SMark Santcroos 1454c8466860SMark Santcroos NewOp = TrAllocateNode (PARSEOP_RAW_DATA); 1455c8466860SMark Santcroos NewOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER; 1456c8466860SMark Santcroos NewOp->Asl.AmlLength = 16; 1457*1c0e1b6dSJung-uk Kim NewOp->Asl.Value.String = ACPI_CAST_PTR (char, Buffer); 1458c8466860SMark Santcroos NewOp->Asl.Parent = Op->Asl.Parent; 1459c8466860SMark Santcroos 1460c8466860SMark Santcroos Op->Asl.Next = NewOp; 1461c8466860SMark Santcroos } 1462c8466860SMark Santcroos 1463c8466860SMark Santcroos 1464c8466860SMark Santcroos /******************************************************************************* 1465c8466860SMark Santcroos * 146653289f6aSNate Lawson * FUNCTION: OpcGenerateAmlOpcode 146753289f6aSNate Lawson * 146853289f6aSNate Lawson * PARAMETERS: Op - Parse node 146953289f6aSNate Lawson * 147053289f6aSNate Lawson * RETURN: None 147153289f6aSNate Lawson * 147253289f6aSNate Lawson * DESCRIPTION: Generate the AML opcode associated with the node and its 147353289f6aSNate Lawson * parse (lex/flex) keyword opcode. Essentially implements 147453289f6aSNate Lawson * a mapping between the parse opcodes and the actual AML opcodes. 147553289f6aSNate Lawson * 147653289f6aSNate Lawson ******************************************************************************/ 147753289f6aSNate Lawson 147853289f6aSNate Lawson void 147953289f6aSNate Lawson OpcGenerateAmlOpcode ( 148053289f6aSNate Lawson ACPI_PARSE_OBJECT *Op) 148153289f6aSNate Lawson { 148253289f6aSNate Lawson UINT16 Index; 148353289f6aSNate Lawson 148453289f6aSNate Lawson 148553289f6aSNate Lawson Index = (UINT16) (Op->Asl.ParseOpcode - ASL_PARSE_OPCODE_BASE); 148653289f6aSNate Lawson 148753289f6aSNate Lawson Op->Asl.AmlOpcode = AslKeywordMapping[Index].AmlOpcode; 148853289f6aSNate Lawson Op->Asl.AcpiBtype = AslKeywordMapping[Index].AcpiBtype; 148953289f6aSNate Lawson Op->Asl.CompileFlags |= AslKeywordMapping[Index].Flags; 149053289f6aSNate Lawson 149153289f6aSNate Lawson if (!Op->Asl.Value.Integer) 149253289f6aSNate Lawson { 149353289f6aSNate Lawson Op->Asl.Value.Integer = AslKeywordMapping[Index].Value; 149453289f6aSNate Lawson } 149553289f6aSNate Lawson 149653289f6aSNate Lawson /* Special handling for some opcodes */ 149753289f6aSNate Lawson 149853289f6aSNate Lawson switch (Op->Asl.ParseOpcode) 149953289f6aSNate Lawson { 150053289f6aSNate Lawson case PARSEOP_INTEGER: 150153289f6aSNate Lawson /* 150253289f6aSNate Lawson * Set the opcode based on the size of the integer 150353289f6aSNate Lawson */ 150453289f6aSNate Lawson (void) OpcSetOptimalIntegerSize (Op); 150553289f6aSNate Lawson break; 150653289f6aSNate Lawson 150753289f6aSNate Lawson case PARSEOP_OFFSET: 150853289f6aSNate Lawson 150953289f6aSNate Lawson Op->Asl.AmlOpcodeLength = 1; 151053289f6aSNate Lawson break; 151153289f6aSNate Lawson 151253289f6aSNate Lawson case PARSEOP_ACCESSAS: 151353289f6aSNate Lawson 151453289f6aSNate Lawson OpcDoAccessAs (Op); 151553289f6aSNate Lawson break; 151653289f6aSNate Lawson 15173f0275a0SJung-uk Kim case PARSEOP_CONNECTION: 15183f0275a0SJung-uk Kim 15193f0275a0SJung-uk Kim OpcDoConnection (Op); 15203f0275a0SJung-uk Kim break; 15213f0275a0SJung-uk Kim 152253289f6aSNate Lawson case PARSEOP_EISAID: 152353289f6aSNate Lawson 152453289f6aSNate Lawson OpcDoEisaId (Op); 152553289f6aSNate Lawson break; 152653289f6aSNate Lawson 1527*1c0e1b6dSJung-uk Kim case PARSEOP_PRINTF: 1528*1c0e1b6dSJung-uk Kim 1529*1c0e1b6dSJung-uk Kim OpcDoPrintf (Op); 1530*1c0e1b6dSJung-uk Kim break; 1531*1c0e1b6dSJung-uk Kim 1532*1c0e1b6dSJung-uk Kim case PARSEOP_FPRINTF: 1533*1c0e1b6dSJung-uk Kim 1534*1c0e1b6dSJung-uk Kim OpcDoFprintf (Op); 1535*1c0e1b6dSJung-uk Kim break; 1536*1c0e1b6dSJung-uk Kim 1537*1c0e1b6dSJung-uk Kim case PARSEOP_TOPLD: 1538*1c0e1b6dSJung-uk Kim 1539*1c0e1b6dSJung-uk Kim OpcDoPld (Op); 1540*1c0e1b6dSJung-uk Kim break; 1541*1c0e1b6dSJung-uk Kim 1542c8466860SMark Santcroos case PARSEOP_TOUUID: 1543c8466860SMark Santcroos 1544c8466860SMark Santcroos OpcDoUuId (Op); 1545c8466860SMark Santcroos break; 1546c8466860SMark Santcroos 154753289f6aSNate Lawson case PARSEOP_UNICODE: 154853289f6aSNate Lawson 154953289f6aSNate Lawson OpcDoUnicode (Op); 155053289f6aSNate Lawson break; 155153289f6aSNate Lawson 155253289f6aSNate Lawson case PARSEOP_INCLUDE: 155353289f6aSNate Lawson 155453289f6aSNate Lawson Op->Asl.Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; 155553289f6aSNate Lawson Gbl_HasIncludeFiles = TRUE; 155653289f6aSNate Lawson break; 155753289f6aSNate Lawson 155853289f6aSNate Lawson case PARSEOP_EXTERNAL: 155953289f6aSNate Lawson 156053289f6aSNate Lawson Op->Asl.Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; 156153289f6aSNate Lawson Op->Asl.Child->Asl.Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; 156253289f6aSNate Lawson break; 156353289f6aSNate Lawson 1564efcc2a30SJung-uk Kim case PARSEOP_TIMER: 1565efcc2a30SJung-uk Kim 1566efcc2a30SJung-uk Kim if (AcpiGbl_IntegerBitWidth == 32) 1567efcc2a30SJung-uk Kim { 1568efcc2a30SJung-uk Kim AslError (ASL_REMARK, ASL_MSG_TRUNCATION, Op, NULL); 1569efcc2a30SJung-uk Kim } 1570efcc2a30SJung-uk Kim break; 1571efcc2a30SJung-uk Kim 157253289f6aSNate Lawson default: 1573a9d8d09cSJung-uk Kim 157453289f6aSNate Lawson /* Nothing to do for other opcodes */ 1575a9d8d09cSJung-uk Kim 157653289f6aSNate Lawson break; 157753289f6aSNate Lawson } 157853289f6aSNate Lawson 157953289f6aSNate Lawson return; 158053289f6aSNate Lawson } 1581