/** @file
  Arm DBG2 Table Generator

  Copyright (c) 2024, Arm Limited. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Reference(s):
  - Microsoft Debug Port Table 2 (DBG2) Specification - December 10, 2015.
**/

#include <ConfigurationManagerObject.h>
#include <Library/PL011UartLib.h>
#include <Protocol/SerialIo.h>
#include "Dbg2Generator.h"

/**
  Initialise the serial port to the specified settings.
  The serial port is re-configured only if the specified settings
  are different from the current settings.
  All unspecified settings will be set to the default values.

  @param  SerialPortInfo          CM_ARCH_COMMON_SERIAL_PORT_INFO object describing
                                  the serial port.
  @param  BaudRate                The baud rate of the serial device. If the
                                  baud rate is not supported, the speed will be
                                  reduced to the nearest supported one and the
                                  variable's value will be updated accordingly.
  @param  ReceiveFifoDepth        The number of characters the device will
                                  buffer on input.  Value of 0 will use the
                                  device's default FIFO depth.
  @param  Parity                  If applicable, this is the EFI_PARITY_TYPE
                                  that is computed or checked as each character
                                  is transmitted or received. If the device
                                  does not support parity, the value is the
                                  default parity value.
  @param  DataBits                The number of data bits in each character.
  @param  StopBits                If applicable, the EFI_STOP_BITS_TYPE number
                                  of stop bits per character.
                                  If the device does not support stop bits, the
                                  value is the default stop bit value.

  @retval RETURN_SUCCESS            All attributes were set correctly on the
                                    serial device.
  @retval RETURN_INVALID_PARAMETER  One or more of the attributes has an
                                    unsupported value.
**/
RETURN_STATUS
EFIAPI
Dbg2InitializePort (
  IN  CONST CM_ARCH_COMMON_SERIAL_PORT_INFO  *SerialPortInfo,
  IN OUT UINT64                              *BaudRate,
  IN OUT UINT32                              *ReceiveFifoDepth,
  IN OUT EFI_PARITY_TYPE                     *Parity,
  IN OUT UINT8                               *DataBits,
  IN OUT EFI_STOP_BITS_TYPE                  *StopBits
  )
{
  return PL011UartInitializePort (
           (UINTN)SerialPortInfo->BaseAddress,
           SerialPortInfo->Clock,
           BaudRate,
           ReceiveFifoDepth,
           Parity,
           DataBits,
           StopBits
           );
}
