mirror of
https://github.com/acidanthera/audk.git
synced 2025-04-08 17:05:09 +02:00
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:
parent
4ffa8810af
commit
df1726a65e
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -63,3 +63,4 @@
|
||||
[Pcd]
|
||||
gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress ## CONSUMES
|
||||
gIntelFsp2WrapperTokenSpaceGuid.PcdFspsBaseAddress ## CONSUMES
|
||||
gIntelFsp2WrapperTokenSpaceGuid.PcdFspiBaseAddress ## CONSUMES
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
)
|
||||
{
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user