summaryrefslogtreecommitdiffstats
path: root/MdePkg/Library/BaseSerialPortLibRiscVSbiLib/Common.c
diff options
context:
space:
mode:
Diffstat (limited to 'MdePkg/Library/BaseSerialPortLibRiscVSbiLib/Common.c')
-rw-r--r--MdePkg/Library/BaseSerialPortLibRiscVSbiLib/Common.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/MdePkg/Library/BaseSerialPortLibRiscVSbiLib/Common.c b/MdePkg/Library/BaseSerialPortLibRiscVSbiLib/Common.c
new file mode 100644
index 0000000000..4926ac675b
--- /dev/null
+++ b/MdePkg/Library/BaseSerialPortLibRiscVSbiLib/Common.c
@@ -0,0 +1,132 @@
+/** @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;
+}