/** @file
  DBG2 table parser

  Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Reference(s):
    - Microsoft Debug Port Table 2 (DBG2) Specification - December 10, 2015.
**/

#include <IndustryStandard/DebugPort2Table.h>
#include <Library/UefiLib.h>
#include "AcpiParser.h"
#include "AcpiTableParser.h"

// Local variables pointing to the table fields
STATIC CONST UINT32                  *OffsetDbgDeviceInfo;
STATIC CONST UINT32                  *NumberDbgDeviceInfo;
STATIC CONST UINT16                  *DbgDevInfoLen;
STATIC CONST UINT8                   *GasCount;
STATIC CONST UINT16                  *NameSpaceStringLength;
STATIC CONST UINT16                  *NameSpaceStringOffset;
STATIC CONST UINT16                  *OEMDataLength;
STATIC CONST UINT16                  *OEMDataOffset;
STATIC CONST UINT16                  *BaseAddrRegOffset;
STATIC CONST UINT16                  *AddrSizeOffset;
STATIC ACPI_DESCRIPTION_HEADER_INFO  AcpiHdrInfo;

/**
  This function validates the NameSpace string length.

  @param [in] Ptr     Pointer to the start of the buffer.
  @param [in] Context Pointer to context specific information e.g. this
                      could be a pointer to the ACPI table header.
**/
STATIC
VOID
EFIAPI
ValidateNameSpaceStrLen (
  IN UINT8  *Ptr,
  IN VOID   *Context
  )
{
  UINT16  NameSpaceStrLen;

  NameSpaceStrLen = *(UINT16 *)Ptr;

  if (NameSpaceStrLen < 2) {
    IncrementErrorCount ();
    Print (
      L"\nERROR: NamespaceString Length = %d. If no Namespace device exists, " \
      L"NamespaceString[] must contain a period '.'",
      NameSpaceStrLen
      );
  }
}

/// An ACPI_PARSER array describing the ACPI DBG2 table.
STATIC CONST ACPI_PARSER  Dbg2Parser[] = {
  PARSE_ACPI_HEADER (&AcpiHdrInfo),
  { L"OffsetDbgDeviceInfo",        4,     36, L"0x%x", NULL,
    (VOID **)&OffsetDbgDeviceInfo, NULL,  NULL },
  { L"NumberDbgDeviceInfo",        4,     40, L"%d",   NULL,
    (VOID **)&NumberDbgDeviceInfo, NULL,  NULL }
};

/// An ACPI_PARSER array describing the debug device information structure
/// header.
STATIC CONST ACPI_PARSER  DbgDevInfoHeaderParser[] = {
  { L"Revision", 1, 0, L"0x%x", NULL, NULL,                    NULL, NULL },
  { L"Length",   2, 1, L"%d",   NULL, (VOID **)&DbgDevInfoLen, NULL, NULL }
};

/// An ACPI_PARSER array describing the debug device information.
STATIC CONST ACPI_PARSER  DbgDevInfoParser[] = {
  { L"Revision",                        1, 0,  L"0x%x", NULL, NULL,                    NULL, NULL },
  { L"Length",                          2, 1,  L"%d",   NULL, NULL,                    NULL, NULL },

  { L"Generic Address Registers Count", 1, 3,  L"0x%x", NULL,
    (VOID **)&GasCount, NULL, NULL },
  { L"NameSpace String Length",         2, 4,  L"%d",   NULL,
    (VOID **)&NameSpaceStringLength, ValidateNameSpaceStrLen, NULL },
  { L"NameSpace String Offset",         2, 6,  L"0x%x", NULL,
    (VOID **)&NameSpaceStringOffset, NULL, NULL },
  { L"OEM Data Length",                 2, 8,  L"%d",   NULL, (VOID **)&OEMDataLength,
    NULL, NULL },
  { L"OEM Data Offset",                 2, 10, L"0x%x", NULL, (VOID **)&OEMDataOffset,
    NULL, NULL },

  { L"Port Type",                       2, 12, L"0x%x", NULL, NULL,                    NULL, NULL },
  { L"Port SubType",                    2, 14, L"0x%x", NULL, NULL,                    NULL, NULL },
  { L"Reserved",                        2, 16, L"%x",   NULL, NULL,                    NULL, NULL },

  { L"Base Address Register Offset",    2, 18, L"0x%x", NULL,
    (VOID **)&BaseAddrRegOffset, NULL, NULL },
  { L"Address Size Offset",             2, 20, L"0x%x", NULL,
    (VOID **)&AddrSizeOffset, NULL, NULL }
};

