/** @file Provide FSP wrapper hob process related function. @copyright Copyright (c) 2017 - 2021, 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) EFI_GUID mCpuVarDataHobGuid = {0x71dd88db, 0x1722, 0x48af, {0x96, 0x5b, 0x5e, 0x15, 0xaf, 0xfe, 0x86, 0x56}}; /** 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); MinSize = PcdGet32 (PcdPeiMinMemSize); return MinSize + Size + PEI_ADDITIONAL_MEMORY_SIZE; } VOID TransferHobData ( VOID *HobStart, EFI_GUID *InfoGuid, UINT8 *Info ) { VOID *GuidHob; VOID *Data; UINTN DataSize; VOID *Hob; GuidHob = GetNextGuidHob (InfoGuid, HobStart); if (GuidHob == NULL) { DEBUG ((EFI_D_ERROR, "Transfer Hob Can't Find %a\n", Info)); return; } Data = GET_GUID_HOB_DATA (GuidHob); DataSize = GET_GUID_HOB_DATA_SIZE (GuidHob); Hob = BuildGuidDataHob ( InfoGuid, Data, DataSize ); DEBUG ((DEBUG_INFO, "Create %a Hob at %x\n", Info, Hob)); } VOID CopyHobData ( VOID *HobStart, EFI_GUID *InfoGuid, UINT8 *Info ) { VOID *GuidHob; VOID *Data; VOID *OrgGuidHob; VOID *OrgData; UINTN DataSize; UINTN OrgDataSize; GuidHob = GetNextGuidHob (InfoGuid, HobStart); if (GuidHob == NULL) { DEBUG ((EFI_D_ERROR, "Transfer Hob Can't Find %a\n", Info)); return; } Data = GET_GUID_HOB_DATA (GuidHob); DataSize = GET_GUID_HOB_DATA_SIZE (GuidHob); OrgGuidHob = GetFirstGuidHob (InfoGuid); if (OrgGuidHob == NULL) { DEBUG ((EFI_D_ERROR, "Copy Hob Can't Find org %a\n", Info)); } OrgData = GET_GUID_HOB_DATA (OrgGuidHob); OrgDataSize = GET_GUID_HOB_DATA_SIZE (OrgGuidHob); if (OrgDataSize != DataSize) { DEBUG ((EFI_D_ERROR, "%a Hob Size Don't Match Between FSP and BootLoader. FSP:%x vs BootLoader:%x\n", OrgDataSize, DataSize)); ASSERT (FALSE); } CopyMem (OrgData, Data, DataSize); DEBUG ((EFI_D_ERROR, "CopyHobData %a Hob from %x to %x, Size: %x\n", Info, Data, OrgData, DataSize)); } VOID TransferPcd ( VOID * HobStart ) { VOID *GuidHob; EFI_PHYSICAL_ADDRESS *HobBuffer; GuidHob = GetNextGuidHob (&gSaveHostToMemoryGuid, HobStart); if (GuidHob == NULL) { DEBUG ((EFI_D_ERROR, "Transfer Hob Can't Find gSaveHostToMemoryGuid\n")); return; } HobBuffer = (EFI_PHYSICAL_ADDRESS*) GET_GUID_HOB_DATA (GuidHob); PcdSet64S (PcdSyshostMemoryAddress, (UINTN) HobBuffer[0]); PcdSet64S (PcdMemMapHostMemoryAddress, (UINTN) HobBuffer[1]); DEBUG ((DEBUG_INFO, "TransferPcd Set PcdSyshostMemoryAddress %x\n", (UINTN) HobBuffer[0])); DEBUG ((DEBUG_INFO, "TransferPcd Set PcdMemMapHostMemoryAddress %x\n", (UINTN) HobBuffer[1])); } /** 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); } } CopyHobData (FspHobList, &gSystemInfoVarHobGuid, (UINT8*) "gSystemInfoVarHobGuid"); CopyHobData (FspHobList, &gIioSiPolicyHobGuid, (UINT8*) "gIioSiPolicyHobGuid"); TransferPcd (FspHobList); 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, 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 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; // // Only in FSP API mode the wrapper has to build hobs basing on FSP output data. // ASSERT (FspHobList != NULL); ProcessFspHobList (FspHobList); CheckFspGraphicsDeviceInfoHob (); DEBUG_CODE_BEGIN (); DumpFspGraphicsInfoHob (); DumpFspGraphicsDeviceInfoHob (); DumpFspHobList (); DumpFspMemoryResource (); DEBUG_CODE_END (); Status = PeiServicesInstallPpi (&mSiliconInitializedDesc); ASSERT_EFI_ERROR (Status); return EFI_SUCCESS; }