mirror of https://github.com/acidanthera/audk.git
133 lines
3.2 KiB
C
133 lines
3.2 KiB
C
|
/** @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;
|
||
|
}
|