]> git.proxmox.com Git - mirror_edk2.git/blobdiff - CorebootModulePkg/CbSupportPei/CbSupportPei.c
CorebootModulePkg: Fix memmap issue
[mirror_edk2.git] / CorebootModulePkg / CbSupportPei / CbSupportPei.c
index 80fd611bc8e43ba584ca703e2a76b72e92ffd9d1..8fa0ac5c1efa79b52ce59a0c84bc3de2a11f64b5 100755 (executable)
@@ -140,6 +140,72 @@ CbPeiReportRemainedFvs (
   }\r
 }\r
 \r
+/**\r
+  Based on memory base, size and type, build resource descripter HOB.\r
+\r
+  @param  Base    Memory base address.\r
+  @param  Size    Memory size.\r
+  @param  Type    Memory type.\r
+  @param  Param   A pointer to CB_MEM_INFO.\r
+\r
+  @retval EFI_SUCCESS if it completed successfully.\r
+**/\r
+EFI_STATUS\r
+CbMemInfoCallback (\r
+  UINT64                  Base,\r
+  UINT64                  Size,\r
+  UINT32                  Type,\r
+  VOID                    *Param\r
+  )\r
+{\r
+  CB_MEM_INFO             *MemInfo;\r
+  UINTN                   Attribue;\r
+\r
+  Attribue = EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
+             EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
+             EFI_RESOURCE_ATTRIBUTE_TESTED |\r
+             EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
+             EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
+             EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
+             EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE;\r
+\r
+  MemInfo = (CB_MEM_INFO *)Param;\r
+  if (Base >= 0x100000) {\r
+    if (Type == CB_MEM_RAM) {\r
+      if (Base < 0x100000000ULL) {\r
+        MemInfo->UsableLowMemTop = (UINT32)(Base + Size);\r
+      } else {\r
+        Attribue &= ~EFI_RESOURCE_ATTRIBUTE_TESTED;\r
+      }\r
+      BuildResourceDescriptorHob (\r
+        EFI_RESOURCE_SYSTEM_MEMORY,\r
+        Attribue,\r
+        (EFI_PHYSICAL_ADDRESS)Base,\r
+        Size\r
+        );\r
+    } else if (Type == CB_MEM_TABLE) {\r
+      BuildResourceDescriptorHob (\r
+        EFI_RESOURCE_MEMORY_RESERVED,\r
+        Attribue,\r
+        (EFI_PHYSICAL_ADDRESS)Base,\r
+        Size\r
+        );\r
+      MemInfo->SystemLowMemTop = ((UINT32)(Base + Size) + 0x0FFFFFFF) & 0xF0000000;\r
+    } else if (Type == CB_MEM_RESERVED) {\r
+      if ((MemInfo->SystemLowMemTop == 0) || (Base < MemInfo->SystemLowMemTop)) {\r
+        BuildResourceDescriptorHob (\r
+          EFI_RESOURCE_MEMORY_RESERVED,\r
+          Attribue,\r
+          (EFI_PHYSICAL_ADDRESS)Base,\r
+          Size\r
+          ); \r
+      }\r
+    }\r
+  }\r
+  \r
+  return EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   This is the entrypoint of PEIM\r
 \r
@@ -155,9 +221,9 @@ CbPeiEntryPoint (
   IN CONST EFI_PEI_SERVICES     **PeiServices\r
   )\r
 {\r
-  EFI_STATUS Status;\r
-  UINT64 LowMemorySize, HighMemorySize;\r
-  UINT64 PeiMemSize = SIZE_64MB;   // 64 MB\r
+  EFI_STATUS           Status;\r
+  UINT64               LowMemorySize;\r
+  UINT64               PeiMemSize = SIZE_64MB;   // 64 MB\r
   EFI_PHYSICAL_ADDRESS PeiMemBase = 0;\r
   UINT32               RegEax;\r
   UINT8                PhysicalAddressBits;\r
@@ -173,23 +239,12 @@ CbPeiEntryPoint (
   UINTN                PmCtrlRegBase, PmTimerRegBase, ResetRegAddress, ResetValue;\r
   UINTN                PmEvtBase;\r
   UINTN                PmGpeEnBase;\r
-\r
-  LowMemorySize = 0;\r
-  HighMemorySize = 0;\r
-\r
-  Status = CbParseMemoryInfo (&LowMemorySize, &HighMemorySize);\r
-  if (EFI_ERROR(Status))\r
-    return Status;\r
-\r
-  DEBUG((EFI_D_ERROR, "LowMemorySize: 0x%lx.\n", LowMemorySize));\r
-  DEBUG((EFI_D_ERROR, "HighMemorySize: 0x%lx.\n", HighMemorySize));\r
-\r
-  ASSERT (LowMemorySize > 0);\r
+  CB_MEM_INFO          CbMemInfo;\r
 \r
   //\r
   // Report lower 640KB of RAM. Attribute EFI_RESOURCE_ATTRIBUTE_TESTED  \r
- // is intentionally omitted to prevent erasing of the coreboot header  \r
- // record before it is processed by CbParseMemoryInfo.\r
 // is intentionally omitted to prevent erasing of the coreboot header  \r
 // record before it is processed by CbParseMemoryInfo.\r
   //\r
   BuildResourceDescriptorHob (\r
     EFI_RESOURCE_SYSTEM_MEMORY,\r
@@ -221,37 +276,16 @@ CbPeiEntryPoint (
     (UINT64)(0x60000)\r
     );\r
 \r
-   BuildResourceDescriptorHob (\r
-    EFI_RESOURCE_SYSTEM_MEMORY,\r
-    (\r
-       EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
-       EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
-       EFI_RESOURCE_ATTRIBUTE_TESTED |\r
-       EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
-       EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
-       EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
-       EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
-    ),\r
-    (EFI_PHYSICAL_ADDRESS)(0x100000),\r
-    (UINT64) (LowMemorySize - 0x100000)\r
-    );\r
-\r
-  if (HighMemorySize > 0) {\r
-    BuildResourceDescriptorHob (\r
-    EFI_RESOURCE_SYSTEM_MEMORY,\r
-    (\r
-       EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
-       EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
-       EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
-       EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
-       EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
-       EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE\r
-    ),\r
-    (EFI_PHYSICAL_ADDRESS)(0x100000000ULL),\r
-    HighMemorySize\r
-    );\r
+  ZeroMem (&CbMemInfo, sizeof(CbMemInfo));\r
+  Status = CbParseMemoryInfo (CbMemInfoCallback, (VOID *)&CbMemInfo);\r
+  if (EFI_ERROR(Status)) {\r
+    return Status;\r
   }\r
 \r
+  LowMemorySize = CbMemInfo.UsableLowMemTop;\r
+  DEBUG ((EFI_D_INFO, "Low memory 0x%lx\n", LowMemorySize));\r
+  DEBUG ((EFI_D_INFO, "SystemLowMemTop 0x%x\n", CbMemInfo.SystemLowMemTop));\r
+\r
   //\r
   // Should be 64k aligned\r
   //\r