From 68312710615c3499341f3e300b0a3921dea5a39b Mon Sep 17 00:00:00 2001 From: Shannon Zhao Date: Fri, 4 Dec 2015 16:17:17 +0000 Subject: [PATCH 1/1] ArmVirtPkg: HighMemDxe: add memory space for the high memory nodes 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 Reviewed-by: Laszlo Ersek [lersek@redhat.com: rewrap at 79 chars, use NULL, print Status] Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19124 6f19259b-4bc3-4df7-8a09-765794883524 --- ArmVirtPkg/ArmVirtQemu.dsc | 1 + ArmVirtPkg/ArmVirtQemu.fdf | 1 + ArmVirtPkg/HighMemDxe/HighMemDxe.c | 109 +++++++++++++++++++++++++++ ArmVirtPkg/HighMemDxe/HighMemDxe.inf | 52 +++++++++++++ 4 files changed, 163 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 b0d1d08c50..e6440ec5da 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 738e3db570..f5e6cbd5a1 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 0000000000..4963164fbd --- /dev/null +++ b/ArmVirtPkg/HighMemDxe/HighMemDxe.c @@ -0,0 +1,109 @@ +/** @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 +#include +#include +#include +#include +#include +#include + +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 != NULL && 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 (%r)\n", + __FUNCTION__, CurBase, CurBase + CurSize - 1, Status)); + 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 (%r)\n", + __FUNCTION__, CurBase, CurBase + CurSize - 1, Status)); + } 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 0000000000..2b397626a4 --- /dev/null +++ b/ArmVirtPkg/HighMemDxe/HighMemDxe.inf @@ -0,0 +1,52 @@ +## @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.39.2