} UART_INFO;\r
\r
UART_INFO mUartInfo[MAX_SIZE];\r
-UINT8 mUartCount = 0;\r
+UINT8 mUartCount = 0;\r
+BOOLEAN mBaseSerialPortLibHobAtRuntime = FALSE;\r
\r
/**\r
Reads an 8-bit register. If UseMmio is TRUE, then the value is read from\r
UseMmio = mUartInfo[Count].UseMmio;\r
Stride = mUartInfo[Count].RegisterStride;\r
\r
+ if (UseMmio && mBaseSerialPortLibHobAtRuntime) {\r
+ Count++;\r
+ continue;\r
+ }\r
+\r
if (BaseAddress == 0) {\r
Count++;\r
continue;\r
BytesLeft = NumberOfBytes;\r
\r
while (BytesLeft != 0) {\r
+ //\r
+ // Wait for the serial port to be ready, to make sure both the transmit FIFO\r
+ // and shift register empty.\r
+ //\r
+ while ((SerialPortReadRegister (BaseAddress, R_UART_LSR, UseMmio, Stride) & B_UART_LSR_TXRDY) == 0) {\r
+ }\r
+\r
//\r
// Fill the entire Tx FIFO\r
//\r
--- /dev/null
+/** @file\r
+ UART Serial Port library functions.\r
+\r
+ Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+#include <Uefi.h>\r
+\r
+extern BOOLEAN mBaseSerialPortLibHobAtRuntime;\r
+\r
+/**\r
+ Set mSerialIoUartLibAtRuntime flag as TRUE after ExitBootServices.\r
+\r
+ @param[in] Event The Event that is being processed.\r
+ @param[in] Context The Event Context.\r
+\r
+**/\r
+STATIC\r
+VOID\r
+EFIAPI\r
+BaseSerialPortLibHobExitBootServicesEvent (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ mBaseSerialPortLibHobAtRuntime = TRUE;\r
+}\r
+\r
+/**\r
+ The constructor function registers a callback for the ExitBootServices event.\r
+\r
+ @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
+ @param[in] SystemTable A pointer to the EFI System Table.\r
+\r
+ @retval EFI_SUCCESS The operation completed successfully.\r
+ @retval other Either the serial port failed to initialize or the\r
+ ExitBootServices event callback registration failed.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DxeBaseSerialPortLibHobConstructor (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+{\r
+ EFI_EVENT SerialPortLibHobExitBootServicesEvent;\r
+\r
+ return SystemTable->BootServices->CreateEvent (\r
+ EVT_SIGNAL_EXIT_BOOT_SERVICES,\r
+ TPL_NOTIFY,\r
+ BaseSerialPortLibHobExitBootServicesEvent,\r
+ NULL,\r
+ &SerialPortLibHobExitBootServicesEvent\r
+ );\r
+}\r
--- /dev/null
+## @file\r
+# SerialPortLib instance for UART information retrieved from bootloader.\r
+#\r
+# Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
+#\r
+##\r
+\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = DxeBaseSerialPortLibHob\r
+ FILE_GUID = c8def0c5-48e7-45b8-8299-485ea2e63b2c\r
+ MODULE_TYPE = DXE_DRIVER\r
+ VERSION_STRING = 1.0\r
+ LIBRARY_CLASS = SerialPortLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER\r
+ CONSTRUCTOR = DxeBaseSerialPortLibHobConstructor\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ MdeModulePkg/MdeModulePkg.dec\r
+\r
+[LibraryClasses]\r
+ PcdLib\r
+ IoLib\r
+ HobLib\r
+ TimerLib\r
+\r
+[Sources]\r
+ DxeBaseSerialPortLibHob.c\r
+ BaseSerialPortLibHob.c\r
+\r
+[Pcd]\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialLineControl\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialFifoControl\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialExtendedTxFifoSize\r
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseHardwareFlowControl\r
+\r
+[Guids]\r
+ gUniversalPayloadSerialPortInfoGuid\r
SerialPortLib|UefiPayloadPkg/Library/CbSerialPortLib/CbSerialPortLib.inf\r
PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf\r
!else\r
- SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf\r
+ !if $(MULTIPLE_DEBUG_PORT_SUPPORT) == TRUE\r
+ SerialPortLib|UefiPayloadPkg/Library/BaseSerialPortLibHob/DxeBaseSerialPortLibHob.inf\r
+ !else\r
+ SerialPortLib|MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.inf\r
+ !endif\r
PlatformHookLib|UefiPayloadPkg/Library/PlatformHookLib/PlatformHookLib.inf\r
!endif\r
PlatformBootManagerLib|UefiPayloadPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf\r
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
DxeHobListLib|UefiPayloadPkg/Library/DxeHobListLibNull/DxeHobListLibNull.inf\r
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf\r
+!if $(MULTIPLE_DEBUG_PORT_SUPPORT) == TRUE\r
+ SerialPortLib|UefiPayloadPkg/Library/BaseSerialPortLibHob/BaseSerialPortLibHob.inf\r
+!endif\r
\r
[LibraryClasses.common.DXE_CORE]\r
DxeHobListLib|UefiPayloadPkg/Library/DxeHobListLibNull/DxeHobListLibNull.inf\r
<LibraryClasses>\r
!if $(MULTIPLE_DEBUG_PORT_SUPPORT) == TRUE\r
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf\r
- SerialPortLib|UefiPayloadPkg/Library/BaseSerialPortLibHob/BaseSerialPortLibHob.inf\r
+ SerialPortLib|UefiPayloadPkg/Library/BaseSerialPortLibHob/DxeBaseSerialPortLibHob.inf\r
!endif\r
NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf\r
}\r