TianoCore EDK2 master
Loading...
Searching...
No Matches
BaseSerialPortLibRiscVSbiLibRam.c
Go to the documentation of this file.
1
13#include <Base.h>
16#include "Common.h"
17
18STATIC BOOLEAN mHaveDbcn = FALSE;
19STATIC BOOLEAN mHaveLegacyPutchar = FALSE;
20STATIC BOOLEAN mHaveLegacyGetchar = FALSE;
21STATIC INT64 mLastGetChar = -1;
22
31BOOLEAN
33 VOID
34 )
35{
36 SBI_RET Ret;
37
38 Ret = SbiCall (SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, 1, SBI_EXT_0_1_CONSOLE_GETCHAR);
39 if ((TranslateError (Ret.Error) == EFI_SUCCESS) &&
40 (Ret.Value != 0))
41 {
42 return TRUE;
43 }
44
45 return FALSE;
46}
47
59RETURN_STATUS
60EFIAPI
62 VOID
63 )
64{
65 if (SbiImplementsDbcn ()) {
66 mHaveDbcn = TRUE;
67 return RETURN_SUCCESS;
68 }
69
71 mHaveLegacyPutchar = TRUE;
72 }
73
75 mHaveLegacyGetchar = TRUE;
76 }
77
78 return (mHaveLegacyGetchar && mHaveLegacyPutchar) ?
81}
82
100EFIAPI
102 IN UINT8 *Buffer,
103 IN UINTN NumberOfBytes
104 )
105{
106 if (NumberOfBytes == 0) {
107 return 0;
108 }
109
110 if (mHaveDbcn) {
111 return SbiDbcnWrite (Buffer, NumberOfBytes);
112 } else if (mHaveLegacyPutchar) {
113 return SbiLegacyPutchar (Buffer, NumberOfBytes);
114 }
115
116 /*
117 * Neither DBCN or legacy extension were present.
118 */
119 return 0;
120}
121
137UINTN
138EFIAPI
140 OUT UINT8 *Buffer,
141 IN UINTN NumberOfBytes
142 )
143{
144 UINTN Index;
145
146 Index = 0;
147 while ((Index < NumberOfBytes) && SerialPortPoll ()) {
148 Buffer[Index++] = (UINT8)mLastGetChar;
149 mLastGetChar = -1;
150 }
151
152 return Index;
153}
154
166BOOLEAN
167EFIAPI
169 VOID
170 )
171{
172 /*
173 * Careful. OpenSBI with HTIF console will return -1 followed by -2
174 * if there is no character received. So just check for values >= 0.
175 */
176
177 if (mLastGetChar >= 0) {
178 return TRUE;
179 }
180
181 if (mHaveDbcn) {
182 UINT8 Buffer;
183 SBI_RET Ret;
184
185 Ret = SbiCall (
186 SBI_EXT_DBCN,
187 SBI_EXT_DBCN_READ,
188 3,
189 1,
190 ((UINTN)&Buffer),
191 0
192 );
193 if ((TranslateError (Ret.Error) == EFI_SUCCESS) &&
194 (Ret.Value == 1))
195 {
196 mLastGetChar = Buffer;
197 }
198 } else if (mHaveLegacyGetchar) {
199 mLastGetChar = (INT64)SbiCall (SBI_EXT_0_1_CONSOLE_GETCHAR, 0, 0).Error;
200 }
201
202 return mLastGetChar >= 0;
203}
204
215RETURN_STATUS
216EFIAPI
218 IN UINT32 Control
219 )
220{
221 return RETURN_SUCCESS;
222}
223
234RETURN_STATUS
235EFIAPI
237 OUT UINT32 *Control
238 )
239{
240 *Control = 0;
241 return RETURN_SUCCESS;
242}
243
277RETURN_STATUS
278EFIAPI
280 IN OUT UINT64 *BaudRate,
281 IN OUT UINT32 *ReceiveFifoDepth,
282 IN OUT UINT32 *Timeout,
283 IN OUT EFI_PARITY_TYPE *Parity,
284 IN OUT UINT8 *DataBits,
285 IN OUT EFI_STOP_BITS_TYPE *StopBits
286 )
287{
288 return RETURN_SUCCESS;
289}
UINT64 UINTN
SBI_RET EFIAPI SbiCall(IN UINTN ExtId, IN UINTN FuncId, IN UINTN NumArgs,...)
EFI_STATUS EFIAPI TranslateError(IN UINTN SbiError)
BOOLEAN EFIAPI SerialPortPoll(VOID)
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)
STATIC BOOLEAN SbiImplementsLegacyGetchar(VOID)
UINTN EFIAPI SerialPortRead(OUT UINT8 *Buffer, IN UINTN NumberOfBytes)
RETURN_STATUS EFIAPI SerialPortInitialize(VOID)
RETURN_STATUS EFIAPI SerialPortSetControl(IN UINT32 Control)
RETURN_STATUS EFIAPI SerialPortGetControl(OUT UINT32 *Control)
UINTN EFIAPI SerialPortWrite(IN UINT8 *Buffer, IN UINTN NumberOfBytes)
#define STATIC
Definition: Base.h:264
#define RETURN_DEVICE_ERROR
Definition: Base.h:1104
#define RETURN_SUCCESS
Definition: Base.h:1066
#define TRUE
Definition: Base.h:301
#define FALSE
Definition: Base.h:307
#define IN
Definition: Base.h:279
#define OUT
Definition: Base.h:284
BOOLEAN SbiImplementsLegacyPutchar(VOID)
Definition: Common.c:46
UINTN SbiDbcnWrite(IN UINT8 *Buffer, IN UINTN NumberOfBytes)
Definition: Common.c:110
UINTN SbiLegacyPutchar(IN UINT8 *Buffer, IN UINTN NumberOfBytes)
Definition: Common.c:77
BOOLEAN SbiImplementsDbcn(VOID)
Definition: Common.c:22
EFI_STOP_BITS_TYPE
Definition: SerialIo.h:53
EFI_PARITY_TYPE
Definition: SerialIo.h:41
#define EFI_SUCCESS
Definition: UefiBaseType.h:112
UINTN Error
SBI status code.
UINTN Value
Value returned.