/** @file Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent Module Name: FlashMap.c Abstract: Build GUIDed HOBs for platform specific flash map. --*/ #include "Efi.h" #include "Pei.h" #include "PeiLib.h" #include "PeiLib.h" #include "EfiFlashMap.h" #include EFI_PROTOCOL_CONSUMER (FirmwareVolumeBlock) #include EFI_GUID_DEFINITION (FlashMapHob) #include EFI_GUID_DEFINITION (SystemNvDataGuid) #include EFI_GUID_DEFINITION (FirmwareFileSystem) EFI_GUID mFvBlockGuid = EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID; EFI_GUID mFfsGuid = EFI_FIRMWARE_FILE_SYSTEM_GUID; EFI_GUID mSystemDataGuid = EFI_SYSTEM_NV_DATA_HOB_GUID; static EFI_FLASH_AREA_DATA mFlashAreaData[] = { // // Variable area // { FixedPcdGet32 (PcdFlashNvStorageVariableBase), FixedPcdGet32 (PcdFlashNvStorageVariableSize), EFI_FLASH_AREA_SUBFV | EFI_FLASH_AREA_MEMMAPPED_FV, EFI_FLASH_AREA_EFI_VARIABLES }, // // Boot block 2nd part // { FixedPcdGet32 (PcdFlashFvRecovery2Base), FixedPcdGet32 (PcdFlashFvRecovery2Size), EFI_FLASH_AREA_SUBFV | EFI_FLASH_AREA_MEMMAPPED_FV, EFI_FLASH_AREA_FTW_BACKUP }, // // Recovery FV // { FixedPcdGet32 (PcdFlashFvRecoveryBase), FixedPcdGet32 (PcdFlashFvRecoverySize), EFI_FLASH_AREA_FV | EFI_FLASH_AREA_MEMMAPPED_FV, EFI_FLASH_AREA_RECOVERY_BIOS }, // // Main FV // { FixedPcdGet32 (PcdFlashFvMainBase), FixedPcdGet32 (PcdFlashFvMainSize), EFI_FLASH_AREA_FV | EFI_FLASH_AREA_MEMMAPPED_FV, EFI_FLASH_AREA_MAIN_BIOS } }; #define NUM_FLASH_AREA_DATA (ARRAY_SIZE (mFlashAreaData)) /** Build GUID HOBs for platform specific flash map. @param FfsHeader Pointer this FFS file header. @param PeiServices General purpose services available to every PEIM. @retval EFI_SUCCESS Guid HOBs for platform flash map is built. @retval Otherwise Failed to build the Guid HOB data. **/ EFI_STATUS PeimInitializeFlashMap ( IN EFI_FFS_FILE_HEADER *FfsHeader, IN EFI_PEI_SERVICES **PeiServices ) { UINTN Index; EFI_FLASH_AREA_HOB_DATA FlashHobData; // // Build flash area entries as GUIDed HOBs. // for (Index = 0; Index < NUM_FLASH_AREA_DATA; Index++) { ZeroMem(&FlashHobData, sizeof (EFI_FLASH_AREA_HOB_DATA)); FlashHobData.AreaType = mFlashAreaData[Index].AreaType; FlashHobData.NumberOfEntries = 1; FlashHobData.SubAreaData.Attributes = mFlashAreaData[Index].Attributes; FlashHobData.SubAreaData.Base = (EFI_PHYSICAL_ADDRESS) (UINTN) mFlashAreaData[Index].Base; FlashHobData.SubAreaData.Length = (EFI_PHYSICAL_ADDRESS) (UINTN) mFlashAreaData[Index].Length; switch (FlashHobData.AreaType) { case EFI_FLASH_AREA_RECOVERY_BIOS: case EFI_FLASH_AREA_MAIN_BIOS: CopyMem ( &FlashHobData.AreaTypeGuid, &mFfsGuid, sizeof (EFI_GUID) ); CopyMem ( &FlashHobData.SubAreaData.FileSystem, &mFvBlockGuid, sizeof (EFI_GUID) ); break; case EFI_FLASH_AREA_GUID_DEFINED: CopyMem ( &FlashHobData.AreaTypeGuid, &mSystemDataGuid, sizeof (EFI_GUID) ); CopyMem ( &FlashHobData.SubAreaData.FileSystem, &mFvBlockGuid, sizeof (EFI_GUID) ); break; default: break; } PeiBuildHobGuidData(PeiServices, &gEfiFlashMapHobGuid, &FlashHobData, sizeof (EFI_FLASH_AREA_HOB_DATA) ); } return EFI_SUCCESS; }