From df25a5457f04ec465dce97428cfee96f462676e7 Mon Sep 17 00:00:00 2001 From: Chasel Chiu Date: Mon, 25 Jul 2022 12:03:51 -0700 Subject: 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 Cc: Star Zeng Signed-off-by: Chasel Chiu Reviewed-by: Nate DeSimone --- IntelFsp2Pkg/Include/FspEas/FspApi.h | 64 ++++++- IntelFsp2Pkg/Include/FspGlobalData.h | 5 +- IntelFsp2Pkg/Include/Library/FspMultiPhaseLib.h | 55 ++++++ IntelFsp2Pkg/Include/Library/FspSecPlatformLib.h | 23 +++ IntelFsp2Pkg/IntelFsp2Pkg.dec | 12 +- IntelFsp2Pkg/IntelFsp2Pkg.dsc | 4 + .../BaseFspMultiPhaseLib/BaseFspMultiPhaseLib.inf | 50 ++++++ .../BaseFspMultiPhaseLib/FspMultiPhaseLib.c | 184 +++++++++++++++++++++ .../SecFspSecPlatformLibNull/PlatformSecLibNull.c | 34 ++++ IntelFsp2Pkg/Tools/SplitFspBin.py | 48 +++--- 10 files changed, 450 insertions(+), 29 deletions(-) create mode 100644 IntelFsp2Pkg/Include/Library/FspMultiPhaseLib.h create mode 100644 IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/BaseFspMultiPhaseLib.inf create mode 100644 IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/FspMultiPhaseLib.c (limited to 'IntelFsp2Pkg') 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.
+ 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.
+# +# 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.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include + +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): -- cgit v1.2.3