/** @file
Provide FSP wrapper hob process related function.
Copyright (c) 2017, Intel Corporation. All rights reserved.
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 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
#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;
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;
ProcessFspHobList (FspHobList);
CheckFspGraphicsDeviceInfoHob ();
DEBUG_CODE_BEGIN ();
DumpFspSmbiosMemoryInfoHob ();
DumpFspSmbiosProcessorInfoHob();
DumpFspSmbiosCacheInfoHob();
DumpFspGraphicsInfoHob ();
DumpFspGraphicsDeviceInfoHob ();
DumpFspHobList ();
DumpFspMemoryResource ();
DEBUG_CODE_END ();
Status = PeiServicesInstallPpi (&mSiliconInitializedDesc);
ASSERT_EFI_ERROR (Status);
return EFI_SUCCESS;
}