xref: /titanic_52/usr/src/uts/intel/io/acpica/executer/exutils.c (revision 385cc6b4ad1792caef3f84eb61eed3f27085801f)
1db2bae30SDana Myers /******************************************************************************
2db2bae30SDana Myers  *
3db2bae30SDana Myers  * Module Name: exutils - interpreter/scanner utilities
4db2bae30SDana Myers  *
5db2bae30SDana Myers  *****************************************************************************/
6db2bae30SDana Myers 
726f3cdf0SGordon Ross /*
8*385cc6b4SJerry Jelinek  * Copyright (C) 2000 - 2016, Intel Corp.
9db2bae30SDana Myers  * All rights reserved.
10db2bae30SDana Myers  *
1126f3cdf0SGordon Ross  * Redistribution and use in source and binary forms, with or without
1226f3cdf0SGordon Ross  * modification, are permitted provided that the following conditions
1326f3cdf0SGordon Ross  * are met:
1426f3cdf0SGordon Ross  * 1. Redistributions of source code must retain the above copyright
1526f3cdf0SGordon Ross  *    notice, this list of conditions, and the following disclaimer,
1626f3cdf0SGordon Ross  *    without modification.
1726f3cdf0SGordon Ross  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1826f3cdf0SGordon Ross  *    substantially similar to the "NO WARRANTY" disclaimer below
1926f3cdf0SGordon Ross  *    ("Disclaimer") and any redistribution must be conditioned upon
2026f3cdf0SGordon Ross  *    including a substantially similar Disclaimer requirement for further
2126f3cdf0SGordon Ross  *    binary redistribution.
2226f3cdf0SGordon Ross  * 3. Neither the names of the above-listed copyright holders nor the names
2326f3cdf0SGordon Ross  *    of any contributors may be used to endorse or promote products derived
2426f3cdf0SGordon Ross  *    from this software without specific prior written permission.
25db2bae30SDana Myers  *
2626f3cdf0SGordon Ross  * Alternatively, this software may be distributed under the terms of the
2726f3cdf0SGordon Ross  * GNU General Public License ("GPL") version 2 as published by the Free
2826f3cdf0SGordon Ross  * Software Foundation.
29db2bae30SDana Myers  *
3026f3cdf0SGordon Ross  * NO WARRANTY
3126f3cdf0SGordon Ross  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3226f3cdf0SGordon Ross  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3326f3cdf0SGordon Ross  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
3426f3cdf0SGordon Ross  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3526f3cdf0SGordon Ross  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3626f3cdf0SGordon Ross  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3726f3cdf0SGordon Ross  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3826f3cdf0SGordon Ross  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3926f3cdf0SGordon Ross  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
4026f3cdf0SGordon Ross  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4126f3cdf0SGordon Ross  * POSSIBILITY OF SUCH DAMAGES.
4226f3cdf0SGordon Ross  */
43db2bae30SDana Myers 
44db2bae30SDana Myers /*
45db2bae30SDana Myers  * DEFINE_AML_GLOBALS is tested in amlcode.h
46db2bae30SDana Myers  * to determine whether certain global names should be "defined" or only
47db2bae30SDana Myers  * "declared" in the current compilation. This enhances maintainability
48db2bae30SDana Myers  * by enabling a single header file to embody all knowledge of the names
49db2bae30SDana Myers  * in question.
50db2bae30SDana Myers  *
51db2bae30SDana Myers  * Exactly one module of any executable should #define DEFINE_GLOBALS
52db2bae30SDana Myers  * before #including the header files which use this convention. The
53db2bae30SDana Myers  * names in question will be defined and initialized in that module,
54db2bae30SDana Myers  * and declared as extern in all other modules which #include those
55db2bae30SDana Myers  * header files.
56db2bae30SDana Myers  */
57db2bae30SDana Myers 
58db2bae30SDana Myers #define DEFINE_AML_GLOBALS
59db2bae30SDana Myers 
60db2bae30SDana Myers #include "acpi.h"
61aa2aa9a6SDana Myers #include "accommon.h"
62db2bae30SDana Myers #include "acinterp.h"
63db2bae30SDana Myers #include "amlcode.h"
64db2bae30SDana Myers 
65db2bae30SDana Myers #define _COMPONENT          ACPI_EXECUTER
66db2bae30SDana Myers         ACPI_MODULE_NAME    ("exutils")
67db2bae30SDana Myers 
68db2bae30SDana Myers /* Local prototypes */
69db2bae30SDana Myers 
70db2bae30SDana Myers static UINT32
71db2bae30SDana Myers AcpiExDigitsNeeded (
7226f3cdf0SGordon Ross     UINT64                  Value,
73db2bae30SDana Myers     UINT32                  Base);
74db2bae30SDana Myers 
75db2bae30SDana Myers 
76db2bae30SDana Myers #ifndef ACPI_NO_METHOD_EXECUTION
77db2bae30SDana Myers /*******************************************************************************
78db2bae30SDana Myers  *
79db2bae30SDana Myers  * FUNCTION:    AcpiExEnterInterpreter
80db2bae30SDana Myers  *
81db2bae30SDana Myers  * PARAMETERS:  None
82db2bae30SDana Myers  *
83db2bae30SDana Myers  * RETURN:      None
84db2bae30SDana Myers  *
85db2bae30SDana Myers  * DESCRIPTION: Enter the interpreter execution region. Failure to enter
86db2bae30SDana Myers  *              the interpreter region is a fatal system error. Used in
87db2bae30SDana Myers  *              conjunction with ExitInterpreter.
88db2bae30SDana Myers  *
89db2bae30SDana Myers  ******************************************************************************/
90db2bae30SDana Myers 
91db2bae30SDana Myers void
92db2bae30SDana Myers AcpiExEnterInterpreter (
93db2bae30SDana Myers     void)
94db2bae30SDana Myers {
95db2bae30SDana Myers     ACPI_STATUS             Status;
96db2bae30SDana Myers 
97db2bae30SDana Myers 
98db2bae30SDana Myers     ACPI_FUNCTION_TRACE (ExEnterInterpreter);
99db2bae30SDana Myers 
100db2bae30SDana Myers 
101db2bae30SDana Myers     Status = AcpiUtAcquireMutex (ACPI_MTX_INTERPRETER);
102db2bae30SDana Myers     if (ACPI_FAILURE (Status))
103db2bae30SDana Myers     {
104db2bae30SDana Myers         ACPI_ERROR ((AE_INFO, "Could not acquire AML Interpreter mutex"));
105db2bae30SDana Myers     }
106db2bae30SDana Myers 
107db2bae30SDana Myers     return_VOID;
108db2bae30SDana Myers }
109db2bae30SDana Myers 
110db2bae30SDana Myers 
111db2bae30SDana Myers /*******************************************************************************
112db2bae30SDana Myers  *
113db2bae30SDana Myers  * FUNCTION:    AcpiExExitInterpreter
114db2bae30SDana Myers  *
115db2bae30SDana Myers  * PARAMETERS:  None
116db2bae30SDana Myers  *
117db2bae30SDana Myers  * RETURN:      None
118db2bae30SDana Myers  *
119db2bae30SDana Myers  * DESCRIPTION: Exit the interpreter execution region. This is the top level
120db2bae30SDana Myers  *              routine used to exit the interpreter when all processing has
121*385cc6b4SJerry Jelinek  *              been completed, or when the method blocks.
122*385cc6b4SJerry Jelinek  *
123*385cc6b4SJerry Jelinek  * Cases where the interpreter is unlocked internally:
124*385cc6b4SJerry Jelinek  *      1) Method will be blocked on a Sleep() AML opcode
125*385cc6b4SJerry Jelinek  *      2) Method will be blocked on an Acquire() AML opcode
126*385cc6b4SJerry Jelinek  *      3) Method will be blocked on a Wait() AML opcode
127*385cc6b4SJerry Jelinek  *      4) Method will be blocked to acquire the global lock
128*385cc6b4SJerry Jelinek  *      5) Method will be blocked waiting to execute a serialized control
129*385cc6b4SJerry Jelinek  *          method that is currently executing
130*385cc6b4SJerry Jelinek  *      6) About to invoke a user-installed opregion handler
131db2bae30SDana Myers  *
132db2bae30SDana Myers  ******************************************************************************/
133db2bae30SDana Myers 
134db2bae30SDana Myers void
135db2bae30SDana Myers AcpiExExitInterpreter (
136db2bae30SDana Myers     void)
137db2bae30SDana Myers {
138db2bae30SDana Myers     ACPI_STATUS             Status;
139db2bae30SDana Myers 
140db2bae30SDana Myers 
141db2bae30SDana Myers     ACPI_FUNCTION_TRACE (ExExitInterpreter);
142db2bae30SDana Myers 
143db2bae30SDana Myers 
144db2bae30SDana Myers     Status = AcpiUtReleaseMutex (ACPI_MTX_INTERPRETER);
145db2bae30SDana Myers     if (ACPI_FAILURE (Status))
146db2bae30SDana Myers     {
147db2bae30SDana Myers         ACPI_ERROR ((AE_INFO, "Could not release AML Interpreter mutex"));
148db2bae30SDana Myers     }
149db2bae30SDana Myers 
150db2bae30SDana Myers     return_VOID;
151db2bae30SDana Myers }
152db2bae30SDana Myers 
153db2bae30SDana Myers 
154db2bae30SDana Myers /*******************************************************************************
155db2bae30SDana Myers  *
156db2bae30SDana Myers  * FUNCTION:    AcpiExTruncateFor32bitTable
157db2bae30SDana Myers  *
158db2bae30SDana Myers  * PARAMETERS:  ObjDesc         - Object to be truncated
159db2bae30SDana Myers  *
160*385cc6b4SJerry Jelinek  * RETURN:      TRUE if a truncation was performed, FALSE otherwise.
161db2bae30SDana Myers  *
162db2bae30SDana Myers  * DESCRIPTION: Truncate an ACPI Integer to 32 bits if the execution mode is
163db2bae30SDana Myers  *              32-bit, as determined by the revision of the DSDT.
164db2bae30SDana Myers  *
165db2bae30SDana Myers  ******************************************************************************/
166db2bae30SDana Myers 
167*385cc6b4SJerry Jelinek BOOLEAN
168db2bae30SDana Myers AcpiExTruncateFor32bitTable (
169db2bae30SDana Myers     ACPI_OPERAND_OBJECT     *ObjDesc)
170db2bae30SDana Myers {
171db2bae30SDana Myers 
172db2bae30SDana Myers     ACPI_FUNCTION_ENTRY ();
173db2bae30SDana Myers 
174db2bae30SDana Myers 
175db2bae30SDana Myers     /*
176db2bae30SDana Myers      * Object must be a valid number and we must be executing
177*385cc6b4SJerry Jelinek      * a control method. Object could be NS node for AML_INT_NAMEPATH_OP.
178db2bae30SDana Myers      */
179db2bae30SDana Myers     if ((!ObjDesc) ||
180db2bae30SDana Myers         (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) ||
181aa2aa9a6SDana Myers         (ObjDesc->Common.Type != ACPI_TYPE_INTEGER))
182db2bae30SDana Myers     {
183*385cc6b4SJerry Jelinek         return (FALSE);
184db2bae30SDana Myers     }
185db2bae30SDana Myers 
186*385cc6b4SJerry Jelinek     if ((AcpiGbl_IntegerByteWidth == 4) &&
187*385cc6b4SJerry Jelinek         (ObjDesc->Integer.Value > (UINT64) ACPI_UINT32_MAX))
188db2bae30SDana Myers     {
189db2bae30SDana Myers         /*
190*385cc6b4SJerry Jelinek          * We are executing in a 32-bit ACPI table. Truncate
191*385cc6b4SJerry Jelinek          * the value to 32 bits by zeroing out the upper 32-bit field
192db2bae30SDana Myers          */
19326f3cdf0SGordon Ross         ObjDesc->Integer.Value &= (UINT64) ACPI_UINT32_MAX;
194*385cc6b4SJerry Jelinek         return (TRUE);
195db2bae30SDana Myers     }
196*385cc6b4SJerry Jelinek 
197*385cc6b4SJerry Jelinek     return (FALSE);
198db2bae30SDana Myers }
199db2bae30SDana Myers 
200db2bae30SDana Myers 
201db2bae30SDana Myers /*******************************************************************************
202db2bae30SDana Myers  *
203db2bae30SDana Myers  * FUNCTION:    AcpiExAcquireGlobalLock
204db2bae30SDana Myers  *
205db2bae30SDana Myers  * PARAMETERS:  FieldFlags            - Flags with Lock rule:
206db2bae30SDana Myers  *                                      AlwaysLock or NeverLock
207db2bae30SDana Myers  *
208db2bae30SDana Myers  * RETURN:      None
209db2bae30SDana Myers  *
210db2bae30SDana Myers  * DESCRIPTION: Obtain the ACPI hardware Global Lock, only if the field
211db2bae30SDana Myers  *              flags specifiy that it is to be obtained before field access.
212db2bae30SDana Myers  *
213db2bae30SDana Myers  ******************************************************************************/
214db2bae30SDana Myers 
215db2bae30SDana Myers void
216db2bae30SDana Myers AcpiExAcquireGlobalLock (
217db2bae30SDana Myers     UINT32                  FieldFlags)
218db2bae30SDana Myers {
219db2bae30SDana Myers     ACPI_STATUS             Status;
220db2bae30SDana Myers 
221db2bae30SDana Myers 
222db2bae30SDana Myers     ACPI_FUNCTION_TRACE (ExAcquireGlobalLock);
223db2bae30SDana Myers 
224db2bae30SDana Myers 
225db2bae30SDana Myers     /* Only use the lock if the AlwaysLock bit is set */
226db2bae30SDana Myers 
227db2bae30SDana Myers     if (!(FieldFlags & AML_FIELD_LOCK_RULE_MASK))
228db2bae30SDana Myers     {
229db2bae30SDana Myers         return_VOID;
230db2bae30SDana Myers     }
231db2bae30SDana Myers 
232db2bae30SDana Myers     /* Attempt to get the global lock, wait forever */
233db2bae30SDana Myers 
234db2bae30SDana Myers     Status = AcpiExAcquireMutexObject (ACPI_WAIT_FOREVER,
235db2bae30SDana Myers         AcpiGbl_GlobalLockMutex, AcpiOsGetThreadId ());
236db2bae30SDana Myers 
237db2bae30SDana Myers     if (ACPI_FAILURE (Status))
238db2bae30SDana Myers     {
239db2bae30SDana Myers         ACPI_EXCEPTION ((AE_INFO, Status,
240db2bae30SDana Myers             "Could not acquire Global Lock"));
241db2bae30SDana Myers     }
242db2bae30SDana Myers 
243db2bae30SDana Myers     return_VOID;
244db2bae30SDana Myers }
245db2bae30SDana Myers 
246db2bae30SDana Myers 
247db2bae30SDana Myers /*******************************************************************************
248db2bae30SDana Myers  *
249db2bae30SDana Myers  * FUNCTION:    AcpiExReleaseGlobalLock
250db2bae30SDana Myers  *
251db2bae30SDana Myers  * PARAMETERS:  FieldFlags            - Flags with Lock rule:
252db2bae30SDana Myers  *                                      AlwaysLock or NeverLock
253db2bae30SDana Myers  *
254db2bae30SDana Myers  * RETURN:      None
255db2bae30SDana Myers  *
256db2bae30SDana Myers  * DESCRIPTION: Release the ACPI hardware Global Lock
257db2bae30SDana Myers  *
258db2bae30SDana Myers  ******************************************************************************/
259db2bae30SDana Myers 
260db2bae30SDana Myers void
261db2bae30SDana Myers AcpiExReleaseGlobalLock (
262db2bae30SDana Myers     UINT32                  FieldFlags)
263db2bae30SDana Myers {
264db2bae30SDana Myers     ACPI_STATUS             Status;
265db2bae30SDana Myers 
266db2bae30SDana Myers 
267db2bae30SDana Myers     ACPI_FUNCTION_TRACE (ExReleaseGlobalLock);
268db2bae30SDana Myers 
269db2bae30SDana Myers 
270db2bae30SDana Myers     /* Only use the lock if the AlwaysLock bit is set */
271db2bae30SDana Myers 
272db2bae30SDana Myers     if (!(FieldFlags & AML_FIELD_LOCK_RULE_MASK))
273db2bae30SDana Myers     {
274db2bae30SDana Myers         return_VOID;
275db2bae30SDana Myers     }
276db2bae30SDana Myers 
277db2bae30SDana Myers     /* Release the global lock */
278db2bae30SDana Myers 
279db2bae30SDana Myers     Status = AcpiExReleaseMutexObject (AcpiGbl_GlobalLockMutex);
280db2bae30SDana Myers     if (ACPI_FAILURE (Status))
281db2bae30SDana Myers     {
282db2bae30SDana Myers         /* Report the error, but there isn't much else we can do */
283db2bae30SDana Myers 
284db2bae30SDana Myers         ACPI_EXCEPTION ((AE_INFO, Status,
285db2bae30SDana Myers             "Could not release Global Lock"));
286db2bae30SDana Myers     }
287db2bae30SDana Myers 
288db2bae30SDana Myers     return_VOID;
289db2bae30SDana Myers }
290db2bae30SDana Myers 
291db2bae30SDana Myers 
292db2bae30SDana Myers /*******************************************************************************
293db2bae30SDana Myers  *
294db2bae30SDana Myers  * FUNCTION:    AcpiExDigitsNeeded
295db2bae30SDana Myers  *
296db2bae30SDana Myers  * PARAMETERS:  Value           - Value to be represented
297db2bae30SDana Myers  *              Base            - Base of representation
298db2bae30SDana Myers  *
299db2bae30SDana Myers  * RETURN:      The number of digits.
300db2bae30SDana Myers  *
301db2bae30SDana Myers  * DESCRIPTION: Calculate the number of digits needed to represent the Value
302db2bae30SDana Myers  *              in the given Base (Radix)
303db2bae30SDana Myers  *
304db2bae30SDana Myers  ******************************************************************************/
305db2bae30SDana Myers 
306db2bae30SDana Myers static UINT32
307db2bae30SDana Myers AcpiExDigitsNeeded (
30826f3cdf0SGordon Ross     UINT64                  Value,
309db2bae30SDana Myers     UINT32                  Base)
310db2bae30SDana Myers {
311db2bae30SDana Myers     UINT32                  NumDigits;
31226f3cdf0SGordon Ross     UINT64                  CurrentValue;
313db2bae30SDana Myers 
314db2bae30SDana Myers 
315db2bae30SDana Myers     ACPI_FUNCTION_TRACE (ExDigitsNeeded);
316db2bae30SDana Myers 
317db2bae30SDana Myers 
31826f3cdf0SGordon Ross     /* UINT64 is unsigned, so we don't worry about a '-' prefix */
319db2bae30SDana Myers 
320db2bae30SDana Myers     if (Value == 0)
321db2bae30SDana Myers     {
322db2bae30SDana Myers         return_UINT32 (1);
323db2bae30SDana Myers     }
324db2bae30SDana Myers 
325db2bae30SDana Myers     CurrentValue = Value;
326db2bae30SDana Myers     NumDigits = 0;
327db2bae30SDana Myers 
328db2bae30SDana Myers     /* Count the digits in the requested base */
329db2bae30SDana Myers 
330db2bae30SDana Myers     while (CurrentValue)
331db2bae30SDana Myers     {
332db2bae30SDana Myers         (void) AcpiUtShortDivide (CurrentValue, Base, &CurrentValue, NULL);
333db2bae30SDana Myers         NumDigits++;
334db2bae30SDana Myers     }
335db2bae30SDana Myers 
336db2bae30SDana Myers     return_UINT32 (NumDigits);
337db2bae30SDana Myers }
338db2bae30SDana Myers 
339db2bae30SDana Myers 
340db2bae30SDana Myers /*******************************************************************************
341db2bae30SDana Myers  *
342db2bae30SDana Myers  * FUNCTION:    AcpiExEisaIdToString
343db2bae30SDana Myers  *
344*385cc6b4SJerry Jelinek  * PARAMETERS:  OutString       - Where to put the converted string (8 bytes)
345*385cc6b4SJerry Jelinek  *              CompressedId    - EISAID to be converted
346db2bae30SDana Myers  *
347db2bae30SDana Myers  * RETURN:      None
348db2bae30SDana Myers  *
34957190917SDana Myers  * DESCRIPTION: Convert a numeric EISAID to string representation. Return
35057190917SDana Myers  *              buffer must be large enough to hold the string. The string
35157190917SDana Myers  *              returned is always exactly of length ACPI_EISAID_STRING_SIZE
35257190917SDana Myers  *              (includes null terminator). The EISAID is always 32 bits.
353db2bae30SDana Myers  *
354db2bae30SDana Myers  ******************************************************************************/
355db2bae30SDana Myers 
356db2bae30SDana Myers void
357db2bae30SDana Myers AcpiExEisaIdToString (
35857190917SDana Myers     char                    *OutString,
35926f3cdf0SGordon Ross     UINT64                  CompressedId)
360db2bae30SDana Myers {
36157190917SDana Myers     UINT32                  SwappedId;
362db2bae30SDana Myers 
363db2bae30SDana Myers 
364db2bae30SDana Myers     ACPI_FUNCTION_ENTRY ();
365db2bae30SDana Myers 
366db2bae30SDana Myers 
36757190917SDana Myers     /* The EISAID should be a 32-bit integer */
36857190917SDana Myers 
36957190917SDana Myers     if (CompressedId > ACPI_UINT32_MAX)
37057190917SDana Myers     {
37157190917SDana Myers         ACPI_WARNING ((AE_INFO,
372*385cc6b4SJerry Jelinek             "Expected EISAID is larger than 32 bits: "
373*385cc6b4SJerry Jelinek             "0x%8.8X%8.8X, truncating",
37457190917SDana Myers             ACPI_FORMAT_UINT64 (CompressedId)));
37557190917SDana Myers     }
37657190917SDana Myers 
377db2bae30SDana Myers     /* Swap ID to big-endian to get contiguous bits */
378db2bae30SDana Myers 
37957190917SDana Myers     SwappedId = AcpiUtDwordByteSwap ((UINT32) CompressedId);
380db2bae30SDana Myers 
38157190917SDana Myers     /* First 3 bytes are uppercase letters. Next 4 bytes are hexadecimal */
38257190917SDana Myers 
38357190917SDana Myers     OutString[0] = (char) (0x40 + (((unsigned long) SwappedId >> 26) & 0x1F));
38457190917SDana Myers     OutString[1] = (char) (0x40 + ((SwappedId >> 21) & 0x1F));
38557190917SDana Myers     OutString[2] = (char) (0x40 + ((SwappedId >> 16) & 0x1F));
38626f3cdf0SGordon Ross     OutString[3] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 12);
38726f3cdf0SGordon Ross     OutString[4] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 8);
38826f3cdf0SGordon Ross     OutString[5] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 4);
38926f3cdf0SGordon Ross     OutString[6] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 0);
390db2bae30SDana Myers     OutString[7] = 0;
391db2bae30SDana Myers }
392db2bae30SDana Myers 
393db2bae30SDana Myers 
394db2bae30SDana Myers /*******************************************************************************
395db2bae30SDana Myers  *
39657190917SDana Myers  * FUNCTION:    AcpiExIntegerToString
397db2bae30SDana Myers  *
39857190917SDana Myers  * PARAMETERS:  OutString       - Where to put the converted string. At least
39957190917SDana Myers  *                                21 bytes are needed to hold the largest
40057190917SDana Myers  *                                possible 64-bit integer.
40157190917SDana Myers  *              Value           - Value to be converted
402db2bae30SDana Myers  *
403*385cc6b4SJerry Jelinek  * RETURN:      Converted string in OutString
404db2bae30SDana Myers  *
40557190917SDana Myers  * DESCRIPTION: Convert a 64-bit integer to decimal string representation.
40657190917SDana Myers  *              Assumes string buffer is large enough to hold the string. The
40757190917SDana Myers  *              largest string is (ACPI_MAX64_DECIMAL_DIGITS + 1).
408db2bae30SDana Myers  *
409db2bae30SDana Myers  ******************************************************************************/
410db2bae30SDana Myers 
411db2bae30SDana Myers void
41257190917SDana Myers AcpiExIntegerToString (
41357190917SDana Myers     char                    *OutString,
41426f3cdf0SGordon Ross     UINT64                  Value)
415db2bae30SDana Myers {
416db2bae30SDana Myers     UINT32                  Count;
417db2bae30SDana Myers     UINT32                  DigitsNeeded;
418db2bae30SDana Myers     UINT32                  Remainder;
419db2bae30SDana Myers 
420db2bae30SDana Myers 
421db2bae30SDana Myers     ACPI_FUNCTION_ENTRY ();
422db2bae30SDana Myers 
423db2bae30SDana Myers 
424db2bae30SDana Myers     DigitsNeeded = AcpiExDigitsNeeded (Value, 10);
425db2bae30SDana Myers     OutString[DigitsNeeded] = 0;
426db2bae30SDana Myers 
427db2bae30SDana Myers     for (Count = DigitsNeeded; Count > 0; Count--)
428db2bae30SDana Myers     {
429db2bae30SDana Myers         (void) AcpiUtShortDivide (Value, 10, &Value, &Remainder);
430db2bae30SDana Myers         OutString[Count-1] = (char) ('0' + Remainder);\
431db2bae30SDana Myers     }
432db2bae30SDana Myers }
433db2bae30SDana Myers 
434*385cc6b4SJerry Jelinek 
435*385cc6b4SJerry Jelinek /*******************************************************************************
436*385cc6b4SJerry Jelinek  *
437*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiExPciClsToString
438*385cc6b4SJerry Jelinek  *
439*385cc6b4SJerry Jelinek  * PARAMETERS:  OutString       - Where to put the converted string (7 bytes)
440*385cc6b4SJerry Jelinek  *              ClassCode       - PCI class code to be converted (3 bytes)
441*385cc6b4SJerry Jelinek  *
442*385cc6b4SJerry Jelinek  * RETURN:      Converted string in OutString
443*385cc6b4SJerry Jelinek  *
444*385cc6b4SJerry Jelinek  * DESCRIPTION: Convert 3-bytes PCI class code to string representation.
445*385cc6b4SJerry Jelinek  *              Return buffer must be large enough to hold the string. The
446*385cc6b4SJerry Jelinek  *              string returned is always exactly of length
447*385cc6b4SJerry Jelinek  *              ACPI_PCICLS_STRING_SIZE (includes null terminator).
448*385cc6b4SJerry Jelinek  *
449*385cc6b4SJerry Jelinek  ******************************************************************************/
450*385cc6b4SJerry Jelinek 
451*385cc6b4SJerry Jelinek void
452*385cc6b4SJerry Jelinek AcpiExPciClsToString (
453*385cc6b4SJerry Jelinek     char                    *OutString,
454*385cc6b4SJerry Jelinek     UINT8                   ClassCode[3])
455*385cc6b4SJerry Jelinek {
456*385cc6b4SJerry Jelinek 
457*385cc6b4SJerry Jelinek     ACPI_FUNCTION_ENTRY ();
458*385cc6b4SJerry Jelinek 
459*385cc6b4SJerry Jelinek 
460*385cc6b4SJerry Jelinek     /* All 3 bytes are hexadecimal */
461*385cc6b4SJerry Jelinek 
462*385cc6b4SJerry Jelinek     OutString[0] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[0], 4);
463*385cc6b4SJerry Jelinek     OutString[1] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[0], 0);
464*385cc6b4SJerry Jelinek     OutString[2] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[1], 4);
465*385cc6b4SJerry Jelinek     OutString[3] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[1], 0);
466*385cc6b4SJerry Jelinek     OutString[4] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[2], 4);
467*385cc6b4SJerry Jelinek     OutString[5] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[2], 0);
468*385cc6b4SJerry Jelinek     OutString[6] = 0;
469*385cc6b4SJerry Jelinek }
470*385cc6b4SJerry Jelinek 
471*385cc6b4SJerry Jelinek 
472*385cc6b4SJerry Jelinek /*******************************************************************************
473*385cc6b4SJerry Jelinek  *
474*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiIsValidSpaceId
475*385cc6b4SJerry Jelinek  *
476*385cc6b4SJerry Jelinek  * PARAMETERS:  SpaceId             - ID to be validated
477*385cc6b4SJerry Jelinek  *
478*385cc6b4SJerry Jelinek  * RETURN:      TRUE if SpaceId is a valid/supported ID.
479*385cc6b4SJerry Jelinek  *
480*385cc6b4SJerry Jelinek  * DESCRIPTION: Validate an operation region SpaceID.
481*385cc6b4SJerry Jelinek  *
482*385cc6b4SJerry Jelinek  ******************************************************************************/
483*385cc6b4SJerry Jelinek 
484*385cc6b4SJerry Jelinek BOOLEAN
485*385cc6b4SJerry Jelinek AcpiIsValidSpaceId (
486*385cc6b4SJerry Jelinek     UINT8                   SpaceId)
487*385cc6b4SJerry Jelinek {
488*385cc6b4SJerry Jelinek 
489*385cc6b4SJerry Jelinek     if ((SpaceId >= ACPI_NUM_PREDEFINED_REGIONS) &&
490*385cc6b4SJerry Jelinek         (SpaceId < ACPI_USER_REGION_BEGIN) &&
491*385cc6b4SJerry Jelinek         (SpaceId != ACPI_ADR_SPACE_DATA_TABLE) &&
492*385cc6b4SJerry Jelinek         (SpaceId != ACPI_ADR_SPACE_FIXED_HARDWARE))
493*385cc6b4SJerry Jelinek     {
494*385cc6b4SJerry Jelinek         return (FALSE);
495*385cc6b4SJerry Jelinek     }
496*385cc6b4SJerry Jelinek 
497*385cc6b4SJerry Jelinek     return (TRUE);
498*385cc6b4SJerry Jelinek }
499*385cc6b4SJerry Jelinek 
500db2bae30SDana Myers #endif
501