/** @file PeiReportFvLib.c Source code file for Report Firmware Volume (FV) library Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include VOID ReportPreMemFv ( VOID ) { UINTN Index = 0; EFI_PEI_PPI_DESCRIPTOR *Descriptor = NULL; EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI *Ppi = NULL; EFI_STATUS Status = EFI_SUCCESS; EFI_FIRMWARE_VOLUME_HEADER *FvHeader = NULL; EFI_BOOT_MODE BootMode = BOOT_WITH_FULL_CONFIGURATION; Status = PeiServicesGetBootMode (&BootMode); ASSERT_EFI_ERROR (Status); DEBUG_CODE ( for (Index = 0; Status == EFI_SUCCESS; Index++) { Status = PeiServicesLocatePpi (&gEfiPeiFirmwareVolumeInfo2PpiGuid, Index, &Descriptor, &Ppi); if (!EFI_ERROR (Status)) { FvHeader = (EFI_FIRMWARE_VOLUME_HEADER*) Ppi->FvInfo; DEBUG ((DEBUG_INFO, "Found FV at 0x%x, size 0x%x\n", FvHeader, FvHeader->FvLength)); } } ); // // FvBspPreMemory and FvPreMemory are required for all stages. // DEBUG ((DEBUG_INFO, "Install FlashFvBspPreMemory - 0x%x, 0x%x\n", PcdGet32 (PcdFlashFvBspPreMemoryBase), PcdGet32 (PcdFlashFvBspPreMemorySize))); PeiServicesInstallFvInfo2Ppi ( &(((EFI_FIRMWARE_VOLUME_HEADER*) (UINTN) PcdGet32 (PcdFlashFvBspPreMemoryBase))->FileSystemGuid), (VOID *) (UINTN) PcdGet32 (PcdFlashFvBspPreMemoryBase), PcdGet32 (PcdFlashFvBspPreMemorySize), NULL, NULL, 0 ); DEBUG ((DEBUG_INFO, "Install FlashFvPreMemory - 0x%x, 0x%x\n", PcdGet32 (PcdFlashFvPreMemoryBase), PcdGet32 (PcdFlashFvPreMemorySize))); PeiServicesInstallFvInfo2Ppi ( &(((EFI_FIRMWARE_VOLUME_HEADER*) (UINTN) PcdGet32 (PcdFlashFvPreMemoryBase))->FileSystemGuid), (VOID *) (UINTN) PcdGet32 (PcdFlashFvPreMemoryBase), PcdGet32 (PcdFlashFvPreMemorySize), NULL, NULL, 0 ); // // In API mode, do not publish FSP FV. // if (!PcdGetBool (PcdFspWrapperBootMode)) { // // FvFspT may be required for all stages // DEBUG ((DEBUG_INFO, "Install FlashFvFspT - 0x%x, 0x%x\n", PcdGet32 (PcdFlashFvFspTBase), PcdGet32 (PcdFlashFvFspTSize))); PeiServicesInstallFvInfo2Ppi ( &(((EFI_FIRMWARE_VOLUME_HEADER*) (UINTN) PcdGet32 (PcdFlashFvFspTBase))->FileSystemGuid), (VOID *) (UINTN) PcdGet32 (PcdFlashFvFspTBase), PcdGet32 (PcdFlashFvFspTSize), NULL, NULL, 0 ); // // FvFspM required for stage 2 and above // if (PcdGet8 (PcdBootStage) >= 2) { DEBUG ((DEBUG_INFO, "Install FlashFvFspM - 0x%x, 0x%x\n", PcdGet32 (PcdFlashFvFspMBase), PcdGet32 (PcdFlashFvFspMSize))); PeiServicesInstallFvInfo2Ppi ( &(((EFI_FIRMWARE_VOLUME_HEADER*) (UINTN) PcdGet32 (PcdFlashFvFspMBase))->FileSystemGuid), (VOID *) (UINTN) PcdGet32 (PcdFlashFvFspMBase), PcdGet32 (PcdFlashFvFspMSize), NULL, NULL, 0 ); } } // // FvOprom may be required for most stages // if (PcdGet8 (PcdBootStage) >= 2) { DEBUG ((DEBUG_INFO, "Install PcdFlashFvOprom - 0x%x, 0x%x\n", PcdGet32 (PcdFlashFvOpromBase), PcdGet32 (PcdFlashFvOpromSize))); PeiServicesInstallFvInfo2Ppi ( &(((EFI_FIRMWARE_VOLUME_HEADER*) (UINTN) PcdGet32 (PcdFlashFvOpromBase))->FileSystemGuid), (VOID *) (UINTN) PcdGet32 (PcdFlashFvOpromBase), PcdGet32 (PcdFlashFvOpromSize), NULL, NULL, 0 ); } // // FvAdvanced not needed until stage 6 // if (PcdGet8 (PcdBootStage) >= 6) { DEBUG ((DEBUG_INFO, "Install FlashFvAdvancedPreMemory - 0x%x, 0x%x\n", PcdGet32 (PcdFlashFvAdvancedPreMemoryBase), PcdGet32 (PcdFlashFvAdvancedPreMemorySize))); PeiServicesInstallFvInfo2Ppi ( &(((EFI_FIRMWARE_VOLUME_HEADER*) (UINTN) PcdGet32 (PcdFlashFvAdvancedPreMemoryBase))->FileSystemGuid), (VOID *) (UINTN) PcdGet32 (PcdFlashFvAdvancedPreMemoryBase), PcdGet32 (PcdFlashFvAdvancedPreMemorySize), NULL, NULL, 0 ); } } VOID ReportPostMemFv ( VOID ) { UINTN Index = 0; EFI_PEI_PPI_DESCRIPTOR *Descriptor = NULL; EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI *Ppi = NULL; EFI_STATUS Status = EFI_SUCCESS; EFI_FIRMWARE_VOLUME_HEADER *FvHeader = NULL; DEBUG_CODE ( for (Index = 0; Status == EFI_SUCCESS; Index++) { Status = PeiServicesLocatePpi (&gEfiPeiFirmwareVolumeInfo2PpiGuid, Index, &Descriptor, &Ppi); if (!EFI_ERROR (Status)) { FvHeader = (EFI_FIRMWARE_VOLUME_HEADER*) Ppi->FvInfo; DEBUG ((DEBUG_INFO, "Found FV at 0x%x, size 0x%x\n", FvHeader, FvHeader->FvLength)); } } ); // // FvFspS, FvPostMemory, and FvBsp may be required for completing stage 2 // if (PcdGet8 (PcdBootStage) >= 2) { // // In API mode, do not publish FSP FV. // if (!PcdGetBool (PcdFspWrapperBootMode)) { DEBUG ((DEBUG_INFO, "Install FlashFvFspS - 0x%x, 0x%x\n", PcdGet32 (PcdFlashFvFspSBase), PcdGet32 (PcdFlashFvFspSSize))); PeiServicesInstallFvInfo2Ppi ( &(((EFI_FIRMWARE_VOLUME_HEADER*) (UINTN) PcdGet32 (PcdFlashFvFspSBase))->FileSystemGuid), (VOID *) (UINTN) PcdGet32 (PcdFlashFvFspSBase), PcdGet32 (PcdFlashFvFspSSize), NULL, NULL, 0 ); } DEBUG ((DEBUG_INFO, "Install FlashFvPostMemory - 0x%x, 0x%x\n", PcdGet32 (PcdFlashFvPostMemoryBase), PcdGet32 (PcdFlashFvPostMemorySize))); PeiServicesInstallFvInfo2Ppi ( &(((EFI_FIRMWARE_VOLUME_HEADER*) (UINTN) PcdGet32 (PcdFlashFvPostMemoryBase))->FileSystemGuid), (VOID *) (UINTN) PcdGet32 (PcdFlashFvPostMemoryBase), PcdGet32 (PcdFlashFvPostMemorySize), NULL, NULL, 0 ); DEBUG ((DEBUG_INFO, "Install FlashFvBsp - 0x%x, 0x%x\n", PcdGet32 (PcdFlashFvBspBase), PcdGet32 (PcdFlashFvBspSize))); PeiServicesInstallFvInfo2Ppi ( &(((EFI_FIRMWARE_VOLUME_HEADER*) (UINTN) PcdGet32 (PcdFlashFvBspBase))->FileSystemGuid), (VOID *) (UINTN) PcdGet32 (PcdFlashFvBspBase), PcdGet32 (PcdFlashFvBspSize), NULL, NULL, 0 ); } // // FvUefiBoot required for completing stage 3 // if (PcdGet8 (PcdBootStage) >= 3) { DEBUG ((DEBUG_INFO, "Install FlashFvUefiBoot - 0x%x, 0x%x\n", PcdGet32 (PcdFlashFvUefiBootBase), PcdGet32 (PcdFlashFvUefiBootSize))); PeiServicesInstallFvInfo2Ppi ( &(((EFI_FIRMWARE_VOLUME_HEADER*) (UINTN) PcdGet32 (PcdFlashFvUefiBootBase))->FileSystemGuid), (VOID *) (UINTN) PcdGet32 (PcdFlashFvUefiBootBase), PcdGet32 (PcdFlashFvUefiBootSize), NULL, NULL, 0 ); } // // FvOsBoot required for completing stage 4 // if (PcdGet8 (PcdBootStage) >= 4) { DEBUG ((DEBUG_INFO, "Install FlashFvOsBoot - 0x%x, 0x%x\n", PcdGet32 (PcdFlashFvOsBootBase), PcdGet32 (PcdFlashFvOsBootSize))); PeiServicesInstallFvInfo2Ppi ( &(((EFI_FIRMWARE_VOLUME_HEADER*) (UINTN) PcdGet32 (PcdFlashFvOsBootBase))->FileSystemGuid), (VOID *) (UINTN) PcdGet32 (PcdFlashFvOsBootBase), PcdGet32 (PcdFlashFvOsBootSize), NULL, NULL, 0 ); } // // FvSecurity required for completing stage 5 // if (PcdGet8 (PcdBootStage) >= 5) { DEBUG ((DEBUG_INFO, "Install FlashFvSecurity - 0x%x, 0x%x\n", PcdGet32 (PcdFlashFvSecurityBase), PcdGet32 (PcdFlashFvSecuritySize))); PeiServicesInstallFvInfo2Ppi ( &(((EFI_FIRMWARE_VOLUME_HEADER*) (UINTN) PcdGet32 (PcdFlashFvSecurityBase))->FileSystemGuid), (VOID *) (UINTN) PcdGet32 (PcdFlashFvSecurityBase), PcdGet32 (PcdFlashFvSecuritySize), NULL, NULL, 0 ); } // // FvAdvanced required for completing stage 6 // if (PcdGet8 (PcdBootStage) >= 6) { DEBUG ((DEBUG_INFO, "Install FlashFvAdvanced - 0x%x, 0x%x\n", PcdGet32 (PcdFlashFvAdvancedBase), PcdGet32 (PcdFlashFvAdvancedSize))); PeiServicesInstallFvInfo2Ppi ( &(((EFI_FIRMWARE_VOLUME_HEADER*) (UINTN) PcdGet32 (PcdFlashFvAdvancedBase))->FileSystemGuid), (VOID *) (UINTN) PcdGet32 (PcdFlashFvAdvancedBase), PcdGet32 (PcdFlashFvAdvancedSize), NULL, NULL, 0 ); } // // Report resource related HOB for flash FV to reserve space in GCD and memory map // BuildResourceDescriptorHob ( EFI_RESOURCE_MEMORY_MAPPED_IO, (EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE), (UINTN) PcdGet32 (PcdFlashAreaBaseAddress), (UINTN) PcdGet32 (PcdFlashAreaSize) ); BuildMemoryAllocationHob ( (UINTN) PcdGet32 (PcdFlashAreaBaseAddress), (UINTN) PcdGet32 (PcdFlashAreaSize), EfiMemoryMappedIO ); }