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