mirror of https://github.com/acidanthera/audk.git
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>
This commit is contained in:
parent
4b7bd4c591
commit
df25a5457f
|
@ -487,10 +487,38 @@ typedef struct {
|
||||||
/// Action definition for FspMultiPhaseSiInit API
|
/// Action definition for FspMultiPhaseSiInit API
|
||||||
///
|
///
|
||||||
typedef enum {
|
typedef enum {
|
||||||
EnumMultiPhaseGetNumberOfPhases = 0x0,
|
EnumMultiPhaseGetNumberOfPhases = 0x0,
|
||||||
EnumMultiPhaseExecutePhase = 0x1
|
EnumMultiPhaseExecutePhase = 0x1,
|
||||||
|
EnumMultiPhaseGetVariableRequestInfo = 0x2,
|
||||||
|
EnumMultiPhaseCompleteVariableRequest = 0x3
|
||||||
} FSP_MULTI_PHASE_ACTION;
|
} 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
|
/// Data structure returned by FSP when bootloader calling
|
||||||
/// FspMultiPhaseSiInit API with action 0 (EnumMultiPhaseGetNumberOfPhases)
|
/// FspMultiPhaseSiInit API with action 0 (EnumMultiPhaseGetNumberOfPhases)
|
||||||
|
@ -594,7 +622,7 @@ EFI_STATUS
|
||||||
@retval EFI_UNSUPPORTED The FSP calling conditions were not met.
|
@retval EFI_UNSUPPORTED The FSP calling conditions were not met.
|
||||||
@retval EFI_DEVICE_ERROR FSP initialization failed.
|
@retval EFI_DEVICE_ERROR FSP initialization failed.
|
||||||
@retval EFI_OUT_OF_RESOURCES Stack range requested by FSP is not met.
|
@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
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
|
@ -690,4 +718,34 @@ EFI_STATUS
|
||||||
IN VOID *FspiUpdDataPtr
|
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
|
#endif
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
#define FSP_IN_API_MODE 0
|
#define FSP_IN_API_MODE 0
|
||||||
#define FSP_IN_DISPATCH_MODE 1
|
#define FSP_IN_DISPATCH_MODE 1
|
||||||
#define FSP_GLOBAL_DATA_VERSION 0x2
|
#define FSP_GLOBAL_DATA_VERSION 0x3
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@ typedef enum {
|
||||||
FspSiliconInitApiIndex,
|
FspSiliconInitApiIndex,
|
||||||
FspMultiPhaseSiInitApiIndex,
|
FspMultiPhaseSiInitApiIndex,
|
||||||
FspSmmInitApiIndex,
|
FspSmmInitApiIndex,
|
||||||
|
FspMultiPhaseMemInitApiIndex,
|
||||||
FspApiIndexMax
|
FspApiIndexMax
|
||||||
} FSP_API_INDEX;
|
} FSP_API_INDEX;
|
||||||
|
|
||||||
|
@ -82,6 +83,8 @@ typedef struct {
|
||||||
VOID *FunctionParameterPtr;
|
VOID *FunctionParameterPtr;
|
||||||
FSP_INFO_HEADER *FspInfoHeader;
|
FSP_INFO_HEADER *FspInfoHeader;
|
||||||
VOID *UpdDataPtr;
|
VOID *UpdDataPtr;
|
||||||
|
VOID *FspHobListPtr;
|
||||||
|
VOID *VariableRequestParameterPtr;
|
||||||
///
|
///
|
||||||
/// End of UINTN and pointer section
|
/// End of UINTN and pointer section
|
||||||
/// At this point, next field offset must be either *0h or *8h to
|
/// At this point, next field offset must be either *0h or *8h to
|
||||||
|
|
|
@ -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
|
|
@ -81,6 +81,7 @@ FspUpdSignatureCheck (
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function handles FspMultiPhaseSiInitApi.
|
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] ApiIdx Internal index of the FSP API.
|
||||||
@param[in] ApiParam Parameter of the FSP API.
|
@param[in] ApiParam Parameter of the FSP API.
|
||||||
|
@ -93,4 +94,26 @@ FspMultiPhaseSiInitApiHandler (
|
||||||
IN VOID *ApiParam
|
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
|
#endif
|
||||||
|
|
|
@ -37,6 +37,9 @@
|
||||||
## @libraryclass Provides FSP platform sec related actions.
|
## @libraryclass Provides FSP platform sec related actions.
|
||||||
FspSecPlatformLib|Include/Library/FspSecPlatformLib.h
|
FspSecPlatformLib|Include/Library/FspSecPlatformLib.h
|
||||||
|
|
||||||
|
## @libraryclass Provides FSP MultiPhase service functions.
|
||||||
|
FspMultiPhaseLib|Include/Library/FspMultiPhaseLib.h
|
||||||
|
|
||||||
[Ppis]
|
[Ppis]
|
||||||
#
|
#
|
||||||
# PPI to indicate FSP is ready to enter notify phase
|
# PPI to indicate FSP is ready to enter notify phase
|
||||||
|
@ -112,5 +115,10 @@
|
||||||
gIntelFsp2PkgTokenSpaceGuid.PcdFspPrivateTemporaryRamSize |0x00000000|UINT32|0x10000006
|
gIntelFsp2PkgTokenSpaceGuid.PcdFspPrivateTemporaryRamSize |0x00000000|UINT32|0x10000006
|
||||||
|
|
||||||
[PcdsFixedAtBuild,PcdsDynamic,PcdsDynamicEx]
|
[PcdsFixedAtBuild,PcdsDynamic,PcdsDynamicEx]
|
||||||
gIntelFsp2PkgTokenSpaceGuid.PcdFspReservedMemoryLength |0x00100000|UINT32|0x46530000
|
gIntelFsp2PkgTokenSpaceGuid.PcdFspReservedMemoryLength |0x00100000|UINT32|0x46530000
|
||||||
gIntelFsp2PkgTokenSpaceGuid.PcdBootLoaderEntry |0xFFFFFFE4|UINT32|0x46530100
|
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
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
FspPlatformLib|IntelFsp2Pkg/Library/BaseFspPlatformLib/BaseFspPlatformLib.inf
|
FspPlatformLib|IntelFsp2Pkg/Library/BaseFspPlatformLib/BaseFspPlatformLib.inf
|
||||||
FspSwitchStackLib|IntelFsp2Pkg/Library/BaseFspSwitchStackLib/BaseFspSwitchStackLib.inf
|
FspSwitchStackLib|IntelFsp2Pkg/Library/BaseFspSwitchStackLib/BaseFspSwitchStackLib.inf
|
||||||
FspSecPlatformLib|IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/SecFspSecPlatformLibNull.inf
|
FspSecPlatformLib|IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/SecFspSecPlatformLibNull.inf
|
||||||
|
FspMultiPhaseLib|IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/BaseFspMultiPhaseLib.inf
|
||||||
|
|
||||||
[LibraryClasses.common.PEIM]
|
[LibraryClasses.common.PEIM]
|
||||||
PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
|
PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
|
||||||
|
@ -64,12 +65,15 @@
|
||||||
IntelFsp2Pkg/Library/BaseFspSwitchStackLib/BaseFspSwitchStackLib.inf
|
IntelFsp2Pkg/Library/BaseFspSwitchStackLib/BaseFspSwitchStackLib.inf
|
||||||
IntelFsp2Pkg/Library/BaseDebugDeviceLibNull/BaseDebugDeviceLibNull.inf
|
IntelFsp2Pkg/Library/BaseDebugDeviceLibNull/BaseDebugDeviceLibNull.inf
|
||||||
IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/SecFspSecPlatformLibNull.inf
|
IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/SecFspSecPlatformLibNull.inf
|
||||||
|
IntelFsp2Pkg/Library/BaseFspMultiPhaseLib/BaseFspMultiPhaseLib.inf
|
||||||
|
|
||||||
IntelFsp2Pkg/FspSecCore/FspSecCoreT.inf
|
IntelFsp2Pkg/FspSecCore/FspSecCoreT.inf
|
||||||
IntelFsp2Pkg/FspSecCore/FspSecCoreM.inf
|
IntelFsp2Pkg/FspSecCore/FspSecCoreM.inf
|
||||||
|
IntelFsp2Pkg/FspSecCore/Fsp24SecCoreM.inf
|
||||||
IntelFsp2Pkg/FspSecCore/FspSecCoreS.inf
|
IntelFsp2Pkg/FspSecCore/FspSecCoreS.inf
|
||||||
IntelFsp2Pkg/FspSecCore/FspSecCoreI.inf
|
IntelFsp2Pkg/FspSecCore/FspSecCoreI.inf
|
||||||
IntelFsp2Pkg/FspSecCore/Fsp22SecCoreS.inf
|
IntelFsp2Pkg/FspSecCore/Fsp22SecCoreS.inf
|
||||||
|
IntelFsp2Pkg/FspSecCore/Fsp24SecCoreS.inf
|
||||||
IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf
|
IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf
|
||||||
|
|
||||||
[PcdsFixedAtBuild.common]
|
[PcdsFixedAtBuild.common]
|
||||||
|
|
|
@ -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
|
|
@ -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);
|
||||||
|
}
|
|
@ -28,6 +28,7 @@ FspUpdSignatureCheck (
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function handles FspMultiPhaseSiInitApi.
|
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] ApiIdx Internal index of the FSP API.
|
||||||
@param[in] ApiParam Parameter of the FSP API.
|
@param[in] ApiParam Parameter of the FSP API.
|
||||||
|
@ -42,3 +43,36 @@ FspMultiPhaseSiInitApiHandler (
|
||||||
{
|
{
|
||||||
return EFI_SUCCESS;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -103,29 +103,31 @@ class FSP_COMMON_HEADER(Structure):
|
||||||
|
|
||||||
class FSP_INFORMATION_HEADER(Structure):
|
class FSP_INFORMATION_HEADER(Structure):
|
||||||
_fields_ = [
|
_fields_ = [
|
||||||
('Signature', ARRAY(c_char, 4)),
|
('Signature', ARRAY(c_char, 4)),
|
||||||
('HeaderLength', c_uint32),
|
('HeaderLength', c_uint32),
|
||||||
('Reserved1', c_uint16),
|
('Reserved1', c_uint16),
|
||||||
('SpecVersion', c_uint8),
|
('SpecVersion', c_uint8),
|
||||||
('HeaderRevision', c_uint8),
|
('HeaderRevision', c_uint8),
|
||||||
('ImageRevision', c_uint32),
|
('ImageRevision', c_uint32),
|
||||||
('ImageId', ARRAY(c_char, 8)),
|
('ImageId', ARRAY(c_char, 8)),
|
||||||
('ImageSize', c_uint32),
|
('ImageSize', c_uint32),
|
||||||
('ImageBase', c_uint32),
|
('ImageBase', c_uint32),
|
||||||
('ImageAttribute', c_uint16),
|
('ImageAttribute', c_uint16),
|
||||||
('ComponentAttribute', c_uint16),
|
('ComponentAttribute', c_uint16),
|
||||||
('CfgRegionOffset', c_uint32),
|
('CfgRegionOffset', c_uint32),
|
||||||
('CfgRegionSize', c_uint32),
|
('CfgRegionSize', c_uint32),
|
||||||
('Reserved2', c_uint32),
|
('Reserved2', c_uint32),
|
||||||
('TempRamInitEntryOffset', c_uint32),
|
('TempRamInitEntryOffset', c_uint32),
|
||||||
('Reserved3', c_uint32),
|
('Reserved3', c_uint32),
|
||||||
('NotifyPhaseEntryOffset', c_uint32),
|
('NotifyPhaseEntryOffset', c_uint32),
|
||||||
('FspMemoryInitEntryOffset', c_uint32),
|
('FspMemoryInitEntryOffset', c_uint32),
|
||||||
('TempRamExitEntryOffset', c_uint32),
|
('TempRamExitEntryOffset', c_uint32),
|
||||||
('FspSiliconInitEntryOffset', c_uint32),
|
('FspSiliconInitEntryOffset', c_uint32),
|
||||||
('FspMultiPhaseSiInitEntryOffset', c_uint32),
|
('FspMultiPhaseSiInitEntryOffset', c_uint32),
|
||||||
('ExtendedImageRevision', c_uint16),
|
('ExtendedImageRevision', c_uint16),
|
||||||
('Reserved4', c_uint16)
|
('Reserved4', c_uint16),
|
||||||
|
('FspMultiPhaseMemInitEntryOffset', c_uint32),
|
||||||
|
('FspSmmInitEntryOffset', c_uint32)
|
||||||
]
|
]
|
||||||
|
|
||||||
class FSP_PATCH_TABLE(Structure):
|
class FSP_PATCH_TABLE(Structure):
|
||||||
|
|
Loading…
Reference in New Issue