]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFsp2WrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c
EmbeddedPkg/PrePiLib: Correct function name
[mirror_edk2.git] / IntelFsp2WrapperPkg / FspmWrapperPeim / FspmWrapperPeim.c
index b1c605c80b124326bc1a98c8b0b40afe0a14a420..18f04b541a21714a115dab64cd2516ff16a30103 100644 (file)
@@ -3,7 +3,7 @@
   register TemporaryRamDonePpi to call TempRamExit API, and register MemoryDiscoveredPpi\r
   notify to call FspSiliconInit API.\r
 \r
-  Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2014 - 2018, 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
@@ -36,9 +36,9 @@
 #include <Ppi/EndOfPeiPhase.h>\r
 #include <Ppi/MemoryDiscovered.h>\r
 #include <Ppi/SecPlatformInformation.h>\r
-#include <Library/PlatformSecLib.h>\r
 #include <Library/FspWrapperApiTestLib.h>\r
 #include <FspEas.h>\r
+#include <FspStatusCode.h>\r
 \r
 extern EFI_GUID gFspHobGuid;\r
 \r
@@ -63,17 +63,31 @@ PeiFspMemoryInit (
   DEBUG ((DEBUG_INFO, "PeiFspMemoryInit enter\n"));\r
 \r
   FspHobListPtr = NULL;\r
+  FspmUpdDataPtr = NULL;\r
 \r
-  //\r
-  // Copy default FSP-M UPD data from Flash\r
-  //\r
-  FspmHeaderPtr = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress));\r
-  FspmUpdDataPtr = (FSPM_UPD_COMMON *)AllocateZeroPool ((UINTN)FspmHeaderPtr->CfgRegionSize);\r
-  ASSERT (FspmUpdDataPtr != NULL);\r
-  SourceData = (UINTN *)((UINTN)FspmHeaderPtr->ImageBase + (UINTN)FspmHeaderPtr->CfgRegionOffset);\r
-  CopyMem (FspmUpdDataPtr, SourceData, (UINTN)FspmHeaderPtr->CfgRegionSize);\r
+  FspmHeaderPtr = (FSP_INFO_HEADER *) FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress));\r
+  DEBUG ((DEBUG_INFO, "FspmHeaderPtr - 0x%x\n", FspmHeaderPtr));\r
+  if (FspmHeaderPtr == NULL) {\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
 \r
-  DEBUG ((DEBUG_INFO, "FspWrapperPlatformInitPreMem enter\n"));\r
+  if (PcdGet32 (PcdFspmUpdDataAddress) == 0 && (FspmHeaderPtr->CfgRegionSize != 0) && (FspmHeaderPtr->CfgRegionOffset != 0)) {\r
+    //\r
+    // Copy default FSP-M UPD data from Flash\r
+    //\r
+    FspmUpdDataPtr = (FSPM_UPD_COMMON *)AllocateZeroPool ((UINTN)FspmHeaderPtr->CfgRegionSize);\r
+    ASSERT (FspmUpdDataPtr != NULL);\r
+    SourceData = (UINTN *)((UINTN)FspmHeaderPtr->ImageBase + (UINTN)FspmHeaderPtr->CfgRegionOffset);\r
+    CopyMem (FspmUpdDataPtr, SourceData, (UINTN)FspmHeaderPtr->CfgRegionSize);\r
+  } else {\r
+    //\r
+    // External UPD is ready, get the buffer from PCD pointer.\r
+    //\r
+    FspmUpdDataPtr = (FSPM_UPD_COMMON *)PcdGet32 (PcdFspmUpdDataAddress);\r
+    ASSERT (FspmUpdDataPtr != NULL);\r
+  }\r
+\r
+  DEBUG ((DEBUG_INFO, "UpdateFspmUpdData enter\n"));\r
   UpdateFspmUpdData ((VOID *)FspmUpdDataPtr);\r
   DEBUG ((DEBUG_INFO, "  NvsBufferPtr        - 0x%x\n", FspmUpdDataPtr->FspmArchUpd.NvsBufferPtr));\r
   DEBUG ((DEBUG_INFO, "  StackBase           - 0x%x\n", FspmUpdDataPtr->FspmArchUpd.StackBase));\r
@@ -85,9 +99,18 @@ PeiFspMemoryInit (
   TimeStampCounterStart = AsmReadTsc ();\r
   Status = CallFspMemoryInit (FspmUpdDataPtr, &FspHobListPtr);\r
   // Create hobs after memory initialization and not in temp RAM. Hence passing the recorded timestamp here\r
-  PERF_START_EX(&gFspApiPerformanceGuid, "EventRec", NULL, TimeStampCounterStart, 0xD000);\r
-  PERF_END_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, 0xD07F);\r
+  PERF_START_EX(&gFspApiPerformanceGuid, "EventRec", NULL, TimeStampCounterStart, FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
+  PERF_END_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_MEMORY_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
   DEBUG ((DEBUG_INFO, "Total time spent executing FspMemoryInitApi: %d millisecond\n", DivU64x32 (GetTimeInNanoSecond (AsmReadTsc () - TimeStampCounterStart), 1000000)));\r
+\r
+  //\r
+  // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED status\r
+  //\r
+  if ((Status >= FSP_STATUS_RESET_REQUIRED_COLD) && (Status <= FSP_STATUS_RESET_REQUIRED_8)) {\r
+    DEBUG((DEBUG_INFO, "FspMemoryInitApi requested reset 0x%x\n", Status));\r
+    CallFspWrapperResetSystem ((UINT32)Status);\r
+  }\r
+\r
   if (EFI_ERROR(Status)) {\r
     DEBUG ((DEBUG_ERROR, "ERROR - Failed to execute FspMemoryInitApi(), Status = %r\n", Status));\r
   }\r
@@ -132,8 +155,20 @@ FspmWrapperInit (
 {\r
   EFI_STATUS           Status;\r
 \r
-  Status = PeiFspMemoryInit ();\r
-  ASSERT_EFI_ERROR (Status);\r
+  Status = EFI_SUCCESS;\r
+\r
+  if (PcdGet8 (PcdFspModeSelection) == 1) {\r
+    Status = PeiFspMemoryInit ();\r
+    ASSERT_EFI_ERROR (Status);\r
+  } else {\r
+    PeiServicesInstallFvInfoPpi (\r
+      NULL,\r
+      (VOID *)(UINTN) PcdGet32 (PcdFspmBaseAddress),\r
+      (UINT32)((EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) PcdGet32 (PcdFspmBaseAddress))->FvLength,\r
+      NULL,\r
+      NULL\r
+      );\r
+  }\r
 \r
   return Status;\r
 }\r