123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753 |
- /** @file
- Provide FSP wrapper hob process related function.
- Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include <PiPei.h>
- #include <Library/PeiServicesLib.h>
- #include <Library/PeiServicesTablePointerLib.h>
- #include <Library/BaseLib.h>
- #include <Library/DebugLib.h>
- #include <Library/BaseMemoryLib.h>
- #include <Library/HobLib.h>
- #include <Library/PcdLib.h>
- #include <Library/FspWrapperPlatformLib.h>
- #include <Guid/AcpiS3Context.h>
- #include <Guid/GuidHobFspEas.h>
- #include <Guid/MemoryTypeInformation.h>
- #include <Guid/GraphicsInfoHob.h>
- #include <Guid/PcdDataBaseHobGuid.h>
- #include <Guid/ZeroGuid.h>
- #include <Ppi/Capsule.h>
- #include <Ppi/ReadOnlyVariable2.h>
- #include <FspEas.h>
- #include <AcpiS3MemoryNvData.h>
- //
- // 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;
- }
- /**
- Get S3 PEI memory information.
- @note At this point, memory is ready, and PeiServices are available to use.
- Platform can get some data from SMRAM directly.
- @param[out] S3PeiMemSize PEI memory size to be installed in S3 phase.
- @param[out] S3PeiMemBase PEI memory base to be installed in S3 phase.
- @return If S3 PEI memory information is got successfully.
- **/
- EFI_STATUS
- EFIAPI
- GetS3MemoryInfo (
- OUT UINT64 *S3PeiMemSize,
- OUT EFI_PHYSICAL_ADDRESS *S3PeiMemBase
- )
- {
- EFI_STATUS Status;
- EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariablePpi;
- UINTN DataSize;
- ACPI_S3_MEMORY S3MemoryInfo;
- *S3PeiMemBase = 0;
- *S3PeiMemSize = 0;
- Status = PeiServicesLocatePpi (&gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, (VOID **) &VariablePpi);
- ASSERT_EFI_ERROR (Status);
- DataSize = sizeof (S3MemoryInfo);
- Status = VariablePpi->GetVariable (
- VariablePpi,
- ACPI_S3_MEMORY_NV_NAME,
- &gEfiAcpiVariableGuid,
- NULL,
- &DataSize,
- &S3MemoryInfo
- );
- ASSERT_EFI_ERROR (Status);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- *S3PeiMemBase = S3MemoryInfo.S3PeiMemBase;
- *S3PeiMemSize = S3MemoryInfo.S3PeiMemSize;
- return EFI_SUCCESS;
- }
- /**
- 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
- );
- if (BootMode != BOOT_ON_S3_RESUME) {
- //
- // 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);
- }
- } else {
- Status = GetS3MemoryInfo (&PeiMemSize, &PeiMemBase);
- ASSERT_EFI_ERROR (Status);
- DEBUG ((DEBUG_INFO, "S3 resume PeiMemBase : 0x%08x\n", PeiMemBase));
- DEBUG ((DEBUG_INFO, "S3 resume PeiMemSize : 0x%08x\n", PeiMemSize));
- //
- // Install efi memory
- //
- Status = PeiServicesInstallPeiMemory (
- PeiMemBase,
- PeiMemSize
- );
- ASSERT_EFI_ERROR (Status);
- }
- //
- // 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;
- }
|