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 (); TimeStampCounterStart = AsmReadTsc ();
Status = CallFspMemoryInit (FspmUpdDataPtr, &FspHobListPtr); 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 // Reset the system if FSP API returned FSP_STATUS_RESET_REQUIRED status
// //
@ -167,17 +178,6 @@ PeiFspMemoryInit (
PostFspmHobProcess (FspHobListPtr); 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; return Status;
} }

View File

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

View File

@ -17,6 +17,8 @@
#include <Ppi/Variable.h> #include <Ppi/Variable.h>
#include <Library/PeiServicesLib.h> #include <Library/PeiServicesLib.h>
#include <Library/FspWrapperPlatformMultiPhaseLib.h> #include <Library/FspWrapperPlatformMultiPhaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/HobLib.h>
/** /**
Execute 32-bit FSP API entry code. Execute 32-bit FSP API entry code.
@ -156,6 +158,8 @@ FspWrapperVariableRequestHandler (
EDKII_PEI_VARIABLE_PPI *VariablePpi; EDKII_PEI_VARIABLE_PPI *VariablePpi;
BOOLEAN WriteVariableSupport; BOOLEAN WriteVariableSupport;
FSP_MULTI_PHASE_COMPLETE_VARIABLE_REQUEST_PARAMS CompleteVariableRequestParams; FSP_MULTI_PHASE_COMPLETE_VARIABLE_REQUEST_PARAMS CompleteVariableRequestParams;
VOID *GuidHob;
VOID *HobData;
WriteVariableSupport = TRUE; WriteVariableSupport = TRUE;
Status = PeiServicesLocatePpi ( 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 // 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; FSP_MULTI_PHASE_GET_NUMBER_OF_PHASES_PARAMS FspMultiPhaseGetNumber;
UINT32 Index; UINT32 Index;
UINT32 NumOfPhases; UINT32 NumOfPhases;
VOID *GuidHob;
VOID *HobData;
// //
// Query FSP for the number of phases supported. // Query FSP for the number of phases supported.
@ -352,6 +368,16 @@ FspWrapperMultiPhaseHandler (
FspMultiPhaseParams.MultiPhaseParamPtr = NULL; FspMultiPhaseParams.MultiPhaseParamPtr = NULL;
Status = CallFspMultiPhaseEntry (&FspMultiPhaseParams, FspHobListPtr, ComponentIndex); 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) { if (Status == FSP_STATUS_VARIABLE_REQUEST) {
// //
// call to Variable request handler // call to Variable request handler