utglobal.c revision 193267
1240116Smarcel/******************************************************************************
2240116Smarcel *
3240116Smarcel * Module Name: utglobal - Global variables for the ACPI subsystem
4240116Smarcel *
5240116Smarcel *****************************************************************************/
6240116Smarcel
7240116Smarcel/******************************************************************************
8240116Smarcel *
9240116Smarcel * 1. Copyright Notice
10240116Smarcel *
11240116Smarcel * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp.
12240116Smarcel * All rights reserved.
13240116Smarcel *
14240116Smarcel * 2. License
15240116Smarcel *
16240116Smarcel * 2.1. This is your license from Intel Corp. under its intellectual property
17240116Smarcel * rights.  You may have additional license terms from the party that provided
18240116Smarcel * you this software, covering your right to use that party's intellectual
19240116Smarcel * property rights.
20240116Smarcel *
21240116Smarcel * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22240116Smarcel * copy of the source code appearing in this file ("Covered Code") an
23240116Smarcel * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24240116Smarcel * base code distributed originally by Intel ("Original Intel Code") to copy,
25240116Smarcel * make derivatives, distribute, use and display any portion of the Covered
26273929Sjmmv * Code in any form, with the right to sublicense such rights; and
27273929Sjmmv *
28240116Smarcel * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29240116Smarcel * license (with the right to sublicense), under only those claims of Intel
30240116Smarcel * patents that are infringed by the Original Intel Code, to make, use, sell,
31240116Smarcel * offer to sell, and import the Covered Code and derivative works thereof
32240116Smarcel * solely to the minimum extent necessary to exercise the above copyright
33240116Smarcel * license, and in no event shall the patent license extend to any additions
34240116Smarcel * to or modifications of the Original Intel Code.  No other license or right
35240116Smarcel * is granted directly or by implication, estoppel or otherwise;
36240116Smarcel *
37240116Smarcel * The above copyright and patent license is granted only if the following
38240116Smarcel * conditions are met:
39240116Smarcel *
40240116Smarcel * 3. Conditions
41240116Smarcel *
42240116Smarcel * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43240116Smarcel * Redistribution of source code of any substantial portion of the Covered
44240116Smarcel * Code or modification with rights to further distribute source must include
45240116Smarcel * the above Copyright Notice, the above License, this list of Conditions,
46240116Smarcel * and the following Disclaimer and Export Compliance provision.  In addition,
47240116Smarcel * Licensee must cause all Covered Code to which Licensee contributes to
48240116Smarcel * contain a file documenting the changes Licensee made to create that Covered
49240116Smarcel * Code and the date of any change.  Licensee must include in that file the
50240116Smarcel * documentation of any changes made by any predecessor Licensee.  Licensee
51240116Smarcel * must include a prominent statement that the modification is derived,
52240116Smarcel * directly or indirectly, from Original Intel Code.
53240116Smarcel *
54273929Sjmmv * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55 * Redistribution of source code of any substantial portion of the Covered
56 * Code or modification without rights to further distribute source must
57 * include the following Disclaimer and Export Compliance provision in the
58 * documentation and/or other materials provided with distribution.  In
59 * addition, Licensee may not authorize further sublicense of source of any
60 * portion of the Covered Code, and must include terms to the effect that the
61 * license from Licensee to its licensee is limited to the intellectual
62 * property embodied in the software Licensee provides to its licensee, and
63 * not to intellectual property embodied in modifications its licensee may
64 * make.
65 *
66 * 3.3. Redistribution of Executable. Redistribution in executable form of any
67 * substantial portion of the Covered Code or modification must reproduce the
68 * above Copyright Notice, and the following Disclaimer and Export Compliance
69 * provision in the documentation and/or other materials provided with the
70 * distribution.
71 *
72 * 3.4. Intel retains all right, title, and interest in and to the Original
73 * Intel Code.
74 *
75 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76 * Intel shall be used in advertising or otherwise to promote the sale, use or
77 * other dealings in products derived from or relating to the Covered Code
78 * without prior written authorization from Intel.
79 *
80 * 4. Disclaimer and Export Compliance
81 *
82 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83 * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
85 * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
86 * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
87 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88 * PARTICULAR PURPOSE.
89 *
90 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
96 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97 * LIMITED REMEDY.
98 *
99 * 4.3. Licensee shall not export, either directly or indirectly, any of this
100 * software or system incorporating such software without first obtaining any
101 * required license or other approval from the U. S. Department of Commerce or
102 * any other agency or department of the United States Government.  In the
103 * event Licensee exports any such software from the United States or
104 * re-exports any such software from a foreign destination, Licensee shall
105 * ensure that the distribution and export/re-export of the software is in
106 * compliance with all laws, regulations, orders, or other restrictions of the
107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108 * any of its subsidiaries will export/re-export any technical data, process,
109 * software, or service, directly or indirectly, to any country for which the
110 * United States government or any agency thereof requires an export license,
111 * other governmental approval, or letter of assurance, without first obtaining
112 * such license, approval or letter.
113 *
114 *****************************************************************************/
115
116#define __UTGLOBAL_C__
117#define DEFINE_ACPI_GLOBALS
118
119#include "acpi.h"
120#include "accommon.h"
121#include "acnamesp.h"
122
123#define _COMPONENT          ACPI_UTILITIES
124        ACPI_MODULE_NAME    ("utglobal")
125
126
127/*******************************************************************************
128 *
129 * Static global variable initialization.
130 *
131 ******************************************************************************/
132
133/*
134 * We want the debug switches statically initialized so they
135 * are already set when the debugger is entered.
136 */
137
138/* Debug switch - level and trace mask */
139
140#ifdef ACPI_DEBUG_OUTPUT
141UINT32                      AcpiDbgLevel = ACPI_DEBUG_DEFAULT;
142#else
143UINT32                      AcpiDbgLevel = ACPI_NORMAL_DEFAULT;
144#endif
145
146/* Debug switch - layer (component) mask */
147
148UINT32                      AcpiDbgLayer = ACPI_COMPONENT_DEFAULT;
149UINT32                      AcpiGbl_NestingLevel = 0;
150
151/* Debugger globals */
152
153BOOLEAN                     AcpiGbl_DbTerminateThreads = FALSE;
154BOOLEAN                     AcpiGbl_AbortMethod = FALSE;
155BOOLEAN                     AcpiGbl_MethodExecuting = FALSE;
156
157/* System flags */
158
159UINT32                      AcpiGbl_StartupFlags = 0;
160
161/* System starts uninitialized */
162
163BOOLEAN                     AcpiGbl_Shutdown = TRUE;
164
165const char                  *AcpiGbl_SleepStateNames[ACPI_S_STATE_COUNT] =
166{
167    "\\_S0_",
168    "\\_S1_",
169    "\\_S2_",
170    "\\_S3_",
171    "\\_S4_",
172    "\\_S5_"
173};
174
175const char                  *AcpiGbl_HighestDstateNames[4] =
176{
177    "_S1D",
178    "_S2D",
179    "_S3D",
180    "_S4D"
181};
182
183
184/*******************************************************************************
185 *
186 * FUNCTION:    AcpiFormatException
187 *
188 * PARAMETERS:  Status       - The ACPI_STATUS code to be formatted
189 *
190 * RETURN:      A string containing the exception text. A valid pointer is
191 *              always returned.
192 *
193 * DESCRIPTION: This function translates an ACPI exception into an ASCII string
194 *              It is here instead of utxface.c so it is always present.
195 *
196 ******************************************************************************/
197
198const char *
199AcpiFormatException (
200    ACPI_STATUS             Status)
201{
202    const char              *Exception = NULL;
203
204
205    ACPI_FUNCTION_ENTRY ();
206
207
208    Exception = AcpiUtValidateException (Status);
209    if (!Exception)
210    {
211        /* Exception code was not recognized */
212
213        ACPI_ERROR ((AE_INFO,
214            "Unknown exception code: 0x%8.8X", Status));
215
216        Exception = "UNKNOWN_STATUS_CODE";
217    }
218
219    return (ACPI_CAST_PTR (const char, Exception));
220}
221
222ACPI_EXPORT_SYMBOL (AcpiFormatException)
223
224
225/*******************************************************************************
226 *
227 * Namespace globals
228 *
229 ******************************************************************************/
230
231/*
232 * Predefined ACPI Names (Built-in to the Interpreter)
233 *
234 * NOTES:
235 * 1) _SB_ is defined to be a device to allow \_SB_._INI to be run
236 *    during the initialization sequence.
237 * 2) _TZ_ is defined to be a thermal zone in order to allow ASL code to
238 *    perform a Notify() operation on it.
239 */
240const ACPI_PREDEFINED_NAMES     AcpiGbl_PreDefinedNames[] =
241{
242    {"_GPE",    ACPI_TYPE_LOCAL_SCOPE,      NULL},
243    {"_PR_",    ACPI_TYPE_LOCAL_SCOPE,      NULL},
244    {"_SB_",    ACPI_TYPE_DEVICE,           NULL},
245    {"_SI_",    ACPI_TYPE_LOCAL_SCOPE,      NULL},
246    {"_TZ_",    ACPI_TYPE_THERMAL,          NULL},
247    {"_REV",    ACPI_TYPE_INTEGER,          (char *) ACPI_CA_SUPPORT_LEVEL},
248    {"_OS_",    ACPI_TYPE_STRING,           ACPI_OS_NAME},
249    {"_GL_",    ACPI_TYPE_MUTEX,            (char *) 1},
250
251#if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
252    {"_OSI",    ACPI_TYPE_METHOD,           (char *) 1},
253#endif
254
255    /* Table terminator */
256
257    {NULL,      ACPI_TYPE_ANY,              NULL}
258};
259
260/*
261 * Properties of the ACPI Object Types, both internal and external.
262 * The table is indexed by values of ACPI_OBJECT_TYPE
263 */
264const UINT8                     AcpiGbl_NsProperties[ACPI_NUM_NS_TYPES] =
265{
266    ACPI_NS_NORMAL,                     /* 00 Any              */
267    ACPI_NS_NORMAL,                     /* 01 Number           */
268    ACPI_NS_NORMAL,                     /* 02 String           */
269    ACPI_NS_NORMAL,                     /* 03 Buffer           */
270    ACPI_NS_NORMAL,                     /* 04 Package          */
271    ACPI_NS_NORMAL,                     /* 05 FieldUnit        */
272    ACPI_NS_NEWSCOPE,                   /* 06 Device           */
273    ACPI_NS_NORMAL,                     /* 07 Event            */
274    ACPI_NS_NEWSCOPE,                   /* 08 Method           */
275    ACPI_NS_NORMAL,                     /* 09 Mutex            */
276    ACPI_NS_NORMAL,                     /* 10 Region           */
277    ACPI_NS_NEWSCOPE,                   /* 11 Power            */
278    ACPI_NS_NEWSCOPE,                   /* 12 Processor        */
279    ACPI_NS_NEWSCOPE,                   /* 13 Thermal          */
280    ACPI_NS_NORMAL,                     /* 14 BufferField      */
281    ACPI_NS_NORMAL,                     /* 15 DdbHandle        */
282    ACPI_NS_NORMAL,                     /* 16 Debug Object     */
283    ACPI_NS_NORMAL,                     /* 17 DefField         */
284    ACPI_NS_NORMAL,                     /* 18 BankField        */
285    ACPI_NS_NORMAL,                     /* 19 IndexField       */
286    ACPI_NS_NORMAL,                     /* 20 Reference        */
287    ACPI_NS_NORMAL,                     /* 21 Alias            */
288    ACPI_NS_NORMAL,                     /* 22 MethodAlias      */
289    ACPI_NS_NORMAL,                     /* 23 Notify           */
290    ACPI_NS_NORMAL,                     /* 24 Address Handler  */
291    ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL,   /* 25 Resource Desc    */
292    ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL,   /* 26 Resource Field   */
293    ACPI_NS_NEWSCOPE,                   /* 27 Scope            */
294    ACPI_NS_NORMAL,                     /* 28 Extra            */
295    ACPI_NS_NORMAL,                     /* 29 Data             */
296    ACPI_NS_NORMAL                      /* 30 Invalid          */
297};
298
299
300/* Hex to ASCII conversion table */
301
302static const char           AcpiGbl_HexToAscii[] =
303{
304    '0','1','2','3','4','5','6','7',
305    '8','9','A','B','C','D','E','F'
306};
307
308
309/*******************************************************************************
310 *
311 * FUNCTION:    AcpiUtHexToAsciiChar
312 *
313 * PARAMETERS:  Integer             - Contains the hex digit
314 *              Position            - bit position of the digit within the
315 *                                    integer (multiple of 4)
316 *
317 * RETURN:      The converted Ascii character
318 *
319 * DESCRIPTION: Convert a hex digit to an Ascii character
320 *
321 ******************************************************************************/
322
323char
324AcpiUtHexToAsciiChar (
325    ACPI_INTEGER            Integer,
326    UINT32                  Position)
327{
328
329    return (AcpiGbl_HexToAscii[(Integer >> Position) & 0xF]);
330}
331
332
333/******************************************************************************
334 *
335 * Event and Hardware globals
336 *
337 ******************************************************************************/
338
339ACPI_BIT_REGISTER_INFO      AcpiGbl_BitRegisterInfo[ACPI_NUM_BITREG] =
340{
341    /* Name                                     Parent Register             Register Bit Position                   Register Bit Mask       */
342
343    /* ACPI_BITREG_TIMER_STATUS         */   {ACPI_REGISTER_PM1_STATUS,   ACPI_BITPOSITION_TIMER_STATUS,          ACPI_BITMASK_TIMER_STATUS},
344    /* ACPI_BITREG_BUS_MASTER_STATUS    */   {ACPI_REGISTER_PM1_STATUS,   ACPI_BITPOSITION_BUS_MASTER_STATUS,     ACPI_BITMASK_BUS_MASTER_STATUS},
345    /* ACPI_BITREG_GLOBAL_LOCK_STATUS   */   {ACPI_REGISTER_PM1_STATUS,   ACPI_BITPOSITION_GLOBAL_LOCK_STATUS,    ACPI_BITMASK_GLOBAL_LOCK_STATUS},
346    /* ACPI_BITREG_POWER_BUTTON_STATUS  */   {ACPI_REGISTER_PM1_STATUS,   ACPI_BITPOSITION_POWER_BUTTON_STATUS,   ACPI_BITMASK_POWER_BUTTON_STATUS},
347    /* ACPI_BITREG_SLEEP_BUTTON_STATUS  */   {ACPI_REGISTER_PM1_STATUS,   ACPI_BITPOSITION_SLEEP_BUTTON_STATUS,   ACPI_BITMASK_SLEEP_BUTTON_STATUS},
348    /* ACPI_BITREG_RT_CLOCK_STATUS      */   {ACPI_REGISTER_PM1_STATUS,   ACPI_BITPOSITION_RT_CLOCK_STATUS,       ACPI_BITMASK_RT_CLOCK_STATUS},
349    /* ACPI_BITREG_WAKE_STATUS          */   {ACPI_REGISTER_PM1_STATUS,   ACPI_BITPOSITION_WAKE_STATUS,           ACPI_BITMASK_WAKE_STATUS},
350    /* ACPI_BITREG_PCIEXP_WAKE_STATUS   */   {ACPI_REGISTER_PM1_STATUS,   ACPI_BITPOSITION_PCIEXP_WAKE_STATUS,    ACPI_BITMASK_PCIEXP_WAKE_STATUS},
351
352    /* ACPI_BITREG_TIMER_ENABLE         */   {ACPI_REGISTER_PM1_ENABLE,   ACPI_BITPOSITION_TIMER_ENABLE,          ACPI_BITMASK_TIMER_ENABLE},
353    /* ACPI_BITREG_GLOBAL_LOCK_ENABLE   */   {ACPI_REGISTER_PM1_ENABLE,   ACPI_BITPOSITION_GLOBAL_LOCK_ENABLE,    ACPI_BITMASK_GLOBAL_LOCK_ENABLE},
354    /* ACPI_BITREG_POWER_BUTTON_ENABLE  */   {ACPI_REGISTER_PM1_ENABLE,   ACPI_BITPOSITION_POWER_BUTTON_ENABLE,   ACPI_BITMASK_POWER_BUTTON_ENABLE},
355    /* ACPI_BITREG_SLEEP_BUTTON_ENABLE  */   {ACPI_REGISTER_PM1_ENABLE,   ACPI_BITPOSITION_SLEEP_BUTTON_ENABLE,   ACPI_BITMASK_SLEEP_BUTTON_ENABLE},
356    /* ACPI_BITREG_RT_CLOCK_ENABLE      */   {ACPI_REGISTER_PM1_ENABLE,   ACPI_BITPOSITION_RT_CLOCK_ENABLE,       ACPI_BITMASK_RT_CLOCK_ENABLE},
357    /* ACPI_BITREG_PCIEXP_WAKE_DISABLE  */   {ACPI_REGISTER_PM1_ENABLE,   ACPI_BITPOSITION_PCIEXP_WAKE_DISABLE,   ACPI_BITMASK_PCIEXP_WAKE_DISABLE},
358
359    /* ACPI_BITREG_SCI_ENABLE           */   {ACPI_REGISTER_PM1_CONTROL,  ACPI_BITPOSITION_SCI_ENABLE,            ACPI_BITMASK_SCI_ENABLE},
360    /* ACPI_BITREG_BUS_MASTER_RLD       */   {ACPI_REGISTER_PM1_CONTROL,  ACPI_BITPOSITION_BUS_MASTER_RLD,        ACPI_BITMASK_BUS_MASTER_RLD},
361    /* ACPI_BITREG_GLOBAL_LOCK_RELEASE  */   {ACPI_REGISTER_PM1_CONTROL,  ACPI_BITPOSITION_GLOBAL_LOCK_RELEASE,   ACPI_BITMASK_GLOBAL_LOCK_RELEASE},
362    /* ACPI_BITREG_SLEEP_TYPE           */   {ACPI_REGISTER_PM1_CONTROL,  ACPI_BITPOSITION_SLEEP_TYPE,            ACPI_BITMASK_SLEEP_TYPE},
363    /* ACPI_BITREG_SLEEP_ENABLE         */   {ACPI_REGISTER_PM1_CONTROL,  ACPI_BITPOSITION_SLEEP_ENABLE,          ACPI_BITMASK_SLEEP_ENABLE},
364
365    /* ACPI_BITREG_ARB_DIS              */   {ACPI_REGISTER_PM2_CONTROL,  ACPI_BITPOSITION_ARB_DISABLE,           ACPI_BITMASK_ARB_DISABLE}
366};
367
368
369ACPI_FIXED_EVENT_INFO       AcpiGbl_FixedEventInfo[ACPI_NUM_FIXED_EVENTS] =
370{
371    /* ACPI_EVENT_PMTIMER       */  {ACPI_BITREG_TIMER_STATUS,          ACPI_BITREG_TIMER_ENABLE,        ACPI_BITMASK_TIMER_STATUS,          ACPI_BITMASK_TIMER_ENABLE},
372    /* ACPI_EVENT_GLOBAL        */  {ACPI_BITREG_GLOBAL_LOCK_STATUS,    ACPI_BITREG_GLOBAL_LOCK_ENABLE,  ACPI_BITMASK_GLOBAL_LOCK_STATUS,    ACPI_BITMASK_GLOBAL_LOCK_ENABLE},
373    /* ACPI_EVENT_POWER_BUTTON  */  {ACPI_BITREG_POWER_BUTTON_STATUS,   ACPI_BITREG_POWER_BUTTON_ENABLE, ACPI_BITMASK_POWER_BUTTON_STATUS,   ACPI_BITMASK_POWER_BUTTON_ENABLE},
374    /* ACPI_EVENT_SLEEP_BUTTON  */  {ACPI_BITREG_SLEEP_BUTTON_STATUS,   ACPI_BITREG_SLEEP_BUTTON_ENABLE, ACPI_BITMASK_SLEEP_BUTTON_STATUS,   ACPI_BITMASK_SLEEP_BUTTON_ENABLE},
375    /* ACPI_EVENT_RTC           */  {ACPI_BITREG_RT_CLOCK_STATUS,       ACPI_BITREG_RT_CLOCK_ENABLE,     ACPI_BITMASK_RT_CLOCK_STATUS,       ACPI_BITMASK_RT_CLOCK_ENABLE},
376};
377
378/*******************************************************************************
379 *
380 * FUNCTION:    AcpiUtGetRegionName
381 *
382 * PARAMETERS:  None.
383 *
384 * RETURN:      Status
385 *
386 * DESCRIPTION: Translate a Space ID into a name string (Debug only)
387 *
388 ******************************************************************************/
389
390/* Region type decoding */
391
392const char        *AcpiGbl_RegionTypes[ACPI_NUM_PREDEFINED_REGIONS] =
393{
394    "SystemMemory",
395    "SystemIO",
396    "PCI_Config",
397    "EmbeddedControl",
398    "SMBus",
399    "SystemCMOS",
400    "PCIBARTarget",
401    "DataTable"
402};
403
404
405char *
406AcpiUtGetRegionName (
407    UINT8                   SpaceId)
408{
409
410    if (SpaceId >= ACPI_USER_REGION_BEGIN)
411    {
412        return ("UserDefinedRegion");
413    }
414    else if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
415    {
416        return ("InvalidSpaceId");
417    }
418
419    return (ACPI_CAST_PTR (char, AcpiGbl_RegionTypes[SpaceId]));
420}
421
422
423/*******************************************************************************
424 *
425 * FUNCTION:    AcpiUtGetEventName
426 *
427 * PARAMETERS:  None.
428 *
429 * RETURN:      Status
430 *
431 * DESCRIPTION: Translate a Event ID into a name string (Debug only)
432 *
433 ******************************************************************************/
434
435/* Event type decoding */
436
437static const char        *AcpiGbl_EventTypes[ACPI_NUM_FIXED_EVENTS] =
438{
439    "PM_Timer",
440    "GlobalLock",
441    "PowerButton",
442    "SleepButton",
443    "RealTimeClock",
444};
445
446
447char *
448AcpiUtGetEventName (
449    UINT32                  EventId)
450{
451
452    if (EventId > ACPI_EVENT_MAX)
453    {
454        return ("InvalidEventID");
455    }
456
457    return (ACPI_CAST_PTR (char, AcpiGbl_EventTypes[EventId]));
458}
459
460
461/*******************************************************************************
462 *
463 * FUNCTION:    AcpiUtGetTypeName
464 *
465 * PARAMETERS:  None.
466 *
467 * RETURN:      Status
468 *
469 * DESCRIPTION: Translate a Type ID into a name string (Debug only)
470 *
471 ******************************************************************************/
472
473/*
474 * Elements of AcpiGbl_NsTypeNames below must match
475 * one-to-one with values of ACPI_OBJECT_TYPE
476 *
477 * The type ACPI_TYPE_ANY (Untyped) is used as a "don't care" when searching;
478 * when stored in a table it really means that we have thus far seen no
479 * evidence to indicate what type is actually going to be stored for this entry.
480 */
481static const char           AcpiGbl_BadType[] = "UNDEFINED";
482
483/* Printable names of the ACPI object types */
484
485static const char           *AcpiGbl_NsTypeNames[] =
486{
487    /* 00 */ "Untyped",
488    /* 01 */ "Integer",
489    /* 02 */ "String",
490    /* 03 */ "Buffer",
491    /* 04 */ "Package",
492    /* 05 */ "FieldUnit",
493    /* 06 */ "Device",
494    /* 07 */ "Event",
495    /* 08 */ "Method",
496    /* 09 */ "Mutex",
497    /* 10 */ "Region",
498    /* 11 */ "Power",
499    /* 12 */ "Processor",
500    /* 13 */ "Thermal",
501    /* 14 */ "BufferField",
502    /* 15 */ "DdbHandle",
503    /* 16 */ "DebugObject",
504    /* 17 */ "RegionField",
505    /* 18 */ "BankField",
506    /* 19 */ "IndexField",
507    /* 20 */ "Reference",
508    /* 21 */ "Alias",
509    /* 22 */ "MethodAlias",
510    /* 23 */ "Notify",
511    /* 24 */ "AddrHandler",
512    /* 25 */ "ResourceDesc",
513    /* 26 */ "ResourceFld",
514    /* 27 */ "Scope",
515    /* 28 */ "Extra",
516    /* 29 */ "Data",
517    /* 30 */ "Invalid"
518};
519
520
521char *
522AcpiUtGetTypeName (
523    ACPI_OBJECT_TYPE        Type)
524{
525
526    if (Type > ACPI_TYPE_INVALID)
527    {
528        return (ACPI_CAST_PTR (char, AcpiGbl_BadType));
529    }
530
531    return (ACPI_CAST_PTR (char, AcpiGbl_NsTypeNames[Type]));
532}
533
534
535char *
536AcpiUtGetObjectTypeName (
537    ACPI_OPERAND_OBJECT     *ObjDesc)
538{
539
540    if (!ObjDesc)
541    {
542        return ("[NULL Object Descriptor]");
543    }
544
545    return (AcpiUtGetTypeName (ObjDesc->Common.Type));
546}
547
548
549/*******************************************************************************
550 *
551 * FUNCTION:    AcpiUtGetNodeName
552 *
553 * PARAMETERS:  Object               - A namespace node
554 *
555 * RETURN:      Pointer to a string
556 *
557 * DESCRIPTION: Validate the node and return the node's ACPI name.
558 *
559 ******************************************************************************/
560
561char *
562AcpiUtGetNodeName (
563    void                    *Object)
564{
565    ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) Object;
566
567
568    /* Must return a string of exactly 4 characters == ACPI_NAME_SIZE */
569
570    if (!Object)
571    {
572        return ("NULL");
573    }
574
575    /* Check for Root node */
576
577    if ((Object == ACPI_ROOT_OBJECT) ||
578        (Object == AcpiGbl_RootNode))
579    {
580        return ("\"\\\" ");
581    }
582
583    /* Descriptor must be a namespace node */
584
585    if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
586    {
587        return ("####");
588    }
589
590    /*
591     * Ensure name is valid. The name was validated/repaired when the node
592     * was created, but make sure it has not been corrupted.
593     */
594    AcpiUtRepairName (Node->Name.Ascii);
595
596    /* Return the name */
597
598    return (Node->Name.Ascii);
599}
600
601
602/*******************************************************************************
603 *
604 * FUNCTION:    AcpiUtGetDescriptorName
605 *
606 * PARAMETERS:  Object               - An ACPI object
607 *
608 * RETURN:      Pointer to a string
609 *
610 * DESCRIPTION: Validate object and return the descriptor type
611 *
612 ******************************************************************************/
613
614/* Printable names of object descriptor types */
615
616static const char           *AcpiGbl_DescTypeNames[] =
617{
618    /* 00 */ "Invalid",
619    /* 01 */ "Cached",
620    /* 02 */ "State-Generic",
621    /* 03 */ "State-Update",
622    /* 04 */ "State-Package",
623    /* 05 */ "State-Control",
624    /* 06 */ "State-RootParseScope",
625    /* 07 */ "State-ParseScope",
626    /* 08 */ "State-WalkScope",
627    /* 09 */ "State-Result",
628    /* 10 */ "State-Notify",
629    /* 11 */ "State-Thread",
630    /* 12 */ "Walk",
631    /* 13 */ "Parser",
632    /* 14 */ "Operand",
633    /* 15 */ "Node"
634};
635
636
637char *
638AcpiUtGetDescriptorName (
639    void                    *Object)
640{
641
642    if (!Object)
643    {
644        return ("NULL OBJECT");
645    }
646
647    if (ACPI_GET_DESCRIPTOR_TYPE (Object) > ACPI_DESC_TYPE_MAX)
648    {
649        return (ACPI_CAST_PTR (char, AcpiGbl_BadType));
650    }
651
652    return (ACPI_CAST_PTR (char,
653        AcpiGbl_DescTypeNames[ACPI_GET_DESCRIPTOR_TYPE (Object)]));
654
655}
656
657
658/*******************************************************************************
659 *
660 * FUNCTION:    AcpiUtGetReferenceName
661 *
662 * PARAMETERS:  Object               - An ACPI reference object
663 *
664 * RETURN:      Pointer to a string
665 *
666 * DESCRIPTION: Decode a reference object sub-type to a string.
667 *
668 ******************************************************************************/
669
670/* Printable names of reference object sub-types */
671
672static const char           *AcpiGbl_RefClassNames[] =
673{
674    /* 00 */ "Local",
675    /* 01 */ "Argument",
676    /* 02 */ "RefOf",
677    /* 03 */ "Index",
678    /* 04 */ "DdbHandle",
679    /* 05 */ "Named Object",
680    /* 06 */ "Debug"
681};
682
683const char *
684AcpiUtGetReferenceName (
685    ACPI_OPERAND_OBJECT     *Object)
686{
687
688    if (!Object)
689    {
690        return ("NULL Object");
691    }
692
693    if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
694    {
695        return ("Not an Operand object");
696    }
697
698    if (Object->Common.Type != ACPI_TYPE_LOCAL_REFERENCE)
699    {
700        return ("Not a Reference object");
701    }
702
703    if (Object->Reference.Class > ACPI_REFCLASS_MAX)
704    {
705        return ("Unknown Reference class");
706    }
707
708    return (AcpiGbl_RefClassNames[Object->Reference.Class]);
709}
710
711
712#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
713/*
714 * Strings and procedures used for debug only
715 */
716
717/*******************************************************************************
718 *
719 * FUNCTION:    AcpiUtGetMutexName
720 *
721 * PARAMETERS:  MutexId         - The predefined ID for this mutex.
722 *
723 * RETURN:      String containing the name of the mutex. Always returns a valid
724 *              pointer.
725 *
726 * DESCRIPTION: Translate a mutex ID into a name string (Debug only)
727 *
728 ******************************************************************************/
729
730char *
731AcpiUtGetMutexName (
732    UINT32                  MutexId)
733{
734
735    if (MutexId > ACPI_MAX_MUTEX)
736    {
737        return ("Invalid Mutex ID");
738    }
739
740    return (AcpiGbl_MutexNames[MutexId]);
741}
742
743
744/*******************************************************************************
745 *
746 * FUNCTION:    AcpiUtGetNotifyName
747 *
748 * PARAMETERS:  NotifyValue     - Value from the Notify() request
749 *
750 * RETURN:      String corresponding to the Notify Value.
751 *
752 * DESCRIPTION: Translate a Notify Value to a notify namestring.
753 *
754 ******************************************************************************/
755
756/* Names for Notify() values, used for debug output */
757
758static const char        *AcpiGbl_NotifyValueNames[] =
759{
760    "Bus Check",
761    "Device Check",
762    "Device Wake",
763    "Eject Request",
764    "Device Check Light",
765    "Frequency Mismatch",
766    "Bus Mode Mismatch",
767    "Power Fault",
768    "Capabilities Check",
769    "Device PLD Check",
770    "Reserved",
771    "System Locality Update"
772};
773
774const char *
775AcpiUtGetNotifyName (
776    UINT32                  NotifyValue)
777{
778
779    if (NotifyValue <= ACPI_NOTIFY_MAX)
780    {
781        return (AcpiGbl_NotifyValueNames[NotifyValue]);
782    }
783    else if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
784    {
785        return ("Reserved");
786    }
787    else /* Greater or equal to 0x80 */
788    {
789        return ("**Device Specific**");
790    }
791}
792#endif
793
794
795/*******************************************************************************
796 *
797 * FUNCTION:    AcpiUtValidObjectType
798 *
799 * PARAMETERS:  Type            - Object type to be validated
800 *
801 * RETURN:      TRUE if valid object type, FALSE otherwise
802 *
803 * DESCRIPTION: Validate an object type
804 *
805 ******************************************************************************/
806
807BOOLEAN
808AcpiUtValidObjectType (
809    ACPI_OBJECT_TYPE        Type)
810{
811
812    if (Type > ACPI_TYPE_LOCAL_MAX)
813    {
814        /* Note: Assumes all TYPEs are contiguous (external/local) */
815
816        return (FALSE);
817    }
818
819    return (TRUE);
820}
821
822
823/*******************************************************************************
824 *
825 * FUNCTION:    AcpiUtInitGlobals
826 *
827 * PARAMETERS:  None
828 *
829 * RETURN:      Status
830 *
831 * DESCRIPTION: Init library globals.  All globals that require specific
832 *              initialization should be initialized here!
833 *
834 ******************************************************************************/
835
836ACPI_STATUS
837AcpiUtInitGlobals (
838    void)
839{
840    ACPI_STATUS             Status;
841    UINT32                  i;
842
843
844    ACPI_FUNCTION_TRACE (UtInitGlobals);
845
846
847    /* Create all memory caches */
848
849    Status = AcpiUtCreateCaches ();
850    if (ACPI_FAILURE (Status))
851    {
852        return_ACPI_STATUS (Status);
853    }
854
855    /* Mutex locked flags */
856
857    for (i = 0; i < ACPI_NUM_MUTEX; i++)
858    {
859        AcpiGbl_MutexInfo[i].Mutex          = NULL;
860        AcpiGbl_MutexInfo[i].ThreadId       = ACPI_MUTEX_NOT_ACQUIRED;
861        AcpiGbl_MutexInfo[i].UseCount       = 0;
862    }
863
864    for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++)
865    {
866        AcpiGbl_OwnerIdMask[i]              = 0;
867    }
868
869    /* Last OwnerID is never valid */
870
871    AcpiGbl_OwnerIdMask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000;
872
873    /* Event counters */
874
875    AcpiMethodCount                     = 0;
876    AcpiSciCount                        = 0;
877    AcpiGpeCount                        = 0;
878
879    for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
880    {
881        AcpiFixedEventCount[i]              = 0;
882    }
883
884    /* GPE support */
885
886    AcpiGbl_GpeXruptListHead            = NULL;
887    AcpiGbl_GpeFadtBlocks[0]            = NULL;
888    AcpiGbl_GpeFadtBlocks[1]            = NULL;
889    AcpiCurrentGpeCount                 = 0;
890
891    /* Global handlers */
892
893    AcpiGbl_SystemNotify.Handler        = NULL;
894    AcpiGbl_DeviceNotify.Handler        = NULL;
895    AcpiGbl_ExceptionHandler            = NULL;
896    AcpiGbl_InitHandler                 = NULL;
897    AcpiGbl_TableHandler                = NULL;
898
899    /* Global Lock support */
900
901    AcpiGbl_GlobalLockSemaphore         = NULL;
902    AcpiGbl_GlobalLockMutex             = NULL;
903    AcpiGbl_GlobalLockAcquired          = FALSE;
904    AcpiGbl_GlobalLockHandle            = 0;
905    AcpiGbl_GlobalLockPresent           = FALSE;
906
907    /* Miscellaneous variables */
908
909    AcpiGbl_CmSingleStep                = FALSE;
910    AcpiGbl_DbTerminateThreads          = FALSE;
911    AcpiGbl_Shutdown                    = FALSE;
912    AcpiGbl_NsLookupCount               = 0;
913    AcpiGbl_PsFindCount                 = 0;
914    AcpiGbl_AcpiHardwarePresent         = TRUE;
915    AcpiGbl_LastOwnerIdIndex            = 0;
916    AcpiGbl_NextOwnerIdOffset           = 0;
917    AcpiGbl_TraceMethodName             = 0;
918    AcpiGbl_TraceDbgLevel               = 0;
919    AcpiGbl_TraceDbgLayer               = 0;
920    AcpiGbl_DebuggerConfiguration       = DEBUGGER_THREADING;
921    AcpiGbl_DbOutputFlags               = ACPI_DB_CONSOLE_OUTPUT;
922    AcpiGbl_OsiData                     = 0;
923
924    /* Hardware oriented */
925
926    AcpiGbl_EventsInitialized           = FALSE;
927    AcpiGbl_SystemAwakeAndRunning       = TRUE;
928
929    /* Namespace */
930
931    AcpiGbl_RootNode                    = NULL;
932    AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME;
933    AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED;
934    AcpiGbl_RootNodeStruct.Type         = ACPI_TYPE_DEVICE;
935    AcpiGbl_RootNodeStruct.Child        = NULL;
936    AcpiGbl_RootNodeStruct.Peer         = NULL;
937    AcpiGbl_RootNodeStruct.Object       = NULL;
938    AcpiGbl_RootNodeStruct.Flags        = ANOBJ_END_OF_PEER_LIST;
939
940
941#ifdef ACPI_DEBUG_OUTPUT
942    AcpiGbl_LowestStackPointer          = ACPI_CAST_PTR (ACPI_SIZE, ACPI_SIZE_MAX);
943#endif
944
945#ifdef ACPI_DBG_TRACK_ALLOCATIONS
946    AcpiGbl_DisplayFinalMemStats        = FALSE;
947#endif
948
949    return_ACPI_STATUS (AE_OK);
950}
951
952/* Public globals */
953
954ACPI_EXPORT_SYMBOL (AcpiGbl_FADT)
955ACPI_EXPORT_SYMBOL (AcpiDbgLevel)
956ACPI_EXPORT_SYMBOL (AcpiDbgLayer)
957ACPI_EXPORT_SYMBOL (AcpiGpeCount)
958ACPI_EXPORT_SYMBOL (AcpiCurrentGpeCount)
959
960
961