Home | History | Annotate | Line # | Download | only in compiler
aslopcodes.c revision 1.1.1.6
      1      1.1    jruoho /******************************************************************************
      2      1.1    jruoho  *
      3      1.1    jruoho  * Module Name: aslopcode - AML opcode generation
      4      1.1    jruoho  *
      5      1.1    jruoho  *****************************************************************************/
      6      1.1    jruoho 
      7  1.1.1.2    jruoho /*
      8  1.1.1.5  christos  * Copyright (C) 2000 - 2015, Intel Corp.
      9      1.1    jruoho  * All rights reserved.
     10      1.1    jruoho  *
     11  1.1.1.2    jruoho  * Redistribution and use in source and binary forms, with or without
     12  1.1.1.2    jruoho  * modification, are permitted provided that the following conditions
     13  1.1.1.2    jruoho  * are met:
     14  1.1.1.2    jruoho  * 1. Redistributions of source code must retain the above copyright
     15  1.1.1.2    jruoho  *    notice, this list of conditions, and the following disclaimer,
     16  1.1.1.2    jruoho  *    without modification.
     17  1.1.1.2    jruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  1.1.1.2    jruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  1.1.1.2    jruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  1.1.1.2    jruoho  *    including a substantially similar Disclaimer requirement for further
     21  1.1.1.2    jruoho  *    binary redistribution.
     22  1.1.1.2    jruoho  * 3. Neither the names of the above-listed copyright holders nor the names
     23  1.1.1.2    jruoho  *    of any contributors may be used to endorse or promote products derived
     24  1.1.1.2    jruoho  *    from this software without specific prior written permission.
     25  1.1.1.2    jruoho  *
     26  1.1.1.2    jruoho  * Alternatively, this software may be distributed under the terms of the
     27  1.1.1.2    jruoho  * GNU General Public License ("GPL") version 2 as published by the Free
     28  1.1.1.2    jruoho  * Software Foundation.
     29  1.1.1.2    jruoho  *
     30  1.1.1.2    jruoho  * NO WARRANTY
     31  1.1.1.2    jruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  1.1.1.2    jruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  1.1.1.2    jruoho  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34  1.1.1.2    jruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  1.1.1.2    jruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  1.1.1.2    jruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  1.1.1.2    jruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  1.1.1.2    jruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  1.1.1.2    jruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  1.1.1.2    jruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  1.1.1.2    jruoho  * POSSIBILITY OF SUCH DAMAGES.
     42  1.1.1.2    jruoho  */
     43      1.1    jruoho 
     44      1.1    jruoho #include "aslcompiler.h"
     45      1.1    jruoho #include "aslcompiler.y.h"
     46      1.1    jruoho #include "amlcode.h"
     47      1.1    jruoho 
     48      1.1    jruoho #define _COMPONENT          ACPI_COMPILER
     49      1.1    jruoho         ACPI_MODULE_NAME    ("aslopcodes")
     50      1.1    jruoho 
     51      1.1    jruoho 
     52      1.1    jruoho /* Local prototypes */
     53      1.1    jruoho 
     54      1.1    jruoho static void
     55      1.1    jruoho OpcDoAccessAs (
     56      1.1    jruoho     ACPI_PARSE_OBJECT       *Op);
     57      1.1    jruoho 
     58      1.1    jruoho static void
     59  1.1.1.3  christos OpcDoConnection (
     60  1.1.1.3  christos     ACPI_PARSE_OBJECT       *Op);
     61  1.1.1.3  christos 
     62  1.1.1.3  christos static void
     63      1.1    jruoho OpcDoUnicode (
     64      1.1    jruoho     ACPI_PARSE_OBJECT       *Op);
     65      1.1    jruoho 
     66      1.1    jruoho static void
     67      1.1    jruoho OpcDoEisaId (
     68      1.1    jruoho     ACPI_PARSE_OBJECT       *Op);
     69      1.1    jruoho 
     70      1.1    jruoho static void
     71  1.1.1.5  christos OpcDoPld (
     72  1.1.1.5  christos     ACPI_PARSE_OBJECT       *Op);
     73  1.1.1.5  christos 
     74  1.1.1.5  christos static void
     75      1.1    jruoho OpcDoUuId (
     76      1.1    jruoho     ACPI_PARSE_OBJECT       *Op);
     77      1.1    jruoho 
     78  1.1.1.5  christos static UINT8 *
     79  1.1.1.5  christos OpcEncodePldBuffer (
     80  1.1.1.5  christos     ACPI_PLD_INFO           *PldInfo);
     81  1.1.1.5  christos 
     82  1.1.1.5  christos 
     83  1.1.1.5  christos /* ToPld strings */
     84  1.1.1.5  christos 
     85  1.1.1.5  christos static char *AslPldPanelList[] =
     86  1.1.1.5  christos {
     87  1.1.1.5  christos     "TOP",
     88  1.1.1.5  christos     "BOTTOM",
     89  1.1.1.5  christos     "LEFT",
     90  1.1.1.5  christos     "RIGHT",
     91  1.1.1.5  christos     "FRONT",
     92  1.1.1.5  christos     "BACK",
     93  1.1.1.5  christos     "UNKNOWN",
     94  1.1.1.5  christos     NULL
     95  1.1.1.5  christos };
     96  1.1.1.5  christos 
     97  1.1.1.5  christos static char *AslPldVerticalPositionList[] =
     98  1.1.1.5  christos {
     99  1.1.1.5  christos     "UPPER",
    100  1.1.1.5  christos     "CENTER",
    101  1.1.1.5  christos     "LOWER",
    102  1.1.1.5  christos     NULL
    103  1.1.1.5  christos };
    104  1.1.1.5  christos 
    105  1.1.1.5  christos static char *AslPldHorizontalPositionList[] =
    106  1.1.1.5  christos {
    107  1.1.1.5  christos     "LEFT",
    108  1.1.1.5  christos     "CENTER",
    109  1.1.1.5  christos     "RIGHT",
    110  1.1.1.5  christos     NULL
    111  1.1.1.5  christos };
    112  1.1.1.5  christos 
    113  1.1.1.5  christos static char *AslPldShapeList[] =
    114  1.1.1.5  christos {
    115  1.1.1.5  christos     "ROUND",
    116  1.1.1.5  christos     "OVAL",
    117  1.1.1.5  christos     "SQUARE",
    118  1.1.1.5  christos     "VERTICALRECTANGLE",
    119  1.1.1.5  christos     "HORIZONTALRECTANGLE",
    120  1.1.1.5  christos     "VERTICALTRAPEZOID",
    121  1.1.1.5  christos     "HORIZONTALTRAPEZOID",
    122  1.1.1.5  christos     "UNKNOWN",
    123  1.1.1.5  christos     "CHAMFERED",
    124  1.1.1.5  christos     NULL
    125  1.1.1.5  christos };
    126  1.1.1.5  christos 
    127      1.1    jruoho 
    128      1.1    jruoho /*******************************************************************************
    129      1.1    jruoho  *
    130      1.1    jruoho  * FUNCTION:    OpcAmlOpcodeUpdateWalk
    131      1.1    jruoho  *
    132      1.1    jruoho  * PARAMETERS:  ASL_WALK_CALLBACK
    133      1.1    jruoho  *
    134      1.1    jruoho  * RETURN:      Status
    135      1.1    jruoho  *
    136      1.1    jruoho  * DESCRIPTION: Opcode update walk, ascending callback
    137      1.1    jruoho  *
    138      1.1    jruoho  ******************************************************************************/
    139      1.1    jruoho 
    140      1.1    jruoho ACPI_STATUS
    141      1.1    jruoho OpcAmlOpcodeUpdateWalk (
    142      1.1    jruoho     ACPI_PARSE_OBJECT       *Op,
    143      1.1    jruoho     UINT32                  Level,
    144      1.1    jruoho     void                    *Context)
    145      1.1    jruoho {
    146      1.1    jruoho 
    147      1.1    jruoho     /*
    148      1.1    jruoho      * Handle the Package() case where the actual opcode cannot be determined
    149      1.1    jruoho      * until the PackageLength operand has been folded and minimized.
    150      1.1    jruoho      * (PackageOp versus VarPackageOp)
    151      1.1    jruoho      *
    152      1.1    jruoho      * This is (as of ACPI 3.0) the only case where the AML opcode can change
    153      1.1    jruoho      * based upon the value of a parameter.
    154      1.1    jruoho      *
    155      1.1    jruoho      * The parser always inserts a VarPackage opcode, which can possibly be
    156      1.1    jruoho      * optimized to a Package opcode.
    157      1.1    jruoho      */
    158      1.1    jruoho     if (Op->Asl.ParseOpcode == PARSEOP_VAR_PACKAGE)
    159      1.1    jruoho     {
    160      1.1    jruoho         OpnDoPackage (Op);
    161      1.1    jruoho     }
    162      1.1    jruoho 
    163      1.1    jruoho     return (AE_OK);
    164      1.1    jruoho }
    165      1.1    jruoho 
    166      1.1    jruoho 
    167      1.1    jruoho /*******************************************************************************
    168      1.1    jruoho  *
    169      1.1    jruoho  * FUNCTION:    OpcAmlOpcodeWalk
    170      1.1    jruoho  *
    171      1.1    jruoho  * PARAMETERS:  ASL_WALK_CALLBACK
    172      1.1    jruoho  *
    173      1.1    jruoho  * RETURN:      Status
    174      1.1    jruoho  *
    175      1.1    jruoho  * DESCRIPTION: Parse tree walk to generate both the AML opcodes and the AML
    176      1.1    jruoho  *              operands.
    177      1.1    jruoho  *
    178      1.1    jruoho  ******************************************************************************/
    179      1.1    jruoho 
    180      1.1    jruoho ACPI_STATUS
    181      1.1    jruoho OpcAmlOpcodeWalk (
    182      1.1    jruoho     ACPI_PARSE_OBJECT       *Op,
    183      1.1    jruoho     UINT32                  Level,
    184      1.1    jruoho     void                    *Context)
    185      1.1    jruoho {
    186      1.1    jruoho 
    187      1.1    jruoho     TotalParseNodes++;
    188      1.1    jruoho 
    189      1.1    jruoho     OpcGenerateAmlOpcode (Op);
    190      1.1    jruoho     OpnGenerateAmlOperands (Op);
    191      1.1    jruoho     return (AE_OK);
    192      1.1    jruoho }
    193      1.1    jruoho 
    194      1.1    jruoho 
    195      1.1    jruoho /*******************************************************************************
    196      1.1    jruoho  *
    197      1.1    jruoho  * FUNCTION:    OpcGetIntegerWidth
    198      1.1    jruoho  *
    199      1.1    jruoho  * PARAMETERS:  Op          - DEFINITION BLOCK op
    200      1.1    jruoho  *
    201      1.1    jruoho  * RETURN:      none
    202      1.1    jruoho  *
    203      1.1    jruoho  * DESCRIPTION: Extract integer width from the table revision
    204      1.1    jruoho  *
    205      1.1    jruoho  ******************************************************************************/
    206      1.1    jruoho 
    207      1.1    jruoho void
    208      1.1    jruoho OpcGetIntegerWidth (
    209      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    210      1.1    jruoho {
    211      1.1    jruoho     ACPI_PARSE_OBJECT       *Child;
    212      1.1    jruoho 
    213      1.1    jruoho 
    214      1.1    jruoho     if (!Op)
    215      1.1    jruoho     {
    216      1.1    jruoho         return;
    217      1.1    jruoho     }
    218      1.1    jruoho 
    219      1.1    jruoho     if (Gbl_RevisionOverride)
    220      1.1    jruoho     {
    221      1.1    jruoho         AcpiUtSetIntegerWidth (Gbl_RevisionOverride);
    222      1.1    jruoho     }
    223      1.1    jruoho     else
    224      1.1    jruoho     {
    225      1.1    jruoho         Child = Op->Asl.Child;
    226      1.1    jruoho         Child = Child->Asl.Next;
    227      1.1    jruoho         Child = Child->Asl.Next;
    228      1.1    jruoho 
    229      1.1    jruoho         /* Use the revision to set the integer width */
    230      1.1    jruoho 
    231      1.1    jruoho         AcpiUtSetIntegerWidth ((UINT8) Child->Asl.Value.Integer);
    232      1.1    jruoho     }
    233      1.1    jruoho }
    234      1.1    jruoho 
    235      1.1    jruoho 
    236      1.1    jruoho /*******************************************************************************
    237      1.1    jruoho  *
    238      1.1    jruoho  * FUNCTION:    OpcSetOptimalIntegerSize
    239      1.1    jruoho  *
    240      1.1    jruoho  * PARAMETERS:  Op        - A parse tree node
    241      1.1    jruoho  *
    242  1.1.1.3  christos  * RETURN:      Integer width, in bytes. Also sets the node AML opcode to the
    243      1.1    jruoho  *              optimal integer AML prefix opcode.
    244      1.1    jruoho  *
    245  1.1.1.3  christos  * DESCRIPTION: Determine the optimal AML encoding of an integer. All leading
    246      1.1    jruoho  *              zeros can be truncated to squeeze the integer into the
    247      1.1    jruoho  *              minimal number of AML bytes.
    248      1.1    jruoho  *
    249      1.1    jruoho  ******************************************************************************/
    250      1.1    jruoho 
    251      1.1    jruoho UINT32
    252      1.1    jruoho OpcSetOptimalIntegerSize (
    253      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    254      1.1    jruoho {
    255      1.1    jruoho 
    256      1.1    jruoho #if 0
    257      1.1    jruoho     /*
    258      1.1    jruoho      * TBD: - we don't want to optimize integers in the block header, but the
    259      1.1    jruoho      * code below does not work correctly.
    260      1.1    jruoho      */
    261      1.1    jruoho     if (Op->Asl.Parent &&
    262      1.1    jruoho         Op->Asl.Parent->Asl.Parent &&
    263      1.1    jruoho        (Op->Asl.Parent->Asl.Parent->Asl.ParseOpcode == PARSEOP_DEFINITIONBLOCK))
    264      1.1    jruoho     {
    265  1.1.1.3  christos         return (0);
    266      1.1    jruoho     }
    267      1.1    jruoho #endif
    268      1.1    jruoho 
    269      1.1    jruoho     /*
    270      1.1    jruoho      * Check for the special AML integers first - Zero, One, Ones.
    271      1.1    jruoho      * These are single-byte opcodes that are the smallest possible
    272      1.1    jruoho      * representation of an integer.
    273      1.1    jruoho      *
    274      1.1    jruoho      * This optimization is optional.
    275      1.1    jruoho      */
    276      1.1    jruoho     if (Gbl_IntegerOptimizationFlag)
    277      1.1    jruoho     {
    278      1.1    jruoho         switch (Op->Asl.Value.Integer)
    279      1.1    jruoho         {
    280      1.1    jruoho         case 0:
    281      1.1    jruoho 
    282      1.1    jruoho             Op->Asl.AmlOpcode = AML_ZERO_OP;
    283      1.1    jruoho             AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION,
    284      1.1    jruoho                 Op, "Zero");
    285  1.1.1.3  christos             return (1);
    286      1.1    jruoho 
    287      1.1    jruoho         case 1:
    288      1.1    jruoho 
    289      1.1    jruoho             Op->Asl.AmlOpcode = AML_ONE_OP;
    290      1.1    jruoho             AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION,
    291      1.1    jruoho                 Op, "One");
    292  1.1.1.3  christos             return (1);
    293      1.1    jruoho 
    294      1.1    jruoho         case ACPI_UINT32_MAX:
    295      1.1    jruoho 
    296      1.1    jruoho             /* Check for table integer width (32 or 64) */
    297      1.1    jruoho 
    298      1.1    jruoho             if (AcpiGbl_IntegerByteWidth == 4)
    299      1.1    jruoho             {
    300      1.1    jruoho                 Op->Asl.AmlOpcode = AML_ONES_OP;
    301      1.1    jruoho                 AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION,
    302      1.1    jruoho                     Op, "Ones");
    303  1.1.1.3  christos                 return (1);
    304      1.1    jruoho             }
    305      1.1    jruoho             break;
    306      1.1    jruoho 
    307      1.1    jruoho         case ACPI_UINT64_MAX:
    308      1.1    jruoho 
    309      1.1    jruoho             /* Check for table integer width (32 or 64) */
    310      1.1    jruoho 
    311      1.1    jruoho             if (AcpiGbl_IntegerByteWidth == 8)
    312      1.1    jruoho             {
    313      1.1    jruoho                 Op->Asl.AmlOpcode = AML_ONES_OP;
    314      1.1    jruoho                 AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION,
    315      1.1    jruoho                     Op, "Ones");
    316  1.1.1.3  christos                 return (1);
    317      1.1    jruoho             }
    318      1.1    jruoho             break;
    319      1.1    jruoho 
    320      1.1    jruoho         default:
    321  1.1.1.3  christos 
    322      1.1    jruoho             break;
    323      1.1    jruoho         }
    324      1.1    jruoho     }
    325      1.1    jruoho 
    326      1.1    jruoho     /* Find the best fit using the various AML integer prefixes */
    327      1.1    jruoho 
    328      1.1    jruoho     if (Op->Asl.Value.Integer <= ACPI_UINT8_MAX)
    329      1.1    jruoho     {
    330      1.1    jruoho         Op->Asl.AmlOpcode = AML_BYTE_OP;
    331  1.1.1.3  christos         return (1);
    332      1.1    jruoho     }
    333      1.1    jruoho     if (Op->Asl.Value.Integer <= ACPI_UINT16_MAX)
    334      1.1    jruoho     {
    335      1.1    jruoho         Op->Asl.AmlOpcode = AML_WORD_OP;
    336  1.1.1.3  christos         return (2);
    337      1.1    jruoho     }
    338      1.1    jruoho     if (Op->Asl.Value.Integer <= ACPI_UINT32_MAX)
    339      1.1    jruoho     {
    340      1.1    jruoho         Op->Asl.AmlOpcode = AML_DWORD_OP;
    341  1.1.1.3  christos         return (4);
    342      1.1    jruoho     }
    343      1.1    jruoho     else
    344      1.1    jruoho     {
    345      1.1    jruoho         if (AcpiGbl_IntegerByteWidth == 4)
    346      1.1    jruoho         {
    347      1.1    jruoho             AslError (ASL_WARNING, ASL_MSG_INTEGER_LENGTH,
    348      1.1    jruoho                 Op, NULL);
    349      1.1    jruoho 
    350      1.1    jruoho             if (!Gbl_IgnoreErrors)
    351      1.1    jruoho             {
    352      1.1    jruoho                 /* Truncate the integer to 32-bit */
    353      1.1    jruoho                 Op->Asl.AmlOpcode = AML_DWORD_OP;
    354  1.1.1.3  christos                 return (4);
    355      1.1    jruoho             }
    356      1.1    jruoho         }
    357      1.1    jruoho 
    358      1.1    jruoho         Op->Asl.AmlOpcode = AML_QWORD_OP;
    359  1.1.1.3  christos         return (8);
    360      1.1    jruoho     }
    361      1.1    jruoho }
    362      1.1    jruoho 
    363      1.1    jruoho 
    364      1.1    jruoho /*******************************************************************************
    365      1.1    jruoho  *
    366      1.1    jruoho  * FUNCTION:    OpcDoAccessAs
    367      1.1    jruoho  *
    368      1.1    jruoho  * PARAMETERS:  Op        - Parse node
    369      1.1    jruoho  *
    370      1.1    jruoho  * RETURN:      None
    371      1.1    jruoho  *
    372      1.1    jruoho  * DESCRIPTION: Implement the ACCESS_AS ASL keyword.
    373      1.1    jruoho  *
    374      1.1    jruoho  ******************************************************************************/
    375      1.1    jruoho 
    376      1.1    jruoho static void
    377      1.1    jruoho OpcDoAccessAs (
    378      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    379      1.1    jruoho {
    380  1.1.1.3  christos     ACPI_PARSE_OBJECT       *TypeOp;
    381  1.1.1.3  christos     ACPI_PARSE_OBJECT       *AttribOp;
    382  1.1.1.3  christos     ACPI_PARSE_OBJECT       *LengthOp;
    383  1.1.1.3  christos     UINT8                   Attribute;
    384      1.1    jruoho 
    385      1.1    jruoho 
    386      1.1    jruoho     Op->Asl.AmlOpcodeLength = 1;
    387  1.1.1.3  christos     TypeOp = Op->Asl.Child;
    388      1.1    jruoho 
    389      1.1    jruoho     /* First child is the access type */
    390      1.1    jruoho 
    391  1.1.1.3  christos     TypeOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
    392  1.1.1.3  christos     TypeOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
    393      1.1    jruoho 
    394      1.1    jruoho     /* Second child is the optional access attribute */
    395      1.1    jruoho 
    396  1.1.1.3  christos     AttribOp = TypeOp->Asl.Next;
    397  1.1.1.3  christos     if (AttribOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
    398  1.1.1.3  christos     {
    399  1.1.1.3  christos         AttribOp->Asl.Value.Integer = 0;
    400  1.1.1.3  christos     }
    401  1.1.1.3  christos     AttribOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
    402  1.1.1.3  christos     AttribOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
    403  1.1.1.3  christos 
    404  1.1.1.3  christos     /* Only a few AccessAttributes support AccessLength */
    405  1.1.1.3  christos 
    406  1.1.1.3  christos     Attribute = (UINT8) AttribOp->Asl.Value.Integer;
    407  1.1.1.3  christos     if ((Attribute != AML_FIELD_ATTRIB_MULTIBYTE) &&
    408  1.1.1.3  christos         (Attribute != AML_FIELD_ATTRIB_RAW_BYTES) &&
    409  1.1.1.3  christos         (Attribute != AML_FIELD_ATTRIB_RAW_PROCESS))
    410  1.1.1.3  christos     {
    411  1.1.1.3  christos         return;
    412  1.1.1.3  christos     }
    413  1.1.1.3  christos 
    414  1.1.1.3  christos     Op->Asl.AmlOpcode = AML_FIELD_EXT_ACCESS_OP;
    415  1.1.1.3  christos 
    416  1.1.1.3  christos     /*
    417  1.1.1.3  christos      * Child of Attributes is the AccessLength (required for Multibyte,
    418  1.1.1.3  christos      * RawBytes, RawProcess.)
    419  1.1.1.3  christos      */
    420  1.1.1.3  christos     LengthOp = AttribOp->Asl.Child;
    421  1.1.1.3  christos     if (!LengthOp)
    422  1.1.1.3  christos     {
    423  1.1.1.3  christos         return;
    424  1.1.1.3  christos     }
    425  1.1.1.3  christos 
    426  1.1.1.3  christos     /* TBD: probably can remove */
    427  1.1.1.3  christos 
    428  1.1.1.3  christos     if (LengthOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
    429  1.1.1.3  christos     {
    430  1.1.1.3  christos         LengthOp->Asl.Value.Integer = 16;
    431  1.1.1.3  christos     }
    432  1.1.1.3  christos 
    433  1.1.1.3  christos     LengthOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
    434  1.1.1.3  christos     LengthOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
    435  1.1.1.3  christos }
    436  1.1.1.3  christos 
    437  1.1.1.3  christos 
    438  1.1.1.3  christos /*******************************************************************************
    439  1.1.1.3  christos  *
    440  1.1.1.3  christos  * FUNCTION:    OpcDoConnection
    441  1.1.1.3  christos  *
    442  1.1.1.3  christos  * PARAMETERS:  Op        - Parse node
    443  1.1.1.3  christos  *
    444  1.1.1.3  christos  * RETURN:      None
    445  1.1.1.3  christos  *
    446  1.1.1.3  christos  * DESCRIPTION: Implement the Connection ASL keyword.
    447  1.1.1.3  christos  *
    448  1.1.1.3  christos  ******************************************************************************/
    449  1.1.1.3  christos 
    450  1.1.1.3  christos static void
    451  1.1.1.3  christos OpcDoConnection (
    452  1.1.1.3  christos     ACPI_PARSE_OBJECT       *Op)
    453  1.1.1.3  christos {
    454  1.1.1.3  christos     ASL_RESOURCE_NODE       *Rnode;
    455  1.1.1.3  christos     ACPI_PARSE_OBJECT       *BufferOp;
    456  1.1.1.3  christos     ACPI_PARSE_OBJECT       *BufferLengthOp;
    457  1.1.1.3  christos     ACPI_PARSE_OBJECT       *BufferDataOp;
    458  1.1.1.4  christos     ASL_RESOURCE_INFO       Info;
    459  1.1.1.3  christos     UINT8                   State;
    460  1.1.1.3  christos 
    461  1.1.1.3  christos 
    462  1.1.1.3  christos     Op->Asl.AmlOpcodeLength = 1;
    463  1.1.1.3  christos 
    464  1.1.1.3  christos     if (Op->Asl.Child->Asl.AmlOpcode == AML_INT_NAMEPATH_OP)
    465  1.1.1.3  christos     {
    466  1.1.1.3  christos         return;
    467  1.1.1.3  christos     }
    468  1.1.1.3  christos 
    469  1.1.1.3  christos     BufferOp = Op->Asl.Child;
    470  1.1.1.3  christos     BufferLengthOp = BufferOp->Asl.Child;
    471  1.1.1.3  christos     BufferDataOp = BufferLengthOp->Asl.Next;
    472  1.1.1.3  christos 
    473  1.1.1.4  christos     Info.DescriptorTypeOp = BufferDataOp->Asl.Next;
    474  1.1.1.4  christos     Info.CurrentByteOffset = 0;
    475  1.1.1.3  christos     State = ACPI_RSTATE_NORMAL;
    476  1.1.1.4  christos     Rnode = RsDoOneResourceDescriptor (&Info, &State);
    477  1.1.1.3  christos     if (!Rnode)
    478      1.1    jruoho     {
    479  1.1.1.3  christos         return; /* error */
    480      1.1    jruoho     }
    481  1.1.1.3  christos 
    482  1.1.1.3  christos     /*
    483  1.1.1.3  christos      * Transform the nodes into the following
    484  1.1.1.3  christos      *
    485  1.1.1.3  christos      * Op           -> AML_BUFFER_OP
    486  1.1.1.3  christos      * First Child  -> BufferLength
    487  1.1.1.3  christos      * Second Child -> Descriptor Buffer (raw byte data)
    488  1.1.1.3  christos      */
    489  1.1.1.3  christos     BufferOp->Asl.ParseOpcode         = PARSEOP_BUFFER;
    490  1.1.1.3  christos     BufferOp->Asl.AmlOpcode           = AML_BUFFER_OP;
    491  1.1.1.3  christos     BufferOp->Asl.CompileFlags        = NODE_AML_PACKAGE | NODE_IS_RESOURCE_DESC;
    492  1.1.1.3  christos     UtSetParseOpName (BufferOp);
    493  1.1.1.3  christos 
    494  1.1.1.3  christos     BufferLengthOp->Asl.ParseOpcode   = PARSEOP_INTEGER;
    495  1.1.1.3  christos     BufferLengthOp->Asl.Value.Integer = Rnode->BufferLength;
    496  1.1.1.3  christos     (void) OpcSetOptimalIntegerSize (BufferLengthOp);
    497  1.1.1.3  christos     UtSetParseOpName (BufferLengthOp);
    498  1.1.1.3  christos 
    499  1.1.1.3  christos     BufferDataOp->Asl.ParseOpcode         = PARSEOP_RAW_DATA;
    500  1.1.1.3  christos     BufferDataOp->Asl.AmlOpcode           = AML_RAW_DATA_CHAIN;
    501  1.1.1.3  christos     BufferDataOp->Asl.AmlOpcodeLength     = 0;
    502  1.1.1.3  christos     BufferDataOp->Asl.AmlLength           = Rnode->BufferLength;
    503  1.1.1.3  christos     BufferDataOp->Asl.Value.Buffer        = (UINT8 *) Rnode;
    504  1.1.1.3  christos     UtSetParseOpName (BufferDataOp);
    505      1.1    jruoho }
    506      1.1    jruoho 
    507      1.1    jruoho 
    508      1.1    jruoho /*******************************************************************************
    509      1.1    jruoho  *
    510      1.1    jruoho  * FUNCTION:    OpcDoUnicode
    511      1.1    jruoho  *
    512      1.1    jruoho  * PARAMETERS:  Op        - Parse node
    513      1.1    jruoho  *
    514      1.1    jruoho  * RETURN:      None
    515      1.1    jruoho  *
    516      1.1    jruoho  * DESCRIPTION: Implement the UNICODE ASL "macro".  Convert the input string
    517  1.1.1.3  christos  *              to a unicode buffer. There is no Unicode AML opcode.
    518      1.1    jruoho  *
    519      1.1    jruoho  * Note:  The Unicode string is 16 bits per character, no leading signature,
    520      1.1    jruoho  *        with a 16-bit terminating NULL.
    521      1.1    jruoho  *
    522      1.1    jruoho  ******************************************************************************/
    523      1.1    jruoho 
    524      1.1    jruoho static void
    525      1.1    jruoho OpcDoUnicode (
    526      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    527      1.1    jruoho {
    528      1.1    jruoho     ACPI_PARSE_OBJECT       *InitializerOp;
    529      1.1    jruoho     UINT32                  Length;
    530      1.1    jruoho     UINT32                  Count;
    531      1.1    jruoho     UINT32                  i;
    532      1.1    jruoho     UINT8                   *AsciiString;
    533      1.1    jruoho     UINT16                  *UnicodeString;
    534      1.1    jruoho     ACPI_PARSE_OBJECT       *BufferLengthOp;
    535      1.1    jruoho 
    536      1.1    jruoho 
    537      1.1    jruoho     /* Change op into a buffer object */
    538      1.1    jruoho 
    539      1.1    jruoho     Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST;
    540      1.1    jruoho     Op->Asl.ParseOpcode = PARSEOP_BUFFER;
    541      1.1    jruoho     UtSetParseOpName (Op);
    542      1.1    jruoho 
    543      1.1    jruoho     /* Buffer Length is first, followed by the string */
    544      1.1    jruoho 
    545      1.1    jruoho     BufferLengthOp = Op->Asl.Child;
    546      1.1    jruoho     InitializerOp = BufferLengthOp->Asl.Next;
    547      1.1    jruoho 
    548      1.1    jruoho     AsciiString = (UINT8 *) InitializerOp->Asl.Value.String;
    549      1.1    jruoho 
    550      1.1    jruoho     /* Create a new buffer for the Unicode string */
    551      1.1    jruoho 
    552      1.1    jruoho     Count = strlen (InitializerOp->Asl.Value.String) + 1;
    553      1.1    jruoho     Length = Count * sizeof (UINT16);
    554      1.1    jruoho     UnicodeString = UtLocalCalloc (Length);
    555      1.1    jruoho 
    556      1.1    jruoho     /* Convert to Unicode string (including null terminator) */
    557      1.1    jruoho 
    558      1.1    jruoho     for (i = 0; i < Count; i++)
    559      1.1    jruoho     {
    560      1.1    jruoho         UnicodeString[i] = (UINT16) AsciiString[i];
    561      1.1    jruoho     }
    562      1.1    jruoho 
    563      1.1    jruoho     /*
    564      1.1    jruoho      * Just set the buffer size node to be the buffer length, regardless
    565      1.1    jruoho      * of whether it was previously an integer or a default_arg placeholder
    566      1.1    jruoho      */
    567      1.1    jruoho     BufferLengthOp->Asl.ParseOpcode   = PARSEOP_INTEGER;
    568      1.1    jruoho     BufferLengthOp->Asl.AmlOpcode     = AML_DWORD_OP;
    569      1.1    jruoho     BufferLengthOp->Asl.Value.Integer = Length;
    570      1.1    jruoho     UtSetParseOpName (BufferLengthOp);
    571      1.1    jruoho 
    572      1.1    jruoho     (void) OpcSetOptimalIntegerSize (BufferLengthOp);
    573      1.1    jruoho 
    574      1.1    jruoho     /* The Unicode string is a raw data buffer */
    575      1.1    jruoho 
    576      1.1    jruoho     InitializerOp->Asl.Value.Buffer   = (UINT8 *) UnicodeString;
    577      1.1    jruoho     InitializerOp->Asl.AmlOpcode      = AML_RAW_DATA_BUFFER;
    578      1.1    jruoho     InitializerOp->Asl.AmlLength      = Length;
    579      1.1    jruoho     InitializerOp->Asl.ParseOpcode    = PARSEOP_RAW_DATA;
    580      1.1    jruoho     InitializerOp->Asl.Child          = NULL;
    581      1.1    jruoho     UtSetParseOpName (InitializerOp);
    582      1.1    jruoho }
    583      1.1    jruoho 
    584      1.1    jruoho 
    585      1.1    jruoho /*******************************************************************************
    586      1.1    jruoho  *
    587      1.1    jruoho  * FUNCTION:    OpcDoEisaId
    588      1.1    jruoho  *
    589      1.1    jruoho  * PARAMETERS:  Op        - Parse node
    590      1.1    jruoho  *
    591      1.1    jruoho  * RETURN:      None
    592      1.1    jruoho  *
    593  1.1.1.3  christos  * DESCRIPTION: Convert a string EISA ID to numeric representation. See the
    594  1.1.1.3  christos  *              Pnp BIOS Specification for details. Here is an excerpt:
    595      1.1    jruoho  *
    596      1.1    jruoho  *              A seven character ASCII representation of the product
    597  1.1.1.3  christos  *              identifier compressed into a 32-bit identifier. The seven
    598      1.1    jruoho  *              character ID consists of a three character manufacturer code,
    599      1.1    jruoho  *              a three character hexadecimal product identifier, and a one
    600  1.1.1.3  christos  *              character hexadecimal revision number. The manufacturer code
    601      1.1    jruoho  *              is a 3 uppercase character code that is compressed into 3 5-bit
    602      1.1    jruoho  *              values as follows:
    603      1.1    jruoho  *                  1) Find hex ASCII value for each letter
    604      1.1    jruoho  *                  2) Subtract 40h from each ASCII value
    605  1.1.1.3  christos  *                  3) Retain 5 least significant bits for each letter by
    606      1.1    jruoho  *                     discarding upper 3 bits because they are always 0.
    607      1.1    jruoho  *                  4) Compressed code = concatenate 0 and the 3 5-bit values
    608      1.1    jruoho  *
    609      1.1    jruoho  *              The format of the compressed product identifier is as follows:
    610      1.1    jruoho  *              Byte 0: Bit 7       - Reserved (0)
    611      1.1    jruoho  *                      Bits 6-2:   - 1st character of compressed mfg code
    612      1.1    jruoho  *                      Bits 1-0    - Upper 2 bits of 2nd character of mfg code
    613      1.1    jruoho  *              Byte 1: Bits 7-5    - Lower 3 bits of 2nd character of mfg code
    614      1.1    jruoho  *                      Bits 4-0    - 3rd character of mfg code
    615      1.1    jruoho  *              Byte 2: Bits 7-4    - 1st hex digit of product number
    616      1.1    jruoho  *                      Bits 3-0    - 2nd hex digit of product number
    617      1.1    jruoho  *              Byte 3: Bits 7-4    - 3st hex digit of product number
    618      1.1    jruoho  *                      Bits 3-0    - Hex digit of the revision number
    619      1.1    jruoho  *
    620      1.1    jruoho  ******************************************************************************/
    621      1.1    jruoho 
    622      1.1    jruoho static void
    623      1.1    jruoho OpcDoEisaId (
    624      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
    625      1.1    jruoho {
    626      1.1    jruoho     UINT32                  EisaId = 0;
    627      1.1    jruoho     UINT32                  BigEndianId;
    628      1.1    jruoho     char                    *InString;
    629      1.1    jruoho     ACPI_STATUS             Status = AE_OK;
    630      1.1    jruoho     UINT32                  i;
    631      1.1    jruoho 
    632      1.1    jruoho 
    633      1.1    jruoho     InString = (char *) Op->Asl.Value.String;
    634      1.1    jruoho 
    635      1.1    jruoho     /*
    636      1.1    jruoho      * The EISAID string must be exactly 7 characters and of the form
    637      1.1    jruoho      * "UUUXXXX" -- 3 uppercase letters and 4 hex digits (e.g., "PNP0001")
    638      1.1    jruoho      */
    639  1.1.1.6  christos     if (strlen (InString) != 7)
    640      1.1    jruoho     {
    641      1.1    jruoho         Status = AE_BAD_PARAMETER;
    642      1.1    jruoho     }
    643      1.1    jruoho     else
    644      1.1    jruoho     {
    645      1.1    jruoho         /* Check all 7 characters for correct format */
    646      1.1    jruoho 
    647      1.1    jruoho         for (i = 0; i < 7; i++)
    648      1.1    jruoho         {
    649      1.1    jruoho             /* First 3 characters must be uppercase letters */
    650      1.1    jruoho 
    651      1.1    jruoho             if (i < 3)
    652      1.1    jruoho             {
    653      1.1    jruoho                 if (!isupper ((int) InString[i]))
    654      1.1    jruoho                 {
    655      1.1    jruoho                     Status = AE_BAD_PARAMETER;
    656      1.1    jruoho                 }
    657      1.1    jruoho             }
    658      1.1    jruoho 
    659      1.1    jruoho             /* Last 4 characters must be hex digits */
    660      1.1    jruoho 
    661      1.1    jruoho             else if (!isxdigit ((int) InString[i]))
    662      1.1    jruoho             {
    663      1.1    jruoho                 Status = AE_BAD_PARAMETER;
    664      1.1    jruoho             }
    665      1.1    jruoho         }
    666      1.1    jruoho     }
    667      1.1    jruoho 
    668      1.1    jruoho     if (ACPI_FAILURE (Status))
    669      1.1    jruoho     {
    670      1.1    jruoho         AslError (ASL_ERROR, ASL_MSG_INVALID_EISAID, Op, Op->Asl.Value.String);
    671      1.1    jruoho     }
    672      1.1    jruoho     else
    673      1.1    jruoho     {
    674      1.1    jruoho         /* Create ID big-endian first (bits are contiguous) */
    675      1.1    jruoho 
    676      1.1    jruoho         BigEndianId =
    677  1.1.1.2    jruoho             (UINT32) ((UINT8) (InString[0] - 0x40)) << 26 |
    678  1.1.1.2    jruoho             (UINT32) ((UINT8) (InString[1] - 0x40)) << 21 |
    679  1.1.1.2    jruoho             (UINT32) ((UINT8) (InString[2] - 0x40)) << 16 |
    680      1.1    jruoho 
    681  1.1.1.4  christos             (AcpiUtAsciiCharToHex (InString[3])) << 12 |
    682  1.1.1.4  christos             (AcpiUtAsciiCharToHex (InString[4])) << 8  |
    683  1.1.1.4  christos             (AcpiUtAsciiCharToHex (InString[5])) << 4  |
    684  1.1.1.4  christos              AcpiUtAsciiCharToHex (InString[6]);
    685      1.1    jruoho 
    686      1.1    jruoho         /* Swap to little-endian to get final ID (see function header) */
    687      1.1    jruoho 
    688      1.1    jruoho         EisaId = AcpiUtDwordByteSwap (BigEndianId);
    689      1.1    jruoho     }
    690      1.1    jruoho 
    691      1.1    jruoho     /*
    692      1.1    jruoho      * Morph the Op into an integer, regardless of whether there
    693      1.1    jruoho      * was an error in the EISAID string
    694      1.1    jruoho      */
    695      1.1    jruoho     Op->Asl.Value.Integer = EisaId;
    696      1.1    jruoho 
    697      1.1    jruoho     Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST;
    698      1.1    jruoho     Op->Asl.ParseOpcode = PARSEOP_INTEGER;
    699      1.1    jruoho     (void) OpcSetOptimalIntegerSize (Op);
    700      1.1    jruoho 
    701      1.1    jruoho     /* Op is now an integer */
    702      1.1    jruoho 
    703      1.1    jruoho     UtSetParseOpName (Op);
    704      1.1    jruoho }
    705      1.1    jruoho 
    706      1.1    jruoho 
    707      1.1    jruoho /*******************************************************************************
    708      1.1    jruoho  *
    709  1.1.1.5  christos  * FUNCTION:    OpcEncodePldBuffer
    710  1.1.1.5  christos  *
    711  1.1.1.5  christos  * PARAMETERS:  PldInfo             - _PLD buffer struct (Using local struct)
    712  1.1.1.5  christos  *
    713  1.1.1.5  christos  * RETURN:      Encode _PLD buffer suitable for return value from _PLD
    714  1.1.1.5  christos  *
    715  1.1.1.5  christos  * DESCRIPTION: Bit-packs a _PLD buffer struct.
    716  1.1.1.5  christos  *
    717  1.1.1.5  christos  ******************************************************************************/
    718  1.1.1.5  christos 
    719  1.1.1.5  christos static UINT8 *
    720  1.1.1.5  christos OpcEncodePldBuffer (
    721  1.1.1.5  christos     ACPI_PLD_INFO           *PldInfo)
    722  1.1.1.5  christos {
    723  1.1.1.5  christos     UINT32                  *Buffer;
    724  1.1.1.5  christos     UINT32                  Dword;
    725  1.1.1.5  christos 
    726  1.1.1.5  christos 
    727  1.1.1.5  christos     Buffer = ACPI_ALLOCATE_ZEROED (ACPI_PLD_BUFFER_SIZE);
    728  1.1.1.5  christos     if (!Buffer)
    729  1.1.1.5  christos     {
    730  1.1.1.5  christos         return (NULL);
    731  1.1.1.5  christos     }
    732  1.1.1.5  christos 
    733  1.1.1.5  christos     /* First 32 bits */
    734  1.1.1.5  christos 
    735  1.1.1.5  christos     Dword = 0;
    736  1.1.1.5  christos     ACPI_PLD_SET_REVISION       (&Dword, PldInfo->Revision);
    737  1.1.1.5  christos     ACPI_PLD_SET_IGNORE_COLOR   (&Dword, PldInfo->IgnoreColor);
    738  1.1.1.5  christos     ACPI_PLD_SET_RED            (&Dword, PldInfo->Red);
    739  1.1.1.5  christos     ACPI_PLD_SET_GREEN          (&Dword, PldInfo->Green);
    740  1.1.1.5  christos     ACPI_PLD_SET_BLUE           (&Dword, PldInfo->Blue);
    741  1.1.1.5  christos     ACPI_MOVE_32_TO_32          (&Buffer[0], &Dword);
    742  1.1.1.5  christos 
    743  1.1.1.5  christos     /* Second 32 bits */
    744  1.1.1.5  christos 
    745  1.1.1.5  christos     Dword = 0;
    746  1.1.1.5  christos     ACPI_PLD_SET_WIDTH          (&Dword, PldInfo->Width);
    747  1.1.1.5  christos     ACPI_PLD_SET_HEIGHT         (&Dword, PldInfo->Height);
    748  1.1.1.5  christos     ACPI_MOVE_32_TO_32          (&Buffer[1], &Dword);
    749  1.1.1.5  christos 
    750  1.1.1.5  christos     /* Third 32 bits */
    751  1.1.1.5  christos 
    752  1.1.1.5  christos     Dword = 0;
    753  1.1.1.5  christos     ACPI_PLD_SET_USER_VISIBLE   (&Dword, PldInfo->UserVisible);
    754  1.1.1.5  christos     ACPI_PLD_SET_DOCK           (&Dword, PldInfo->Dock);
    755  1.1.1.5  christos     ACPI_PLD_SET_LID            (&Dword, PldInfo->Lid);
    756  1.1.1.5  christos     ACPI_PLD_SET_PANEL          (&Dword, PldInfo->Panel);
    757  1.1.1.5  christos     ACPI_PLD_SET_VERTICAL       (&Dword, PldInfo->VerticalPosition);
    758  1.1.1.5  christos     ACPI_PLD_SET_HORIZONTAL     (&Dword, PldInfo->HorizontalPosition);
    759  1.1.1.5  christos     ACPI_PLD_SET_SHAPE          (&Dword, PldInfo->Shape);
    760  1.1.1.5  christos     ACPI_PLD_SET_ORIENTATION    (&Dword, PldInfo->GroupOrientation);
    761  1.1.1.5  christos     ACPI_PLD_SET_TOKEN          (&Dword, PldInfo->GroupToken);
    762  1.1.1.5  christos     ACPI_PLD_SET_POSITION       (&Dword, PldInfo->GroupPosition);
    763  1.1.1.5  christos     ACPI_PLD_SET_BAY            (&Dword, PldInfo->Bay);
    764  1.1.1.5  christos     ACPI_MOVE_32_TO_32          (&Buffer[2], &Dword);
    765  1.1.1.5  christos 
    766  1.1.1.5  christos     /* Fourth 32 bits */
    767  1.1.1.5  christos 
    768  1.1.1.5  christos     Dword = 0;
    769  1.1.1.5  christos     ACPI_PLD_SET_EJECTABLE      (&Dword, PldInfo->Ejectable);
    770  1.1.1.5  christos     ACPI_PLD_SET_OSPM_EJECT     (&Dword, PldInfo->OspmEjectRequired);
    771  1.1.1.5  christos     ACPI_PLD_SET_CABINET        (&Dword, PldInfo->CabinetNumber);
    772  1.1.1.5  christos     ACPI_PLD_SET_CARD_CAGE      (&Dword, PldInfo->CardCageNumber);
    773  1.1.1.5  christos     ACPI_PLD_SET_REFERENCE      (&Dword, PldInfo->Reference);
    774  1.1.1.5  christos     ACPI_PLD_SET_ROTATION       (&Dword, PldInfo->Rotation);
    775  1.1.1.5  christos     ACPI_PLD_SET_ORDER          (&Dword, PldInfo->Order);
    776  1.1.1.5  christos     ACPI_MOVE_32_TO_32          (&Buffer[3], &Dword);
    777  1.1.1.5  christos 
    778  1.1.1.5  christos     if (PldInfo->Revision >= 2)
    779  1.1.1.5  christos     {
    780  1.1.1.5  christos         /* Fifth 32 bits */
    781  1.1.1.5  christos 
    782  1.1.1.5  christos         Dword = 0;
    783  1.1.1.5  christos         ACPI_PLD_SET_VERT_OFFSET    (&Dword, PldInfo->VerticalOffset);
    784  1.1.1.5  christos         ACPI_PLD_SET_HORIZ_OFFSET   (&Dword, PldInfo->HorizontalOffset);
    785  1.1.1.5  christos         ACPI_MOVE_32_TO_32          (&Buffer[4], &Dword);
    786  1.1.1.5  christos     }
    787  1.1.1.5  christos 
    788  1.1.1.5  christos     return (ACPI_CAST_PTR (UINT8, Buffer));
    789  1.1.1.5  christos }
    790  1.1.1.5  christos 
    791  1.1.1.5  christos 
    792  1.1.1.5  christos /*******************************************************************************
    793  1.1.1.5  christos  *
    794  1.1.1.5  christos  * FUNCTION:    OpcFindName
    795  1.1.1.5  christos  *
    796  1.1.1.5  christos  * PARAMETERS:  List                - Array of char strings to be searched
    797  1.1.1.5  christos  *              Name                - Char string to string for
    798  1.1.1.5  christos  *              Index               - Index value to set if found
    799  1.1.1.5  christos  *
    800  1.1.1.5  christos  * RETURN:      TRUE if any names matched, FALSE otherwise
    801  1.1.1.5  christos  *
    802  1.1.1.5  christos  * DESCRIPTION: Match PLD name to value in lookup table. Sets Value to
    803  1.1.1.5  christos  *              equivalent parameter value.
    804  1.1.1.5  christos  *
    805  1.1.1.5  christos  ******************************************************************************/
    806  1.1.1.5  christos 
    807  1.1.1.5  christos static BOOLEAN
    808  1.1.1.5  christos OpcFindName (
    809  1.1.1.5  christos     char                    **List,
    810  1.1.1.5  christos     char                    *Name,
    811  1.1.1.5  christos     UINT64                  *Index)
    812  1.1.1.5  christos {
    813  1.1.1.5  christos     char                     *Str;
    814  1.1.1.5  christos     UINT32                   i;
    815  1.1.1.5  christos 
    816  1.1.1.5  christos 
    817  1.1.1.6  christos     AcpiUtStrupr (Name);
    818  1.1.1.5  christos 
    819  1.1.1.5  christos     for (i = 0, Str = List[0]; Str; i++, Str = List[i])
    820  1.1.1.5  christos     {
    821  1.1.1.6  christos         if (!(strncmp (Str, Name, strlen (Name))))
    822  1.1.1.5  christos         {
    823  1.1.1.5  christos             *Index = i;
    824  1.1.1.5  christos             return (TRUE);
    825  1.1.1.5  christos         }
    826  1.1.1.5  christos     }
    827  1.1.1.5  christos 
    828  1.1.1.5  christos     return (FALSE);
    829  1.1.1.5  christos }
    830  1.1.1.5  christos 
    831  1.1.1.5  christos 
    832  1.1.1.5  christos /*******************************************************************************
    833  1.1.1.5  christos  *
    834  1.1.1.5  christos  * FUNCTION:    OpcDoPld
    835  1.1.1.5  christos  *
    836  1.1.1.5  christos  * PARAMETERS:  Op                  - Parse node
    837  1.1.1.5  christos  *
    838  1.1.1.5  christos  * RETURN:      None
    839  1.1.1.5  christos  *
    840  1.1.1.5  christos  * DESCRIPTION: Convert ToPLD macro to 20-byte buffer
    841  1.1.1.5  christos  *
    842  1.1.1.5  christos  ******************************************************************************/
    843  1.1.1.5  christos 
    844  1.1.1.5  christos static void
    845  1.1.1.5  christos OpcDoPld (
    846  1.1.1.5  christos     ACPI_PARSE_OBJECT       *Op)
    847  1.1.1.5  christos {
    848  1.1.1.5  christos     UINT8                   *Buffer;
    849  1.1.1.5  christos     ACPI_PARSE_OBJECT       *Node;
    850  1.1.1.5  christos     ACPI_PLD_INFO           PldInfo;
    851  1.1.1.5  christos     ACPI_PARSE_OBJECT       *NewOp;
    852  1.1.1.5  christos 
    853  1.1.1.5  christos 
    854  1.1.1.5  christos     if (!Op)
    855  1.1.1.5  christos     {
    856  1.1.1.5  christos         AslError(ASL_ERROR, ASL_MSG_NOT_EXIST, Op, NULL);
    857  1.1.1.5  christos         return;
    858  1.1.1.5  christos     }
    859  1.1.1.5  christos 
    860  1.1.1.5  christos     if (Op->Asl.ParseOpcode != PARSEOP_TOPLD)
    861  1.1.1.5  christos     {
    862  1.1.1.5  christos         AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Op, NULL);
    863  1.1.1.5  christos         return;
    864  1.1.1.5  christos     }
    865  1.1.1.5  christos 
    866  1.1.1.6  christos     memset (&PldInfo, 0, sizeof (ACPI_PLD_INFO));
    867  1.1.1.5  christos 
    868  1.1.1.5  christos     Node = Op->Asl.Child;
    869  1.1.1.5  christos     while (Node)
    870  1.1.1.5  christos     {
    871  1.1.1.5  christos         switch (Node->Asl.ParseOpcode)
    872  1.1.1.5  christos         {
    873  1.1.1.5  christos         case PARSEOP_PLD_REVISION:
    874  1.1.1.5  christos 
    875  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER)
    876  1.1.1.5  christos             {
    877  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL);
    878  1.1.1.5  christos                 break;
    879  1.1.1.5  christos             }
    880  1.1.1.5  christos 
    881  1.1.1.5  christos             if (Node->Asl.Child->Asl.Value.Integer > 127)
    882  1.1.1.5  christos             {
    883  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
    884  1.1.1.5  christos                 break;
    885  1.1.1.5  christos             }
    886  1.1.1.5  christos 
    887  1.1.1.5  christos             PldInfo.Revision = (UINT8) Node->Asl.Child->Asl.Value.Integer;
    888  1.1.1.5  christos             break;
    889  1.1.1.5  christos 
    890  1.1.1.5  christos         case PARSEOP_PLD_IGNORECOLOR:
    891  1.1.1.5  christos 
    892  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER)
    893  1.1.1.5  christos             {
    894  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL);
    895  1.1.1.5  christos                 break;
    896  1.1.1.5  christos             }
    897  1.1.1.5  christos 
    898  1.1.1.5  christos             if (Node->Asl.Child->Asl.Value.Integer > 1)
    899  1.1.1.5  christos             {
    900  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
    901  1.1.1.5  christos                 break;
    902  1.1.1.5  christos             }
    903  1.1.1.5  christos 
    904  1.1.1.5  christos             PldInfo.IgnoreColor = (UINT8) Node->Asl.Child->Asl.Value.Integer;
    905  1.1.1.5  christos             break;
    906  1.1.1.5  christos 
    907  1.1.1.5  christos         case PARSEOP_PLD_RED:
    908  1.1.1.5  christos         case PARSEOP_PLD_GREEN:
    909  1.1.1.5  christos         case PARSEOP_PLD_BLUE:
    910  1.1.1.5  christos 
    911  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER)
    912  1.1.1.5  christos             {
    913  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
    914  1.1.1.5  christos                 break;
    915  1.1.1.5  christos             }
    916  1.1.1.5  christos 
    917  1.1.1.5  christos             if (Node->Asl.Child->Asl.Value.Integer > 255)
    918  1.1.1.5  christos             {
    919  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
    920  1.1.1.5  christos                 break;
    921  1.1.1.5  christos             }
    922  1.1.1.5  christos 
    923  1.1.1.5  christos             if (Node->Asl.ParseOpcode == PARSEOP_PLD_RED)
    924  1.1.1.5  christos             {
    925  1.1.1.5  christos                 PldInfo.Red = (UINT8) Node->Asl.Child->Asl.Value.Integer;
    926  1.1.1.5  christos             }
    927  1.1.1.5  christos             else if (Node->Asl.ParseOpcode == PARSEOP_PLD_GREEN)
    928  1.1.1.5  christos             {
    929  1.1.1.5  christos                 PldInfo.Green = (UINT8) Node->Asl.Child->Asl.Value.Integer;
    930  1.1.1.5  christos             }
    931  1.1.1.5  christos             else /* PARSEOP_PLD_BLUE */
    932  1.1.1.5  christos             {
    933  1.1.1.5  christos                 PldInfo.Blue = (UINT8) Node->Asl.Child->Asl.Value.Integer;
    934  1.1.1.5  christos             }
    935  1.1.1.5  christos             break;
    936  1.1.1.5  christos 
    937  1.1.1.5  christos         case PARSEOP_PLD_WIDTH:
    938  1.1.1.5  christos         case PARSEOP_PLD_HEIGHT:
    939  1.1.1.5  christos 
    940  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER)
    941  1.1.1.5  christos             {
    942  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL);
    943  1.1.1.5  christos                 break;
    944  1.1.1.5  christos             }
    945  1.1.1.5  christos 
    946  1.1.1.5  christos             if (Node->Asl.Child->Asl.Value.Integer > 65535)
    947  1.1.1.5  christos             {
    948  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
    949  1.1.1.5  christos                 break;
    950  1.1.1.5  christos             }
    951  1.1.1.5  christos 
    952  1.1.1.5  christos             if (Node->Asl.ParseOpcode == PARSEOP_PLD_WIDTH)
    953  1.1.1.5  christos             {
    954  1.1.1.5  christos                 PldInfo.Width = (UINT16) Node->Asl.Child->Asl.Value.Integer;
    955  1.1.1.5  christos             }
    956  1.1.1.5  christos             else /* PARSEOP_PLD_HEIGHT */
    957  1.1.1.5  christos             {
    958  1.1.1.5  christos                 PldInfo.Height = (UINT16) Node->Asl.Child->Asl.Value.Integer;
    959  1.1.1.5  christos             }
    960  1.1.1.5  christos 
    961  1.1.1.5  christos             break;
    962  1.1.1.5  christos 
    963  1.1.1.5  christos         case PARSEOP_PLD_USERVISIBLE:
    964  1.1.1.5  christos         case PARSEOP_PLD_DOCK:
    965  1.1.1.5  christos         case PARSEOP_PLD_LID:
    966  1.1.1.5  christos 
    967  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER)
    968  1.1.1.5  christos             {
    969  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL);
    970  1.1.1.5  christos                 break;
    971  1.1.1.5  christos             }
    972  1.1.1.5  christos 
    973  1.1.1.5  christos             if (Node->Asl.Child->Asl.Value.Integer > 1)
    974  1.1.1.5  christos             {
    975  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
    976  1.1.1.5  christos                 break;
    977  1.1.1.5  christos             }
    978  1.1.1.5  christos 
    979  1.1.1.5  christos             if (Node->Asl.ParseOpcode == PARSEOP_PLD_USERVISIBLE)
    980  1.1.1.5  christos             {
    981  1.1.1.5  christos                 PldInfo.UserVisible = (UINT8) Node->Asl.Child->Asl.Value.Integer;
    982  1.1.1.5  christos             }
    983  1.1.1.5  christos             else if (Node->Asl.ParseOpcode == PARSEOP_PLD_DOCK)
    984  1.1.1.5  christos             {
    985  1.1.1.5  christos                 PldInfo.Dock = (UINT8) Node->Asl.Child->Asl.Value.Integer;
    986  1.1.1.5  christos             }
    987  1.1.1.5  christos             else
    988  1.1.1.5  christos             {
    989  1.1.1.5  christos                 PldInfo.Lid = (UINT8) Node->Asl.Child->Asl.Value.Integer;
    990  1.1.1.5  christos             }
    991  1.1.1.5  christos 
    992  1.1.1.5  christos             break;
    993  1.1.1.5  christos 
    994  1.1.1.5  christos         case PARSEOP_PLD_PANEL:
    995  1.1.1.5  christos 
    996  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode == PARSEOP_INTEGER)
    997  1.1.1.5  christos             {
    998  1.1.1.5  christos                 if (Node->Asl.Child->Asl.Value.Integer > 6)
    999  1.1.1.5  christos                 {
   1000  1.1.1.5  christos                     AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
   1001  1.1.1.5  christos                     break;
   1002  1.1.1.5  christos                 }
   1003  1.1.1.5  christos             }
   1004  1.1.1.5  christos             else /* PARSEOP_STRING */
   1005  1.1.1.5  christos             {
   1006  1.1.1.5  christos                 if (!OpcFindName(AslPldPanelList,
   1007  1.1.1.5  christos                     Node->Asl.Child->Asl.Value.String,
   1008  1.1.1.5  christos                     &Node->Asl.Child->Asl.Value.Integer))
   1009  1.1.1.5  christos                 {
   1010  1.1.1.5  christos                     AslError(ASL_ERROR, ASL_MSG_INVALID_OPERAND, Node, NULL);
   1011  1.1.1.5  christos                     break;
   1012  1.1.1.5  christos                 }
   1013  1.1.1.5  christos             }
   1014  1.1.1.5  christos 
   1015  1.1.1.5  christos             PldInfo.Panel = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1016  1.1.1.5  christos             break;
   1017  1.1.1.5  christos 
   1018  1.1.1.5  christos         case PARSEOP_PLD_VERTICALPOSITION:
   1019  1.1.1.5  christos 
   1020  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode == PARSEOP_INTEGER)
   1021  1.1.1.5  christos             {
   1022  1.1.1.5  christos                 if (Node->Asl.Child->Asl.Value.Integer > 2)
   1023  1.1.1.5  christos                 {
   1024  1.1.1.5  christos                     AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
   1025  1.1.1.5  christos                     break;
   1026  1.1.1.5  christos                 }
   1027  1.1.1.5  christos             }
   1028  1.1.1.5  christos             else /* PARSEOP_STRING */
   1029  1.1.1.5  christos             {
   1030  1.1.1.5  christos                 if (!OpcFindName(AslPldVerticalPositionList,
   1031  1.1.1.5  christos                     Node->Asl.Child->Asl.Value.String,
   1032  1.1.1.5  christos                     &Node->Asl.Child->Asl.Value.Integer))
   1033  1.1.1.5  christos                 {
   1034  1.1.1.5  christos                     AslError(ASL_ERROR, ASL_MSG_INVALID_OPERAND, Node, NULL);
   1035  1.1.1.5  christos                     break;
   1036  1.1.1.5  christos                 }
   1037  1.1.1.5  christos             }
   1038  1.1.1.5  christos 
   1039  1.1.1.5  christos             PldInfo.VerticalPosition = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1040  1.1.1.5  christos             break;
   1041  1.1.1.5  christos 
   1042  1.1.1.5  christos         case PARSEOP_PLD_HORIZONTALPOSITION:
   1043  1.1.1.5  christos 
   1044  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode == PARSEOP_INTEGER)
   1045  1.1.1.5  christos             {
   1046  1.1.1.5  christos                 if (Node->Asl.Child->Asl.Value.Integer > 2)
   1047  1.1.1.5  christos                 {
   1048  1.1.1.5  christos                     AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
   1049  1.1.1.5  christos                     break;
   1050  1.1.1.5  christos                 }
   1051  1.1.1.5  christos             }
   1052  1.1.1.5  christos             else /* PARSEOP_STRING */
   1053  1.1.1.5  christos             {
   1054  1.1.1.5  christos                 if (!OpcFindName(AslPldHorizontalPositionList,
   1055  1.1.1.5  christos                     Node->Asl.Child->Asl.Value.String,
   1056  1.1.1.5  christos                     &Node->Asl.Child->Asl.Value.Integer))
   1057  1.1.1.5  christos                 {
   1058  1.1.1.5  christos                     AslError(ASL_ERROR, ASL_MSG_INVALID_OPERAND, Node, NULL);
   1059  1.1.1.5  christos                     break;
   1060  1.1.1.5  christos                 }
   1061  1.1.1.5  christos             }
   1062  1.1.1.5  christos 
   1063  1.1.1.5  christos             PldInfo.HorizontalPosition = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1064  1.1.1.5  christos             break;
   1065  1.1.1.5  christos 
   1066  1.1.1.5  christos         case PARSEOP_PLD_SHAPE:
   1067  1.1.1.5  christos 
   1068  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode == PARSEOP_INTEGER)
   1069  1.1.1.5  christos             {
   1070  1.1.1.5  christos                 if (Node->Asl.Child->Asl.Value.Integer > 8)
   1071  1.1.1.5  christos                 {
   1072  1.1.1.5  christos                     AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
   1073  1.1.1.5  christos                     break;
   1074  1.1.1.5  christos                 }
   1075  1.1.1.5  christos             }
   1076  1.1.1.5  christos             else /* PARSEOP_STRING */
   1077  1.1.1.5  christos             {
   1078  1.1.1.5  christos                 if (!OpcFindName(AslPldShapeList,
   1079  1.1.1.5  christos                     Node->Asl.Child->Asl.Value.String,
   1080  1.1.1.5  christos                     &Node->Asl.Child->Asl.Value.Integer))
   1081  1.1.1.5  christos                 {
   1082  1.1.1.5  christos                     AslError(ASL_ERROR, ASL_MSG_INVALID_OPERAND, Node, NULL);
   1083  1.1.1.5  christos                     break;
   1084  1.1.1.5  christos                 }
   1085  1.1.1.5  christos             }
   1086  1.1.1.5  christos 
   1087  1.1.1.5  christos             PldInfo.Shape = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1088  1.1.1.5  christos             break;
   1089  1.1.1.5  christos 
   1090  1.1.1.5  christos         case PARSEOP_PLD_GROUPORIENTATION:
   1091  1.1.1.5  christos 
   1092  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER)
   1093  1.1.1.5  christos             {
   1094  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL);
   1095  1.1.1.5  christos                 break;
   1096  1.1.1.5  christos             }
   1097  1.1.1.5  christos 
   1098  1.1.1.5  christos             if (Node->Asl.Child->Asl.Value.Integer > 1)
   1099  1.1.1.5  christos             {
   1100  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
   1101  1.1.1.5  christos                 break;
   1102  1.1.1.5  christos             }
   1103  1.1.1.5  christos 
   1104  1.1.1.5  christos             PldInfo.GroupOrientation = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1105  1.1.1.5  christos             break;
   1106  1.1.1.5  christos 
   1107  1.1.1.5  christos         case PARSEOP_PLD_GROUPTOKEN:
   1108  1.1.1.5  christos         case PARSEOP_PLD_GROUPPOSITION:
   1109  1.1.1.5  christos 
   1110  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER)
   1111  1.1.1.5  christos             {
   1112  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL);
   1113  1.1.1.5  christos                 break;
   1114  1.1.1.5  christos             }
   1115  1.1.1.5  christos 
   1116  1.1.1.5  christos             if (Node->Asl.Child->Asl.Value.Integer > 255)
   1117  1.1.1.5  christos             {
   1118  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
   1119  1.1.1.5  christos                 break;
   1120  1.1.1.5  christos             }
   1121  1.1.1.5  christos 
   1122  1.1.1.5  christos 
   1123  1.1.1.5  christos             if (Node->Asl.ParseOpcode == PARSEOP_PLD_GROUPTOKEN)
   1124  1.1.1.5  christos             {
   1125  1.1.1.5  christos                 PldInfo.GroupToken = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1126  1.1.1.5  christos             }
   1127  1.1.1.5  christos             else /* PARSEOP_PLD_GROUPPOSITION */
   1128  1.1.1.5  christos             {
   1129  1.1.1.5  christos                 PldInfo.GroupPosition = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1130  1.1.1.5  christos             }
   1131  1.1.1.5  christos 
   1132  1.1.1.5  christos             break;
   1133  1.1.1.5  christos 
   1134  1.1.1.5  christos         case PARSEOP_PLD_BAY:
   1135  1.1.1.5  christos         case PARSEOP_PLD_EJECTABLE:
   1136  1.1.1.5  christos         case PARSEOP_PLD_EJECTREQUIRED:
   1137  1.1.1.5  christos 
   1138  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER)
   1139  1.1.1.5  christos             {
   1140  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL);
   1141  1.1.1.5  christos                 break;
   1142  1.1.1.5  christos             }
   1143  1.1.1.5  christos 
   1144  1.1.1.5  christos             if (Node->Asl.Child->Asl.Value.Integer > 1)
   1145  1.1.1.5  christos             {
   1146  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
   1147  1.1.1.5  christos                 break;
   1148  1.1.1.5  christos             }
   1149  1.1.1.5  christos 
   1150  1.1.1.5  christos             if (Node->Asl.ParseOpcode == PARSEOP_PLD_BAY)
   1151  1.1.1.5  christos             {
   1152  1.1.1.5  christos                 PldInfo.Bay = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1153  1.1.1.5  christos             }
   1154  1.1.1.5  christos             else if (Node->Asl.ParseOpcode == PARSEOP_PLD_EJECTABLE)
   1155  1.1.1.5  christos             {
   1156  1.1.1.5  christos                 PldInfo.Ejectable = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1157  1.1.1.5  christos             }
   1158  1.1.1.5  christos             else /* PARSEOP_PLD_EJECTREQUIRED */
   1159  1.1.1.5  christos             {
   1160  1.1.1.5  christos                 PldInfo.OspmEjectRequired = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1161  1.1.1.5  christos             }
   1162  1.1.1.5  christos 
   1163  1.1.1.5  christos             break;
   1164  1.1.1.5  christos 
   1165  1.1.1.5  christos         case PARSEOP_PLD_CABINETNUMBER:
   1166  1.1.1.5  christos         case PARSEOP_PLD_CARDCAGENUMBER:
   1167  1.1.1.5  christos 
   1168  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER)
   1169  1.1.1.5  christos             {
   1170  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL);
   1171  1.1.1.5  christos                 break;
   1172  1.1.1.5  christos             }
   1173  1.1.1.5  christos 
   1174  1.1.1.5  christos             if (Node->Asl.Child->Asl.Value.Integer > 255)
   1175  1.1.1.5  christos             {
   1176  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
   1177  1.1.1.5  christos                 break;
   1178  1.1.1.5  christos             }
   1179  1.1.1.5  christos 
   1180  1.1.1.5  christos             if (Node->Asl.ParseOpcode == PARSEOP_PLD_CABINETNUMBER)
   1181  1.1.1.5  christos             {
   1182  1.1.1.5  christos                 PldInfo.CabinetNumber = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1183  1.1.1.5  christos             }
   1184  1.1.1.5  christos             else /* PARSEOP_PLD_CARDCAGENUMBER */
   1185  1.1.1.5  christos             {
   1186  1.1.1.5  christos                 PldInfo.CardCageNumber = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1187  1.1.1.5  christos             }
   1188  1.1.1.5  christos 
   1189  1.1.1.5  christos             break;
   1190  1.1.1.5  christos 
   1191  1.1.1.5  christos         case PARSEOP_PLD_REFERENCE:
   1192  1.1.1.5  christos 
   1193  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER)
   1194  1.1.1.5  christos             {
   1195  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL);
   1196  1.1.1.5  christos                 break;
   1197  1.1.1.5  christos             }
   1198  1.1.1.5  christos 
   1199  1.1.1.5  christos             if (Node->Asl.Child->Asl.Value.Integer > 1)
   1200  1.1.1.5  christos             {
   1201  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
   1202  1.1.1.5  christos                 break;
   1203  1.1.1.5  christos             }
   1204  1.1.1.5  christos 
   1205  1.1.1.5  christos             PldInfo.Reference = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1206  1.1.1.5  christos             break;
   1207  1.1.1.5  christos 
   1208  1.1.1.5  christos         case PARSEOP_PLD_ROTATION:
   1209  1.1.1.5  christos 
   1210  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER)
   1211  1.1.1.5  christos             {
   1212  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL);
   1213  1.1.1.5  christos                 break;
   1214  1.1.1.5  christos             }
   1215  1.1.1.5  christos 
   1216  1.1.1.5  christos             if (Node->Asl.Child->Asl.Value.Integer > 7)
   1217  1.1.1.5  christos             {
   1218  1.1.1.5  christos                 switch (Node->Asl.Child->Asl.Value.Integer)
   1219  1.1.1.5  christos                 {
   1220  1.1.1.5  christos                 case 45:
   1221  1.1.1.5  christos 
   1222  1.1.1.5  christos                     Node->Asl.Child->Asl.Value.Integer = 1;
   1223  1.1.1.5  christos                     break;
   1224  1.1.1.5  christos 
   1225  1.1.1.5  christos                 case 90:
   1226  1.1.1.5  christos 
   1227  1.1.1.5  christos                     Node->Asl.Child->Asl.Value.Integer = 2;
   1228  1.1.1.5  christos                     break;
   1229  1.1.1.5  christos 
   1230  1.1.1.5  christos                 case 135:
   1231  1.1.1.5  christos 
   1232  1.1.1.5  christos                     Node->Asl.Child->Asl.Value.Integer = 3;
   1233  1.1.1.5  christos                     break;
   1234  1.1.1.5  christos 
   1235  1.1.1.5  christos                 case 180:
   1236  1.1.1.5  christos 
   1237  1.1.1.5  christos                     Node->Asl.Child->Asl.Value.Integer = 4;
   1238  1.1.1.5  christos                     break;
   1239  1.1.1.5  christos 
   1240  1.1.1.5  christos                 case 225:
   1241  1.1.1.5  christos 
   1242  1.1.1.5  christos                     Node->Asl.Child->Asl.Value.Integer = 5;
   1243  1.1.1.5  christos                     break;
   1244  1.1.1.5  christos 
   1245  1.1.1.5  christos                 case 270:
   1246  1.1.1.5  christos 
   1247  1.1.1.5  christos                     Node->Asl.Child->Asl.Value.Integer = 6;
   1248  1.1.1.5  christos                     break;
   1249  1.1.1.5  christos 
   1250  1.1.1.5  christos                 case 315:
   1251  1.1.1.5  christos 
   1252  1.1.1.5  christos                     Node->Asl.Child->Asl.Value.Integer = 7;
   1253  1.1.1.5  christos                     break;
   1254  1.1.1.5  christos 
   1255  1.1.1.5  christos                 default:
   1256  1.1.1.5  christos 
   1257  1.1.1.5  christos                     AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
   1258  1.1.1.5  christos                     break;
   1259  1.1.1.5  christos                 }
   1260  1.1.1.5  christos             }
   1261  1.1.1.5  christos 
   1262  1.1.1.5  christos             PldInfo.Rotation = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1263  1.1.1.5  christos             break;
   1264  1.1.1.5  christos 
   1265  1.1.1.5  christos         case PARSEOP_PLD_ORDER:
   1266  1.1.1.5  christos 
   1267  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER)
   1268  1.1.1.5  christos             {
   1269  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL);
   1270  1.1.1.5  christos                 break;
   1271  1.1.1.5  christos             }
   1272  1.1.1.5  christos 
   1273  1.1.1.5  christos             if (Node->Asl.Child->Asl.Value.Integer > 31)
   1274  1.1.1.5  christos             {
   1275  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
   1276  1.1.1.5  christos                 break;
   1277  1.1.1.5  christos             }
   1278  1.1.1.5  christos 
   1279  1.1.1.5  christos             PldInfo.Order = (UINT8) Node->Asl.Child->Asl.Value.Integer;
   1280  1.1.1.5  christos             break;
   1281  1.1.1.5  christos 
   1282  1.1.1.5  christos         case PARSEOP_PLD_VERTICALOFFSET:
   1283  1.1.1.5  christos         case PARSEOP_PLD_HORIZONTALOFFSET:
   1284  1.1.1.5  christos 
   1285  1.1.1.5  christos             if (Node->Asl.Child->Asl.ParseOpcode != PARSEOP_INTEGER)
   1286  1.1.1.5  christos             {
   1287  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL);
   1288  1.1.1.5  christos                 break;
   1289  1.1.1.5  christos             }
   1290  1.1.1.5  christos 
   1291  1.1.1.5  christos             if (Node->Asl.Child->Asl.Value.Integer > 65535)
   1292  1.1.1.5  christos             {
   1293  1.1.1.5  christos                 AslError(ASL_ERROR, ASL_MSG_RANGE, Node, NULL);
   1294  1.1.1.5  christos                 break;
   1295  1.1.1.5  christos             }
   1296  1.1.1.5  christos 
   1297  1.1.1.5  christos             if (Node->Asl.ParseOpcode == PARSEOP_PLD_VERTICALOFFSET)
   1298  1.1.1.5  christos             {
   1299  1.1.1.5  christos                 PldInfo.VerticalOffset = (UINT16) Node->Asl.Child->Asl.Value.Integer;
   1300  1.1.1.5  christos             }
   1301  1.1.1.5  christos             else /* PARSEOP_PLD_HORIZONTALOFFSET */
   1302  1.1.1.5  christos             {
   1303  1.1.1.5  christos                 PldInfo.HorizontalOffset = (UINT16) Node->Asl.Child->Asl.Value.Integer;
   1304  1.1.1.5  christos             }
   1305  1.1.1.5  christos 
   1306  1.1.1.5  christos             break;
   1307  1.1.1.5  christos 
   1308  1.1.1.5  christos         default:
   1309  1.1.1.5  christos 
   1310  1.1.1.5  christos             AslError(ASL_ERROR, ASL_MSG_INVALID_TYPE, Node, NULL);
   1311  1.1.1.5  christos             break;
   1312  1.1.1.5  christos         }
   1313  1.1.1.5  christos 
   1314  1.1.1.5  christos         Node = Node->Asl.Next;
   1315  1.1.1.5  christos     }
   1316  1.1.1.5  christos 
   1317  1.1.1.5  christos     Buffer = OpcEncodePldBuffer(&PldInfo);
   1318  1.1.1.5  christos 
   1319  1.1.1.5  christos     /* Change Op to a Buffer */
   1320  1.1.1.5  christos 
   1321  1.1.1.5  christos     Op->Asl.ParseOpcode = PARSEOP_BUFFER;
   1322  1.1.1.5  christos     Op->Common.AmlOpcode = AML_BUFFER_OP;
   1323  1.1.1.5  christos 
   1324  1.1.1.5  christos     /* Disable further optimization */
   1325  1.1.1.5  christos 
   1326  1.1.1.5  christos     Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST;
   1327  1.1.1.5  christos     UtSetParseOpName (Op);
   1328  1.1.1.5  christos 
   1329  1.1.1.5  christos     /* Child node is the buffer length */
   1330  1.1.1.5  christos 
   1331  1.1.1.5  christos     NewOp = TrAllocateNode (PARSEOP_INTEGER);
   1332  1.1.1.5  christos 
   1333  1.1.1.5  christos     NewOp->Asl.AmlOpcode     = AML_BYTE_OP;
   1334  1.1.1.5  christos     NewOp->Asl.Value.Integer = 20;
   1335  1.1.1.5  christos     NewOp->Asl.Parent        = Op;
   1336  1.1.1.5  christos 
   1337  1.1.1.5  christos     Op->Asl.Child = NewOp;
   1338  1.1.1.5  christos     Op = NewOp;
   1339  1.1.1.5  christos 
   1340  1.1.1.5  christos     /* Peer to the child is the raw buffer data */
   1341  1.1.1.5  christos 
   1342  1.1.1.5  christos     NewOp = TrAllocateNode (PARSEOP_RAW_DATA);
   1343  1.1.1.5  christos     NewOp->Asl.AmlOpcode     = AML_RAW_DATA_BUFFER;
   1344  1.1.1.5  christos     NewOp->Asl.AmlLength     = 20;
   1345  1.1.1.5  christos     NewOp->Asl.Value.String  = ACPI_CAST_PTR (char, Buffer);
   1346  1.1.1.5  christos     NewOp->Asl.Parent        = Op->Asl.Parent;
   1347  1.1.1.5  christos 
   1348  1.1.1.5  christos     Op->Asl.Next = NewOp;
   1349  1.1.1.5  christos }
   1350  1.1.1.5  christos 
   1351  1.1.1.5  christos 
   1352  1.1.1.5  christos /*******************************************************************************
   1353  1.1.1.5  christos  *
   1354  1.1.1.3  christos  * FUNCTION:    OpcDoUuId
   1355      1.1    jruoho  *
   1356  1.1.1.5  christos  * PARAMETERS:  Op                  - Parse node
   1357      1.1    jruoho  *
   1358      1.1    jruoho  * RETURN:      None
   1359      1.1    jruoho  *
   1360      1.1    jruoho  * DESCRIPTION: Convert UUID string to 16-byte buffer
   1361      1.1    jruoho  *
   1362      1.1    jruoho  ******************************************************************************/
   1363      1.1    jruoho 
   1364      1.1    jruoho static void
   1365      1.1    jruoho OpcDoUuId (
   1366      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
   1367      1.1    jruoho {
   1368      1.1    jruoho     char                    *InString;
   1369  1.1.1.4  christos     UINT8                   *Buffer;
   1370      1.1    jruoho     ACPI_STATUS             Status = AE_OK;
   1371      1.1    jruoho     ACPI_PARSE_OBJECT       *NewOp;
   1372      1.1    jruoho 
   1373      1.1    jruoho 
   1374  1.1.1.5  christos     InString = ACPI_CAST_PTR (char, Op->Asl.Value.String);
   1375      1.1    jruoho     Buffer = UtLocalCalloc (16);
   1376      1.1    jruoho 
   1377  1.1.1.2    jruoho     Status = AuValidateUuid (InString);
   1378      1.1    jruoho     if (ACPI_FAILURE (Status))
   1379      1.1    jruoho     {
   1380      1.1    jruoho         AslError (ASL_ERROR, ASL_MSG_INVALID_UUID, Op, Op->Asl.Value.String);
   1381      1.1    jruoho     }
   1382  1.1.1.2    jruoho     else
   1383      1.1    jruoho     {
   1384  1.1.1.4  christos         AcpiUtConvertStringToUuid (InString, Buffer);
   1385      1.1    jruoho     }
   1386      1.1    jruoho 
   1387      1.1    jruoho     /* Change Op to a Buffer */
   1388      1.1    jruoho 
   1389      1.1    jruoho     Op->Asl.ParseOpcode = PARSEOP_BUFFER;
   1390      1.1    jruoho     Op->Common.AmlOpcode = AML_BUFFER_OP;
   1391      1.1    jruoho 
   1392      1.1    jruoho     /* Disable further optimization */
   1393      1.1    jruoho 
   1394      1.1    jruoho     Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST;
   1395      1.1    jruoho     UtSetParseOpName (Op);
   1396      1.1    jruoho 
   1397      1.1    jruoho     /* Child node is the buffer length */
   1398      1.1    jruoho 
   1399      1.1    jruoho     NewOp = TrAllocateNode (PARSEOP_INTEGER);
   1400      1.1    jruoho 
   1401      1.1    jruoho     NewOp->Asl.AmlOpcode     = AML_BYTE_OP;
   1402      1.1    jruoho     NewOp->Asl.Value.Integer = 16;
   1403      1.1    jruoho     NewOp->Asl.Parent        = Op;
   1404      1.1    jruoho 
   1405      1.1    jruoho     Op->Asl.Child = NewOp;
   1406      1.1    jruoho     Op = NewOp;
   1407      1.1    jruoho 
   1408      1.1    jruoho     /* Peer to the child is the raw buffer data */
   1409      1.1    jruoho 
   1410      1.1    jruoho     NewOp = TrAllocateNode (PARSEOP_RAW_DATA);
   1411      1.1    jruoho     NewOp->Asl.AmlOpcode     = AML_RAW_DATA_BUFFER;
   1412      1.1    jruoho     NewOp->Asl.AmlLength     = 16;
   1413  1.1.1.5  christos     NewOp->Asl.Value.String  = ACPI_CAST_PTR (char, Buffer);
   1414      1.1    jruoho     NewOp->Asl.Parent        = Op->Asl.Parent;
   1415      1.1    jruoho 
   1416      1.1    jruoho     Op->Asl.Next = NewOp;
   1417      1.1    jruoho }
   1418      1.1    jruoho 
   1419      1.1    jruoho 
   1420      1.1    jruoho /*******************************************************************************
   1421      1.1    jruoho  *
   1422      1.1    jruoho  * FUNCTION:    OpcGenerateAmlOpcode
   1423      1.1    jruoho  *
   1424  1.1.1.5  christos  * PARAMETERS:  Op                  - Parse node
   1425      1.1    jruoho  *
   1426      1.1    jruoho  * RETURN:      None
   1427      1.1    jruoho  *
   1428      1.1    jruoho  * DESCRIPTION: Generate the AML opcode associated with the node and its
   1429  1.1.1.3  christos  *              parse (lex/flex) keyword opcode. Essentially implements
   1430      1.1    jruoho  *              a mapping between the parse opcodes and the actual AML opcodes.
   1431      1.1    jruoho  *
   1432      1.1    jruoho  ******************************************************************************/
   1433      1.1    jruoho 
   1434      1.1    jruoho void
   1435      1.1    jruoho OpcGenerateAmlOpcode (
   1436      1.1    jruoho     ACPI_PARSE_OBJECT       *Op)
   1437      1.1    jruoho {
   1438      1.1    jruoho     UINT16                  Index;
   1439      1.1    jruoho 
   1440      1.1    jruoho 
   1441      1.1    jruoho     Index = (UINT16) (Op->Asl.ParseOpcode - ASL_PARSE_OPCODE_BASE);
   1442      1.1    jruoho 
   1443      1.1    jruoho     Op->Asl.AmlOpcode     = AslKeywordMapping[Index].AmlOpcode;
   1444      1.1    jruoho     Op->Asl.AcpiBtype     = AslKeywordMapping[Index].AcpiBtype;
   1445      1.1    jruoho     Op->Asl.CompileFlags |= AslKeywordMapping[Index].Flags;
   1446      1.1    jruoho 
   1447      1.1    jruoho     if (!Op->Asl.Value.Integer)
   1448      1.1    jruoho     {
   1449      1.1    jruoho         Op->Asl.Value.Integer = AslKeywordMapping[Index].Value;
   1450      1.1    jruoho     }
   1451      1.1    jruoho 
   1452      1.1    jruoho     /* Special handling for some opcodes */
   1453      1.1    jruoho 
   1454      1.1    jruoho     switch (Op->Asl.ParseOpcode)
   1455      1.1    jruoho     {
   1456      1.1    jruoho     case PARSEOP_INTEGER:
   1457      1.1    jruoho         /*
   1458      1.1    jruoho          * Set the opcode based on the size of the integer
   1459      1.1    jruoho          */
   1460      1.1    jruoho         (void) OpcSetOptimalIntegerSize (Op);
   1461      1.1    jruoho         break;
   1462      1.1    jruoho 
   1463      1.1    jruoho     case PARSEOP_OFFSET:
   1464      1.1    jruoho 
   1465      1.1    jruoho         Op->Asl.AmlOpcodeLength = 1;
   1466      1.1    jruoho         break;
   1467      1.1    jruoho 
   1468      1.1    jruoho     case PARSEOP_ACCESSAS:
   1469      1.1    jruoho 
   1470      1.1    jruoho         OpcDoAccessAs (Op);
   1471      1.1    jruoho         break;
   1472      1.1    jruoho 
   1473  1.1.1.3  christos     case PARSEOP_CONNECTION:
   1474  1.1.1.3  christos 
   1475  1.1.1.3  christos         OpcDoConnection (Op);
   1476  1.1.1.3  christos         break;
   1477  1.1.1.3  christos 
   1478      1.1    jruoho     case PARSEOP_EISAID:
   1479      1.1    jruoho 
   1480      1.1    jruoho         OpcDoEisaId (Op);
   1481      1.1    jruoho         break;
   1482      1.1    jruoho 
   1483  1.1.1.5  christos     case PARSEOP_PRINTF:
   1484  1.1.1.5  christos 
   1485  1.1.1.5  christos         OpcDoPrintf (Op);
   1486  1.1.1.5  christos         break;
   1487  1.1.1.5  christos 
   1488  1.1.1.5  christos     case PARSEOP_FPRINTF:
   1489  1.1.1.5  christos 
   1490  1.1.1.5  christos         OpcDoFprintf (Op);
   1491  1.1.1.5  christos         break;
   1492  1.1.1.5  christos 
   1493  1.1.1.5  christos     case PARSEOP_TOPLD:
   1494  1.1.1.5  christos 
   1495  1.1.1.5  christos         OpcDoPld (Op);
   1496  1.1.1.5  christos         break;
   1497  1.1.1.5  christos 
   1498      1.1    jruoho     case PARSEOP_TOUUID:
   1499      1.1    jruoho 
   1500      1.1    jruoho         OpcDoUuId (Op);
   1501      1.1    jruoho         break;
   1502      1.1    jruoho 
   1503      1.1    jruoho     case PARSEOP_UNICODE:
   1504      1.1    jruoho 
   1505      1.1    jruoho         OpcDoUnicode (Op);
   1506      1.1    jruoho         break;
   1507      1.1    jruoho 
   1508      1.1    jruoho     case PARSEOP_INCLUDE:
   1509      1.1    jruoho 
   1510      1.1    jruoho         Op->Asl.Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
   1511      1.1    jruoho         Gbl_HasIncludeFiles = TRUE;
   1512      1.1    jruoho         break;
   1513      1.1    jruoho 
   1514      1.1    jruoho     case PARSEOP_EXTERNAL:
   1515      1.1    jruoho 
   1516      1.1    jruoho         Op->Asl.Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
   1517      1.1    jruoho         Op->Asl.Child->Asl.Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
   1518      1.1    jruoho         break;
   1519      1.1    jruoho 
   1520  1.1.1.3  christos     case PARSEOP_TIMER:
   1521  1.1.1.3  christos 
   1522  1.1.1.3  christos         if (AcpiGbl_IntegerBitWidth == 32)
   1523  1.1.1.3  christos         {
   1524  1.1.1.3  christos             AslError (ASL_REMARK, ASL_MSG_TRUNCATION, Op, NULL);
   1525  1.1.1.3  christos         }
   1526  1.1.1.3  christos         break;
   1527  1.1.1.3  christos 
   1528      1.1    jruoho     default:
   1529  1.1.1.3  christos 
   1530      1.1    jruoho         /* Nothing to do for other opcodes */
   1531  1.1.1.3  christos 
   1532      1.1    jruoho         break;
   1533      1.1    jruoho     }
   1534      1.1    jruoho 
   1535      1.1    jruoho     return;
   1536      1.1    jruoho }
   1537