]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFsp2WrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c
IntelFsp2WrapperPkg: Support FSP Dispatch mode
[mirror_edk2.git] / IntelFsp2WrapperPkg / FspmWrapperPeim / FspmWrapperPeim.c
index 0f6a7bdf40555bb7c5f5acb62dc8eb27fc5b4422..fa0441ce6c0eee9f54cb17ac5f90a2c35f240c78 100644 (file)
@@ -3,7 +3,7 @@
   register TemporaryRamDonePpi to call TempRamExit API, and register MemoryDiscoveredPpi\r
   notify to call FspSiliconInit API.\r
 \r
   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
   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
@@ -38,6 +38,7 @@
 #include <Ppi/SecPlatformInformation.h>\r
 #include <Library/FspWrapperApiTestLib.h>\r
 #include <FspEas.h>\r
 #include <Ppi/SecPlatformInformation.h>\r
 #include <Library/FspWrapperApiTestLib.h>\r
 #include <FspEas.h>\r
+#include <FspStatusCode.h>\r
 \r
 extern EFI_GUID gFspHobGuid;\r
 \r
 \r
 extern EFI_GUID gFspHobGuid;\r
 \r
@@ -62,20 +63,29 @@ PeiFspMemoryInit (
   DEBUG ((DEBUG_INFO, "PeiFspMemoryInit enter\n"));\r
 \r
   FspHobListPtr = NULL;\r
   DEBUG ((DEBUG_INFO, "PeiFspMemoryInit enter\n"));\r
 \r
   FspHobListPtr = NULL;\r
+  FspmUpdDataPtr = NULL;\r
 \r
 \r
-  //\r
-  // Copy default FSP-M UPD data from Flash\r
-  //\r
-  FspmHeaderPtr = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress));\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, "FspmHeaderPtr - 0x%x\n", FspmHeaderPtr));\r
   if (FspmHeaderPtr == NULL) {\r
     return EFI_DEVICE_ERROR;\r
   }\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
+  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
 \r
   DEBUG ((DEBUG_INFO, "UpdateFspmUpdData enter\n"));\r
   UpdateFspmUpdData ((VOID *)FspmUpdDataPtr);\r
@@ -89,8 +99,8 @@ 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
   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
   DEBUG ((DEBUG_INFO, "Total time spent executing FspMemoryInitApi: %d millisecond\n", DivU64x32 (GetTimeInNanoSecond (AsmReadTsc () - TimeStampCounterStart), 1000000)));\r
 \r
   //\r
@@ -145,8 +155,20 @@ FspmWrapperInit (
 {\r
   EFI_STATUS           Status;\r
 \r
 {\r
   EFI_STATUS           Status;\r
 \r
-  Status = PeiFspMemoryInit ();\r
-  ASSERT_EFI_ERROR (Status);\r
+  Status = EFI_SUCCESS;\r
+\r
+  if (FixedPcdGet8 (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
 \r
   return Status;\r
 }\r