]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPkg/BdsLib: Passed reserved memory regions to the Device Tree
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 12 Mar 2013 00:54:58 +0000 (00:54 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 12 Mar 2013 00:54:58 +0000 (00:54 +0000)
Go through the UEFI memory map and add OS 'runtime' regions as
reserved regions to the Device Tree.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <olivier.martin@arm.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14183 6f19259b-4bc3-4df7-8a09-765794883524

ArmPkg/Library/BdsLib/BdsLinuxFdt.c

index a098b1cda7790c5ced60e40ffbde45df5a4f2c74..c873d96369887227de06614167a626b5d6f220f9 100644 (file)
@@ -104,6 +104,23 @@ DebugDumpFdt (
   UINTN shift;\r
   UINT32 version;\r
 \r
+  {\r
+    // Can 'memreserve' be printed by below code?\r
+    INTN num = fdt_num_mem_rsv(FdtBlob);\r
+    INTN i, err;\r
+    UINT64 addr = 0,size = 0;\r
+\r
+    for (i = 0; i < num; i++) {\r
+      err = fdt_get_mem_rsv(FdtBlob, i, &addr, &size);\r
+      if (err) {\r
+        DEBUG((EFI_D_ERROR, "Error (%d) : Cannot get memreserve section (%d)\n", err, i));\r
+      }\r
+      else {\r
+        Print(L"/memreserve/ \t0x%lx \t0x%lx;\n",addr,size);\r
+      }\r
+    }\r
+  }\r
+\r
   depth = 0;\r
   shift = 4;\r
 \r
@@ -159,6 +176,25 @@ DebugDumpFdt (
   }\r
 }\r
 \r
+STATIC\r
+BOOLEAN\r
+IsLinuxReservedRegion (\r
+  IN EFI_MEMORY_TYPE MemoryType\r
+  )\r
+{\r
+  switch(MemoryType) {\r
+  case EfiRuntimeServicesCode:\r
+  case EfiRuntimeServicesData:\r
+  case EfiUnusableMemory:\r
+  case EfiACPIReclaimMemory:\r
+  case EfiACPIMemoryNVS:\r
+    return TRUE;\r
+  default:\r
+    return FALSE;\r
+  }\r
+}\r
+\r
+\r
 typedef struct {\r
   UINTN   Base;\r
   UINTN   Size;\r
@@ -195,6 +231,12 @@ PrepareFdt (
   UINT32                ClusterId;\r
   UINT32                CoreId;\r
   UINT64                CpuReleaseAddr;\r
+  UINTN                 MemoryMapSize;\r
+  EFI_MEMORY_DESCRIPTOR *MemoryMap;\r
+  UINTN                 MapKey;\r
+  UINTN                 DescriptorSize;\r
+  UINT32                DescriptorVersion;\r
+  UINTN                 Pages;\r
 \r
   err = fdt_check_header ((VOID*)(UINTN)(*FdtBlobBase));\r
   if (err != 0) {\r
@@ -259,7 +301,9 @@ PrepareFdt (
     }\r
   DEBUG_CODE_END();\r
 \r
+  //\r
   // Set Linux CmdLine\r
+  //\r
   if ((CommandLineArguments != NULL) && (AsciiStrLen (CommandLineArguments) > 0)) {\r
     err = fdt_setprop(fdt, node, "bootargs", CommandLineArguments, AsciiStrSize(CommandLineArguments));\r
     if (err) {\r
@@ -267,7 +311,9 @@ PrepareFdt (
     }\r
   }\r
 \r
+  //\r
   // Set Linux Initrd\r
+  //\r
   if (InitrdImageSize != 0) {\r
     InitrdImageStart = cpu_to_fdt64 (InitrdImage);\r
     err = fdt_setprop(fdt, node, "linux,initrd-start", &InitrdImageStart, sizeof(EFI_PHYSICAL_ADDRESS));\r
@@ -281,7 +327,9 @@ PrepareFdt (
     }\r
   }\r
 \r
+  //\r
   // Set Physical memory setup if does not exist\r
+  //\r
   node = fdt_subnode_offset(fdt, 0, "memory");\r
   if (node < 0) {\r
     // The 'memory' node does not exist, create it\r
@@ -308,7 +356,39 @@ PrepareFdt (
     }\r
   }\r
 \r
+  //\r
+  // Add the memory regions reserved by the UEFI Firmware\r
+  //\r
+\r
+  // Retrieve the UEFI Memory Map\r
+  MemoryMap = NULL;\r
+  MemoryMapSize = 0;\r
+  Status = gBS->GetMemoryMap (&MemoryMapSize, MemoryMap, &MapKey, &DescriptorSize, &DescriptorVersion);\r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    Pages = EFI_SIZE_TO_PAGES (MemoryMapSize) + 1;\r
+    MemoryMap = AllocatePages (Pages);\r
+    Status = gBS->GetMemoryMap (&MemoryMapSize, MemoryMap, &MapKey, &DescriptorSize, &DescriptorVersion);\r
+  }\r
+\r
+  // Go through the list and add the reserved region to the Device Tree\r
+  if (!EFI_ERROR(Status)) {\r
+    for (Index = 0; Index < (MemoryMapSize / sizeof(EFI_MEMORY_DESCRIPTOR)); Index++) {\r
+      if (IsLinuxReservedRegion ((EFI_MEMORY_TYPE)MemoryMap[Index].Type)) {\r
+        DEBUG((DEBUG_VERBOSE, "Reserved region of type %d [0x%X, 0x%X]\n",\r
+            MemoryMap[Index].Type,\r
+            (UINTN)MemoryMap[Index].PhysicalStart,\r
+            (UINTN)(MemoryMap[Index].PhysicalStart + MemoryMap[Index].NumberOfPages * EFI_PAGE_SIZE)));\r
+        err = fdt_add_mem_rsv(fdt, MemoryMap[Index].PhysicalStart, MemoryMap[Index].NumberOfPages * EFI_PAGE_SIZE);\r
+        if (err != 0) {\r
+          Print(L"Warning: Fail to add 'memreserve' (err:%d)\n", err);\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  //\r
   // Setup Arm Mpcore Info if it is a multi-core or multi-cluster platforms\r
+  //\r
   for (Index=0; Index < gST->NumberOfTableEntries; Index++) {\r
     // Check for correct GUID type\r
     if (CompareGuid (&gArmMpCoreInfoGuid, &(gST->ConfigurationTable[Index].VendorGuid))) {\r