]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFsp2WrapperPkg/FspsWrapperPeim/FspsWrapperPeim.c
IntelFsp2WrapperPkg/FspsWrapperPeim: Fix coding style.
[mirror_edk2.git] / IntelFsp2WrapperPkg / FspsWrapperPeim / FspsWrapperPeim.c
index 9bc720fe2d406afa8ce4aab7a2c197b0e673ea64..0f8cd69a0e6eba93a70265a1965d130cea25a7a9 100644 (file)
@@ -3,14 +3,8 @@
   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
-  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 - 2019, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include <Ppi/MemoryDiscovered.h>\r
 #include <Ppi/TemporaryRamDone.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_PEI_NOTIFY_DESCRIPTOR mS3EndOfPeiNotifyDesc;\r
 extern EFI_GUID                  gFspHobGuid;\r
 \r
 /**\r
-This function handles S3 resume task at the end of PEI\r
+  This function handles S3 resume task at the end of PEI.\r
 \r
-@param[in] PeiServices    Pointer to PEI Services Table.\r
-@param[in] NotifyDesc     Pointer to the descriptor for the Notification event that\r
-caused this function to execute.\r
-@param[in] Ppi            Pointer to the PPI data associated with this function.\r
+  @param[in] PeiServices    Pointer to PEI Services Table.\r
+  @param[in] NotifyDesc     Pointer to the descriptor for the Notification event that\r
+                            caused this function to execute.\r
+  @param[in] Ppi            Pointer to the PPI data associated with this function.\r
 \r
-@retval EFI_STATUS        Always return EFI_SUCCESS\r
+  @retval EFI_STATUS        Always return EFI_SUCCESS\r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
@@ -68,14 +62,14 @@ EFI_PEI_NOTIFY_DESCRIPTOR mS3EndOfPeiNotifyDesc = {
 };\r
 \r
 /**\r
-This function handles S3 resume task at the end of PEI\r
+  This function handles S3 resume task at the end of PEI.\r
 \r
-@param[in] PeiServices    Pointer to PEI Services Table.\r
-@param[in] NotifyDesc     Pointer to the descriptor for the Notification event that\r
-caused this function to execute.\r
-@param[in] Ppi            Pointer to the PPI data associated with this function.\r
+  @param[in] PeiServices    Pointer to PEI Services Table.\r
+  @param[in] NotifyDesc     Pointer to the descriptor for the Notification event that\r
+                            caused this function to execute.\r
+  @param[in] Ppi            Pointer to the PPI data associated with this function.\r
 \r
-@retval EFI_STATUS        Always return EFI_SUCCESS\r
+  @retval EFI_STATUS        Always return EFI_SUCCESS\r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
@@ -94,25 +88,49 @@ S3EndOfPeiNotify(
   Status = CallFspNotifyPhase (&NotifyPhaseParams);\r
   DEBUG((DEBUG_INFO, "FSP S3NotifyPhase AfterPciEnumeration status: 0x%x\n", Status));\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, "FSP S3NotifyPhase AfterPciEnumeration requested reset 0x%x\n", Status));\r
+    CallFspWrapperResetSystem ((UINT32)Status);\r
+  }\r
+\r
   NotifyPhaseParams.Phase = EnumInitPhaseReadyToBoot;\r
   Status = CallFspNotifyPhase (&NotifyPhaseParams);\r
   DEBUG((DEBUG_INFO, "FSP S3NotifyPhase ReadyToBoot status: 0x%x\n", Status));\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, "FSP S3NotifyPhase ReadyToBoot requested reset 0x%x\n", Status));\r
+    CallFspWrapperResetSystem ((UINT32)Status);\r
+  }\r
+\r
   NotifyPhaseParams.Phase = EnumInitPhaseEndOfFirmware;\r
   Status = CallFspNotifyPhase (&NotifyPhaseParams);\r
   DEBUG((DEBUG_INFO, "FSP S3NotifyPhase EndOfFirmware status: 0x%x\n", Status));\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, "FSP S3NotifyPhase EndOfFirmware requested reset 0x%x\n", Status));\r
+    CallFspWrapperResetSystem ((UINT32)Status);\r
+  }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
-Return Hob list produced by FSP.\r
+  Return Hob list produced by FSP.\r
 \r
-@param[in]  PeiServices  The pointer to the PEI Services Table.\r
-@param[in]  This         The pointer to this instance of this PPI.\r
-@param[out] FspHobList   The pointer to Hob list produced by FSP.\r
+  @param[in]  PeiServices  The pointer to the PEI Services Table.\r
+  @param[in]  This         The pointer to this instance of this PPI.\r
+  @param[out] FspHobList   The pointer to Hob list produced by FSP.\r
 \r
-@return EFI_SUCCESS FReturn Hob list produced by FSP successfully.\r
+  @return EFI_SUCCESS      Return Hob list produced by FSP successfully.\r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
@@ -133,13 +151,13 @@ EFI_PEI_PPI_DESCRIPTOR            mPeiFspSiliconInitDonePpi = {
 };\r
 \r
 /**\r
-Return Hob list produced by FSP.\r
+  Return Hob list produced by FSP.\r
 \r
-@param[in]  PeiServices  The pointer to the PEI Services Table.\r
-@param[in]  This         The pointer to this instance of this PPI.\r
-@param[out] FspHobList   The pointer to Hob list produced by FSP.\r
+  @param[in]  PeiServices  The pointer to the PEI Services Table.\r
+  @param[in]  This         The pointer to this instance of this PPI.\r
+  @param[out] FspHobList   The pointer to Hob list produced by FSP.\r
 \r
-@return EFI_SUCCESS FReturn Hob list produced by FSP successfully.\r
+  @return EFI_SUCCESS      Return Hob list produced by FSP successfully.\r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
@@ -160,6 +178,49 @@ FspSiliconInitDoneGetFspHobList (
   }\r
 }\r
 \r
+/**\r
+  This function is for FSP dispatch mode to perform post FSP-S process.\r
+\r
+  @param[in] PeiServices    Pointer to PEI Services Table.\r
+  @param[in] NotifyDesc     Pointer to the descriptor for the Notification event that\r
+                            caused this function to execute.\r
+  @param[in] Ppi            Pointer to the PPI data associated with this function.\r
+\r
+  @retval EFI_STATUS        Status returned by PeiServicesInstallPpi ()\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FspsWrapperEndOfPeiNotify (\r
+  IN EFI_PEI_SERVICES          **PeiServices,\r
+  IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,\r
+  IN VOID                      *Ppi\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  //\r
+  // This step may include platform specific process in some boot loaders so\r
+  // aligning the same behavior between API and Dispatch modes.\r
+  // Note: In Dispatch mode no FspHobList so passing NULL to function and\r
+  //       expecting function will handle it.\r
+  //\r
+  PostFspsHobProcess (NULL);\r
+\r
+  //\r
+  // Install FspSiliconInitDonePpi so that any other driver can consume this info.\r
+  //\r
+  Status = PeiServicesInstallPpi (&mPeiFspSiliconInitDonePpi);\r
+  ASSERT_EFI_ERROR(Status);\r
+\r
+  return Status;\r
+}\r
+\r
+EFI_PEI_NOTIFY_DESCRIPTOR mFspsWrapperEndOfPeiNotifyDesc = {\r
+  (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+  &gEfiEndOfPeiSignalPpiGuid,\r
+  FspsWrapperEndOfPeiNotify\r
+};\r
+\r
 /**\r
   This function is called after PEI core discover memory and finish migration.\r
 \r
@@ -185,14 +246,14 @@ EFI_PEI_NOTIFY_DESCRIPTOR mPeiMemoryDiscoveredNotifyDesc = {
 };\r
 \r
 /**\r
-This function is called after PEI core discover memory and finish migration.\r
+  This function is called after PEI core discover memory and finish migration.\r
 \r
-@param[in] PeiServices    Pointer to PEI Services Table.\r
-@param[in] NotifyDesc     Pointer to the descriptor for the Notification event that\r
-caused this function to execute.\r
-@param[in] Ppi            Pointer to the PPI data associated with this function.\r
+  @param[in] PeiServices    Pointer to PEI Services Table.\r
+  @param[in] NotifyDesc     Pointer to the descriptor for the Notification event that\r
+                            caused this function to execute.\r
+  @param[in] Ppi            Pointer to the PPI data associated with this function.\r
 \r
-@retval EFI_STATUS        Always return EFI_SUCCESS\r
+  @retval EFI_STATUS        Always return EFI_SUCCESS\r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
@@ -210,25 +271,44 @@ PeiMemoryDiscoveredNotify (
   FSPS_UPD_COMMON           *FspsUpdDataPtr;\r
   UINTN                     *SourceData;\r
 \r
-  \r
   DEBUG ((DEBUG_INFO, "PeiMemoryDiscoveredNotify enter\n"));\r
-  \r
-  //\r
-  // Copy default FSP-S UPD data from Flash\r
-  //\r
+  FspsUpdDataPtr = NULL;\r
+\r
   FspsHeaderPtr = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32 (PcdFspsBaseAddress));\r
-  FspsUpdDataPtr = (FSPS_UPD_COMMON *)AllocateZeroPool ((UINTN)FspsHeaderPtr->CfgRegionSize);\r
-  ASSERT (FspsUpdDataPtr != NULL);\r
-  SourceData = (UINTN *)((UINTN)FspsHeaderPtr->ImageBase + (UINTN)FspsHeaderPtr->CfgRegionOffset);\r
-  CopyMem (FspsUpdDataPtr, SourceData, (UINTN)FspsHeaderPtr->CfgRegionSize);\r
+  DEBUG ((DEBUG_INFO, "FspsHeaderPtr - 0x%x\n", FspsHeaderPtr));\r
+  if (FspsHeaderPtr == NULL) {\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  if (PcdGet32 (PcdFspsUpdDataAddress) == 0 && (FspsHeaderPtr->CfgRegionSize != 0) && (FspsHeaderPtr->CfgRegionOffset != 0)) {\r
+    //\r
+    // Copy default FSP-S UPD data from Flash\r
+    //\r
+    FspsUpdDataPtr = (FSPS_UPD_COMMON *)AllocateZeroPool ((UINTN)FspsHeaderPtr->CfgRegionSize);\r
+    ASSERT (FspsUpdDataPtr != NULL);\r
+    SourceData = (UINTN *)((UINTN)FspsHeaderPtr->ImageBase + (UINTN)FspsHeaderPtr->CfgRegionOffset);\r
+    CopyMem (FspsUpdDataPtr, SourceData, (UINTN)FspsHeaderPtr->CfgRegionSize);\r
+  } else {\r
+    FspsUpdDataPtr = (FSPS_UPD_COMMON *)PcdGet32 (PcdFspsUpdDataAddress);\r
+    ASSERT (FspsUpdDataPtr != NULL);\r
+  }\r
 \r
   UpdateFspsUpdData ((VOID *)FspsUpdDataPtr);\r
 \r
   TimeStampCounterStart = AsmReadTsc ();\r
-  PERF_START_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, 0x9000);\r
+  PERF_START_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY);\r
   Status = CallFspSiliconInit ((VOID *)FspsUpdDataPtr);\r
-  PERF_END_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, 0x907F);\r
+  PERF_END_EX(&gFspApiPerformanceGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_SILICON_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT);\r
   DEBUG ((DEBUG_INFO, "Total time spent executing FspSiliconInitApi: %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, "FspSiliconInitApi 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 FspSiliconInitApi(), Status = %r\n", Status));\r
   }\r
@@ -259,12 +339,12 @@ PeiMemoryDiscoveredNotify (
 }\r
 \r
 /**\r
-  Do FSP initialization.\r
+  Do FSP initialization in API mode.\r
 \r
-  @return FSP initialization status.\r
+  @retval EFI_STATUS        Always return EFI_SUCCESS\r
 **/\r
 EFI_STATUS\r
