summaryrefslogtreecommitdiffstats
path: root/IntelFsp2Pkg
diff options
context:
space:
mode:
authorChasel Chiu <chasel.chiu@intel.com>2022-07-25 12:03:51 -0700
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2022-08-31 16:48:07 +0000
commitdf25a5457f04ec465dce97428cfee96f462676e7 (patch)
tree7ebc2087c7473f98f8c7cd8832c2633c1788c6bd /IntelFsp2Pkg
parent4b7bd4c591a81a290b31e9d1a94c4b8be787989e (diff)
downloadedk2-df25a5457f04ec465dce97428cfee96f462676e7.tar.gz
edk2-df25a5457f04ec465dce97428cfee96f462676e7.tar.bz2
edk2-df25a5457f04ec465dce97428cfee96f462676e7.zip
IntelFsp2Pkg: Add FSP 2.4 MultiPhase interface.
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3916 Provide FSP 2.4 MultiPhase interface and scripts support. Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> Cc: Star Zeng <star.zeng@intel.com> Signed-off-by: Chasel Chiu <chasel.chiu@intel.com> Reviewed-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
Diffstat (limited to 'IntelFsp2Pkg')
-rw-r--r--IntelFsp2Pkg/Include/FspEas/FspApi.h64
-rw-r--r--IntelFsp2Pkg/Include/FspGlobalData.h5
-rw-r--r--IntelFsp2Pkg/Include/Library/FspMultiPhaseLib.h55
-rw-r--r--IntelFsp2Pkg/Include/Library/FspSecPlatformLib.h23
-rw-r--r--IntelFsp2Pkg/IntelFsp2Pkg.dec12
-rw-r--r--IntelFsp2Pkg/IntelFsp2Pkg.dsc4
-rw-r--r--IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/BaseFspMultiPhaseLib.inf50
-rw-r--r--IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/FspMultiPhaseLib.c184
-rw-r--r--IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/PlatformSecLibNull.c34
-rw-r--r--IntelFsp2Pkg/Tools/SplitFspBin.py48
10 files changed, 450 insertions, 29 deletions
diff --git a/IntelFsp2Pkg/Include/FspEas/FspApi.h b/IntelFsp2Pkg/Include/FspEas/FspApi.h
index 361e916b5f..40e063e944 100644
--- a/IntelFsp2Pkg/Include/FspEas/FspApi.h
+++ b/IntelFsp2Pkg/Include/FspEas/FspApi.h
@@ -487,10 +487,38 @@ typedef struct {
/// Action definition for FspMultiPhaseSiInit API
///
typedef enum {
- EnumMultiPhaseGetNumberOfPhases = 0x0,
- EnumMultiPhaseExecutePhase = 0x1
+ EnumMultiPhaseGetNumberOfPhases = 0x0,
+ EnumMultiPhaseExecutePhase = 0x1,
+ EnumMultiPhaseGetVariableRequestInfo = 0x2,
+ EnumMultiPhaseCompleteVariableRequest = 0x3
} FSP_MULTI_PHASE_ACTION;
+typedef enum {
+ EnumFspVariableRequestGetVariable = 0x0,
+ EnumFspVariableRequestGetNextVariableName = 0x1,
+ EnumFspVariableRequestSetVariable = 0x2,
+ EnumFspVariableRequestQueryVariableInfo = 0x3
+} FSP_VARIABLE_REQUEST_TYPE;
+
+#pragma pack(16)
+typedef struct {
+ IN FSP_VARIABLE_REQUEST_TYPE VariableRequest;
+ IN OUT CHAR16 *VariableName;
+ IN OUT UINT64 *VariableNameSize;
+ IN OUT EFI_GUID *VariableGuid;
+ IN OUT UINT32 *Attributes;
+ IN OUT UINT64 *DataSize;
+ IN OUT VOID *Data;
+ OUT UINT64 *MaximumVariableStorageSize;
+ OUT UINT64 *RemainingVariableStorageSize;
+ OUT UINT64 *MaximumVariableSize;
+} FSP_MULTI_PHASE_VARIABLE_REQUEST_INFO_PARAMS;
+
+typedef struct {
+ EFI_STATUS VariableRequestStatus;
+} FSP_MULTI_PHASE_COMPLETE_VARIABLE_REQUEST_PARAMS;
+#pragma pack()
+
///
/// Data structure returned by FSP when bootloader calling
/// FspMultiPhaseSiInit API with action 0 (EnumMultiPhaseGetNumberOfPhases)
@@ -594,7 +622,7 @@ EFI_STATUS
@retval EFI_UNSUPPORTED The FSP calling conditions were not met.
@retval EFI_DEVICE_ERROR FSP initialization failed.
@retval EFI_OUT_OF_RESOURCES Stack range requested by FSP is not met.
- @retval FSP_STATUS_RESET_REQUIREDx A reset is reuired. These status codes will not be returned during S3.
+ @retval FSP_STATUS_RESET_REQUIREDx A reset is required. These status codes will not be returned during S3.
**/
typedef
EFI_STATUS
@@ -690,4 +718,34 @@ EFI_STATUS
IN VOID *FspiUpdDataPtr
);
+/**
+ This FSP API provides multi-phase memory and silicon initialization, which brings greater modularity to the existing
+ FspMemoryInit() and FspSiliconInit() API. Increased modularity is achieved by adding an extra API to FSP-M and FSP-S.
+ This allows the bootloader to add board specific initialization steps throughout the MemoryInit and SiliconInit flows as needed.
+ The FspMemoryInit() API is always called before FspMultiPhaseMemInit(); it is the first phase of memory initialization. Similarly,
+ the FspSiliconInit() API is always called before FspMultiPhaseSiInit(); it is the first phase of silicon initialization.
+ After the first phase, subsequent phases are invoked by calling the FspMultiPhaseMem/SiInit() API.
+ The FspMultiPhaseMemInit() API may only be called after the FspMemoryInit() API and before the FspSiliconInit() API;
+ or in the case that FSP-T is being used, before the TempRamExit() API. The FspMultiPhaseSiInit() API may only be called after
+ the FspSiliconInit() API and before NotifyPhase() API; or in the case that FSP-I is being used, before the FspSmmInit() API.
+ The multi-phase APIs may not be called at any other time.
+
+ @param[in,out] FSP_MULTI_PHASE_PARAMS For action - EnumMultiPhaseGetNumberOfPhases:
+ FSP_MULTI_PHASE_PARAMS->MultiPhaseParamPtr will contain
+ how many phases supported by FSP.
+ For action - EnumMultiPhaseExecutePhase:
+ FSP_MULTI_PHASE_PARAMS->MultiPhaseParamPtr shall be NULL.
+ @retval EFI_SUCCESS FSP execution environment was initialized successfully.
+ @retval EFI_INVALID_PARAMETER Input parameters are invalid.
+ @retval EFI_UNSUPPORTED The FSP calling conditions were not met.
+ @retval EFI_DEVICE_ERROR FSP initialization failed.
+ @retval FSP_STATUS_RESET_REQUIRED_* A reset is required. These status codes will not be returned during S3.
+ @retval FSP_STATUS_VARIABLE_REQUEST A variable request has been made by FSP that needs boot loader handling.
+**/
+typedef
+EFI_STATUS
+(EFIAPI *FSP_MULTI_PHASE_INIT)(
+ IN FSP_MULTI_PHASE_PARAMS *MultiPhaseInitParamPtr
+ );
+
#endif
diff --git a/IntelFsp2Pkg/Include/FspGlobalData.h b/IntelFsp2Pkg/Include/FspGlobalData.h
index 32c6d460e4..81813df3ce 100644
--- a/IntelFsp2Pkg/Include/FspGlobalData.h
+++ b/IntelFsp2Pkg/Include/FspGlobalData.h
@@ -12,7 +12,7 @@
#define FSP_IN_API_MODE 0
#define FSP_IN_DISPATCH_MODE 1
-#define FSP_GLOBAL_DATA_VERSION 0x2
+#define FSP_GLOBAL_DATA_VERSION 0x3
#pragma pack(1)
@@ -25,6 +25,7 @@ typedef enum {
FspSiliconInitApiIndex,
FspMultiPhaseSiInitApiIndex,
FspSmmInitApiIndex,
+ FspMultiPhaseMemInitApiIndex,
FspApiIndexMax
} FSP_API_INDEX;
@@ -82,6 +83,8 @@ typedef struct {
VOID *FunctionParameterPtr;
FSP_INFO_HEADER *FspInfoHeader;
VOID *UpdDataPtr;
+ VOID *FspHobListPtr;
+ VOID *VariableRequestParameterPtr;
///
/// End of UINTN and pointer section
/// At this point, next field offset must be either *0h or *8h to
diff --git a/IntelFsp2Pkg/Include/Library/FspMultiPhaseLib.h b/IntelFsp2Pkg/Include/Library/FspMultiPhaseLib.h
new file mode 100644
index 0000000000..9c6973ceb1
--- /dev/null
+++ b/IntelFsp2Pkg/Include/Library/FspMultiPhaseLib.h
@@ -0,0 +1,55 @@
+/** @file
+ FSP MultiPhase Library.
+
+ Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef _FSP_MULTIPHASE_LIB_H_
+#define _FSP_MULTIPHASE_LIB_H_
+
+EFI_STATUS
+EFIAPI
+FspMultiPhaseSwitchStack (
+ );
+
+EFI_STATUS
+EFIAPI
+FspVariableRequestSwitchStack (
+ IN FSP_MULTI_PHASE_VARIABLE_REQUEST_INFO_PARAMS *FspVariableRequestParams
+ );
+
+/**
+ This function handles FspMultiPhaseMemInitApi.
+
+ @param[in] ApiIdx Internal index of the FSP API.
+ @param[in] ApiParam Parameter of the FSP API.
+
+ @retval EFI_SUCCESS FSP execution was successful.
+ @retval EFI_INVALID_PARAMETER Input parameters are invalid.
+ @retval EFI_UNSUPPORTED The FSP calling conditions were not met.
+ @retval EFI_DEVICE_ERROR FSP initialization failed.
+**/
+EFI_STATUS
+EFIAPI
+FspMultiPhaseMemInitApiHandler (
+ IN UINT32 ApiIdx,
+ IN VOID *ApiParam
+ );
+
+/**
+ This function handles FspMultiPhaseSiInitApi.
+
+ @param[in] ApiIdx Internal index of the FSP API.
+ @param[in] ApiParam Parameter of the FSP API.
+
+**/
+EFI_STATUS
+EFIAPI
+FspMultiPhaseSiInitApiHandlerV2 (
+ IN UINT32 ApiIdx,
+ IN VOID *ApiParam
+ );
+
+#endif
diff --git a/IntelFsp2Pkg/Include/Library/FspSecPlatformLib.h b/IntelFsp2Pkg/Include/Library/FspSecPlatformLib.h
index 920115e90e..c91ea4a78f 100644
--- a/IntelFsp2Pkg/Include/Library/FspSecPlatformLib.h
+++ b/IntelFsp2Pkg/Include/Library/FspSecPlatformLib.h
@@ -81,6 +81,7 @@ FspUpdSignatureCheck (
/**
This function handles FspMultiPhaseSiInitApi.
+ Starting from FSP 2.4 this function is obsolete and FspMultiPhaseSiInitApiHandlerV2 is the replacement.
@param[in] ApiIdx Internal index of the FSP API.
@param[in] ApiParam Parameter of the FSP API.
@@ -93,4 +94,26 @@ FspMultiPhaseSiInitApiHandler (
IN VOID *ApiParam
);
+/**
+ FSP MultiPhase Platform Get Number Of Phases Function.
+
+ Allows an FSP binary to dynamically update the number of phases at runtime.
+ For example, UPD settings could negate the need to enter the multi-phase flow
+ in certain scenarios. If this function returns FALSE, the default number of phases
+ provided by PcdMultiPhaseNumberOfPhases will be returned to the bootloader instead.
+
+ @param[in] ApiIdx - Internal index of the FSP API.
+ @param[in] NumberOfPhasesSupported - How many phases are supported by current FSP Component.
+
+ @retval TRUE - NumberOfPhases are modified by Platform during runtime.
+ @retval FALSE - The Default build time NumberOfPhases should be used.
+
+**/
+BOOLEAN
+EFIAPI
+FspMultiPhasePlatformGetNumberOfPhases (
+ IN UINTN ApiIdx,
+ IN OUT UINT32 *NumberOfPhasesSupported
+ );
+
#endif
diff --git a/IntelFsp2Pkg/IntelFsp2Pkg.dec b/IntelFsp2Pkg/IntelFsp2Pkg.dec
index 2d3eb708b9..d1c3d3ee7b 100644
--- a/IntelFsp2Pkg/IntelFsp2Pkg.dec
+++ b/IntelFsp2Pkg/IntelFsp2Pkg.dec
@@ -37,6 +37,9 @@
## @libraryclass Provides FSP platform sec related actions.
FspSecPlatformLib|Include/Library/FspSecPlatformLib.h
+ ## @libraryclass Provides FSP MultiPhase service functions.
+ FspMultiPhaseLib|Include/Library/FspMultiPhaseLib.h
+
[Ppis]
#
# PPI to indicate FSP is ready to enter notify phase
@@ -112,5 +115,10 @@
gIntelFsp2PkgTokenSpaceGuid.PcdFspPrivateTemporaryRamSize |0x00000000|UINT32|0x10000006
[PcdsFixedAtBuild,PcdsDynamic,PcdsDynamicEx]
- gIntelFsp2PkgTokenSpaceGuid.PcdFspReservedMemoryLength |0x00100000|UINT32|0x46530000
- gIntelFsp2PkgTokenSpaceGuid.PcdBootLoaderEntry |0xFFFFFFE4|UINT32|0x46530100
+ gIntelFsp2PkgTokenSpaceGuid.PcdFspReservedMemoryLength |0x00100000|UINT32|0x46530000
+ gIntelFsp2PkgTokenSpaceGuid.PcdBootLoaderEntry |0xFFFFFFE4|UINT32|0x46530100
+ #
+ # Different FSP Components may have different NumberOfPhases which can be defined
+ # by each FspSecCore module from DSC.
+ #
+ gIntelFsp2PkgTokenSpaceGuid.PcdMultiPhaseNumberOfPhases |0x00000000|UINT32|0x46530101
diff --git a/IntelFsp2Pkg/IntelFsp2Pkg.dsc b/IntelFsp2Pkg/IntelFsp2Pkg.dsc
index b2d7867880..0713f0028d 100644
--- a/IntelFsp2Pkg/IntelFsp2Pkg.dsc
+++ b/IntelFsp2Pkg/IntelFsp2Pkg.dsc
@@ -45,6 +45,7 @@
FspPlatformLib|IntelFsp2Pkg/Library/BaseFspPlatformLib/BaseFspPlatformLib.inf
FspSwitchStackLib|IntelFsp2Pkg/Library/BaseFspSwitchStackLib/BaseFspSwitchStackLib.inf
FspSecPlatformLib|IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/SecFspSecPlatformLibNull.inf
+ FspMultiPhaseLib|IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/BaseFspMultiPhaseLib.inf
[LibraryClasses.common.PEIM]
PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
@@ -64,12 +65,15 @@
IntelFsp2Pkg/Library/BaseFspSwitchStackLib/BaseFspSwitchStackLib.inf
IntelFsp2Pkg/Library/BaseDebugDeviceLibNull/BaseDebugDeviceLibNull.inf
IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/SecFspSecPlatformLibNull.inf
+ IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/BaseFspMultiPhaseLib.inf
IntelFsp2Pkg/FspSecCore/FspSecCoreT.inf
IntelFsp2Pkg/FspSecCore/FspSecCoreM.inf
+ IntelFsp2Pkg/FspSecCore/Fsp24SecCoreM.inf
IntelFsp2Pkg/FspSecCore/FspSecCoreS.inf
IntelFsp2Pkg/FspSecCore/FspSecCoreI.inf
IntelFsp2Pkg/FspSecCore/Fsp22SecCoreS.inf
+ IntelFsp2Pkg/FspSecCore/Fsp24SecCoreS.inf
IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf
[PcdsFixedAtBuild.common]
diff --git a/IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/BaseFspMultiPhaseLib.inf b/IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/BaseFspMultiPhaseLib.inf
new file mode 100644
index 0000000000..a79f6aecda
--- /dev/null
+++ b/IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/BaseFspMultiPhaseLib.inf
@@ -0,0 +1,50 @@
+## @file
+# FSP MultiPhase Lib.
+#
+# Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+################################################################################
+#
+# Defines Section - statements that will be processed to create a Makefile.
+#
+################################################################################
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = BaseFspMultiPhaseLib
+ FILE_GUID = C128CADC-623E-4E41-97CB-A7138E627460
+ MODULE_TYPE = SEC
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = FspMultiPhaseLib
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64
+#
+
+################################################################################
+#
+# Sources Section - list of files that are required for the build to succeed.
+#
+################################################################################
+
+[Sources]
+ FspMultiPhaseLib.c
+
+################################################################################
+#
+# Package Dependency Section - list of Package files that are required for
+# this module.
+#
+################################################################################
+
+[Packages]
+ MdePkg/MdePkg.dec
+ IntelFsp2Pkg/IntelFsp2Pkg.dec
+
+[Pcd]
+ gIntelFsp2PkgTokenSpaceGuid.PcdMultiPhaseNumberOfPhases # CONSUMES
diff --git a/IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/FspMultiPhaseLib.c b/IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/FspMultiPhaseLib.c
new file mode 100644
index 0000000000..3786da91b1
--- /dev/null
+++ b/IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/FspMultiPhaseLib.c
@@ -0,0 +1,184 @@
+/** @file
+ FSP MultiPhase library.
+
+ Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <PiPei.h>
+#include <Library/FspCommonLib.h>
+#include <Library/FspSwitchStackLib.h>
+#include <Library/FspSecPlatformLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <FspEas/FspApi.h>
+#include <FspGlobalData.h>
+
+EFI_STATUS
+EFIAPI
+FspMultiPhaseSwitchStack (
+ )
+{
+ SetFspApiReturnStatus (EFI_SUCCESS);
+ Pei2LoaderSwitchStack ();
+
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+FspVariableRequestSwitchStack (
+ IN FSP_MULTI_PHASE_VARIABLE_REQUEST_INFO_PARAMS *FspVariableRequestParams
+ )
+{
+ FSP_GLOBAL_DATA *FspData;
+
+ FspData = GetFspGlobalDataPointer ();
+ if (((UINTN)FspData == 0) || ((UINTN)FspData == 0xFFFFFFFF)) {
+ return EFI_UNSUPPORTED;
+ }
+
+ FspData->VariableRequestParameterPtr = (VOID *)FspVariableRequestParams;
+ SetFspApiReturnStatus (FSP_STATUS_VARIABLE_REQUEST);
+ Pei2LoaderSwitchStack ();
+
+ return EFI_SUCCESS;
+}
+
+/**
+ This function supports FspMultiPhase implementation.
+
+ @param[in] ApiIdx Internal index of the FSP API.
+ @param[in] ApiParam Parameter of the FSP API.
+
+ @retval EFI_SUCCESS FSP execution was successful.
+ @retval EFI_INVALID_PARAMETER Input parameters are invalid.
+ @retval EFI_UNSUPPORTED The FSP calling conditions were not met.
+ @retval EFI_DEVICE_ERROR FSP initialization failed.
+**/
+EFI_STATUS
+EFIAPI
+FspMultiPhaseWorker (
+ IN UINT32 ApiIdx,
+ IN VOID *ApiParam
+ )
+{
+ FSP_MULTI_PHASE_PARAMS *FspMultiPhaseParams;
+ FSP_GLOBAL_DATA *FspData;
+ FSP_MULTI_PHASE_GET_NUMBER_OF_PHASES_PARAMS *FspMultiPhaseGetNumber;
+ BOOLEAN FspDataValid;
+ UINT32 NumberOfPhasesSupported;
+
+ FspDataValid = TRUE;
+ FspData = GetFspGlobalDataPointer ();
+ if (((UINTN)FspData == 0) || ((UINTN)FspData == 0xFFFFFFFF)) {
+ FspDataValid = FALSE;
+ }
+
+ //
+ // It is required that FspData->NumberOfPhases to be reset to 0 after
+ // current FSP component finished.
+ // The next component FspData->NumberOfPhases will only be re-initialized when FspData->NumberOfPhases = 0
+ //
+ if ((FspDataValid == TRUE) && (FspData->NumberOfPhases == 0)) {
+ FspData->NumberOfPhases = PcdGet32 (PcdMultiPhaseNumberOfPhases);
+ FspData->PhasesExecuted = 0;
+ if (FspMultiPhasePlatformGetNumberOfPhases (ApiIdx, &NumberOfPhasesSupported) == TRUE) {
+ //
+ // Platform has implemented runtime controlling for NumberOfPhasesSupported
+ //
+ FspData->NumberOfPhases = NumberOfPhasesSupported;
+ }
+ }
+
+ FspMultiPhaseParams = (FSP_MULTI_PHASE_PARAMS *)ApiParam;
+
+ if (FspDataValid == FALSE) {
+ return EFI_DEVICE_ERROR;
+ } else {
+ switch (FspMultiPhaseParams->MultiPhaseAction) {
+ case EnumMultiPhaseGetNumberOfPhases:
+ if ((FspMultiPhaseParams->MultiPhaseParamPtr == NULL) || (FspMultiPhaseParams->PhaseIndex != 0)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ FspMultiPhaseGetNumber = (FSP_MULTI_PHASE_GET_NUMBER_OF_PHASES_PARAMS *)FspMultiPhaseParams->MultiPhaseParamPtr;
+ FspMultiPhaseGetNumber->NumberOfPhases = FspData->NumberOfPhases;
+ FspMultiPhaseGetNumber->PhasesExecuted = FspData->PhasesExecuted;
+ break;
+
+ case EnumMultiPhaseExecutePhase:
+ if ((FspMultiPhaseParams->PhaseIndex > FspData->PhasesExecuted) && (FspMultiPhaseParams->PhaseIndex <= FspData->NumberOfPhases)) {
+ FspData->PhasesExecuted = FspMultiPhaseParams->PhaseIndex;
+ return Loader2PeiSwitchStack ();
+ } else {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ break;
+
+ case EnumMultiPhaseGetVariableRequestInfo:
+ //
+ // return variable request info
+ //
+ FspMultiPhaseParams->MultiPhaseParamPtr = FspData->VariableRequestParameterPtr;
+ break;
+
+ case EnumMultiPhaseCompleteVariableRequest:
+ //
+ // retrieve complete variable request params
+ //
+ FspData->VariableRequestParameterPtr = FspMultiPhaseParams->MultiPhaseParamPtr;
+ return Loader2PeiSwitchStack ();
+ break;
+
+ default:
+ return EFI_UNSUPPORTED;
+ }
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ This function handles FspMultiPhaseMemInitApi.
+
+ @param[in] ApiIdx Internal index of the FSP API.
+ @param[in] ApiParam Parameter of the FSP API.
+
+ @retval EFI_SUCCESS FSP execution was successful.
+ @retval EFI_INVALID_PARAMETER Input parameters are invalid.
+ @retval EFI_UNSUPPORTED The FSP calling conditions were not met.
+ @retval EFI_DEVICE_ERROR FSP initialization failed.
+**/
+EFI_STATUS
+EFIAPI
+FspMultiPhaseMemInitApiHandler (
+ IN UINT32 ApiIdx,
+ IN VOID *ApiParam
+ )
+{
+ return FspMultiPhaseWorker (ApiIdx, ApiParam);
+}
+
+/**
+ This function handles FspMultiPhaseSiInitApi.
+
+ @param[in] ApiIdx Internal index of the FSP API.
+ @param[in] ApiParam Parameter of the FSP API.
+
+ @retval EFI_SUCCESS FSP execution was successful.
+ @retval EFI_INVALID_PARAMETER Input parameters are invalid.
+ @retval EFI_UNSUPPORTED The FSP calling conditions were not met.
+ @retval EFI_DEVICE_ERROR FSP initialization failed.
+**/
+EFI_STATUS
+EFIAPI
+FspMultiPhaseSiInitApiHandlerV2 (
+ IN UINT32 ApiIdx,
+ IN VOID *ApiParam
+ )
+{
+ return FspMultiPhaseWorker (ApiIdx, ApiParam);
+}
diff --git a/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/PlatformSecLibNull.c b/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/PlatformSecLibNull.c
index a6f3892ed8..9c1b5b32e9 100644
--- a/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/PlatformSecLibNull.c
+++ b/IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/PlatformSecLibNull.c
@@ -28,6 +28,7 @@ FspUpdSignatureCheck (
/**
This function handles FspMultiPhaseSiInitApi.
+ Starting from FSP 2.4 this function is obsolete and FspMultiPhaseSiInitApiHandlerV2 is the replacement.
@param[in] ApiIdx Internal index of the FSP API.
@param[in] ApiParam Parameter of the FSP API.
@@ -42,3 +43,36 @@ FspMultiPhaseSiInitApiHandler (
{
return EFI_SUCCESS;
}
+
+/**
+ FSP MultiPhase Platform Get Number Of Phases Function.
+
+ Allows an FSP binary to dynamically update the number of phases at runtime.
+ For example, UPD settings could negate the need to enter the multi-phase flow
+ in certain scenarios. If this function returns FALSE, the default number of phases
+ provided by PcdMultiPhaseNumberOfPhases will be returned to the bootloader instead.
+
+ @param[in] ApiIdx - Internal index of the FSP API.
+ @param[in] NumberOfPhasesSupported - How many phases are supported by current FSP Component.
+
+ @retval TRUE - NumberOfPhases are modified by Platform during runtime.
+ @retval FALSE - The Default build time NumberOfPhases should be used.
+
+**/
+BOOLEAN
+EFIAPI
+FspMultiPhasePlatformGetNumberOfPhases (
+ IN UINT8 ApiIdx,
+ IN OUT UINT32 *NumberOfPhasesSupported
+ )
+{
+ /* Example for platform runtime controlling
+ if ((ApiIdx == FspMultiPhaseSiInitApiIndex) && (Feature1Enable == FALSE)) {
+ *NumberOfPhasesSupported = 0;
+ return TRUE;
+ }
+ return FALSE
+ */
+
+ return FALSE;
+}
diff --git a/IntelFsp2Pkg/Tools/SplitFspBin.py b/IntelFsp2Pkg/Tools/SplitFspBin.py
index ddabab7d8c..419e5ba985 100644
--- a/IntelFsp2Pkg/Tools/SplitFspBin.py
+++ b/IntelFsp2Pkg/Tools/SplitFspBin.py
@@ -103,29 +103,31 @@ class FSP_COMMON_HEADER(Structure):
class FSP_INFORMATION_HEADER(Structure):
_fields_ = [
- ('Signature', ARRAY(c_char, 4)),
- ('HeaderLength', c_uint32),
- ('Reserved1', c_uint16),
- ('SpecVersion', c_uint8),
- ('HeaderRevision', c_uint8),
- ('ImageRevision', c_uint32),
- ('ImageId', ARRAY(c_char, 8)),
- ('ImageSize', c_uint32),
- ('ImageBase', c_uint32),
- ('ImageAttribute', c_uint16),
- ('ComponentAttribute', c_uint16),
- ('CfgRegionOffset', c_uint32),
- ('CfgRegionSize', c_uint32),
- ('Reserved2', c_uint32),
- ('TempRamInitEntryOffset', c_uint32),
- ('Reserved3', c_uint32),
- ('NotifyPhaseEntryOffset', c_uint32),
- ('FspMemoryInitEntryOffset', c_uint32),
- ('TempRamExitEntryOffset', c_uint32),
- ('FspSiliconInitEntryOffset', c_uint32),
- ('FspMultiPhaseSiInitEntryOffset', c_uint32),
- ('ExtendedImageRevision', c_uint16),
- ('Reserved4', c_uint16)
+ ('Signature', ARRAY(c_char, 4)),
+ ('HeaderLength', c_uint32),
+ ('Reserved1', c_uint16),
+ ('SpecVersion', c_uint8),
+ ('HeaderRevision', c_uint8),
+ ('ImageRevision', c_uint32),
+ ('ImageId', ARRAY(c_char, 8)),
+ ('ImageSize', c_uint32),
+ ('ImageBase', c_uint32),
+ ('ImageAttribute', c_uint16),
+ ('ComponentAttribute', c_uint16),
+ ('CfgRegionOffset', c_uint32),
+ ('CfgRegionSize', c_uint32),
+ ('Reserved2', c_uint32),
+ ('TempRamInitEntryOffset', c_uint32),
+ ('Reserved3', c_uint32),
+ ('NotifyPhaseEntryOffset', c_uint32),
+ ('FspMemoryInitEntryOffset', c_uint32),
+ ('TempRamExitEntryOffset', c_uint32),
+ ('FspSiliconInitEntryOffset', c_uint32),
+ ('FspMultiPhaseSiInitEntryOffset', c_uint32),
+ ('ExtendedImageRevision', c_uint16),
+ ('Reserved4', c_uint16),
+ ('FspMultiPhaseMemInitEntryOffset', c_uint32),
+ ('FspSmmInitEntryOffset', c_uint32)
]
class FSP_PATCH_TABLE(Structure):