text: /*******************************************************************************
   *
   * Module Name: dmresrcl2.c - "Large" Resource Descriptor disassembly (#2)
   *
   ******************************************************************************/
  
  /*
   * Copyright (C) 2000 - 2013, Intel Corp.
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions, and the following disclaimer,
   *    without modification.
   * 2. Redistributions in binary form must reproduce at minimum a disclaimer
   *    substantially similar to the "NO WARRANTY" disclaimer below
   *    ("Disclaimer") and any redistribution must be conditioned upon
   *    including a substantially similar Disclaimer requirement for further
   *    binary redistribution.
   * 3. Neither the names of the above-listed copyright holders nor the names
   *    of any contributors may be used to endorse or promote products derived
   *    from this software without specific prior written permission.
   *
   * Alternatively, this software may be distributed under the terms of the
   * GNU General Public License ("GPL") version 2 as published by the Free
   * Software Foundation.
   *
   * NO WARRANTY
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
   * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
   * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   * POSSIBILITY OF SUCH DAMAGES.
   */
  
  
  #include "acpi.h"
  #include "accommon.h"
  #include "acdisasm.h"
  
  
  #ifdef ACPI_DISASSEMBLER
  
  #define _COMPONENT          ACPI_CA_DEBUGGER
          ACPI_MODULE_NAME    ("dbresrcl2")
  
  /* Local prototypes */
  
  static void
  AcpiDmI2cSerialBusDescriptor (
      AML_RESOURCE            *Resource,
      UINT32                  Length,
      UINT32                  Level);
  
  static void
  AcpiDmSpiSerialBusDescriptor (
      AML_RESOURCE            *Resource,
      UINT32                  Length,
      UINT32                  Level);
  
  static void
  AcpiDmUartSerialBusDescriptor (
      AML_RESOURCE            *Resource,
      UINT32                  Length,
      UINT32                  Level);
  
  static void
  AcpiDmGpioCommon (
      AML_RESOURCE            *Resource,
      UINT32                  Level);
  
  static void
  AcpiDmDumpRawDataBuffer (
      UINT8                   *Buffer,
      UINT32                  Length,
      UINT32                  Level);
  
  
  /* Dispatch table for the serial bus descriptors */
  
  static ACPI_RESOURCE_HANDLER        SerialBusResourceDispatch [] =
  {
      NULL,
      AcpiDmI2cSerialBusDescriptor,
      AcpiDmSpiSerialBusDescriptor,
      AcpiDmUartSerialBusDescriptor
  };
  
  
  /*******************************************************************************
   *
   * FUNCTION:    AcpiDmDumpRawDataBuffer
   *
   * PARAMETERS:  Buffer              - Pointer to the data bytes
   *              Length              - Length of the descriptor in bytes
   *              Level               - Current source code indentation level
   *
   * RETURN:      None
   *
   * DESCRIPTION: Dump a data buffer as a RawDataBuffer() object. Used for
   *              vendor data bytes.
   *
   ******************************************************************************/
  
  static void
  AcpiDmDumpRawDataBuffer (
      UINT8                   *Buffer,
      UINT32                  Length,
      UINT32                  Level)
  {
      UINT32                  Index;
      UINT32                  i;
      UINT32                  j;
  
  
      if (!Length)
      {
          return;
      }
  
      AcpiOsPrintf ("RawDataBuffer (0x%.2X)  // Vendor Data", Length);
  
      AcpiOsPrintf ("\n");
      AcpiDmIndent (Level + 1);
      AcpiOsPrintf ("{\n");
      AcpiDmIndent (Level + 2);
  
      for (i = 0; i < Length;)
      {
          for (j = 0; j < 8; j++)
          {
              Index = i + j;
              if (Index >= Length)
              {
                  goto Finish;
              }
  
              AcpiOsPrintf ("0x%2.2X", Buffer[Index]);
              if ((Index + 1) >= Length)
              {
                  goto Finish;
              }
  
              AcpiOsPrintf (", ");
          }
          AcpiOsPrintf ("\n");
          AcpiDmIndent (Level + 2);
  
          i += 8;
      }
  
  Finish:
      AcpiOsPrintf ("\n");
      AcpiDmIndent (Level + 1);
      AcpiOsPrintf ("}");
  }
  
  
  /*******************************************************************************
   *
   * FUNCTION:    AcpiDmGpioCommon
   *
   * PARAMETERS:  Resource            - Pointer to the resource descriptor
   *              Level               - Current source code indentation level
   *
   * RETURN:      None
   *
   * DESCRIPTION: Decode common parts of a GPIO Interrupt descriptor
   *
   ******************************************************************************/
  
  static void
  AcpiDmGpioCommon (
      AML_RESOURCE            *Resource,
      UINT32                  Level)
  {
      UINT32                  PinCount;
      UINT16                  *PinList;
      UINT8                   *VendorData;
      UINT32                  i;
  
  
      /* ResourceSource, ResourceSourceIndex, ResourceType */
  
      AcpiDmIndent (Level + 1);
      if (Resource->Gpio.ResSourceOffset)
      {
          AcpiUtPrintString (
              ACPI_ADD_PTR (char, Resource, Resource->Gpio.ResSourceOffset),
              ACPI_UINT16_MAX);
      }
  
      AcpiOsPrintf (", ");
      AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.ResSourceIndex);
      AcpiOsPrintf ("%s, ",
          AcpiGbl_ConsumeDecode [ACPI_GET_1BIT_FLAG (Resource->Gpio.Flags)]);
  
      /* Insert a descriptor name */
  
      AcpiDmDescriptorName ();
      AcpiOsPrintf (",");
  
      /* Dump the vendor data */
  
      if (Resource->Gpio.VendorOffset)
      {
          AcpiOsPrintf ("\n");
          AcpiDmIndent (Level + 1);
          VendorData = ACPI_ADD_PTR (UINT8, Resource,
              Resource->Gpio.VendorOffset);
  
          AcpiDmDumpRawDataBuffer (VendorData,
              Resource->Gpio.VendorLength, Level);
      }
  
      AcpiOsPrintf (")\n");
  
      /* Dump the interrupt list */
  
      AcpiDmIndent (Level + 1);
      AcpiOsPrintf ("{   // Pin list\n");
  
      PinCount = ((UINT32) (Resource->Gpio.ResSourceOffset -
          Resource->Gpio.PinTableOffset)) /
          sizeof (UINT16);
  
      PinList = (UINT16 *) ACPI_ADD_PTR (char, Resource,
          Resource->Gpio.PinTableOffset);
  
      for (i = 0; i < PinCount; i++)
      {
          AcpiDmIndent (Level + 2);
          AcpiOsPrintf ("0x%4.4X%s\n", PinList[i], ((i + 1) < PinCount) ? "," : "");
      }
  
      AcpiDmIndent (Level + 1);
      AcpiOsPrintf ("}\n");
  }
  
  
  /*******************************************************************************
   *
   * FUNCTION:    AcpiDmGpioIntDescriptor
   *
   * PARAMETERS:  Resource            - Pointer to the resource descriptor
   *              Length              - Length of the descriptor in bytes
   *              Level               - Current source code indentation level
   *
   * RETURN:      None
   *
   * DESCRIPTION: Decode a GPIO Interrupt descriptor
   *
   ******************************************************************************/
  
  static void
  AcpiDmGpioIntDescriptor (
      AML_RESOURCE            *Resource,
      UINT32                  Length,
      UINT32                  Level)
  {
  
      /* Dump the GpioInt-specific portion of the descriptor */
  
      /* EdgeLevel, ActiveLevel, Shared */
  
      AcpiDmIndent (Level);
      AcpiOsPrintf ("GpioInt (%s, %s, %s, ",
          AcpiGbl_HeDecode [ACPI_GET_1BIT_FLAG (Resource->Gpio.IntFlags)],
          AcpiGbl_LlDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->Gpio.IntFlags, 1)],
          AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 3)]);
  
      /* PinConfig, DebounceTimeout */
  
      if (Resource->Gpio.PinConfig <= 3)
      {
          AcpiOsPrintf ("%s, ",
              AcpiGbl_PpcDecode[Resource->Gpio.PinConfig]);
      }
      else
      {
          AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.PinConfig);
      }
      AcpiOsPrintf ("0x%4.4X,\n", Resource->Gpio.DebounceTimeout);
  
      /* Dump the GpioInt/GpioIo common portion of the descriptor */
  
      AcpiDmGpioCommon (Resource, Level);
  }
  
  
  /*******************************************************************************
   *
   * FUNCTION:    AcpiDmGpioIoDescriptor
   *
   * PARAMETERS:  Resource            - Pointer to the resource descriptor
   *              Length              - Length of the descriptor in bytes
   *              Level               - Current source code indentation level
   *
   * RETURN:      None
   *
   * DESCRIPTION: Decode a GPIO I/O descriptor
   *
   ******************************************************************************/
  
  static void
  AcpiDmGpioIoDescriptor (
      AML_RESOURCE            *Resource,
      UINT32                  Length,
      UINT32                  Level)
  {
  
      /* Dump the GpioIo-specific portion of the descriptor */
  
      /* Shared, PinConfig */
  
      AcpiDmIndent (Level);
      AcpiOsPrintf ("GpioIo (%s, ",
          AcpiGbl_ShrDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->Gpio.IntFlags, 3)]);
  
      if (Resource->Gpio.PinConfig <= 3)
      {
          AcpiOsPrintf ("%s, ",
              AcpiGbl_PpcDecode[Resource->Gpio.PinConfig]);
      }
      else
      {
          AcpiOsPrintf ("0x%2.2X, ", Resource->Gpio.PinConfig);
      }
  
      /* DebounceTimeout, DriveStrength, IoRestriction */
  
      AcpiOsPrintf ("0x%4.4X, ", Resource->Gpio.DebounceTimeout);
      AcpiOsPrintf ("0x%4.4X, ", Resource->Gpio.DriveStrength);
      AcpiOsPrintf ("%s,\n",
          AcpiGbl_IorDecode [ACPI_GET_2BIT_FLAG (Resource->Gpio.IntFlags)]);
  
      /* Dump the GpioInt/GpioIo common portion of the descriptor */
  
      AcpiDmGpioCommon (Resource, Level);
  }
  
  
  /*******************************************************************************
   *
   * FUNCTION:    AcpiDmGpioDescriptor
   *
   * PARAMETERS:  Resource            - Pointer to the resource descriptor
   *              Length              - Length of the descriptor in bytes
   *              Level               - Current source code indentation level
   *
   * RETURN:      None
   *
   * DESCRIPTION: Decode a GpioInt/GpioIo GPIO Interrupt/IO descriptor
   *
   ******************************************************************************/
  
  void
  AcpiDmGpioDescriptor (
      AML_RESOURCE            *Resource,
      UINT32                  Length,
      UINT32                  Level)
  {
      UINT8                   ConnectionType;
  
  
      ConnectionType = Resource->Gpio.ConnectionType;
  
      switch (ConnectionType)
      {
      case AML_RESOURCE_GPIO_TYPE_INT:
  
          AcpiDmGpioIntDescriptor (Resource, Length, Level);
          break;
  
      case AML_RESOURCE_GPIO_TYPE_IO:
  
          AcpiDmGpioIoDescriptor (Resource, Length, Level);
          break;
  
      default:
  
          AcpiOsPrintf ("Unknown GPIO type\n");
          break;
      }
  }
  
  
  /*******************************************************************************
   *
   * FUNCTION:    AcpiDmDumpSerialBusVendorData
   *
   * PARAMETERS:  Resource            - Pointer to the resource descriptor
   *
   * RETURN:      None
   *
   * DESCRIPTION: Dump optional serial bus vendor data
   *
   ******************************************************************************/
  
  static void
  AcpiDmDumpSerialBusVendorData (
      AML_RESOURCE            *Resource,
      UINT32                  Level)
  {
      UINT8                   *VendorData;
      UINT32                  VendorLength;
  
  
      /* Get the (optional) vendor data and length */
  
      switch (Resource->CommonSerialBus.Type)
      {
      case AML_RESOURCE_I2C_SERIALBUSTYPE:
  
          VendorLength = Resource->CommonSerialBus.TypeDataLength -
              AML_RESOURCE_I2C_MIN_DATA_LEN;
  
          VendorData = ACPI_ADD_PTR (UINT8, Resource,
              sizeof (AML_RESOURCE_I2C_SERIALBUS));
          break;
  
      case AML_RESOURCE_SPI_SERIALBUSTYPE:
  
          VendorLength = Resource->CommonSerialBus.TypeDataLength -
              AML_RESOURCE_SPI_MIN_DATA_LEN;
  
          VendorData = ACPI_ADD_PTR (UINT8, Resource,
              sizeof (AML_RESOURCE_SPI_SERIALBUS));
          break;
  
      case AML_RESOURCE_UART_SERIALBUSTYPE:
  
          VendorLength = Resource->CommonSerialBus.TypeDataLength -
              AML_RESOURCE_UART_MIN_DATA_LEN;
  
          VendorData = ACPI_ADD_PTR (UINT8, Resource,
              sizeof (AML_RESOURCE_UART_SERIALBUS));
          break;
  
      default:
  
          return;
      }
  
      /* Dump the vendor bytes as a RawDataBuffer object */
  
      AcpiDmDumpRawDataBuffer (VendorData, VendorLength, Level);
  }
  
  
  /*******************************************************************************
   *
   * FUNCTION:    AcpiDmI2cSerialBusDescriptor
   *
   * PARAMETERS:  Resource            - Pointer to the resource descriptor
   *              Length              - Length of the descriptor in bytes
   *              Level               - Current source code indentation level
   *
   * RETURN:      None
   *
   * DESCRIPTION: Decode a I2C serial bus descriptor
   *
   ******************************************************************************/
  
  static void
  AcpiDmI2cSerialBusDescriptor (
      AML_RESOURCE            *Resource,
      UINT32                  Length,
      UINT32                  Level)
  {
      UINT32                  ResourceSourceOffset;
  
  
      /* SlaveAddress, SlaveMode, ConnectionSpeed, AddressingMode */
  
      AcpiDmIndent (Level);
      AcpiOsPrintf ("I2cSerialBus (0x%4.4X, %s, 0x%8.8X,\n",
          Resource->I2cSerialBus.SlaveAddress,
          AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->I2cSerialBus.Flags)],
          Resource->I2cSerialBus.ConnectionSpeed);
  
      AcpiDmIndent (Level + 1);
      AcpiOsPrintf ("%s, ",
          AcpiGbl_AmDecode [ACPI_GET_1BIT_FLAG (Resource->I2cSerialBus.TypeSpecificFlags)]);
  
      /* ResourceSource is a required field */
  
      ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
          Resource->CommonSerialBus.TypeDataLength;
  
      AcpiUtPrintString (
          ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
          ACPI_UINT16_MAX);
  
      /* ResourceSourceIndex, ResourceUsage */
  
      AcpiOsPrintf (",\n");
      AcpiDmIndent (Level + 1);
      AcpiOsPrintf ("0x%2.2X, ", Resource->I2cSerialBus.ResSourceIndex);
  
      AcpiOsPrintf ("%s, ",
          AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->I2cSerialBus.Flags, 1)]);
  
      /* Insert a descriptor name */
  
      AcpiDmDescriptorName ();
      AcpiOsPrintf (",\n");
  
      /* Dump the vendor data */
  
      AcpiDmIndent (Level + 1);
      AcpiDmDumpSerialBusVendorData (Resource, Level);
      AcpiOsPrintf (")\n");
  }
  
  
  /*******************************************************************************
   *
   * FUNCTION:    AcpiDmSpiSerialBusDescriptor
   *
   * PARAMETERS:  Resource            - Pointer to the resource descriptor
   *              Length              - Length of the descriptor in bytes
   *              Level               - Current source code indentation level
   *
   * RETURN:      None
   *
   * DESCRIPTION: Decode a SPI serial bus descriptor
   *
   ******************************************************************************/
  
  static void
  AcpiDmSpiSerialBusDescriptor (
      AML_RESOURCE            *Resource,
      UINT32                  Length,
      UINT32                  Level)
  {
      UINT32                  ResourceSourceOffset;
  
  
      /* DeviceSelection, DeviceSelectionPolarity, WireMode, DataBitLength */
  
      AcpiDmIndent (Level);
      AcpiOsPrintf ("SpiSerialBus (0x%4.4X, %s, %s, 0x%2.2X,\n",
          Resource->SpiSerialBus.DeviceSelection,
          AcpiGbl_DpDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->SpiSerialBus.TypeSpecificFlags, 1)],
          AcpiGbl_WmDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.TypeSpecificFlags)],
          Resource->SpiSerialBus.DataBitLength);
  
      /* SlaveMode, ConnectionSpeed, ClockPolarity, ClockPhase */
  
      AcpiDmIndent (Level + 1);
      AcpiOsPrintf ("%s, 0x%8.8X, %s,\n",
          AcpiGbl_SmDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.Flags)],
          Resource->SpiSerialBus.ConnectionSpeed,
          AcpiGbl_CpoDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.ClockPolarity)]);
  
      AcpiDmIndent (Level + 1);
      AcpiOsPrintf ("%s, ",
          AcpiGbl_CphDecode [ACPI_GET_1BIT_FLAG (Resource->SpiSerialBus.ClockPhase)]);
  
      /* ResourceSource is a required field */
  
      ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
          Resource->CommonSerialBus.TypeDataLength;
  
      AcpiUtPrintString (
          ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
          ACPI_UINT16_MAX);
  
      /* ResourceSourceIndex, ResourceUsage */
  
      AcpiOsPrintf (",\n");
      AcpiDmIndent (Level + 1);
      AcpiOsPrintf ("0x%2.2X, ", Resource->SpiSerialBus.ResSourceIndex);
  
      AcpiOsPrintf ("%s, ",
          AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->SpiSerialBus.Flags, 1)]);
  
      /* Insert a descriptor name */
  
      AcpiDmDescriptorName ();
      AcpiOsPrintf (",\n");
  
      /* Dump the vendor data */
  
      AcpiDmIndent (Level + 1);
      AcpiDmDumpSerialBusVendorData (Resource, Level);
      AcpiOsPrintf (")\n");
  }
  
  
  /*******************************************************************************
   *
   * FUNCTION:    AcpiDmUartSerialBusDescriptor
   *
   * PARAMETERS:  Resource            - Pointer to the resource descriptor
   *              Length              - Length of the descriptor in bytes
   *              Level               - Current source code indentation level
   *
   * RETURN:      None
   *
   * DESCRIPTION: Decode a UART serial bus descriptor
   *
   ******************************************************************************/
  
  static void
  AcpiDmUartSerialBusDescriptor (
      AML_RESOURCE            *Resource,
      UINT32                  Length,
      UINT32                  Level)
  {
      UINT32                  ResourceSourceOffset;
  
  
      /* ConnectionSpeed, BitsPerByte, StopBits */
  
      AcpiDmIndent (Level);
      AcpiOsPrintf ("UartSerialBus (0x%8.8X, %s, %s,\n",
          Resource->UartSerialBus.DefaultBaudRate,
          AcpiGbl_BpbDecode [ACPI_EXTRACT_3BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 4)],
          AcpiGbl_SbDecode [ACPI_EXTRACT_2BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 2)]);
  
      /* LinesInUse, IsBigEndian, Parity, FlowControl */
  
      AcpiDmIndent (Level + 1);
      AcpiOsPrintf ("0x%2.2X, %s, %s, %s,\n",
          Resource->UartSerialBus.LinesEnabled,
          AcpiGbl_EdDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags, 7)],
          AcpiGbl_PtDecode [ACPI_GET_3BIT_FLAG (Resource->UartSerialBus.Parity)],
          AcpiGbl_FcDecode [ACPI_GET_2BIT_FLAG (Resource->UartSerialBus.TypeSpecificFlags)]);
  
      /* ReceiveBufferSize, TransmitBufferSize */
  
      AcpiDmIndent (Level + 1);
      AcpiOsPrintf ("0x%4.4X, 0x%4.4X, ",
          Resource->UartSerialBus.RxFifoSize,
          Resource->UartSerialBus.TxFifoSize);
  
      /* ResourceSource is a required field */
  
      ResourceSourceOffset = sizeof (AML_RESOURCE_COMMON_SERIALBUS) +
          Resource->CommonSerialBus.TypeDataLength;
  
      AcpiUtPrintString (
          ACPI_ADD_PTR (char, Resource, ResourceSourceOffset),
          ACPI_UINT16_MAX);
  
      /* ResourceSourceIndex, ResourceUsage */
  
      AcpiOsPrintf (",\n");
      AcpiDmIndent (Level + 1);
      AcpiOsPrintf ("0x%2.2X, ", Resource->UartSerialBus.ResSourceIndex);
  
      AcpiOsPrintf ("%s, ",
          AcpiGbl_ConsumeDecode [ACPI_EXTRACT_1BIT_FLAG (Resource->UartSerialBus.Flags, 1)]);
  
      /* Insert a descriptor name */
  
      AcpiDmDescriptorName ();
      AcpiOsPrintf (",\n");
  
      /* Dump the vendor data */
  
      AcpiDmIndent (Level + 1);
      AcpiDmDumpSerialBusVendorData (Resource, Level);
      AcpiOsPrintf (")\n");
  }
  
  
  /*******************************************************************************
   *
   * FUNCTION:    AcpiDmSerialBusDescriptor
   *
   * PARAMETERS:  Resource            - Pointer to the resource descriptor
   *              Length              - Length of the descriptor in bytes
   *              Level               - Current source code indentation level
   *
   * RETURN:      None
   *
   * DESCRIPTION: Decode a I2C/SPI/UART serial bus descriptor
   *
   ******************************************************************************/
  
  void
  AcpiDmSerialBusDescriptor (
      AML_RESOURCE            *Resource,
      UINT32                  Length,
      UINT32                  Level)
  {
  
      SerialBusResourceDispatch [Resource->CommonSerialBus.Type] (
          Resource, Length, Level);
  }
  
  #endif
  