xref: /netbsd-src/sys/external/bsd/acpica/dist/utilities/utdecode.c (revision daf6c4152fcddc27c445489775ed1f66ab4ea9a9)
1 /******************************************************************************
2  *
3  * Module Name: utdecode - Utility decoding routines (value-to-string)
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2011, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #define __UTDECODE_C__
45 
46 #include "acpi.h"
47 #include "accommon.h"
48 #include "acnamesp.h"
49 
50 #define _COMPONENT          ACPI_UTILITIES
51         ACPI_MODULE_NAME    ("utdecode")
52 
53 
54 /*******************************************************************************
55  *
56  * FUNCTION:    AcpiFormatException
57  *
58  * PARAMETERS:  Status       - The ACPI_STATUS code to be formatted
59  *
60  * RETURN:      A string containing the exception text. A valid pointer is
61  *              always returned.
62  *
63  * DESCRIPTION: This function translates an ACPI exception into an ASCII string
64  *              It is here instead of utxface.c so it is always present.
65  *
66  ******************************************************************************/
67 
68 const char *
69 AcpiFormatException (
70     ACPI_STATUS             Status)
71 {
72     const char              *Exception = NULL;
73 
74 
75     ACPI_FUNCTION_ENTRY ();
76 
77 
78     Exception = AcpiUtValidateException (Status);
79     if (!Exception)
80     {
81         /* Exception code was not recognized */
82 
83         ACPI_ERROR ((AE_INFO,
84             "Unknown exception code: 0x%8.8X", Status));
85 
86         Exception = "UNKNOWN_STATUS_CODE";
87     }
88 
89     return (ACPI_CAST_PTR (const char, Exception));
90 }
91 
92 ACPI_EXPORT_SYMBOL (AcpiFormatException)
93 
94 
95 /*
96  * Properties of the ACPI Object Types, both internal and external.
97  * The table is indexed by values of ACPI_OBJECT_TYPE
98  */
99 const UINT8                     AcpiGbl_NsProperties[ACPI_NUM_NS_TYPES] =
100 {
101     ACPI_NS_NORMAL,                     /* 00 Any              */
102     ACPI_NS_NORMAL,                     /* 01 Number           */
103     ACPI_NS_NORMAL,                     /* 02 String           */
104     ACPI_NS_NORMAL,                     /* 03 Buffer           */
105     ACPI_NS_NORMAL,                     /* 04 Package          */
106     ACPI_NS_NORMAL,                     /* 05 FieldUnit        */
107     ACPI_NS_NEWSCOPE,                   /* 06 Device           */
108     ACPI_NS_NORMAL,                     /* 07 Event            */
109     ACPI_NS_NEWSCOPE,                   /* 08 Method           */
110     ACPI_NS_NORMAL,                     /* 09 Mutex            */
111     ACPI_NS_NORMAL,                     /* 10 Region           */
112     ACPI_NS_NEWSCOPE,                   /* 11 Power            */
113     ACPI_NS_NEWSCOPE,                   /* 12 Processor        */
114     ACPI_NS_NEWSCOPE,                   /* 13 Thermal          */
115     ACPI_NS_NORMAL,                     /* 14 BufferField      */
116     ACPI_NS_NORMAL,                     /* 15 DdbHandle        */
117     ACPI_NS_NORMAL,                     /* 16 Debug Object     */
118     ACPI_NS_NORMAL,                     /* 17 DefField         */
119     ACPI_NS_NORMAL,                     /* 18 BankField        */
120     ACPI_NS_NORMAL,                     /* 19 IndexField       */
121     ACPI_NS_NORMAL,                     /* 20 Reference        */
122     ACPI_NS_NORMAL,                     /* 21 Alias            */
123     ACPI_NS_NORMAL,                     /* 22 MethodAlias      */
124     ACPI_NS_NORMAL,                     /* 23 Notify           */
125     ACPI_NS_NORMAL,                     /* 24 Address Handler  */
126     ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL,   /* 25 Resource Desc    */
127     ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL,   /* 26 Resource Field   */
128     ACPI_NS_NEWSCOPE,                   /* 27 Scope            */
129     ACPI_NS_NORMAL,                     /* 28 Extra            */
130     ACPI_NS_NORMAL,                     /* 29 Data             */
131     ACPI_NS_NORMAL                      /* 30 Invalid          */
132 };
133 
134 
135 /*******************************************************************************
136  *
137  * FUNCTION:    AcpiUtHexToAsciiChar
138  *
139  * PARAMETERS:  Integer             - Contains the hex digit
140  *              Position            - bit position of the digit within the
141  *                                    integer (multiple of 4)
142  *
143  * RETURN:      The converted Ascii character
144  *
145  * DESCRIPTION: Convert a hex digit to an Ascii character
146  *
147  ******************************************************************************/
148 
149 /* Hex to ASCII conversion table */
150 
151 static const char           AcpiGbl_HexToAscii[] =
152 {
153     '0','1','2','3','4','5','6','7',
154     '8','9','A','B','C','D','E','F'
155 };
156 
157 char
158 AcpiUtHexToAsciiChar (
159     UINT64                  Integer,
160     UINT32                  Position)
161 {
162 
163     return (AcpiGbl_HexToAscii[(Integer >> Position) & 0xF]);
164 }
165 
166 
167 /*******************************************************************************
168  *
169  * FUNCTION:    AcpiUtGetRegionName
170  *
171  * PARAMETERS:  Space ID            - ID for the region
172  *
173  * RETURN:      Decoded region SpaceId name
174  *
175  * DESCRIPTION: Translate a Space ID into a name string (Debug only)
176  *
177  ******************************************************************************/
178 
179 /* Region type decoding */
180 
181 const char        *AcpiGbl_RegionTypes[ACPI_NUM_PREDEFINED_REGIONS] =
182 {
183     "SystemMemory",
184     "SystemIO",
185     "PCI_Config",
186     "EmbeddedControl",
187     "SMBus",
188     "SystemCMOS",
189     "PCIBARTarget",
190     "IPMI",
191     "DataTable"
192 };
193 
194 
195 const char *
196 AcpiUtGetRegionName (
197     UINT8                   SpaceId)
198 {
199 
200     if (SpaceId >= ACPI_USER_REGION_BEGIN)
201     {
202         return ("UserDefinedRegion");
203     }
204     else if (SpaceId == ACPI_ADR_SPACE_FIXED_HARDWARE)
205     {
206         return ("FunctionalFixedHW");
207     }
208     else if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
209     {
210         return ("InvalidSpaceId");
211     }
212 
213     return (ACPI_CAST_PTR (char, AcpiGbl_RegionTypes[SpaceId]));
214 }
215 
216 
217 /*******************************************************************************
218  *
219  * FUNCTION:    AcpiUtGetEventName
220  *
221  * PARAMETERS:  EventId             - Fixed event ID
222  *
223  * RETURN:      Decoded event ID name
224  *
225  * DESCRIPTION: Translate a Event ID into a name string (Debug only)
226  *
227  ******************************************************************************/
228 
229 /* Event type decoding */
230 
231 static const char        *AcpiGbl_EventTypes[ACPI_NUM_FIXED_EVENTS] =
232 {
233     "PM_Timer",
234     "GlobalLock",
235     "PowerButton",
236     "SleepButton",
237     "RealTimeClock",
238 };
239 
240 
241 const char *
242 AcpiUtGetEventName (
243     UINT32                  EventId)
244 {
245 
246     if (EventId > ACPI_EVENT_MAX)
247     {
248         return ("InvalidEventID");
249     }
250 
251     return (ACPI_CAST_PTR (char, AcpiGbl_EventTypes[EventId]));
252 }
253 
254 
255 /*******************************************************************************
256  *
257  * FUNCTION:    AcpiUtGetTypeName
258  *
259  * PARAMETERS:  Type                - An ACPI object type
260  *
261  * RETURN:      Decoded ACPI object type name
262  *
263  * DESCRIPTION: Translate a Type ID into a name string (Debug only)
264  *
265  ******************************************************************************/
266 
267 /*
268  * Elements of AcpiGbl_NsTypeNames below must match
269  * one-to-one with values of ACPI_OBJECT_TYPE
270  *
271  * The type ACPI_TYPE_ANY (Untyped) is used as a "don't care" when searching;
272  * when stored in a table it really means that we have thus far seen no
273  * evidence to indicate what type is actually going to be stored for this entry.
274  */
275 static const char           AcpiGbl_BadType[] = "UNDEFINED";
276 
277 /* Printable names of the ACPI object types */
278 
279 static const char           *AcpiGbl_NsTypeNames[] =
280 {
281     /* 00 */ "Untyped",
282     /* 01 */ "Integer",
283     /* 02 */ "String",
284     /* 03 */ "Buffer",
285     /* 04 */ "Package",
286     /* 05 */ "FieldUnit",
287     /* 06 */ "Device",
288     /* 07 */ "Event",
289     /* 08 */ "Method",
290     /* 09 */ "Mutex",
291     /* 10 */ "Region",
292     /* 11 */ "Power",
293     /* 12 */ "Processor",
294     /* 13 */ "Thermal",
295     /* 14 */ "BufferField",
296     /* 15 */ "DdbHandle",
297     /* 16 */ "DebugObject",
298     /* 17 */ "RegionField",
299     /* 18 */ "BankField",
300     /* 19 */ "IndexField",
301     /* 20 */ "Reference",
302     /* 21 */ "Alias",
303     /* 22 */ "MethodAlias",
304     /* 23 */ "Notify",
305     /* 24 */ "AddrHandler",
306     /* 25 */ "ResourceDesc",
307     /* 26 */ "ResourceFld",
308     /* 27 */ "Scope",
309     /* 28 */ "Extra",
310     /* 29 */ "Data",
311     /* 30 */ "Invalid"
312 };
313 
314 
315 char *
316 AcpiUtGetTypeName (
317     ACPI_OBJECT_TYPE        Type)
318 {
319 
320     if (Type > ACPI_TYPE_INVALID)
321     {
322         return (ACPI_CAST_PTR (char, AcpiGbl_BadType));
323     }
324 
325     return (ACPI_CAST_PTR (char, AcpiGbl_NsTypeNames[Type]));
326 }
327 
328 
329 const char *
330 AcpiUtGetObjectTypeName (
331     ACPI_OPERAND_OBJECT     *ObjDesc)
332 {
333 
334     if (!ObjDesc)
335     {
336         return ("[NULL Object Descriptor]");
337     }
338 
339     return (AcpiUtGetTypeName (ObjDesc->Common.Type));
340 }
341 
342 
343 /*******************************************************************************
344  *
345  * FUNCTION:    AcpiUtGetNodeName
346  *
347  * PARAMETERS:  Object               - A namespace node
348  *
349  * RETURN:      ASCII name of the node
350  *
351  * DESCRIPTION: Validate the node and return the node's ACPI name.
352  *
353  ******************************************************************************/
354 
355 const char *
356 AcpiUtGetNodeName (
357     void                    *Object)
358 {
359     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) Object;
360 
361 
362     /* Must return a string of exactly 4 characters == ACPI_NAME_SIZE */
363 
364     if (!Object)
365     {
366         return ("NULL");
367     }
368 
369     /* Check for Root node */
370 
371     if ((Object == ACPI_ROOT_OBJECT) ||
372         (Object == AcpiGbl_RootNode))
373     {
374         return ("\"\\\" ");
375     }
376 
377     /* Descriptor must be a namespace node */
378 
379     if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
380     {
381         return ("####");
382     }
383 
384     /*
385      * Ensure name is valid. The name was validated/repaired when the node
386      * was created, but make sure it has not been corrupted.
387      */
388     AcpiUtRepairName (Node->Name.Ascii);
389 
390     /* Return the name */
391 
392     return (Node->Name.Ascii);
393 }
394 
395 
396 /*******************************************************************************
397  *
398  * FUNCTION:    AcpiUtGetDescriptorName
399  *
400  * PARAMETERS:  Object               - An ACPI object
401  *
402  * RETURN:      Decoded name of the descriptor type
403  *
404  * DESCRIPTION: Validate object and return the descriptor type
405  *
406  ******************************************************************************/
407 
408 /* Printable names of object descriptor types */
409 
410 static const char           *AcpiGbl_DescTypeNames[] =
411 {
412     /* 00 */ "Not a Descriptor",
413     /* 01 */ "Cached",
414     /* 02 */ "State-Generic",
415     /* 03 */ "State-Update",
416     /* 04 */ "State-Package",
417     /* 05 */ "State-Control",
418     /* 06 */ "State-RootParseScope",
419     /* 07 */ "State-ParseScope",
420     /* 08 */ "State-WalkScope",
421     /* 09 */ "State-Result",
422     /* 10 */ "State-Notify",
423     /* 11 */ "State-Thread",
424     /* 12 */ "Walk",
425     /* 13 */ "Parser",
426     /* 14 */ "Operand",
427     /* 15 */ "Node"
428 };
429 
430 
431 const char *
432 AcpiUtGetDescriptorName (
433     void                    *Object)
434 {
435 
436     if (!Object)
437     {
438         return ("NULL OBJECT");
439     }
440 
441     if (ACPI_GET_DESCRIPTOR_TYPE (Object) > ACPI_DESC_TYPE_MAX)
442     {
443         return ("Not a Descriptor");
444     }
445 
446     return (ACPI_CAST_PTR (char,
447         AcpiGbl_DescTypeNames[ACPI_GET_DESCRIPTOR_TYPE (Object)]));
448 
449 }
450 
451 
452 /*******************************************************************************
453  *
454  * FUNCTION:    AcpiUtGetReferenceName
455  *
456  * PARAMETERS:  Object               - An ACPI reference object
457  *
458  * RETURN:      Decoded name of the type of reference
459  *
460  * DESCRIPTION: Decode a reference object sub-type to a string.
461  *
462  ******************************************************************************/
463 
464 /* Printable names of reference object sub-types */
465 
466 static const char           *AcpiGbl_RefClassNames[] =
467 {
468     /* 00 */ "Local",
469     /* 01 */ "Argument",
470     /* 02 */ "RefOf",
471     /* 03 */ "Index",
472     /* 04 */ "DdbHandle",
473     /* 05 */ "Named Object",
474     /* 06 */ "Debug"
475 };
476 
477 const char *
478 AcpiUtGetReferenceName (
479     ACPI_OPERAND_OBJECT     *Object)
480 {
481 
482     if (!Object)
483     {
484         return ("NULL Object");
485     }
486 
487     if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
488     {
489         return ("Not an Operand object");
490     }
491 
492     if (Object->Common.Type != ACPI_TYPE_LOCAL_REFERENCE)
493     {
494         return ("Not a Reference object");
495     }
496 
497     if (Object->Reference.Class > ACPI_REFCLASS_MAX)
498     {
499         return ("Unknown Reference class");
500     }
501 
502     return (AcpiGbl_RefClassNames[Object->Reference.Class]);
503 }
504 
505 
506 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
507 /*
508  * Strings and procedures used for debug only
509  */
510 
511 /*******************************************************************************
512  *
513  * FUNCTION:    AcpiUtGetMutexName
514  *
515  * PARAMETERS:  MutexId         - The predefined ID for this mutex.
516  *
517  * RETURN:      Decoded name of the internal mutex
518  *
519  * DESCRIPTION: Translate a mutex ID into a name string (Debug only)
520  *
521  ******************************************************************************/
522 
523 /* Names for internal mutex objects, used for debug output */
524 
525 static const char              *AcpiGbl_MutexNames[ACPI_NUM_MUTEX] =
526 {
527     "ACPI_MTX_Interpreter",
528     "ACPI_MTX_Namespace",
529     "ACPI_MTX_Tables",
530     "ACPI_MTX_Events",
531     "ACPI_MTX_Caches",
532     "ACPI_MTX_Memory",
533     "ACPI_MTX_CommandComplete",
534     "ACPI_MTX_CommandReady"
535 };
536 
537 const char *
538 AcpiUtGetMutexName (
539     UINT32                  MutexId)
540 {
541 
542     if (MutexId > ACPI_MAX_MUTEX)
543     {
544         return ("Invalid Mutex ID");
545     }
546 
547     return (AcpiGbl_MutexNames[MutexId]);
548 }
549 
550 
551 /*******************************************************************************
552  *
553  * FUNCTION:    AcpiUtGetNotifyName
554  *
555  * PARAMETERS:  NotifyValue     - Value from the Notify() request
556  *
557  * RETURN:      Decoded name for the notify value
558  *
559  * DESCRIPTION: Translate a Notify Value to a notify namestring.
560  *
561  ******************************************************************************/
562 
563 /* Names for Notify() values, used for debug output */
564 
565 static const char           *AcpiGbl_NotifyValueNames[] =
566 {
567     "Bus Check",
568     "Device Check",
569     "Device Wake",
570     "Eject Request",
571     "Device Check Light",
572     "Frequency Mismatch",
573     "Bus Mode Mismatch",
574     "Power Fault",
575     "Capabilities Check",
576     "Device PLD Check",
577     "Reserved",
578     "System Locality Update"
579 };
580 
581 const char *
582 AcpiUtGetNotifyName (
583     UINT32                  NotifyValue)
584 {
585 
586     if (NotifyValue <= ACPI_NOTIFY_MAX)
587     {
588         return (AcpiGbl_NotifyValueNames[NotifyValue]);
589     }
590     else if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
591     {
592         return ("Reserved");
593     }
594     else /* Greater or equal to 0x80 */
595     {
596         return ("**Device Specific**");
597     }
598 }
599 #endif
600 
601 
602 /*******************************************************************************
603  *
604  * FUNCTION:    AcpiUtValidObjectType
605  *
606  * PARAMETERS:  Type            - Object type to be validated
607  *
608  * RETURN:      TRUE if valid object type, FALSE otherwise
609  *
610  * DESCRIPTION: Validate an object type
611  *
612  ******************************************************************************/
613 
614 BOOLEAN
615 AcpiUtValidObjectType (
616     ACPI_OBJECT_TYPE        Type)
617 {
618 
619     if (Type > ACPI_TYPE_LOCAL_MAX)
620     {
621         /* Note: Assumes all TYPEs are contiguous (external/local) */
622 
623         return (FALSE);
624     }
625 
626     return (TRUE);
627 }
628