ArmVirtPkg: store separate console and debug PL011 addresses in GUID HOB

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+tianocore@kernel.org>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Leif Lindholm <quic_llindhol@quicinc.com>
Cc: Sami Mujawar <sami.mujawar@arm.com>
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20231008153912.175941-6-lersek@redhat.com>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=4577
[lersek@redhat.com: add TianoCore BZ reference]
This commit is contained in:
Laszlo Ersek 2023-10-08 17:39:08 +02:00 committed by mergify[bot]
parent 66046aeb6d
commit 115b59d9c6
4 changed files with 61 additions and 17 deletions

View File

@ -1,6 +1,6 @@
/** @file /** @file
GUID for the HOB that caches the base address of the PL011 serial port, for GUID for the HOB that caches the base address(es) of the PL011 serial port(s),
when PCD access is not available. for when PCD access is not available.
Copyright (C) 2014, Red Hat, Inc. Copyright (C) 2014, Red Hat, Inc.
@ -18,4 +18,15 @@
extern EFI_GUID gEarlyPL011BaseAddressGuid; 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 #endif

View File

@ -46,7 +46,7 @@ SerialPortInitialize (
{ {
VOID *Hob; VOID *Hob;
RETURN_STATUS Status; RETURN_STATUS Status;
CONST UINT64 *UartBase; CONST EARLY_PL011_BASE_ADDRESS *UartBase;
UINTN SerialBaseAddress; UINTN SerialBaseAddress;
UINT64 BaudRate; UINT64 BaudRate;
UINT32 ReceiveFifoDepth; UINT32 ReceiveFifoDepth;
@ -70,7 +70,7 @@ SerialPortInitialize (
UartBase = GET_GUID_HOB_DATA (Hob); UartBase = GET_GUID_HOB_DATA (Hob);
SerialBaseAddress = (UINTN)*UartBase; SerialBaseAddress = (UINTN)UartBase->ConsoleAddress;
if (SerialBaseAddress == 0) { if (SerialBaseAddress == 0) {
Status = RETURN_NOT_FOUND; Status = RETURN_NOT_FOUND;
goto Failed; goto Failed;

View File

@ -9,6 +9,7 @@
#include <PiPei.h> #include <PiPei.h>
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h> #include <Library/MemoryAllocationLib.h>
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
#include <Library/HobLib.h> #include <Library/HobLib.h>
@ -43,7 +44,7 @@ PlatformPeim (
UINTN FdtSize; UINTN FdtSize;
UINTN FdtPages; UINTN FdtPages;
UINT64 *FdtHobData; UINT64 *FdtHobData;
UINT64 *UartHobData; EARLY_PL011_BASE_ADDRESS *UartHobData;
FDT_SERIAL_PORTS Ports; FDT_SERIAL_PORTS Ports;
INT32 Node, Prev; INT32 Node, Prev;
INT32 Parent, Depth; INT32 Parent, Depth;
@ -72,24 +73,55 @@ PlatformPeim (
UartHobData = BuildGuidHob (&gEarlyPL011BaseAddressGuid, sizeof *UartHobData); UartHobData = BuildGuidHob (&gEarlyPL011BaseAddressGuid, sizeof *UartHobData);
ASSERT (UartHobData != NULL); ASSERT (UartHobData != NULL);
*UartHobData = 0; SetMem (UartHobData, sizeof *UartHobData, 0);
Status = FdtSerialGetPorts (Base, "arm,pl011", &Ports); Status = FdtSerialGetPorts (Base, "arm,pl011", &Ports);
if (!EFI_ERROR (Status)) { 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;
// Status = FdtSerialGetConsolePort (Base, &ConsoleAddress);
// Default to the first port found, but (if there are multiple ports) allow if (EFI_ERROR (Status)) {
// the "/chosen" node to override it. Note that if FdtSerialGetConsolePort() //
// fails, it does not modify UartBase. // At least two UARTs; but failed to get the console preference. Use the
// // first UART for SerialPortLib+console, and the second one for
UartBase = Ports.BaseAddress[0]; // DebugLib.
if (Ports.NumberOfPorts > 1) { //
FdtSerialGetConsolePort (Base, &UartBase); 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)); DEBUG ((
*UartHobData = UartBase; 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; TpmBase = 0;

View File

@ -31,6 +31,7 @@
gArmVirtTokenSpaceGuid.PcdTpm2SupportEnabled gArmVirtTokenSpaceGuid.PcdTpm2SupportEnabled
[LibraryClasses] [LibraryClasses]
BaseMemoryLib
DebugLib DebugLib
HobLib HobLib
FdtLib FdtLib