IntelFsp2WrapperPkg: Save FspHobListPtr right after FspMemoryInit exits

Save FspHobList pointer to HOB right after FspMemoryInit exits so that
FspHobList pointer is available when performing platform related reset
in CallFspWrapperResetSystem(). Some platforms may consume FSP HOBs
prior to performing platform related reset.

Signed-off-by: Du Lin <du.lin@intel.com>
This commit is contained in:
Du Lin 2024-12-20 23:49:19 +08:00 committed by mergify[bot]
parent 1cc78814cd
commit da6504e5cc
3 changed files with 42 additions and 11 deletions

View File

@ -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;
}

View File

@ -38,11 +38,16 @@
FspWrapperPlatformLib
PeiServicesLib
FspWrapperPlatformMultiPhaseLib
BaseMemoryLib
HobLib
[Ppis]
gEfiPeiReadOnlyVariable2PpiGuid
gEdkiiPeiVariablePpiGuid
[Guids]
gFspHobGuid ## CONSUMES
[Pcd]
gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress ## CONSUMES
gIntelFsp2WrapperTokenSpaceGuid.PcdFspsBaseAddress ## CONSUMES

View File

@ -17,6 +17,8 @@
#include <Ppi/Variable.h>
#include <Library/PeiServicesLib.h>
#include <Library/FspWrapperPlatformMultiPhaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/HobLib.h>
/**
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