From nobody Sat Feb 7 05:01:34 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+102505+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+102505+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1680626647; cv=none; d=zohomail.com; s=zohoarc; b=Yj9bdPEHbCvnOzBbl7cHRSkNVKTJQsSBkT6igZrlwIo1U0rfrPWKG2kQ2tP6d1dVyokNnW5TTW/zZLoZkM6vlwLBKFin4kmoF5586RjmAWZHuSonGFv3r5XU9EC3OyzbtBlvn1WSWyVfjmeeMTghvP/CIyWBUk9ughw9atI+diQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1680626647; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=WSwYC870ED9Dog/4/1oqAzInlBVEZiyzls1phCTwTfw=; b=E+buOozPsTuo0sAhtVmdZLwZVvjRD4Jp2s+Vn7BQeVYMnrnUil96jx+npy7mo8cy/tujSo/a5TeY+/dXY4c8lUq7xMQ32iUZSfBul8y+yIuNXfgjsfJmUXPeLHjGEH2T8A9gCL4LA8OZtMAueV5sGE/oiuH5AoQxrPfgFi7C/zc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+102505+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1680626647469946.085691641002; Tue, 4 Apr 2023 09:44:07 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id PWCHYY1788612xSEAoGLfFlO; Tue, 04 Apr 2023 09:44:07 -0700 X-Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by mx.groups.io with SMTP id smtpd.web10.107004.1680626644810205254 for ; Tue, 04 Apr 2023 09:44:06 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10670"; a="428527771" X-IronPort-AV: E=Sophos;i="5.98,318,1673942400"; d="scan'208";a="428527771" X-Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Apr 2023 09:44:05 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10670"; a="750987377" X-IronPort-AV: E=Sophos;i="5.98,318,1673942400"; d="scan'208";a="750987377" X-Received: from awarkent-mobl1.amr.corp.intel.com ([10.212.50.115]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Apr 2023 09:44:04 -0700 From: "Andrei Warkentin" To: devel@edk2.groups.io Cc: Andrei Warkentin , Daniel Schaefer , Sunil V L , Michael D Kinney , Liming Gao , Zhiguang Liu , Gerd Hoffmann Subject: [edk2-devel] [PATCH v6 2/3] MdePkg: add SBI-based SerialPortLib for RISC-V Date: Tue, 4 Apr 2023 11:43:58 -0500 Message-Id: <20230404164359.25852-3-andrei.warkentin@intel.com> In-Reply-To: <20230404164359.25852-1-andrei.warkentin@intel.com> References: <20230404164359.25852-1-andrei.warkentin@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,andrei.warkentin@intel.com X-Gm-Message-State: H8Uyx4LCWRsMUlE9y8LM15xRx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1680626647; bh=du34amQT2nPESiJB0q55o1dBBciB1hnwAjN2LQJW9Aw=; h=Cc:Date:From:Reply-To:Subject:To; b=XXageNfcQyv2UQ0PWlFr59J18ZbTBBl9tTjy3RaBEtOgUBAbWGN4EbnBHeAVJYyF51H 8nRTdZQrRMAlbwVdN1x/u7ZxJjG4D8pDXLMd8mawsV4Au5nGYFCpZ++liOWRyFqaTy+TJ 4pZ7BRT3db+G1aGbtrd3FIm28jvsoqZ8IbA= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1680626649527100015 Content-Type: text/plain; charset="utf-8" These are implementations of SerialPortLib using SBI console services. - BaseSerialPortLibRiscVSbiLib is appropriate for SEC/PEI (XIP) environments - BaseSerialPortLibRiscVSbiLibRam is appropriate for PrePI/DXE environments Tested with: - Qemu RiscVVirt (non-DBCN case, backed by UART) - TinyEMU + RiscVVirt (non-DBCN case, HTIF) - TinyEMU + RiscVVirt (DBCN case, HTIF) Cc: Daniel Schaefer Cc: Sunil V L Cc: Michael D Kinney Cc: Liming Gao Cc: Zhiguang Liu Acked-by: Gerd Hoffmann Signed-off-by: Andrei Warkentin --- MdePkg/MdePkg.dsc = | 2 + MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPortLibRiscVSbiLib.i= nf | 39 +++ MdePkg/Library/BaseSerialPortLibRiscVSbiLibRam/BaseSerialPortLibRiscVSbiLi= bRam.inf | 36 +++ MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPortLibRiscVSbiLib.c= | 233 ++++++++++++++++ MdePkg/Library/BaseSerialPortLibRiscVSbiLibRam/BaseSerialPortLibRiscVSbiLi= bRam.c | 288 ++++++++++++++++++++ MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPortLibRiscVSbiLib.u= ni | 16 ++ MdePkg/Library/BaseSerialPortLibRiscVSbiLibRam/BaseSerialPortLibRiscVSbiLi= bRam.uni | 16 ++ 7 files changed, 630 insertions(+) diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index 0ac7618b4623..ceccc078ff04 100644 --- a/MdePkg/MdePkg.dsc +++ b/MdePkg/MdePkg.dsc @@ -192,5 +192,7 @@ [Components.ARM, Components.AARCH64] =20 [Components.RISCV64] MdePkg/Library/BaseRiscVSbiLib/BaseRiscVSbiLib.inf + MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPortLibRiscVSbiLib= .inf + MdePkg/Library/BaseSerialPortLibRiscVSbiLibRam/BaseSerialPortLibRiscVSbi= LibRam.inf =20 [BuildOptions] diff --git a/MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPortLibR= iscVSbiLib.inf b/MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPort= LibRiscVSbiLib.inf new file mode 100644 index 000000000000..09cf59f190f6 --- /dev/null +++ b/MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPortLibRiscVSbi= Lib.inf @@ -0,0 +1,39 @@ +## @file +# Serial Port Library backed by SBI console. +# +# Meant for SEC and PEI (XIP) environments. +# +# Due to limitations of SBI console interface and XIP environments +# (on use of globals), this library instance does not implement reading +# and polling the serial port. See PrePiDxeSerialPortLibRiscVSbi for +# the full-featured variant meant for PrePi and DXE environments. +# +# Copyright (c) 2023, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION =3D 0x0001001B + BASE_NAME =3D BaseSerialPortLibRiscVSbiLib + MODULE_UNI_FILE =3D BaseSerialPortLibRiscVSbiLib.uni + FILE_GUID =3D 639fad38-4bfd-4eb9-9f09-e97c7947d480 + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D SerialPortLib | SEC PEI_CORE PEIM + + +# +# VALID_ARCHITECTURES =3D RISCV64 +# + +[Sources] + BaseSerialPortLibRiscVSbiLib.c + +[Packages] + MdePkg/MdePkg.dec + +[LibraryClasses] + RiscVSbiLib diff --git a/MdePkg/Library/BaseSerialPortLibRiscVSbiLibRam/BaseSerialPortL= ibRiscVSbiLibRam.inf b/MdePkg/Library/BaseSerialPortLibRiscVSbiLibRam/BaseS= erialPortLibRiscVSbiLibRam.inf new file mode 100644 index 000000000000..b7ad1548a309 --- /dev/null +++ b/MdePkg/Library/BaseSerialPortLibRiscVSbiLibRam/BaseSerialPortLibRiscV= SbiLibRam.inf @@ -0,0 +1,36 @@ +## @file +# Serial Port Library backed by SBI console. +# +# Meant for PrePi and DXE environments (where globals are allowed). See +# BaseSerialPortLibRiscVSbiLib for a reduced variant appropriate for SEC +# and PEI (XIP) environments. +# +# Copyright (c) 2023, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION =3D 0x0001001B + BASE_NAME =3D BaseSerialPortLibRiscVSbiLibRam + MODULE_UNI_FILE =3D BaseSerialPortLibRiscVSbiLibRam.uni + FILE_GUID =3D 872af743-ab56-45b4-a065-602567f4820c + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D SerialPortLib | SEC DXE_CORE DXE_DRIV= ER DXE_RUNTIME_DRIVER UEFI_DRIVER UEFI_APPLICATION + + +# +# VALID_ARCHITECTURES =3D RISCV64 +# + +[Sources] + BaseSerialPortLibRiscVSbiLibRam.c + +[Packages] + MdePkg/MdePkg.dec + +[LibraryClasses] + RiscVSbiLib diff --git a/MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPortLibR= iscVSbiLib.c b/MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPortLi= bRiscVSbiLib.c new file mode 100644 index 000000000000..0ad5931be3ae --- /dev/null +++ b/MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPortLibRiscVSbi= Lib.c @@ -0,0 +1,233 @@ +/** @file + Serial Port Library backed by SBI console. + + Meant for SEC and PEI (XIP) environments. + + Due to limitations of SBI console interface and XIP environments + (on use of globals), this library instance does not implement reading + and polling the serial port. See PrePiDxeSerialPortLibRiscVSbi for + the full-featured variant meant for PrePi and DXE environments. + + Copyright (c) 2023, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include + +/** + Initialize the serial device hardware. + + If no initialization is required, then return RETURN_SUCCESS. + If the serial device was successfully initialized, then return RETURN_SU= CCESS. + If the serial device could not be initialized, then return RETURN_DEVICE= _ERROR. + + @retval RETURN_SUCCESS The serial device was initialized. + @retval RETURN_DEVICE_ERROR The serial device could not be initialized. + +**/ +RETURN_STATUS +EFIAPI +SerialPortInitialize ( + VOID + ) +{ + return RETURN_SUCCESS; +} + +/** + Write data from buffer to serial device. + + Writes NumberOfBytes data bytes from Buffer to the serial device. + The number of bytes actually written to the serial device is returned. + If the return value is less than NumberOfBytes, then the write operation= failed. + If Buffer is NULL, then ASSERT(). + If NumberOfBytes is zero, then return 0. + + @param Buffer The pointer to the data buffer to be written. + @param NumberOfBytes The number of bytes to written to the serial de= vice. + + @retval 0 NumberOfBytes is 0. + @retval >0 The number of bytes written to the serial devic= e. + If this value is less than NumberOfBytes, then = the write operation failed. + +**/ +UINTN +EFIAPI +SerialPortWrite ( + IN UINT8 *Buffer, + IN UINTN NumberOfBytes + ) +{ + SBI_RET Ret; + UINTN Index; + + Ret =3D SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, 1, SBI_EXT_DBCN); + if ((TranslateError (Ret.Error) =3D=3D EFI_SUCCESS) && + (Ret.Value !=3D 0)) + { + Ret =3D SbiCall ( + SBI_EXT_DBCN, + SBI_EXT_DBCN_WRITE, + 3, + NumberOfBytes, + ((UINTN)Buffer), + 0 + ); + if (TranslateError (Ret.Error) !=3D EFI_SUCCESS) { + return 0; + } + + return Ret.Value; + } + + Ret =3D SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, 1, SBI_EXT_0_1_CO= NSOLE_PUTCHAR); + if ((TranslateError (Ret.Error) =3D=3D EFI_SUCCESS) && + (Ret.Value !=3D 0)) + { + for (Index =3D 0; Index < NumberOfBytes; Index++) { + SbiCall (SBI_EXT_0_1_CONSOLE_PUTCHAR, 0, 1, Buffer[Index]); + } + + return Index; + } + + /* + * Neither DBCN or legacy extension were present. + */ + return NumberOfBytes; +} + +/** + Read data from serial device and save the datas in buffer. + + Reads NumberOfBytes data bytes from a serial device into the buffer + specified by Buffer. The number of bytes actually read is returned. + If the return value is less than NumberOfBytes, then the rest operation = failed. + If Buffer is NULL, then ASSERT(). + If NumberOfBytes is zero, then return 0. + + @param Buffer The pointer to the data buffer to store the dat= a read from the serial device. + @param NumberOfBytes The number of bytes which will be read. + + @retval 0 Read data failed; No data is to be read. + @retval >0 The actual number of bytes read from serial dev= ice. + +**/ +UINTN +EFIAPI +SerialPortRead ( + OUT UINT8 *Buffer, + IN UINTN NumberOfBytes + ) +{ + return 0; +} + +/** + Polls a serial device to see if there is any data waiting to be read. + + Polls a serial device to see if there is any data waiting to be read. + If there is data waiting to be read from the serial device, then TRUE is= returned. + If there is no data waiting to be read from the serial device, then FALS= E is returned. + + @retval TRUE Data is waiting to be read from the serial devi= ce. + @retval FALSE There is no data waiting to be read from the se= rial device. + +**/ +BOOLEAN +EFIAPI +SerialPortPoll ( + VOID + ) +{ + return FALSE; +} + +/** + Sets the control bits on a serial device. + + @param Control Sets the bits of Control that are settable. + + @retval RETURN_SUCCESS The new control bits were set on the seria= l device. + @retval RETURN_UNSUPPORTED The serial device does not support this op= eration. + @retval RETURN_DEVICE_ERROR The serial device is not functioning corre= ctly. + +**/ +RETURN_STATUS +EFIAPI +SerialPortSetControl ( + IN UINT32 Control + ) +{ + return RETURN_SUCCESS; +} + +/** + Retrieve the status of the control bits on a serial device. + + @param Control A pointer to return the current control si= gnals from the serial device. + + @retval RETURN_SUCCESS The control bits were read from the serial= device. + @retval RETURN_UNSUPPORTED The serial device does not support this op= eration. + @retval RETURN_DEVICE_ERROR The serial device is not functioning corre= ctly. + +**/ +RETURN_STATUS +EFIAPI +SerialPortGetControl ( + OUT UINT32 *Control + ) +{ + *Control =3D 0; + return RETURN_SUCCESS; +} + +/** + Sets the baud rate, receive FIFO depth, transmit/receice time out, parit= y, + data bits, and stop bits on a serial device. + + @param BaudRate The requested baud rate. A BaudRate value of 0= will use the + device's default interface speed. + On output, the value actually set. + @param ReveiveFifoDepth The requested depth of the FIFO on the receive= side of the + serial interface. A ReceiveFifoDepth value of = 0 will use + the device's default FIFO depth. + On output, the value actually set. + @param Timeout The requested time out for a single character = in microseconds. + This timeout applies to both the transmit and = receive side of the + interface. A Timeout value of 0 will use the d= evice's default time + out value. + On output, the value actually set. + @param Parity The type of parity to use on this serial devic= e. A Parity value of + DefaultParity will use the device's default pa= rity value. + On output, the value actually set. + @param DataBits The number of data bits to use on the serial d= evice. A DataBits + vaule of 0 will use the device's default data = bit setting. + On output, the value actually set. + @param StopBits The number of stop bits to use on this serial = device. A StopBits + value of DefaultStopBits will use the device's= default number of + stop bits. + On output, the value actually set. + + @retval RETURN_SUCCESS The new attributes were set on the ser= ial device. + @retval RETURN_UNSUPPORTED The serial device does not support thi= s operation. + @retval RETURN_INVALID_PARAMETER One or more of the attributes has an u= nsupported value. + @retval RETURN_DEVICE_ERROR The serial device is not functioning c= orrectly. + +**/ +RETURN_STATUS +EFIAPI +SerialPortSetAttributes ( + IN OUT UINT64 *BaudRate, + IN OUT UINT32 *ReceiveFifoDepth, + IN OUT UINT32 *Timeout, + IN OUT EFI_PARITY_TYPE *Parity, + IN OUT UINT8 *DataBits, + IN OUT EFI_STOP_BITS_TYPE *StopBits + ) +{ + return RETURN_SUCCESS; +} diff --git a/MdePkg/Library/BaseSerialPortLibRiscVSbiLibRam/BaseSerialPortL= ibRiscVSbiLibRam.c b/MdePkg/Library/BaseSerialPortLibRiscVSbiLibRam/BaseSer= ialPortLibRiscVSbiLibRam.c new file mode 100644 index 000000000000..74277241bba4 --- /dev/null +++ b/MdePkg/Library/BaseSerialPortLibRiscVSbiLibRam/BaseSerialPortLibRiscV= SbiLibRam.c @@ -0,0 +1,288 @@ +/** @file + Serial Port Library backed by SBI console. + + Meant for PrePi and DXE environments (where globals are allowed). See + BaseSerialPortLibRiscVSbiLib for a reduced variant appropriate for SEC + and PEI (XIP) environments. + + Copyright (c) 2023, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include + +STATIC BOOLEAN mHaveDbcn =3D FALSE; +STATIC BOOLEAN mHaveLegacyPutchar =3D FALSE; +STATIC BOOLEAN mHaveLegacyGetchar =3D FALSE; +STATIC INT64 mLastGetChar =3D -1; + +/** + Initialize the serial device hardware. + + If no initialization is required, then return RETURN_SUCCESS. + If the serial device was successfully initialized, then return RETURN_SU= CCESS. + If the serial device could not be initialized, then return RETURN_DEVICE= _ERROR. + + @retval RETURN_SUCCESS The serial device was initialized. + @retval RETURN_DEVICE_ERROR The serial device could not be initialized. + +**/ +RETURN_STATUS +EFIAPI +SerialPortInitialize ( + VOID + ) +{ + SBI_RET Ret; + + Ret =3D SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, 1, SBI_EXT_DBCN); + if ((TranslateError (Ret.Error) =3D=3D EFI_SUCCESS) && + (Ret.Value !=3D 0)) + { + mHaveDbcn =3D TRUE; + } else { + Ret =3D SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, 1, SBI_EXT_0_1_= CONSOLE_PUTCHAR); + if ((TranslateError (Ret.Error) =3D=3D EFI_SUCCESS) && + (Ret.Value !=3D 0)) + { + mHaveLegacyPutchar =3D TRUE; + } + + Ret =3D SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, 1, SBI_EXT_0_1_= CONSOLE_GETCHAR); + if ((TranslateError (Ret.Error) =3D=3D EFI_SUCCESS) && + (Ret.Value !=3D 0)) + { + mHaveLegacyGetchar =3D TRUE; + } + } + + return RETURN_SUCCESS; +} + +/** + Write data from buffer to serial device. + + Writes NumberOfBytes data bytes from Buffer to the serial device. + The number of bytes actually written to the serial device is returned. + If the return value is less than NumberOfBytes, then the write operation= failed. + If Buffer is NULL, then ASSERT(). + If NumberOfBytes is zero, then return 0. + + @param Buffer The pointer to the data buffer to be written. + @param NumberOfBytes The number of bytes to written to the serial de= vice. + + @retval 0 NumberOfBytes is 0. + @retval >0 The number of bytes written to the serial devic= e. + If this value is less than NumberOfBytes, then = the write operation failed. + +**/ +UINTN +EFIAPI +SerialPortWrite ( + IN UINT8 *Buffer, + IN UINTN NumberOfBytes + ) +{ + UINTN Index; + + if (mHaveDbcn) { + SBI_RET Ret; + Ret =3D SbiCall ( + SBI_EXT_DBCN, + SBI_EXT_DBCN_WRITE, + 3, + NumberOfBytes, + ((UINTN)Buffer), + 0 + ); + if (TranslateError (Ret.Error) !=3D EFI_SUCCESS) { + return 0; + } + + return Ret.Value; + } else if (mHaveLegacyPutchar) { + for (Index =3D 0; Index < NumberOfBytes; Index++) { + SbiCall (SBI_EXT_0_1_CONSOLE_PUTCHAR, 0, 1, Buffer[Index]); + } + + return Index; + } + + /* + * Neither DBCN or legacy extension were present. + */ + return NumberOfBytes; +} + +/** + Read data from serial device and save the datas in buffer. + + Reads NumberOfBytes data bytes from a serial device into the buffer + specified by Buffer. The number of bytes actually read is returned. + If the return value is less than NumberOfBytes, then the rest operation = failed. + If Buffer is NULL, then ASSERT(). + If NumberOfBytes is zero, then return 0. + + @param Buffer The pointer to the data buffer to store the dat= a read from the serial device. + @param NumberOfBytes The number of bytes which will be read. + + @retval 0 Read data failed; No data is to be read. + @retval >0 The actual number of bytes read from serial dev= ice. + +**/ +UINTN +EFIAPI +SerialPortRead ( + OUT UINT8 *Buffer, + IN UINTN NumberOfBytes + ) +{ + UINTN Index; + + Index =3D 0; + while ((Index < NumberOfBytes) && SerialPortPoll ()) { + Buffer[Index++] =3D (UINT8)mLastGetChar; + mLastGetChar =3D -1; + } + + return Index; +} + +/** + Polls a serial device to see if there is any data waiting to be read. + + Polls a serial device to see if there is any data waiting to be read. + If there is data waiting to be read from the serial device, then TRUE is= returned. + If there is no data waiting to be read from the serial device, then FALS= E is returned. + + @retval TRUE Data is waiting to be read from the serial devi= ce. + @retval FALSE There is no data waiting to be read from the se= rial device. + +**/ +BOOLEAN +EFIAPI +SerialPortPoll ( + VOID + ) +{ + /* + * Careful. OpenSBI with HTIF console will return -1 followed by -2 + * if there is no character received. So just check for values >=3D 0. + */ + + if (mLastGetChar >=3D 0) { + return TRUE; + } + + if (mHaveDbcn) { + UINT8 Buffer; + SBI_RET Ret; + + Ret =3D SbiCall ( + SBI_EXT_DBCN, + SBI_EXT_DBCN_READ, + 3, + 1, + ((UINTN)&Buffer), + 0 + ); + if ((TranslateError (Ret.Error) =3D=3D EFI_SUCCESS) && + (Ret.Value =3D=3D 1)) + { + mLastGetChar =3D Buffer; + } + } else if (mHaveLegacyGetchar) { + mLastGetChar =3D (INT64)SbiCall (SBI_EXT_0_1_CONSOLE_GETCHAR, 0, 0).Er= ror; + } + + return mLastGetChar >=3D 0; +} + +/** + Sets the control bits on a serial device. + + @param Control Sets the bits of Control that are settable. + + @retval RETURN_SUCCESS The new control bits were set on the seria= l device. + @retval RETURN_UNSUPPORTED The serial device does not support this op= eration. + @retval RETURN_DEVICE_ERROR The serial device is not functioning corre= ctly. + +**/ +RETURN_STATUS +EFIAPI +SerialPortSetControl ( + IN UINT32 Control + ) +{ + return RETURN_SUCCESS; +} + +/** + Retrieve the status of the control bits on a serial device. + + @param Control A pointer to return the current control si= gnals from the serial device. + + @retval RETURN_SUCCESS The control bits were read from the serial= device. + @retval RETURN_UNSUPPORTED The serial device does not support this op= eration. + @retval RETURN_DEVICE_ERROR The serial device is not functioning corre= ctly. + +**/ +RETURN_STATUS +EFIAPI +SerialPortGetControl ( + OUT UINT32 *Control + ) +{ + *Control =3D 0; + return RETURN_SUCCESS; +} + +/** + Sets the baud rate, receive FIFO depth, transmit/receice time out, parit= y, + data bits, and stop bits on a serial device. + + @param BaudRate The requested baud rate. A BaudRate value of 0= will use the + device's default interface speed. + On output, the value actually set. + @param ReveiveFifoDepth The requested depth of the FIFO on the receive= side of the + serial interface. A ReceiveFifoDepth value of = 0 will use + the device's default FIFO depth. + On output, the value actually set. + @param Timeout The requested time out for a single character = in microseconds. + This timeout applies to both the transmit and = receive side of the + interface. A Timeout value of 0 will use the d= evice's default time + out value. + On output, the value actually set. + @param Parity The type of parity to use on this serial devic= e. A Parity value of + DefaultParity will use the device's default pa= rity value. + On output, the value actually set. + @param DataBits The number of data bits to use on the serial d= evice. A DataBits + vaule of 0 will use the device's default data = bit setting. + On output, the value actually set. + @param StopBits The number of stop bits to use on this serial = device. A StopBits + value of DefaultStopBits will use the device's= default number of + stop bits. + On output, the value actually set. + + @retval RETURN_SUCCESS The new attributes were set on the ser= ial device. + @retval RETURN_UNSUPPORTED The serial device does not support thi= s operation. + @retval RETURN_INVALID_PARAMETER One or more of the attributes has an u= nsupported value. + @retval RETURN_DEVICE_ERROR The serial device is not functioning c= orrectly. + +**/ +RETURN_STATUS +EFIAPI +SerialPortSetAttributes ( + IN OUT UINT64 *BaudRate, + IN OUT UINT32 *ReceiveFifoDepth, + IN OUT UINT32 *Timeout, + IN OUT EFI_PARITY_TYPE *Parity, + IN OUT UINT8 *DataBits, + IN OUT EFI_STOP_BITS_TYPE *StopBits + ) +{ + return RETURN_SUCCESS; +} diff --git a/MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPortLibR= iscVSbiLib.uni b/MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPort= LibRiscVSbiLib.uni new file mode 100644 index 000000000000..7b22caa5a090 --- /dev/null +++ b/MdePkg/Library/BaseSerialPortLibRiscVSbiLib/BaseSerialPortLibRiscVSbi= Lib.uni @@ -0,0 +1,16 @@ +// /** @file +// Serial Port Library backed by SBI console. +// +// Serial Port Library backed by SBI console. +// +// Copyright (c) 2023, Intel Corporation. All rights reserved.
+// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + + +#string STR_MODULE_ABSTRACT #language en-US "Serial Port Libra= ry backed by SBI console" + +#string STR_MODULE_DESCRIPTION #language en-US "Serial Port Libra= ry backed by SBI console." + diff --git a/MdePkg/Library/BaseSerialPortLibRiscVSbiLibRam/BaseSerialPortL= ibRiscVSbiLibRam.uni b/MdePkg/Library/BaseSerialPortLibRiscVSbiLibRam/BaseS= erialPortLibRiscVSbiLibRam.uni new file mode 100644 index 000000000000..7b22caa5a090 --- /dev/null +++ b/MdePkg/Library/BaseSerialPortLibRiscVSbiLibRam/BaseSerialPortLibRiscV= SbiLibRam.uni @@ -0,0 +1,16 @@ +// /** @file +// Serial Port Library backed by SBI console. +// +// Serial Port Library backed by SBI console. +// +// Copyright (c) 2023, Intel Corporation. All rights reserved.
+// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + + +#string STR_MODULE_ABSTRACT #language en-US "Serial Port Libra= ry backed by SBI console" + +#string STR_MODULE_DESCRIPTION #language en-US "Serial Port Libra= ry backed by SBI console." + --=20 2.25.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#102505): https://edk2.groups.io/g/devel/message/102505 Mute This Topic: https://groups.io/mt/98064147/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-