xref: /freebsd/sys/contrib/dev/acpica/compiler/aslopcodes.c (revision 1c0e1b6da9c3c45f81c75137dddaebc748995afc)
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