Deleted Added
full compact
utdecode.c (228110) utdecode.c (229989)
1/******************************************************************************
2 *
3 * Module Name: utdecode - Utility decoding routines (value-to-string)
4 *
5 *****************************************************************************/
6
7/*
1/******************************************************************************
2 *
3 * Module Name: utdecode - Utility decoding routines (value-to-string)
4 *
5 *****************************************************************************/
6
7/*
8 * Copyright (C) 2000 - 2011, Intel Corp.
8 * Copyright (C) 2000 - 2012, 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 <contrib/dev/acpica/include/acpi.h>
47#include <contrib/dev/acpica/include/accommon.h>
48#include <contrib/dev/acpica/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
68const char *
69AcpiFormatException (
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
92ACPI_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 */
99const 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
151static 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
157char
158AcpiUtHexToAsciiChar (
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
181const 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 "GeneralPurposeIo",
192 "GenericSerialBus"
193};
194
195
196char *
197AcpiUtGetRegionName (
198 UINT8 SpaceId)
199{
200
201 if (SpaceId >= ACPI_USER_REGION_BEGIN)
202 {
203 return ("UserDefinedRegion");
204 }
205 else if (SpaceId == ACPI_ADR_SPACE_DATA_TABLE)
206 {
207 return ("DataTable");
208 }
209 else if (SpaceId == ACPI_ADR_SPACE_FIXED_HARDWARE)
210 {
211 return ("FunctionalFixedHW");
212 }
213 else if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
214 {
215 return ("InvalidSpaceId");
216 }
217
218 return (ACPI_CAST_PTR (char, AcpiGbl_RegionTypes[SpaceId]));
219}
220
221
222/*******************************************************************************
223 *
224 * FUNCTION: AcpiUtGetEventName
225 *
226 * PARAMETERS: EventId - Fixed event ID
227 *
228 * RETURN: Decoded event ID name
229 *
230 * DESCRIPTION: Translate a Event ID into a name string (Debug only)
231 *
232 ******************************************************************************/
233
234/* Event type decoding */
235
236static const char *AcpiGbl_EventTypes[ACPI_NUM_FIXED_EVENTS] =
237{
238 "PM_Timer",
239 "GlobalLock",
240 "PowerButton",
241 "SleepButton",
242 "RealTimeClock",
243};
244
245
246char *
247AcpiUtGetEventName (
248 UINT32 EventId)
249{
250
251 if (EventId > ACPI_EVENT_MAX)
252 {
253 return ("InvalidEventID");
254 }
255
256 return (ACPI_CAST_PTR (char, AcpiGbl_EventTypes[EventId]));
257}
258
259
260/*******************************************************************************
261 *
262 * FUNCTION: AcpiUtGetTypeName
263 *
264 * PARAMETERS: Type - An ACPI object type
265 *
266 * RETURN: Decoded ACPI object type name
267 *
268 * DESCRIPTION: Translate a Type ID into a name string (Debug only)
269 *
270 ******************************************************************************/
271
272/*
273 * Elements of AcpiGbl_NsTypeNames below must match
274 * one-to-one with values of ACPI_OBJECT_TYPE
275 *
276 * The type ACPI_TYPE_ANY (Untyped) is used as a "don't care" when searching;
277 * when stored in a table it really means that we have thus far seen no
278 * evidence to indicate what type is actually going to be stored for this entry.
279 */
280static const char AcpiGbl_BadType[] = "UNDEFINED";
281
282/* Printable names of the ACPI object types */
283
284static const char *AcpiGbl_NsTypeNames[] =
285{
286 /* 00 */ "Untyped",
287 /* 01 */ "Integer",
288 /* 02 */ "String",
289 /* 03 */ "Buffer",
290 /* 04 */ "Package",
291 /* 05 */ "FieldUnit",
292 /* 06 */ "Device",
293 /* 07 */ "Event",
294 /* 08 */ "Method",
295 /* 09 */ "Mutex",
296 /* 10 */ "Region",
297 /* 11 */ "Power",
298 /* 12 */ "Processor",
299 /* 13 */ "Thermal",
300 /* 14 */ "BufferField",
301 /* 15 */ "DdbHandle",
302 /* 16 */ "DebugObject",
303 /* 17 */ "RegionField",
304 /* 18 */ "BankField",
305 /* 19 */ "IndexField",
306 /* 20 */ "Reference",
307 /* 21 */ "Alias",
308 /* 22 */ "MethodAlias",
309 /* 23 */ "Notify",
310 /* 24 */ "AddrHandler",
311 /* 25 */ "ResourceDesc",
312 /* 26 */ "ResourceFld",
313 /* 27 */ "Scope",
314 /* 28 */ "Extra",
315 /* 29 */ "Data",
316 /* 30 */ "Invalid"
317};
318
319
320char *
321AcpiUtGetTypeName (
322 ACPI_OBJECT_TYPE Type)
323{
324
325 if (Type > ACPI_TYPE_INVALID)
326 {
327 return (ACPI_CAST_PTR (char, AcpiGbl_BadType));
328 }
329
330 return (ACPI_CAST_PTR (char, AcpiGbl_NsTypeNames[Type]));
331}
332
333
334char *
335AcpiUtGetObjectTypeName (
336 ACPI_OPERAND_OBJECT *ObjDesc)
337{
338
339 if (!ObjDesc)
340 {
341 return ("[NULL Object Descriptor]");
342 }
343
344 return (AcpiUtGetTypeName (ObjDesc->Common.Type));
345}
346
347
348/*******************************************************************************
349 *
350 * FUNCTION: AcpiUtGetNodeName
351 *
352 * PARAMETERS: Object - A namespace node
353 *
354 * RETURN: ASCII name of the node
355 *
356 * DESCRIPTION: Validate the node and return the node's ACPI name.
357 *
358 ******************************************************************************/
359
360char *
361AcpiUtGetNodeName (
362 void *Object)
363{
364 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) Object;
365
366
367 /* Must return a string of exactly 4 characters == ACPI_NAME_SIZE */
368
369 if (!Object)
370 {
371 return ("NULL");
372 }
373
374 /* Check for Root node */
375
376 if ((Object == ACPI_ROOT_OBJECT) ||
377 (Object == AcpiGbl_RootNode))
378 {
379 return ("\"\\\" ");
380 }
381
382 /* Descriptor must be a namespace node */
383
384 if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
385 {
386 return ("####");
387 }
388
389 /*
390 * Ensure name is valid. The name was validated/repaired when the node
391 * was created, but make sure it has not been corrupted.
392 */
393 AcpiUtRepairName (Node->Name.Ascii);
394
395 /* Return the name */
396
397 return (Node->Name.Ascii);
398}
399
400
401/*******************************************************************************
402 *
403 * FUNCTION: AcpiUtGetDescriptorName
404 *
405 * PARAMETERS: Object - An ACPI object
406 *
407 * RETURN: Decoded name of the descriptor type
408 *
409 * DESCRIPTION: Validate object and return the descriptor type
410 *
411 ******************************************************************************/
412
413/* Printable names of object descriptor types */
414
415static const char *AcpiGbl_DescTypeNames[] =
416{
417 /* 00 */ "Not a Descriptor",
418 /* 01 */ "Cached",
419 /* 02 */ "State-Generic",
420 /* 03 */ "State-Update",
421 /* 04 */ "State-Package",
422 /* 05 */ "State-Control",
423 /* 06 */ "State-RootParseScope",
424 /* 07 */ "State-ParseScope",
425 /* 08 */ "State-WalkScope",
426 /* 09 */ "State-Result",
427 /* 10 */ "State-Notify",
428 /* 11 */ "State-Thread",
429 /* 12 */ "Walk",
430 /* 13 */ "Parser",
431 /* 14 */ "Operand",
432 /* 15 */ "Node"
433};
434
435
436char *
437AcpiUtGetDescriptorName (
438 void *Object)
439{
440
441 if (!Object)
442 {
443 return ("NULL OBJECT");
444 }
445
446 if (ACPI_GET_DESCRIPTOR_TYPE (Object) > ACPI_DESC_TYPE_MAX)
447 {
448 return ("Not a Descriptor");
449 }
450
451 return (ACPI_CAST_PTR (char,
452 AcpiGbl_DescTypeNames[ACPI_GET_DESCRIPTOR_TYPE (Object)]));
453
454}
455
456
457/*******************************************************************************
458 *
459 * FUNCTION: AcpiUtGetReferenceName
460 *
461 * PARAMETERS: Object - An ACPI reference object
462 *
463 * RETURN: Decoded name of the type of reference
464 *
465 * DESCRIPTION: Decode a reference object sub-type to a string.
466 *
467 ******************************************************************************/
468
469/* Printable names of reference object sub-types */
470
471static const char *AcpiGbl_RefClassNames[] =
472{
473 /* 00 */ "Local",
474 /* 01 */ "Argument",
475 /* 02 */ "RefOf",
476 /* 03 */ "Index",
477 /* 04 */ "DdbHandle",
478 /* 05 */ "Named Object",
479 /* 06 */ "Debug"
480};
481
482const char *
483AcpiUtGetReferenceName (
484 ACPI_OPERAND_OBJECT *Object)
485{
486
487 if (!Object)
488 {
489 return ("NULL Object");
490 }
491
492 if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
493 {
494 return ("Not an Operand object");
495 }
496
497 if (Object->Common.Type != ACPI_TYPE_LOCAL_REFERENCE)
498 {
499 return ("Not a Reference object");
500 }
501
502 if (Object->Reference.Class > ACPI_REFCLASS_MAX)
503 {
504 return ("Unknown Reference class");
505 }
506
507 return (AcpiGbl_RefClassNames[Object->Reference.Class]);
508}
509
510
511#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
512/*
513 * Strings and procedures used for debug only
514 */
515
516/*******************************************************************************
517 *
518 * FUNCTION: AcpiUtGetMutexName
519 *
520 * PARAMETERS: MutexId - The predefined ID for this mutex.
521 *
522 * RETURN: Decoded name of the internal mutex
523 *
524 * DESCRIPTION: Translate a mutex ID into a name string (Debug only)
525 *
526 ******************************************************************************/
527
528/* Names for internal mutex objects, used for debug output */
529
530static char *AcpiGbl_MutexNames[ACPI_NUM_MUTEX] =
531{
532 "ACPI_MTX_Interpreter",
533 "ACPI_MTX_Namespace",
534 "ACPI_MTX_Tables",
535 "ACPI_MTX_Events",
536 "ACPI_MTX_Caches",
537 "ACPI_MTX_Memory",
538 "ACPI_MTX_CommandComplete",
539 "ACPI_MTX_CommandReady"
540};
541
542char *
543AcpiUtGetMutexName (
544 UINT32 MutexId)
545{
546
547 if (MutexId > ACPI_MAX_MUTEX)
548 {
549 return ("Invalid Mutex ID");
550 }
551
552 return (AcpiGbl_MutexNames[MutexId]);
553}
554
555
556/*******************************************************************************
557 *
558 * FUNCTION: AcpiUtGetNotifyName
559 *
560 * PARAMETERS: NotifyValue - Value from the Notify() request
561 *
562 * RETURN: Decoded name for the notify value
563 *
564 * DESCRIPTION: Translate a Notify Value to a notify namestring.
565 *
566 ******************************************************************************/
567
568/* Names for Notify() values, used for debug output */
569
570static const char *AcpiGbl_NotifyValueNames[] =
571{
572 "Bus Check",
573 "Device Check",
574 "Device Wake",
575 "Eject Request",
576 "Device Check Light",
577 "Frequency Mismatch",
578 "Bus Mode Mismatch",
579 "Power Fault",
580 "Capabilities Check",
581 "Device PLD Check",
582 "Reserved",
583 "System Locality Update"
584};
585
586const char *
587AcpiUtGetNotifyName (
588 UINT32 NotifyValue)
589{
590
591 if (NotifyValue <= ACPI_NOTIFY_MAX)
592 {
593 return (AcpiGbl_NotifyValueNames[NotifyValue]);
594 }
595 else if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
596 {
597 return ("Reserved");
598 }
599 else /* Greater or equal to 0x80 */
600 {
601 return ("**Device Specific**");
602 }
603}
604#endif
605
606
607/*******************************************************************************
608 *
609 * FUNCTION: AcpiUtValidObjectType
610 *
611 * PARAMETERS: Type - Object type to be validated
612 *
613 * RETURN: TRUE if valid object type, FALSE otherwise
614 *
615 * DESCRIPTION: Validate an object type
616 *
617 ******************************************************************************/
618
619BOOLEAN
620AcpiUtValidObjectType (
621 ACPI_OBJECT_TYPE Type)
622{
623
624 if (Type > ACPI_TYPE_LOCAL_MAX)
625 {
626 /* Note: Assumes all TYPEs are contiguous (external/local) */
627
628 return (FALSE);
629 }
630
631 return (TRUE);
632}
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 <contrib/dev/acpica/include/acpi.h>
47#include <contrib/dev/acpica/include/accommon.h>
48#include <contrib/dev/acpica/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
68const char *
69AcpiFormatException (
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
92ACPI_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 */
99const 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
151static 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
157char
158AcpiUtHexToAsciiChar (
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
181const 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 "GeneralPurposeIo",
192 "GenericSerialBus"
193};
194
195
196char *
197AcpiUtGetRegionName (
198 UINT8 SpaceId)
199{
200
201 if (SpaceId >= ACPI_USER_REGION_BEGIN)
202 {
203 return ("UserDefinedRegion");
204 }
205 else if (SpaceId == ACPI_ADR_SPACE_DATA_TABLE)
206 {
207 return ("DataTable");
208 }
209 else if (SpaceId == ACPI_ADR_SPACE_FIXED_HARDWARE)
210 {
211 return ("FunctionalFixedHW");
212 }
213 else if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
214 {
215 return ("InvalidSpaceId");
216 }
217
218 return (ACPI_CAST_PTR (char, AcpiGbl_RegionTypes[SpaceId]));
219}
220
221
222/*******************************************************************************
223 *
224 * FUNCTION: AcpiUtGetEventName
225 *
226 * PARAMETERS: EventId - Fixed event ID
227 *
228 * RETURN: Decoded event ID name
229 *
230 * DESCRIPTION: Translate a Event ID into a name string (Debug only)
231 *
232 ******************************************************************************/
233
234/* Event type decoding */
235
236static const char *AcpiGbl_EventTypes[ACPI_NUM_FIXED_EVENTS] =
237{
238 "PM_Timer",
239 "GlobalLock",
240 "PowerButton",
241 "SleepButton",
242 "RealTimeClock",
243};
244
245
246char *
247AcpiUtGetEventName (
248 UINT32 EventId)
249{
250
251 if (EventId > ACPI_EVENT_MAX)
252 {
253 return ("InvalidEventID");
254 }
255
256 return (ACPI_CAST_PTR (char, AcpiGbl_EventTypes[EventId]));
257}
258
259
260/*******************************************************************************
261 *
262 * FUNCTION: AcpiUtGetTypeName
263 *
264 * PARAMETERS: Type - An ACPI object type
265 *
266 * RETURN: Decoded ACPI object type name
267 *
268 * DESCRIPTION: Translate a Type ID into a name string (Debug only)
269 *
270 ******************************************************************************/
271
272/*
273 * Elements of AcpiGbl_NsTypeNames below must match
274 * one-to-one with values of ACPI_OBJECT_TYPE
275 *
276 * The type ACPI_TYPE_ANY (Untyped) is used as a "don't care" when searching;
277 * when stored in a table it really means that we have thus far seen no
278 * evidence to indicate what type is actually going to be stored for this entry.
279 */
280static const char AcpiGbl_BadType[] = "UNDEFINED";
281
282/* Printable names of the ACPI object types */
283
284static const char *AcpiGbl_NsTypeNames[] =
285{
286 /* 00 */ "Untyped",
287 /* 01 */ "Integer",
288 /* 02 */ "String",
289 /* 03 */ "Buffer",
290 /* 04 */ "Package",
291 /* 05 */ "FieldUnit",
292 /* 06 */ "Device",
293 /* 07 */ "Event",
294 /* 08 */ "Method",
295 /* 09 */ "Mutex",
296 /* 10 */ "Region",
297 /* 11 */ "Power",
298 /* 12 */ "Processor",
299 /* 13 */ "Thermal",
300 /* 14 */ "BufferField",
301 /* 15 */ "DdbHandle",
302 /* 16 */ "DebugObject",
303 /* 17 */ "RegionField",
304 /* 18 */ "BankField",
305 /* 19 */ "IndexField",
306 /* 20 */ "Reference",
307 /* 21 */ "Alias",
308 /* 22 */ "MethodAlias",
309 /* 23 */ "Notify",
310 /* 24 */ "AddrHandler",
311 /* 25 */ "ResourceDesc",
312 /* 26 */ "ResourceFld",
313 /* 27 */ "Scope",
314 /* 28 */ "Extra",
315 /* 29 */ "Data",
316 /* 30 */ "Invalid"
317};
318
319
320char *
321AcpiUtGetTypeName (
322 ACPI_OBJECT_TYPE Type)
323{
324
325 if (Type > ACPI_TYPE_INVALID)
326 {
327 return (ACPI_CAST_PTR (char, AcpiGbl_BadType));
328 }
329
330 return (ACPI_CAST_PTR (char, AcpiGbl_NsTypeNames[Type]));
331}
332
333
334char *
335AcpiUtGetObjectTypeName (
336 ACPI_OPERAND_OBJECT *ObjDesc)
337{
338
339 if (!ObjDesc)
340 {
341 return ("[NULL Object Descriptor]");
342 }
343
344 return (AcpiUtGetTypeName (ObjDesc->Common.Type));
345}
346
347
348/*******************************************************************************
349 *
350 * FUNCTION: AcpiUtGetNodeName
351 *
352 * PARAMETERS: Object - A namespace node
353 *
354 * RETURN: ASCII name of the node
355 *
356 * DESCRIPTION: Validate the node and return the node's ACPI name.
357 *
358 ******************************************************************************/
359
360char *
361AcpiUtGetNodeName (
362 void *Object)
363{
364 ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) Object;
365
366
367 /* Must return a string of exactly 4 characters == ACPI_NAME_SIZE */
368
369 if (!Object)
370 {
371 return ("NULL");
372 }
373
374 /* Check for Root node */
375
376 if ((Object == ACPI_ROOT_OBJECT) ||
377 (Object == AcpiGbl_RootNode))
378 {
379 return ("\"\\\" ");
380 }
381
382 /* Descriptor must be a namespace node */
383
384 if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
385 {
386 return ("####");
387 }
388
389 /*
390 * Ensure name is valid. The name was validated/repaired when the node
391 * was created, but make sure it has not been corrupted.
392 */
393 AcpiUtRepairName (Node->Name.Ascii);
394
395 /* Return the name */
396
397 return (Node->Name.Ascii);
398}
399
400
401/*******************************************************************************
402 *
403 * FUNCTION: AcpiUtGetDescriptorName
404 *
405 * PARAMETERS: Object - An ACPI object
406 *
407 * RETURN: Decoded name of the descriptor type
408 *
409 * DESCRIPTION: Validate object and return the descriptor type
410 *
411 ******************************************************************************/
412
413/* Printable names of object descriptor types */
414
415static const char *AcpiGbl_DescTypeNames[] =
416{
417 /* 00 */ "Not a Descriptor",
418 /* 01 */ "Cached",
419 /* 02 */ "State-Generic",
420 /* 03 */ "State-Update",
421 /* 04 */ "State-Package",
422 /* 05 */ "State-Control",
423 /* 06 */ "State-RootParseScope",
424 /* 07 */ "State-ParseScope",
425 /* 08 */ "State-WalkScope",
426 /* 09 */ "State-Result",
427 /* 10 */ "State-Notify",
428 /* 11 */ "State-Thread",
429 /* 12 */ "Walk",
430 /* 13 */ "Parser",
431 /* 14 */ "Operand",
432 /* 15 */ "Node"
433};
434
435
436char *
437AcpiUtGetDescriptorName (
438 void *Object)
439{
440
441 if (!Object)
442 {
443 return ("NULL OBJECT");
444 }
445
446 if (ACPI_GET_DESCRIPTOR_TYPE (Object) > ACPI_DESC_TYPE_MAX)
447 {
448 return ("Not a Descriptor");
449 }
450
451 return (ACPI_CAST_PTR (char,
452 AcpiGbl_DescTypeNames[ACPI_GET_DESCRIPTOR_TYPE (Object)]));
453
454}
455
456
457/*******************************************************************************
458 *
459 * FUNCTION: AcpiUtGetReferenceName
460 *
461 * PARAMETERS: Object - An ACPI reference object
462 *
463 * RETURN: Decoded name of the type of reference
464 *
465 * DESCRIPTION: Decode a reference object sub-type to a string.
466 *
467 ******************************************************************************/
468
469/* Printable names of reference object sub-types */
470
471static const char *AcpiGbl_RefClassNames[] =
472{
473 /* 00 */ "Local",
474 /* 01 */ "Argument",
475 /* 02 */ "RefOf",
476 /* 03 */ "Index",
477 /* 04 */ "DdbHandle",
478 /* 05 */ "Named Object",
479 /* 06 */ "Debug"
480};
481
482const char *
483AcpiUtGetReferenceName (
484 ACPI_OPERAND_OBJECT *Object)
485{
486
487 if (!Object)
488 {
489 return ("NULL Object");
490 }
491
492 if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
493 {
494 return ("Not an Operand object");
495 }
496
497 if (Object->Common.Type != ACPI_TYPE_LOCAL_REFERENCE)
498 {
499 return ("Not a Reference object");
500 }
501
502 if (Object->Reference.Class > ACPI_REFCLASS_MAX)
503 {
504 return ("Unknown Reference class");
505 }
506
507 return (AcpiGbl_RefClassNames[Object->Reference.Class]);
508}
509
510
511#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
512/*
513 * Strings and procedures used for debug only
514 */
515
516/*******************************************************************************
517 *
518 * FUNCTION: AcpiUtGetMutexName
519 *
520 * PARAMETERS: MutexId - The predefined ID for this mutex.
521 *
522 * RETURN: Decoded name of the internal mutex
523 *
524 * DESCRIPTION: Translate a mutex ID into a name string (Debug only)
525 *
526 ******************************************************************************/
527
528/* Names for internal mutex objects, used for debug output */
529
530static char *AcpiGbl_MutexNames[ACPI_NUM_MUTEX] =
531{
532 "ACPI_MTX_Interpreter",
533 "ACPI_MTX_Namespace",
534 "ACPI_MTX_Tables",
535 "ACPI_MTX_Events",
536 "ACPI_MTX_Caches",
537 "ACPI_MTX_Memory",
538 "ACPI_MTX_CommandComplete",
539 "ACPI_MTX_CommandReady"
540};
541
542char *
543AcpiUtGetMutexName (
544 UINT32 MutexId)
545{
546
547 if (MutexId > ACPI_MAX_MUTEX)
548 {
549 return ("Invalid Mutex ID");
550 }
551
552 return (AcpiGbl_MutexNames[MutexId]);
553}
554
555
556/*******************************************************************************
557 *
558 * FUNCTION: AcpiUtGetNotifyName
559 *
560 * PARAMETERS: NotifyValue - Value from the Notify() request
561 *
562 * RETURN: Decoded name for the notify value
563 *
564 * DESCRIPTION: Translate a Notify Value to a notify namestring.
565 *
566 ******************************************************************************/
567
568/* Names for Notify() values, used for debug output */
569
570static const char *AcpiGbl_NotifyValueNames[] =
571{
572 "Bus Check",
573 "Device Check",
574 "Device Wake",
575 "Eject Request",
576 "Device Check Light",
577 "Frequency Mismatch",
578 "Bus Mode Mismatch",
579 "Power Fault",
580 "Capabilities Check",
581 "Device PLD Check",
582 "Reserved",
583 "System Locality Update"
584};
585
586const char *
587AcpiUtGetNotifyName (
588 UINT32 NotifyValue)
589{
590
591 if (NotifyValue <= ACPI_NOTIFY_MAX)
592 {
593 return (AcpiGbl_NotifyValueNames[NotifyValue]);
594 }
595 else if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
596 {
597 return ("Reserved");
598 }
599 else /* Greater or equal to 0x80 */
600 {
601 return ("**Device Specific**");
602 }
603}
604#endif
605
606
607/*******************************************************************************
608 *
609 * FUNCTION: AcpiUtValidObjectType
610 *
611 * PARAMETERS: Type - Object type to be validated
612 *
613 * RETURN: TRUE if valid object type, FALSE otherwise
614 *
615 * DESCRIPTION: Validate an object type
616 *
617 ******************************************************************************/
618
619BOOLEAN
620AcpiUtValidObjectType (
621 ACPI_OBJECT_TYPE Type)
622{
623
624 if (Type > ACPI_TYPE_LOCAL_MAX)
625 {
626 /* Note: Assumes all TYPEs are contiguous (external/local) */
627
628 return (FALSE);
629 }
630
631 return (TRUE);
632}