Home | History | Annotate | Line # | Download | only in resources
rsdump.c revision 1.3
      1 /*******************************************************************************
      2  *
      3  * Module Name: rsdump - Functions to display the resource structures.
      4  *
      5  ******************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2011, 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 AcpiRsDumpDwordList (
     95     UINT8                   Length,
     96     UINT32                  *Data);
     97 
     98 static void
     99 AcpiRsDumpShortByteList (
    100     UINT8                  Length,
    101     UINT8                  *Data);
    102 
    103 static void
    104 AcpiRsDumpResourceSource (
    105     ACPI_RESOURCE_SOURCE    *ResourceSource);
    106 
    107 static void
    108 AcpiRsDumpAddressCommon (
    109     ACPI_RESOURCE_DATA      *Resource);
    110 
    111 static void
    112 AcpiRsDumpDescriptor (
    113     void                    *Resource,
    114     ACPI_RSDUMP_INFO *Table);
    115 
    116 
    117 #define ACPI_RSD_OFFSET(f)          (UINT8) ACPI_OFFSET (ACPI_RESOURCE_DATA,f)
    118 #define ACPI_PRT_OFFSET(f)          (UINT8) ACPI_OFFSET (ACPI_PCI_ROUTING_TABLE,f)
    119 #define ACPI_RSD_TABLE_SIZE(name)   (sizeof(name) / sizeof (ACPI_RSDUMP_INFO))
    120 
    121 
    122 /*******************************************************************************
    123  *
    124  * Resource Descriptor info tables
    125  *
    126  * Note: The first table entry must be a Title or Literal and must contain
    127  * the table length (number of table entries)
    128  *
    129  ******************************************************************************/
    130 
    131 ACPI_RSDUMP_INFO        AcpiRsDumpIrq[7] =
    132 {
    133     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpIrq),                "IRQ",                      NULL},
    134     {ACPI_RSD_UINT8 ,   ACPI_RSD_OFFSET (Irq.DescriptorLength),             "Descriptor Length",        NULL},
    135     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Irq.Triggering),                   "Triggering",               AcpiGbl_HeDecode},
    136     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Irq.Polarity),                     "Polarity",                 AcpiGbl_LlDecode},
    137     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Irq.Sharable),                     "Sharing",                  AcpiGbl_ShrDecode},
    138     {ACPI_RSD_UINT8 ,   ACPI_RSD_OFFSET (Irq.InterruptCount),               "Interrupt Count",          NULL},
    139     {ACPI_RSD_SHORTLIST,ACPI_RSD_OFFSET (Irq.Interrupts[0]),                "Interrupt List",           NULL}
    140 };
    141 
    142 ACPI_RSDUMP_INFO        AcpiRsDumpDma[6] =
    143 {
    144     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpDma),                "DMA",                      NULL},
    145     {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Dma.Type),                         "Speed",                    AcpiGbl_TypDecode},
    146     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Dma.BusMaster),                    "Mastering",                AcpiGbl_BmDecode},
    147     {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Dma.Transfer),                     "Transfer Type",            AcpiGbl_SizDecode},
    148     {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Dma.ChannelCount),                 "Channel Count",            NULL},
    149     {ACPI_RSD_SHORTLIST,ACPI_RSD_OFFSET (Dma.Channels[0]),                  "Channel List",             NULL}
    150 };
    151 
    152 ACPI_RSDUMP_INFO        AcpiRsDumpStartDpf[4] =
    153 {
    154     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpStartDpf),           "Start-Dependent-Functions",NULL},
    155     {ACPI_RSD_UINT8 ,   ACPI_RSD_OFFSET (StartDpf.DescriptorLength),        "Descriptor Length",        NULL},
    156     {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (StartDpf.CompatibilityPriority),   "Compatibility Priority",   AcpiGbl_ConfigDecode},
    157     {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (StartDpf.PerformanceRobustness),   "Performance/Robustness",   AcpiGbl_ConfigDecode}
    158 };
    159 
    160 ACPI_RSDUMP_INFO        AcpiRsDumpEndDpf[1] =
    161 {
    162     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpEndDpf),             "End-Dependent-Functions",  NULL}
    163 };
    164 
    165 ACPI_RSDUMP_INFO        AcpiRsDumpIo[6] =
    166 {
    167     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpIo),                 "I/O",                      NULL},
    168     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Io.IoDecode),                      "Address Decoding",         AcpiGbl_IoDecode},
    169     {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Io.Minimum),                       "Address Minimum",          NULL},
    170     {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Io.Maximum),                       "Address Maximum",          NULL},
    171     {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Io.Alignment),                     "Alignment",                NULL},
    172     {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (Io.AddressLength),                 "Address Length",           NULL}
    173 };
    174 
    175 ACPI_RSDUMP_INFO        AcpiRsDumpFixedIo[3] =
    176 {
    177     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpFixedIo),            "Fixed I/O",                NULL},
    178     {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (FixedIo.Address),                  "Address",                  NULL},
    179     {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (FixedIo.AddressLength),            "Address Length",           NULL}
    180 };
    181 
    182 ACPI_RSDUMP_INFO        AcpiRsDumpVendor[3] =
    183 {
    184     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpVendor),             "Vendor Specific",          NULL},
    185     {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Vendor.ByteLength),                "Length",                   NULL},
    186     {ACPI_RSD_LONGLIST, ACPI_RSD_OFFSET (Vendor.ByteData[0]),               "Vendor Data",              NULL}
    187 };
    188 
    189 ACPI_RSDUMP_INFO        AcpiRsDumpEndTag[1] =
    190 {
    191     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpEndTag),             "EndTag",                   NULL}
    192 };
    193 
    194 ACPI_RSDUMP_INFO        AcpiRsDumpMemory24[6] =
    195 {
    196     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpMemory24),           "24-Bit Memory Range",      NULL},
    197     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Memory24.WriteProtect),            "Write Protect",            AcpiGbl_RwDecode},
    198     {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Memory24.Minimum),                 "Address Minimum",          NULL},
    199     {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Memory24.Maximum),                 "Address Maximum",          NULL},
    200     {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Memory24.Alignment),               "Alignment",                NULL},
    201     {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Memory24.AddressLength),           "Address Length",           NULL}
    202 };
    203 
    204 ACPI_RSDUMP_INFO        AcpiRsDumpMemory32[6] =
    205 {
    206     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpMemory32),           "32-Bit Memory Range",      NULL},
    207     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Memory32.WriteProtect),            "Write Protect",            AcpiGbl_RwDecode},
    208     {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Memory32.Minimum),                 "Address Minimum",          NULL},
    209     {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Memory32.Maximum),                 "Address Maximum",          NULL},
    210     {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Memory32.Alignment),               "Alignment",                NULL},
    211     {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Memory32.AddressLength),           "Address Length",           NULL}
    212 };
    213 
    214 ACPI_RSDUMP_INFO        AcpiRsDumpFixedMemory32[4] =
    215 {
    216     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpFixedMemory32),      "32-Bit Fixed Memory Range",NULL},
    217     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (FixedMemory32.WriteProtect),       "Write Protect",            AcpiGbl_RwDecode},
    218     {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (FixedMemory32.Address),            "Address",                  NULL},
    219     {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (FixedMemory32.AddressLength),      "Address Length",           NULL}
    220 };
    221 
    222 ACPI_RSDUMP_INFO        AcpiRsDumpAddress16[8] =
    223 {
    224     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress16),          "16-Bit WORD Address Space",NULL},
    225     {ACPI_RSD_ADDRESS,  0,                                                  NULL,                       NULL},
    226     {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.Granularity),            "Granularity",              NULL},
    227     {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.Minimum),                "Address Minimum",          NULL},
    228     {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.Maximum),                "Address Maximum",          NULL},
    229     {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.TranslationOffset),      "Translation Offset",       NULL},
    230     {ACPI_RSD_UINT16,   ACPI_RSD_OFFSET (Address16.AddressLength),          "Address Length",           NULL},
    231     {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (Address16.ResourceSource),         NULL,                       NULL}
    232 };
    233 
    234 ACPI_RSDUMP_INFO        AcpiRsDumpAddress32[8] =
    235 {
    236     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress32),         "32-Bit DWORD Address Space", NULL},
    237     {ACPI_RSD_ADDRESS,  0,                                                  NULL,                       NULL},
    238     {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.Granularity),            "Granularity",              NULL},
    239     {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.Minimum),                "Address Minimum",          NULL},
    240     {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.Maximum),                "Address Maximum",          NULL},
    241     {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.TranslationOffset),      "Translation Offset",       NULL},
    242     {ACPI_RSD_UINT32,   ACPI_RSD_OFFSET (Address32.AddressLength),          "Address Length",           NULL},
    243     {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (Address32.ResourceSource),         NULL,                       NULL}
    244 };
    245 
    246 ACPI_RSDUMP_INFO        AcpiRsDumpAddress64[8] =
    247 {
    248     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress64),          "64-Bit QWORD Address Space", NULL},
    249     {ACPI_RSD_ADDRESS,  0,                                                  NULL,                       NULL},
    250     {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.Granularity),            "Granularity",              NULL},
    251     {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.Minimum),                "Address Minimum",          NULL},
    252     {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.Maximum),                "Address Maximum",          NULL},
    253     {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.TranslationOffset),      "Translation Offset",       NULL},
    254     {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (Address64.AddressLength),          "Address Length",           NULL},
    255     {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (Address64.ResourceSource),         NULL,                       NULL}
    256 };
    257 
    258 ACPI_RSDUMP_INFO        AcpiRsDumpExtAddress64[8] =
    259 {
    260     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpExtAddress64),       "64-Bit Extended Address Space", NULL},
    261     {ACPI_RSD_ADDRESS,  0,                                                  NULL,                       NULL},
    262     {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.Granularity),         "Granularity",              NULL},
    263     {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.Minimum),             "Address Minimum",          NULL},
    264     {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.Maximum),             "Address Maximum",          NULL},
    265     {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.TranslationOffset),   "Translation Offset",       NULL},
    266     {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.AddressLength),       "Address Length",           NULL},
    267     {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (ExtAddress64.TypeSpecific),        "Type-Specific Attribute",  NULL}
    268 };
    269 
    270 ACPI_RSDUMP_INFO        AcpiRsDumpExtIrq[8] =
    271 {
    272     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpExtIrq),             "Extended IRQ",             NULL},
    273     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.ProducerConsumer),     "Type",                     AcpiGbl_ConsumeDecode},
    274     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.Triggering),           "Triggering",               AcpiGbl_HeDecode},
    275     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.Polarity),             "Polarity",                 AcpiGbl_LlDecode},
    276     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.Sharable),             "Sharing",                  AcpiGbl_ShrDecode},
    277     {ACPI_RSD_SOURCE,   ACPI_RSD_OFFSET (ExtendedIrq.ResourceSource),       NULL,                       NULL},
    278     {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (ExtendedIrq.InterruptCount),       "Interrupt Count",          NULL},
    279     {ACPI_RSD_DWORDLIST,ACPI_RSD_OFFSET (ExtendedIrq.Interrupts[0]),        "Interrupt List",           NULL}
    280 };
    281 
    282 ACPI_RSDUMP_INFO        AcpiRsDumpGenericReg[6] =
    283 {
    284     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpGenericReg),         "Generic Register",         NULL},
    285     {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (GenericReg.SpaceId),               "Space ID",                 NULL},
    286     {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (GenericReg.BitWidth),              "Bit Width",                NULL},
    287     {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (GenericReg.BitOffset),             "Bit Offset",               NULL},
    288     {ACPI_RSD_UINT8,    ACPI_RSD_OFFSET (GenericReg.AccessSize),            "Access Size",              NULL},
    289     {ACPI_RSD_UINT64,   ACPI_RSD_OFFSET (GenericReg.Address),               "Address",                  NULL}
    290 };
    291 
    292 
    293 /*
    294  * Tables used for common address descriptor flag fields
    295  */
    296 static ACPI_RSDUMP_INFO AcpiRsDumpGeneralFlags[5] =
    297 {
    298     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpGeneralFlags),       NULL,                       NULL},
    299     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.ProducerConsumer),         "Consumer/Producer",        AcpiGbl_ConsumeDecode},
    300     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Decode),                   "Address Decode",           AcpiGbl_DecDecode},
    301     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.MinAddressFixed),          "Min Relocatability",       AcpiGbl_MinDecode},
    302     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.MaxAddressFixed),          "Max Relocatability",       AcpiGbl_MaxDecode}
    303 };
    304 
    305 static ACPI_RSDUMP_INFO AcpiRsDumpMemoryFlags[5] =
    306 {
    307     {ACPI_RSD_LITERAL,  ACPI_RSD_TABLE_SIZE (AcpiRsDumpMemoryFlags),        "Resource Type",            (const char * const *) "Memory Range"},
    308     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.WriteProtect),    "Write Protect",            AcpiGbl_RwDecode},
    309     {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.Caching),         "Caching",                  AcpiGbl_MemDecode},
    310     {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.RangeType),       "Range Type",               AcpiGbl_MtpDecode},
    311     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.Translation),     "Translation",              AcpiGbl_TtpDecode}
    312 };
    313 
    314 static ACPI_RSDUMP_INFO AcpiRsDumpIoFlags[4] =
    315 {
    316     {ACPI_RSD_LITERAL,  ACPI_RSD_TABLE_SIZE (AcpiRsDumpIoFlags),            "Resource Type",            (const char * const *) "I/O Range"},
    317     {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Address.Info.Io.RangeType),        "Range Type",               AcpiGbl_RngDecode},
    318     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Io.Translation),      "Translation",              AcpiGbl_TtpDecode},
    319     {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Io.TranslationType),  "Translation Type",         AcpiGbl_TrsDecode}
    320 };
    321 
    322 
    323 /*
    324  * Table used to dump _PRT contents
    325  */
    326 static ACPI_RSDUMP_INFO   AcpiRsDumpPrt[5] =
    327 {
    328     {ACPI_RSD_TITLE,    ACPI_RSD_TABLE_SIZE (AcpiRsDumpPrt),                NULL,                       NULL},
    329     {ACPI_RSD_UINT64,   ACPI_PRT_OFFSET (Address),                          "Address",                  NULL},
    330     {ACPI_RSD_UINT32,   ACPI_PRT_OFFSET (Pin),                              "Pin",                      NULL},
    331     {ACPI_RSD_STRING,   ACPI_PRT_OFFSET (Source[0]),                        "Source",                   NULL},
    332     {ACPI_RSD_UINT32,   ACPI_PRT_OFFSET (SourceIndex),                      "Source Index",             NULL}
    333 };
    334 
    335 
    336 /*******************************************************************************
    337  *
    338  * FUNCTION:    AcpiRsDumpDescriptor
    339  *
    340  * PARAMETERS:  Resource
    341  *
    342  * RETURN:      None
    343  *
    344  * DESCRIPTION:
    345  *
    346  ******************************************************************************/
    347 
    348 static void
    349 AcpiRsDumpDescriptor (
    350     void                    *Resource,
    351     ACPI_RSDUMP_INFO        *Table)
    352 {
    353     UINT8                   *Target = NULL;
    354     UINT8                   *PreviousTarget;
    355     const char              *Name;
    356     UINT8                    Count;
    357 
    358 
    359     /* First table entry must contain the table length (# of table entries) */
    360 
    361     Count = Table->Offset;
    362 
    363     while (Count)
    364     {
    365         PreviousTarget = Target;
    366         Target = ACPI_ADD_PTR (UINT8, Resource, Table->Offset);
    367         Name = Table->Name;
    368 
    369         switch (Table->Opcode)
    370         {
    371         case ACPI_RSD_TITLE:
    372             /*
    373              * Optional resource title
    374              */
    375             if (Table->Name)
    376             {
    377                 AcpiOsPrintf ("%s Resource\n", Name);
    378             }
    379             break;
    380 
    381         /* Strings */
    382 
    383         case ACPI_RSD_LITERAL:
    384             AcpiRsOutString (Name, ACPI_CAST_PTR (char, Table->Pointer));
    385             break;
    386 
    387         case ACPI_RSD_STRING:
    388             AcpiRsOutString (Name, ACPI_CAST_PTR (char, Target));
    389             break;
    390 
    391         /* Data items, 8/16/32/64 bit */
    392 
    393         case ACPI_RSD_UINT8:
    394             AcpiRsOutInteger8 (Name, ACPI_GET8 (Target));
    395             break;
    396 
    397         case ACPI_RSD_UINT16:
    398             AcpiRsOutInteger16 (Name, ACPI_GET16 (Target));
    399             break;
    400 
    401         case ACPI_RSD_UINT32:
    402             AcpiRsOutInteger32 (Name, ACPI_GET32 (Target));
    403             break;
    404 
    405         case ACPI_RSD_UINT64:
    406             AcpiRsOutInteger64 (Name, ACPI_GET64 (Target));
    407             break;
    408 
    409         /* Flags: 1-bit and 2-bit flags supported */
    410 
    411         case ACPI_RSD_1BITFLAG:
    412             AcpiRsOutString (Name, ACPI_CAST_PTR (char,
    413                 Table->Pointer [*Target & 0x01]));
    414             break;
    415 
    416         case ACPI_RSD_2BITFLAG:
    417             AcpiRsOutString (Name, ACPI_CAST_PTR (char,
    418                 Table->Pointer [*Target & 0x03]));
    419             break;
    420 
    421         case ACPI_RSD_SHORTLIST:
    422             /*
    423              * Short byte list (single line output) for DMA and IRQ resources
    424              * Note: The list length is obtained from the previous table entry
    425              */
    426             if (PreviousTarget)
    427             {
    428                 AcpiRsOutTitle (Name);
    429                 AcpiRsDumpShortByteList (*PreviousTarget, Target);
    430             }
    431             break;
    432 
    433         case ACPI_RSD_LONGLIST:
    434             /*
    435              * Long byte list for Vendor resource data
    436              * Note: The list length is obtained from the previous table entry
    437              */
    438             if (PreviousTarget)
    439             {
    440                 AcpiRsDumpByteList (ACPI_GET16 (PreviousTarget), Target);
    441             }
    442             break;
    443 
    444         case ACPI_RSD_DWORDLIST:
    445             /*
    446              * Dword list for Extended Interrupt resources
    447              * Note: The list length is obtained from the previous table entry
    448              */
    449             if (PreviousTarget)
    450             {
    451                 AcpiRsDumpDwordList (*PreviousTarget,
    452                     ACPI_CAST_PTR (UINT32, Target));
    453             }
    454             break;
    455 
    456         case ACPI_RSD_ADDRESS:
    457             /*
    458              * Common flags for all Address resources
    459              */
    460             AcpiRsDumpAddressCommon (ACPI_CAST_PTR (ACPI_RESOURCE_DATA, Target));
    461             break;
    462 
    463         case ACPI_RSD_SOURCE:
    464             /*
    465              * Optional ResourceSource for Address resources
    466              */
    467             AcpiRsDumpResourceSource (ACPI_CAST_PTR (ACPI_RESOURCE_SOURCE, Target));
    468             break;
    469 
    470         default:
    471             AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
    472                 Table->Opcode);
    473             return;
    474         }
    475 
    476         Table++;
    477         Count--;
    478     }
    479 }
    480 
    481 
    482 /*******************************************************************************
    483  *
    484  * FUNCTION:    AcpiRsDumpResourceSource
    485  *
    486  * PARAMETERS:  ResourceSource      - Pointer to a Resource Source struct
    487  *
    488  * RETURN:      None
    489  *
    490  * DESCRIPTION: Common routine for dumping the optional ResourceSource and the
    491  *              corresponding ResourceSourceIndex.
    492  *
    493  ******************************************************************************/
    494 
    495 static void
    496 AcpiRsDumpResourceSource (
    497     ACPI_RESOURCE_SOURCE    *ResourceSource)
    498 {
    499     ACPI_FUNCTION_ENTRY ();
    500 
    501 
    502     if (ResourceSource->Index == 0xFF)
    503     {
    504         return;
    505     }
    506 
    507     AcpiRsOutInteger8 ("Resource Source Index",
    508         ResourceSource->Index);
    509 
    510     AcpiRsOutString ("Resource Source",
    511         ResourceSource->StringPtr ?
    512             ResourceSource->StringPtr : "[Not Specified]");
    513 }
    514 
    515 
    516 /*******************************************************************************
    517  *
    518  * FUNCTION:    AcpiRsDumpAddressCommon
    519  *
    520  * PARAMETERS:  Resource        - Pointer to an internal resource descriptor
    521  *
    522  * RETURN:      None
    523  *
    524  * DESCRIPTION: Dump the fields that are common to all Address resource
    525  *              descriptors
    526  *
    527  ******************************************************************************/
    528 
    529 static void
    530 AcpiRsDumpAddressCommon (
    531     ACPI_RESOURCE_DATA      *Resource)
    532 {
    533     ACPI_FUNCTION_ENTRY ();
    534 
    535 
    536    /* Decode the type-specific flags */
    537 
    538     switch (Resource->Address.ResourceType)
    539     {
    540     case ACPI_MEMORY_RANGE:
    541 
    542         AcpiRsDumpDescriptor (Resource, AcpiRsDumpMemoryFlags);
    543         break;
    544 
    545     case ACPI_IO_RANGE:
    546 
    547         AcpiRsDumpDescriptor (Resource, AcpiRsDumpIoFlags);
    548         break;
    549 
    550     case ACPI_BUS_NUMBER_RANGE:
    551 
    552         AcpiRsOutString ("Resource Type", "Bus Number Range");
    553         break;
    554 
    555     default:
    556 
    557         AcpiRsOutInteger8 ("Resource Type",
    558             (UINT8) Resource->Address.ResourceType);
    559         break;
    560     }
    561 
    562     /* Decode the general flags */
    563 
    564     AcpiRsDumpDescriptor (Resource, AcpiRsDumpGeneralFlags);
    565 }
    566 
    567 
    568 /*******************************************************************************
    569  *
    570  * FUNCTION:    AcpiRsDumpResourceList
    571  *
    572  * PARAMETERS:  ResourceList        - Pointer to a resource descriptor list
    573  *
    574  * RETURN:      None
    575  *
    576  * DESCRIPTION: Dispatches the structure to the correct dump routine.
    577  *
    578  ******************************************************************************/
    579 
    580 void
    581 AcpiRsDumpResourceList (
    582     ACPI_RESOURCE           *ResourceList)
    583 {
    584     UINT32                  Count = 0;
    585     UINT32                  Type;
    586 
    587 
    588     ACPI_FUNCTION_ENTRY ();
    589 
    590 
    591     if (!(AcpiDbgLevel & ACPI_LV_RESOURCES) || !( _COMPONENT & AcpiDbgLayer))
    592     {
    593         return;
    594     }
    595 
    596     /* Walk list and dump all resource descriptors (END_TAG terminates) */
    597 
    598     do
    599     {
    600         AcpiOsPrintf ("\n[%02X] ", Count);
    601         Count++;
    602 
    603         /* Validate Type before dispatch */
    604 
    605         Type = ResourceList->Type;
    606         if (Type > ACPI_RESOURCE_TYPE_MAX)
    607         {
    608             AcpiOsPrintf (
    609                 "Invalid descriptor type (%X) in resource list\n",
    610                 ResourceList->Type);
    611             return;
    612         }
    613 
    614         /* Dump the resource descriptor */
    615 
    616         AcpiRsDumpDescriptor (&ResourceList->Data,
    617             AcpiGbl_DumpResourceDispatch[Type]);
    618 
    619         /* Point to the next resource structure */
    620 
    621         ResourceList = ACPI_ADD_PTR (ACPI_RESOURCE, ResourceList,
    622                             ResourceList->Length);
    623 
    624         /* Exit when END_TAG descriptor is reached */
    625 
    626     } while (Type != ACPI_RESOURCE_TYPE_END_TAG);
    627 }
    628 
    629 
    630 /*******************************************************************************
    631  *
    632  * FUNCTION:    AcpiRsDumpIrqList
    633  *
    634  * PARAMETERS:  RouteTable      - Pointer to the routing table to dump.
    635  *
    636  * RETURN:      None
    637  *
    638  * DESCRIPTION: Print IRQ routing table
    639  *
    640  ******************************************************************************/
    641 
    642 void
    643 AcpiRsDumpIrqList (
    644     UINT8                   *RouteTable)
    645 {
    646     ACPI_PCI_ROUTING_TABLE  *PrtElement;
    647     UINT8                   Count;
    648 
    649 
    650     ACPI_FUNCTION_ENTRY ();
    651 
    652 
    653     if (!(AcpiDbgLevel & ACPI_LV_RESOURCES) || !( _COMPONENT & AcpiDbgLayer))
    654     {
    655         return;
    656     }
    657 
    658     PrtElement = ACPI_CAST_PTR (ACPI_PCI_ROUTING_TABLE, RouteTable);
    659 
    660     /* Dump all table elements, Exit on zero length element */
    661 
    662     for (Count = 0; PrtElement->Length; Count++)
    663     {
    664         AcpiOsPrintf ("\n[%02X] PCI IRQ Routing Table Package\n", Count);
    665         AcpiRsDumpDescriptor (PrtElement, AcpiRsDumpPrt);
    666 
    667         PrtElement = ACPI_ADD_PTR (ACPI_PCI_ROUTING_TABLE,
    668                         PrtElement, PrtElement->Length);
    669     }
    670 }
    671 
    672 
    673 /*******************************************************************************
    674  *
    675  * FUNCTION:    AcpiRsOut*
    676  *
    677  * PARAMETERS:  Title       - Name of the resource field
    678  *              Value       - Value of the resource field
    679  *
    680  * RETURN:      None
    681  *
    682  * DESCRIPTION: Miscellaneous helper functions to consistently format the
    683  *              output of the resource dump routines
    684  *
    685  ******************************************************************************/
    686 
    687 static void
    688 AcpiRsOutString (
    689     const char              *Title,
    690     const char              *Value)
    691 {
    692     AcpiOsPrintf ("%27s : %s", Title, Value);
    693     if (!*Value)
    694     {
    695         AcpiOsPrintf ("[NULL NAMESTRING]");
    696     }
    697     AcpiOsPrintf ("\n");
    698 }
    699 
    700 static void
    701 AcpiRsOutInteger8 (
    702     const char              *Title,
    703     UINT8                   Value)
    704 {
    705     AcpiOsPrintf ("%27s : %2.2X\n", Title, Value);
    706 }
    707 
    708 static void
    709 AcpiRsOutInteger16 (
    710     const char              *Title,
    711     UINT16                  Value)
    712 {
    713     AcpiOsPrintf ("%27s : %4.4X\n", Title, Value);
    714 }
    715 
    716 static void
    717 AcpiRsOutInteger32 (
    718     const char              *Title,
    719     UINT32                  Value)
    720 {
    721     AcpiOsPrintf ("%27s : %8.8X\n", Title, Value);
    722 }
    723 
    724 static void
    725 AcpiRsOutInteger64 (
    726     const char              *Title,
    727     UINT64                  Value)
    728 {
    729     AcpiOsPrintf ("%27s : %8.8X%8.8X\n", Title,
    730         ACPI_FORMAT_UINT64 (Value));
    731 }
    732 
    733 static void
    734 AcpiRsOutTitle (
    735     const char              *Title)
    736 {
    737     AcpiOsPrintf ("%27s : ", Title);
    738 }
    739 
    740 
    741 /*******************************************************************************
    742  *
    743  * FUNCTION:    AcpiRsDump*List
    744  *
    745  * PARAMETERS:  Length      - Number of elements in the list
    746  *              Data        - Start of the list
    747  *
    748  * RETURN:      None
    749  *
    750  * DESCRIPTION: Miscellaneous functions to dump lists of raw data
    751  *
    752  ******************************************************************************/
    753 
    754 static void
    755 AcpiRsDumpByteList (
    756     UINT16                  Length,
    757     UINT8                   *Data)
    758 {
    759     UINT8                   i;
    760 
    761 
    762     for (i = 0; i < Length; i++)
    763     {
    764         AcpiOsPrintf ("%25s%2.2X : %2.2X\n",
    765             "Byte", i, Data[i]);
    766     }
    767 }
    768 
    769 static void
    770 AcpiRsDumpShortByteList (
    771     UINT8                  Length,
    772     UINT8                  *Data)
    773 {
    774     UINT8                   i;
    775 
    776 
    777     for (i = 0; i < Length; i++)
    778     {
    779         AcpiOsPrintf ("%X ", Data[i]);
    780     }
    781     AcpiOsPrintf ("\n");
    782 }
    783 
    784 static void
    785 AcpiRsDumpDwordList (
    786     UINT8                   Length,
    787     UINT32                  *Data)
    788 {
    789     UINT8                   i;
    790 
    791 
    792     for (i = 0; i < Length; i++)
    793     {
    794         AcpiOsPrintf ("%25s%2.2X : %8.8X\n",
    795             "Dword", i, Data[i]);
    796     }
    797 }
    798 
    799 #endif
    800 
    801