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 <git@danielschaefer.me> Cc: Sunil V L <sunilvl@ventanamicro.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Zhiguang Liu <zhiguang.liu@intel.com> Signed-off-by: Andrei Warkentin <andrei.warkentin@intel.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com>
		
			
				
	
	
		
			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;
 | |
| }
 |