/**
  This function parses the debug device information structure.

  @param [in] Ptr     Pointer to the start of the buffer.
  @param [in] Length  Length of the debug device information structure.
**/
STATIC
VOID
EFIAPI
DumpDbgDeviceInfo (
  IN UINT8   *Ptr,
  IN UINT16  Length
  )
{
  UINT16  Index;
  UINT16  Offset;

  ParseAcpi (
    TRUE,
    2,
    "Debug Device Info",
    Ptr,
    Length,
    PARSER_PARAMS (DbgDevInfoParser)
    );

  // Check if the values used to control the parsing logic have been
  // successfully read.
  if ((GasCount == NULL)              ||
      (NameSpaceStringLength == NULL) ||
      (NameSpaceStringOffset == NULL) ||
      (OEMDataLength == NULL)         ||
      (OEMDataOffset == NULL)         ||
      (BaseAddrRegOffset == NULL)     ||
      (AddrSizeOffset == NULL))
  {
    IncrementErrorCount ();
    Print (
      L"ERROR: Insufficient Debug Device Information Structure length. " \
      L"Length = %d.\n",
      Length
      );
    return;
  }

  // GAS
  Index  = 0;
  Offset = *BaseAddrRegOffset;
  while ((Index++ < *GasCount) &&
         (Offset < Length))
  {
    PrintFieldName (4, L"BaseAddressRegister");
    Offset += (UINT16)DumpGasStruct (
                        Ptr + Offset,
                        4,
                        Length - Offset
                        );
  }

  // Make sure the array of address sizes corresponding to each GAS fit in the
  // Debug Device Information structure
  if ((*AddrSizeOffset + (*GasCount * sizeof (UINT32))) > Length) {
    IncrementErrorCount ();
    Print (
      L"ERROR: Invalid GAS count. GasCount = %d. RemainingBufferLength = %d. " \
      L"Parsing of the Debug Device Information structure aborted.\n",
      *GasCount,
      Length - *AddrSizeOffset
      );
    return;
  }

  // Address Size
  Index  = 0;
  Offset = *AddrSizeOffset;
  while ((Index++ < *GasCount) &&
         (Offset < Length))
  {
    PrintFieldName (4, L"Address Size");
    Print (L"0x%x\n", *((UINT32 *)(Ptr + Offset)));
    Offset += sizeof (UINT32);
  }

  // NameSpace String
  Index  = 0;
  Offset = *NameSpaceStringOffset;
  PrintFieldName (4, L"NameSpace String");
  while ((Index++ < *NameSpaceStringLength) &&
         (Offset < Length))
  {
    Print (L"%c", *(Ptr + Offset));
    Offset++;
  }

  Print (L"\n");

  // OEM Data
  if (*OEMDataOffset != 0) {
    Index  = 0;
    Offset = *OEMDataOffset;
    PrintFieldName (4, L"OEM Data");
    while ((Index++ < *OEMDataLength) &&
           (Offset < Length))
    {
      Print (L"%x ", *(Ptr + Offset));
      if ((Index & 7) == 0) {
        Print (L"\n%-*s   ", OUTPUT_FIELD_COLUMN_WIDTH, L"");
      }

      Offset++;
    }

    Print (L"\n");
  }
}

/**
  This function parses the ACPI DBG2 table.
  When trace is enabled this function parses the DBG2 table and
  traces the ACPI table fields.

  This function also performs validation of the ACPI table fields.

  @param [in] Trace              If TRUE, trace the ACPI fields.
  @param [in] Ptr                Pointer to the start of the buffer.
  @param [in] AcpiTableLength    Length of the ACPI table.
  @param [in] AcpiTableRevision  Revision of the ACPI table.
**/
VOID
EFIAPI
ParseAcpiDbg2 (
  IN BOOLEAN  Trace,
  IN UINT8    *Ptr,
  IN UINT32   AcpiTableLength,
  IN UINT8    AcpiTableRevision
  )
{
  UINT32  Offset;
  UINT32  Index;

  if (!Trace) {
    return;
  }

  Offset = ParseAcpi (
             TRUE,
             0,
             "DBG2",
             Ptr,
             AcpiTableLength,
             PARSER_PARAMS (Dbg2Parser)
             );

  // Check if the values used to control the parsing logic have been
  // successfully read.
  if ((OffsetDbgDeviceInfo == NULL) ||
      (NumberDbgDeviceInfo == NULL))
  {
    IncrementErrorCount ();
    Print (
      L"ERROR: Insufficient table length. AcpiTableLength = %d\n",
      AcpiTableLength
      );
    return;
  }

  Offset = *OffsetDbgDeviceInfo;
  Index  = 0;

  while (Index++ < *NumberDbgDeviceInfo) {
    // Parse the Debug Device Information Structure header to obtain Length
    ParseAcpi (
      FALSE,
      0,
      NULL,
      Ptr + Offset,
      AcpiTableLength - Offset,
      PARSER_PARAMS (DbgDevInfoHeaderParser)
      );

    // Check if the values used to control the parsing logic have been
    // successfully read.
    if (DbgDevInfoLen == NULL) {
      IncrementErrorCount ();
      Print (
        L"ERROR: Insufficient remaining table buffer length to read the " \
        L"Debug Device Information structure's 'Length' field. " \
        L"RemainingTableBufferLength = %d.\n",
        AcpiTableLength - Offset
        );
      return;
    }

    // Validate Debug Device Information Structure length
    if ((*DbgDevInfoLen == 0) ||
        ((Offset + (*DbgDevInfoLen)) > AcpiTableLength))
    {
      IncrementErrorCount ();
      Print (
        L"ERROR: Invalid Debug Device Information Structure length. " \
        L"Length = %d. Offset = %d. AcpiTableLength = %d.\n",
        *DbgDevInfoLen,
        Offset,
        AcpiTableLength
        );
      return;
    }

    DumpDbgDeviceInfo (Ptr + Offset, (*DbgDevInfoLen));
    Offset += (*DbgDevInfoLen);
  }
}
