From: Shannon Zhao <[email protected]> Here we add the memory space for the memory nodes except the lowest one in FDT. So these spaces will show up in the UEFI memory map.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Shannon Zhao <[email protected]> --- ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c | 72 ++++++++++++++++++++++++++++++++++++ ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf | 4 ++ 2 files changed, 76 insertions(+) diff --git a/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c b/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c index 74f80d1..11a9b5a 100644 --- a/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c +++ b/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c @@ -27,6 +27,7 @@ #include <Library/HobLib.h> #include <libfdt.h> #include <Library/XenIoMmioLib.h> +#include <Library/DxeServicesTableLib.h> #include <Guid/Fdt.h> #include <Guid/VirtioMmioTransport.h> @@ -274,6 +275,73 @@ ProcessPciHost ( return EFI_SUCCESS; } +/** + Process the device tree node whose "device_type" property is "memory" and add + the memory range of this node to System RAM space. + + param[in] DeviceTreeBase Pointer to the device tree. + + param[in] Node Offset of the device tree node. + + @retval TRUE The "device_type" property of this device tree node + is "memory" either adding successfully or + unsuccessfully. + + @retval FALSE The "device_type" property of this device tree node + is not "memory" +**/ +STATIC +BOOLEAN +EFIAPI +AddMemorySpaceToSystemRam ( + IN CONST VOID *DeviceTreeBase, + IN INT32 Node + ) +{ + CONST CHAR8 *Type; + INT32 Len; + CONST VOID *RegProp; + EFI_STATUS Status; + UINT64 CurBase; + UINT64 CurSize; + + // + // Check for memory node and add the memory spaces expect the lowest one + // + Type = fdt_getprop (DeviceTreeBase, Node, "device_type", &Len); + if (Type && AsciiStrnCmp (Type, "memory", Len) == 0) { + // + // Get the 'reg' property of this node. For now, we will assume + // two 8 byte quantities for base and size, respectively. + // + RegProp = fdt_getprop (DeviceTreeBase, Node, "reg", &Len); + if (RegProp != 0 && Len == (2 * sizeof (UINT64))) { + + CurBase = fdt64_to_cpu (((UINT64 *)RegProp)[0]); + CurSize = fdt64_to_cpu (((UINT64 *)RegProp)[1]); + + if (FixedPcdGet64 (PcdSystemMemoryBase) != CurBase) { + Status = gDS->AddMemorySpace ( + EfiGcdMemoryTypeSystemMemory, + CurBase, CurSize, + EFI_MEMORY_WB | EFI_MEMORY_WC | + EFI_MEMORY_WT | EFI_MEMORY_UC); + + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "%a: Failed to add System RAM @ 0x%lx - 0x%lx\n", + __FUNCTION__, CurBase, CurBase + CurSize - 1)); + } else { + DEBUG ((EFI_D_INFO, "%a: Add System RAM @ 0x%lx - 0x%lx\n", + __FUNCTION__, CurBase, CurBase + CurSize - 1)); + } + } + } + + return TRUE; + } + + return FALSE; +} EFI_STATUS EFIAPI @@ -332,6 +400,10 @@ InitializeVirtFdtDxe ( break; } + if (AddMemorySpaceToSystemRam (DeviceTreeBase, Node)) { + continue; + } + Type = fdt_getprop (DeviceTreeBase, Node, "compatible", &Len); if (Type == NULL) { continue; diff --git a/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf b/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf index ee2503a..0e6927b 100644 --- a/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf +++ b/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf @@ -43,12 +43,16 @@ VirtioMmioDeviceLib HobLib XenIoMmioLib + DxeServicesTableLib [Guids] gFdtTableGuid gVirtioMmioTransportGuid gFdtHobGuid +[FixedPcd] + gArmTokenSpaceGuid.PcdSystemMemoryBase + [Pcd] gArmVirtTokenSpaceGuid.PcdArmPsciMethod gArmVirtTokenSpaceGuid.PcdFwCfgSelectorAddress -- 2.0.4 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

