/** @file
Provide FSP wrapper hob process related function.
Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//
// Additional pages are used by DXE memory manager.
// It should be consistent between RetrieveRequiredMemorySize() and GetPeiMemSize()
//
#define PEI_ADDITIONAL_MEMORY_SIZE (16 * EFI_PAGE_SIZE)
/**
Get the mem size in memory type infromation table.
@param[in] PeiServices PEI Services table.
@return the mem size in memory type infromation table.
**/
UINT64
GetMemorySizeInMemoryTypeInformation (
IN EFI_PEI_SERVICES **PeiServices
)
{
EFI_STATUS Status;
EFI_PEI_HOB_POINTERS Hob;
EFI_MEMORY_TYPE_INFORMATION *MemoryData;
UINT8 Index;
UINTN TempPageNum;
MemoryData = NULL;
Status = (*PeiServices)->GetHobList ((CONST EFI_PEI_SERVICES**)PeiServices, (VOID **) &Hob.Raw);
ASSERT_EFI_ERROR (Status);
while (!END_OF_HOB_LIST (Hob)) {
if (Hob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION &&
CompareGuid (&Hob.Guid->Name, &gEfiMemoryTypeInformationGuid)) {
MemoryData = (EFI_MEMORY_TYPE_INFORMATION *) (Hob.Raw + sizeof (EFI_HOB_GENERIC_HEADER) + sizeof (EFI_GUID));
break;
}
Hob.Raw = GET_NEXT_HOB (Hob);
}
if (MemoryData == NULL) {
return 0;
}
TempPageNum = 0;
for (Index = 0; MemoryData[Index].Type != EfiMaxMemoryType; Index++) {
//
// Accumulate default memory size requirements
//
TempPageNum += MemoryData[Index].NumberOfPages;
}
return TempPageNum * EFI_PAGE_SIZE;
}
/**
Get the mem size need to be reserved in PEI phase.
@param[in] PeiServices PEI Services table.
@return the mem size need to be reserved in PEI phase.
**/
UINT64
RetrieveRequiredMemorySize (
IN EFI_PEI_SERVICES **PeiServices
)
{
UINT64 Size;
Size = GetMemorySizeInMemoryTypeInformation (PeiServices);
return Size + PEI_ADDITIONAL_MEMORY_SIZE;
}
/**
Get the mem size need to be consumed and reserved in PEI phase.
@param[in] PeiServices PEI Services table.
@param[in] BootMode Current boot mode.
@return the mem size need to be consumed and reserved in PEI phase.
**/
UINT64
GetPeiMemSize (
IN EFI_PEI_SERVICES **PeiServices,
IN UINT32 BootMode
)
{
UINT64 Size;
UINT64 MinSize;
if (BootMode == BOOT_IN_RECOVERY_MODE) {
return PcdGet32 (PcdPeiRecoveryMinMemSize);
}
Size = GetMemorySizeInMemoryTypeInformation (PeiServices);
if (BootMode == BOOT_ON_FLASH_UPDATE) {
//
// Maybe more size when in CapsuleUpdate phase ?
//
MinSize = PcdGet32 (PcdPeiMinMemSize);
} else {
MinSize = PcdGet32 (PcdPeiMinMemSize);
}
return MinSize + Size + PEI_ADDITIONAL_MEMORY_SIZE;
}
/**
Post FSP-M HOB process for Memory Resource Descriptor.
@param[in] FspHobList Pointer to the HOB data structure produced by FSP.
@return If platform process the FSP hob list successfully.
**/
EFI_STATUS
EFIAPI
PostFspmHobProcess (
IN VOID *FspHobList
)
{
EFI_PEI_HOB_POINTERS Hob;
UINT64 PeiMemSize;
EFI_PHYSICAL_ADDRESS PeiMemBase;
EFI_STATUS Status;
EFI_BOOT_MODE BootMode;
EFI_PEI_CAPSULE_PPI *Capsule;
VOID *CapsuleBuffer;
UINTN CapsuleBufferLength;
UINT64 RequiredMemSize;
UINT64 ResourceLength;
EFI_PEI_SERVICES **PeiServices;
PeiServices = (EFI_PEI_SERVICES **)GetPeiServicesTablePointer ();
PeiServicesGetBootMode (&BootMode);
PeiMemBase = 0;
PeiMemSize = 0;
RequiredMemSize = 0;
ResourceLength = 0;
//
// Parse the hob list from fsp
// Report all the resource hob except MMIO and IO resource Hob's
//
if (BootMode != BOOT_ON_S3_RESUME) {
PeiMemSize = GetPeiMemSize (PeiServices, BootMode);
RequiredMemSize = RetrieveRequiredMemorySize (PeiServices);
Hob.Raw = (UINT8 *)(UINTN)FspHobList;
DEBUG((DEBUG_INFO, "FspHobList - 0x%x\n", FspHobList));
//
// Find the largest available system Memory and use it for PeiMemory
//
while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, Hob.Raw)) != NULL) {
if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY)
&& (Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength <= BASE_4GB)
&& (Hob.ResourceDescriptor->PhysicalStart >= PeiMemBase)
&& (Hob.ResourceDescriptor->ResourceLength >= PeiMemSize)) {
PeiMemBase = Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength - PeiMemSize;
}
Hob.Raw = GET_NEXT_HOB (Hob);
}
}
Hob.Raw = (UINT8 *)(UINTN)FspHobList;
//
// Skip the MMIO and IO reource map from the FSP Hob list
//
while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, Hob.Raw)) != NULL) {
if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_IO) || (Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_MAPPED_IO)) {
Hob.Raw = GET_NEXT_HOB (Hob);
continue;
}
ResourceLength = Hob.ResourceDescriptor->ResourceLength;
DEBUG((DEBUG_INFO, "Resource start %lx resource length %lx resource type %d\n",Hob.ResourceDescriptor->PhysicalStart,Hob.ResourceDescriptor->ResourceLength,Hob.ResourceDescriptor->ResourceType));
if (BootMode != BOOT_ON_S3_RESUME) {
//
// If the system memory found in FSP Hob is determined for PeiMemory. Split the Resource descriptor Hob
//
if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY)
&& (Hob.ResourceDescriptor->PhysicalStart <= PeiMemBase)
&& (Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength >= PeiMemBase + PeiMemSize)
&& (Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength <= BASE_4GB)) {
if ((CompareGuid (&Hob.ResourceDescriptor->Owner, &gZeroGuid))) {
BuildResourceDescriptorHob (
Hob.ResourceDescriptor->ResourceType,
Hob.ResourceDescriptor->ResourceAttribute,
PeiMemBase,
PeiMemSize
);
} else {
BuildResourceDescriptorWithOwnerHob (
Hob.ResourceDescriptor->ResourceType,
Hob.ResourceDescriptor->ResourceAttribute,
PeiMemBase,
PeiMemSize,
&Hob.ResourceDescriptor->Owner
);
}
ResourceLength = (Hob.ResourceDescriptor->ResourceLength) -(PeiMemSize);
}
}
//
// Report the resource hob
//
if ((CompareGuid (&Hob.ResourceDescriptor->Owner, &gZeroGuid))) {
BuildResourceDescriptorHob (
Hob.ResourceDescriptor->ResourceType,
Hob.ResourceDescriptor->ResourceAttribute,
Hob.ResourceDescriptor->PhysicalStart,
ResourceLength
);
} else {
BuildResourceDescriptorWithOwnerHob (
Hob.ResourceDescriptor->ResourceType,
Hob.ResourceDescriptor->ResourceAttribute,
Hob.ResourceDescriptor->PhysicalStart,
ResourceLength,
&Hob.ResourceDescriptor->Owner
);
}
Hob.Raw = GET_NEXT_HOB (Hob);
}
//
// @todo: It is a W/A for SetMemorySpaceAttribute issue in PchSpi and PchReset drivers.
// We need to modify it instead of hard code here. Due to InstallEfiMemory is using hard code to
// describe memory resource, we have to hard code in here. Once InstallEfiMemory is merged, we should
// be able to remove this.
//
BuildResourceDescriptorHob (
EFI_RESOURCE_MEMORY_MAPPED_IO,
EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE,
0xFFA00000,
0x80000
);
BuildResourceDescriptorHob (
EFI_RESOURCE_MEMORY_MAPPED_IO,
EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE,
0xFE000000,
0x10000
);
BuildResourceDescriptorHob (
EFI_RESOURCE_MEMORY_MAPPED_IO,
EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE,
PcdGet64 (PcdPciExpressBaseAddress),
PcdGet32 (PcdPciExpressRegionLength)
);
BuildResourceDescriptorHob (
EFI_RESOURCE_MEMORY_MAPPED_IO,
EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE,
0xFE010000,
0x1000
);
//
// Capsule mode
//
Capsule = NULL;
CapsuleBuffer = NULL;
CapsuleBufferLength = 0;
if (BootMode == BOOT_ON_FLASH_UPDATE) {
Status = PeiServicesLocatePpi (
&gEfiPeiCapsulePpiGuid,
0,
NULL,
(VOID **) &Capsule
);
ASSERT_EFI_ERROR (Status);
if (Status == EFI_SUCCESS) {
Status = PeiServicesGetHobList ((void**)&Hob.Raw);
ASSERT_EFI_ERROR (Status);
while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, Hob.Raw)) != NULL) {
if ((Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY)
&& (Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength <= BASE_4GB)
&& (Hob.ResourceDescriptor->PhysicalStart >= BASE_1MB)
&& (Hob.ResourceDescriptor->PhysicalStart != PeiMemBase)
&& (Hob.ResourceDescriptor->ResourceLength >= CapsuleBufferLength)) {
CapsuleBufferLength = (UINTN)Hob.ResourceDescriptor->ResourceLength;
CapsuleBuffer = (VOID*)(UINTN)Hob.ResourceDescriptor->PhysicalStart;
}
Hob.Raw = GET_NEXT_HOB (Hob);
}
//
// Call the Capsule PPI Coalesce function to coalesce the capsule data.
//
Status = Capsule->Coalesce (PeiServices, &CapsuleBuffer, &CapsuleBufferLength);
}
}
DEBUG((DEBUG_INFO, "FSP wrapper PeiMemBase : 0x%08x\n", PeiMemBase));
DEBUG((DEBUG_INFO, "FSP wrapper PeiMemSize : 0x%08x\n", PeiMemSize));
DEBUG((DEBUG_INFO, "FSP wrapper RequiredMemSize : 0x%08x\n", RequiredMemSize));
//
// Install efi memory
//
Status = PeiServicesInstallPeiMemory (
PeiMemBase,
PeiMemSize - RequiredMemSize
);
ASSERT_EFI_ERROR (Status);
if (Capsule != NULL) {
Status = Capsule->CreateState ((EFI_PEI_SERVICES **)PeiServices, CapsuleBuffer, CapsuleBufferLength);
}
//
// Create a memory allocation HOB at fixed location for MP Services PPI AP wait loop.
// Report memory region used by FSP.
//
BuildMemoryAllocationHob (
PcdGet32 (PcdFspCpuPeiApWakeupBufferAddr),
EFI_PAGE_SIZE,
EfiBootServicesData
);
return EFI_SUCCESS;
}
/**
Process FSP HOB list
@param[in] FspHobList Pointer to the HOB data structure produced by FSP.
**/
VOID
ProcessFspHobList (
IN VOID *FspHobList
)
{
UINT8 PhysicalAddressBits;
UINT32 RegEax;
EFI_PEI_HOB_POINTERS FspHob;
FspHob.Raw = FspHobList;
AsmCpuid (0x80000000, &RegEax, NULL, NULL, NULL);
if (RegEax >= 0x80000008) {
AsmCpuid (0x80000008, &RegEax, NULL, NULL, NULL);
PhysicalAddressBits = (UINT8) RegEax;
} else {
PhysicalAddressBits = 36;
}
///
/// Create a CPU hand-off information
///
BuildCpuHob (PhysicalAddressBits, 16);
//
// Add all the HOBs from FSP binary to FSP wrapper
//
while (!END_OF_HOB_LIST (FspHob)) {
if (FspHob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION) {
//
// Skip FSP binary creates PcdDataBaseHobGuid
//
if (!CompareGuid(&FspHob.Guid->Name, &gPcdDataBaseHobGuid)) {
BuildGuidDataHob (
&FspHob.Guid->Name,
GET_GUID_HOB_DATA(FspHob),
GET_GUID_HOB_DATA_SIZE(FspHob)
);
}
}
FspHob.Raw = GET_NEXT_HOB (FspHob);
}
}
VOID
CheckFspGraphicsDeviceInfoHob (
VOID
)
{
EFI_PEI_HOB_POINTERS Hob;
EFI_STATUS Status;
EFI_PEI_GRAPHICS_INFO_HOB *FspGraphicsInfo = NULL;
EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *FspGraphicsDeviceInfo = NULL;
EFI_PEI_GRAPHICS_DEVICE_INFO_HOB GraphicsDeviceInfo;
Status = PeiServicesGetHobList ((VOID **)&Hob.Raw);
if (!EFI_ERROR (Status)) {
if (Hob.Raw != NULL) {
if ((Hob.Raw = GetNextGuidHob (&gEfiGraphicsInfoHobGuid, Hob.Raw)) != NULL) {
FspGraphicsInfo = GET_GUID_HOB_DATA (Hob.Guid);
}
}
}
if (FspGraphicsInfo == NULL) {
return ;
}
Status = PeiServicesGetHobList ((VOID **)&Hob.Raw);
if (!EFI_ERROR (Status)) {
if (Hob.Raw != NULL) {
if ((Hob.Raw = GetNextGuidHob (&gEfiGraphicsDeviceInfoHobGuid, Hob.Raw)) != NULL) {
FspGraphicsDeviceInfo = GET_GUID_HOB_DATA (Hob.Guid);
}
}
}
if (FspGraphicsDeviceInfo != NULL) {
return ;
}
//
// FSP only publish FspGraphicsInfo, but no FspGraphicsDeviceInfo.
//
// Workaround: Need publish FspGraphicsDeviceInfo, because Intel Graphics BarIndex is 1.
//
GraphicsDeviceInfo.VendorId = MAX_UINT16;
GraphicsDeviceInfo.DeviceId = MAX_UINT16;
GraphicsDeviceInfo.SubsystemVendorId = MAX_UINT16;
GraphicsDeviceInfo.SubsystemId = MAX_UINT16;
GraphicsDeviceInfo.RevisionId = MAX_UINT8;
GraphicsDeviceInfo.BarIndex = 1;
BuildGuidDataHob (
&gEfiGraphicsDeviceInfoHobGuid,
&GraphicsDeviceInfo,
sizeof(GraphicsDeviceInfo)
);
return ;
}
/**
Dump FSP SMBIOS memory info HOB
**/
VOID
DumpFspSmbiosMemoryInfoHob (
VOID
)
{
}
/**
Dump FSP SMBIOS Processor Info HOB
**/
VOID
DumpFspSmbiosProcessorInfoHob (
VOID
)
{
}
/**
Dump FSP SMBIOS Cache Info Hob
**/
VOID
DumpFspSmbiosCacheInfoHob (
VOID
)
{
}
/**
Dump FSP HOB list
**/
VOID
DumpFspHobList (
VOID
)
{
EFI_PEI_HOB_POINTERS Hob;
EFI_STATUS Status;
Status = PeiServicesGetHobList ((VOID **)&Hob.Raw);
ASSERT_EFI_ERROR (Status);
while (!END_OF_HOB_LIST (Hob)) {
if (Hob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION) {
DEBUG ((DEBUG_INFO, "FSP Extended GUID HOB: {%g}\n", &(Hob.Guid->Name)));
}
if ((Hob.Header->HobType == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) &&
(Hob.ResourceDescriptor->ResourceType == EFI_RESOURCE_MEMORY_RESERVED)) {
DEBUG ((DEBUG_INFO, "FSP Reserved Resource HOB: %016lX ~ %016lX\n", \
Hob.ResourceDescriptor->PhysicalStart, Hob.ResourceDescriptor->PhysicalStart \
+ Hob.ResourceDescriptor->ResourceLength));
}
Hob.Raw = GET_NEXT_HOB (Hob);
}
}
/**
Dump FSP memory resource
**/
VOID
DumpFspMemoryResource (
VOID
)
{
EFI_PEI_HOB_POINTERS Hob;
EFI_STATUS Status;
Status = PeiServicesGetHobList ((VOID **)&Hob.Raw);
ASSERT_EFI_ERROR (Status);
DEBUG ((DEBUG_INFO, "\nFSP Memory Resource\n"));
DEBUG ((DEBUG_INFO, " Resource Range Type Attribute Owner\n"));
DEBUG ((DEBUG_INFO, "================================= ==== ================ ====================================\n"));
while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, Hob.Raw)) != NULL) {
if (!CompareGuid (&(Hob.ResourceDescriptor->Owner), &gZeroGuid)) {
DEBUG ((DEBUG_INFO, "%016lx-%016lx %4x %016x %g\n",
Hob.ResourceDescriptor->PhysicalStart,
Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength,
Hob.ResourceDescriptor->ResourceType,
Hob.ResourceDescriptor->ResourceAttribute,
&(Hob.ResourceDescriptor->Owner)
));
} else {
DEBUG ((DEBUG_INFO, "%016lx-%016lx %4x %016x \n",
Hob.ResourceDescriptor->PhysicalStart,
Hob.ResourceDescriptor->PhysicalStart + Hob.ResourceDescriptor->ResourceLength,
Hob.ResourceDescriptor->ResourceType,
Hob.ResourceDescriptor->ResourceAttribute
));
}
Hob.Raw = GET_NEXT_HOB (Hob);
}
DEBUG ((DEBUG_INFO, "\n"));
}
/**
Dump FSP memory resource
**/
VOID
DumpFspGraphicsInfoHob (
VOID
)
{
EFI_PEI_HOB_POINTERS Hob;
EFI_STATUS Status;
EFI_PEI_GRAPHICS_INFO_HOB *FspGraphicsInfo = NULL;
Status = PeiServicesGetHobList ((VOID **)&Hob.Raw);
if (!EFI_ERROR (Status)) {
if (Hob.Raw != NULL) {
if ((Hob.Raw = GetNextGuidHob (&gEfiGraphicsInfoHobGuid, Hob.Raw)) != NULL) {
FspGraphicsInfo = GET_GUID_HOB_DATA (Hob.Guid);
}
}
if (FspGraphicsInfo != NULL) {
DEBUG((DEBUG_INFO, "\nGraphicsInfo\n"));
DEBUG((DEBUG_INFO, " |-> FrameBufferBase : 0x%016lx\n", FspGraphicsInfo->FrameBufferBase));
DEBUG((DEBUG_INFO, " |-> FrameBufferSize : 0x%016lx\n", FspGraphicsInfo->FrameBufferSize));
DEBUG((DEBUG_INFO, " |-> GraphicsMode\n"));
DEBUG((DEBUG_INFO, " |-> Version : 0x%08x\n", FspGraphicsInfo->GraphicsMode.Version));
DEBUG((DEBUG_INFO, " |-> HorizontalResolution : %d\n", FspGraphicsInfo->GraphicsMode.HorizontalResolution));
DEBUG((DEBUG_INFO, " |-> VerticalResolution : %d\n", FspGraphicsInfo->GraphicsMode.VerticalResolution));
DEBUG((DEBUG_INFO, " |-> PixelFormat : %d\n", FspGraphicsInfo->GraphicsMode.PixelFormat));
DEBUG((DEBUG_INFO, " |-> PixelInformation : %d|%d|%d|%d\n",
FspGraphicsInfo->GraphicsMode.PixelInformation.RedMask,
FspGraphicsInfo->GraphicsMode.PixelInformation.GreenMask,
FspGraphicsInfo->GraphicsMode.PixelInformation.BlueMask,
FspGraphicsInfo->GraphicsMode.PixelInformation.ReservedMask
));
DEBUG((DEBUG_INFO, " |-> PixelsPerScanLine : %d\n", FspGraphicsInfo->GraphicsMode.PixelsPerScanLine));
DEBUG((DEBUG_INFO, "\n"));
} else {
DEBUG((DEBUG_INFO, "\nNo GraphicsInfo\n"));
}
}
}
VOID
DumpFspGraphicsDeviceInfoHob (
VOID
)
{
EFI_PEI_HOB_POINTERS Hob;
EFI_STATUS Status;
EFI_PEI_GRAPHICS_DEVICE_INFO_HOB *FspGraphicsDeviceInfo = NULL;
Status = PeiServicesGetHobList ((VOID **)&Hob.Raw);
if (!EFI_ERROR (Status)) {
if (Hob.Raw != NULL) {
if ((Hob.Raw = GetNextGuidHob (&gEfiGraphicsDeviceInfoHobGuid, Hob.Raw)) != NULL) {
FspGraphicsDeviceInfo = GET_GUID_HOB_DATA (Hob.Guid);
}
}
if (FspGraphicsDeviceInfo != NULL) {
DEBUG((DEBUG_INFO, "\nGraphicsDeviceInfo\n"));
DEBUG((DEBUG_INFO, " |-> VendorId : 0x%04x\n", FspGraphicsDeviceInfo->VendorId));
DEBUG((DEBUG_INFO, " |-> DeviceId : 0x%04x\n", FspGraphicsDeviceInfo->DeviceId));
DEBUG((DEBUG_INFO, " |-> SubsystemVendorId : 0x%04x\n", FspGraphicsDeviceInfo->SubsystemVendorId));
DEBUG((DEBUG_INFO, " |-> SubsystemId : 0x%04x\n", FspGraphicsDeviceInfo->SubsystemId));
DEBUG((DEBUG_INFO, " |-> RevisionId : 0x%02x\n", FspGraphicsDeviceInfo->RevisionId));
DEBUG((DEBUG_INFO, " |-> BarIndex : 0x%02x\n", FspGraphicsDeviceInfo->BarIndex));
DEBUG((DEBUG_INFO, "\n"));
} else {
DEBUG((DEBUG_INFO, "\nNo GraphicsDeviceInfo\n"));
}
}
}
EFI_PEI_PPI_DESCRIPTOR mSiliconInitializedDesc = {
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
&gEdkiiSiliconInitializedPpiGuid,
NULL
};
/**
Post FSP-S HOB process (not Memory Resource Descriptor).
@param[in] FspHobList Pointer to the HOB data structure produced by FSP.
@return If platform process the FSP hob list successfully.
**/
EFI_STATUS
EFIAPI
PostFspsHobProcess (
IN VOID *FspHobList
)
{
EFI_STATUS Status;
if (PcdGet8 (PcdFspModeSelection) == 1) {
//
// Only in FSP API mode the wrapper has to build hobs basing on FSP output data.
//
ASSERT (FspHobList != NULL);
ProcessFspHobList (FspHobList);
} else {
//
// Only in FSP Dispatch mode, FSP-S should be reported to DXE dispatcher.
//
BuildFvHob (
(EFI_PHYSICAL_ADDRESS) (UINTN) PcdGet32 (PcdFlashFvFspSBase),
PcdGet32 (PcdFlashFvFspSSize)
);
}
CheckFspGraphicsDeviceInfoHob ();
DEBUG_CODE_BEGIN ();
DumpFspSmbiosMemoryInfoHob ();
DumpFspSmbiosProcessorInfoHob();
DumpFspSmbiosCacheInfoHob();
DumpFspGraphicsInfoHob ();
DumpFspGraphicsDeviceInfoHob ();
DumpFspHobList ();
DumpFspMemoryResource ();
DEBUG_CODE_END ();
Status = PeiServicesInstallPpi (&mSiliconInitializedDesc);
ASSERT_EFI_ERROR (Status);
return EFI_SUCCESS;
}