/** @file
  Serial Port Library backed by SBI console.

  Common functionality shared by PrePiDxeSerialPortLibRiscVSbi and
  PrePiDxeSerialPortLibRiscVSbiRam implementations.

  Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include "Common.h"

/**
  Return whether the DBCN extension is implemented.

  @retval TRUE                  Extension is implemented.
  @retval FALSE                 Extension is not implemented.

**/
BOOLEAN
SbiImplementsDbcn (
  VOID
  )
{
  SBI_RET  Ret;

  Ret = SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, 1, SBI_EXT_DBCN);
  if ((TranslateError (Ret.Error) == EFI_SUCCESS) &&
      (Ret.Value != 0))
  {
    return TRUE;
  }

  return FALSE;
}

/**
  Return whether the legacy console putchar extension is implemented.

  @retval TRUE                  Extension is implemented.
  @retval FALSE                 Extension is not implemented.

**/
BOOLEAN
SbiImplementsLegacyPutchar (
  VOID
  )
{
  SBI_RET  Ret;

  Ret = SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, 1, SBI_EXT_0_1_CONSOLE_PUTCHAR);
  if ((TranslateError (Ret.Error) == EFI_SUCCESS) &&
      (Ret.Value != 0))
  {
    return TRUE;
  }

  return FALSE;
}

/**
  Write data from buffer to console via SBI legacy putchar extension.

  The number of bytes actually written to the SBI console is returned.
  If the return value is less than NumberOfBytes, then the write operation failed.

  @param  Buffer           The pointer to the data buffer to be written.
  @param  NumberOfBytes    The number of bytes to written to the serial device.

  @retval >=0              The number of bytes written to the serial device.
                           If this value is less than NumberOfBytes, then the
                           write operation failed.

**/
UINTN
SbiLegacyPutchar (
  IN  UINT8  *Buffer,
  IN  UINTN  NumberOfBytes
  )
{
  SBI_RET  Ret;
  UINTN    Index;

  for (Index = 0; Index < NumberOfBytes; Index++) {
    Ret =  SbiCall (SBI_EXT_0_1_CONSOLE_PUTCHAR, 0, 1, Buffer[Index]);
    if ((INT64)Ret.Error < 0) {
      break;
    }
  }

  return Index;
}

/**
  Write data from buffer to console via SBI DBCN.

  The number of bytes actually written to the SBI console is returned.
  If the return value is less than NumberOfBytes, then the write operation failed.

  @param  Buffer           The pointer to the data buffer to be written.
  @param  NumberOfBytes    The number of bytes to written to the serial device.

  @retval >=0              The number of bytes written to the serial device.
                           If this value is less than NumberOfBytes, then the
                           write operation failed.

**/
UINTN
SbiDbcnWrite (
  IN  UINT8  *Buffer,
  IN  UINTN  NumberOfBytes
  )
{
  SBI_RET  Ret;

  Ret = SbiCall (
          SBI_EXT_DBCN,
          SBI_EXT_DBCN_WRITE,
          3,
          NumberOfBytes,
          ((UINTN)Buffer),
          0
          );

  /*
   * May do partial writes. Don't bother decoding
   * Ret.Error as we're only interested in number of
   * bytes written to console.
   */
  return Ret.Value;
}
