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

Reply via email to