OvmfPkg/RiscVVirt: SEC: Add IO memory resource hob for platform devices

Normally, DXE driver would add device resource to GCD before start using.
But some key resources such as uart used for printing info at very early
stage.

Those resources should be populated to HOB in SEC phase so they are
added to GCD before MMU enabled.

Signed-off-by: Tuan Phan <tphan@ventanamicro.com>
Reviewed-by: Andrei Warkentin <andrei.warkentin@intel.com>
Reviewed-by: Sunil V L <sunilvl@ventanamicro.com>
This commit is contained in:
Tuan Phan 2023-07-14 12:08:21 -07:00 committed by mergify[bot]
parent a9fc9bb466
commit a8a72fc1ff

@ -21,6 +21,64 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <libfdt.h>
#include <Guid/FdtHob.h>
/**
Build memory map I/O range resource HOB using the
base address and size.
@param MemoryBase Memory map I/O base.
@param MemorySize Memory map I/O size.
**/
STATIC
VOID
AddIoMemoryBaseSizeHob (
EFI_PHYSICAL_ADDRESS MemoryBase,
UINT64 MemorySize
)
{
/* Align to EFI_PAGE_SIZE */
MemorySize = ALIGN_VALUE (MemorySize, EFI_PAGE_SIZE);
BuildResourceDescriptorHob (
EFI_RESOURCE_MEMORY_MAPPED_IO,
EFI_RESOURCE_ATTRIBUTE_PRESENT |
EFI_RESOURCE_ATTRIBUTE_INITIALIZED |
EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |
EFI_RESOURCE_ATTRIBUTE_TESTED,
MemoryBase,
MemorySize
);
}
/**
Populate IO resources from FDT that not added to GCD by its
driver in the DXE phase.
@param FdtBase Fdt base address
@param Compatible Compatible string
**/
STATIC
VOID
PopulateIoResources (
VOID *FdtBase,
CONST CHAR8 *Compatible
)
{
UINT64 *Reg;
INT32 Node, LenP;
Node = fdt_node_offset_by_compatible (FdtBase, -1, Compatible);
while (Node != -FDT_ERR_NOTFOUND) {
Reg = (UINT64 *)fdt_getprop (FdtBase, Node, "reg", &LenP);
if (Reg) {
ASSERT (LenP == (2 * sizeof (UINT64)));
AddIoMemoryBaseSizeHob (SwapBytes64 (Reg[0]), SwapBytes64 (Reg[1]));
}
Node = fdt_node_offset_by_compatible (FdtBase, Node, Compatible);
}
}
/**
@retval EFI_SUCCESS The address of FDT is passed in HOB.
EFI_UNSUPPORTED Can't locate FDT.
@ -80,5 +138,9 @@ PlatformPeimInitialization (
BuildFvHob (PcdGet32 (PcdOvmfDxeMemFvBase), PcdGet32 (PcdOvmfDxeMemFvSize));
PopulateIoResources (Base, "ns16550a");
PopulateIoResources (Base, "qemu,fw-cfg-mmio");
PopulateIoResources (Base, "virtio,mmio");
return EFI_SUCCESS;
}