Home | History | Annotate | Line # | Download | only in disassembler
dmresrcl2.c revision 1.15
      1 /*******************************************************************************
      2  *
      3  * Module Name: dmresrcl2.c - "Large" Resource Descriptor disassembly (#2)
      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 "acdisasm.h"
     47 
     48 #ifdef _KERNEL
     49 #define MpSaveGpioInfo(a, b, c, d, e)
     50 #define MpSaveSerialInfo(a, b, c)
     51 #endif
     52 
     53 #define _COMPONENT          ACPI_CA_DEBUGGER
     54         ACPI_MODULE_NAME    ("dbresrcl2")
     55 
     56 /* Local prototypes */
     57 
     58 static void
     59 AcpiDmCsi2SerialBusDescriptor (
     60     ACPI_OP_WALK_INFO       *Info,
     61     AML_RESOURCE            *Resource,
     62     UINT32                  Length,
     63     UINT32                  Level);
     64 
     65 static void
     66 AcpiDmI2cSerialBusDescriptor (
     67     ACPI_OP_WALK_INFO       *Info,
     68     AML_RESOURCE            *Resource,
     69     UINT32                  Length,
     70     UINT32                  Level);
     71 
     72 static void
     73 AcpiDmSpiSerialBusDescriptor (
     74     ACPI_OP_WALK_INFO       *Info,
     75     AML_RESOURCE            *Resource,
     76     UINT32                  Length,
     77     UINT32                  Level);
     78 
     79 static void
     80 AcpiDmUartSerialBusDescriptor (
     81     ACPI_OP_WALK_INFO       *Info,
     82     AML_RESOURCE            *Resource,
     83     UINT32                  Length,
     84     UINT32                  Level);
     85 
     86 static void
     87 AcpiDmGpioCommon (
     88     ACPI_OP_WALK_INFO       *Info,
     89     AML_RESOURCE            *Resource,
     90     UINT32                  Level);
     91 
     92 static void
     93 AcpiDmDumpRawDataBuffer (
     94     UINT8                   *Buffer,
     95     UINT32                  Length,
     96     UINT32                  Level);
     97 
     98 
     99 /* Dispatch table for the serial bus descriptors */
    100 
    101 static ACPI_RESOURCE_HANDLER        SerialBusResourceDispatch [] =
    102 {
    103     NULL,
    104     AcpiDmI2cSerialBusDescriptor,
    105     AcpiDmSpiSerialBusDescriptor,
    106     AcpiDmUartSerialBusDescriptor,
    107     AcpiDmCsi2SerialBusDescriptor
    108 };
    109 
    110 
    111 /*******************************************************************************
    112  *
    113  * FUNCTION:    AcpiDmDumpRawDataBuffer
    114  *
    115  * PARAMETERS:  Buffer              - Pointer to the data bytes
    116  *              Length              - Length of the descriptor in bytes
    117  *              Level               - Current source code indentation level
    118  *
    119  * RETURN:      None
    120  *
    121  * DESCRIPTION: Dump a data buffer as a RawDataBuffer() object. Used for
    122  *              vendor data bytes.
    123  *
    124  ******************************************************************************/
    125 
    126 static void
    127 AcpiDmDumpRawDataBuffer (
    128     UINT8                   *Buffer,
    129     UINT32                  Length,
    130     UINT32                  Level)
    131 {
    132     UINT32                  Index;
    133     UINT32                  i;
    134     UINT32                  j;
    135 
    136 
    137     if (!Length)
    138     {
    139         return;
    140     }
    141 
    142     AcpiOsPrintf ("RawDataBuffer (0x%.2X)  // Vendor Data", Length);
    143 
    144     AcpiOsPrintf ("\n");
    145     AcpiDmIndent (Level + 1);
    146     AcpiOsPrintf ("{\n");
    147     AcpiDmIndent (Level + 2);
    148 
    149     for (i = 0; i < Length;)
    150     {
    151         for (j = 0; j < 8; j++)
    152         {
    153             Index = i + j;
    154             if (Index >= Length)
    155             {
    156                 goto Finish;
    157             }
    158 
    159             AcpiOsPrintf ("0x%2.2X", Buffer[Index]);
    160             if ((Index + 1) >= Length)
    161             {
    162                 goto Finish;
    163             }
    164 
    165             AcpiOsPrintf (", ");
    166         }
    167 
    168         AcpiOsPrintf ("\n");
    169         AcpiDmIndent (Level + 2);
    170 
    171         i += 8;
    172     }
    173 
    174 Finish:
    175     AcpiOsPrintf ("\n");
    176     AcpiDmIndent (Level + 1);
    177     AcpiOsPrintf ("}");
    178 }
    179 
    180 
    181 /*******************************************************************************
    182  *
    183  * FUNCTION:    AcpiDmGpioCommon
    184  *
    185  * PARAMETERS:  Info                - Extra resource info
    186  *              Resource            - Pointer to the resource descriptor
    187  *              Level               - Current source code indentation level
    188  *
    189  * RETURN:      None
    190  *
    191  * DESCRIPTION: Decode common parts of a GPIO Interrupt descriptor
    192  *
    193  ******************************************************************************/
    194 
    195 static void
    196 AcpiDmGpioCommon (
    197     ACPI_OP_WALK_INFO       *Info,
    198     AML_RESOURCE            *Resource,
    199     UINT32                  Level)
    200 {
    201     UINT16                  *PinList;
    202     UINT8                   *VendorData;
    203     char                    *DeviceName = NULL;
    204     UINT32                  PinCount;
    205     UINT32                  i;
    206 
    207 
    208     /* ResourceSource, ResourceSourceIndex, ResourceType */
    209 
    210     AcpiDmIndent (Level + 1);
    211     if (Resource->Gpio.ResSourceOffset)
    212     {
    213         DeviceName = ACPI_ADD_PTR (char,
    214             Resource, Resource->Gpio.ResSourceOffset);
    215         AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
    216     }
    217 
    218     AcpiOsPrintf (", ");
    219     AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.ResSourceIndex);
    220     AcpiOsPrintf ("%s, ",
    221         AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Resource->Gpio.Flags)]);
    222 
    223     /* Insert a descriptor name */
    224 
    225     AcpiDmDescriptorName ();
    226     AcpiOsPrintf (",");
    227 
    228     /* Dump the vendor data */
    229 
    230     if (Resource->Gpio.VendorOffset)
    231     {
    232         AcpiOsPrintf ("\n");
    233         AcpiDmIndent (Level + 1);
    234         VendorData = ACPI_ADD_PTR (UINT8, Resource,
    235             Resource->Gpio.VendorOffset);
    236 
    237         AcpiDmDumpRawDataBuffer (VendorData,
    238             Resource->Gpio.VendorLength, Level);
    239     }
    240 
    241     AcpiOsPrintf (")\n");
    242 
    243     /* Dump the interrupt list */
    244 
    245     AcpiDmIndent (Level + 1);
    246     AcpiOsPrintf ("{   // Pin list\n");
    247 
    248     PinCount = ((UINT32) (Resource->Gpio.ResSourceOffset -
    249         Resource->Gpio.PinTableOffset)) /
    250         sizeof (UINT16);
    251 
    252     PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
    253         Resource->Gpio.PinTableOffset);
    254 
    255     for (i = 0; i < PinCount; i++)
    256     {
    257         AcpiDmIndent (Level + 2);
    258         AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
    259             ((i + 1) < PinCount) ? "," : "");
    260     }
    261 
    262     AcpiDmIndent (Level + 1);
    263     AcpiOsPrintf ("}\n");
    264 
    265     MpSaveGpioInfo (Info->MappingOp, Resource,
    266         PinCount, PinList, DeviceName);
    267 }
    268 
    269 
    270 /*******************************************************************************
    271  *
    272  * FUNCTION:    AcpiDmGpioIntDescriptor
    273  *
    274  * PARAMETERS:  Info                - Extra resource info
    275  *              Resource            - Pointer to the resource descriptor
    276  *              Length              - Length of the descriptor in bytes
    277  *              Level               - Current source code indentation level
    278  *
    279  * RETURN:      None
    280  *
    281  * DESCRIPTION: Decode a GPIO Interrupt descriptor
    282  *
    283  ******************************************************************************/
    284 
    285 static void
    286 AcpiDmGpioIntDescriptor (
    287     ACPI_OP_WALK_INFO       *Info,
    288     AML_RESOURCE            *Resource,
    289     UINT32                  Length,
    290     UINT32                  Level)
    291 {
    292 
    293     /* Dump the GpioInt-specific portion of the descriptor */
    294 
    295     /* EdgeLevel, ActiveLevel, Shared */
    296 
    297     AcpiDmIndent (Level);
    298     AcpiOsPrintf ("GpioInt (%s, %s, %s, ",
    299         AcpiGbl_HeDecode [ACPI_GET_1BIT_FLAG (Resource->Gpio.IntFlags)],
    300         AcpiGbl_LlDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 1)],
    301         AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 3)]);
    302 
    303     /* PinConfig, DebounceTimeout */
    304 
    305     if (Resource->Gpio.PinConfig <= 3)
    306     {
    307         AcpiOsPrintf ("%s, ",
    308             AcpiGbl_PpcDecode[Resource->Gpio.PinConfig]);
    309     }
    310     else
    311     {
    312         AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.PinConfig);
    313     }
    314     AcpiOsPrintf ("0x%4.4X,\n", Resource->Gpio.DebounceTimeout);
    315 
    316     /* Dump the GpioInt/GpioIo common portion of the descriptor */
    317 
    318     AcpiDmGpioCommon (Info, Resource, Level);
    319 }
    320 
    321 
    322 /*******************************************************************************
    323  *
    324  * FUNCTION:    AcpiDmGpioIoDescriptor
    325  *
    326  * PARAMETERS:  Info                - Extra resource info
    327  *              Resource            - Pointer to the resource descriptor
    328  *              Length              - Length of the descriptor in bytes
    329  *              Level               - Current source code indentation level
    330  *
    331  * RETURN:      None
    332  *
    333  * DESCRIPTION: Decode a GPIO I/O descriptor
    334  *
    335  ******************************************************************************/
    336 
    337 static void
    338 AcpiDmGpioIoDescriptor (
    339     ACPI_OP_WALK_INFO       *Info,
    340     AML_RESOURCE            *Resource,
    341     UINT32                  Length,
    342     UINT32                  Level)
    343 {
    344 
    345     /* Dump the GpioIo-specific portion of the descriptor */
    346 
    347     /* Shared, PinConfig */
    348 
    349     AcpiDmIndent (Level);
    350     AcpiOsPrintf ("GpioIo (%s, ",
    351         AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 3)]);
    352 
    353     if (Resource->Gpio.PinConfig <= 3)
    354     {
    355         AcpiOsPrintf ("%s, ",
    356             AcpiGbl_PpcDecode[Resource->Gpio.PinConfig]);
    357     }
    358     else
    359     {
    360         AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.PinConfig);
    361     }
    362 
    363     /* DebounceTimeout, DriveStrength, IoRestriction */
    364 
    365     AcpiOsPrintf ("0x%4.4X, ", Resource->Gpio.DebounceTimeout);
    366     AcpiOsPrintf ("0x%4.4X, ", Resource->Gpio.DriveStrength);
    367     AcpiOsPrintf ("%s,\n",
    368         AcpiGbl_IorDecode [ACPI_GET_2BIT_FLAG (Resource->Gpio.IntFlags)]);
    369 
    370     /* Dump the GpioInt/GpioIo common portion of the descriptor */
    371 
    372     AcpiDmGpioCommon (Info, Resource, Level);
    373 }
    374 
    375 
    376 /*******************************************************************************
    377  *
    378  * FUNCTION:    AcpiDmGpioDescriptor
    379  *
    380  * PARAMETERS:  Info                - Extra resource info
    381  *              Resource            - Pointer to the resource descriptor
    382  *              Length              - Length of the descriptor in bytes
    383  *              Level               - Current source code indentation level
    384  *
    385  * RETURN:      None
    386  *
    387  * DESCRIPTION: Decode a GpioInt/GpioIo GPIO Interrupt/IO descriptor
    388  *
    389  ******************************************************************************/
    390 
    391 void
    392 AcpiDmGpioDescriptor (
    393     ACPI_OP_WALK_INFO       *Info,
    394     AML_RESOURCE            *Resource,
    395     UINT32                  Length,
    396     UINT32                  Level)
    397 {
    398     UINT8                   ConnectionType;
    399 
    400 
    401     ConnectionType = Resource->Gpio.ConnectionType;
    402 
    403     switch (ConnectionType)
    404     {
    405     case AML_RESOURCE_GPIO_TYPE_INT:
    406 
    407         AcpiDmGpioIntDescriptor (Info, Resource, Length, Level);
    408         break;
    409 
    410     case AML_RESOURCE_GPIO_TYPE_IO:
    411 
    412         AcpiDmGpioIoDescriptor (Info, Resource, Length, Level);
    413         break;
    414 
    415     default:
    416 
    417         AcpiOsPrintf ("Unknown GPIO type\n");
    418         break;
    419     }
    420 }
    421 
    422 void
    423 AcpiDmClockInputDescriptor (
    424     ACPI_OP_WALK_INFO       *Info,
    425     AML_RESOURCE            *Resource,
    426     UINT32                  Length,
    427     UINT32                  Level)
    428 {
    429     char                    *DeviceName = NULL;
    430     UINT8                   *ResourceIndex = NULL;
    431     AcpiDmIndent (Level);
    432 
    433     AcpiOsPrintf ("ClockInput (");
    434 
    435     AcpiOsPrintf ("0x%8.8X, ", Resource->ClockInput.FrequencyNumerator);
    436 
    437     AcpiOsPrintf ("0x%4.4X, ", Resource->ClockInput.FrequencyDivisor);
    438 
    439     AcpiOsPrintf ("%s, ",
    440         AcpiGbl_ClockInputScale [ACPI_EXTRACT_2BIT_FLAG (Resource->ClockInput.Flags, 1)]);
    441 
    442     AcpiOsPrintf ("%s, ",
    443         AcpiGbl_ClockInputMode [ACPI_GET_1BIT_FLAG (Resource->ClockInput.Flags)]);
    444 
    445     if (Length > sizeof(Resource->ClockInput))
    446     {
    447         DeviceName = ACPI_ADD_PTR (char,
    448             Resource, sizeof(Resource->ClockInput)+1),
    449         AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
    450 
    451         AcpiOsPrintf (", ");
    452         ResourceIndex = ACPI_ADD_PTR (UINT8,
    453             Resource, sizeof(Resource->ClockInput)),
    454 
    455         AcpiOsPrintf ("0x%2.2X", *ResourceIndex);
    456     }
    457 
    458     AcpiOsPrintf (")\n");
    459 
    460 }
    461 
    462 /*******************************************************************************
    463  *
    464  * FUNCTION:    AcpiDmPinFunctionDescriptor
    465  *
    466  * PARAMETERS:  Info                - Extra resource info
    467  *              Resource            - Pointer to the resource descriptor
    468  *              Length              - Length of the descriptor in bytes
    469  *              Level               - Current source code indentation level
    470  *
    471  * RETURN:      None
    472  *
    473  * DESCRIPTION: Decode a PinFunction descriptor
    474  *
    475  ******************************************************************************/
    476 
    477 void
    478 AcpiDmPinFunctionDescriptor (
    479     ACPI_OP_WALK_INFO       *Info,
    480     AML_RESOURCE            *Resource,
    481     UINT32                  Length,
    482     UINT32                  Level)
    483 {
    484     UINT16                  *PinList;
    485     UINT8                   *VendorData;
    486     char                    *DeviceName = NULL;
    487     UINT32                  PinCount;
    488     UINT32                  i;
    489 
    490     AcpiDmIndent (Level);
    491     AcpiOsPrintf ("PinFunction (%s, ",
    492         AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinFunction.Flags)]);
    493 
    494     if (Resource->PinFunction.PinConfig <= 3)
    495     {
    496         AcpiOsPrintf ("%s, ",
    497             AcpiGbl_PpcDecode[Resource->PinFunction.PinConfig]);
    498     }
    499     else
    500     {
    501         AcpiOsPrintf ("0x%2.2X, ", Resource->PinFunction.PinConfig);
    502     }
    503 
    504     /* FunctionNumber */
    505 
    506     AcpiOsPrintf ("0x%4.4X, ", Resource->PinFunction.FunctionNumber);
    507 
    508     if (Resource->PinFunction.ResSourceOffset)
    509     {
    510         DeviceName = ACPI_ADD_PTR (char,
    511             Resource, Resource->PinFunction.ResSourceOffset),
    512         AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
    513     }
    514 
    515     AcpiOsPrintf (", ");
    516     AcpiOsPrintf ("0x%2.2X,\n", Resource->PinFunction.ResSourceIndex);
    517 
    518     AcpiDmIndent (Level + 1);
    519 
    520     /* Always ResourceConsumer */
    521     AcpiOsPrintf ("%s, ", AcpiGbl_ConsumeDecode [ACPI_CONSUMER]);
    522 
    523     /* Insert a descriptor name */
    524 
    525     AcpiDmDescriptorName ();
    526 
    527     AcpiOsPrintf (",");
    528 
    529     /* Dump the vendor data */
    530 
    531     if (Resource->PinFunction.VendorLength)
    532     {
    533         AcpiOsPrintf ("\n");
    534         AcpiDmIndent (Level + 1);
    535         VendorData = ACPI_ADD_PTR (UINT8, Resource,
    536             Resource->PinFunction.VendorOffset);
    537 
    538         AcpiDmDumpRawDataBuffer (VendorData,
    539             Resource->PinFunction.VendorLength, Level);
    540     }
    541 
    542     AcpiOsPrintf (")\n");
    543 
    544     AcpiDmIndent (Level + 1);
    545 
    546     /* Dump the interrupt list */
    547 
    548     AcpiOsPrintf ("{   // Pin list\n");
    549 
    550     PinCount = ((UINT32) (Resource->PinFunction.ResSourceOffset -
    551         Resource->PinFunction.PinTableOffset)) /
    552         sizeof (UINT16);
    553 
    554     PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
    555         Resource->PinFunction.PinTableOffset);
    556 
    557     for (i = 0; i < PinCount; i++)
    558     {
    559         AcpiDmIndent (Level + 2);
    560         AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
    561             ((i + 1) < PinCount) ? "," : "");
    562     }
    563 
    564     AcpiDmIndent (Level + 1);
    565     AcpiOsPrintf ("}\n");
    566 }
    567 
    568 
    569 /*******************************************************************************
    570  *
    571  * FUNCTION:    AcpiDmDumpSerialBusVendorData
    572  *
    573  * PARAMETERS:  Resource            - Pointer to the resource descriptor
    574  *
    575  * RETURN:      None
    576  *
    577  * DESCRIPTION: Dump optional serial bus vendor data
    578  *
    579  ******************************************************************************/
    580 
    581 static void
    582 AcpiDmDumpSerialBusVendorData (
    583     AML_RESOURCE            *Resource,
    584     UINT32                  Level)
    585 {
    586     UINT8                   *VendorData;
    587     UINT32                  VendorLength;
    588 
    589 
    590     /* Get the (optional) vendor data and length */
    591 
    592     switch (Resource->CommonSerialBus.Type)
    593     {
    594     case AML_RESOURCE_I2C_SERIALBUSTYPE:
    595 
    596         VendorLength = Resource->CommonSerialBus.TypeDataLength -
    597             AML_RESOURCE_I2C_MIN_DATA_LEN;
    598 
    599         VendorData = ACPI_ADD_PTR (UINT8, Resource,
    600             sizeof (AML_RESOURCE_I2C_SERIALBUS));
    601         break;
    602 
    603     case AML_RESOURCE_SPI_SERIALBUSTYPE:
    604 
    605         VendorLength = Resource->CommonSerialBus.TypeDataLength -
    606             AML_RESOURCE_SPI_MIN_DATA_LEN;
    607 
    608         VendorData = ACPI_ADD_PTR (UINT8, Resource,
    609             sizeof (AML_RESOURCE_SPI_SERIALBUS));
    610         break;
    611 
    612     case AML_RESOURCE_UART_SERIALBUSTYPE:
    613 
    614         VendorLength = Resource->CommonSerialBus.TypeDataLength -
    615             AML_RESOURCE_UART_MIN_DATA_LEN;
    616 
    617         VendorData = ACPI_ADD_PTR (UINT8, Resource,
    618             sizeof (AML_RESOURCE_UART_SERIALBUS));
    619         break;
    620 
    621     case AML_RESOURCE_CSI2_SERIALBUSTYPE:
    622 
    623         VendorLength = Resource->CommonSerialBus.TypeDataLength -
    624             AML_RESOURCE_CSI2_MIN_DATA_LEN;
    625 
    626         VendorData = ACPI_ADD_PTR (UINT8, Resource,
    627             sizeof (AML_RESOURCE_CSI2_SERIALBUS));
    628         break;
    629 
    630     default:
    631 
    632         return;
    633     }
    634 
    635     /* Dump the vendor bytes as a RawDataBuffer object */
    636 
    637     AcpiDmDumpRawDataBuffer (VendorData, VendorLength, Level);
    638 }
    639 
    640 
    641 /*******************************************************************************
    642  *
    643  * FUNCTION:    AcpiDmCsi2SerialBusDescriptor
    644  *
    645  * PARAMETERS:  Info                - Extra resource info
    646  *              Resource            - Pointer to the resource descriptor
    647  *              Length              - Length of the descriptor in bytes
    648  *              Level               - Current source code indentation level
    649  *
    650  * RETURN:      None
    651  *
    652  * DESCRIPTION: Decode a CSI2 serial bus descriptor
    653  *
    654  ******************************************************************************/
    655 
    656 static void
    657 AcpiDmCsi2SerialBusDescriptor (
    658     ACPI_OP_WALK_INFO       *Info,
    659     AML_RESOURCE            *Resource,
    660     UINT32                  Length,
    661     UINT32                  Level)
    662 {
    663     UINT32                  ResourceSourceOffset;
    664     char                    *DeviceName;
    665 
    666 
    667     /* SlaveMode, PhyType, LocalPortInstance */
    668 
    669     AcpiDmIndent (Level);
    670     AcpiOsPrintf ("Csi2Bus (%s,",
    671         AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->Csi2SerialBus.Flags)]);
    672 
    673     AcpiOsPrintf (" 0x%2.2X, 0x%2.2X,\n",
    674         Resource->Csi2SerialBus.TypeSpecificFlags & 0x03,
    675         Resource->Csi2SerialBus.TypeSpecificFlags & 0xFC);
    676 
    677     /* ResourceSource is a required field */
    678 
    679     ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
    680         Resource->CommonSerialBus.TypeDataLength;
    681 
    682     AcpiDmIndent (Level + 1);
    683     DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset);
    684     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
    685 
    686     /* ResourceSourceIndex, ResourceUsage */
    687 
    688     AcpiOsPrintf (",\n");
    689     AcpiDmIndent (Level + 1);
    690     AcpiOsPrintf ("0x%2.2X, ", Resource->Csi2SerialBus.ResSourceIndex);
    691 
    692     AcpiOsPrintf ("%s, ",
    693         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->Csi2SerialBus.Flags, 1)]);
    694 
    695     /* Insert a descriptor name */
    696 
    697     AcpiDmDescriptorName ();
    698 
    699     /* Dump the vendor data */
    700 
    701     AcpiOsPrintf (",\n");
    702     AcpiDmIndent (Level + 1);
    703     AcpiDmDumpSerialBusVendorData (Resource, Level);
    704     AcpiOsPrintf (")\n");
    705 
    706     MpSaveSerialInfo (Info->MappingOp, Resource, DeviceName);
    707 }
    708 
    709 
    710 /*******************************************************************************
    711  *
    712  * FUNCTION:    AcpiDmI2cSerialBusDescriptor
    713  *
    714  * PARAMETERS:  Info                - Extra resource info
    715  *              Resource            - Pointer to the resource descriptor
    716  *              Length              - Length of the descriptor in bytes
    717  *              Level               - Current source code indentation level
    718  *
    719  * RETURN:      None
    720  *
    721  * DESCRIPTION: Decode a I2C serial bus descriptor
    722  *
    723  ******************************************************************************/
    724 
    725 static void
    726 AcpiDmI2cSerialBusDescriptor (
    727     ACPI_OP_WALK_INFO       *Info,
    728     AML_RESOURCE            *Resource,
    729     UINT32                  Length,
    730     UINT32                  Level)
    731 {
    732     UINT32                  ResourceSourceOffset;
    733     char                    *DeviceName;
    734 
    735 
    736     /* SlaveAddress, SlaveMode, ConnectionSpeed, AddressingMode */
    737 
    738     AcpiDmIndent (Level);
    739     AcpiOsPrintf ("I2cSerialBusV2 (0x%4.4X, %s, 0x%8.8X,\n",
    740         Resource->I2cSerialBus.SlaveAddress,
    741         AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->I2cSerialBus.Flags)],
    742         Resource->I2cSerialBus.ConnectionSpeed);
    743 
    744     AcpiDmIndent (Level + 1);
    745     AcpiOsPrintf ("%s, ",
    746         AcpiGbl_AmDecode [ACPI_GET_1BIT_FLAG (Resource->I2cSerialBus.TypeSpecificFlags)]);
    747 
    748     /* ResourceSource is a required field */
    749 
    750     ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
    751         Resource->CommonSerialBus.TypeDataLength;
    752 
    753     DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset);
    754     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
    755 
    756     /* ResourceSourceIndex, ResourceUsage */
    757 
    758     AcpiOsPrintf (",\n");
    759     AcpiDmIndent (Level + 1);
    760     AcpiOsPrintf ("0x%2.2X, ", Resource->I2cSerialBus.ResSourceIndex);
    761 
    762     AcpiOsPrintf ("%s, ",
    763         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->I2cSerialBus.Flags, 1)]);
    764 
    765     /* Insert a descriptor name */
    766 
    767     AcpiDmDescriptorName ();
    768 
    769     /* Share */
    770 
    771     AcpiOsPrintf (", %s,\n",
    772         AcpiGbl_ShrDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->I2cSerialBus.Flags, 2)]);
    773 
    774     /* Dump the vendor data */
    775 
    776     AcpiDmIndent (Level + 1);
    777     AcpiDmDumpSerialBusVendorData (Resource, Level);
    778     AcpiOsPrintf (")\n");
    779 
    780     MpSaveSerialInfo (Info->MappingOp, Resource, DeviceName);
    781 }
    782 
    783 
    784 /*******************************************************************************
    785  *
    786  * FUNCTION:    AcpiDmSpiSerialBusDescriptor
    787  *
    788  * PARAMETERS:  Info                - Extra resource info
    789  *              Resource            - Pointer to the resource descriptor
    790  *              Length              - Length of the descriptor in bytes
    791  *              Level               - Current source code indentation level
    792  *
    793  * RETURN:      None
    794  *
    795  * DESCRIPTION: Decode a SPI serial bus descriptor
    796  *
    797  ******************************************************************************/
    798 
    799 static void
    800 AcpiDmSpiSerialBusDescriptor (
    801     ACPI_OP_WALK_INFO       *Info,
    802     AML_RESOURCE            *Resource,
    803     UINT32                  Length,
    804     UINT32                  Level)
    805 {
    806     UINT32                  ResourceSourceOffset;
    807     char                    *DeviceName;
    808 
    809 
    810     /* DeviceSelection, DeviceSelectionPolarity, WireMode, DataBitLength */
    811 
    812     AcpiDmIndent (Level);
    813     AcpiOsPrintf ("SpiSerialBusV2 (0x%4.4X, %s, %s, 0x%2.2X,\n",
    814         Resource->SpiSerialBus.DeviceSelection,
    815         AcpiGbl_DpDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->SpiSerialBus.TypeSpecificFlags, 1)],
    816         AcpiGbl_WmDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.TypeSpecificFlags)],
    817         Resource->SpiSerialBus.DataBitLength);
    818 
    819     /* SlaveMode, ConnectionSpeed, ClockPolarity, ClockPhase */
    820 
    821     AcpiDmIndent (Level + 1);
    822     AcpiOsPrintf ("%s, 0x%8.8X, %s,\n",
    823         AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.Flags)],
    824         Resource->SpiSerialBus.ConnectionSpeed,
    825         AcpiGbl_CpoDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.ClockPolarity)]);
    826 
    827     AcpiDmIndent (Level + 1);
    828     AcpiOsPrintf ("%s, ",
    829         AcpiGbl_CphDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.ClockPhase)]);
    830 
    831     /* ResourceSource is a required field */
    832 
    833     ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
    834         Resource->CommonSerialBus.TypeDataLength;
    835 
    836     DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset);
    837     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
    838 
    839     /* ResourceSourceIndex, ResourceUsage */
    840 
    841     AcpiOsPrintf (",\n");
    842     AcpiDmIndent (Level + 1);
    843     AcpiOsPrintf ("0x%2.2X, ", Resource->SpiSerialBus.ResSourceIndex);
    844 
    845     AcpiOsPrintf ("%s, ",
    846         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->SpiSerialBus.Flags, 1)]);
    847 
    848     /* Insert a descriptor name */
    849 
    850     AcpiDmDescriptorName ();
    851 
    852     /* Share */
    853 
    854     AcpiOsPrintf (", %s,\n",
    855         AcpiGbl_ShrDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->SpiSerialBus.Flags, 2)]);
    856 
    857     /* Dump the vendor data */
    858 
    859     AcpiDmIndent (Level + 1);
    860     AcpiDmDumpSerialBusVendorData (Resource, Level);
    861     AcpiOsPrintf (")\n");
    862 
    863     MpSaveSerialInfo (Info->MappingOp, Resource, DeviceName);
    864 }
    865 
    866 
    867 /*******************************************************************************
    868  *
    869  * FUNCTION:    AcpiDmUartSerialBusDescriptor
    870  *
    871  * PARAMETERS:  Info                - Extra resource info
    872  *              Resource            - Pointer to the resource descriptor
    873  *              Length              - Length of the descriptor in bytes
    874  *              Level               - Current source code indentation level
    875  *
    876  * RETURN:      None
    877  *
    878  * DESCRIPTION: Decode a UART serial bus descriptor
    879  *
    880  ******************************************************************************/
    881 
    882 static void
    883 AcpiDmUartSerialBusDescriptor (
    884     ACPI_OP_WALK_INFO       *Info,
    885     AML_RESOURCE            *Resource,
    886     UINT32                  Length,
    887     UINT32                  Level)
    888 {
    889     UINT32                  ResourceSourceOffset;
    890     char                    *DeviceName;
    891 
    892 
    893     /* ConnectionSpeed, BitsPerByte, StopBits */
    894 
    895     AcpiDmIndent (Level);
    896     AcpiOsPrintf ("UartSerialBusV2 (0x%8.8X, %s, %s,\n",
    897         Resource->UartSerialBus.DefaultBaudRate,
    898         AcpiGbl_BpbDecode [ACPI_EXTRACT_3BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 4)],
    899         AcpiGbl_SbDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 2)]);
    900 
    901     /* LinesInUse, IsBigEndian, Parity, FlowControl */
    902 
    903     AcpiDmIndent (Level + 1);
    904     AcpiOsPrintf ("0x%2.2X, %s, %s, %s,\n",
    905         Resource->UartSerialBus.LinesEnabled,
    906         AcpiGbl_EdDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 7)],
    907         AcpiGbl_PtDecode [ACPI_GET_3BIT_FLAG (Resource->UartSerialBus.Parity)],
    908         AcpiGbl_FcDecode [ACPI_GET_2BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags)]);
    909 
    910     /* ReceiveBufferSize, TransmitBufferSize */
    911 
    912     AcpiDmIndent (Level + 1);
    913     AcpiOsPrintf ("0x%4.4X, 0x%4.4X, ",
    914         Resource->UartSerialBus.RxFifoSize,
    915         Resource->UartSerialBus.TxFifoSize);
    916 
    917     /* ResourceSource is a required field */
    918 
    919     ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
    920         Resource->CommonSerialBus.TypeDataLength;
    921 
    922     DeviceName = ACPI_ADD_PTR (char, Resource, ResourceSourceOffset);
    923     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
    924 
    925     /* ResourceSourceIndex, ResourceUsage */
    926 
    927     AcpiOsPrintf (",\n");
    928     AcpiDmIndent (Level + 1);
    929     AcpiOsPrintf ("0x%2.2X, ", Resource->UartSerialBus.ResSourceIndex);
    930 
    931     AcpiOsPrintf ("%s, ",
    932         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->UartSerialBus.Flags, 1)]);
    933 
    934     /* Insert a descriptor name */
    935 
    936     AcpiDmDescriptorName ();
    937 
    938     /* Share */
    939 
    940     AcpiOsPrintf (", %s,\n",
    941         AcpiGbl_ShrDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->UartSerialBus.Flags, 2)]);
    942 
    943     /* Dump the vendor data */
    944 
    945     AcpiDmIndent (Level + 1);
    946     AcpiDmDumpSerialBusVendorData (Resource, Level);
    947     AcpiOsPrintf (")\n");
    948 
    949     MpSaveSerialInfo (Info->MappingOp, Resource, DeviceName);
    950 }
    951 
    952 
    953 /*******************************************************************************
    954  *
    955  * FUNCTION:    AcpiDmSerialBusDescriptor
    956  *
    957  * PARAMETERS:  Info                - Extra resource info
    958  *              Resource            - Pointer to the resource descriptor
    959  *              Length              - Length of the descriptor in bytes
    960  *              Level               - Current source code indentation level
    961  *
    962  * RETURN:      None
    963  *
    964  * DESCRIPTION: Decode a I2C/SPI/UART/CSI2 serial bus descriptor
    965  *
    966  ******************************************************************************/
    967 
    968 void
    969 AcpiDmSerialBusDescriptor (
    970     ACPI_OP_WALK_INFO       *Info,
    971     AML_RESOURCE            *Resource,
    972     UINT32                  Length,
    973     UINT32                  Level)
    974 {
    975 
    976     SerialBusResourceDispatch [Resource->CommonSerialBus.Type] (
    977         Info, Resource, Length, Level);
    978 }
    979 
    980 /*******************************************************************************
    981  *
    982  * FUNCTION:    AcpiDmPinConfig
    983  *
    984  * PARAMETERS:  PinConfigType       - Pin configuration type
    985  *              PinConfigValue      - Pin configuration value
    986  *
    987  * RETURN:      None
    988  *
    989  * DESCRIPTION: Pretty prints PinConfig type and value.
    990  *
    991  ******************************************************************************/
    992 
    993 static void
    994 AcpiDmPinConfig(
    995     UINT8                   PinConfigType,
    996     UINT32                  PinConfigValue)
    997 {
    998     if (PinConfigType <= 13)
    999     {
   1000         AcpiOsPrintf ("0x%2.2X /* %s */, ", PinConfigType,
   1001             AcpiGbl_PtypDecode[PinConfigType]);
   1002     }
   1003     else
   1004     {
   1005         AcpiOsPrintf ("0x%2.2X, /* Vendor Defined */ ", PinConfigType);
   1006     }
   1007 
   1008     /* PinConfigValue */
   1009 
   1010     AcpiOsPrintf ("0x%4.4X,\n", PinConfigValue);
   1011 }
   1012 
   1013 /*******************************************************************************
   1014  *
   1015  * FUNCTION:    AcpiDmPinConfigDescriptor
   1016  *
   1017  * PARAMETERS:  Info                - Extra resource info
   1018  *              Resource            - Pointer to the resource descriptor
   1019  *              Length              - Length of the descriptor in bytes
   1020  *              Level               - Current source code indentation level
   1021  *
   1022  * RETURN:      None
   1023  *
   1024  * DESCRIPTION: Decode a PinConfig descriptor
   1025  *
   1026  ******************************************************************************/
   1027 
   1028 void
   1029 AcpiDmPinConfigDescriptor (
   1030     ACPI_OP_WALK_INFO       *Info,
   1031     AML_RESOURCE            *Resource,
   1032     UINT32                  Length,
   1033     UINT32                  Level)
   1034 {
   1035     UINT16                  *PinList;
   1036     UINT8                   *VendorData;
   1037     char                    *DeviceName = NULL;
   1038     UINT32                  PinCount;
   1039     UINT32                  i;
   1040 
   1041     AcpiDmIndent (Level);
   1042     AcpiOsPrintf ("PinConfig (%s, ",
   1043         AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinConfig.Flags)]);
   1044 
   1045     AcpiDmPinConfig (Resource->PinConfig.PinConfigType,
   1046         Resource->PinConfig.PinConfigValue);
   1047 
   1048     AcpiDmIndent (Level + 1);
   1049 
   1050     if (Resource->PinConfig.ResSourceOffset)
   1051     {
   1052         DeviceName = ACPI_ADD_PTR (char,
   1053             Resource, Resource->PinConfig.ResSourceOffset),
   1054         AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
   1055     }
   1056 
   1057     AcpiOsPrintf (", ");
   1058     AcpiOsPrintf ("0x%2.2X, ", Resource->PinConfig.ResSourceIndex);
   1059 
   1060     AcpiOsPrintf ("%s, ",
   1061         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->PinConfig.Flags, 1)]);
   1062 
   1063     /* Insert a descriptor name */
   1064 
   1065     AcpiDmDescriptorName ();
   1066 
   1067     AcpiOsPrintf (",");
   1068 
   1069     /* Dump the vendor data */
   1070 
   1071     if (Resource->PinConfig.VendorLength)
   1072     {
   1073         AcpiOsPrintf ("\n");
   1074         AcpiDmIndent (Level + 1);
   1075         VendorData = ACPI_ADD_PTR (UINT8, Resource,
   1076             Resource->PinConfig.VendorOffset);
   1077 
   1078         AcpiDmDumpRawDataBuffer (VendorData,
   1079             Resource->PinConfig.VendorLength, Level);
   1080     }
   1081 
   1082     AcpiOsPrintf (")\n");
   1083 
   1084     AcpiDmIndent (Level + 1);
   1085 
   1086     /* Dump the interrupt list */
   1087 
   1088     AcpiOsPrintf ("{   // Pin list\n");
   1089 
   1090     PinCount = ((UINT32) (Resource->PinConfig.ResSourceOffset -
   1091         Resource->PinConfig.PinTableOffset)) /
   1092         sizeof (UINT16);
   1093 
   1094     PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
   1095         Resource->PinConfig.PinTableOffset);
   1096 
   1097     for (i = 0; i < PinCount; i++)
   1098     {
   1099         AcpiDmIndent (Level + 2);
   1100         AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
   1101             ((i + 1) < PinCount) ? "," : "");
   1102     }
   1103 
   1104     AcpiDmIndent (Level + 1);
   1105     AcpiOsPrintf ("}\n");
   1106 }
   1107 
   1108 /*******************************************************************************
   1109  *
   1110  * FUNCTION:    AcpiDmPinGroupDescriptor
   1111  *
   1112  * PARAMETERS:  Info                - Extra resource info
   1113  *              Resource            - Pointer to the resource descriptor
   1114  *              Length              - Length of the descriptor in bytes
   1115  *              Level               - Current source code indentation level
   1116  *
   1117  * RETURN:      None
   1118  *
   1119  * DESCRIPTION: Decode a PinGroup descriptor
   1120  *
   1121  ******************************************************************************/
   1122 
   1123 void
   1124 AcpiDmPinGroupDescriptor (
   1125     ACPI_OP_WALK_INFO       *Info,
   1126     AML_RESOURCE            *Resource,
   1127     UINT32                  Length,
   1128     UINT32                  Level)
   1129 {
   1130     char                    *Label;
   1131     UINT16                  *PinList;
   1132     UINT8                   *VendorData;
   1133     UINT32                  PinCount;
   1134     UINT32                  i;
   1135 
   1136     AcpiDmIndent (Level);
   1137     /* Always producer */
   1138     AcpiOsPrintf ("PinGroup (");
   1139 
   1140     Label = ACPI_ADD_PTR (char,
   1141         Resource, Resource->PinGroup.LabelOffset),
   1142     AcpiUtPrintString (Label, ACPI_UINT16_MAX);
   1143 
   1144     AcpiOsPrintf (", ");
   1145 
   1146     AcpiOsPrintf ("%s, ",
   1147         AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Resource->PinGroup.Flags)]);
   1148 
   1149     /* Insert a descriptor name */
   1150 
   1151     AcpiDmDescriptorName ();
   1152 
   1153     AcpiOsPrintf (",");
   1154 
   1155     /* Dump the vendor data */
   1156 
   1157     if (Resource->PinGroup.VendorLength)
   1158     {
   1159         AcpiOsPrintf ("\n");
   1160         AcpiDmIndent (Level + 1);
   1161         VendorData = ACPI_ADD_PTR (UINT8, Resource,
   1162             Resource->PinGroup.VendorOffset);
   1163 
   1164         AcpiDmDumpRawDataBuffer (VendorData,
   1165             Resource->PinGroup.VendorLength, Level);
   1166     }
   1167 
   1168     AcpiOsPrintf (")\n");
   1169 
   1170     AcpiDmIndent (Level + 1);
   1171 
   1172     /* Dump the interrupt list */
   1173 
   1174     AcpiOsPrintf ("{   // Pin list\n");
   1175 
   1176     PinCount = (Resource->PinGroup.LabelOffset -
   1177         Resource->PinGroup.PinTableOffset) / sizeof (UINT16);
   1178 
   1179     PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
   1180         Resource->PinGroup.PinTableOffset);
   1181 
   1182     for (i = 0; i < PinCount; i++)
   1183     {
   1184         AcpiDmIndent (Level + 2);
   1185         AcpiOsPrintf ("0x%4.4X%s\n", PinList[i],
   1186             ((i + 1) < PinCount) ? "," : "");
   1187     }
   1188 
   1189     AcpiDmIndent (Level + 1);
   1190     AcpiOsPrintf ("}\n");
   1191 }
   1192 
   1193 /*******************************************************************************
   1194  *
   1195  * FUNCTION:    AcpiDmPinGroupFunctionDescriptor
   1196  *
   1197  * PARAMETERS:  Info                - Extra resource info
   1198  *              Resource            - Pointer to the resource descriptor
   1199  *              Length              - Length of the descriptor in bytes
   1200  *              Level               - Current source code indentation level
   1201  *
   1202  * RETURN:      None
   1203  *
   1204  * DESCRIPTION: Decode a PinGroupFunction descriptor
   1205  *
   1206  ******************************************************************************/
   1207 
   1208 void
   1209 AcpiDmPinGroupFunctionDescriptor (
   1210     ACPI_OP_WALK_INFO       *Info,
   1211     AML_RESOURCE            *Resource,
   1212     UINT32                  Length,
   1213     UINT32                  Level)
   1214 {
   1215     UINT8                   *VendorData;
   1216     char                    *DeviceName = NULL;
   1217     char                    *Label = NULL;
   1218 
   1219     AcpiDmIndent (Level);
   1220     AcpiOsPrintf ("PinGroupFunction (%s, ",
   1221         AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinGroupFunction.Flags)]);
   1222 
   1223     /* FunctionNumber */
   1224 
   1225     AcpiOsPrintf ("0x%4.4X, ", Resource->PinGroupFunction.FunctionNumber);
   1226 
   1227     DeviceName = ACPI_ADD_PTR (char,
   1228         Resource, Resource->PinGroupFunction.ResSourceOffset),
   1229     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
   1230 
   1231     AcpiOsPrintf (", ");
   1232     AcpiOsPrintf ("0x%2.2X,\n", Resource->PinGroupFunction.ResSourceIndex);
   1233 
   1234     AcpiDmIndent (Level + 1);
   1235 
   1236     Label = ACPI_ADD_PTR (char, Resource,
   1237         Resource->PinGroupFunction.ResSourceLabelOffset);
   1238     AcpiUtPrintString (Label, ACPI_UINT16_MAX);
   1239 
   1240     AcpiOsPrintf (", ");
   1241 
   1242     AcpiOsPrintf ("%s, ",
   1243         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->PinGroupFunction.Flags, 1)]);
   1244 
   1245     /* Insert a descriptor name */
   1246 
   1247     AcpiDmDescriptorName ();
   1248 
   1249     AcpiOsPrintf (",");
   1250 
   1251     /* Dump the vendor data */
   1252 
   1253     if (Resource->PinGroupFunction.VendorLength)
   1254     {
   1255         AcpiOsPrintf ("\n");
   1256         AcpiDmIndent (Level + 1);
   1257         VendorData = ACPI_ADD_PTR (UINT8, Resource,
   1258             Resource->PinGroupFunction.VendorOffset);
   1259 
   1260         AcpiDmDumpRawDataBuffer (VendorData,
   1261             Resource->PinGroupFunction.VendorLength, Level);
   1262     }
   1263 
   1264     AcpiOsPrintf (")\n");
   1265 }
   1266 
   1267 /*******************************************************************************
   1268  *
   1269  * FUNCTION:    AcpiDmPinGroupConfigDescriptor
   1270  *
   1271  * PARAMETERS:  Info                - Extra resource info
   1272  *              Resource            - Pointer to the resource descriptor
   1273  *              Length              - Length of the descriptor in bytes
   1274  *              Level               - Current source code indentation level
   1275  *
   1276  * RETURN:      None
   1277  *
   1278  * DESCRIPTION: Decode a PinGroupConfig descriptor
   1279  *
   1280  ******************************************************************************/
   1281 
   1282 void
   1283 AcpiDmPinGroupConfigDescriptor (
   1284     ACPI_OP_WALK_INFO       *Info,
   1285     AML_RESOURCE            *Resource,
   1286     UINT32                  Length,
   1287     UINT32                  Level)
   1288 {
   1289     UINT8                   *VendorData;
   1290     char                    *DeviceName = NULL;
   1291     char                    *Label = NULL;
   1292 
   1293     AcpiDmIndent (Level);
   1294     AcpiOsPrintf ("PinGroupConfig (%s, ",
   1295         AcpiGbl_ShrDecode [ACPI_GET_1BIT_FLAG (Resource->PinGroupConfig.Flags)]);
   1296 
   1297     AcpiDmPinConfig(Resource->PinGroupConfig.PinConfigType,
   1298         Resource->PinGroupConfig.PinConfigValue);
   1299 
   1300     AcpiDmIndent (Level + 1);
   1301 
   1302     DeviceName = ACPI_ADD_PTR (char,
   1303         Resource, Resource->PinGroupConfig.ResSourceOffset),
   1304     AcpiUtPrintString (DeviceName, ACPI_UINT16_MAX);
   1305 
   1306     AcpiOsPrintf (", ");
   1307     AcpiOsPrintf ("0x%2.2X, ", Resource->PinGroupConfig.ResSourceIndex);
   1308 
   1309     Label = ACPI_ADD_PTR (char, Resource,
   1310         Resource->PinGroupConfig.ResSourceLabelOffset);
   1311     AcpiUtPrintString (Label, ACPI_UINT16_MAX);
   1312 
   1313     AcpiOsPrintf (", ");
   1314 
   1315     AcpiOsPrintf ("%s, ",
   1316         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->PinGroupConfig.Flags, 1)]);
   1317 
   1318     /* Insert a descriptor name */
   1319 
   1320     AcpiDmDescriptorName ();
   1321 
   1322     AcpiOsPrintf (",");
   1323 
   1324     /* Dump the vendor data */
   1325 
   1326     if (Resource->PinGroupConfig.VendorLength)
   1327     {
   1328         AcpiOsPrintf ("\n");
   1329         AcpiDmIndent (Level + 1);
   1330         VendorData = ACPI_ADD_PTR (UINT8, Resource,
   1331             Resource->PinGroupConfig.VendorOffset);
   1332 
   1333         AcpiDmDumpRawDataBuffer (VendorData,
   1334             Resource->PinGroupConfig.VendorLength, Level);
   1335     }
   1336 
   1337     AcpiOsPrintf (")\n");
   1338 }
   1339