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