/** @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; }