Revision: 19124
          http://sourceforge.net/p/edk2/code/19124
Author:   lersek
Date:     2015-12-04 16:17:17 +0000 (Fri, 04 Dec 2015)
Log Message:
-----------
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 <[email protected]>
Reviewed-by: Laszlo Ersek <[email protected]>
[[email protected]: rewrap at 79 chars, use NULL, print Status]

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <[email protected]>

Modified Paths:
--------------
    trunk/edk2/ArmVirtPkg/ArmVirtQemu.dsc
    trunk/edk2/ArmVirtPkg/ArmVirtQemu.fdf

Added Paths:
-----------
    trunk/edk2/ArmVirtPkg/HighMemDxe/
    trunk/edk2/ArmVirtPkg/HighMemDxe/HighMemDxe.c
    trunk/edk2/ArmVirtPkg/HighMemDxe/HighMemDxe.inf

Modified: trunk/edk2/ArmVirtPkg/ArmVirtQemu.dsc
===================================================================
--- trunk/edk2/ArmVirtPkg/ArmVirtQemu.dsc       2015-12-04 16:17:12 UTC (rev 
19123)
+++ trunk/edk2/ArmVirtPkg/ArmVirtQemu.dsc       2015-12-04 16:17:17 UTC (rev 
19124)
@@ -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

Modified: trunk/edk2/ArmVirtPkg/ArmVirtQemu.fdf
===================================================================
--- trunk/edk2/ArmVirtPkg/ArmVirtQemu.fdf       2015-12-04 16:17:12 UTC (rev 
19123)
+++ trunk/edk2/ArmVirtPkg/ArmVirtQemu.fdf       2015-12-04 16:17:17 UTC (rev 
19124)
@@ -108,6 +108,7 @@
   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)

Added: trunk/edk2/ArmVirtPkg/HighMemDxe/HighMemDxe.c
===================================================================
--- trunk/edk2/ArmVirtPkg/HighMemDxe/HighMemDxe.c                               
(rev 0)
+++ trunk/edk2/ArmVirtPkg/HighMemDxe/HighMemDxe.c       2015-12-04 16:17:17 UTC 
(rev 19124)
@@ -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 <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 != 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;
+}

Added: trunk/edk2/ArmVirtPkg/HighMemDxe/HighMemDxe.inf
===================================================================
--- trunk/edk2/ArmVirtPkg/HighMemDxe/HighMemDxe.inf                             
(rev 0)
+++ trunk/edk2/ArmVirtPkg/HighMemDxe/HighMemDxe.inf     2015-12-04 16:17:17 UTC 
(rev 19124)
@@ -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


------------------------------------------------------------------------------
Go from Idea to Many App Stores Faster with Intel(R) XDK
Give your users amazing mobile app experiences with Intel(R) XDK.
Use one codebase in this all-in-one HTML5 development environment.
Design, debug & build mobile apps & 2D/3D high-impact games for multiple OSs.
http://pubads.g.doubleclick.net/gampad/clk?id=254741911&iu=/4140
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to