PlatformPeiLib produces the EarlyPL011BaseAddress GUID HOB, and FdtPL011SerialPortLib consumes it. Extend the HOB such that it also carry the base address of the PL011 UART meant for DebugLib usage -- namely the first UART that is *not* designated by the /chosen node's "stdout-path" property. Implement this policy in PlatformPeiLib.
Note that as far as the SerialPortLib+console UART is concerned, this patch makes no difference. That selection remains consistent with the pre-patch state, and therefore consistent with EarlyFdtPL011SerialPortLib. Cc: Ard Biesheuvel <ardb+tianoc...@kernel.org> Cc: Gerd Hoffmann <kra...@redhat.com> Cc: Leif Lindholm <quic_llind...@quicinc.com> Cc: Sami Mujawar <sami.muja...@arm.com> Signed-off-by: Laszlo Ersek <ler...@redhat.com> --- ArmVirtPkg/Include/Guid/EarlyPL011BaseAddress.h | 15 ++++- ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf | 1 + ArmVirtPkg/Library/FdtPL011SerialPortLib/FdtPL011SerialPortLib.c | 4 +- ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c | 58 +++++++++++++++----- 4 files changed, 61 insertions(+), 17 deletions(-) diff --git a/ArmVirtPkg/Include/Guid/EarlyPL011BaseAddress.h b/ArmVirtPkg/Include/Guid/EarlyPL011BaseAddress.h index 492cbbcb1599..43b106f3ff04 100644 --- a/ArmVirtPkg/Include/Guid/EarlyPL011BaseAddress.h +++ b/ArmVirtPkg/Include/Guid/EarlyPL011BaseAddress.h @@ -1,6 +1,6 @@ /** @file - GUID for the HOB that caches the base address of the PL011 serial port, for - when PCD access is not available. + GUID for the HOB that caches the base address(es) of the PL011 serial port(s), + for when PCD access is not available. Copyright (C) 2014, Red Hat, Inc. @@ -18,4 +18,15 @@ extern EFI_GUID gEarlyPL011BaseAddressGuid; +typedef struct { + // + // for SerialPortLib and console IO + // + UINT64 ConsoleAddress; + // + // for DebugLib; may equal ConsoleAddress if there's only one PL011 UART + // + UINT64 DebugAddress; +} EARLY_PL011_BASE_ADDRESS; + #endif diff --git a/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf b/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf index 08a8f23bb449..b867d8bb895e 100644 --- a/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf +++ b/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.inf @@ -31,6 +31,7 @@ [FeaturePcd] gArmVirtTokenSpaceGuid.PcdTpm2SupportEnabled [LibraryClasses] + BaseMemoryLib DebugLib HobLib FdtLib diff --git a/ArmVirtPkg/Library/FdtPL011SerialPortLib/FdtPL011SerialPortLib.c b/ArmVirtPkg/Library/FdtPL011SerialPortLib/FdtPL011SerialPortLib.c index 5718b02977df..20e29e3f57f4 100644 --- a/ArmVirtPkg/Library/FdtPL011SerialPortLib/FdtPL011SerialPortLib.c +++ b/ArmVirtPkg/Library/FdtPL011SerialPortLib/FdtPL011SerialPortLib.c @@ -46,7 +46,7 @@ SerialPortInitialize ( { VOID *Hob; RETURN_STATUS Status; - CONST UINT64 *UartBase; + CONST EARLY_PL011_BASE_ADDRESS *UartBase; UINTN SerialBaseAddress; UINT64 BaudRate; UINT32 ReceiveFifoDepth; @@ -70,7 +70,7 @@ SerialPortInitialize ( UartBase = GET_GUID_HOB_DATA (Hob); - SerialBaseAddress = (UINTN)*UartBase; + SerialBaseAddress = (UINTN)UartBase->ConsoleAddress; if (SerialBaseAddress == 0) { Status = RETURN_NOT_FOUND; goto Failed; diff --git a/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c b/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c index d5dcc7cbfd52..7ab4aa2d6bb9 100644 --- a/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c +++ b/ArmVirtPkg/Library/PlatformPeiLib/PlatformPeiLib.c @@ -9,6 +9,7 @@ #include <PiPei.h> +#include <Library/BaseMemoryLib.h> #include <Library/MemoryAllocationLib.h> #include <Library/DebugLib.h> #include <Library/HobLib.h> @@ -43,7 +44,7 @@ PlatformPeim ( UINTN FdtSize; UINTN FdtPages; UINT64 *FdtHobData; - UINT64 *UartHobData; + EARLY_PL011_BASE_ADDRESS *UartHobData; FDT_SERIAL_PORTS Ports; INT32 Node, Prev; INT32 Parent, Depth; @@ -72,24 +73,55 @@ PlatformPeim ( UartHobData = BuildGuidHob (&gEarlyPL011BaseAddressGuid, sizeof *UartHobData); ASSERT (UartHobData != NULL); - *UartHobData = 0; + SetMem (UartHobData, sizeof *UartHobData, 0); Status = FdtSerialGetPorts (Base, "arm,pl011", &Ports); if (!EFI_ERROR (Status)) { - UINT64 UartBase; + if (Ports.NumberOfPorts == 1) { + // + // Just one UART; direct both SerialPortLib+console and DebugLib to it. + // + UartHobData->ConsoleAddress = Ports.BaseAddress[0]; + UartHobData->DebugAddress = Ports.BaseAddress[0]; + } else { + UINT64 ConsoleAddress; - // - // Default to the first port found, but (if there are multiple ports) allow - // the "/chosen" node to override it. Note that if FdtSerialGetConsolePort() - // fails, it does not modify UartBase. - // - UartBase = Ports.BaseAddress[0]; - if (Ports.NumberOfPorts > 1) { - FdtSerialGetConsolePort (Base, &UartBase); + Status = FdtSerialGetConsolePort (Base, &ConsoleAddress); + if (EFI_ERROR (Status)) { + // + // At least two UARTs; but failed to get the console preference. Use the + // first UART for SerialPortLib+console, and the second one for + // DebugLib. + // + UartHobData->ConsoleAddress = Ports.BaseAddress[0]; + UartHobData->DebugAddress = Ports.BaseAddress[1]; + } else { + // + // At least two UARTs; and console preference available. Use the + // preferred UART for SerialPortLib+console, and *another* UART for + // DebugLib. + // + UartHobData->ConsoleAddress = ConsoleAddress; + if (ConsoleAddress == Ports.BaseAddress[0]) { + UartHobData->DebugAddress = Ports.BaseAddress[1]; + } else { + UartHobData->DebugAddress = Ports.BaseAddress[0]; + } + } } - DEBUG ((DEBUG_INFO, "%a: PL011 UART @ 0x%lx\n", __func__, UartBase)); - *UartHobData = UartBase; + DEBUG (( + DEBUG_INFO, + "%a: PL011 UART (console) @ 0x%lx\n", + __func__, + UartHobData->ConsoleAddress + )); + DEBUG (( + DEBUG_INFO, + "%a: PL011 UART (debug) @ 0x%lx\n", + __func__, + UartHobData->DebugAddress + )); } TpmBase = 0; -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#109393): https://edk2.groups.io/g/devel/message/109393 Mute This Topic: https://groups.io/mt/101834879/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/leave/9847357/21656/1706620634/xyzzy [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-