diff --git a/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.c b/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.c index 3d1d66c31473..f76f8249387c 100644 --- a/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.c +++ b/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.c @@ -9,12 +9,120 @@ **/ #include +#include +#include +#include #include #include #include #include #include +#include +#include #include +#include +#include +#include +#include +#include +#include + +/** + Call FspSmmInit API. + + @return Status returned by FspSmmInit API. +**/ +EFI_STATUS +FspiWrapperInitApiMode ( + VOID + ) +{ + FSP_INFO_HEADER *FspiHeaderPtr; + EFI_STATUS Status; + UINT64 TimeStampCounterStart; + EFI_HOB_GUID_TYPE *GuidHob; + VOID *FspHobListPtr; + VOID *FspiUpdDataPtr; + UINTN *SourceData; + + DEBUG ((DEBUG_INFO, "PeiFspSmmInit enter\n")); + + FspHobListPtr = NULL; + FspiUpdDataPtr = NULL; + + FspiHeaderPtr = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32 (PcdFspiBaseAddress)); + DEBUG ((DEBUG_INFO, "FspiHeaderPtr - 0x%x\n", FspiHeaderPtr)); + if (FspiHeaderPtr == NULL) { + return EFI_DEVICE_ERROR; + } + + if ((PcdGet64 (PcdFspiUpdDataAddress) == 0) && (FspiHeaderPtr->CfgRegionSize != 0) && (FspiHeaderPtr->CfgRegionOffset != 0)) { + // + // Copy default FSP-I UPD data from Flash + // + FspiUpdDataPtr = AllocateZeroPool ((UINTN)FspiHeaderPtr->CfgRegionSize); + ASSERT (FspiUpdDataPtr != NULL); + SourceData = (UINTN *)((UINTN)FspiHeaderPtr->ImageBase + (UINTN)FspiHeaderPtr->CfgRegionOffset); + CopyMem (FspiUpdDataPtr, SourceData, (UINTN)FspiHeaderPtr->CfgRegionSize); + } else { + // + // External UPD is ready, get the buffer from PCD pointer. + // + FspiUpdDataPtr = (VOID *)(UINTN)PcdGet64 (PcdFspiUpdDataAddress); + ASSERT (FspiUpdDataPtr != NULL); + } + + DEBUG ((DEBUG_INFO, "UpdateFspiUpdData enter\n")); + UpdateFspiUpdData (FspiUpdDataPtr); + DEBUG ((DEBUG_INFO, " BootloaderSmmFvBaseAddress - 0x%lx\n", ((FSPI_UPD_COMMON *)FspiUpdDataPtr)->FspiArchUpd.BootloaderSmmFvBaseAddress)); + DEBUG ((DEBUG_INFO, " BootloaderSmmFvLength - 0x%lx\n", ((FSPI_UPD_COMMON *)FspiUpdDataPtr)->FspiArchUpd.BootloaderSmmFvLength)); + DEBUG ((DEBUG_INFO, " BootloaderSmmFvContextData - 0x%lx\n", ((FSPI_UPD_COMMON *)FspiUpdDataPtr)->FspiArchUpd.BootloaderSmmFvContextData)); + DEBUG ((DEBUG_INFO, " BootloaderSmmFvContextDataLength - 0x%lx\n", ((FSPI_UPD_COMMON *)FspiUpdDataPtr)->FspiArchUpd.BootloaderSmmFvContextDataLength)); + + // + // Get FspHobList + // + GuidHob = GetFirstGuidHob (&gFspHobGuid); + ASSERT (GuidHob != NULL); + FspHobListPtr = *(VOID **)GET_GUID_HOB_DATA (GuidHob); + DEBUG ((DEBUG_INFO, " HobListPtr - 0x%x\n", &FspHobListPtr)); + + TimeStampCounterStart = AsmReadTsc (); + Status = CallFspSmmInit (FspiUpdDataPtr); + + // + // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED status + // + if ((Status >= FSP_STATUS_RESET_REQUIRED_COLD) && (Status <= FSP_STATUS_RESET_REQUIRED_8)) { + DEBUG ((DEBUG_INFO, "FspSmmInitApi requested reset %r\n", Status)); + CallFspWrapperResetSystem (Status); + } + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "ERROR - Failed to execute FspSmmInitApi(), Status = %r\n", Status)); + ASSERT_EFI_ERROR (Status); + } + + DEBUG ((DEBUG_INFO, "FspSmmInit status: %r\n", Status)); + // + // Create hobs after FspSmmInit. Hence passing the recorded timestamp here + // + PERF_START_EX (&gFspApiPerformanceGuid, "EventRec", NULL, TimeStampCounterStart, FSP_STATUS_CODE_FSPSMM_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_ENTRY); + PERF_END_EX (&gFspApiPerformanceGuid, "EventRec", NULL, 0, FSP_STATUS_CODE_FSPSMM_INIT | FSP_STATUS_CODE_COMMON_CODE | FSP_STATUS_CODE_API_EXIT); + DEBUG ((DEBUG_INFO, "Total time spent executing FspSmmInitApi: %d millisecond\n", DivU64x32 (GetTimeInNanoSecond (AsmReadTsc () - TimeStampCounterStart), 1000000))); + + Status = TestFspSmmInitApiOutput (FspiUpdDataPtr); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "ERROR - TestFspSmmInitApiOutput () fail, Status = %r\n", Status)); + } + + DEBUG ((DEBUG_INFO, " FspHobListPtr (returned) - 0x%x\n", FspHobListPtr)); + ASSERT (FspHobListPtr != NULL); + + PostFspiHobProcess (FspHobListPtr); + + return Status; +} /** Do FSP SMM initialization in Dispatch mode. @@ -61,7 +169,11 @@ FspiWrapperPeimEntryPoint ( DEBUG ((DEBUG_INFO, "FspiWrapperPeimEntryPoint\n")); - Status = FspiWrapperInitDispatchMode (); + if (PcdGet8 (PcdFspModeSelection) == 1) { + Status = FspiWrapperInitApiMode (); + } else { + Status = FspiWrapperInitDispatchMode (); + } return Status; } diff --git a/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.inf b/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.inf index 07ab49733369..346e500b6490 100644 --- a/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.inf +++ b/IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.inf @@ -30,20 +30,33 @@ PeimEntryPoint PeiServicesLib PeiServicesTablePointerLib + BaseMemoryLib + TimerLib DebugLib + HobLib MemoryAllocationLib + FspWrapperPlatformLib + FspWrapperHobProcessLib + PerformanceLib + FspWrapperApiLib + FspWrapperApiTestLib [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec + IntelFsp2Pkg/IntelFsp2Pkg.dec IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec [Ppis] [Pcd] gIntelFsp2WrapperTokenSpaceGuid.PcdFspiBaseAddress ## CONSUMES + gIntelFsp2WrapperTokenSpaceGuid.PcdFspModeSelection ## CONSUMES + gIntelFsp2WrapperTokenSpaceGuid.PcdFspiUpdDataAddress ## CONSUMES [Guids] + gFspHobGuid ## CONSUMES ## HOB + gFspApiPerformanceGuid ## SOMETIMES_CONSUMES ## GUID [Sources] FspiWrapperPeim.c diff --git a/IntelFsp2WrapperPkg/Include/Library/FspWrapperApiLib.h b/IntelFsp2WrapperPkg/Include/Library/FspWrapperApiLib.h index d38582d3e591..59df1d7cd7d7 100644 --- a/IntelFsp2WrapperPkg/Include/Library/FspWrapperApiLib.h +++ b/IntelFsp2WrapperPkg/Include/Library/FspWrapperApiLib.h @@ -78,4 +78,17 @@ CallFspSiliconInit ( IN VOID *FspsUpdDataPtr ); +/** + Call FSP API - FspSmmInit. + + @param[in] FspiUpdDataPtr Pointer to the FSPI_UPD data structure. + + @return EFI status returned by FspSmmInit API. +**/ +EFI_STATUS +EFIAPI +CallFspSmmInit ( + IN VOID *FspiUpdDataPtr + ); + #endif diff --git a/IntelFsp2WrapperPkg/Include/Library/FspWrapperApiTestLib.h b/IntelFsp2WrapperPkg/Include/Library/FspWrapperApiTestLib.h index 2ff2d0cbced3..26ad8f0dbd5b 100644 --- a/IntelFsp2WrapperPkg/Include/Library/FspWrapperApiTestLib.h +++ b/IntelFsp2WrapperPkg/Include/Library/FspWrapperApiTestLib.h @@ -52,4 +52,17 @@ TestFspSiliconInitApiOutput ( IN VOID *FspsUpdDataPtr ); +/** + Test the output of FSP API - FspSmmInit. + + @param[in] FspiUpdDataPtr Address pointer to the Smm Init parameters structure. + + @return test result on output of FspSmmInit API. +**/ +EFI_STATUS +EFIAPI +TestFspSmmInitApiOutput ( + IN VOID *FspiUpdDataPtr + ); + #endif diff --git a/IntelFsp2WrapperPkg/Include/Library/FspWrapperHobProcessLib.h b/IntelFsp2WrapperPkg/Include/Library/FspWrapperHobProcessLib.h index c91dbb5ea209..9ae9d67960a9 100644 --- a/IntelFsp2WrapperPkg/Include/Library/FspWrapperHobProcessLib.h +++ b/IntelFsp2WrapperPkg/Include/Library/FspWrapperHobProcessLib.h @@ -35,4 +35,17 @@ PostFspsHobProcess ( IN VOID *FspHobList ); +/** + Post FSP-I HOB process. + + @param[in] FspHobList Pointer to the HOB data structure produced by FSP. + + @return If platform process the FSP hob list successfully. +**/ +EFI_STATUS +EFIAPI +PostFspiHobProcess ( + IN VOID *FspHobList + ); + #endif diff --git a/IntelFsp2WrapperPkg/Include/Library/FspWrapperPlatformLib.h b/IntelFsp2WrapperPkg/Include/Library/FspWrapperPlatformLib.h index fe9f0d7408cd..8e3cd6430751 100644 --- a/IntelFsp2WrapperPkg/Include/Library/FspWrapperPlatformLib.h +++ b/IntelFsp2WrapperPkg/Include/Library/FspWrapperPlatformLib.h @@ -77,4 +77,16 @@ CallFspWrapperResetSystem ( IN EFI_STATUS FspStatusResetType ); +/** + This function overrides the default configurations in the FSP-I UPD data region. + + @param[in,out] FspUpdRgnPtr A pointer to the UPD data region data structure. + +**/ +VOID +EFIAPI +UpdateFspiUpdData ( + IN OUT VOID *FspUpdRgnPtr + ); + #endif diff --git a/IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec b/IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec index 7649da74e81c..2a3b270777bf 100644 --- a/IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec +++ b/IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec @@ -138,3 +138,12 @@ #1: measure FSP UPD region in one record (PCR1), the FSP code without UPD in another record (PCR0). # gIntelFsp2WrapperTokenSpaceGuid.PcdFspMeasurementConfig|0x00000000|UINT32|0x50000004 + # + # To provide flexibility for platform to pre-allocate FSP UPD buffer + # + # The PCDs define the pre-allocated FSPI UPD Data Buffer Address. + # 0x00000000 - Platform will not pre-allocate UPD buffer before FspWrapper module + # non-zero - Platform will pre-allocate UPD buffer and patch this value to + # buffer address before FspWrapper module executing. + # + gIntelFsp2WrapperTokenSpaceGuid.PcdFspiUpdDataAddress|0x00000000|UINT64|0x50000005 diff --git a/IntelFsp2WrapperPkg/Library/BaseFspWrapperApiLib/BaseFspWrapperApiLib.inf b/IntelFsp2WrapperPkg/Library/BaseFspWrapperApiLib/BaseFspWrapperApiLib.inf index 1e348b539fe7..14760df0014a 100644 --- a/IntelFsp2WrapperPkg/Library/BaseFspWrapperApiLib/BaseFspWrapperApiLib.inf +++ b/IntelFsp2WrapperPkg/Library/BaseFspWrapperApiLib/BaseFspWrapperApiLib.inf @@ -63,3 +63,4 @@ [Pcd] gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress ## CONSUMES gIntelFsp2WrapperTokenSpaceGuid.PcdFspsBaseAddress ## CONSUMES + gIntelFsp2WrapperTokenSpaceGuid.PcdFspiBaseAddress ## CONSUMES diff --git a/IntelFsp2WrapperPkg/Library/BaseFspWrapperApiLib/FspWrapperApiLib.c b/IntelFsp2WrapperPkg/Library/BaseFspWrapperApiLib/FspWrapperApiLib.c index 2e82a0c1b59a..4d4cc8b5be62 100644 --- a/IntelFsp2WrapperPkg/Library/BaseFspWrapperApiLib/FspWrapperApiLib.c +++ b/IntelFsp2WrapperPkg/Library/BaseFspWrapperApiLib/FspWrapperApiLib.c @@ -230,3 +230,39 @@ CallFspSiliconInit ( return Status; } + +/** + Call FSP API - FspSmmInit. + + @param[in] FspiUpdDataPtr Address pointer to the Smm Init parameters structure. + + @return EFI status returned by FspSmmInit API. +**/ +EFI_STATUS +EFIAPI +CallFspSmmInit ( + IN VOID *FspiUpdDataPtr + ) +{ + FSP_INFO_HEADER *FspHeader; + FSP_SMM_INIT FspSmmInitApi; + EFI_STATUS Status; + BOOLEAN InterruptState; + + FspHeader = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32 (PcdFspiBaseAddress)); + if (FspHeader == NULL) { + return EFI_DEVICE_ERROR; + } + + FspSmmInitApi = (FSP_SMM_INIT)((UINTN)FspHeader->ImageBase + FspHeader->FspSmmInitEntryOffset); + InterruptState = SaveAndDisableInterrupts (); + if ((FspHeader->ImageAttribute & IMAGE_ATTRIBUTE_64BIT_MODE_SUPPORT) == FSP_IA32) { + Status = Execute32BitCode ((UINTN)FspSmmInitApi, (UINTN)FspiUpdDataPtr, (UINTN)NULL); + } else { + Status = Execute64BitCode ((UINTN)FspSmmInitApi, (UINTN)FspiUpdDataPtr, (UINTN)NULL); + } + + SetInterruptState (InterruptState); + + return Status; +} diff --git a/IntelFsp2WrapperPkg/Library/BaseFspWrapperApiTestLibNull/FspWrapperApiTestNull.c b/IntelFsp2WrapperPkg/Library/BaseFspWrapperApiTestLibNull/FspWrapperApiTestNull.c index 4ac5d3d738fa..beaf56bd0902 100644 --- a/IntelFsp2WrapperPkg/Library/BaseFspWrapperApiTestLibNull/FspWrapperApiTestNull.c +++ b/IntelFsp2WrapperPkg/Library/BaseFspWrapperApiTestLibNull/FspWrapperApiTestNull.c @@ -57,3 +57,19 @@ TestFspSiliconInitApiOutput ( { return RETURN_UNSUPPORTED; } + +/** + Test the output of FSP API - FspSmmInit. + + @param[in] FspiUpdDataPtr Address pointer to the Smm Init parameters structure. + + @return test result on output of FspSmmInit API. +**/ +EFI_STATUS +EFIAPI +TestFspSmmInitApiOutput ( + IN VOID *FspiUpdDataPtr + ) +{ + return RETURN_SUCCESS; +} diff --git a/IntelFsp2WrapperPkg/Library/BaseFspWrapperPlatformLibSample/FspWrapperPlatformLibSample.c b/IntelFsp2WrapperPkg/Library/BaseFspWrapperPlatformLibSample/FspWrapperPlatformLibSample.c index 00b4799fb493..6e0e8942ef25 100644 --- a/IntelFsp2WrapperPkg/Library/BaseFspWrapperPlatformLibSample/FspWrapperPlatformLibSample.c +++ b/IntelFsp2WrapperPkg/Library/BaseFspWrapperPlatformLibSample/FspWrapperPlatformLibSample.c @@ -95,3 +95,17 @@ CallFspWrapperResetSystem ( CpuDeadLoop (); } + +/** + This function overrides the default configurations in the FSP-I UPD data region. + + @param[in,out] FspUpdRgnPtr A pointer to the UPD data region data structure. + +**/ +VOID +EFIAPI +UpdateFspiUpdData ( + IN OUT VOID *FspUpdRgnPtr + ) +{ +} diff --git a/IntelFsp2WrapperPkg/Library/PeiFspWrapperApiTestLib/FspWrapperApiTest.c b/IntelFsp2WrapperPkg/Library/PeiFspWrapperApiTestLib/FspWrapperApiTest.c index 0b48677b77a1..24722ea2875f 100644 --- a/IntelFsp2WrapperPkg/Library/PeiFspWrapperApiTestLib/FspWrapperApiTest.c +++ b/IntelFsp2WrapperPkg/Library/PeiFspWrapperApiTestLib/FspWrapperApiTest.c @@ -83,3 +83,19 @@ TestFspSiliconInitApiOutput ( { return RETURN_SUCCESS; } + +/** + Test the output of FSP API - FspSmmInit. + + @param[in] FspiUpdDataPtr Address pointer to the Smm Init parameters structure. + + @return test result on output of FspSmmInit API. +**/ +EFI_STATUS +EFIAPI +TestFspSmmInitApiOutput ( + IN VOID *FspiUpdDataPtr + ) +{ + return RETURN_SUCCESS; +} diff --git a/IntelFsp2WrapperPkg/Library/PeiFspWrapperHobProcessLibSample/FspWrapperHobProcessLibSample.c b/IntelFsp2WrapperPkg/Library/PeiFspWrapperHobProcessLibSample/FspWrapperHobProcessLibSample.c index 84360ac6e3a9..c11df5894c02 100644 --- a/IntelFsp2WrapperPkg/Library/PeiFspWrapperHobProcessLibSample/FspWrapperHobProcessLibSample.c +++ b/IntelFsp2WrapperPkg/Library/PeiFspWrapperHobProcessLibSample/FspWrapperHobProcessLibSample.c @@ -400,3 +400,19 @@ PostFspsHobProcess ( return EFI_SUCCESS; } + +/** + Post FSP-I HOB process. + + @param[in] FspHobList Pointer to the HOB data structure produced by FSP. + + @return If platform process the FSP hob list successfully. +**/ +EFI_STATUS +EFIAPI +PostFspiHobProcess ( + IN VOID *FspHobList + ) +{ + return EFI_SUCCESS; +}