IntelFsp2WrapperPkg: Support UPD allocation outside FspWrapper

UPD allocation and patching can be done outside FspWrapper
as implementation choice so adding a PCD to select between
original FspWrapper allocation model or outside model

Cc: Jiewen Yao <Jiewen.yao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Chasel Chiu <chasel.chiu@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
This commit is contained in:
Chasel, Chiu 2017-11-23 10:22:45 +08:00
parent 984ba6a467
commit e69dcef54e
5 changed files with 76 additions and 52 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 - 2016, Intel Corporation. All rights reserved.<BR> Copyright (c) 2014 - 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at which accompanies this distribution. The full text of the license may be found at
@ -63,20 +63,29 @@ PeiFspMemoryInit (
DEBUG ((DEBUG_INFO, "PeiFspMemoryInit enter\n")); DEBUG ((DEBUG_INFO, "PeiFspMemoryInit enter\n"));
FspHobListPtr = NULL; FspHobListPtr = NULL;
FspmUpdDataPtr = NULL;
//
// Copy default FSP-M UPD data from Flash
//
FspmHeaderPtr = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress)); FspmHeaderPtr = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32 (PcdFspmBaseAddress));
DEBUG ((DEBUG_INFO, "FspmHeaderPtr - 0x%x\n", FspmHeaderPtr)); DEBUG ((DEBUG_INFO, "FspmHeaderPtr - 0x%x\n", FspmHeaderPtr));
if (FspmHeaderPtr == NULL) { if (FspmHeaderPtr == NULL) {
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
FspmUpdDataPtr = (FSPM_UPD_COMMON *)AllocateZeroPool ((UINTN)FspmHeaderPtr->CfgRegionSize); if (PcdGet32 (PcdFspmUpdDataAddress) == 0 && (FspmHeaderPtr->CfgRegionSize != 0) && (FspmHeaderPtr->CfgRegionOffset != 0)) {
ASSERT (FspmUpdDataPtr != NULL); //
SourceData = (UINTN *)((UINTN)FspmHeaderPtr->ImageBase + (UINTN)FspmHeaderPtr->CfgRegionOffset); // Copy default FSP-M UPD data from Flash
CopyMem (FspmUpdDataPtr, SourceData, (UINTN)FspmHeaderPtr->CfgRegionSize); //
FspmUpdDataPtr = (FSPM_UPD_COMMON *)AllocateZeroPool ((UINTN)FspmHeaderPtr->CfgRegionSize);
ASSERT (FspmUpdDataPtr != NULL);
SourceData = (UINTN *)((UINTN)FspmHeaderPtr->ImageBase + (UINTN)FspmHeaderPtr->CfgRegionOffset);
CopyMem (FspmUpdDataPtr, SourceData, (UINTN)FspmHeaderPtr->CfgRegionSize);
} else {
//
// External UPD is ready, get the buffer from PCD pointer.
//
FspmUpdDataPtr = (FSPM_UPD_COMMON *)PcdGet32 (PcdFspmUpdDataAddress);
ASSERT (FspmUpdDataPtr != NULL);
}
DEBUG ((DEBUG_INFO, "UpdateFspmUpdData enter\n")); DEBUG ((DEBUG_INFO, "UpdateFspmUpdData enter\n"));
UpdateFspmUpdData ((VOID *)FspmUpdDataPtr); UpdateFspmUpdData ((VOID *)FspmUpdDataPtr);

View File

@ -59,7 +59,8 @@
IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec IntelFsp2WrapperPkg/IntelFsp2WrapperPkg.dec
[Pcd] [Pcd]
gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress ## CONSUMES gIntelFsp2WrapperTokenSpaceGuid.PcdFspmBaseAddress ## CONSUMES
gIntelFsp2WrapperTokenSpaceGuid.PcdFspmUpdDataAddress ## CONSUMES
[Sources] [Sources]
FspmWrapperPeim.c FspmWrapperPeim.c

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 - 2016, Intel Corporation. All rights reserved.<BR> Copyright (c) 2014 - 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at which accompanies this distribution. The full text of the license may be found at
@ -44,14 +44,14 @@ extern EFI_PEI_NOTIFY_DESCRIPTOR mS3EndOfPeiNotifyDesc;
extern EFI_GUID gFspHobGuid; extern EFI_GUID gFspHobGuid;
/** /**
This function handles S3 resume task at the end of PEI This function handles S3 resume task at the end of PEI
@param[in] PeiServices Pointer to PEI Services Table. @param[in] PeiServices Pointer to PEI Services Table.
@param[in] NotifyDesc Pointer to the descriptor for the Notification event that @param[in] NotifyDesc Pointer to the descriptor for the Notification event that
caused this function to execute. caused this function to execute.
@param[in] Ppi Pointer to the PPI data associated with this function. @param[in] Ppi Pointer to the PPI data associated with this function.
@retval EFI_STATUS Always return EFI_SUCCESS @retval EFI_STATUS Always return EFI_SUCCESS
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
@ -68,14 +68,14 @@ EFI_PEI_NOTIFY_DESCRIPTOR mS3EndOfPeiNotifyDesc = {
}; };
/** /**
This function handles S3 resume task at the end of PEI This function handles S3 resume task at the end of PEI
@param[in] PeiServices Pointer to PEI Services Table. @param[in] PeiServices Pointer to PEI Services Table.
@param[in] NotifyDesc Pointer to the descriptor for the Notification event that @param[in] NotifyDesc Pointer to the descriptor for the Notification event that
caused this function to execute. caused this function to execute.
@param[in] Ppi Pointer to the PPI data associated with this function. @param[in] Ppi Pointer to the PPI data associated with this function.
@retval EFI_STATUS Always return EFI_SUCCESS @retval EFI_STATUS Always return EFI_SUCCESS
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
@ -130,13 +130,13 @@ S3EndOfPeiNotify(
} }
/** /**
Return Hob list produced by FSP. Return Hob list produced by FSP.
@param[in] PeiServices The pointer to the PEI Services Table. @param[in] PeiServices The pointer to the PEI Services Table.
@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 FReturn Hob list produced by FSP successfully.
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
@ -157,13 +157,13 @@ EFI_PEI_PPI_DESCRIPTOR mPeiFspSiliconInitDonePpi = {
}; };
/** /**
Return Hob list produced by FSP. Return Hob list produced by FSP.
@param[in] PeiServices The pointer to the PEI Services Table. @param[in] PeiServices The pointer to the PEI Services Table.
@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 FReturn Hob list produced by FSP successfully.
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
@ -209,14 +209,14 @@ EFI_PEI_NOTIFY_DESCRIPTOR mPeiMemoryDiscoveredNotifyDesc = {
}; };
/** /**
This function is called after PEI core discover memory and finish migration. This function is called after PEI core discover memory and finish migration.
@param[in] PeiServices Pointer to PEI Services Table. @param[in] PeiServices Pointer to PEI Services Table.
@param[in] NotifyDesc Pointer to the descriptor for the Notification event that @param[in] NotifyDesc Pointer to the descriptor for the Notification event that
caused this function to execute. caused this function to execute.
@param[in] Ppi Pointer to the PPI data associated with this function. @param[in] Ppi Pointer to the PPI data associated with this function.
@retval EFI_STATUS Always return EFI_SUCCESS @retval EFI_STATUS Always return EFI_SUCCESS
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
@ -234,22 +234,27 @@ PeiMemoryDiscoveredNotify (
FSPS_UPD_COMMON *FspsUpdDataPtr; FSPS_UPD_COMMON *FspsUpdDataPtr;
UINTN *SourceData; UINTN *SourceData;
DEBUG ((DEBUG_INFO, "PeiMemoryDiscoveredNotify enter\n")); DEBUG ((DEBUG_INFO, "PeiMemoryDiscoveredNotify enter\n"));
FspsUpdDataPtr = NULL;
//
// Copy default FSP-S UPD data from Flash
//
FspsHeaderPtr = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32 (PcdFspsBaseAddress)); FspsHeaderPtr = (FSP_INFO_HEADER *)FspFindFspHeader (PcdGet32 (PcdFspsBaseAddress));
DEBUG ((DEBUG_INFO, "FspsHeaderPtr - 0x%x\n", FspsHeaderPtr)); DEBUG ((DEBUG_INFO, "FspsHeaderPtr - 0x%x\n", FspsHeaderPtr));
if (FspsHeaderPtr == NULL) { if (FspsHeaderPtr == NULL) {
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
FspsUpdDataPtr = (FSPS_UPD_COMMON *)AllocateZeroPool ((UINTN)FspsHeaderPtr->CfgRegionSize); if (PcdGet32 (PcdFspsUpdDataAddress) == 0 && (FspsHeaderPtr->CfgRegionSize != 0) && (FspsHeaderPtr->CfgRegionOffset != 0)) {
ASSERT (FspsUpdDataPtr != NULL); //
SourceData = (UINTN *)((UINTN)FspsHeaderPtr->ImageBase + (UINTN)FspsHeaderPtr->CfgRegionOffset); // Copy default FSP-S UPD data from Flash
CopyMem (FspsUpdDataPtr, SourceData, (UINTN)FspsHeaderPtr->CfgRegionSize); //
FspsUpdDataPtr = (FSPS_UPD_COMMON *)AllocateZeroPool ((UINTN)FspsHeaderPtr->CfgRegionSize);
ASSERT (FspsUpdDataPtr != NULL);
SourceData = (UINTN *)((UINTN)FspsHeaderPtr->ImageBase + (UINTN)FspsHeaderPtr->CfgRegionOffset);
CopyMem (FspsUpdDataPtr, SourceData, (UINTN)FspsHeaderPtr->CfgRegionSize);
} else {
FspsUpdDataPtr = (FSPS_UPD_COMMON *)PcdGet32 (PcdFspsUpdDataAddress);
ASSERT (FspsUpdDataPtr != NULL);
}
UpdateFspsUpdData ((VOID *)FspsUpdDataPtr); UpdateFspsUpdData ((VOID *)FspsUpdDataPtr);
@ -342,7 +347,6 @@ FspsWrapperPeimEntryPoint (
IN CONST EFI_PEI_SERVICES **PeiServices IN CONST EFI_PEI_SERVICES **PeiServices
) )
{ {
DEBUG ((DEBUG_INFO, "FspsWrapperPeimEntryPoint\n")); DEBUG ((DEBUG_INFO, "FspsWrapperPeimEntryPoint\n"));
FspsWrapperInit (); FspsWrapperInit ();

View File

@ -66,7 +66,8 @@
gEfiPeiMemoryDiscoveredPpiGuid ## NOTIFY gEfiPeiMemoryDiscoveredPpiGuid ## NOTIFY
[Pcd] [Pcd]
gIntelFsp2WrapperTokenSpaceGuid.PcdFspsBaseAddress ## CONSUMES gIntelFsp2WrapperTokenSpaceGuid.PcdFspsBaseAddress ## CONSUMES
gIntelFsp2WrapperTokenSpaceGuid.PcdFspsUpdDataAddress ## CONSUMES
[Guids] [Guids]
gFspHobGuid ## CONSUMES ## HOB gFspHobGuid ## CONSUMES ## HOB

View File

@ -1,7 +1,7 @@
## @file ## @file
# Provides drivers and definitions to support fsp in EDKII bios. # Provides drivers and definitions to support fsp in EDKII bios.
# #
# Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2014 - 2017, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials are licensed and made available under # This program and the accompanying materials are licensed and made available under
# the terms and conditions of the BSD License that accompanies this distribution. # the terms and conditions of the BSD License that accompanies this distribution.
# The full text of the license may be found at # The full text of the license may be found at
@ -95,4 +95,13 @@
[PcdsFixedAtBuild, PcdsPatchableInModule,PcdsDynamic,PcdsDynamicEx] [PcdsFixedAtBuild, PcdsPatchableInModule,PcdsDynamic,PcdsDynamicEx]
gIntelFsp2WrapperTokenSpaceGuid.PcdFspsBaseAddress|0x00000000|UINT32|0x00001001 gIntelFsp2WrapperTokenSpaceGuid.PcdFspsBaseAddress|0x00000000|UINT32|0x00001001
#
# To provide flexibility for platform to pre-allocate FSP UPD buffer
#
# The PCDs define the pre-allocated FSPM and FSPS 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.PcdFspmUpdDataAddress|0x00000000|UINT32|0x50000000
gIntelFsp2WrapperTokenSpaceGuid.PcdFspsUpdDataAddress|0x00000000|UINT32|0x50000001