1 /*******************************************************************************
   2  *
   3  * Module Name: dmresrcl2.c - "Large" Resource Descriptor disassembly (#2)
   4  *
   5  ******************************************************************************/
   6 
   7 /*
   8  * Copyright (C) 2000 - 2014, 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 #include "acpi.h"
  46 #include "accommon.h"
  47 #include "acdisasm.h"
  48 
  49 
  50 #ifdef ACPI_DISASSEMBLER
  51 
  52 #define _COMPONENT          ACPI_CA_DEBUGGER
  53         ACPI_MODULE_NAME    ("dbresrcl2")
  54 
  55 /* Local prototypes */
  56 
  57 static void
  58 AcpiDmI2cSerialBusDescriptor (
  59     AML_RESOURCE            *Resource,
  60     UINT32                  Length,
  61     UINT32                  Level);
  62 
  63 static void
  64 AcpiDmSpiSerialBusDescriptor (
  65     AML_RESOURCE            *Resource,
  66     UINT32                  Length,
  67     UINT32                  Level);
  68 
  69 static void
  70 AcpiDmUartSerialBusDescriptor (
  71     AML_RESOURCE            *Resource,
  72     UINT32                  Length,
  73     UINT32                  Level);
  74 
  75 static void
  76 AcpiDmGpioCommon (
  77     AML_RESOURCE            *Resource,
  78     UINT32                  Level);
  79 
  80 static void
  81 AcpiDmDumpRawDataBuffer (
  82     UINT8                   *Buffer,
  83     UINT32                  Length,
  84     UINT32                  Level);
  85 
  86 
  87 /* Dispatch table for the serial bus descriptors */
  88 
  89 static ACPI_RESOURCE_HANDLER        SerialBusResourceDispatch [] =
  90 {
  91     NULL,
  92     AcpiDmI2cSerialBusDescriptor,
  93     AcpiDmSpiSerialBusDescriptor,
  94     AcpiDmUartSerialBusDescriptor
  95 };
  96 
  97 
  98 /*******************************************************************************
  99  *
 100  * FUNCTION:    AcpiDmDumpRawDataBuffer
 101  *
 102  * PARAMETERS:  Buffer              - Pointer to the data bytes
 103  *              Length              - Length of the descriptor in bytes
 104  *              Level               - Current source code indentation level
 105  *
 106  * RETURN:      None
 107  *
 108  * DESCRIPTION: Dump a data buffer as a RawDataBuffer() object. Used for
 109  *              vendor data bytes.
 110  *
 111  ******************************************************************************/
 112 
 113 static void
 114 AcpiDmDumpRawDataBuffer (
 115     UINT8                   *Buffer,
 116     UINT32                  Length,
 117     UINT32                  Level)
 118 {
 119     UINT32                  Index;
 120     UINT32                  i;
 121     UINT32                  j;
 122 
 123 
 124     if (!Length)
 125     {
 126         return;
 127     }
 128 
 129     AcpiOsPrintf ("RawDataBuffer (0x%.2X)  // Vendor Data", Length);
 130 
 131     AcpiOsPrintf ("\n");
 132     AcpiDmIndent (Level + 1);
 133     AcpiOsPrintf ("{\n");
 134     AcpiDmIndent (Level + 2);
 135 
 136     for (i = 0; i < Length;)
 137     {
 138         for (j = 0; j < 8; j++)
 139         {
 140             Index = i + j;
 141             if (Index >= Length)
 142             {
 143                 goto Finish;
 144             }
 145 
 146             AcpiOsPrintf ("0x%2.2X", Buffer[Index]);
 147             if ((Index + 1) >= Length)
 148             {
 149                 goto Finish;
 150             }
 151 
 152             AcpiOsPrintf (", ");
 153         }
 154         AcpiOsPrintf ("\n");
 155         AcpiDmIndent (Level + 2);
 156 
 157         i += 8;
 158     }
 159 
 160 Finish:
 161     AcpiOsPrintf ("\n");
 162     AcpiDmIndent (Level + 1);
 163     AcpiOsPrintf ("}");
 164 }
 165 
 166 
 167 /*******************************************************************************
 168  *
 169  * FUNCTION:    AcpiDmGpioCommon
 170  *
 171  * PARAMETERS:  Resource            - Pointer to the resource descriptor
 172  *              Level               - Current source code indentation level
 173  *
 174  * RETURN:      None
 175  *
 176  * DESCRIPTION: Decode common parts of a GPIO Interrupt descriptor
 177  *
 178  ******************************************************************************/
 179 
 180 static void
 181 AcpiDmGpioCommon (
 182     AML_RESOURCE            *Resource,
 183     UINT32                  Level)
 184 {
 185     UINT32                  PinCount;
 186     UINT16                  *PinList;
 187     UINT8                   *VendorData;
 188     UINT32                  i;
 189 
 190 
 191     /* ResourceSource, ResourceSourceIndex, ResourceType */
 192 
 193     AcpiDmIndent (Level + 1);
 194     if (Resource->Gpio.ResSourceOffset)
 195     {
 196         AcpiUtPrintString (
 197             ACPI_ADD_PTR (char, Resource, Resource->Gpio.ResSourceOffset),
 198             ACPI_UINT16_MAX);
 199     }
 200 
 201     AcpiOsPrintf (", ");
 202     AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.ResSourceIndex);
 203     AcpiOsPrintf ("%s, ",
 204         AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Resource->Gpio.Flags)]);
 205 
 206     /* Insert a descriptor name */
 207 
 208     AcpiDmDescriptorName ();
 209     AcpiOsPrintf (",");
 210 
 211     /* Dump the vendor data */
 212 
 213     if (Resource->Gpio.VendorOffset)
 214     {
 215         AcpiOsPrintf ("\n");
 216         AcpiDmIndent (Level + 1);
 217         VendorData = ACPI_ADD_PTR (UINT8, Resource,
 218             Resource->Gpio.VendorOffset);
 219 
 220         AcpiDmDumpRawDataBuffer (VendorData,
 221             Resource->Gpio.VendorLength, Level);
 222     }
 223 
 224     AcpiOsPrintf (")\n");
 225 
 226     /* Dump the interrupt list */
 227 
 228     AcpiDmIndent (Level + 1);
 229     AcpiOsPrintf ("{   // Pin list\n");
 230 
 231     PinCount = ((UINT32) (Resource->Gpio.ResSourceOffset -
 232         Resource->Gpio.PinTableOffset)) /
 233         sizeof (UINT16);
 234 
 235     PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
 236         Resource->Gpio.PinTableOffset);
 237 
 238     for (i = 0; i < PinCount; i++)
 239     {
 240         AcpiDmIndent (Level + 2);
 241         AcpiOsPrintf ("0x%4.4X%s\n", PinList[i], ((i + 1) < PinCount) ? "," : "");
 242     }
 243 
 244     AcpiDmIndent (Level + 1);
 245     AcpiOsPrintf ("}\n");
 246 }
 247 
 248 
 249 /*******************************************************************************
 250  *
 251  * FUNCTION:    AcpiDmGpioIntDescriptor
 252  *
 253  * PARAMETERS:  Resource            - Pointer to the resource descriptor
 254  *              Length              - Length of the descriptor in bytes
 255  *              Level               - Current source code indentation level
 256  *
 257  * RETURN:      None
 258  *
 259  * DESCRIPTION: Decode a GPIO Interrupt descriptor
 260  *
 261  ******************************************************************************/
 262 
 263 static void
 264 AcpiDmGpioIntDescriptor (
 265     AML_RESOURCE            *Resource,
 266     UINT32                  Length,
 267     UINT32                  Level)
 268 {
 269 
 270     /* Dump the GpioInt-specific portion of the descriptor */
 271 
 272     /* EdgeLevel, ActiveLevel, Shared */
 273 
 274     AcpiDmIndent (Level);
 275     AcpiOsPrintf ("GpioInt (%s, %s, %s, ",
 276         AcpiGbl_HeDecode [ACPI_GET_1BIT_FLAG (Resource->Gpio.IntFlags)],
 277         AcpiGbl_LlDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->Gpio.IntFlags, 1)],
 278         AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 3)]);
 279 
 280     /* PinConfig, DebounceTimeout */
 281 
 282     if (Resource->Gpio.PinConfig <= 3)
 283     {
 284         AcpiOsPrintf ("%s, ",
 285             AcpiGbl_PpcDecode[Resource->Gpio.PinConfig]);
 286     }
 287     else
 288     {
 289         AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.PinConfig);
 290     }
 291     AcpiOsPrintf ("0x%4.4X,\n", Resource->Gpio.DebounceTimeout);
 292 
 293     /* Dump the GpioInt/GpioIo common portion of the descriptor */
 294 
 295     AcpiDmGpioCommon (Resource, Level);
 296 }
 297 
 298 
 299 /*******************************************************************************
 300  *
 301  * FUNCTION:    AcpiDmGpioIoDescriptor
 302  *
 303  * PARAMETERS:  Resource            - Pointer to the resource descriptor
 304  *              Length              - Length of the descriptor in bytes
 305  *              Level               - Current source code indentation level
 306  *
 307  * RETURN:      None
 308  *
 309  * DESCRIPTION: Decode a GPIO I/O descriptor
 310  *
 311  ******************************************************************************/
 312 
 313 static void
 314 AcpiDmGpioIoDescriptor (
 315     AML_RESOURCE            *Resource,
 316     UINT32                  Length,
 317     UINT32                  Level)
 318 {
 319 
 320     /* Dump the GpioIo-specific portion of the descriptor */
 321 
 322     /* Shared, PinConfig */
 323 
 324     AcpiDmIndent (Level);
 325     AcpiOsPrintf ("GpioIo (%s, ",
 326         AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 3)]);
 327 
 328     if (Resource->Gpio.PinConfig <= 3)
 329     {
 330         AcpiOsPrintf ("%s, ",
 331             AcpiGbl_PpcDecode[Resource->Gpio.PinConfig]);
 332     }
 333     else
 334     {
 335         AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.PinConfig);
 336     }
 337 
 338     /* DebounceTimeout, DriveStrength, IoRestriction */
 339 
 340     AcpiOsPrintf ("0x%4.4X, ", Resource->Gpio.DebounceTimeout);
 341     AcpiOsPrintf ("0x%4.4X, ", Resource->Gpio.DriveStrength);
 342     AcpiOsPrintf ("%s,\n",
 343         AcpiGbl_IorDecode [ACPI_GET_2BIT_FLAG (Resource->Gpio.IntFlags)]);
 344 
 345     /* Dump the GpioInt/GpioIo common portion of the descriptor */
 346 
 347     AcpiDmGpioCommon (Resource, Level);
 348 }
 349 
 350 
 351 /*******************************************************************************
 352  *
 353  * FUNCTION:    AcpiDmGpioDescriptor
 354  *
 355  * PARAMETERS:  Resource            - Pointer to the resource descriptor
 356  *              Length              - Length of the descriptor in bytes
 357  *              Level               - Current source code indentation level
 358  *
 359  * RETURN:      None
 360  *
 361  * DESCRIPTION: Decode a GpioInt/GpioIo GPIO Interrupt/IO descriptor
 362  *
 363  ******************************************************************************/
 364 
 365 void
 366 AcpiDmGpioDescriptor (
 367     AML_RESOURCE            *Resource,
 368     UINT32                  Length,
 369     UINT32                  Level)
 370 {
 371     UINT8                   ConnectionType;
 372 
 373 
 374     ConnectionType = Resource->Gpio.ConnectionType;
 375 
 376     switch (ConnectionType)
 377     {
 378     case AML_RESOURCE_GPIO_TYPE_INT:
 379 
 380         AcpiDmGpioIntDescriptor (Resource, Length, Level);
 381         break;
 382 
 383     case AML_RESOURCE_GPIO_TYPE_IO:
 384 
 385         AcpiDmGpioIoDescriptor (Resource, Length, Level);
 386         break;
 387 
 388     default:
 389 
 390         AcpiOsPrintf ("Unknown GPIO type\n");
 391         break;
 392     }
 393 }
 394 
 395 
 396 /*******************************************************************************
 397  *
 398  * FUNCTION:    AcpiDmDumpSerialBusVendorData
 399  *
 400  * PARAMETERS:  Resource            - Pointer to the resource descriptor
 401  *
 402  * RETURN:      None
 403  *
 404  * DESCRIPTION: Dump optional serial bus vendor data
 405  *
 406  ******************************************************************************/
 407 
 408 static void
 409 AcpiDmDumpSerialBusVendorData (
 410     AML_RESOURCE            *Resource,
 411     UINT32                  Level)
 412 {
 413     UINT8                   *VendorData;
 414     UINT32                  VendorLength;
 415 
 416 
 417     /* Get the (optional) vendor data and length */
 418 
 419     switch (Resource->CommonSerialBus.Type)
 420     {
 421     case AML_RESOURCE_I2C_SERIALBUSTYPE:
 422 
 423         VendorLength = Resource->CommonSerialBus.TypeDataLength -
 424             AML_RESOURCE_I2C_MIN_DATA_LEN;
 425 
 426         VendorData = ACPI_ADD_PTR (UINT8, Resource,
 427             sizeof (AML_RESOURCE_I2C_SERIALBUS));
 428         break;
 429 
 430     case AML_RESOURCE_SPI_SERIALBUSTYPE:
 431 
 432         VendorLength = Resource->CommonSerialBus.TypeDataLength -
 433             AML_RESOURCE_SPI_MIN_DATA_LEN;
 434 
 435         VendorData = ACPI_ADD_PTR (UINT8, Resource,
 436             sizeof (AML_RESOURCE_SPI_SERIALBUS));
 437         break;
 438 
 439     case AML_RESOURCE_UART_SERIALBUSTYPE:
 440 
 441         VendorLength = Resource->CommonSerialBus.TypeDataLength -
 442             AML_RESOURCE_UART_MIN_DATA_LEN;
 443 
 444         VendorData = ACPI_ADD_PTR (UINT8, Resource,
 445             sizeof (AML_RESOURCE_UART_SERIALBUS));
 446         break;
 447 
 448     default:
 449 
 450         return;
 451     }
 452 
 453     /* Dump the vendor bytes as a RawDataBuffer object */
 454 
 455     AcpiDmDumpRawDataBuffer (VendorData, VendorLength, Level);
 456 }
 457 
 458 
 459 /*******************************************************************************
 460  *
 461  * FUNCTION:    AcpiDmI2cSerialBusDescriptor
 462  *
 463  * PARAMETERS:  Resource            - Pointer to the resource descriptor
 464  *              Length              - Length of the descriptor in bytes
 465  *              Level               - Current source code indentation level
 466  *
 467  * RETURN:      None
 468  *
 469  * DESCRIPTION: Decode a I2C serial bus descriptor
 470  *
 471  ******************************************************************************/
 472 
 473 static void
 474 AcpiDmI2cSerialBusDescriptor (
 475     AML_RESOURCE            *Resource,
 476     UINT32                  Length,
 477     UINT32                  Level)
 478 {
 479     UINT32                  ResourceSourceOffset;
 480 
 481 
 482     /* SlaveAddress, SlaveMode, ConnectionSpeed, AddressingMode */
 483 
 484     AcpiDmIndent (Level);
 485     AcpiOsPrintf ("I2cSerialBus (0x%4.4X, %s, 0x%8.8X,\n",
 486         Resource->I2cSerialBus.SlaveAddress,
 487         AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->I2cSerialBus.Flags)],
 488         Resource->I2cSerialBus.ConnectionSpeed);
 489 
 490     AcpiDmIndent (Level + 1);
 491     AcpiOsPrintf ("%s, ",
 492         AcpiGbl_AmDecode [ACPI_GET_1BIT_FLAG (Resource->I2cSerialBus.TypeSpecificFlags)]);
 493 
 494     /* ResourceSource is a required field */
 495 
 496     ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
 497         Resource->CommonSerialBus.TypeDataLength;
 498 
 499     AcpiUtPrintString (
 500         ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
 501         ACPI_UINT16_MAX);
 502 
 503     /* ResourceSourceIndex, ResourceUsage */
 504 
 505     AcpiOsPrintf (",\n");
 506     AcpiDmIndent (Level + 1);
 507     AcpiOsPrintf ("0x%2.2X, ", Resource->I2cSerialBus.ResSourceIndex);
 508 
 509     AcpiOsPrintf ("%s, ",
 510         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->I2cSerialBus.Flags, 1)]);
 511 
 512     /* Insert a descriptor name */
 513 
 514     AcpiDmDescriptorName ();
 515     AcpiOsPrintf (",\n");
 516 
 517     /* Dump the vendor data */
 518 
 519     AcpiDmIndent (Level + 1);
 520     AcpiDmDumpSerialBusVendorData (Resource, Level);
 521     AcpiOsPrintf (")\n");
 522 }
 523 
 524 
 525 /*******************************************************************************
 526  *
 527  * FUNCTION:    AcpiDmSpiSerialBusDescriptor
 528  *
 529  * PARAMETERS:  Resource            - Pointer to the resource descriptor
 530  *              Length              - Length of the descriptor in bytes
 531  *              Level               - Current source code indentation level
 532  *
 533  * RETURN:      None
 534  *
 535  * DESCRIPTION: Decode a SPI serial bus descriptor
 536  *
 537  ******************************************************************************/
 538 
 539 static void
 540 AcpiDmSpiSerialBusDescriptor (
 541     AML_RESOURCE            *Resource,
 542     UINT32                  Length,
 543     UINT32                  Level)
 544 {
 545     UINT32                  ResourceSourceOffset;
 546 
 547 
 548     /* DeviceSelection, DeviceSelectionPolarity, WireMode, DataBitLength */
 549 
 550     AcpiDmIndent (Level);
 551     AcpiOsPrintf ("SpiSerialBus (0x%4.4X, %s, %s, 0x%2.2X,\n",
 552         Resource->SpiSerialBus.DeviceSelection,
 553         AcpiGbl_DpDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->SpiSerialBus.TypeSpecificFlags, 1)],
 554         AcpiGbl_WmDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.TypeSpecificFlags)],
 555         Resource->SpiSerialBus.DataBitLength);
 556 
 557     /* SlaveMode, ConnectionSpeed, ClockPolarity, ClockPhase */
 558 
 559     AcpiDmIndent (Level + 1);
 560     AcpiOsPrintf ("%s, 0x%8.8X, %s,\n",
 561         AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.Flags)],
 562         Resource->SpiSerialBus.ConnectionSpeed,
 563         AcpiGbl_CpoDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.ClockPolarity)]);
 564 
 565     AcpiDmIndent (Level + 1);
 566     AcpiOsPrintf ("%s, ",
 567         AcpiGbl_CphDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.ClockPhase)]);
 568 
 569     /* ResourceSource is a required field */
 570 
 571     ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
 572         Resource->CommonSerialBus.TypeDataLength;
 573 
 574     AcpiUtPrintString (
 575         ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
 576         ACPI_UINT16_MAX);
 577 
 578     /* ResourceSourceIndex, ResourceUsage */
 579 
 580     AcpiOsPrintf (",\n");
 581     AcpiDmIndent (Level + 1);
 582     AcpiOsPrintf ("0x%2.2X, ", Resource->SpiSerialBus.ResSourceIndex);
 583 
 584     AcpiOsPrintf ("%s, ",
 585         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->SpiSerialBus.Flags, 1)]);
 586 
 587     /* Insert a descriptor name */
 588 
 589     AcpiDmDescriptorName ();
 590     AcpiOsPrintf (",\n");
 591 
 592     /* Dump the vendor data */
 593 
 594     AcpiDmIndent (Level + 1);
 595     AcpiDmDumpSerialBusVendorData (Resource, Level);
 596     AcpiOsPrintf (")\n");
 597 }
 598 
 599 
 600 /*******************************************************************************
 601  *
 602  * FUNCTION:    AcpiDmUartSerialBusDescriptor
 603  *
 604  * PARAMETERS:  Resource            - Pointer to the resource descriptor
 605  *              Length              - Length of the descriptor in bytes
 606  *              Level               - Current source code indentation level
 607  *
 608  * RETURN:      None
 609  *
 610  * DESCRIPTION: Decode a UART serial bus descriptor
 611  *
 612  ******************************************************************************/
 613 
 614 static void
 615 AcpiDmUartSerialBusDescriptor (
 616     AML_RESOURCE            *Resource,
 617     UINT32                  Length,
 618     UINT32                  Level)
 619 {
 620     UINT32                  ResourceSourceOffset;
 621 
 622 
 623     /* ConnectionSpeed, BitsPerByte, StopBits */
 624 
 625     AcpiDmIndent (Level);
 626     AcpiOsPrintf ("UartSerialBus (0x%8.8X, %s, %s,\n",
 627         Resource->UartSerialBus.DefaultBaudRate,
 628         AcpiGbl_BpbDecode [ACPI_EXTRACT_3BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 4)],
 629         AcpiGbl_SbDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 2)]);
 630 
 631     /* LinesInUse, IsBigEndian, Parity, FlowControl */
 632 
 633     AcpiDmIndent (Level + 1);
 634     AcpiOsPrintf ("0x%2.2X, %s, %s, %s,\n",
 635         Resource->UartSerialBus.LinesEnabled,
 636         AcpiGbl_EdDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 7)],
 637         AcpiGbl_PtDecode [ACPI_GET_3BIT_FLAG (Resource->UartSerialBus.Parity)],
 638         AcpiGbl_FcDecode [ACPI_GET_2BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags)]);
 639 
 640     /* ReceiveBufferSize, TransmitBufferSize */
 641 
 642     AcpiDmIndent (Level + 1);
 643     AcpiOsPrintf ("0x%4.4X, 0x%4.4X, ",
 644         Resource->UartSerialBus.RxFifoSize,
 645         Resource->UartSerialBus.TxFifoSize);
 646 
 647     /* ResourceSource is a required field */
 648 
 649     ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
 650         Resource->CommonSerialBus.TypeDataLength;
 651 
 652     AcpiUtPrintString (
 653         ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
 654         ACPI_UINT16_MAX);
 655 
 656     /* ResourceSourceIndex, ResourceUsage */
 657 
 658     AcpiOsPrintf (",\n");
 659     AcpiDmIndent (Level + 1);
 660     AcpiOsPrintf ("0x%2.2X, ", Resource->UartSerialBus.ResSourceIndex);
 661 
 662     AcpiOsPrintf ("%s, ",
 663         AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->UartSerialBus.Flags, 1)]);
 664 
 665     /* Insert a descriptor name */
 666 
 667     AcpiDmDescriptorName ();
 668     AcpiOsPrintf (",\n");
 669 
 670     /* Dump the vendor data */
 671 
 672     AcpiDmIndent (Level + 1);
 673     AcpiDmDumpSerialBusVendorData (Resource, Level);
 674     AcpiOsPrintf (")\n");
 675 }
 676 
 677 
 678 /*******************************************************************************
 679  *
 680  * FUNCTION:    AcpiDmSerialBusDescriptor
 681  *
 682  * PARAMETERS:  Resource            - Pointer to the resource descriptor
 683  *              Length              - Length of the descriptor in bytes
 684  *              Level               - Current source code indentation level
 685  *
 686  * RETURN:      None
 687  *
 688  * DESCRIPTION: Decode a I2C/SPI/UART serial bus descriptor
 689  *
 690  ******************************************************************************/
 691 
 692 void
 693 AcpiDmSerialBusDescriptor (
 694     AML_RESOURCE            *Resource,
 695     UINT32                  Length,
 696     UINT32                  Level)
 697 {
 698 
 699     SerialBusResourceDispatch [Resource->CommonSerialBus.Type] (
 700         Resource, Length, Level);
 701 }
 702 
 703 #endif