Skip to content

Commit

Permalink
IntelFsp2WrapperPkg/FspiWrapperPeim : Support API mode
Browse files Browse the repository at this point in the history
Add fspsmm init interface for API mode.

Signed-off-by: Hongbin1 Zhang <[email protected]>
Cc: Chasel Chiu <[email protected]>
Cc: Nate DeSimone <[email protected]>
Cc: Duggapu Chinni B <[email protected]>
Cc: Chen Gang C <[email protected]>
Cc: Star Zeng <[email protected]>
Cc: Ted Kuo <[email protected]>
Cc: Ashraf Ali S <[email protected]>
Cc: Ray Ni <[email protected]>
  • Loading branch information
hongbin123 committed Oct 8, 2024
1 parent bacb08f commit c15430c
Show file tree
Hide file tree
Showing 13 changed files with 280 additions and 1 deletion.
114 changes: 113 additions & 1 deletion IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,116 @@
#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 <Ppi/FirmwareVolumeInfoMeasurementExcluded.h>
#include <Library/FspWrapperApiTestLib.h>
#include <FspEas.h>
#include <FspStatusCode.h>
#include <FspGlobalData.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 (PcdFspiUpdDataAddress64) == 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 (PcdFspiUpdDataAddress64);
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.
Expand Down Expand Up @@ -88,7 +196,11 @@ FspiWrapperPeimEntryPoint (

DEBUG ((DEBUG_INFO, "FspiWrapperPeimEntryPoint\n"));

Status = FspiWrapperInitDispatchMode ();
if (PcdGet8 (PcdFspModeSelection) == 1) {
Status = FspiWrapperInitApiMode ();
} else {
Status = FspiWrapperInitDispatchMode ();
}

return Status;
}
13 changes: 13 additions & 0 deletions IntelFsp2WrapperPkg/FspiWrapperPeim/FspiWrapperPeim.inf
Original file line number Diff line number Diff line change
Expand Up @@ -30,22 +30,35 @@
PeimEntryPoint
PeiServicesLib
PeiServicesTablePointerLib
BaseMemoryLib
TimerLib
DebugLib
HobLib
MemoryAllocationLib
FspWrapperPlatformLib
FspWrapperHobProcessLib
PerformanceLib
FspWrapperApiLib
FspWrapperApiTestLib

[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
SecurityPkg/SecurityPkg.dec
IntelFsp2Pkg/IntelFsp2Pkg.dec
IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec

[Ppis]
gEfiPeiFirmwareVolumeInfoMeasurementExcludedPpiGuid ## PRODUCES

[Pcd]
gIntelFsp2WrapperTokenSpaceGuid.PcdFspiBaseAddress ## CONSUMES
gIntelFsp2WrapperTokenSpaceGuid.PcdFspModeSelection ## CONSUMES
gIntelFsp2WrapperTokenSpaceGuid.PcdFspiUpdDataAddress64 ## CONSUMES

[Guids]
gFspHobGuid ## CONSUMES ## HOB
gFspApiPerformanceGuid ## SOMETIMES_CONSUMES ## GUID

[Sources]
FspiWrapperPeim.c
Expand Down
13 changes: 13 additions & 0 deletions IntelFsp2WrapperPkg/Include/Library/FspWrapperApiLib.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
13 changes: 13 additions & 0 deletions IntelFsp2WrapperPkg/Include/Library/FspWrapperApiTestLib.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
13 changes: 13 additions & 0 deletions IntelFsp2WrapperPkg/Include/Library/FspWrapperHobProcessLib.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
12 changes: 12 additions & 0 deletions IntelFsp2WrapperPkg/Include/Library/FspWrapperPlatformLib.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 4 additions & 0 deletions IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec
Original file line number Diff line number Diff line change
Expand Up @@ -138,3 +138,7 @@
#1: measure FSP UPD region in one record (PCR1), the FSP code without UPD in another record (PCR0).
#
gIntelFsp2WrapperTokenSpaceGuid.PcdFspMeasurementConfig|0x00000000|UINT32|0x50000004
#
# Non-0 means PcdFspiUpdDataAddress64 will be ignored, otherwise PcdFspiUpdDataAddress64 will be used.
#
gIntelFsp2WrapperTokenSpaceGuid.PcdFspiUpdDataAddress64|0x00000000|UINT64|0x50000005
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,4 @@
[Pcd]
gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress ## CONSUMES
gIntelFsp2WrapperTokenSpaceGuid.PcdFspsBaseAddress ## CONSUMES
gIntelFsp2WrapperTokenSpaceGuid.PcdFspiBaseAddress ## CONSUMES
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
{
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

0 comments on commit c15430c

Please sign in to comment.