summaryrefslogtreecommitdiffstats
path: root/UefiPayloadPkg/Library/BaseSerialPortLibHob/BaseSerialPortLibHob.c
diff options
context:
space:
mode:
Diffstat (limited to 'UefiPayloadPkg/Library/BaseSerialPortLibHob/BaseSerialPortLibHob.c')
-rw-r--r--UefiPayloadPkg/Library/BaseSerialPortLibHob/BaseSerialPortLibHob.c41
1 files changed, 35 insertions, 6 deletions
diff --git a/UefiPayloadPkg/Library/BaseSerialPortLibHob/BaseSerialPortLibHob.c b/UefiPayloadPkg/Library/BaseSerialPortLibHob/BaseSerialPortLibHob.c
index 809fa2e9c9..8216195c62 100644
--- a/UefiPayloadPkg/Library/BaseSerialPortLibHob/BaseSerialPortLibHob.c
+++ b/UefiPayloadPkg/Library/BaseSerialPortLibHob/BaseSerialPortLibHob.c
@@ -138,6 +138,10 @@ SerialPortInitialize (
BOOLEAN MmioEnable;
UINT8 Value;
+ if (mUartCount > 0) {
+ return RETURN_SUCCESS;
+ }
+
GuidHob = GetFirstGuidHob (&gUniversalPayloadSerialPortInfoGuid);
while (GuidHob != NULL) {
SerialPortInfo = (UNIVERSAL_PAYLOAD_SERIAL_PORT_INFO *)GET_GUID_HOB_DATA (GuidHob);
@@ -329,6 +333,7 @@ SerialPortRead (
{
UINTN BaseAddress;
BOOLEAN UseMmio;
+ BOOLEAN IsNextPort;
UINT8 *DataBuffer;
UINTN BytesLeft;
UINTN Result;
@@ -353,6 +358,7 @@ SerialPortRead (
DataBuffer = Buffer;
BytesLeft = NumberOfBytes;
+ IsNextPort = FALSE;
Mcr = (UINT8)(SerialPortReadRegister (BaseAddress, R_UART_MCR, UseMmio, Stride) & ~B_UART_MCR_RTS);
@@ -367,6 +373,13 @@ SerialPortRead (
//
SerialPortWriteRegister (BaseAddress, R_UART_MCR, (UINT8)(Mcr | B_UART_MCR_RTS), UseMmio, Stride);
}
+
+ IsNextPort = TRUE;
+ break;
+ }
+
+ if (IsNextPort) {
+ break;
}
if (PcdGetBool (PcdSerialUseHardwareFlowControl)) {
@@ -382,6 +395,10 @@ SerialPortRead (
*DataBuffer = SerialPortReadRegister (BaseAddress, R_UART_RXBUF, UseMmio, Stride);
}
+ if ((!IsNextPort) && (*(--DataBuffer) != '\0')) {
+ return Result;
+ }
+
Count++;
}
@@ -409,10 +426,9 @@ SerialPortPoll (
BOOLEAN UseMmio;
UINT8 Stride;
UINT8 Count;
- BOOLEAN Status;
+ BOOLEAN IsDataReady;
- Count = 0;
- Status = FALSE;
+ Count = 0;
while (Count < mUartCount) {
BaseAddress = mUartInfo[Count].BaseAddress;
UseMmio = mUartInfo[Count].UseMmio;
@@ -423,7 +439,7 @@ SerialPortPoll (
continue;
}
- Status = FALSE;
+ IsDataReady = FALSE;
//
// Read the serial port status
@@ -436,7 +452,7 @@ SerialPortPoll (
SerialPortWriteRegister (BaseAddress, R_UART_MCR, (UINT8)(SerialPortReadRegister (BaseAddress, R_UART_MCR, UseMmio, Stride) & ~B_UART_MCR_RTS), UseMmio, Stride);
}
- Status = TRUE;
+ IsDataReady = TRUE;
}
if (PcdGetBool (PcdSerialUseHardwareFlowControl)) {
@@ -446,10 +462,14 @@ SerialPortPoll (
SerialPortWriteRegister (BaseAddress, R_UART_MCR, (UINT8)(SerialPortReadRegister (BaseAddress, R_UART_MCR, UseMmio, Stride) | B_UART_MCR_RTS), UseMmio, Stride);
}
+ if (IsDataReady) {
+ return IsDataReady;
+ }
+
Count++;
}
- return Status;
+ return IsDataReady;
}
/**
@@ -603,6 +623,15 @@ SerialPortGetControl (
*Control |= EFI_SERIAL_INPUT_BUFFER_EMPTY;
}
+ if ((((*Control & EFI_SERIAL_OUTPUT_BUFFER_EMPTY) == EFI_SERIAL_OUTPUT_BUFFER_EMPTY) &&
+ ((*Control & EFI_SERIAL_INPUT_BUFFER_EMPTY) != EFI_SERIAL_INPUT_BUFFER_EMPTY)) ||
+ ((*Control & (EFI_SERIAL_DATA_SET_READY | EFI_SERIAL_CLEAR_TO_SEND |
+ EFI_SERIAL_CARRIER_DETECT)) == (EFI_SERIAL_DATA_SET_READY | EFI_SERIAL_CLEAR_TO_SEND |
+ EFI_SERIAL_CARRIER_DETECT)))
+ {
+ return RETURN_SUCCESS;
+ }
+
Count++;
}