Home | History | Annotate | Line # | Download | only in utilities
utdecode.c revision 1.1.1.5
      1 /******************************************************************************
      2  *
      3  * Module Name: utdecode - Utility decoding routines (value-to-string)
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2015, 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 #include "acpi.h"
     45 #include "accommon.h"
     46 #include "acnamesp.h"
     47 
     48 #define _COMPONENT          ACPI_UTILITIES
     49         ACPI_MODULE_NAME    ("utdecode")
     50 
     51 
     52 /*
     53  * Properties of the ACPI Object Types, both internal and external.
     54  * The table is indexed by values of ACPI_OBJECT_TYPE
     55  */
     56 const UINT8                     AcpiGbl_NsProperties[ACPI_NUM_NS_TYPES] =
     57 {
     58     ACPI_NS_NORMAL,                     /* 00 Any              */
     59     ACPI_NS_NORMAL,                     /* 01 Number           */
     60     ACPI_NS_NORMAL,                     /* 02 String           */
     61     ACPI_NS_NORMAL,                     /* 03 Buffer           */
     62     ACPI_NS_NORMAL,                     /* 04 Package          */
     63     ACPI_NS_NORMAL,                     /* 05 FieldUnit        */
     64     ACPI_NS_NEWSCOPE,                   /* 06 Device           */
     65     ACPI_NS_NORMAL,                     /* 07 Event            */
     66     ACPI_NS_NEWSCOPE,                   /* 08 Method           */
     67     ACPI_NS_NORMAL,                     /* 09 Mutex            */
     68     ACPI_NS_NORMAL,                     /* 10 Region           */
     69     ACPI_NS_NEWSCOPE,                   /* 11 Power            */
     70     ACPI_NS_NEWSCOPE,                   /* 12 Processor        */
     71     ACPI_NS_NEWSCOPE,                   /* 13 Thermal          */
     72     ACPI_NS_NORMAL,                     /* 14 BufferField      */
     73     ACPI_NS_NORMAL,                     /* 15 DdbHandle        */
     74     ACPI_NS_NORMAL,                     /* 16 Debug Object     */
     75     ACPI_NS_NORMAL,                     /* 17 DefField         */
     76     ACPI_NS_NORMAL,                     /* 18 BankField        */
     77     ACPI_NS_NORMAL,                     /* 19 IndexField       */
     78     ACPI_NS_NORMAL,                     /* 20 Reference        */
     79     ACPI_NS_NORMAL,                     /* 21 Alias            */
     80     ACPI_NS_NORMAL,                     /* 22 MethodAlias      */
     81     ACPI_NS_NORMAL,                     /* 23 Notify           */
     82     ACPI_NS_NORMAL,                     /* 24 Address Handler  */
     83     ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL,   /* 25 Resource Desc    */
     84     ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL,   /* 26 Resource Field   */
     85     ACPI_NS_NEWSCOPE,                   /* 27 Scope            */
     86     ACPI_NS_NORMAL,                     /* 28 Extra            */
     87     ACPI_NS_NORMAL,                     /* 29 Data             */
     88     ACPI_NS_NORMAL                      /* 30 Invalid          */
     89 };
     90 
     91 
     92 /*******************************************************************************
     93  *
     94  * FUNCTION:    AcpiUtGetRegionName
     95  *
     96  * PARAMETERS:  Space ID            - ID for the region
     97  *
     98  * RETURN:      Decoded region SpaceId name
     99  *
    100  * DESCRIPTION: Translate a Space ID into a name string (Debug only)
    101  *
    102  ******************************************************************************/
    103 
    104 /* Region type decoding */
    105 
    106 const char        *AcpiGbl_RegionTypes[ACPI_NUM_PREDEFINED_REGIONS] =
    107 {
    108     "SystemMemory",     /* 0x00 */
    109     "SystemIO",         /* 0x01 */
    110     "PCI_Config",       /* 0x02 */
    111     "EmbeddedControl",  /* 0x03 */
    112     "SMBus",            /* 0x04 */
    113     "SystemCMOS",       /* 0x05 */
    114     "PCIBARTarget",     /* 0x06 */
    115     "IPMI",             /* 0x07 */
    116     "GeneralPurposeIo", /* 0x08 */
    117     "GenericSerialBus", /* 0x09 */
    118     "PCC"               /* 0x0A */
    119 };
    120 
    121 
    122 char *
    123 AcpiUtGetRegionName (
    124     UINT8                   SpaceId)
    125 {
    126 
    127     if (SpaceId >= ACPI_USER_REGION_BEGIN)
    128     {
    129         return ("UserDefinedRegion");
    130     }
    131     else if (SpaceId == ACPI_ADR_SPACE_DATA_TABLE)
    132     {
    133         return ("DataTable");
    134     }
    135     else if (SpaceId == ACPI_ADR_SPACE_FIXED_HARDWARE)
    136     {
    137         return ("FunctionalFixedHW");
    138     }
    139     else if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
    140     {
    141         return ("InvalidSpaceId");
    142     }
    143 
    144     return (ACPI_CAST_PTR (char, AcpiGbl_RegionTypes[SpaceId]));
    145 }
    146 
    147 
    148 /*******************************************************************************
    149  *
    150  * FUNCTION:    AcpiUtGetEventName
    151  *
    152  * PARAMETERS:  EventId             - Fixed event ID
    153  *
    154  * RETURN:      Decoded event ID name
    155  *
    156  * DESCRIPTION: Translate a Event ID into a name string (Debug only)
    157  *
    158  ******************************************************************************/
    159 
    160 /* Event type decoding */
    161 
    162 static const char        *AcpiGbl_EventTypes[ACPI_NUM_FIXED_EVENTS] =
    163 {
    164     "PM_Timer",
    165     "GlobalLock",
    166     "PowerButton",
    167     "SleepButton",
    168     "RealTimeClock",
    169 };
    170 
    171 
    172 char *
    173 AcpiUtGetEventName (
    174     UINT32                  EventId)
    175 {
    176 
    177     if (EventId > ACPI_EVENT_MAX)
    178     {
    179         return ("InvalidEventID");
    180     }
    181 
    182     return (ACPI_CAST_PTR (char, AcpiGbl_EventTypes[EventId]));
    183 }
    184 
    185 
    186 /*******************************************************************************
    187  *
    188  * FUNCTION:    AcpiUtGetTypeName
    189  *
    190  * PARAMETERS:  Type                - An ACPI object type
    191  *
    192  * RETURN:      Decoded ACPI object type name
    193  *
    194  * DESCRIPTION: Translate a Type ID into a name string (Debug only)
    195  *
    196  ******************************************************************************/
    197 
    198 /*
    199  * Elements of AcpiGbl_NsTypeNames below must match
    200  * one-to-one with values of ACPI_OBJECT_TYPE
    201  *
    202  * The type ACPI_TYPE_ANY (Untyped) is used as a "don't care" when searching;
    203  * when stored in a table it really means that we have thus far seen no
    204  * evidence to indicate what type is actually going to be stored for this entry.
    205  */
    206 static const char           AcpiGbl_BadType[] = "UNDEFINED";
    207 
    208 /* Printable names of the ACPI object types */
    209 
    210 static const char           *AcpiGbl_NsTypeNames[] =
    211 {
    212     /* 00 */ "Untyped",
    213     /* 01 */ "Integer",
    214     /* 02 */ "String",
    215     /* 03 */ "Buffer",
    216     /* 04 */ "Package",
    217     /* 05 */ "FieldUnit",
    218     /* 06 */ "Device",
    219     /* 07 */ "Event",
    220     /* 08 */ "Method",
    221     /* 09 */ "Mutex",
    222     /* 10 */ "Region",
    223     /* 11 */ "Power",
    224     /* 12 */ "Processor",
    225     /* 13 */ "Thermal",
    226     /* 14 */ "BufferField",
    227     /* 15 */ "DdbHandle",
    228     /* 16 */ "DebugObject",
    229     /* 17 */ "RegionField",
    230     /* 18 */ "BankField",
    231     /* 19 */ "IndexField",
    232     /* 20 */ "Reference",
    233     /* 21 */ "Alias",
    234     /* 22 */ "MethodAlias",
    235     /* 23 */ "Notify",
    236     /* 24 */ "AddrHandler",
    237     /* 25 */ "ResourceDesc",
    238     /* 26 */ "ResourceFld",
    239     /* 27 */ "Scope",
    240     /* 28 */ "Extra",
    241     /* 29 */ "Data",
    242     /* 30 */ "Invalid"
    243 };
    244 
    245 
    246 char *
    247 AcpiUtGetTypeName (
    248     ACPI_OBJECT_TYPE        Type)
    249 {
    250 
    251     if (Type > ACPI_TYPE_INVALID)
    252     {
    253         return (ACPI_CAST_PTR (char, AcpiGbl_BadType));
    254     }
    255 
    256     return (ACPI_CAST_PTR (char, AcpiGbl_NsTypeNames[Type]));
    257 }
    258 
    259 
    260 char *
    261 AcpiUtGetObjectTypeName (
    262     ACPI_OPERAND_OBJECT     *ObjDesc)
    263 {
    264 
    265     if (!ObjDesc)
    266     {
    267         return ("[NULL Object Descriptor]");
    268     }
    269 
    270     return (AcpiUtGetTypeName (ObjDesc->Common.Type));
    271 }
    272 
    273 
    274 /*******************************************************************************
    275  *
    276  * FUNCTION:    AcpiUtGetNodeName
    277  *
    278  * PARAMETERS:  Object               - A namespace node
    279  *
    280  * RETURN:      ASCII name of the node
    281  *
    282  * DESCRIPTION: Validate the node and return the node's ACPI name.
    283  *
    284  ******************************************************************************/
    285 
    286 char *
    287 AcpiUtGetNodeName (
    288     void                    *Object)
    289 {
    290     ACPI_NAMESPACE_NODE     *Node = (ACPI_NAMESPACE_NODE *) Object;
    291 
    292 
    293     /* Must return a string of exactly 4 characters == ACPI_NAME_SIZE */
    294 
    295     if (!Object)
    296     {
    297         return ("NULL");
    298     }
    299 
    300     /* Check for Root node */
    301 
    302     if ((Object == ACPI_ROOT_OBJECT) ||
    303         (Object == AcpiGbl_RootNode))
    304     {
    305         return ("\"\\\" ");
    306     }
    307 
    308     /* Descriptor must be a namespace node */
    309 
    310     if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
    311     {
    312         return ("####");
    313     }
    314 
    315     /*
    316      * Ensure name is valid. The name was validated/repaired when the node
    317      * was created, but make sure it has not been corrupted.
    318      */
    319     AcpiUtRepairName (Node->Name.Ascii);
    320 
    321     /* Return the name */
    322 
    323     return (Node->Name.Ascii);
    324 }
    325 
    326 
    327 /*******************************************************************************
    328  *
    329  * FUNCTION:    AcpiUtGetDescriptorName
    330  *
    331  * PARAMETERS:  Object               - An ACPI object
    332  *
    333  * RETURN:      Decoded name of the descriptor type
    334  *
    335  * DESCRIPTION: Validate object and return the descriptor type
    336  *
    337  ******************************************************************************/
    338 
    339 /* Printable names of object descriptor types */
    340 
    341 static const char           *AcpiGbl_DescTypeNames[] =
    342 {
    343     /* 00 */ "Not a Descriptor",
    344     /* 01 */ "Cached",
    345     /* 02 */ "State-Generic",
    346     /* 03 */ "State-Update",
    347     /* 04 */ "State-Package",
    348     /* 05 */ "State-Control",
    349     /* 06 */ "State-RootParseScope",
    350     /* 07 */ "State-ParseScope",
    351     /* 08 */ "State-WalkScope",
    352     /* 09 */ "State-Result",
    353     /* 10 */ "State-Notify",
    354     /* 11 */ "State-Thread",
    355     /* 12 */ "Walk",
    356     /* 13 */ "Parser",
    357     /* 14 */ "Operand",
    358     /* 15 */ "Node"
    359 };
    360 
    361 
    362 char *
    363 AcpiUtGetDescriptorName (
    364     void                    *Object)
    365 {
    366 
    367     if (!Object)
    368     {
    369         return ("NULL OBJECT");
    370     }
    371 
    372     if (ACPI_GET_DESCRIPTOR_TYPE (Object) > ACPI_DESC_TYPE_MAX)
    373     {
    374         return ("Not a Descriptor");
    375     }
    376 
    377     return (ACPI_CAST_PTR (char,
    378         AcpiGbl_DescTypeNames[ACPI_GET_DESCRIPTOR_TYPE (Object)]));
    379 
    380 }
    381 
    382 
    383 /*******************************************************************************
    384  *
    385  * FUNCTION:    AcpiUtGetReferenceName
    386  *
    387  * PARAMETERS:  Object               - An ACPI reference object
    388  *
    389  * RETURN:      Decoded name of the type of reference
    390  *
    391  * DESCRIPTION: Decode a reference object sub-type to a string.
    392  *
    393  ******************************************************************************/
    394 
    395 /* Printable names of reference object sub-types */
    396 
    397 static const char           *AcpiGbl_RefClassNames[] =
    398 {
    399     /* 00 */ "Local",
    400     /* 01 */ "Argument",
    401     /* 02 */ "RefOf",
    402     /* 03 */ "Index",
    403     /* 04 */ "DdbHandle",
    404     /* 05 */ "Named Object",
    405     /* 06 */ "Debug"
    406 };
    407 
    408 const char *
    409 AcpiUtGetReferenceName (
    410     ACPI_OPERAND_OBJECT     *Object)
    411 {
    412 
    413     if (!Object)
    414     {
    415         return ("NULL Object");
    416     }
    417 
    418     if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
    419     {
    420         return ("Not an Operand object");
    421     }
    422 
    423     if (Object->Common.Type != ACPI_TYPE_LOCAL_REFERENCE)
    424     {
    425         return ("Not a Reference object");
    426     }
    427 
    428     if (Object->Reference.Class > ACPI_REFCLASS_MAX)
    429     {
    430         return ("Unknown Reference class");
    431     }
    432 
    433     return (AcpiGbl_RefClassNames[Object->Reference.Class]);
    434 }
    435 
    436 
    437 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
    438 /*
    439  * Strings and procedures used for debug only
    440  */
    441 
    442 /*******************************************************************************
    443  *
    444  * FUNCTION:    AcpiUtGetMutexName
    445  *
    446  * PARAMETERS:  MutexId         - The predefined ID for this mutex.
    447  *
    448  * RETURN:      Decoded name of the internal mutex
    449  *
    450  * DESCRIPTION: Translate a mutex ID into a name string (Debug only)
    451  *
    452  ******************************************************************************/
    453 
    454 /* Names for internal mutex objects, used for debug output */
    455 
    456 static char                 *AcpiGbl_MutexNames[ACPI_NUM_MUTEX] =
    457 {
    458     "ACPI_MTX_Interpreter",
    459     "ACPI_MTX_Namespace",
    460     "ACPI_MTX_Tables",
    461     "ACPI_MTX_Events",
    462     "ACPI_MTX_Caches",
    463     "ACPI_MTX_Memory",
    464     "ACPI_MTX_CommandComplete",
    465     "ACPI_MTX_CommandReady"
    466 };
    467 
    468 char *
    469 AcpiUtGetMutexName (
    470     UINT32                  MutexId)
    471 {
    472 
    473     if (MutexId > ACPI_MAX_MUTEX)
    474     {
    475         return ("Invalid Mutex ID");
    476     }
    477 
    478     return (AcpiGbl_MutexNames[MutexId]);
    479 }
    480 
    481 
    482 /*******************************************************************************
    483  *
    484  * FUNCTION:    AcpiUtGetNotifyName
    485  *
    486  * PARAMETERS:  NotifyValue     - Value from the Notify() request
    487  *
    488  * RETURN:      Decoded name for the notify value
    489  *
    490  * DESCRIPTION: Translate a Notify Value to a notify namestring.
    491  *
    492  ******************************************************************************/
    493 
    494 /* Names for Notify() values, used for debug output */
    495 
    496 static const char           *AcpiGbl_GenericNotify[ACPI_NOTIFY_MAX + 1] =
    497 {
    498     /* 00 */ "Bus Check",
    499     /* 01 */ "Device Check",
    500     /* 02 */ "Device Wake",
    501     /* 03 */ "Eject Request",
    502     /* 04 */ "Device Check Light",
    503     /* 05 */ "Frequency Mismatch",
    504     /* 06 */ "Bus Mode Mismatch",
    505     /* 07 */ "Power Fault",
    506     /* 08 */ "Capabilities Check",
    507     /* 09 */ "Device PLD Check",
    508     /* 0A */ "Reserved",
    509     /* 0B */ "System Locality Update",
    510     /* 0C */ "Shutdown Request",
    511     /* 0D */ "System Resource Affinity Update"
    512 };
    513 
    514 static const char           *AcpiGbl_DeviceNotify[4] =
    515 {
    516     /* 80 */ "Status Change",
    517     /* 81 */ "Information Change",
    518     /* 82 */ "Device-Specific Change",
    519     /* 83 */ "Device-Specific Change"
    520 };
    521 
    522 static const char           *AcpiGbl_ProcessorNotify[4] =
    523 {
    524     /* 80 */ "Performance Capability Change",
    525     /* 81 */ "C-State Change",
    526     /* 82 */ "Throttling Capability Change",
    527     /* 83 */ "Device-Specific Change"
    528 };
    529 
    530 static const char           *AcpiGbl_ThermalNotify[4] =
    531 {
    532     /* 80 */ "Thermal Status Change",
    533     /* 81 */ "Thermal Trip Point Change",
    534     /* 82 */ "Thermal Device List Change",
    535     /* 83 */ "Thermal Relationship Change"
    536 };
    537 
    538 
    539 const char *
    540 AcpiUtGetNotifyName (
    541     UINT32                  NotifyValue,
    542     ACPI_OBJECT_TYPE        Type)
    543 {
    544 
    545     /* 00 - 0D are common to all object types */
    546 
    547     if (NotifyValue <= ACPI_NOTIFY_MAX)
    548     {
    549         return (AcpiGbl_GenericNotify[NotifyValue]);
    550     }
    551 
    552     /* 0D - 7F are reserved */
    553 
    554     if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
    555     {
    556         return ("Reserved");
    557     }
    558 
    559     /* 80 - 83 are per-object-type */
    560 
    561     if (NotifyValue <= 0x83)
    562     {
    563         switch (Type)
    564         {
    565         case ACPI_TYPE_ANY:
    566         case ACPI_TYPE_DEVICE:
    567             return (AcpiGbl_DeviceNotify [NotifyValue - 0x80]);
    568 
    569         case ACPI_TYPE_PROCESSOR:
    570             return (AcpiGbl_ProcessorNotify [NotifyValue - 0x80]);
    571 
    572         case ACPI_TYPE_THERMAL:
    573             return (AcpiGbl_ThermalNotify [NotifyValue - 0x80]);
    574 
    575         default:
    576             return ("Target object type does not support notifies");
    577         }
    578     }
    579 
    580     /* 84 - BF are device-specific */
    581 
    582     if (NotifyValue <= ACPI_MAX_DEVICE_SPECIFIC_NOTIFY)
    583     {
    584         return ("Device-Specific");
    585     }
    586 
    587     /* C0 and above are hardware-specific */
    588 
    589     return ("Hardware-Specific");
    590 }
    591 #endif
    592 
    593 
    594 /*******************************************************************************
    595  *
    596  * FUNCTION:    AcpiUtValidObjectType
    597  *
    598  * PARAMETERS:  Type            - Object type to be validated
    599  *
    600  * RETURN:      TRUE if valid object type, FALSE otherwise
    601  *
    602  * DESCRIPTION: Validate an object type
    603  *
    604  ******************************************************************************/
    605 
    606 BOOLEAN
    607 AcpiUtValidObjectType (
    608     ACPI_OBJECT_TYPE        Type)
    609 {
    610 
    611     if (Type > ACPI_TYPE_LOCAL_MAX)
    612     {
    613         /* Note: Assumes all TYPEs are contiguous (external/local) */
    614 
    615         return (FALSE);
    616     }
    617 
    618     return (TRUE);
    619 }
    620