From: "Liming Gao" <liming.gao@intel.com>
To: "Chen, Chen A" <chen.a.chen@intel.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Feng, Bob C" <bob.c.feng@intel.com>
Subject: Re: [edk2-platform][PATCH] Silicon/Tools/FitGen: Add FitGen feature to support uCode Capsule Update
Date: Tue, 3 Dec 2019 07:01:00 +0000 [thread overview]
Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E55AF35@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <8CCE94730AD68946B3D28B43192D9D2D06F1B589@shsmsx102.ccr.corp.intel.com>
Chen:
Please correct the patch style. Some lines are not changed, but they are in the patch.
Thanks
Liming
>-----Original Message-----
>From: Chen, Chen A
>Sent: Monday, December 02, 2019 1:52 PM
>To: Gao, Liming <liming.gao@intel.com>; devel@edk2.groups.io
>Cc: Feng, Bob C <bob.c.feng@intel.com>
>Subject: RE: [edk2-platform][PATCH] Silicon/Tools/FitGen: Add FitGen feature
>to support uCode Capsule Update
>
>Bugzilla, https://bugzilla.tianocore.org/show_bug.cgi?id=2321
>
>-----Original Message-----
>From: Gao, Liming
>Sent: Monday, December 2, 2019 1:46 PM
>To: devel@edk2.groups.io
>Cc: Chen, Chen A <chen.a.chen@intel.com>; Feng, Bob C
><bob.c.feng@intel.com>
>Subject: [edk2-platform][PATCH] Silicon/Tools/FitGen: Add FitGen feature to
>support uCode Capsule Update
>
>From: Chen A Chen <chen.a.chen@intel.com>
>
>Add slot mode handling with a header array.
>
>Signed-off-by: Chen A Chen <chen.a.chen@intel.com>
>Cc: Liming Gao <liming.gao@intel.com>
>Cc: Bob Feng <bob.c.feng@intel.com>
>---
> Silicon/Intel/Tools/FitGen/FitGen.c | 183 +++++++++++++++++++++++++----
>-------
> 1 file changed, 129 insertions(+), 54 deletions(-)
>
>diff --git a/Silicon/Intel/Tools/FitGen/FitGen.c
>b/Silicon/Intel/Tools/FitGen/FitGen.c
>index faf9880060..ab236d0ab0 100644
>--- a/Silicon/Intel/Tools/FitGen/FitGen.c
>+++ b/Silicon/Intel/Tools/FitGen/FitGen.c
>@@ -312,12 +312,13 @@ Returns:
> {
> printf ("Usage (generate): %s [-D] InputFvRecoveryFile
>OutputFvRecoveryFile\n"
> "\t[-V <FitEntryDefaultVersion>]\n"
>- "\t[-F <FitTablePointerOffset>] [-F <FitTablePointerOffset>] [-V
><FitHeaderVersion>]\n"
>- "\t[-NA]\n"
>- "\t[-CLEAR]\n"
>- "\t[-I <BiosInfoGuid>]\n"
>- "\t[-S <StartupAcmAddress StartupAcmSize>|<StartupAcmGuid>] [-V
><StartupAcmVersion>]\n"
>- "\t[-B <BiosModuleAddress BiosModuleSize>] [-B ...] [-V
><BiosModuleVersion>]\n"
>+ "\t[-F <FitTablePointerOffset>] [-F <FitTablePointerOffset>] [-V
><FitHeaderVersion>]\n"
>+ "\t[-NA]\n"
>+ "\t[-CLEAR]\n"
>+ "\t[-L <MicrocodeSlotSize> <MicrocodeFfsGuid>]\n"
>+ "\t[-I <BiosInfoGuid>]\n"
>+ "\t[-S <StartupAcmAddress StartupAcmSize>|<StartupAcmGuid>] [-V
><StartupAcmVersion>]\n"
>+ "\t[-B <BiosModuleAddress BiosModuleSize>] [-B ...] [-V
><BiosModuleVersion>]\n"
> "\t[-M <MicrocodeAddress MicrocodeSize>] [-M ...]|[-U <MicrocodeFv
>MicrocodeBase>|<MicrocodeRegionOffset
>MicrocodeRegionSize>|<MicrocodeGuid>] [-V <MicrocodeVersion>]\n"
> "\t[-O RecordType <RecordDataAddress RecordDataSize>|<RESERVE
>RecordDataSize>|<RecordDataGuid>|<RecordBinFile> [-V <RecordVersion>]]
>[-O ... [-V ...]]\n"
> "\t[-P RecordType <IndexPort DataPort Width Bit Index> [-V
><RecordVersion>]] [-P ... [-V ...]]\n"
>@@ -337,12 +338,14 @@ Returns:
> printf ("\tMicrocodeSize - Size of Microcode.\n");
> printf ("\tMicrocodeFv - Name of Microcode.fv file.\n");
> printf ("\tMicrocodeBase - The base address of Microcode.fv in final FD
>image.\n");
>- printf ("\tMicrocodeRegionOffset - Offset of Microcode region in input FD
>image.\n");
>- printf ("\tMicrocodeRegionSize - Size of Microcode region in input FD
>image.\n");
>- printf ("\tMicrocodeGuid - Guid of Microcode Module.\n");
>- printf ("\t-NA - No 0x800 aligned Microcode requirement. No -NA
>means Microcode is 0x800 aligned.\n");
>- printf ("\tRecordType - FIT entry record type. User should ensure it is
>ordered.\n");
>- printf ("\tRecordDataAddress - FIT entry record data address.\n");
>+ printf ("\tMicrocodeRegionOffset - Offset of Microcode region in input FD
>image.\n");
>+ printf ("\tMicrocodeRegionSize - Size of Microcode region in input FD
>image.\n");
>+ printf ("\tMicrocodeGuid - Guid of Microcode Module.\n");
>+ printf ("\tMicrocodeSlotSize - Occupied region size of each Microcode
>binary.\n");
>+ printf ("\tMicrocodeFfsGuid - Guid of FFS which is used to save
>Microcode binary");
>+ printf ("\t-NA - No 0x800 aligned Microcode requirement. No -NA
>means Microcode is 0x800 aligned.\n");
>+ printf ("\tRecordType - FIT entry record type. User should ensure it is
>ordered.\n");
>+ printf ("\tRecordDataAddress - FIT entry record data address.\n");
> printf ("\tRecordDataSize - FIT entry record data size.\n");
> printf ("\tRecordDataGuid - FIT entry record data GUID.\n");
> printf ("\tRecordBinFile - FIT entry record data binary file.\n");
>@@ -761,32 +764,39 @@ Returns:
> FitEntryNumber - The FIT entry number
> 0 - Argument parse fail
>
>-*/
>-{
>- EFI_GUID Guid;
>- INTN Index;
>- UINT8 *FileBuffer;
>- UINT32 FileSize;
>+*/
>+{
>+ EFI_GUID Guid;
>+ EFI_GUID MicrocodeFfsGuid;
>+ INTN Index;
>+ UINT8 *FileBuffer;
>+ UINT32 FileSize;
> UINT32 Type;
> UINT8 *MicrocodeFileBuffer;
> UINT8 *MicrocodeFileBufferRaw;
> UINT32 MicrocodeFileSize;
>- UINT32 MicrocodeBase;
>- UINT32 MicrocodeSize;
>- UINT8 *MicrocodeBuffer;
>- UINT32 MicrocodeRegionOffset;
>- UINT32 MicrocodeRegionSize;
>- STATUS Status;
>- EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
>- UINTN FitEntryNumber;
>- BOOLEAN BiosInfoExist;
>- BIOS_INFO_HEADER *BiosInfo;
>- BIOS_INFO_STRUCT *BiosInfoStruct;
>- UINTN BiosInfoIndex;
>-
>- //
>- // Init index
>- //
>+ UINT32 MicrocodeBase;
>+ UINT32 MicrocodeSize;
>+ UINT8 *MicrocodeBuffer;
>+ UINT32 MicrocodeBufferSize;
>+ UINT8 *Walker;
>+ UINT32 MicrocodeRegionOffset;
>+ UINT32 MicrocodeRegionSize;
>+ UINT32 SlotSize;
>+ STATUS Status;
>+ EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
>+ UINTN FitEntryNumber;
>+ BOOLEAN BiosInfoExist;
>+ BOOLEAN SlotMode;
>+ BIOS_INFO_HEADER *BiosInfo;
>+ BIOS_INFO_STRUCT *BiosInfoStruct;
>+ UINTN BiosInfoIndex;
>+
>+ SlotMode = FALSE;
>+
>+ //
>+ // Init index
>+ //
> Index = 3;
> if (((strcmp (argv[1], "-D") == 0) ||
> (strcmp (argv[1], "-d") == 0)) ) { @@ -897,13 +907,40 @@ Returns:
> // Do not parse any more
> //
> return 0;
>- }
>-
>- //
>- // 0.5 BiosInfo
>- //
>- if ((Index + 1 >= argc) ||
>- ((strcmp (argv[Index], "-I") != 0) &&
>+ }
>+
>+ //
>+ // 0.5 SlotSize
>+ //
>+ if ((Index + 1 >= argc) ||
>+ ((strcmp (argv[Index], "-L") != 0) &&
>+ (strcmp (argv[Index], "-l") != 0)) ) {
>+ //
>+ // Bypass
>+ //
>+ SlotSize = 0;
>+ } else {
>+ SlotSize = xtoi (argv[Index + 1]);
>+
>+ if (SlotSize == 0) {
>+ printf ("Invalid slotsize = %d\n", SlotSize);
>+ return 0;
>+ }
>+
>+ SlotMode = IsGuidData(argv[Index + 2], &MicrocodeFfsGuid);
>+ if (!SlotMode) {
>+ printf ("Need a ffs GUID for search uCode ffs\n");
>+ return 0;
>+ }
>+
>+ Index += 3;
>+ }
>+
>+ //
>+ // 0.6 BiosInfo
>+ //
>+ if ((Index + 1 >= argc) ||
>+ ((strcmp (argv[Index], "-I") != 0) &&
> (strcmp (argv[Index], "-i") != 0)) ) {
> //
> // Bypass
>@@ -1004,12 +1041,22 @@ Returns:
> if (FvHeader->Signature == EFI_FVH_SIGNATURE) {
> // Skip FV header + FFS header
> MicrocodeBuffer = MicrocodeFileBuffer +
>sizeof(EFI_FIRMWARE_VOLUME_HEADER) +
>sizeof(EFI_FV_BLOCK_MAP_ENTRY) + sizeof(EFI_FFS_FILE_HEADER);
>- } else {
>- MicrocodeBuffer = MicrocodeFileBuffer;
>- }
>- while ((UINT32)(MicrocodeBuffer - MicrocodeFileBuffer) <
>MicrocodeFileSize) {
>- if (*(UINT32 *)(MicrocodeBuffer) != 0x1) { // HeaderVersion
>- break;
>+ } else {
>+ MicrocodeBuffer = MicrocodeFileBuffer;
>+ }
>+
>+ if (SlotMode) {
>+ MicrocodeBuffer = FindFileFromFvByGuid(MicrocodeFileBuffer,
>MicrocodeFileSize, &MicrocodeFfsGuid, &MicrocodeBufferSize);
>+ if (MicrocodeBuffer == NULL) {
>+ printf ("-L Parameter incorrect, GUID not found\n");
>+ // not found
>+ return 0;
>+ }
>+ }
>+
>+ while ((UINT32)(MicrocodeBuffer - MicrocodeFileBuffer) <
>MicrocodeFileSize) {
>+ if (*(UINT32 *)(MicrocodeBuffer) != 0x1) { // HeaderVersion
>+ break;
> }
> if (*(UINT32 *)(MicrocodeBuffer + 20) != 0x1) { // LoaderVersion
> break;
>@@ -1037,13 +1084,41 @@ Returns:
>
>gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Type =
>FIT_TABLE_TYPE_MICROCODE;
>
>gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Address =
>MicrocodeBase + ((UINT32) (UINTN) MicrocodeBuffer - (UINT32) (UINTN)
>MicrocodeFileBuffer);
>
>gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Size =
>MicrocodeSize;
>- gFitTableContext.MicrocodeNumber++;
>- gFitTableContext.FitEntryNumber++;
>-
>- MicrocodeBuffer += MicrocodeSize;
>- }
>- }
>- break;
>+ gFitTableContext.MicrocodeNumber++;
>+ gFitTableContext.FitEntryNumber++;
>+
>+ if (SlotSize != 0) {
>+ MicrocodeBuffer += SlotSize;
>+ } else {
>+ MicrocodeBuffer += MicrocodeSize;
>+ }
>+ }
>+
>+ ///
>+ /// Check the remaining buffer
>+ ///
>+ if (((UINT32)(MicrocodeBuffer - MicrocodeFileBuffer) <
>MicrocodeFileSize) && SlotMode != 0) {
>+ for (Walker = MicrocodeBuffer; Walker < MicrocodeFileBuffer +
>MicrocodeFileSize; Walker++) {
>+ if (*Walker != 0xFF) {
>+ printf ("Error: detect non-spare space after uCode array, please
>check uCode array!\n");
>+ return 0;
>+ }
>+ }
>+
>+ ///
>+ /// Split the spare space as empty buffer for save uCode patch.
>+ ///
>+ while (MicrocodeBuffer + SlotSize <= MicrocodeFileBuffer +
>MicrocodeFileSize) {
>+
>gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Type =
>FIT_TABLE_TYPE_MICROCODE;
>+
>gFitTableContext.Microcode[gFitTableContext.MicrocodeNumber].Address =
>MicrocodeBase + ((UINT32) (UINTN) MicrocodeBuffer - (UINT32) (UINTN)
>MicrocodeFileBuffer);
>+ gFitTableContext.MicrocodeNumber++;
>+ gFitTableContext.FitEntryNumber++;
>+
>+ MicrocodeBuffer += SlotSize;
>+ }
>+ }
>+ }
>+ break;
> case FIT_TABLE_TYPE_TPM_POLICY:
> case FIT_TABLE_TYPE_BIOS_POLICY:
> case FIT_TABLE_TYPE_TXT_POLICY:
>--
>2.16.2.windows.1
prev parent reply other threads:[~2019-12-03 7:01 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-02 5:46 [edk2-platform][PATCH] Silicon/Tools/FitGen: Add FitGen feature to support uCode Capsule Update Liming Gao
2019-12-02 5:51 ` Chen, Chen A
2019-12-03 7:01 ` Liming Gao [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A89E2EF3DFEDB4C8BFDE51014F606A14E55AF35@SHSMSX104.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox