/** @file
  SPCR table parser

  Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
  This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution.  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

  @par Reference(s):
    - Microsoft Serial Port Console Redirection Table
      Specification - Version 1.03 - August 10, 2015.
**/

#include <IndustryStandard/Acpi.h>
#include <IndustryStandard/SerialPortConsoleRedirectionTable.h>
#include <Library/UefiLib.h>
#include "AcpiParser.h"
#include "AcpiTableParser.h"

// Local variables
STATIC ACPI_DESCRIPTION_HEADER_INFO AcpiHdrInfo;

/**
  This function validates the Interrupt Type.

  @param [in] Ptr     Pointer to the start of the field data.
  @param [in] Context Pointer to context specific information e.g. this
                      could be a pointer to the ACPI table header.
**/
STATIC
VOID
EFIAPI
ValidateInterruptType (
  IN UINT8* Ptr,
  IN VOID*  Context
  );

/**
  This function validates the Irq.

  @param [in] Ptr     Pointer to the start of the field data.
  @param [in] Context Pointer to context specific information e.g. this
                      could be a pointer to the ACPI table header.
**/
STATIC
VOID
EFIAPI
ValidateIrq (
  IN UINT8* Ptr,
  IN VOID*  Context
  );

/**
  An ACPI_PARSER array describing the ACPI SPCR Table.
**/
STATIC CONST ACPI_PARSER SpcrParser[] = {
  PARSE_ACPI_HEADER (&AcpiHdrInfo),
  {L"Interface Type", 1, 36, L"%d", NULL, NULL, NULL, NULL},
  {L"Reserved", 3, 37, L"%x %x %x", Dump3Chars, NULL, NULL, NULL},
  {L"Base Address", 12, 40, NULL, DumpGas, NULL, NULL, NULL},
  {L"Interrupt Type", 1, 52, L"%d", NULL, NULL, ValidateInterruptType, NULL},
  {L"IRQ", 1, 53, L"%d", NULL, NULL, ValidateIrq, NULL},
  {L"Global System Interrupt", 4, 54, L"0x%x", NULL, NULL, NULL, NULL},
  {L"Baud Rate", 1, 58, L"%d", NULL, NULL, NULL, NULL},
  {L"Parity", 1, 59, L"%d", NULL, NULL, NULL, NULL},
  {L"Stop Bits", 1, 60, L"%d", NULL, NULL, NULL, NULL},
  {L"Flow Control", 1, 61, L"0x%x", NULL, NULL, NULL, NULL},
  {L"Terminal Type", 1, 62, L"%d", NULL, NULL, NULL, NULL},
  {L"Reserved", 1, 63, L"%x", NULL, NULL, NULL, NULL},

  {L"PCI Device ID", 2, 64, L"0x%x", NULL, NULL, NULL, NULL},
  {L"PCI Vendor ID", 2, 66, L"0x%x", NULL, NULL, NULL, NULL},
  {L"PCI Bus Number", 1, 68, L"0x%x", NULL, NULL, NULL, NULL},
  {L"PCI Device Number", 1, 69, L"0x%x", NULL, NULL, NULL, NULL},
  {L"PCI Function Number", 1, 70, L"0x%x", NULL, NULL, NULL, NULL},
  {L"PCI Flags", 4, 71, L"0x%x", NULL, NULL, NULL, NULL},
  {L"PCI Segment", 1, 75, L"0x%x", NULL, NULL, NULL, NULL},
  {L"Reserved", 4, 76, L"%x", NULL, NULL, NULL, NULL}
};

/**
  This function validates the Interrupt Type.

  @param [in] Ptr     Pointer to the start of the field data.
  @param [in] Context Pointer to context specific information e.g. this
                      could be a pointer to the ACPI table header.
**/
STATIC
VOID
EFIAPI
ValidateInterruptType (
  IN UINT8* Ptr,
  IN VOID*  Context
  )
{
#if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)
  UINT8 InterruptType;

  InterruptType = *Ptr;

  if (InterruptType !=
        EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_GIC) {
    IncrementErrorCount ();
    Print (
      L"\nERROR: InterruptType = %d. This must be 8 on ARM Platforms",
      InterruptType
      );
  }
#endif
}

/**
  This function validates the Irq.

  @param [in] Ptr     Pointer to the start of the field data.
  @param [in] Context Pointer to context specific information e.g. this
                      could be a pointer to the ACPI table header.
**/
STATIC
VOID
EFIAPI
ValidateIrq (
  IN UINT8* Ptr,
  IN VOID*  Context
  )
{
#if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)
  UINT8 Irq;

  Irq = *Ptr;

  if (Irq != 0) {
    IncrementErrorCount ();
    Print (
      L"\nERROR: Irq = %d. This must be zero on ARM Platforms\n",
      Irq
      );
  }
#endif
}

/**
  This function parses the ACPI SPCR table.
  When trace is enabled this function parses the SPCR table and
  traces the ACPI table fields.

  This function also performs validations 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
ParseAcpiSpcr (
  IN BOOLEAN Trace,
  IN UINT8*  Ptr,
  IN UINT32  AcpiTableLength,
  IN UINT8   AcpiTableRevision
  )
{
  if (!Trace) {
    return;
  }

  // Dump the SPCR
  ParseAcpi (
    TRUE,
    0,
    "SPCR",
    Ptr,
    AcpiTableLength,
    PARSER_PARAMS (SpcrParser)
    );
}
