]> git.proxmox.com Git - mirror_edk2.git/blobdiff - CorebootModulePkg/CbSupportPei/CbSupportPei.c
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / CorebootModulePkg / CbSupportPei / CbSupportPei.c
index b3705fa4cdcfb6c7d6d374bf2e55f60b6daea6e6..bdb2faa0b60e8af98bbd96e1623aabbab0c74af2 100755 (executable)
@@ -2,14 +2,8 @@
   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
-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
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 #include "CbSupportPei.h"\r
@@ -18,11 +12,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 +134,77 @@ 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
+  if ((Base  < 0x100000) && ((Base + Size) > 0x100000)) {\r
+         Size -= (0x100000 - Base);\r
+         Base  = 0x100000;\r
+  }\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 +220,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
@@ -171,25 +236,20 @@ CbPeiEntryPoint (
   FRAME_BUFFER_INFO*   pFbInfo;\r
   ACPI_BOARD_INFO*     pAcpiBoardInfo;\r
   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
@@ -215,37 +275,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
@@ -323,7 +362,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
@@ -355,7 +395,7 @@ CbPeiEntryPoint (
   //\r
   // Create guid hob for acpi board information\r
   //\r
-  Status = CbParseFadtInfo (&PmCtrlRegBase, &PmTimerRegBase, &ResetRegAddress, &ResetValue);\r
+  Status = CbParseFadtInfo (&PmCtrlRegBase, &PmTimerRegBase, &ResetRegAddress, &ResetValue, &PmEvtBase, &PmGpeEnBase);\r
   ASSERT_EFI_ERROR (Status);\r
   pAcpiBoardInfo = NULL;\r
   pAcpiBoardInfo = BuildGuidHob (&gUefiAcpiBoardInfoGuid, sizeof (ACPI_BOARD_INFO));\r
@@ -364,6 +404,8 @@ CbPeiEntryPoint (
   pAcpiBoardInfo->PmTimerRegBase = (UINT64)PmTimerRegBase;\r
   pAcpiBoardInfo->ResetRegAddress = (UINT64)ResetRegAddress;\r
   pAcpiBoardInfo->ResetValue = (UINT8)ResetValue;\r
+  pAcpiBoardInfo->PmEvtBase = (UINT64)PmEvtBase;\r
+  pAcpiBoardInfo->PmGpeEnBase = (UINT64)PmGpeEnBase;\r
   DEBUG ((EFI_D_ERROR, "Create acpi board info guid hob\n"));\r
 \r
   //\r
@@ -378,6 +420,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