IntelFsp2WrapperPkg/FspiWrapperPeim : Support API mode

Add fspsmm init interface for API mode.

Signed-off-by: Hongbin1 Zhang <hongbin1.zhang@intel.com>
Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Duggapu Chinni B <chinni.b.duggapu@intel.com>
Cc: Chen Gang C <gang.c.chen@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Ted Kuo <ted.kuo@intel.com>
Cc: Ashraf Ali S <ashraf.ali.s@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
This commit is contained in:
Hongbin1 Zhang 2024-10-07 21:15:08 +08:00 committed by mergify[bot]
parent 4ffa8810af
commit df1726a65e
13 changed files with 285 additions and 1 deletions

View File

@ -9,12 +9,120 @@
**/
#include <PiPei.h>
#include <FspEas.h>
#include <FspStatusCode.h>
#include <FspGlobalData.h>
#include <Library/PeimEntryPoint.h>
#include <Library/PeiServicesLib.h>
#include <Library/PeiServicesTablePointerLib.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/HobLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/FspWrapperPlatformLib.h>
#include <Library/TimerLib.h>
#include <Library/PerformanceLib.h>
#include <Library/FspWrapperApiLib.h>
#include <Library/FspWrapperHobProcessLib.h>
#include <Library/FspWrapperApiTestLib.h>
/**
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;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -63,3 +63,4 @@
[Pcd]
gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress ## CONSUMES
gIntelFsp2WrapperTokenSpaceGuid.PcdFspsBaseAddress ## CONSUMES
gIntelFsp2WrapperTokenSpaceGuid.PcdFspiBaseAddress ## CONSUMES

View File

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

View File

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

View File

@ -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
)
{
}

View File

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

View File

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