]> git.proxmox.com Git - mirror_edk2.git/blobdiff - CorebootModulePkg/CbSupportPei/CbSupportPei.c
CorebootModulePkg: Fix memmap issue
[mirror_edk2.git] / CorebootModulePkg / CbSupportPei / CbSupportPei.c
index 46b08d2f084653dd64b7f96b76a04bfd53123835..8fa0ac5c1efa79b52ce59a0c84bc3de2a11f64b5 100755 (executable)
@@ -2,7 +2,7 @@
   This PEIM will parse coreboot table in memory and report resource information into pei core.\r
   This file contains the main entrypoint of the PEIM.\r
 \r
-Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -18,11 +18,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #define LEGACY_8259_MASK_REGISTER_SLAVE   0xA1\r
 \r
 EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {\r
-  { EfiACPIReclaimMemory,   0x008 },\r
-  { EfiACPIMemoryNVS,       0x004 },\r
-  { EfiReservedMemoryType,  0x004 },\r
-  { EfiRuntimeServicesData, 0x080 },\r
-  { EfiRuntimeServicesCode, 0x080 },\r
+  { EfiACPIReclaimMemory,   FixedPcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory) },\r
+  { EfiACPIMemoryNVS,       FixedPcdGet32 (PcdMemoryTypeEfiACPIMemoryNVS) },\r
+  { EfiReservedMemoryType,  FixedPcdGet32 (PcdMemoryTypeEfiReservedMemoryType) },\r
+  { EfiRuntimeServicesData, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesData) },\r
+  { EfiRuntimeServicesCode, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesCode) },\r
   { EfiMaxMemoryType,       0     }\r
 };\r
 \r
@@ -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,25 +239,18 @@ CbPeiEntryPoint (
   UINTN                PmCtrlRegBase, PmTimerRegBase, ResetRegAddress, ResetValue;\r
   UINTN                PmEvtBase;\r
   UINTN                PmGpeEnBase;\r
+  CB_MEM_INFO          CbMemInfo;\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
-\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
+  //\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
@@ -217,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
@@ -325,7 +363,8 @@ CbPeiEntryPoint (
   if ((CbParseGetCbHeader (1, &pCbHeader) == RETURN_SUCCESS)\r
     && ((UINTN)pCbHeader > BASE_4KB)) {\r
     DEBUG((EFI_D_ERROR, "Actual Coreboot header: %p.\n", pCbHeader));\r
-    PcdSet32 (PcdCbHeaderPointer, (UINT32)(UINTN)pCbHeader);\r
+    Status = PcdSet32S (PcdCbHeaderPointer, (UINT32)(UINTN)pCbHeader);\r
+    ASSERT_EFI_ERROR (Status);\r
   }\r
 \r
   //\r
@@ -382,6 +421,15 @@ CbPeiEntryPoint (
     DEBUG ((EFI_D_ERROR, "Create frame buffer info guid hob\n"));\r
   }\r
 \r
+  //\r
+  // Parse platform specific information from coreboot. \r
+  //\r
+  Status = CbParsePlatformInfo ();\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((EFI_D_ERROR, "Error when parsing platform info, Status = %r\n", Status));\r
+    return Status;\r
+  }\r
+\r
   //\r
   // Mask off all legacy 8259 interrupt sources\r
   //\r