126f3cdf0SGordon Ross /******************************************************************************
226f3cdf0SGordon Ross *
326f3cdf0SGordon Ross * Module Name: utdecode - Utility decoding routines (value-to-string)
426f3cdf0SGordon Ross *
526f3cdf0SGordon Ross *****************************************************************************/
626f3cdf0SGordon Ross
726f3cdf0SGordon Ross /*
8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp.
926f3cdf0SGordon Ross * All rights reserved.
1026f3cdf0SGordon Ross *
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.
2526f3cdf0SGordon Ross *
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.
2926f3cdf0SGordon Ross *
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 */
4326f3cdf0SGordon Ross
4426f3cdf0SGordon Ross #include "acpi.h"
4526f3cdf0SGordon Ross #include "accommon.h"
4626f3cdf0SGordon Ross #include "acnamesp.h"
4726f3cdf0SGordon Ross
4826f3cdf0SGordon Ross #define _COMPONENT ACPI_UTILITIES
4926f3cdf0SGordon Ross ACPI_MODULE_NAME ("utdecode")
5026f3cdf0SGordon Ross
5126f3cdf0SGordon Ross
5226f3cdf0SGordon Ross /*
5326f3cdf0SGordon Ross * Properties of the ACPI Object Types, both internal and external.
5426f3cdf0SGordon Ross * The table is indexed by values of ACPI_OBJECT_TYPE
5526f3cdf0SGordon Ross */
5626f3cdf0SGordon Ross const UINT8 AcpiGbl_NsProperties[ACPI_NUM_NS_TYPES] =
5726f3cdf0SGordon Ross {
5826f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 00 Any */
5926f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 01 Number */
6026f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 02 String */
6126f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 03 Buffer */
6226f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 04 Package */
6326f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 05 FieldUnit */
6426f3cdf0SGordon Ross ACPI_NS_NEWSCOPE, /* 06 Device */
6526f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 07 Event */
6626f3cdf0SGordon Ross ACPI_NS_NEWSCOPE, /* 08 Method */
6726f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 09 Mutex */
6826f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 10 Region */
6926f3cdf0SGordon Ross ACPI_NS_NEWSCOPE, /* 11 Power */
7026f3cdf0SGordon Ross ACPI_NS_NEWSCOPE, /* 12 Processor */
7126f3cdf0SGordon Ross ACPI_NS_NEWSCOPE, /* 13 Thermal */
7226f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 14 BufferField */
7326f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 15 DdbHandle */
7426f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 16 Debug Object */
7526f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 17 DefField */
7626f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 18 BankField */
7726f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 19 IndexField */
7826f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 20 Reference */
7926f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 21 Alias */
8026f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 22 MethodAlias */
8126f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 23 Notify */
8226f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 24 Address Handler */
8326f3cdf0SGordon Ross ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL, /* 25 Resource Desc */
8426f3cdf0SGordon Ross ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL, /* 26 Resource Field */
8526f3cdf0SGordon Ross ACPI_NS_NEWSCOPE, /* 27 Scope */
8626f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 28 Extra */
8726f3cdf0SGordon Ross ACPI_NS_NORMAL, /* 29 Data */
8826f3cdf0SGordon Ross ACPI_NS_NORMAL /* 30 Invalid */
8926f3cdf0SGordon Ross };
9026f3cdf0SGordon Ross
9126f3cdf0SGordon Ross
9226f3cdf0SGordon Ross /*******************************************************************************
9326f3cdf0SGordon Ross *
9426f3cdf0SGordon Ross * FUNCTION: AcpiUtGetRegionName
9526f3cdf0SGordon Ross *
9626f3cdf0SGordon Ross * PARAMETERS: Space ID - ID for the region
9726f3cdf0SGordon Ross *
9826f3cdf0SGordon Ross * RETURN: Decoded region SpaceId name
9926f3cdf0SGordon Ross *
10026f3cdf0SGordon Ross * DESCRIPTION: Translate a Space ID into a name string (Debug only)
10126f3cdf0SGordon Ross *
10226f3cdf0SGordon Ross ******************************************************************************/
10326f3cdf0SGordon Ross
10426f3cdf0SGordon Ross /* Region type decoding */
10526f3cdf0SGordon Ross
10626f3cdf0SGordon Ross const char *AcpiGbl_RegionTypes[ACPI_NUM_PREDEFINED_REGIONS] =
10726f3cdf0SGordon Ross {
108*385cc6b4SJerry Jelinek "SystemMemory", /* 0x00 */
109*385cc6b4SJerry Jelinek "SystemIO", /* 0x01 */
110*385cc6b4SJerry Jelinek "PCI_Config", /* 0x02 */
111*385cc6b4SJerry Jelinek "EmbeddedControl", /* 0x03 */
112*385cc6b4SJerry Jelinek "SMBus", /* 0x04 */
113*385cc6b4SJerry Jelinek "SystemCMOS", /* 0x05 */
114*385cc6b4SJerry Jelinek "PCIBARTarget", /* 0x06 */
115*385cc6b4SJerry Jelinek "IPMI", /* 0x07 */
116*385cc6b4SJerry Jelinek "GeneralPurposeIo", /* 0x08 */
117*385cc6b4SJerry Jelinek "GenericSerialBus", /* 0x09 */
118*385cc6b4SJerry Jelinek "PCC" /* 0x0A */
11926f3cdf0SGordon Ross };
12026f3cdf0SGordon Ross
12126f3cdf0SGordon Ross
122*385cc6b4SJerry Jelinek const char *
AcpiUtGetRegionName(UINT8 SpaceId)12326f3cdf0SGordon Ross AcpiUtGetRegionName (
12426f3cdf0SGordon Ross UINT8 SpaceId)
12526f3cdf0SGordon Ross {
12626f3cdf0SGordon Ross
12726f3cdf0SGordon Ross if (SpaceId >= ACPI_USER_REGION_BEGIN)
12826f3cdf0SGordon Ross {
12926f3cdf0SGordon Ross return ("UserDefinedRegion");
13026f3cdf0SGordon Ross }
13126f3cdf0SGordon Ross else if (SpaceId == ACPI_ADR_SPACE_DATA_TABLE)
13226f3cdf0SGordon Ross {
13326f3cdf0SGordon Ross return ("DataTable");
13426f3cdf0SGordon Ross }
13526f3cdf0SGordon Ross else if (SpaceId == ACPI_ADR_SPACE_FIXED_HARDWARE)
13626f3cdf0SGordon Ross {
13726f3cdf0SGordon Ross return ("FunctionalFixedHW");
13826f3cdf0SGordon Ross }
13926f3cdf0SGordon Ross else if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
14026f3cdf0SGordon Ross {
14126f3cdf0SGordon Ross return ("InvalidSpaceId");
14226f3cdf0SGordon Ross }
14326f3cdf0SGordon Ross
144*385cc6b4SJerry Jelinek return (AcpiGbl_RegionTypes[SpaceId]);
14526f3cdf0SGordon Ross }
14626f3cdf0SGordon Ross
14726f3cdf0SGordon Ross
14826f3cdf0SGordon Ross /*******************************************************************************
14926f3cdf0SGordon Ross *
15026f3cdf0SGordon Ross * FUNCTION: AcpiUtGetEventName
15126f3cdf0SGordon Ross *
15226f3cdf0SGordon Ross * PARAMETERS: EventId - Fixed event ID
15326f3cdf0SGordon Ross *
15426f3cdf0SGordon Ross * RETURN: Decoded event ID name
15526f3cdf0SGordon Ross *
15626f3cdf0SGordon Ross * DESCRIPTION: Translate a Event ID into a name string (Debug only)
15726f3cdf0SGordon Ross *
15826f3cdf0SGordon Ross ******************************************************************************/
15926f3cdf0SGordon Ross
16026f3cdf0SGordon Ross /* Event type decoding */
16126f3cdf0SGordon Ross
16226f3cdf0SGordon Ross static const char *AcpiGbl_EventTypes[ACPI_NUM_FIXED_EVENTS] =
16326f3cdf0SGordon Ross {
16426f3cdf0SGordon Ross "PM_Timer",
16526f3cdf0SGordon Ross "GlobalLock",
16626f3cdf0SGordon Ross "PowerButton",
16726f3cdf0SGordon Ross "SleepButton",
16826f3cdf0SGordon Ross "RealTimeClock",
16926f3cdf0SGordon Ross };
17026f3cdf0SGordon Ross
17126f3cdf0SGordon Ross
172*385cc6b4SJerry Jelinek const char *
AcpiUtGetEventName(UINT32 EventId)17326f3cdf0SGordon Ross AcpiUtGetEventName (
17426f3cdf0SGordon Ross UINT32 EventId)
17526f3cdf0SGordon Ross {
17626f3cdf0SGordon Ross
17726f3cdf0SGordon Ross if (EventId > ACPI_EVENT_MAX)
17826f3cdf0SGordon Ross {
17926f3cdf0SGordon Ross return ("InvalidEventID");
18026f3cdf0SGordon Ross }
18126f3cdf0SGordon Ross
182*385cc6b4SJerry Jelinek return (AcpiGbl_EventTypes[EventId]);
18326f3cdf0SGordon Ross }
18426f3cdf0SGordon Ross
18526f3cdf0SGordon Ross
18626f3cdf0SGordon Ross /*******************************************************************************
18726f3cdf0SGordon Ross *
18826f3cdf0SGordon Ross * FUNCTION: AcpiUtGetTypeName
18926f3cdf0SGordon Ross *
19026f3cdf0SGordon Ross * PARAMETERS: Type - An ACPI object type
19126f3cdf0SGordon Ross *
19226f3cdf0SGordon Ross * RETURN: Decoded ACPI object type name
19326f3cdf0SGordon Ross *
19426f3cdf0SGordon Ross * DESCRIPTION: Translate a Type ID into a name string (Debug only)
19526f3cdf0SGordon Ross *
19626f3cdf0SGordon Ross ******************************************************************************/
19726f3cdf0SGordon Ross
19826f3cdf0SGordon Ross /*
19926f3cdf0SGordon Ross * Elements of AcpiGbl_NsTypeNames below must match
20026f3cdf0SGordon Ross * one-to-one with values of ACPI_OBJECT_TYPE
20126f3cdf0SGordon Ross *
20226f3cdf0SGordon Ross * The type ACPI_TYPE_ANY (Untyped) is used as a "don't care" when searching;
20326f3cdf0SGordon Ross * when stored in a table it really means that we have thus far seen no
204*385cc6b4SJerry Jelinek * evidence to indicate what type is actually going to be stored for this
205*385cc6b4SJerry Jelinek & entry.
20626f3cdf0SGordon Ross */
20726f3cdf0SGordon Ross static const char AcpiGbl_BadType[] = "UNDEFINED";
20826f3cdf0SGordon Ross
20926f3cdf0SGordon Ross /* Printable names of the ACPI object types */
21026f3cdf0SGordon Ross
21126f3cdf0SGordon Ross static const char *AcpiGbl_NsTypeNames[] =
21226f3cdf0SGordon Ross {
21326f3cdf0SGordon Ross /* 00 */ "Untyped",
21426f3cdf0SGordon Ross /* 01 */ "Integer",
21526f3cdf0SGordon Ross /* 02 */ "String",
21626f3cdf0SGordon Ross /* 03 */ "Buffer",
21726f3cdf0SGordon Ross /* 04 */ "Package",
21826f3cdf0SGordon Ross /* 05 */ "FieldUnit",
21926f3cdf0SGordon Ross /* 06 */ "Device",
22026f3cdf0SGordon Ross /* 07 */ "Event",
22126f3cdf0SGordon Ross /* 08 */ "Method",
22226f3cdf0SGordon Ross /* 09 */ "Mutex",
22326f3cdf0SGordon Ross /* 10 */ "Region",
22426f3cdf0SGordon Ross /* 11 */ "Power",
22526f3cdf0SGordon Ross /* 12 */ "Processor",
22626f3cdf0SGordon Ross /* 13 */ "Thermal",
22726f3cdf0SGordon Ross /* 14 */ "BufferField",
22826f3cdf0SGordon Ross /* 15 */ "DdbHandle",
22926f3cdf0SGordon Ross /* 16 */ "DebugObject",
23026f3cdf0SGordon Ross /* 17 */ "RegionField",
23126f3cdf0SGordon Ross /* 18 */ "BankField",
23226f3cdf0SGordon Ross /* 19 */ "IndexField",
23326f3cdf0SGordon Ross /* 20 */ "Reference",
23426f3cdf0SGordon Ross /* 21 */ "Alias",
23526f3cdf0SGordon Ross /* 22 */ "MethodAlias",
23626f3cdf0SGordon Ross /* 23 */ "Notify",
23726f3cdf0SGordon Ross /* 24 */ "AddrHandler",
23826f3cdf0SGordon Ross /* 25 */ "ResourceDesc",
23926f3cdf0SGordon Ross /* 26 */ "ResourceFld",
24026f3cdf0SGordon Ross /* 27 */ "Scope",
24126f3cdf0SGordon Ross /* 28 */ "Extra",
24226f3cdf0SGordon Ross /* 29 */ "Data",
24326f3cdf0SGordon Ross /* 30 */ "Invalid"
24426f3cdf0SGordon Ross };
24526f3cdf0SGordon Ross
24626f3cdf0SGordon Ross
247*385cc6b4SJerry Jelinek const char *
AcpiUtGetTypeName(ACPI_OBJECT_TYPE Type)24826f3cdf0SGordon Ross AcpiUtGetTypeName (
24926f3cdf0SGordon Ross ACPI_OBJECT_TYPE Type)
25026f3cdf0SGordon Ross {
25126f3cdf0SGordon Ross
25226f3cdf0SGordon Ross if (Type > ACPI_TYPE_INVALID)
25326f3cdf0SGordon Ross {
254*385cc6b4SJerry Jelinek return (AcpiGbl_BadType);
25526f3cdf0SGordon Ross }
25626f3cdf0SGordon Ross
257*385cc6b4SJerry Jelinek return (AcpiGbl_NsTypeNames[Type]);
25826f3cdf0SGordon Ross }
25926f3cdf0SGordon Ross
26026f3cdf0SGordon Ross
261*385cc6b4SJerry Jelinek const char *
AcpiUtGetObjectTypeName(ACPI_OPERAND_OBJECT * ObjDesc)26226f3cdf0SGordon Ross AcpiUtGetObjectTypeName (
26326f3cdf0SGordon Ross ACPI_OPERAND_OBJECT *ObjDesc)
26426f3cdf0SGordon Ross {
265*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE (UtGetObjectTypeName);
266*385cc6b4SJerry Jelinek
26726f3cdf0SGordon Ross
26826f3cdf0SGordon Ross if (!ObjDesc)
26926f3cdf0SGordon Ross {
270*385cc6b4SJerry Jelinek ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n"));
271*385cc6b4SJerry Jelinek return_PTR ("[NULL Object Descriptor]");
27226f3cdf0SGordon Ross }
27326f3cdf0SGordon Ross
274*385cc6b4SJerry Jelinek /* These descriptor types share a common area */
275*385cc6b4SJerry Jelinek
276*385cc6b4SJerry Jelinek if ((ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) &&
277*385cc6b4SJerry Jelinek (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_NAMED))
278*385cc6b4SJerry Jelinek {
279*385cc6b4SJerry Jelinek ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
280*385cc6b4SJerry Jelinek "Invalid object descriptor type: 0x%2.2X [%s] (%p)\n",
281*385cc6b4SJerry Jelinek ACPI_GET_DESCRIPTOR_TYPE (ObjDesc),
282*385cc6b4SJerry Jelinek AcpiUtGetDescriptorName (ObjDesc), ObjDesc));
283*385cc6b4SJerry Jelinek
284*385cc6b4SJerry Jelinek return_PTR ("Invalid object");
285*385cc6b4SJerry Jelinek }
286*385cc6b4SJerry Jelinek
287*385cc6b4SJerry Jelinek return_STR (AcpiUtGetTypeName (ObjDesc->Common.Type));
28826f3cdf0SGordon Ross }
28926f3cdf0SGordon Ross
29026f3cdf0SGordon Ross
29126f3cdf0SGordon Ross /*******************************************************************************
29226f3cdf0SGordon Ross *
29326f3cdf0SGordon Ross * FUNCTION: AcpiUtGetNodeName
29426f3cdf0SGordon Ross *
29526f3cdf0SGordon Ross * PARAMETERS: Object - A namespace node
29626f3cdf0SGordon Ross *
29726f3cdf0SGordon Ross * RETURN: ASCII name of the node
29826f3cdf0SGordon Ross *
29926f3cdf0SGordon Ross * DESCRIPTION: Validate the node and return the node's ACPI name.
30026f3cdf0SGordon Ross *
30126f3cdf0SGordon Ross ******************************************************************************/
30226f3cdf0SGordon Ross
303*385cc6b4SJerry Jelinek const char *
AcpiUtGetNodeName(void * Object)30426f3cdf0SGordon Ross AcpiUtGetNodeName (
30526f3cdf0SGordon Ross void *Object)
30626f3cdf0SGordon Ross {
30726f3cdf0SGordon Ross ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) Object;
30826f3cdf0SGordon Ross
30926f3cdf0SGordon Ross
31026f3cdf0SGordon Ross /* Must return a string of exactly 4 characters == ACPI_NAME_SIZE */
31126f3cdf0SGordon Ross
31226f3cdf0SGordon Ross if (!Object)
31326f3cdf0SGordon Ross {
31426f3cdf0SGordon Ross return ("NULL");
31526f3cdf0SGordon Ross }
31626f3cdf0SGordon Ross
31726f3cdf0SGordon Ross /* Check for Root node */
31826f3cdf0SGordon Ross
31926f3cdf0SGordon Ross if ((Object == ACPI_ROOT_OBJECT) ||
32026f3cdf0SGordon Ross (Object == AcpiGbl_RootNode))
32126f3cdf0SGordon Ross {
32226f3cdf0SGordon Ross return ("\"\\\" ");
32326f3cdf0SGordon Ross }
32426f3cdf0SGordon Ross
32526f3cdf0SGordon Ross /* Descriptor must be a namespace node */
32626f3cdf0SGordon Ross
32726f3cdf0SGordon Ross if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
32826f3cdf0SGordon Ross {
32926f3cdf0SGordon Ross return ("####");
33026f3cdf0SGordon Ross }
33126f3cdf0SGordon Ross
33226f3cdf0SGordon Ross /*
33326f3cdf0SGordon Ross * Ensure name is valid. The name was validated/repaired when the node
33426f3cdf0SGordon Ross * was created, but make sure it has not been corrupted.
33526f3cdf0SGordon Ross */
33626f3cdf0SGordon Ross AcpiUtRepairName (Node->Name.Ascii);
33726f3cdf0SGordon Ross
33826f3cdf0SGordon Ross /* Return the name */
33926f3cdf0SGordon Ross
34026f3cdf0SGordon Ross return (Node->Name.Ascii);
34126f3cdf0SGordon Ross }
34226f3cdf0SGordon Ross
34326f3cdf0SGordon Ross
34426f3cdf0SGordon Ross /*******************************************************************************
34526f3cdf0SGordon Ross *
34626f3cdf0SGordon Ross * FUNCTION: AcpiUtGetDescriptorName
34726f3cdf0SGordon Ross *
34826f3cdf0SGordon Ross * PARAMETERS: Object - An ACPI object
34926f3cdf0SGordon Ross *
35026f3cdf0SGordon Ross * RETURN: Decoded name of the descriptor type
35126f3cdf0SGordon Ross *
35226f3cdf0SGordon Ross * DESCRIPTION: Validate object and return the descriptor type
35326f3cdf0SGordon Ross *
35426f3cdf0SGordon Ross ******************************************************************************/
35526f3cdf0SGordon Ross
35626f3cdf0SGordon Ross /* Printable names of object descriptor types */
35726f3cdf0SGordon Ross
35826f3cdf0SGordon Ross static const char *AcpiGbl_DescTypeNames[] =
35926f3cdf0SGordon Ross {
36026f3cdf0SGordon Ross /* 00 */ "Not a Descriptor",
36126f3cdf0SGordon Ross /* 01 */ "Cached",
36226f3cdf0SGordon Ross /* 02 */ "State-Generic",
36326f3cdf0SGordon Ross /* 03 */ "State-Update",
36426f3cdf0SGordon Ross /* 04 */ "State-Package",
36526f3cdf0SGordon Ross /* 05 */ "State-Control",
36626f3cdf0SGordon Ross /* 06 */ "State-RootParseScope",
36726f3cdf0SGordon Ross /* 07 */ "State-ParseScope",
36826f3cdf0SGordon Ross /* 08 */ "State-WalkScope",
36926f3cdf0SGordon Ross /* 09 */ "State-Result",
37026f3cdf0SGordon Ross /* 10 */ "State-Notify",
37126f3cdf0SGordon Ross /* 11 */ "State-Thread",
37226f3cdf0SGordon Ross /* 12 */ "Walk",
37326f3cdf0SGordon Ross /* 13 */ "Parser",
37426f3cdf0SGordon Ross /* 14 */ "Operand",
37526f3cdf0SGordon Ross /* 15 */ "Node"
37626f3cdf0SGordon Ross };
37726f3cdf0SGordon Ross
37826f3cdf0SGordon Ross
379*385cc6b4SJerry Jelinek const char *
AcpiUtGetDescriptorName(void * Object)38026f3cdf0SGordon Ross AcpiUtGetDescriptorName (
38126f3cdf0SGordon Ross void *Object)
38226f3cdf0SGordon Ross {
38326f3cdf0SGordon Ross
38426f3cdf0SGordon Ross if (!Object)
38526f3cdf0SGordon Ross {
38626f3cdf0SGordon Ross return ("NULL OBJECT");
38726f3cdf0SGordon Ross }
38826f3cdf0SGordon Ross
38926f3cdf0SGordon Ross if (ACPI_GET_DESCRIPTOR_TYPE (Object) > ACPI_DESC_TYPE_MAX)
39026f3cdf0SGordon Ross {
39126f3cdf0SGordon Ross return ("Not a Descriptor");
39226f3cdf0SGordon Ross }
39326f3cdf0SGordon Ross
394*385cc6b4SJerry Jelinek return (AcpiGbl_DescTypeNames[ACPI_GET_DESCRIPTOR_TYPE (Object)]);
39526f3cdf0SGordon Ross }
39626f3cdf0SGordon Ross
39726f3cdf0SGordon Ross
39826f3cdf0SGordon Ross /*******************************************************************************
39926f3cdf0SGordon Ross *
40026f3cdf0SGordon Ross * FUNCTION: AcpiUtGetReferenceName
40126f3cdf0SGordon Ross *
40226f3cdf0SGordon Ross * PARAMETERS: Object - An ACPI reference object
40326f3cdf0SGordon Ross *
40426f3cdf0SGordon Ross * RETURN: Decoded name of the type of reference
40526f3cdf0SGordon Ross *
40626f3cdf0SGordon Ross * DESCRIPTION: Decode a reference object sub-type to a string.
40726f3cdf0SGordon Ross *
40826f3cdf0SGordon Ross ******************************************************************************/
40926f3cdf0SGordon Ross
41026f3cdf0SGordon Ross /* Printable names of reference object sub-types */
41126f3cdf0SGordon Ross
41226f3cdf0SGordon Ross static const char *AcpiGbl_RefClassNames[] =
41326f3cdf0SGordon Ross {
41426f3cdf0SGordon Ross /* 00 */ "Local",
41526f3cdf0SGordon Ross /* 01 */ "Argument",
41626f3cdf0SGordon Ross /* 02 */ "RefOf",
41726f3cdf0SGordon Ross /* 03 */ "Index",
41826f3cdf0SGordon Ross /* 04 */ "DdbHandle",
41926f3cdf0SGordon Ross /* 05 */ "Named Object",
42026f3cdf0SGordon Ross /* 06 */ "Debug"
42126f3cdf0SGordon Ross };
42226f3cdf0SGordon Ross
42326f3cdf0SGordon Ross const char *
AcpiUtGetReferenceName(ACPI_OPERAND_OBJECT * Object)42426f3cdf0SGordon Ross AcpiUtGetReferenceName (
42526f3cdf0SGordon Ross ACPI_OPERAND_OBJECT *Object)
42626f3cdf0SGordon Ross {
42726f3cdf0SGordon Ross
42826f3cdf0SGordon Ross if (!Object)
42926f3cdf0SGordon Ross {
43026f3cdf0SGordon Ross return ("NULL Object");
43126f3cdf0SGordon Ross }
43226f3cdf0SGordon Ross
43326f3cdf0SGordon Ross if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
43426f3cdf0SGordon Ross {
43526f3cdf0SGordon Ross return ("Not an Operand object");
43626f3cdf0SGordon Ross }
43726f3cdf0SGordon Ross
43826f3cdf0SGordon Ross if (Object->Common.Type != ACPI_TYPE_LOCAL_REFERENCE)
43926f3cdf0SGordon Ross {
44026f3cdf0SGordon Ross return ("Not a Reference object");
44126f3cdf0SGordon Ross }
44226f3cdf0SGordon Ross
44326f3cdf0SGordon Ross if (Object->Reference.Class > ACPI_REFCLASS_MAX)
44426f3cdf0SGordon Ross {
44526f3cdf0SGordon Ross return ("Unknown Reference class");
44626f3cdf0SGordon Ross }
44726f3cdf0SGordon Ross
44826f3cdf0SGordon Ross return (AcpiGbl_RefClassNames[Object->Reference.Class]);
44926f3cdf0SGordon Ross }
45026f3cdf0SGordon Ross
45126f3cdf0SGordon Ross
45226f3cdf0SGordon Ross #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
45326f3cdf0SGordon Ross /*
45426f3cdf0SGordon Ross * Strings and procedures used for debug only
45526f3cdf0SGordon Ross */
45626f3cdf0SGordon Ross
45726f3cdf0SGordon Ross /*******************************************************************************
45826f3cdf0SGordon Ross *
45926f3cdf0SGordon Ross * FUNCTION: AcpiUtGetMutexName
46026f3cdf0SGordon Ross *
46126f3cdf0SGordon Ross * PARAMETERS: MutexId - The predefined ID for this mutex.
46226f3cdf0SGordon Ross *
46326f3cdf0SGordon Ross * RETURN: Decoded name of the internal mutex
46426f3cdf0SGordon Ross *
46526f3cdf0SGordon Ross * DESCRIPTION: Translate a mutex ID into a name string (Debug only)
46626f3cdf0SGordon Ross *
46726f3cdf0SGordon Ross ******************************************************************************/
46826f3cdf0SGordon Ross
46926f3cdf0SGordon Ross /* Names for internal mutex objects, used for debug output */
47026f3cdf0SGordon Ross
471*385cc6b4SJerry Jelinek static const char *AcpiGbl_MutexNames[ACPI_NUM_MUTEX] =
47226f3cdf0SGordon Ross {
47326f3cdf0SGordon Ross "ACPI_MTX_Interpreter",
47426f3cdf0SGordon Ross "ACPI_MTX_Namespace",
47526f3cdf0SGordon Ross "ACPI_MTX_Tables",
47626f3cdf0SGordon Ross "ACPI_MTX_Events",
47726f3cdf0SGordon Ross "ACPI_MTX_Caches",
47826f3cdf0SGordon Ross "ACPI_MTX_Memory",
47926f3cdf0SGordon Ross };
48026f3cdf0SGordon Ross
481*385cc6b4SJerry Jelinek const char *
AcpiUtGetMutexName(UINT32 MutexId)48226f3cdf0SGordon Ross AcpiUtGetMutexName (
48326f3cdf0SGordon Ross UINT32 MutexId)
48426f3cdf0SGordon Ross {
48526f3cdf0SGordon Ross
48626f3cdf0SGordon Ross if (MutexId > ACPI_MAX_MUTEX)
48726f3cdf0SGordon Ross {
48826f3cdf0SGordon Ross return ("Invalid Mutex ID");
48926f3cdf0SGordon Ross }
49026f3cdf0SGordon Ross
49126f3cdf0SGordon Ross return (AcpiGbl_MutexNames[MutexId]);
49226f3cdf0SGordon Ross }
49326f3cdf0SGordon Ross
49426f3cdf0SGordon Ross
49526f3cdf0SGordon Ross /*******************************************************************************
49626f3cdf0SGordon Ross *
49726f3cdf0SGordon Ross * FUNCTION: AcpiUtGetNotifyName
49826f3cdf0SGordon Ross *
49926f3cdf0SGordon Ross * PARAMETERS: NotifyValue - Value from the Notify() request
50026f3cdf0SGordon Ross *
50126f3cdf0SGordon Ross * RETURN: Decoded name for the notify value
50226f3cdf0SGordon Ross *
50326f3cdf0SGordon Ross * DESCRIPTION: Translate a Notify Value to a notify namestring.
50426f3cdf0SGordon Ross *
50526f3cdf0SGordon Ross ******************************************************************************/
50626f3cdf0SGordon Ross
50726f3cdf0SGordon Ross /* Names for Notify() values, used for debug output */
50826f3cdf0SGordon Ross
509*385cc6b4SJerry Jelinek static const char *AcpiGbl_GenericNotify[ACPI_GENERIC_NOTIFY_MAX + 1] =
51026f3cdf0SGordon Ross {
511*385cc6b4SJerry Jelinek /* 00 */ "Bus Check",
512*385cc6b4SJerry Jelinek /* 01 */ "Device Check",
513*385cc6b4SJerry Jelinek /* 02 */ "Device Wake",
514*385cc6b4SJerry Jelinek /* 03 */ "Eject Request",
515*385cc6b4SJerry Jelinek /* 04 */ "Device Check Light",
516*385cc6b4SJerry Jelinek /* 05 */ "Frequency Mismatch",
517*385cc6b4SJerry Jelinek /* 06 */ "Bus Mode Mismatch",
518*385cc6b4SJerry Jelinek /* 07 */ "Power Fault",
519*385cc6b4SJerry Jelinek /* 08 */ "Capabilities Check",
520*385cc6b4SJerry Jelinek /* 09 */ "Device PLD Check",
521*385cc6b4SJerry Jelinek /* 0A */ "Reserved",
522*385cc6b4SJerry Jelinek /* 0B */ "System Locality Update",
523*385cc6b4SJerry Jelinek /* 0C */ "Shutdown Request", /* Reserved in ACPI 6.0 */
524*385cc6b4SJerry Jelinek /* 0D */ "System Resource Affinity Update"
52526f3cdf0SGordon Ross };
52626f3cdf0SGordon Ross
527*385cc6b4SJerry Jelinek static const char *AcpiGbl_DeviceNotify[5] =
528*385cc6b4SJerry Jelinek {
529*385cc6b4SJerry Jelinek /* 80 */ "Status Change",
530*385cc6b4SJerry Jelinek /* 81 */ "Information Change",
531*385cc6b4SJerry Jelinek /* 82 */ "Device-Specific Change",
532*385cc6b4SJerry Jelinek /* 83 */ "Device-Specific Change",
533*385cc6b4SJerry Jelinek /* 84 */ "Reserved"
534*385cc6b4SJerry Jelinek };
535*385cc6b4SJerry Jelinek
536*385cc6b4SJerry Jelinek static const char *AcpiGbl_ProcessorNotify[5] =
537*385cc6b4SJerry Jelinek {
538*385cc6b4SJerry Jelinek /* 80 */ "Performance Capability Change",
539*385cc6b4SJerry Jelinek /* 81 */ "C-State Change",
540*385cc6b4SJerry Jelinek /* 82 */ "Throttling Capability Change",
541*385cc6b4SJerry Jelinek /* 83 */ "Guaranteed Change",
542*385cc6b4SJerry Jelinek /* 84 */ "Minimum Excursion"
543*385cc6b4SJerry Jelinek };
544*385cc6b4SJerry Jelinek
545*385cc6b4SJerry Jelinek static const char *AcpiGbl_ThermalNotify[5] =
546*385cc6b4SJerry Jelinek {
547*385cc6b4SJerry Jelinek /* 80 */ "Thermal Status Change",
548*385cc6b4SJerry Jelinek /* 81 */ "Thermal Trip Point Change",
549*385cc6b4SJerry Jelinek /* 82 */ "Thermal Device List Change",
550*385cc6b4SJerry Jelinek /* 83 */ "Thermal Relationship Change",
551*385cc6b4SJerry Jelinek /* 84 */ "Reserved"
552*385cc6b4SJerry Jelinek };
553*385cc6b4SJerry Jelinek
554*385cc6b4SJerry Jelinek
55526f3cdf0SGordon Ross const char *
AcpiUtGetNotifyName(UINT32 NotifyValue,ACPI_OBJECT_TYPE Type)55626f3cdf0SGordon Ross AcpiUtGetNotifyName (
557*385cc6b4SJerry Jelinek UINT32 NotifyValue,
558*385cc6b4SJerry Jelinek ACPI_OBJECT_TYPE Type)
55926f3cdf0SGordon Ross {
56026f3cdf0SGordon Ross
561*385cc6b4SJerry Jelinek /* 00 - 0D are "common to all object types" (from ACPI Spec) */
562*385cc6b4SJerry Jelinek
563*385cc6b4SJerry Jelinek if (NotifyValue <= ACPI_GENERIC_NOTIFY_MAX)
56426f3cdf0SGordon Ross {
565*385cc6b4SJerry Jelinek return (AcpiGbl_GenericNotify[NotifyValue]);
56626f3cdf0SGordon Ross }
567*385cc6b4SJerry Jelinek
568*385cc6b4SJerry Jelinek /* 0E - 7F are reserved */
569*385cc6b4SJerry Jelinek
570*385cc6b4SJerry Jelinek if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
57126f3cdf0SGordon Ross {
57226f3cdf0SGordon Ross return ("Reserved");
57326f3cdf0SGordon Ross }
574*385cc6b4SJerry Jelinek
575*385cc6b4SJerry Jelinek /* 80 - 84 are per-object-type */
576*385cc6b4SJerry Jelinek
577*385cc6b4SJerry Jelinek if (NotifyValue <= ACPI_SPECIFIC_NOTIFY_MAX)
57826f3cdf0SGordon Ross {
579*385cc6b4SJerry Jelinek switch (Type)
580*385cc6b4SJerry Jelinek {
581*385cc6b4SJerry Jelinek case ACPI_TYPE_ANY:
582*385cc6b4SJerry Jelinek case ACPI_TYPE_DEVICE:
583*385cc6b4SJerry Jelinek return (AcpiGbl_DeviceNotify [NotifyValue - 0x80]);
584*385cc6b4SJerry Jelinek
585*385cc6b4SJerry Jelinek case ACPI_TYPE_PROCESSOR:
586*385cc6b4SJerry Jelinek return (AcpiGbl_ProcessorNotify [NotifyValue - 0x80]);
587*385cc6b4SJerry Jelinek
588*385cc6b4SJerry Jelinek case ACPI_TYPE_THERMAL:
589*385cc6b4SJerry Jelinek return (AcpiGbl_ThermalNotify [NotifyValue - 0x80]);
590*385cc6b4SJerry Jelinek
591*385cc6b4SJerry Jelinek default:
592*385cc6b4SJerry Jelinek return ("Target object type does not support notifies");
59326f3cdf0SGordon Ross }
59426f3cdf0SGordon Ross }
595*385cc6b4SJerry Jelinek
596*385cc6b4SJerry Jelinek /* 84 - BF are device-specific */
597*385cc6b4SJerry Jelinek
598*385cc6b4SJerry Jelinek if (NotifyValue <= ACPI_MAX_DEVICE_SPECIFIC_NOTIFY)
599*385cc6b4SJerry Jelinek {
600*385cc6b4SJerry Jelinek return ("Device-Specific");
601*385cc6b4SJerry Jelinek }
602*385cc6b4SJerry Jelinek
603*385cc6b4SJerry Jelinek /* C0 and above are hardware-specific */
604*385cc6b4SJerry Jelinek
605*385cc6b4SJerry Jelinek return ("Hardware-Specific");
606*385cc6b4SJerry Jelinek }
60726f3cdf0SGordon Ross #endif
60826f3cdf0SGordon Ross
60926f3cdf0SGordon Ross
61026f3cdf0SGordon Ross /*******************************************************************************
61126f3cdf0SGordon Ross *
61226f3cdf0SGordon Ross * FUNCTION: AcpiUtValidObjectType
61326f3cdf0SGordon Ross *
61426f3cdf0SGordon Ross * PARAMETERS: Type - Object type to be validated
61526f3cdf0SGordon Ross *
61626f3cdf0SGordon Ross * RETURN: TRUE if valid object type, FALSE otherwise
61726f3cdf0SGordon Ross *
61826f3cdf0SGordon Ross * DESCRIPTION: Validate an object type
61926f3cdf0SGordon Ross *
62026f3cdf0SGordon Ross ******************************************************************************/
62126f3cdf0SGordon Ross
62226f3cdf0SGordon Ross BOOLEAN
AcpiUtValidObjectType(ACPI_OBJECT_TYPE Type)62326f3cdf0SGordon Ross AcpiUtValidObjectType (
62426f3cdf0SGordon Ross ACPI_OBJECT_TYPE Type)
62526f3cdf0SGordon Ross {
62626f3cdf0SGordon Ross
62726f3cdf0SGordon Ross if (Type > ACPI_TYPE_LOCAL_MAX)
62826f3cdf0SGordon Ross {
62926f3cdf0SGordon Ross /* Note: Assumes all TYPEs are contiguous (external/local) */
63026f3cdf0SGordon Ross
63126f3cdf0SGordon Ross return (FALSE);
63226f3cdf0SGordon Ross }
63326f3cdf0SGordon Ross
63426f3cdf0SGordon Ross return (TRUE);
63526f3cdf0SGordon Ross }
636