diff --git a/IntelFsp2WrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c b/IntelFsp2WrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c index d9fbb21417..d880614076 100644 --- a/IntelFsp2WrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c +++ b/IntelFsp2WrapperPkg/FspmWrapperPeim/FspmWrapperPeim.c @@ -124,6 +124,17 @@ PeiFspMemoryInit ( TimeStampCounterStart = AsmReadTsc (); Status = CallFspMemoryInit (FspmUpdDataPtr, &FspHobListPtr); + // + // FspHobList is not complete at this moment. + // Save FspHobList pointer to hob, so that it can be got later + // + HobData = BuildGuidHob ( + &gFspHobGuid, + sizeof (VOID *) + ); + ASSERT (HobData != NULL); + CopyMem (HobData, &FspHobListPtr, sizeof (FspHobListPtr)); + // // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED status // @@ -167,17 +178,6 @@ PeiFspMemoryInit ( PostFspmHobProcess (FspHobListPtr); - // - // FspHobList is not complete at this moment. - // Save FspHobList pointer to hob, so that it can be got later - // - HobData = BuildGuidHob ( - &gFspHobGuid, - sizeof (VOID *) - ); - ASSERT (HobData != NULL); - CopyMem (HobData, &FspHobListPtr, sizeof (FspHobListPtr)); - return Status; } diff --git a/IntelFsp2WrapperPkg/Library/FspWrapperMultiPhaseProcessLib/FspWrapperMultiPhaseProcessLib.inf b/IntelFsp2WrapperPkg/Library/FspWrapperMultiPhaseProcessLib/FspWrapperMultiPhaseProcessLib.inf index e76a7465f2..16ad341406 100644 --- a/IntelFsp2WrapperPkg/Library/FspWrapperMultiPhaseProcessLib/FspWrapperMultiPhaseProcessLib.inf +++ b/IntelFsp2WrapperPkg/Library/FspWrapperMultiPhaseProcessLib/FspWrapperMultiPhaseProcessLib.inf @@ -38,11 +38,16 @@ FspWrapperPlatformLib PeiServicesLib FspWrapperPlatformMultiPhaseLib + BaseMemoryLib + HobLib [Ppis] gEfiPeiReadOnlyVariable2PpiGuid gEdkiiPeiVariablePpiGuid +[Guids] + gFspHobGuid ## CONSUMES + [Pcd] gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress ## CONSUMES gIntelFsp2WrapperTokenSpaceGuid.PcdFspsBaseAddress ## CONSUMES diff --git a/IntelFsp2WrapperPkg/Library/FspWrapperMultiPhaseProcessLib/PeiFspWrapperMultiPhaseProcessLib.c b/IntelFsp2WrapperPkg/Library/FspWrapperMultiPhaseProcessLib/PeiFspWrapperMultiPhaseProcessLib.c index 224c24881d..68331c701d 100644 --- a/IntelFsp2WrapperPkg/Library/FspWrapperMultiPhaseProcessLib/PeiFspWrapperMultiPhaseProcessLib.c +++ b/IntelFsp2WrapperPkg/Library/FspWrapperMultiPhaseProcessLib/PeiFspWrapperMultiPhaseProcessLib.c @@ -17,6 +17,8 @@ #include #include #include +#include +#include /** Execute 32-bit FSP API entry code. @@ -156,6 +158,8 @@ FspWrapperVariableRequestHandler ( EDKII_PEI_VARIABLE_PPI *VariablePpi; BOOLEAN WriteVariableSupport; FSP_MULTI_PHASE_COMPLETE_VARIABLE_REQUEST_PARAMS CompleteVariableRequestParams; + VOID *GuidHob; + VOID *HobData; WriteVariableSupport = TRUE; Status = PeiServicesLocatePpi ( @@ -288,6 +292,16 @@ FspWrapperVariableRequestHandler ( } } + // + // Refresh FspHobList pointer stored in HOB. + // + GuidHob = GetFirstGuidHob (&gFspHobGuid); + ASSERT (GuidHob != NULL); + if (GuidHob != NULL) { + HobData = GET_GUID_HOB_DATA (GuidHob); + CopyMem (HobData, FspHobListPtr, sizeof (*FspHobListPtr)); + } + // // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED status // @@ -321,6 +335,8 @@ FspWrapperMultiPhaseHandler ( FSP_MULTI_PHASE_GET_NUMBER_OF_PHASES_PARAMS FspMultiPhaseGetNumber; UINT32 Index; UINT32 NumOfPhases; + VOID *GuidHob; + VOID *HobData; // // Query FSP for the number of phases supported. @@ -352,6 +368,16 @@ FspWrapperMultiPhaseHandler ( FspMultiPhaseParams.MultiPhaseParamPtr = NULL; Status = CallFspMultiPhaseEntry (&FspMultiPhaseParams, FspHobListPtr, ComponentIndex); + // + // Refresh FspHobList pointer stored in HOB. + // + GuidHob = GetFirstGuidHob (&gFspHobGuid); + ASSERT (GuidHob != NULL); + if (GuidHob != NULL) { + HobData = GET_GUID_HOB_DATA (GuidHob); + CopyMem (HobData, FspHobListPtr, sizeof (*FspHobListPtr)); + } + if (Status == FSP_STATUS_VARIABLE_REQUEST) { // // call to Variable request handler