From: HoraceX Lien <horacex.l...@intel.com> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4828
Support Type5 for Memory Microcontroller Firmware Image entry. Signed-off-by: HoraceX Lien <horacex.l...@intel.com> Cc: Yuwei Chen <yuwei.c...@intel.com> Cc: Feng Bob C <bob.c.f...@intel.com> Cc: Liming Gao <gaolim...@byosoft.com.cn> --- Silicon/Intel/Tools/FitGen/FitGen.c | 56 +++++++++++++++++++- Silicon/Intel/Tools/FitGen/FitGen.h | 2 +- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/Silicon/Intel/Tools/FitGen/FitGen.c b/Silicon/Intel/Tools/FitGen/FitGen.c index 055ffd4c..10592ac8 100644 --- a/Silicon/Intel/Tools/FitGen/FitGen.c +++ b/Silicon/Intel/Tools/FitGen/FitGen.c @@ -267,6 +267,8 @@ typedef struct { #define DEFAULT_FIT_ENTRY_VERSION 0x0100 #define STARTUP_ACM_FIT_ENTRY_200_VERSION 0x0200 +#define MAX_MMCFW_MODULE_ENTRY 0x02 + #define TOP_FLASH_ADDRESS (gFitTableContext.TopFlashAddressRemapValue) #define MEMORY_TO_FLASH(FileBuffer, FvBuffer, FvSize) \ @@ -279,6 +281,7 @@ typedef struct { #define FIT_TABLE_TYPE_STARTUP_ACM 2 #define FIT_TABLE_TYPE_DIAGNST_ACM 3 #define FIT_TABLE_TYPE_PROT_BOOT_POLICY 4 +#define FIT_TABLE_TYPE_MMC_FW 5 #define FIT_TABLE_TYPE_BIOS_MODULE 7 #define FIT_TABLE_TYPE_TPM_POLICY 8 #define FIT_TABLE_TYPE_BIOS_POLICY 9 @@ -318,6 +321,7 @@ typedef struct { UINT32 FitEntryNumber; UINT32 BiosModuleNumber; UINT32 MicrocodeNumber; + UINT32 MmcFwNumber; UINT32 StartupAcmNumber; UINT32 OptionalModuleNumber; UINT32 PortModuleNumber; @@ -336,6 +340,7 @@ typedef struct { UINT32 MicrocodeVersion; FIT_TABLE_CONTEXT_ENTRY OptionalModule[MAX_OPTIONAL_ENTRY]; FIT_TABLE_CONTEXT_ENTRY PortModule[MAX_PORT_ENTRY]; + FIT_TABLE_CONTEXT_ENTRY MmcFw[MAX_MMCFW_MODULE_ENTRY]; UINT64 TopFlashAddressRemapValue; } FIT_TABLE_CONTEXT; @@ -1044,6 +1049,10 @@ GetFitEntryNumber ( UINT32 MicrocodeRegionOffset; UINT32 MicrocodeRegionSize; UINT32 SlotSize; + UINT32 MMCRegionOffset; + UINT8 *MMCBuffer; + UINT8 *MMCFileBuffer; + EFI_FIRMWARE_VOLUME_HEADER *MMCFvHeader; STATUS Status; EFI_FIRMWARE_VOLUME_HEADER *FvHeader; UINTN FitEntryNumber; @@ -1303,6 +1312,29 @@ GetFitEntryNumber ( gFitTableContext.ProtBootPolicy.Version = DEFAULT_FIT_ENTRY_VERSION; gFitTableContext.FitEntryNumber ++; break; + case FIT_TABLE_TYPE_MMC_FW: + if (gFitTableContext.MmcFwNumber >= MAX_MMCFW_MODULE_ENTRY) { + Error (NULL, 0, 0, "-I Parameter incorrect, Too many Bios Mmc Fw!", NULL); + return 0; + } + MMCRegionOffset = (UINT32)BiosInfoStruct[BiosInfoIndex].Address; + if (MMCRegionOffset == 0) { + continue; + } + MMCBuffer = FLASH_TO_MEMORY (MMCRegionOffset, FdBuffer, FdSize); + MMCFvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)MMCBuffer; + if (MMCFvHeader->Signature == EFI_FVH_SIGNATURE) { + MMCFileBuffer = GetMicrocodeBufferFromFv (MMCFvHeader); + } else { + MMCFileBuffer = MMCBuffer; + } + gFitTableContext.MmcFw[gFitTableContext.MmcFwNumber].Type = BiosInfoStruct[BiosInfoIndex].Type; + gFitTableContext.MmcFw[gFitTableContext.MmcFwNumber].Address = (UINT32)BiosInfoStruct[BiosInfoIndex].Address + (UINT32)((UINTN) MMCFileBuffer - (UINTN) MMCBuffer); + gFitTableContext.MmcFw[gFitTableContext.MmcFwNumber].Size = (UINT32)BiosInfoStruct[BiosInfoIndex].Size; + gFitTableContext.MmcFw[gFitTableContext.MmcFwNumber].Version = DEFAULT_FIT_ENTRY_VERSION; + gFitTableContext.MmcFwNumber++; + gFitTableContext.FitEntryNumber++; + break; case FIT_TABLE_TYPE_BIOS_MODULE: if ((BiosInfoStruct[BiosInfoIndex].Attributes & BIOS_INFO_STRUCT_ATTRIBUTE_BIOS_POST_IBB) != 0) { continue; @@ -2413,6 +2445,9 @@ PrintFitData ( for (Index = 0; Index < gFitTableContext.MicrocodeNumber; Index++) { printf ("Microcode[%d] - (0x%08x, 0x%08x, 0x%04x)\n", Index, gFitTableContext.Microcode[Index].Address, gFitTableContext.Microcode[Index].Size, gFitTableContext.MicrocodeVersion); } + for (Index = 0; Index < gFitTableContext.MmcFwNumber; Index++) { + printf ("MmcFw[%d] - (0x%08x, 0x%08x)\n", Index, gFitTableContext.MmcFw[Index].Address, gFitTableContext.MmcFw[Index].Size); + } for (Index = 0; Index < gFitTableContext.OptionalModuleNumber; Index++) { printf ("OptionalModule[%d] - (0x%08x, 0x%08x, 0x%02x, 0x%04x)\n", Index, gFitTableContext.OptionalModule[Index].Address, gFitTableContext.OptionalModule[Index].Size, gFitTableContext.OptionalModule[Index].Type, gFitTableContext.OptionalModule[Index].Version); } @@ -2450,7 +2485,7 @@ CHAR8 *mFitTypeStr[] = { "STARTUP_ACM", "DIAGNST_ACM", "BOOT_POLICY", - " ", + "MMCFW ", " ", "BIOS_MODULE", "TPM_POLICY ", @@ -3096,6 +3131,20 @@ FillFitTable ( FitIndex++; } + for (Index = 0; Index < gFitTableContext.MmcFwNumber; Index++) { + FitEntrySizeValue = 0; // gFitTableContext.MMCVersion.Size / 16 + FitEntry[FitIndex].Address = gFitTableContext.MmcFw[Index].Address; + FitEntry[FitIndex].Size[0] = (UINT8)FitEntrySizeValue; + FitEntry[FitIndex].Size[1] = (UINT8)(FitEntrySizeValue >> 8); + FitEntry[FitIndex].Size[2] = (UINT8)(FitEntrySizeValue >> 16); + FitEntry[FitIndex].Rsvd = 0; + FitEntry[FitIndex].Version = (UINT16)gFitTableContext.MmcFw[Index].Version; + FitEntry[FitIndex].Type = 0x5; + FitEntry[FitIndex].C_V = 0; + FitEntry[FitIndex].Checksum = 0; + FitIndex++; + } + // // 4.5. DiagnosticAcm // @@ -3578,6 +3627,11 @@ GetFitEntryInfo ( gFitTableContext.ProtBootPolicy.Version = FitEntry[FitIndex].Version; gFitTableContext.ProtBootPolicy.Size = GetFirmwareInterfaceTableEntrySize (&FitEntry[FitIndex]); break; + case FIT_TABLE_TYPE_MMC_FW: + gFitTableContext.MmcFw[gFitTableContext.MmcFwNumber].Address = (UINT32)FitEntry[FitIndex].Address; + gFitTableContext.MmcFw[gFitTableContext.MmcFwNumber].Version = FitEntry[FitIndex].Version; + gFitTableContext.MmcFwNumber++; + break; case FIT_TABLE_TYPE_BIOS_MODULE: gFitTableContext.BiosModule[gFitTableContext.BiosModuleNumber].Address = (UINT32)FitEntry[FitIndex].Address; gFitTableContext.BiosModule[gFitTableContext.BiosModuleNumber].Size = FitEntrySizeValue * 16; diff --git a/Silicon/Intel/Tools/FitGen/FitGen.h b/Silicon/Intel/Tools/FitGen/FitGen.h index 2d24ecb5..dd64c379 100644 --- a/Silicon/Intel/Tools/FitGen/FitGen.h +++ b/Silicon/Intel/Tools/FitGen/FitGen.h @@ -35,7 +35,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #define UTILITY_DATE __DATE__ #define FIT_SPEC_VERSION_MAJOR 1 -#define FIT_SPEC_VERSION_MINOR 4 +#define FIT_SPEC_VERSION_MINOR 5 // // The minimum number of arguments accepted from the command line. // -- 2.43.0.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#120392): https://edk2.groups.io/g/devel/message/120392 Mute This Topic: https://groups.io/mt/108034749/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-