mirror of https://github.com/acidanthera/audk.git
333 lines
10 KiB
C
333 lines
10 KiB
C
/** @file
|
|
In FSP API V2 mode, it will be invoked only once. It will call FspMemoryInit API,
|
|
register TemporaryRamDonePpi to call TempRamExit API, and register MemoryDiscoveredPpi
|
|
notify to call FspSiliconInit API.
|
|
|
|
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
|
|
This program and the accompanying materials
|
|
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
|
|
http://opensource.org/licenses/bsd-license.php.
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
**/
|
|
|
|
|
|
#include "FspInitPei.h"
|
|
|
|
/**
|
|
Return Hob list produced by FSP.
|
|
|
|
@param[in] PeiServices The pointer to the PEI Services Table.
|
|
@param[in] This The pointer to this instance of this PPI.
|
|
@param[out] FspHobList The pointer to Hob list produced by FSP.
|
|
|
|
@return EFI_SUCCESS FReturn Hob list produced by FSP successfully.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FspInitDoneGetFspHobListV2 (
|
|
IN CONST EFI_PEI_SERVICES **PeiServices,
|
|
IN FSP_INIT_DONE_PPI *This,
|
|
OUT VOID **FspHobList
|
|
);
|
|
|
|
FSP_INIT_DONE_PPI mFspInitDonePpiV2 = {
|
|
FspInitDoneGetFspHobListV2
|
|
};
|
|
|
|
EFI_PEI_PPI_DESCRIPTOR mPeiFspInitDonePpiV2 = {
|
|
EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
|
|
&gFspInitDonePpiGuid,
|
|
&mFspInitDonePpiV2
|
|
};
|
|
|
|
/**
|
|
This function is called after PEI core discover memory and finish migration.
|
|
|
|
@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 Always return EFI_SUCCESS
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
PeiMemoryDiscoveredNotify (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
|
|
IN VOID *Ppi
|
|
);
|
|
|
|
EFI_PEI_NOTIFY_DESCRIPTOR mPeiMemoryDiscoveredNotifyDesc = {
|
|
(EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
|
|
&gEfiPeiMemoryDiscoveredPpiGuid,
|
|
PeiMemoryDiscoveredNotify
|
|
};
|
|
|
|
/**
|
|
TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked
|
|
by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed.
|
|
|
|
@retval EFI_SUCCESS Use of Temporary RAM was disabled.
|
|
@retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
PeiTemporaryRamDone (
|
|
VOID
|
|
);
|
|
|
|
EFI_PEI_TEMPORARY_RAM_DONE_PPI mPeiTemporaryRamDonePpi = {
|
|
PeiTemporaryRamDone
|
|
};
|
|
|
|
EFI_PEI_PPI_DESCRIPTOR mPeiTemporaryRamDoneDesc = {
|
|
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
|
|
&gEfiTemporaryRamDonePpiGuid,
|
|
&mPeiTemporaryRamDonePpi
|
|
};
|
|
|
|
/**
|
|
Return Hob list produced by FSP.
|
|
|
|
@param[in] PeiServices The pointer to the PEI Services Table.
|
|
@param[in] This The pointer to this instance of this PPI.
|
|
@param[out] FspHobList The pointer to Hob list produced by FSP.
|
|
|
|
@return EFI_SUCCESS FReturn Hob list produced by FSP successfully.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FspInitDoneGetFspHobListV2 (
|
|
IN CONST EFI_PEI_SERVICES **PeiServices,
|
|
IN FSP_INIT_DONE_PPI *This,
|
|
OUT VOID **FspHobList
|
|
)
|
|
{
|
|
EFI_HOB_GUID_TYPE *GuidHob;
|
|
|
|
GuidHob = GetFirstGuidHob (&gFspInitDonePpiGuid);
|
|
if (GuidHob != NULL) {
|
|
*FspHobList = *(VOID **)GET_GUID_HOB_DATA (GuidHob);
|
|
return EFI_SUCCESS;
|
|
} else {
|
|
return EFI_NOT_FOUND;
|
|
}
|
|
}
|
|
|
|
/**
|
|
Call FspMemoryInit API.
|
|
|
|
@param[in] FspHeader FSP header pointer.
|
|
|
|
@return Status returned by FspMemoryInit API.
|
|
**/
|
|
EFI_STATUS
|
|
PeiFspMemoryInit (
|
|
IN FSP_INFO_HEADER *FspHeader
|
|
)
|
|
{
|
|
FSP_MEMORY_INIT_PARAMS FspMemoryInitParams;
|
|
FSP_INIT_RT_COMMON_BUFFER FspRtBuffer;
|
|
UINT8 FspUpdRgn[FixedPcdGet32 (PcdMaxUpdRegionSize)];
|
|
UINT32 UpdRegionSize;
|
|
EFI_BOOT_MODE BootMode;
|
|
UINT64 StackSize;
|
|
EFI_PHYSICAL_ADDRESS StackBase;
|
|
EFI_STATUS Status;
|
|
VOID *FspHobList;
|
|
VOID *HobData;
|
|
|
|
DEBUG ((DEBUG_INFO, "PeiFspMemoryInit enter\n"));
|
|
|
|
PeiServicesGetBootMode (&BootMode);
|
|
DEBUG ((DEBUG_INFO, "BootMode - 0x%x\n", BootMode));
|
|
|
|
GetStackInfo (BootMode, FALSE, &StackBase, &StackSize);
|
|
DEBUG ((DEBUG_INFO, "StackBase - 0x%x\n", StackBase));
|
|
DEBUG ((DEBUG_INFO, "StackSize - 0x%x\n", StackSize));
|
|
|
|
ZeroMem (&FspRtBuffer, sizeof(FspRtBuffer));
|
|
FspRtBuffer.StackTop = (UINT32 *)(UINTN)(StackBase + StackSize);
|
|
|
|
FspRtBuffer.BootMode = BootMode;
|
|
|
|
/* Platform override any UPD configs */
|
|
UpdRegionSize = GetUpdRegionSize();
|
|
DEBUG ((DEBUG_INFO, "UpdRegionSize - 0x%x\n", UpdRegionSize));
|
|
DEBUG ((DEBUG_INFO, "sizeof(FspUpdRgn) - 0x%x\n", sizeof(FspUpdRgn)));
|
|
ASSERT(sizeof(FspUpdRgn) >= UpdRegionSize);
|
|
ZeroMem (FspUpdRgn, UpdRegionSize);
|
|
FspRtBuffer.UpdDataRgnPtr = UpdateFspUpdConfigs (FspUpdRgn);
|
|
|
|
ZeroMem (&FspMemoryInitParams, sizeof(FspMemoryInitParams));
|
|
FspMemoryInitParams.NvsBufferPtr = GetNvsBuffer ();
|
|
DEBUG ((DEBUG_INFO, "NvsBufferPtr - 0x%x\n", FspMemoryInitParams.NvsBufferPtr));
|
|
FspMemoryInitParams.RtBufferPtr = (VOID *)&FspRtBuffer;
|
|
FspHobList = NULL;
|
|
FspMemoryInitParams.HobListPtr = &FspHobList;
|
|
|
|
DEBUG ((DEBUG_INFO, "FspMemoryInitParams - 0x%x\n", &FspMemoryInitParams));
|
|
DEBUG ((DEBUG_INFO, " NvsBufferPtr - 0x%x\n", FspMemoryInitParams.NvsBufferPtr));
|
|
DEBUG ((DEBUG_INFO, " RtBufferPtr - 0x%x\n", FspMemoryInitParams.RtBufferPtr));
|
|
DEBUG ((DEBUG_INFO, " StackTop - 0x%x\n", FspRtBuffer.StackTop));
|
|
DEBUG ((DEBUG_INFO, " BootMode - 0x%x\n", FspRtBuffer.BootMode));
|
|
DEBUG ((DEBUG_INFO, " UpdDataRgnPtr - 0x%x\n", FspRtBuffer.UpdDataRgnPtr));
|
|
DEBUG ((DEBUG_INFO, " HobListPtr - 0x%x\n", FspMemoryInitParams.HobListPtr));
|
|
|
|
Status = CallFspMemoryInit (FspHeader, &FspMemoryInitParams);
|
|
DEBUG((DEBUG_INFO, "FspMemoryInit status: 0x%x\n", Status));
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
DEBUG ((DEBUG_INFO, " HobListPtr (returned) - 0x%x\n", FspHobList));
|
|
ASSERT (FspHobList != NULL);
|
|
|
|
FspHobProcessForMemoryResource (FspHobList);
|
|
|
|
//
|
|
// FspHobList is not complete at this moment.
|
|
// Save FspHobList pointer to hob, so that it can be got later
|
|
//
|
|
HobData = BuildGuidHob (
|
|
&gFspInitDonePpiGuid,
|
|
sizeof (VOID *)
|
|
);
|
|
ASSERT (HobData != NULL);
|
|
CopyMem (HobData, &FspHobList, sizeof (FspHobList));
|
|
|
|
return Status;
|
|
}
|
|
|
|
/**
|
|
TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked
|
|
by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed.
|
|
|
|
@retval EFI_SUCCESS Use of Temporary RAM was disabled.
|
|
@retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
PeiTemporaryRamDone (
|
|
VOID
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
VOID *TempRamExitParam;
|
|
FSP_INFO_HEADER *FspHeader;
|
|
|
|
FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase));
|
|
if (FspHeader == NULL) {
|
|
return EFI_DEVICE_ERROR;
|
|
}
|
|
|
|
DEBUG ((DEBUG_INFO, "PeiTemporaryRamDone enter\n"));
|
|
|
|
TempRamExitParam = GetTempRamExitParam ();
|
|
Status = CallTempRamExit (FspHeader, TempRamExitParam);
|
|
DEBUG((DEBUG_INFO, "TempRamExit status: 0x%x\n", Status));
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
This function is called after PEI core discover memory and finish migration.
|
|
|
|
@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 Always return EFI_SUCCESS
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
PeiMemoryDiscoveredNotify (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,
|
|
IN VOID *Ppi
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
VOID *FspSiliconInitParam;
|
|
FSP_INFO_HEADER *FspHeader;
|
|
VOID *FspHobList;
|
|
EFI_HOB_GUID_TYPE *GuidHob;
|
|
|
|
FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase));
|
|
if (FspHeader == NULL) {
|
|
return EFI_DEVICE_ERROR;
|
|
}
|
|
|
|
DEBUG ((DEBUG_INFO, "PeiMemoryDiscoveredNotify enter\n"));
|
|
|
|
FspSiliconInitParam = GetFspSiliconInitParam ();
|
|
Status = CallFspSiliconInit (FspHeader, FspSiliconInitParam);
|
|
DEBUG((DEBUG_ERROR, "FspSiliconInit status: 0x%x\n", Status));
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
//
|
|
// Now FspHobList complete, process it
|
|
//
|
|
GuidHob = GetFirstGuidHob (&gFspInitDonePpiGuid);
|
|
ASSERT (GuidHob != NULL);
|
|
FspHobList = *(VOID **)GET_GUID_HOB_DATA (GuidHob);
|
|
DEBUG ((DEBUG_INFO, "FspHobList - 0x%x\n", FspHobList));
|
|
FspHobProcessForOtherData (FspHobList);
|
|
|
|
//
|
|
// Install FspInitDonePpi so that any other driver can consume this info.
|
|
//
|
|
Status = PeiServicesInstallPpi (&mPeiFspInitDonePpiV2);
|
|
ASSERT_EFI_ERROR(Status);
|
|
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
Do FSP initialization based on FspApi version 2.
|
|
|
|
@param[in] FspHeader FSP header pointer.
|
|
|
|
@return FSP initialization status.
|
|
**/
|
|
EFI_STATUS
|
|
PeiFspInitV2 (
|
|
IN FSP_INFO_HEADER *FspHeader
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
EFI_BOOT_MODE BootMode;
|
|
|
|
Status = PeiFspMemoryInit (FspHeader);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
//
|
|
// Install TempramDonePpi to run TempRamExit
|
|
//
|
|
Status = PeiServicesInstallPpi (&mPeiTemporaryRamDoneDesc);
|
|
ASSERT_EFI_ERROR(Status);
|
|
|
|
//
|
|
// Register MemoryDiscovered Nofity to run FspSiliconInit
|
|
//
|
|
Status = PeiServicesNotifyPpi (&mPeiMemoryDiscoveredNotifyDesc);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
//
|
|
// Register EndOfPei Notify for S3 to run FspNotifyPhase
|
|
//
|
|
PeiServicesGetBootMode (&BootMode);
|
|
if (BootMode == BOOT_ON_S3_RESUME) {
|
|
Status = PeiServicesNotifyPpi (&mS3EndOfPeiNotifyDesc);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
|
|
return EFI_SUCCESS;
|
|
} |