IntelFsp2WrapperPkg: Perform post FSP-S process.

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1716

In API mode FSP wrapper will perform some post
FSP-S process but such process was skipped in Dispatch
mode which may impact some of the boot loaders.
To align behavior between API and Dispatch, an
End-of-Pei callback is introduced to perform same process
in Dispatch mode.

Note: If boot loader implemented its own
      PostFspsHobProcess (), it has to check
      PcdFspModeSelection and support each mode
      properly.

Test: Verified on internal platform and both
      FSP API and Dispatch modes booted successfully.

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: Star Zeng <star.zeng@intel.com>
Reviewed-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
This commit is contained in:
Chasel, Chiu 2019-04-12 16:54:47 +08:00 committed by Chasel Chiu
parent eb33b3994d
commit 68d47eea42
3 changed files with 97 additions and 18 deletions

View File

@ -3,7 +3,7 @@
register TemporaryRamDonePpi to call TempRamExit API, and register MemoryDiscoveredPpi register TemporaryRamDonePpi to call TempRamExit API, and register MemoryDiscoveredPpi
notify to call FspSiliconInit API. notify to call FspSiliconInit API.
Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR> Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@ -130,7 +130,7 @@ S3EndOfPeiNotify(
@param[in] This The pointer to this instance of this PPI. @param[in] This The pointer to this instance of this PPI.
@param[out] FspHobList The pointer to Hob list produced by FSP. @param[out] FspHobList The pointer to Hob list produced by FSP.
@return EFI_SUCCESS FReturn Hob list produced by FSP successfully. @return EFI_SUCCESS Return Hob list produced by FSP successfully.
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
@ -157,7 +157,7 @@ EFI_PEI_PPI_DESCRIPTOR mPeiFspSiliconInitDonePpi = {
@param[in] This The pointer to this instance of this PPI. @param[in] This The pointer to this instance of this PPI.
@param[out] FspHobList The pointer to Hob list produced by FSP. @param[out] FspHobList The pointer to Hob list produced by FSP.
@return EFI_SUCCESS FReturn Hob list produced by FSP successfully. @return EFI_SUCCESS Return Hob list produced by FSP successfully.
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
@ -178,6 +178,49 @@ FspSiliconInitDoneGetFspHobList (
} }
} }
/**
This function is for FSP dispatch mode to perform post FSP-S process.
@param[in] PeiServices Pointer to PEI Services Table.
@param[in] NotifyDesc Pointer to the descriptor for the Notification event that
caused this function to execute.
@param[in] Ppi Pointer to the PPI data associated with this function.
@retval EFI_STATUS Status returned by PeiServicesInstallPpi ()
**/
EFI_STATUS
EFIAPI
FspsWrapperEndOfPeiNotify (
IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
IN VOID *Ppi
)
{
EFI_STATUS Status;
//
// This step may include platform specific process in some boot loaders so
// aligning the same behavior between API and Dispatch modes.
// Note: In Dispatch mode no FspHobList so passing NULL to function and
// expecting function will handle it.
//
PostFspsHobProcess (NULL);
//
// Install FspSiliconInitDonePpi so that any other driver can consume this info.
//
Status = PeiServicesInstallPpi (&mPeiFspSiliconInitDonePpi);
ASSERT_EFI_ERROR(Status);
return Status;
}
EFI_PEI_NOTIFY_DESCRIPTOR mFspsWrapperEndOfPeiNotifyDesc = {
(EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
&gEfiEndOfPeiSignalPpiGuid,
FspsWrapperEndOfPeiNotify
};
/** /**
This function is called after PEI core discover memory and finish migration. This function is called after PEI core discover memory and finish migration.
@ -296,12 +339,12 @@ PeiMemoryDiscoveredNotify (
} }
/** /**
Do FSP initialization. Do FSP initialization in API mode
@return FSP initialization status. @retval EFI_STATUS Always return EFI_SUCCESS
**/ **/
EFI_STATUS EFI_STATUS
FspsWrapperInit ( FspsWrapperInitApiMode (
VOID VOID
) )
{ {
@ -326,6 +369,35 @@ FspsWrapperInit (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/**
Do FSP initialization in Dispatch mode
@retval FSP initialization status.
**/
EFI_STATUS
FspsWrapperInitDispatchMode (
VOID
)
{
EFI_STATUS Status;
//
// FSP-S Wrapper running in Dispatch mode and reports FSP-S FV to PEI dispatcher.
//
PeiServicesInstallFvInfoPpi (
NULL,
(VOID *)(UINTN) PcdGet32 (PcdFspsBaseAddress),
(UINT32)((EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) PcdGet32 (PcdFspsBaseAddress))->FvLength,
NULL,
NULL
);
//
// Register EndOfPei Nofity to run post FSP-S process.
//
Status = PeiServicesNotifyPpi (&mFspsWrapperEndOfPeiNotifyDesc);
ASSERT_EFI_ERROR (Status);
return Status;
}
/** /**
This is the entrypoint of PEIM This is the entrypoint of PEIM
@ -344,15 +416,9 @@ FspsWrapperPeimEntryPoint (
DEBUG ((DEBUG_INFO, "FspsWrapperPeimEntryPoint\n")); DEBUG ((DEBUG_INFO, "FspsWrapperPeimEntryPoint\n"));
if (PcdGet8 (PcdFspModeSelection) == 1) { if (PcdGet8 (PcdFspModeSelection) == 1) {
FspsWrapperInit (); FspsWrapperInitApiMode ();
} else { } else {
PeiServicesInstallFvInfoPpi ( FspsWrapperInitDispatchMode ();
NULL,
(VOID *)(UINTN) PcdGet32 (PcdFspsBaseAddress),
(UINT32)((EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) PcdGet32 (PcdFspsBaseAddress))->FvLength,
NULL,
NULL
);
} }
return EFI_SUCCESS; return EFI_SUCCESS;

View File

@ -1,7 +1,7 @@
/** @file /** @file
Sample to provide FSP wrapper hob process related function. Sample to provide FSP wrapper hob process related function.
Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR> Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@ -378,7 +378,19 @@ PostFspsHobProcess (
IN VOID *FspHobList IN VOID *FspHobList
) )
{ {
//
// PostFspsHobProcess () will be called in both FSP API and Dispatch modes to
// align the same behavior and support a variety of boot loader implementations.
// Boot loader provided library function is recommended to support both API and
// Dispatch modes by checking PcdFspModeSelection.
//
if (PcdGet8 (PcdFspModeSelection) == 1) {
//
// Only in FSP API mode the wrapper has to build hobs basing on FSP output data.
// In this case FspHobList cannot be NULL.
//
ASSERT (FspHobList != NULL);
ProcessFspHobList (FspHobList); ProcessFspHobList (FspHobList);
}
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -1,7 +1,7 @@
## @file ## @file
# Sample to provide FSP wrapper hob process related function. # Sample to provide FSP wrapper hob process related function.
# #
# Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>
# #
# SPDX-License-Identifier: BSD-2-Clause-Patent # SPDX-License-Identifier: BSD-2-Clause-Patent
# #
@ -61,6 +61,7 @@
[Pcd] [Pcd]
gIntelFsp2WrapperTokenSpaceGuid.PcdPeiMinMemSize ## CONSUMES gIntelFsp2WrapperTokenSpaceGuid.PcdPeiMinMemSize ## CONSUMES
gIntelFsp2WrapperTokenSpaceGuid.PcdPeiRecoveryMinMemSize ## CONSUMES gIntelFsp2WrapperTokenSpaceGuid.PcdPeiRecoveryMinMemSize ## CONSUMES
gIntelFsp2WrapperTokenSpaceGuid.PcdFspModeSelection ## CONSUMES
[Guids] [Guids]
gFspReservedMemoryResourceHobGuid ## CONSUMES ## HOB gFspReservedMemoryResourceHobGuid ## CONSUMES ## HOB