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:
committed by
mergify[bot]
parent
66046aeb6d
commit
115b59d9c6
@@ -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;
|
||||
|
Reference in New Issue
Block a user