From: Shannon Zhao <[email protected]> Here we add the memory space for the high 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/ArmVirtQemu.dsc | 1 + ArmVirtPkg/ArmVirtQemu.fdf | 1 + ArmVirtPkg/HighMemDxe/HighMemDxe.c | 105 +++++++++++++++++++++++++++++++++++ ArmVirtPkg/HighMemDxe/HighMemDxe.inf | 51 +++++++++++++++++ 4 files changed, 158 insertions(+) create mode 100644 ArmVirtPkg/HighMemDxe/HighMemDxe.c create mode 100644 ArmVirtPkg/HighMemDxe/HighMemDxe.inf diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index b0d1d08..e6440ec 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -302,6 +302,7 @@ # Platform Driver # ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf + ArmVirtPkg/HighMemDxe/HighMemDxe.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf OvmfPkg/VirtioScsiDxe/VirtioScsi.inf OvmfPkg/VirtioNetDxe/VirtioNet.inf diff --git a/ArmVirtPkg/ArmVirtQemu.fdf b/ArmVirtPkg/ArmVirtQemu.fdf index 738e3db..f5e6cbd 100644 --- a/ArmVirtPkg/ArmVirtQemu.fdf +++ b/ArmVirtPkg/ArmVirtQemu.fdf @@ -108,6 +108,7 @@ READ_LOCK_STATUS = TRUE INF MdeModulePkg/Core/Dxe/DxeMain.inf INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf INF ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf + INF ArmVirtPkg/HighMemDxe/HighMemDxe.inf # # PI DXE Drivers producing Architectural Protocols (EFI Services) diff --git a/ArmVirtPkg/HighMemDxe/HighMemDxe.c b/ArmVirtPkg/HighMemDxe/HighMemDxe.c new file mode 100644 index 0000000..08b010e --- /dev/null +++ b/ArmVirtPkg/HighMemDxe/HighMemDxe.c @@ -0,0 +1,105 @@ +/** @file +* High memory node enumeration DXE driver for ARM Virtual Machines +* +* Copyright (c) 2015, Linaro Ltd. All rights reserved. +* +* This program and the accompanying materials are +* licensed and made available under the terms and conditions of the BSD License +* which accompanies this distribution. The full text of the license may be found at +* http://opensource.org/licenses/bsd-license.php +* +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +* +**/ + +#include <Library/BaseLib.h> +#include <Library/UefiDriverEntryPoint.h> +#include <Library/DebugLib.h> +#include <Library/PcdLib.h> +#include <Library/HobLib.h> +#include <libfdt.h> +#include <Library/DxeServicesTableLib.h> + +EFI_STATUS +EFIAPI +InitializeHighMemDxe ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + VOID *Hob; + VOID *DeviceTreeBase; + INT32 Node, Prev; + EFI_STATUS Status; + CONST CHAR8 *Type; + INT32 Len; + CONST VOID *RegProp; + UINT64 CurBase; + UINT64 CurSize; + + Hob = GetFirstGuidHob(&gFdtHobGuid); + if (Hob == NULL || GET_GUID_HOB_DATA_SIZE (Hob) != sizeof (UINT64)) { + return EFI_NOT_FOUND; + } + DeviceTreeBase = (VOID *)(UINTN)*(UINT64 *)GET_GUID_HOB_DATA (Hob); + + if (fdt_check_header (DeviceTreeBase) != 0) { + DEBUG ((EFI_D_ERROR, "%a: No DTB found @ 0x%p\n", __FUNCTION__, DeviceTreeBase)); + return EFI_NOT_FOUND; + } + + DEBUG ((EFI_D_INFO, "%a: DTB @ 0x%p\n", __FUNCTION__, DeviceTreeBase)); + + // + // Check for memory node and add the memory spaces expect the lowest one + // + for (Prev = 0;; Prev = Node) { + Node = fdt_next_node (DeviceTreeBase, Prev, NULL); + if (Node < 0) { + break; + } + + 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)); + continue; + } + + Status = gDS->SetMemorySpaceAttributes ( + CurBase, CurSize, + EFI_MEMORY_WB); + + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "%a: Failed to set System RAM @ 0x%lx - 0x%lx attribute\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 EFI_SUCCESS; +} diff --git a/ArmVirtPkg/HighMemDxe/HighMemDxe.inf b/ArmVirtPkg/HighMemDxe/HighMemDxe.inf new file mode 100644 index 0000000..0eb37c7 --- /dev/null +++ b/ArmVirtPkg/HighMemDxe/HighMemDxe.inf @@ -0,0 +1,51 @@ +## @file +# High memory node enumeration DXE driver for ARM Virtual Machines +# +# Copyright (c) 2015, Linaro Ltd. All rights reserved. +# +# This program and the accompanying materials are +# licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = HighMemDxe + FILE_GUID = 63EA1463-FBFA-428A-B97F-E222755852D7 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + + ENTRY_POINT = InitializeHighMemDxe + +[Sources] + HighMemDxe.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + ArmPkg/ArmPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + ArmVirtPkg/ArmVirtPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + +[LibraryClasses] + BaseLib + PcdLib + UefiDriverEntryPoint + FdtLib + HobLib + DxeServicesTableLib + +[Guids] + gFdtHobGuid + +[FixedPcd] + gArmTokenSpaceGuid.PcdSystemMemoryBase + +[Depex] + gEfiCpuArchProtocolGuid -- 2.0.4 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

