+++ /dev/null
-/** @file\r
- In FSP API V2 mode, it will be invoked only once. It will call FspMemoryInit API,\r
- register TemporaryRamDonePpi to call TempRamExit API, and register MemoryDiscoveredPpi\r
- notify to call FspSiliconInit API.\r
-\r
- Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
- SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-\r
-#include "FspInitPei.h"\r
-\r
-/**\r
- Return Hob list produced by FSP.\r
-\r
- @param[in] PeiServices The pointer to the PEI Services Table.\r
- @param[in] This The pointer to this instance of this PPI.\r
- @param[out] FspHobList The pointer to Hob list produced by FSP.\r
-\r
- @return EFI_SUCCESS FReturn Hob list produced by FSP successfully.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-FspInitDoneGetFspHobListV2 (\r
- IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN FSP_INIT_DONE_PPI *This,\r
- OUT VOID **FspHobList\r
- );\r
-\r
-FSP_INIT_DONE_PPI mFspInitDonePpiV2 = {\r
- FspInitDoneGetFspHobListV2\r
-};\r
-\r
-EFI_PEI_PPI_DESCRIPTOR mPeiFspInitDonePpiV2 = {\r
- EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,\r
- &gFspInitDonePpiGuid,\r
- &mFspInitDonePpiV2\r
-};\r
-\r
-/**\r
- This function is called after PEI core discover memory and finish migration.\r
-\r
- @param[in] PeiServices Pointer to PEI Services Table.\r
- @param[in] NotifyDesc Pointer to the descriptor for the Notification event that\r
- caused this function to execute.\r
- @param[in] Ppi Pointer to the PPI data associated with this function.\r
-\r
- @retval EFI_STATUS Always return EFI_SUCCESS\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PeiMemoryDiscoveredNotify (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,\r
- IN VOID *Ppi\r
- );\r
-\r
-EFI_PEI_NOTIFY_DESCRIPTOR mPeiMemoryDiscoveredNotifyDesc = {\r
- (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
- &gEfiPeiMemoryDiscoveredPpiGuid,\r
- PeiMemoryDiscoveredNotify\r
-};\r
-\r
-/**\r
- TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked\r
- by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed.\r
-\r
- @retval EFI_SUCCESS Use of Temporary RAM was disabled.\r
- @retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PeiTemporaryRamDone (\r
- VOID\r
- );\r
-\r
-EFI_PEI_TEMPORARY_RAM_DONE_PPI mPeiTemporaryRamDonePpi = {\r
- PeiTemporaryRamDone\r
-};\r
-\r
-EFI_PEI_PPI_DESCRIPTOR mPeiTemporaryRamDoneDesc = {\r
- (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
- &gEfiTemporaryRamDonePpiGuid,\r
- &mPeiTemporaryRamDonePpi\r
-};\r
-\r
-/**\r
- Return Hob list produced by FSP.\r
-\r
- @param[in] PeiServices The pointer to the PEI Services Table.\r
- @param[in] This The pointer to this instance of this PPI.\r
- @param[out] FspHobList The pointer to Hob list produced by FSP.\r
-\r
- @return EFI_SUCCESS FReturn Hob list produced by FSP successfully.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-FspInitDoneGetFspHobListV2 (\r
- IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN FSP_INIT_DONE_PPI *This,\r
- OUT VOID **FspHobList\r
- )\r
-{\r
- EFI_HOB_GUID_TYPE *GuidHob;\r
-\r
- GuidHob = GetFirstGuidHob (&gFspInitDonePpiGuid);\r
- if (GuidHob != NULL) {\r
- *FspHobList = *(VOID **)GET_GUID_HOB_DATA (GuidHob);\r
- return EFI_SUCCESS;\r
- } else {\r
- return EFI_NOT_FOUND;\r
- }\r
-}\r
-\r
-/**\r
- Call FspMemoryInit API.\r
-\r
- @param[in] FspHeader FSP header pointer.\r
-\r
- @return Status returned by FspMemoryInit API.\r
-**/\r
-EFI_STATUS\r
-PeiFspMemoryInit (\r
- IN FSP_INFO_HEADER *FspHeader\r
- )\r
-{\r
- FSP_MEMORY_INIT_PARAMS FspMemoryInitParams;\r
- FSP_INIT_RT_COMMON_BUFFER FspRtBuffer;\r
- UINT8 FspUpdRgn[FixedPcdGet32 (PcdMaxUpdRegionSize)];\r
- UINT32 UpdRegionSize;\r
- EFI_BOOT_MODE BootMode;\r
- UINT64 StackSize;\r
- EFI_PHYSICAL_ADDRESS StackBase;\r
- EFI_STATUS Status;\r
- VOID *FspHobList;\r
- VOID *HobData;\r
-\r
- DEBUG ((DEBUG_INFO, "PeiFspMemoryInit enter\n"));\r
-\r
- PeiServicesGetBootMode (&BootMode);\r
- DEBUG ((DEBUG_INFO, "BootMode - 0x%x\n", BootMode));\r
-\r
- GetStackInfo (BootMode, FALSE, &StackSize, &StackBase);\r
- DEBUG ((DEBUG_INFO, "StackBase - 0x%x\n", StackBase));\r
- DEBUG ((DEBUG_INFO, "StackSize - 0x%x\n", StackSize));\r
-\r
- ZeroMem (&FspRtBuffer, sizeof(FspRtBuffer));\r
- FspRtBuffer.StackTop = (UINT32 *)(UINTN)(StackBase + StackSize);\r
-\r
- FspRtBuffer.BootMode = BootMode;\r
-\r
- /* Platform override any UPD configs */\r
- UpdRegionSize = GetUpdRegionSize();\r
- DEBUG ((DEBUG_INFO, "UpdRegionSize - 0x%x\n", UpdRegionSize));\r
- DEBUG ((DEBUG_INFO, "sizeof(FspUpdRgn) - 0x%x\n", sizeof(FspUpdRgn)));\r
- ASSERT(sizeof(FspUpdRgn) >= UpdRegionSize);\r
- ZeroMem (FspUpdRgn, UpdRegionSize);\r
- FspRtBuffer.UpdDataRgnPtr = UpdateFspUpdConfigs (FspUpdRgn);\r
- FspRtBuffer.BootLoaderTolumSize = GetBootLoaderTolumSize ();\r
-\r
- ZeroMem (&FspMemoryInitParams, sizeof(FspMemoryInitParams));\r
- FspMemoryInitParams.NvsBufferPtr = GetNvsBuffer ();\r
- DEBUG ((DEBUG_INFO, "NvsBufferPtr - 0x%x\n", FspMemoryInitParams.NvsBufferPtr));\r
- FspMemoryInitParams.RtBufferPtr = (VOID *)&FspRtBuffer;\r
- FspHobList = NULL;\r
- FspMemoryInitParams.HobListPtr = &FspHobList;\r
-\r
- DEBUG ((DEBUG_INFO, "FspMemoryInitParams - 0x%x\n", &FspMemoryInitParams));\r
- DEBUG ((DEBUG_INFO, " NvsBufferPtr - 0x%x\n", FspMemoryInitParams.NvsBufferPtr));\r
- DEBUG ((DEBUG_INFO, " RtBufferPtr - 0x%x\n", FspMemoryInitParams.RtBufferPtr));\r
- DEBUG ((DEBUG_INFO, " StackTop - 0x%x\n", FspRtBuffer.StackTop));\r
- DEBUG ((DEBUG_INFO, " BootMode - 0x%x\n", FspRtBuffer.BootMode));\r
- DEBUG ((DEBUG_INFO, " UpdDataRgnPtr - 0x%x\n", FspRtBuffer.UpdDataRgnPtr));\r
- DEBUG ((DEBUG_INFO, " HobListPtr - 0x%x\n", FspMemoryInitParams.HobListPtr));\r
-\r
- Status = CallFspMemoryInit (FspHeader, &FspMemoryInitParams);\r
- DEBUG((DEBUG_INFO, "FspMemoryInit status: 0x%x\n", Status));\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- DEBUG ((DEBUG_INFO, " HobListPtr (returned) - 0x%x\n", FspHobList));\r
- ASSERT (FspHobList != NULL);\r
-\r
- FspHobProcessForMemoryResource (FspHobList);\r
-\r
- //\r
- // FspHobList is not complete at this moment.\r
- // Save FspHobList pointer to hob, so that it can be got later\r
- //\r
- HobData = BuildGuidHob (\r
- &gFspInitDonePpiGuid,\r
- sizeof (VOID *)\r
- );\r
- ASSERT (HobData != NULL);\r
- CopyMem (HobData, &FspHobList, sizeof (FspHobList));\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked\r
- by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed.\r
-\r
- @retval EFI_SUCCESS Use of Temporary RAM was disabled.\r
- @retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PeiTemporaryRamDone (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- VOID *TempRamExitParam;\r
- FSP_INFO_HEADER *FspHeader;\r
-\r
- FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase));\r
- if (FspHeader == NULL) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
- \r
- DEBUG ((DEBUG_INFO, "PeiTemporaryRamDone enter\n"));\r
- \r
- TempRamExitParam = GetTempRamExitParam ();\r
- Status = CallTempRamExit (FspHeader, TempRamExitParam);\r
- DEBUG((DEBUG_INFO, "TempRamExit status: 0x%x\n", Status));\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- This function is called after PEI core discover memory and finish migration.\r
-\r
- @param[in] PeiServices Pointer to PEI Services Table.\r
- @param[in] NotifyDesc Pointer to the descriptor for the Notification event that\r
- caused this function to execute.\r
- @param[in] Ppi Pointer to the PPI data associated with this function.\r
-\r
- @retval EFI_STATUS Always return EFI_SUCCESS\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PeiMemoryDiscoveredNotify (\r
- IN EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc,\r
- IN VOID *Ppi\r
- )\r
-{\r
- EFI_STATUS Status;\r
- VOID *FspSiliconInitParam;\r
- FSP_INFO_HEADER *FspHeader;\r
- VOID *FspHobList;\r
- EFI_HOB_GUID_TYPE *GuidHob;\r
-\r
- if (PcdGet32 (PcdFlashFvSecondFspBase) == 0) {\r
- FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvFspBase));\r
- } else {\r
- FspHeader = FspFindFspHeader (PcdGet32 (PcdFlashFvSecondFspBase));\r
- }\r
- if (FspHeader == NULL) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
- \r
- DEBUG ((DEBUG_INFO, "PeiMemoryDiscoveredNotify enter\n"));\r
- \r
- FspSiliconInitParam = GetFspSiliconInitParam ();\r
- Status = CallFspSiliconInit (FspHeader, FspSiliconInitParam);\r
- DEBUG((DEBUG_ERROR, "FspSiliconInit status: 0x%x\n", Status));\r
- ASSERT_EFI_ERROR (Status);\r
- \r
- //\r
- // Now FspHobList complete, process it\r
- //\r
- GuidHob = GetFirstGuidHob (&gFspInitDonePpiGuid);\r
- ASSERT (GuidHob != NULL);\r
- FspHobList = *(VOID **)GET_GUID_HOB_DATA (GuidHob);\r
- DEBUG ((DEBUG_INFO, "FspHobList - 0x%x\n", FspHobList));\r
- FspHobProcessForOtherData (FspHobList);\r
-\r
- //\r
- // Install FspInitDonePpi so that any other driver can consume this info.\r
- //\r
- Status = PeiServicesInstallPpi (&mPeiFspInitDonePpiV2);\r
- ASSERT_EFI_ERROR(Status);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Do FSP initialization based on FspApi version 2.\r
-\r
- @param[in] FspHeader FSP header pointer.\r
-\r
- @return FSP initialization status.\r
-**/\r
-EFI_STATUS\r
-PeiFspInitV2 (\r
- IN FSP_INFO_HEADER *FspHeader\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_BOOT_MODE BootMode;\r
-\r
- Status = PeiFspMemoryInit (FspHeader);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Install TempramDonePpi to run TempRamExit\r
- //\r
- Status = PeiServicesInstallPpi (&mPeiTemporaryRamDoneDesc);\r
- ASSERT_EFI_ERROR(Status);\r
-\r
- //\r
- // Register MemoryDiscovered Nofity to run FspSiliconInit\r
- //\r
- Status = PeiServicesNotifyPpi (&mPeiMemoryDiscoveredNotifyDesc);\r
- ASSERT_EFI_ERROR (Status);\r
- \r
- //\r
- // Register EndOfPei Notify for S3 to run FspNotifyPhase\r
- //\r
- PeiServicesGetBootMode (&BootMode);\r
- if (BootMode == BOOT_ON_S3_RESUME) {\r
- Status = PeiServicesNotifyPpi (&mS3EndOfPeiNotifyDesc);\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}
\ No newline at end of file