-FspsWrapperInit (\r
+FspsWrapperInitApiMode (\r
   VOID\r
   )\r
 {\r
@@ -276,7 +356,7 @@ FspsWrapperInit (
   //\r
   Status = PeiServicesNotifyPpi (&mPeiMemoryDiscoveredNotifyDesc);\r
   ASSERT_EFI_ERROR (Status);\r
-      \r
+\r
   //\r
   // Register EndOfPei Notify for S3 to run FSP NotifyPhase\r
   //\r
@@ -290,7 +370,36 @@ FspsWrapperInit (
 }\r
 \r
 /**\r
-  This is the entrypoint of PEIM\r
+  Do FSP initialization in Dispatch mode.\r
+\r
+  @retval FSP initialization status.\r
+**/\r
+EFI_STATUS\r
+FspsWrapperInitDispatchMode (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS           Status;\r
+  //\r
+  // FSP-S Wrapper running in Dispatch mode and reports FSP-S FV to PEI dispatcher.\r
+  //\r
+  PeiServicesInstallFvInfoPpi (\r
+    NULL,\r
+    (VOID *)(UINTN) PcdGet32 (PcdFspsBaseAddress),\r
+    (UINT32)((EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) PcdGet32 (PcdFspsBaseAddress))->FvLength,\r
+    NULL,\r
+    NULL\r
+    );\r
+  //\r
+  // Register EndOfPei Nofity to run post FSP-S process.\r
+  //\r
+  Status = PeiServicesNotifyPpi (&mFspsWrapperEndOfPeiNotifyDesc);\r
+  ASSERT_EFI_ERROR (Status);\r
+  return Status;\r
+}\r
+\r
+/**\r
+  This is the entrypoint of PEIM.\r
 \r
   @param[in] FileHandle  Handle of the file being invoked.\r
   @param[in] PeiServices Describes the list of possible PEI Services.\r
@@ -304,10 +413,13 @@ FspsWrapperPeimEntryPoint (
   IN CONST EFI_PEI_SERVICES     **PeiServices\r
   )\r
 {\r
-\r
   DEBUG ((DEBUG_INFO, "FspsWrapperPeimEntryPoint\n"));\r
 \r
-  FspsWrapperInit ();\r
+  if (PcdGet8 (PcdFspModeSelection) == 1) {\r
+    FspsWrapperInitApiMode ();\r
+  } else {\r
+    FspsWrapperInitDispatchMode ();\r
+  }\r
 \r
   return EFI_SUCCESS;\r
 }\r