Home | History | Annotate | Line # | Download | only in resources
rsdump.c revision 1.4
      1 /*******************************************************************************
      2  *
      3  * Module Name: rsdump - Functions to display the resource structures.
      4  *
      5  ******************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2013, 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 
     45 #define __RSDUMP_C__
     46 
     47 #include "acpi.h"
     48 #include "accommon.h"
     49 #include "acresrc.h"
     50 
     51 #define _COMPONENT          ACPI_RESOURCES
     52         ACPI_MODULE_NAME    ("rsdump")
     53 
     54 
     55 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
     56 
     57 /* Local prototypes */
     58 
     59 static void
     60 AcpiRsOutString (
     61     const char              *Title,
     62     const char              *Value);
     63 
     64 static void
     65 AcpiRsOutInteger8 (
     66     const char              *Title,
     67     UINT8                   Value);
     68 
     69 static void
     70 AcpiRsOutInteger16 (
     71     const char              *Title,
     72     UINT16                  Value);
     73 
     74 static void
     75 AcpiRsOutInteger32 (
     76     const char              *Title,
     77     UINT32                  Value);
     78 
     79 static void
     80 AcpiRsOutInteger64 (
     81     const char              *Title,
     82     UINT64                  Value);
     83 
     84 static void
     85 AcpiRsOutTitle (
     86     const char              *Title);
     87 
     88 static void
     89 AcpiRsDumpByteList (
     90     UINT16                  Length,
     91     UINT8                   *Data);
     92 
     93 static void
     94 AcpiRsDumpWordList (
     95     UINT16                   Length,
     96     UINT16                   *Data);
     97 
     98 static void
     99 AcpiRsDumpDwordList (
    100     UINT8                   Length,
    101     UINT32                  *Data);
    102 
    103 static void
    104 AcpiRsDumpShortByteList (
    105     UINT8                  Length,
    106     UINT8                  *Data);
    107 
    108 static void
    109 AcpiRsDumpResourceSource (
    110     ACPI_RESOURCE_SOURCE    *ResourceSource);
    111 
    112 static void
    113 AcpiRsDumpAddressCommon (
    114     ACPI_RESOURCE_DATA      *Resource);
    115 
    116 static void
    117 AcpiRsDumpDescriptor (
    118     void                    *Resource,
    119     ACPI_RSDUMP_INFO *Table);
    120 
    121 
    122 /*******************************************************************************
    123  *
    124  * FUNCTION:    AcpiRsDumpDescriptor
    125  *
    126  * PARAMETERS:  Resource            - Buffer containing the resource
    127  *              Table               - Table entry to decode the resource
    128  *
    129  * RETURN:      None
    130  *
    131  * DESCRIPTION: Dump a resource descriptor based on a dump table entry.
    132  *
    133  ******************************************************************************/
    134 
    135 static void
    136 AcpiRsDumpDescriptor (
    137     void                    *Resource,
    138     ACPI_RSDUMP_INFO        *Table)
    139 {
    140     UINT8                   *Target = NULL;
    141     UINT8                   *PreviousTarget;
    142     const char              *Name;
    143     UINT8                    Count;
    144 
    145 
    146     /* First table entry must contain the table length (# of table entries) */
    147 
    148     Count = Table->Offset;
    149 
    150     while (Count)
    151     {
    152         PreviousTarget = Target;
    153         Target = ACPI_ADD_PTR (UINT8, Resource, Table->Offset);
    154         Name = Table->Name;
    155 
    156         switch (Table->Opcode)
    157         {
    158         case ACPI_RSD_TITLE:
    159             /*
    160              * Optional resource title
    161              */
    162             if (Table->Name)
    163             {
    164                 AcpiOsPrintf ("%s Resource\n", Name);
    165             }
    166             break;
    167 
    168         /* Strings */
    169 
    170         case ACPI_RSD_LITERAL:
    171 
    172             AcpiRsOutString (Name, ACPI_CAST_PTR (char, Table->Pointer));
    173             break;
    174 
    175         case ACPI_RSD_STRING:
    176 
    177             AcpiRsOutString (Name, ACPI_CAST_PTR (char, Target));
    178             break;
    179 
    180         /* Data items, 8/16/32/64 bit */
    181 
    182         case ACPI_RSD_UINT8:
    183 
    184             if (Table->Pointer)
    185             {
    186                 AcpiRsOutString (Name, ACPI_CAST_PTR (char,
    187                     Table->Pointer [*Target]));
    188             }
    189             else
    190             {
    191                 AcpiRsOutInteger8 (Name, ACPI_GET8 (Target));
    192             }
    193             break;
    194 
    195         case ACPI_RSD_UINT16:
    196 
    197             AcpiRsOutInteger16 (Name, ACPI_GET16 (Target));
    198             break;
    199 
    200         case ACPI_RSD_UINT32:
    201 
    202             AcpiRsOutInteger32 (Name, ACPI_GET32 (Target));
    203             break;
    204 
    205         case ACPI_RSD_UINT64:
    206 
    207             AcpiRsOutInteger64 (Name, ACPI_GET64 (Target));
    208             break;
    209 
    210         /* Flags: 1-bit and 2-bit flags supported */
    211 
    212         case ACPI_RSD_1BITFLAG:
    213 
    214             AcpiRsOutString (Name, ACPI_CAST_PTR (char,
    215                 Table->Pointer [*Target & 0x01]));
    216             break;
    217 
    218         case ACPI_RSD_2BITFLAG:
    219 
    220             AcpiRsOutString (Name, ACPI_CAST_PTR (char,
    221                 Table->Pointer [*Target & 0x03]));
    222             break;
    223 
    224         case ACPI_RSD_3BITFLAG:
    225 
    226             AcpiRsOutString (Name, ACPI_CAST_PTR (char,
    227                 Table->Pointer [*Target & 0x07]));
    228             break;
    229 
    230         case ACPI_RSD_SHORTLIST:
    231             /*
    232              * Short byte list (single line output) for DMA and IRQ resources
    233              * Note: The list length is obtained from the previous table entry
    234              */
    235             if (PreviousTarget)
    236             {
    237                 AcpiRsOutTitle (Name);
    238                 AcpiRsDumpShortByteList (*PreviousTarget, Target);
    239             }
    240             break;
    241 
    242         case ACPI_RSD_SHORTLISTX:
    243             /*
    244              * Short byte list (single line output) for GPIO vendor data
    245              * Note: The list length is obtained from the previous table entry
    246              */
    247             if (PreviousTarget)
    248             {
    249                 AcpiRsOutTitle (Name);
    250                 AcpiRsDumpShortByteList (*PreviousTarget,
    251                     *(ACPI_CAST_INDIRECT_PTR (UINT8, Target)));
    252             }
    253             break;
    254 
    255         case ACPI_RSD_LONGLIST:
    256             /*
    257              * Long byte list for Vendor resource data
    258              * Note: The list length is obtained from the previous table entry
    259              */
    260             if (PreviousTarget)
    261             {
    262                 AcpiRsDumpByteList (ACPI_GET16 (PreviousTarget), Target);
    263             }
    264             break;
    265 
    266         case ACPI_RSD_DWORDLIST:
    267             /*
    268              * Dword list for Extended Interrupt resources
    269              * Note: The list length is obtained from the previous table entry
    270              */
    271             if (PreviousTarget)
    272             {
    273                 AcpiRsDumpDwordList (*PreviousTarget,
    274                     ACPI_CAST_PTR (UINT32, Target));
    275             }
    276             break;
    277 
    278         case ACPI_RSD_WORDLIST:
    279             /*
    280              * Word list for GPIO Pin Table
    281              * Note: The list length is obtained from the previous table entry
    282              */
    283             if (PreviousTarget)
    284             {
    285                 AcpiRsDumpWordList (*PreviousTarget,
    286                     *(ACPI_CAST_INDIRECT_PTR (UINT16, Target)));
    287             }
    288             break;
    289 
    290         case ACPI_RSD_ADDRESS:
    291             /*
    292              * Common flags for all Address resources
    293              */
    294             AcpiRsDumpAddressCommon (ACPI_CAST_PTR (ACPI_RESOURCE_DATA, Target));
    295             break;
    296 
    297         case ACPI_RSD_SOURCE:
    298             /*
    299              * Optional ResourceSource for Address resources
    300              */
    301             AcpiRsDumpResourceSource (ACPI_CAST_PTR (ACPI_RESOURCE_SOURCE, Target));
    302             break;
    303 
    304         default:
    305 
    306             AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
    307                 Table->Opcode);
    308             return;
    309         }
    310 
    311         Table++;
    312         Count--;
    313     }
    314 }
    315 
    316 
    317 /*******************************************************************************
    318  *
    319  * FUNCTION:    AcpiRsDumpResourceSource
    320  *
    321  * PARAMETERS:  ResourceSource      - Pointer to a Resource Source struct
    322  *
    323  * RETURN:      None
    324  *
    325  * DESCRIPTION: Common routine for dumping the optional ResourceSource and the
    326  *              corresponding ResourceSourceIndex.
    327  *
    328  ******************************************************************************/
    329 
    330 static void
    331 AcpiRsDumpResourceSource (
    332     ACPI_RESOURCE_SOURCE    *ResourceSource)
    333 {
    334     ACPI_FUNCTION_ENTRY ();
    335 
    336 
    337     if (ResourceSource->Index == 0xFF)
    338     {
    339         return;
    340     }
    341 
    342     AcpiRsOutInteger8 ("Resource Source Index",
    343         ResourceSource->Index);
    344 
    345     AcpiRsOutString ("Resource Source",
    346         ResourceSource->StringPtr ?
    347             ResourceSource->StringPtr : "[Not Specified]");
    348 }
    349 
    350 
    351 /*******************************************************************************
    352  *
    353  * FUNCTION:    AcpiRsDumpAddressCommon
    354  *
    355  * PARAMETERS:  Resource        - Pointer to an internal resource descriptor
    356  *
    357  * RETURN:      None
    358  *
    359  * DESCRIPTION: Dump the fields that are common to all Address resource
    360  *              descriptors
    361  *
    362  ******************************************************************************/
    363 
    364 static void
    365 AcpiRsDumpAddressCommon (
    366     ACPI_RESOURCE_DATA      *Resource)
    367 {
    368     ACPI_FUNCTION_ENTRY ();
    369 
    370 
    371    /* Decode the type-specific flags */
    372 
    373     switch (Resource->Address.ResourceType)
    374     {
    375     case ACPI_MEMORY_RANGE:
    376 
    377         AcpiRsDumpDescriptor (Resource, AcpiRsDumpMemoryFlags);
    378         break;
    379 
    380     case ACPI_IO_RANGE:
    381 
    382         AcpiRsDumpDescriptor (Resource, AcpiRsDumpIoFlags);
    383         break;
    384 
    385     case ACPI_BUS_NUMBER_RANGE:
    386 
    387         AcpiRsOutString ("Resource Type", "Bus Number Range");
    388         break;
    389 
    390     default:
    391 
    392         AcpiRsOutInteger8 ("Resource Type",
    393             (UINT8) Resource->Address.ResourceType);
    394         break;
    395     }
    396 
    397     /* Decode the general flags */
    398 
    399     AcpiRsDumpDescriptor (Resource, AcpiRsDumpGeneralFlags);
    400 }
    401 
    402 
    403 /*******************************************************************************
    404  *
    405  * FUNCTION:    AcpiRsDumpResourceList
    406  *
    407  * PARAMETERS:  ResourceList        - Pointer to a resource descriptor list
    408  *
    409  * RETURN:      None
    410  *
    411  * DESCRIPTION: Dispatches the structure to the correct dump routine.
    412  *
    413  ******************************************************************************/
    414 
    415 void
    416 AcpiRsDumpResourceList (
    417     ACPI_RESOURCE           *ResourceList)
    418 {
    419     UINT32                  Count = 0;
    420     UINT32                  Type;
    421 
    422 
    423     ACPI_FUNCTION_ENTRY ();
    424 
    425 
    426     /* Check if debug output enabled */
    427 
    428     if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_RESOURCES, _COMPONENT))
    429     {
    430         return;
    431     }
    432 
    433     /* Walk list and dump all resource descriptors (END_TAG terminates) */
    434 
    435     do
    436     {
    437         AcpiOsPrintf ("\n[%02X] ", Count);
    438         Count++;
    439 
    440         /* Validate Type before dispatch */
    441 
    442         Type = ResourceList->Type;
    443         if (Type > ACPI_RESOURCE_TYPE_MAX)
    444         {
    445             AcpiOsPrintf (
    446                 "Invalid descriptor type (%X) in resource list\n",
    447                 ResourceList->Type);
    448             return;
    449         }
    450 
    451         /* Sanity check the length. It must not be zero, or we loop forever */
    452 
    453         if (!ResourceList->Length)
    454         {
    455             AcpiOsPrintf (
    456                 "Invalid zero length descriptor in resource list\n");
    457             return;
    458         }
    459 
    460         /* Dump the resource descriptor */
    461 
    462         if (Type == ACPI_RESOURCE_TYPE_SERIAL_BUS)
    463         {
    464             AcpiRsDumpDescriptor (&ResourceList->Data,
    465                 AcpiGbl_DumpSerialBusDispatch[ResourceList->Data.CommonSerialBus.Type]);
    466         }
    467         else
    468         {
    469             AcpiRsDumpDescriptor (&ResourceList->Data,
    470                 AcpiGbl_DumpResourceDispatch[Type]);
    471         }
    472 
    473         /* Point to the next resource structure */
    474 
    475         ResourceList = ACPI_NEXT_RESOURCE (ResourceList);
    476 
    477         /* Exit when END_TAG descriptor is reached */
    478 
    479     } while (Type != ACPI_RESOURCE_TYPE_END_TAG);
    480 }
    481 
    482 
    483 /*******************************************************************************
    484  *
    485  * FUNCTION:    AcpiRsDumpIrqList
    486  *
    487  * PARAMETERS:  RouteTable      - Pointer to the routing table to dump.
    488  *
    489  * RETURN:      None
    490  *
    491  * DESCRIPTION: Print IRQ routing table
    492  *
    493  ******************************************************************************/
    494 
    495 void
    496 AcpiRsDumpIrqList (
    497     UINT8                   *RouteTable)
    498 {
    499     ACPI_PCI_ROUTING_TABLE  *PrtElement;
    500     UINT8                   Count;
    501 
    502 
    503     ACPI_FUNCTION_ENTRY ();
    504 
    505 
    506     /* Check if debug output enabled */
    507 
    508     if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_RESOURCES, _COMPONENT))
    509     {
    510         return;
    511     }
    512 
    513     PrtElement = ACPI_CAST_PTR (ACPI_PCI_ROUTING_TABLE, RouteTable);
    514 
    515     /* Dump all table elements, Exit on zero length element */
    516 
    517     for (Count = 0; PrtElement->Length; Count++)
    518     {
    519         AcpiOsPrintf ("\n[%02X] PCI IRQ Routing Table Package\n", Count);
    520         AcpiRsDumpDescriptor (PrtElement, AcpiRsDumpPrt);
    521 
    522         PrtElement = ACPI_ADD_PTR (ACPI_PCI_ROUTING_TABLE,
    523                         PrtElement, PrtElement->Length);
    524     }
    525 }
    526 
    527 
    528 /*******************************************************************************
    529  *
    530  * FUNCTION:    AcpiRsOut*
    531  *
    532  * PARAMETERS:  Title       - Name of the resource field
    533  *              Value       - Value of the resource field
    534  *
    535  * RETURN:      None
    536  *
    537  * DESCRIPTION: Miscellaneous helper functions to consistently format the
    538  *              output of the resource dump routines
    539  *
    540  ******************************************************************************/
    541 
    542 static void
    543 AcpiRsOutString (
    544     const char              *Title,
    545     const char              *Value)
    546 {
    547     AcpiOsPrintf ("%27s : %s", Title, Value);
    548     if (!*Value)
    549     {
    550         AcpiOsPrintf ("[NULL NAMESTRING]");
    551     }
    552     AcpiOsPrintf ("\n");
    553 }
    554 
    555 static void
    556 AcpiRsOutInteger8 (
    557     const char              *Title,
    558     UINT8                   Value)
    559 {
    560     AcpiOsPrintf ("%27s : %2.2X\n", Title, Value);
    561 }
    562 
    563 static void
    564 AcpiRsOutInteger16 (
    565     const char              *Title,
    566     UINT16                  Value)
    567 {
    568     AcpiOsPrintf ("%27s : %4.4X\n", Title, Value);
    569 }
    570 
    571 static void
    572 AcpiRsOutInteger32 (
    573     const char              *Title,
    574     UINT32                  Value)
    575 {
    576     AcpiOsPrintf ("%27s : %8.8X\n", Title, Value);
    577 }
    578 
    579 static void
    580 AcpiRsOutInteger64 (
    581     const char              *Title,
    582     UINT64                  Value)
    583 {
    584     AcpiOsPrintf ("%27s : %8.8X%8.8X\n", Title,
    585         ACPI_FORMAT_UINT64 (Value));
    586 }
    587 
    588 static void
    589 AcpiRsOutTitle (
    590     const char              *Title)
    591 {
    592     AcpiOsPrintf ("%27s : ", Title);
    593 }
    594 
    595 
    596 /*******************************************************************************
    597  *
    598  * FUNCTION:    AcpiRsDump*List
    599  *
    600  * PARAMETERS:  Length      - Number of elements in the list
    601  *              Data        - Start of the list
    602  *
    603  * RETURN:      None
    604  *
    605  * DESCRIPTION: Miscellaneous functions to dump lists of raw data
    606  *
    607  ******************************************************************************/
    608 
    609 static void
    610 AcpiRsDumpByteList (
    611     UINT16                  Length,
    612     UINT8                   *Data)
    613 {
    614     UINT8                   i;
    615 
    616 
    617     for (i = 0; i < Length; i++)
    618     {
    619         AcpiOsPrintf ("%25s%2.2X : %2.2X\n",
    620             "Byte", i, Data[i]);
    621     }
    622 }
    623 
    624 static void
    625 AcpiRsDumpShortByteList (
    626     UINT8                  Length,
    627     UINT8                  *Data)
    628 {
    629     UINT8                   i;
    630 
    631 
    632     for (i = 0; i < Length; i++)
    633     {
    634         AcpiOsPrintf ("%X ", Data[i]);
    635     }
    636     AcpiOsPrintf ("\n");
    637 }
    638 
    639 static void
    640 AcpiRsDumpDwordList (
    641     UINT8                   Length,
    642     UINT32                  *Data)
    643 {
    644     UINT8                   i;
    645 
    646 
    647     for (i = 0; i < Length; i++)
    648     {
    649         AcpiOsPrintf ("%25s%2.2X : %8.8X\n",
    650             "Dword", i, Data[i]);
    651     }
    652 }
    653 
    654 static void
    655 AcpiRsDumpWordList (
    656     UINT16                  Length,
    657     UINT16                  *Data)
    658 {
    659     UINT16                  i;
    660 
    661 
    662     for (i = 0; i < Length; i++)
    663     {
    664         AcpiOsPrintf ("%25s%2.2X : %4.4X\n",
    665             "Word", i, Data[i]);
    666     }
    667 }
    668 
    669 #endif
    670