xref: /freebsd/sys/contrib/dev/acpica/components/utilities/utpredef.c (revision 9c7c683c56f9d25aa7c25c40d530d7a153b19d18)
1*9c7c683cSJung-uk Kim /******************************************************************************
2*9c7c683cSJung-uk Kim  *
3*9c7c683cSJung-uk Kim  * Module Name: utpredef - support functions for predefined names
4*9c7c683cSJung-uk Kim  *
5*9c7c683cSJung-uk Kim  *****************************************************************************/
6*9c7c683cSJung-uk Kim 
7*9c7c683cSJung-uk Kim /*
8*9c7c683cSJung-uk Kim  * Copyright (C) 2000 - 2013, Intel Corp.
9*9c7c683cSJung-uk Kim  * All rights reserved.
10*9c7c683cSJung-uk Kim  *
11*9c7c683cSJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12*9c7c683cSJung-uk Kim  * modification, are permitted provided that the following conditions
13*9c7c683cSJung-uk Kim  * are met:
14*9c7c683cSJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15*9c7c683cSJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16*9c7c683cSJung-uk Kim  *    without modification.
17*9c7c683cSJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*9c7c683cSJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19*9c7c683cSJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20*9c7c683cSJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21*9c7c683cSJung-uk Kim  *    binary redistribution.
22*9c7c683cSJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23*9c7c683cSJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24*9c7c683cSJung-uk Kim  *    from this software without specific prior written permission.
25*9c7c683cSJung-uk Kim  *
26*9c7c683cSJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27*9c7c683cSJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28*9c7c683cSJung-uk Kim  * Software Foundation.
29*9c7c683cSJung-uk Kim  *
30*9c7c683cSJung-uk Kim  * NO WARRANTY
31*9c7c683cSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*9c7c683cSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*9c7c683cSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*9c7c683cSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*9c7c683cSJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*9c7c683cSJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*9c7c683cSJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*9c7c683cSJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*9c7c683cSJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*9c7c683cSJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*9c7c683cSJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42*9c7c683cSJung-uk Kim  */
43*9c7c683cSJung-uk Kim 
44*9c7c683cSJung-uk Kim #define __UTPREDEF_C__
45*9c7c683cSJung-uk Kim 
46*9c7c683cSJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
47*9c7c683cSJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
48*9c7c683cSJung-uk Kim #include <contrib/dev/acpica/include/acpredef.h>
49*9c7c683cSJung-uk Kim 
50*9c7c683cSJung-uk Kim 
51*9c7c683cSJung-uk Kim #define _COMPONENT          ACPI_UTILITIES
52*9c7c683cSJung-uk Kim         ACPI_MODULE_NAME    ("utpredef")
53*9c7c683cSJung-uk Kim 
54*9c7c683cSJung-uk Kim 
55*9c7c683cSJung-uk Kim /*
56*9c7c683cSJung-uk Kim  * Names for the types that can be returned by the predefined objects.
57*9c7c683cSJung-uk Kim  * Used for warning messages. Must be in the same order as the ACPI_RTYPEs
58*9c7c683cSJung-uk Kim  */
59*9c7c683cSJung-uk Kim static const char   *UtRtypeNames[] =
60*9c7c683cSJung-uk Kim {
61*9c7c683cSJung-uk Kim     "/Integer",
62*9c7c683cSJung-uk Kim     "/String",
63*9c7c683cSJung-uk Kim     "/Buffer",
64*9c7c683cSJung-uk Kim     "/Package",
65*9c7c683cSJung-uk Kim     "/Reference",
66*9c7c683cSJung-uk Kim };
67*9c7c683cSJung-uk Kim 
68*9c7c683cSJung-uk Kim 
69*9c7c683cSJung-uk Kim /*******************************************************************************
70*9c7c683cSJung-uk Kim  *
71*9c7c683cSJung-uk Kim  * FUNCTION:    AcpiUtGetNextPredefinedMethod
72*9c7c683cSJung-uk Kim  *
73*9c7c683cSJung-uk Kim  * PARAMETERS:  ThisName            - Entry in the predefined method/name table
74*9c7c683cSJung-uk Kim  *
75*9c7c683cSJung-uk Kim  * RETURN:      Pointer to next entry in predefined table.
76*9c7c683cSJung-uk Kim  *
77*9c7c683cSJung-uk Kim  * DESCRIPTION: Get the next entry in the predefine method table. Handles the
78*9c7c683cSJung-uk Kim  *              cases where a package info entry follows a method name that
79*9c7c683cSJung-uk Kim  *              returns a package.
80*9c7c683cSJung-uk Kim  *
81*9c7c683cSJung-uk Kim  ******************************************************************************/
82*9c7c683cSJung-uk Kim 
83*9c7c683cSJung-uk Kim const ACPI_PREDEFINED_INFO *
84*9c7c683cSJung-uk Kim AcpiUtGetNextPredefinedMethod (
85*9c7c683cSJung-uk Kim     const ACPI_PREDEFINED_INFO  *ThisName)
86*9c7c683cSJung-uk Kim {
87*9c7c683cSJung-uk Kim 
88*9c7c683cSJung-uk Kim     /*
89*9c7c683cSJung-uk Kim      * Skip next entry in the table if this name returns a Package
90*9c7c683cSJung-uk Kim      * (next entry contains the package info)
91*9c7c683cSJung-uk Kim      */
92*9c7c683cSJung-uk Kim     if ((ThisName->Info.ExpectedBtypes & ACPI_RTYPE_PACKAGE) &&
93*9c7c683cSJung-uk Kim         (ThisName->Info.ExpectedBtypes != ACPI_RTYPE_ALL))
94*9c7c683cSJung-uk Kim     {
95*9c7c683cSJung-uk Kim         ThisName++;
96*9c7c683cSJung-uk Kim     }
97*9c7c683cSJung-uk Kim 
98*9c7c683cSJung-uk Kim     ThisName++;
99*9c7c683cSJung-uk Kim     return (ThisName);
100*9c7c683cSJung-uk Kim }
101*9c7c683cSJung-uk Kim 
102*9c7c683cSJung-uk Kim 
103*9c7c683cSJung-uk Kim /*******************************************************************************
104*9c7c683cSJung-uk Kim  *
105*9c7c683cSJung-uk Kim  * FUNCTION:    AcpiUtMatchPredefinedMethod
106*9c7c683cSJung-uk Kim  *
107*9c7c683cSJung-uk Kim  * PARAMETERS:  Name                - Name to find
108*9c7c683cSJung-uk Kim  *
109*9c7c683cSJung-uk Kim  * RETURN:      Pointer to entry in predefined table. NULL indicates not found.
110*9c7c683cSJung-uk Kim  *
111*9c7c683cSJung-uk Kim  * DESCRIPTION: Check an object name against the predefined object list.
112*9c7c683cSJung-uk Kim  *
113*9c7c683cSJung-uk Kim  ******************************************************************************/
114*9c7c683cSJung-uk Kim 
115*9c7c683cSJung-uk Kim const ACPI_PREDEFINED_INFO *
116*9c7c683cSJung-uk Kim AcpiUtMatchPredefinedMethod (
117*9c7c683cSJung-uk Kim     char                        *Name)
118*9c7c683cSJung-uk Kim {
119*9c7c683cSJung-uk Kim     const ACPI_PREDEFINED_INFO  *ThisName;
120*9c7c683cSJung-uk Kim 
121*9c7c683cSJung-uk Kim 
122*9c7c683cSJung-uk Kim     /* Quick check for a predefined name, first character must be underscore */
123*9c7c683cSJung-uk Kim 
124*9c7c683cSJung-uk Kim     if (Name[0] != '_')
125*9c7c683cSJung-uk Kim     {
126*9c7c683cSJung-uk Kim         return (NULL);
127*9c7c683cSJung-uk Kim     }
128*9c7c683cSJung-uk Kim 
129*9c7c683cSJung-uk Kim     /* Search info table for a predefined method/object name */
130*9c7c683cSJung-uk Kim 
131*9c7c683cSJung-uk Kim     ThisName = AcpiGbl_PredefinedMethods;
132*9c7c683cSJung-uk Kim     while (ThisName->Info.Name[0])
133*9c7c683cSJung-uk Kim     {
134*9c7c683cSJung-uk Kim         if (ACPI_COMPARE_NAME (Name, ThisName->Info.Name))
135*9c7c683cSJung-uk Kim         {
136*9c7c683cSJung-uk Kim             return (ThisName);
137*9c7c683cSJung-uk Kim         }
138*9c7c683cSJung-uk Kim 
139*9c7c683cSJung-uk Kim         ThisName = AcpiUtGetNextPredefinedMethod (ThisName);
140*9c7c683cSJung-uk Kim     }
141*9c7c683cSJung-uk Kim 
142*9c7c683cSJung-uk Kim     return (NULL); /* Not found */
143*9c7c683cSJung-uk Kim }
144*9c7c683cSJung-uk Kim 
145*9c7c683cSJung-uk Kim 
146*9c7c683cSJung-uk Kim /*******************************************************************************
147*9c7c683cSJung-uk Kim  *
148*9c7c683cSJung-uk Kim  * FUNCTION:    AcpiUtGetExpectedReturnTypes
149*9c7c683cSJung-uk Kim  *
150*9c7c683cSJung-uk Kim  * PARAMETERS:  Buffer              - Where the formatted string is returned
151*9c7c683cSJung-uk Kim  *              ExpectedBTypes      - Bitfield of expected data types
152*9c7c683cSJung-uk Kim  *
153*9c7c683cSJung-uk Kim  * RETURN:      Formatted string in Buffer.
154*9c7c683cSJung-uk Kim  *
155*9c7c683cSJung-uk Kim  * DESCRIPTION: Format the expected object types into a printable string.
156*9c7c683cSJung-uk Kim  *
157*9c7c683cSJung-uk Kim  ******************************************************************************/
158*9c7c683cSJung-uk Kim 
159*9c7c683cSJung-uk Kim void
160*9c7c683cSJung-uk Kim AcpiUtGetExpectedReturnTypes (
161*9c7c683cSJung-uk Kim     char                    *Buffer,
162*9c7c683cSJung-uk Kim     UINT32                  ExpectedBtypes)
163*9c7c683cSJung-uk Kim {
164*9c7c683cSJung-uk Kim     UINT32                  ThisRtype;
165*9c7c683cSJung-uk Kim     UINT32                  i;
166*9c7c683cSJung-uk Kim     UINT32                  j;
167*9c7c683cSJung-uk Kim 
168*9c7c683cSJung-uk Kim 
169*9c7c683cSJung-uk Kim     j = 1;
170*9c7c683cSJung-uk Kim     Buffer[0] = 0;
171*9c7c683cSJung-uk Kim     ThisRtype = ACPI_RTYPE_INTEGER;
172*9c7c683cSJung-uk Kim 
173*9c7c683cSJung-uk Kim     for (i = 0; i < ACPI_NUM_RTYPES; i++)
174*9c7c683cSJung-uk Kim     {
175*9c7c683cSJung-uk Kim         /* If one of the expected types, concatenate the name of this type */
176*9c7c683cSJung-uk Kim 
177*9c7c683cSJung-uk Kim         if (ExpectedBtypes & ThisRtype)
178*9c7c683cSJung-uk Kim         {
179*9c7c683cSJung-uk Kim             ACPI_STRCAT (Buffer, &UtRtypeNames[i][j]);
180*9c7c683cSJung-uk Kim             j = 0;              /* Use name separator from now on */
181*9c7c683cSJung-uk Kim         }
182*9c7c683cSJung-uk Kim 
183*9c7c683cSJung-uk Kim         ThisRtype <<= 1;    /* Next Rtype */
184*9c7c683cSJung-uk Kim     }
185*9c7c683cSJung-uk Kim }
186*9c7c683cSJung-uk Kim 
187*9c7c683cSJung-uk Kim 
188*9c7c683cSJung-uk Kim /*******************************************************************************
189*9c7c683cSJung-uk Kim  *
190*9c7c683cSJung-uk Kim  * The remaining functions are used by iASL and AcpiHelp only
191*9c7c683cSJung-uk Kim  *
192*9c7c683cSJung-uk Kim  ******************************************************************************/
193*9c7c683cSJung-uk Kim 
194*9c7c683cSJung-uk Kim #if (defined ACPI_ASL_COMPILER || defined ACPI_HELP_APP)
195*9c7c683cSJung-uk Kim #include <stdio.h>
196*9c7c683cSJung-uk Kim #include <string.h>
197*9c7c683cSJung-uk Kim 
198*9c7c683cSJung-uk Kim /* Local prototypes */
199*9c7c683cSJung-uk Kim 
200*9c7c683cSJung-uk Kim static UINT32
201*9c7c683cSJung-uk Kim AcpiUtGetArgumentTypes (
202*9c7c683cSJung-uk Kim     char                    *Buffer,
203*9c7c683cSJung-uk Kim     UINT16                  ArgumentTypes);
204*9c7c683cSJung-uk Kim 
205*9c7c683cSJung-uk Kim 
206*9c7c683cSJung-uk Kim /* Types that can be returned externally by a predefined name */
207*9c7c683cSJung-uk Kim 
208*9c7c683cSJung-uk Kim static const char   *UtExternalTypeNames[] = /* Indexed by ACPI_TYPE_* */
209*9c7c683cSJung-uk Kim {
210*9c7c683cSJung-uk Kim     ", UNSUPPORTED-TYPE",
211*9c7c683cSJung-uk Kim     ", Integer",
212*9c7c683cSJung-uk Kim     ", String",
213*9c7c683cSJung-uk Kim     ", Buffer",
214*9c7c683cSJung-uk Kim     ", Package"
215*9c7c683cSJung-uk Kim };
216*9c7c683cSJung-uk Kim 
217*9c7c683cSJung-uk Kim /* Bit widths for resource descriptor predefined names */
218*9c7c683cSJung-uk Kim 
219*9c7c683cSJung-uk Kim static const char   *UtResourceTypeNames[] =
220*9c7c683cSJung-uk Kim {
221*9c7c683cSJung-uk Kim     "/1",
222*9c7c683cSJung-uk Kim     "/2",
223*9c7c683cSJung-uk Kim     "/3",
224*9c7c683cSJung-uk Kim     "/8",
225*9c7c683cSJung-uk Kim     "/16",
226*9c7c683cSJung-uk Kim     "/32",
227*9c7c683cSJung-uk Kim     "/64",
228*9c7c683cSJung-uk Kim     "/variable",
229*9c7c683cSJung-uk Kim };
230*9c7c683cSJung-uk Kim 
231*9c7c683cSJung-uk Kim 
232*9c7c683cSJung-uk Kim /*******************************************************************************
233*9c7c683cSJung-uk Kim  *
234*9c7c683cSJung-uk Kim  * FUNCTION:    AcpiUtMatchResourceName
235*9c7c683cSJung-uk Kim  *
236*9c7c683cSJung-uk Kim  * PARAMETERS:  Name                - Name to find
237*9c7c683cSJung-uk Kim  *
238*9c7c683cSJung-uk Kim  * RETURN:      Pointer to entry in the resource table. NULL indicates not
239*9c7c683cSJung-uk Kim  *              found.
240*9c7c683cSJung-uk Kim  *
241*9c7c683cSJung-uk Kim  * DESCRIPTION: Check an object name against the predefined resource
242*9c7c683cSJung-uk Kim  *              descriptor object list.
243*9c7c683cSJung-uk Kim  *
244*9c7c683cSJung-uk Kim  ******************************************************************************/
245*9c7c683cSJung-uk Kim 
246*9c7c683cSJung-uk Kim const ACPI_PREDEFINED_INFO *
247*9c7c683cSJung-uk Kim AcpiUtMatchResourceName (
248*9c7c683cSJung-uk Kim     char                        *Name)
249*9c7c683cSJung-uk Kim {
250*9c7c683cSJung-uk Kim     const ACPI_PREDEFINED_INFO  *ThisName;
251*9c7c683cSJung-uk Kim 
252*9c7c683cSJung-uk Kim 
253*9c7c683cSJung-uk Kim     /* Quick check for a predefined name, first character must be underscore */
254*9c7c683cSJung-uk Kim 
255*9c7c683cSJung-uk Kim     if (Name[0] != '_')
256*9c7c683cSJung-uk Kim     {
257*9c7c683cSJung-uk Kim         return (NULL);
258*9c7c683cSJung-uk Kim     }
259*9c7c683cSJung-uk Kim 
260*9c7c683cSJung-uk Kim     /* Search info table for a predefined method/object name */
261*9c7c683cSJung-uk Kim 
262*9c7c683cSJung-uk Kim     ThisName = AcpiGbl_ResourceNames;
263*9c7c683cSJung-uk Kim     while (ThisName->Info.Name[0])
264*9c7c683cSJung-uk Kim     {
265*9c7c683cSJung-uk Kim         if (ACPI_COMPARE_NAME (Name, ThisName->Info.Name))
266*9c7c683cSJung-uk Kim         {
267*9c7c683cSJung-uk Kim             return (ThisName);
268*9c7c683cSJung-uk Kim         }
269*9c7c683cSJung-uk Kim 
270*9c7c683cSJung-uk Kim         ThisName++;
271*9c7c683cSJung-uk Kim     }
272*9c7c683cSJung-uk Kim 
273*9c7c683cSJung-uk Kim     return (NULL); /* Not found */
274*9c7c683cSJung-uk Kim }
275*9c7c683cSJung-uk Kim 
276*9c7c683cSJung-uk Kim 
277*9c7c683cSJung-uk Kim /*******************************************************************************
278*9c7c683cSJung-uk Kim  *
279*9c7c683cSJung-uk Kim  * FUNCTION:    AcpiUtDisplayPredefinedMethod
280*9c7c683cSJung-uk Kim  *
281*9c7c683cSJung-uk Kim  * PARAMETERS:  Buffer              - Scratch buffer for this function
282*9c7c683cSJung-uk Kim  *              ThisName            - Entry in the predefined method/name table
283*9c7c683cSJung-uk Kim  *              MultiLine           - TRUE if output should be on >1 line
284*9c7c683cSJung-uk Kim  *
285*9c7c683cSJung-uk Kim  * RETURN:      None
286*9c7c683cSJung-uk Kim  *
287*9c7c683cSJung-uk Kim  * DESCRIPTION: Display information about a predefined method. Number and
288*9c7c683cSJung-uk Kim  *              type of the input arguments, and expected type(s) for the
289*9c7c683cSJung-uk Kim  *              return value, if any.
290*9c7c683cSJung-uk Kim  *
291*9c7c683cSJung-uk Kim  ******************************************************************************/
292*9c7c683cSJung-uk Kim 
293*9c7c683cSJung-uk Kim void
294*9c7c683cSJung-uk Kim AcpiUtDisplayPredefinedMethod (
295*9c7c683cSJung-uk Kim     char                        *Buffer,
296*9c7c683cSJung-uk Kim     const ACPI_PREDEFINED_INFO  *ThisName,
297*9c7c683cSJung-uk Kim     BOOLEAN                     MultiLine)
298*9c7c683cSJung-uk Kim {
299*9c7c683cSJung-uk Kim     UINT32                      ArgCount;
300*9c7c683cSJung-uk Kim 
301*9c7c683cSJung-uk Kim     /*
302*9c7c683cSJung-uk Kim      * Get the argument count and the string buffer
303*9c7c683cSJung-uk Kim      * containing all argument types
304*9c7c683cSJung-uk Kim      */
305*9c7c683cSJung-uk Kim     ArgCount = AcpiUtGetArgumentTypes (Buffer,
306*9c7c683cSJung-uk Kim         ThisName->Info.ArgumentList);
307*9c7c683cSJung-uk Kim 
308*9c7c683cSJung-uk Kim     if (MultiLine)
309*9c7c683cSJung-uk Kim     {
310*9c7c683cSJung-uk Kim         printf ("      ");
311*9c7c683cSJung-uk Kim     }
312*9c7c683cSJung-uk Kim 
313*9c7c683cSJung-uk Kim     printf ("%4.4s    Requires %s%u argument%s",
314*9c7c683cSJung-uk Kim         ThisName->Info.Name,
315*9c7c683cSJung-uk Kim         (ThisName->Info.ArgumentList & ARG_COUNT_IS_MINIMUM) ?
316*9c7c683cSJung-uk Kim             "(at least) " : "",
317*9c7c683cSJung-uk Kim         ArgCount, ArgCount != 1 ? "s" : "");
318*9c7c683cSJung-uk Kim 
319*9c7c683cSJung-uk Kim     /* Display the types for any arguments */
320*9c7c683cSJung-uk Kim 
321*9c7c683cSJung-uk Kim     if (ArgCount > 0)
322*9c7c683cSJung-uk Kim     {
323*9c7c683cSJung-uk Kim         printf (" (%s)", Buffer);
324*9c7c683cSJung-uk Kim     }
325*9c7c683cSJung-uk Kim 
326*9c7c683cSJung-uk Kim     if (MultiLine)
327*9c7c683cSJung-uk Kim     {
328*9c7c683cSJung-uk Kim         printf ("\n    ");
329*9c7c683cSJung-uk Kim     }
330*9c7c683cSJung-uk Kim 
331*9c7c683cSJung-uk Kim     /* Get the return value type(s) allowed */
332*9c7c683cSJung-uk Kim 
333*9c7c683cSJung-uk Kim     if (ThisName->Info.ExpectedBtypes)
334*9c7c683cSJung-uk Kim     {
335*9c7c683cSJung-uk Kim         AcpiUtGetExpectedReturnTypes (Buffer, ThisName->Info.ExpectedBtypes);
336*9c7c683cSJung-uk Kim         printf ("  Return value types: %s\n", Buffer);
337*9c7c683cSJung-uk Kim     }
338*9c7c683cSJung-uk Kim     else
339*9c7c683cSJung-uk Kim     {
340*9c7c683cSJung-uk Kim         printf ("  No return value\n");
341*9c7c683cSJung-uk Kim     }
342*9c7c683cSJung-uk Kim }
343*9c7c683cSJung-uk Kim 
344*9c7c683cSJung-uk Kim 
345*9c7c683cSJung-uk Kim /*******************************************************************************
346*9c7c683cSJung-uk Kim  *
347*9c7c683cSJung-uk Kim  * FUNCTION:    AcpiUtGetArgumentTypes
348*9c7c683cSJung-uk Kim  *
349*9c7c683cSJung-uk Kim  * PARAMETERS:  Buffer              - Where to return the formatted types
350*9c7c683cSJung-uk Kim  *              ArgumentTypes       - Types field for this method
351*9c7c683cSJung-uk Kim  *
352*9c7c683cSJung-uk Kim  * RETURN:      Count - the number of arguments required for this method
353*9c7c683cSJung-uk Kim  *
354*9c7c683cSJung-uk Kim  * DESCRIPTION: Format the required data types for this method (Integer,
355*9c7c683cSJung-uk Kim  *              String, Buffer, or Package) and return the required argument
356*9c7c683cSJung-uk Kim  *              count.
357*9c7c683cSJung-uk Kim  *
358*9c7c683cSJung-uk Kim  ******************************************************************************/
359*9c7c683cSJung-uk Kim 
360*9c7c683cSJung-uk Kim static UINT32
361*9c7c683cSJung-uk Kim AcpiUtGetArgumentTypes (
362*9c7c683cSJung-uk Kim     char                    *Buffer,
363*9c7c683cSJung-uk Kim     UINT16                  ArgumentTypes)
364*9c7c683cSJung-uk Kim {
365*9c7c683cSJung-uk Kim     UINT16                  ThisArgumentType;
366*9c7c683cSJung-uk Kim     UINT16                  SubIndex;
367*9c7c683cSJung-uk Kim     UINT16                  ArgCount;
368*9c7c683cSJung-uk Kim     UINT32                  i;
369*9c7c683cSJung-uk Kim 
370*9c7c683cSJung-uk Kim 
371*9c7c683cSJung-uk Kim     *Buffer = 0;
372*9c7c683cSJung-uk Kim     SubIndex = 2;
373*9c7c683cSJung-uk Kim 
374*9c7c683cSJung-uk Kim     /* First field in the types list is the count of args to follow */
375*9c7c683cSJung-uk Kim 
376*9c7c683cSJung-uk Kim     ArgCount = (ArgumentTypes & METHOD_ARG_MASK);
377*9c7c683cSJung-uk Kim     ArgumentTypes >>= METHOD_ARG_BIT_WIDTH;
378*9c7c683cSJung-uk Kim 
379*9c7c683cSJung-uk Kim     if (ArgCount > METHOD_PREDEF_ARGS_MAX)
380*9c7c683cSJung-uk Kim     {
381*9c7c683cSJung-uk Kim         printf ("**** Invalid argument count (%u) "
382*9c7c683cSJung-uk Kim             "in predefined info structure\n", ArgCount);
383*9c7c683cSJung-uk Kim         return (ArgCount);
384*9c7c683cSJung-uk Kim     }
385*9c7c683cSJung-uk Kim 
386*9c7c683cSJung-uk Kim     /* Get each argument from the list, convert to ascii, store to buffer */
387*9c7c683cSJung-uk Kim 
388*9c7c683cSJung-uk Kim     for (i = 0; i < ArgCount; i++)
389*9c7c683cSJung-uk Kim     {
390*9c7c683cSJung-uk Kim         ThisArgumentType = (ArgumentTypes & METHOD_ARG_MASK);
391*9c7c683cSJung-uk Kim         if (!ThisArgumentType || (ThisArgumentType > METHOD_MAX_ARG_TYPE))
392*9c7c683cSJung-uk Kim         {
393*9c7c683cSJung-uk Kim             printf ("**** Invalid argument type (%u) "
394*9c7c683cSJung-uk Kim                 "in predefined info structure\n", ThisArgumentType);
395*9c7c683cSJung-uk Kim             return (ArgCount);
396*9c7c683cSJung-uk Kim         }
397*9c7c683cSJung-uk Kim 
398*9c7c683cSJung-uk Kim         strcat (Buffer, UtExternalTypeNames[ThisArgumentType] + SubIndex);
399*9c7c683cSJung-uk Kim 
400*9c7c683cSJung-uk Kim         /* Shift to next argument type field */
401*9c7c683cSJung-uk Kim 
402*9c7c683cSJung-uk Kim         ArgumentTypes >>= METHOD_ARG_BIT_WIDTH;
403*9c7c683cSJung-uk Kim         SubIndex = 0;
404*9c7c683cSJung-uk Kim     }
405*9c7c683cSJung-uk Kim 
406*9c7c683cSJung-uk Kim     return (ArgCount);
407*9c7c683cSJung-uk Kim }
408*9c7c683cSJung-uk Kim 
409*9c7c683cSJung-uk Kim 
410*9c7c683cSJung-uk Kim /*******************************************************************************
411*9c7c683cSJung-uk Kim  *
412*9c7c683cSJung-uk Kim  * FUNCTION:    AcpiUtGetResourceBitWidth
413*9c7c683cSJung-uk Kim  *
414*9c7c683cSJung-uk Kim  * PARAMETERS:  Buffer              - Where the formatted string is returned
415*9c7c683cSJung-uk Kim  *              Types               - Bitfield of expected data types
416*9c7c683cSJung-uk Kim  *
417*9c7c683cSJung-uk Kim  * RETURN:      Count of return types. Formatted string in Buffer.
418*9c7c683cSJung-uk Kim  *
419*9c7c683cSJung-uk Kim  * DESCRIPTION: Format the resource bit widths into a printable string.
420*9c7c683cSJung-uk Kim  *
421*9c7c683cSJung-uk Kim  ******************************************************************************/
422*9c7c683cSJung-uk Kim 
423*9c7c683cSJung-uk Kim UINT32
424*9c7c683cSJung-uk Kim AcpiUtGetResourceBitWidth (
425*9c7c683cSJung-uk Kim     char                    *Buffer,
426*9c7c683cSJung-uk Kim     UINT16                  Types)
427*9c7c683cSJung-uk Kim {
428*9c7c683cSJung-uk Kim     UINT32                  i;
429*9c7c683cSJung-uk Kim     UINT16                  SubIndex;
430*9c7c683cSJung-uk Kim     UINT32                  Found;
431*9c7c683cSJung-uk Kim 
432*9c7c683cSJung-uk Kim 
433*9c7c683cSJung-uk Kim     *Buffer = 0;
434*9c7c683cSJung-uk Kim     SubIndex = 1;
435*9c7c683cSJung-uk Kim     Found = 0;
436*9c7c683cSJung-uk Kim 
437*9c7c683cSJung-uk Kim     for (i = 0; i < NUM_RESOURCE_WIDTHS; i++)
438*9c7c683cSJung-uk Kim     {
439*9c7c683cSJung-uk Kim         if (Types & 1)
440*9c7c683cSJung-uk Kim         {
441*9c7c683cSJung-uk Kim             strcat (Buffer, &(UtResourceTypeNames[i][SubIndex]));
442*9c7c683cSJung-uk Kim             SubIndex = 0;
443*9c7c683cSJung-uk Kim             Found++;
444*9c7c683cSJung-uk Kim         }
445*9c7c683cSJung-uk Kim 
446*9c7c683cSJung-uk Kim         Types >>= 1;
447*9c7c683cSJung-uk Kim     }
448*9c7c683cSJung-uk Kim 
449*9c7c683cSJung-uk Kim     return (Found);
450*9c7c683cSJung-uk Kim }
451*9c7c683cSJung-uk Kim #endif
452