From nobody Thu May 2 06:37:05 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1527610686362423.6495335486029; Tue, 29 May 2018 09:18:06 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id F1BD920985981; Tue, 29 May 2018 09:18:04 -0700 (PDT) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id CBFD62097DD18 for ; Tue, 29 May 2018 09:18:02 -0700 (PDT) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 May 2018 09:18:02 -0700 Received: from mdkinney-mobl2.amr.corp.intel.com ([10.241.98.50]) by fmsmga006.fm.intel.com with ESMTP; 29 May 2018 09:18:02 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.93; helo=mga11.intel.com; envelope-from=michael.d.kinney@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,457,1520924400"; d="scan'208";a="232867453" From: Michael D Kinney To: edk2-devel@lists.01.org Date: Tue, 29 May 2018 09:17:54 -0700 Message-Id: <20180529161755.9424-2-michael.d.kinney@intel.com> X-Mailer: git-send-email 2.14.2.windows.3 In-Reply-To: <20180529161755.9424-1-michael.d.kinney@intel.com> References: <20180529161755.9424-1-michael.d.kinney@intel.com> Subject: [edk2] [Patch v3 1/2] MdeModulePkg/DxeCapsuleLibFmp: Add progress bar support X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Kinney, Michael D" , Jiewen Yao , Eric Dong , Star Zeng MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: "Kinney, Michael D" https://bugzilla.tianocore.org/show_bug.cgi?id=3D801 Based on content from the following branch/commits: https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport * Change Update_Image_Progress() to UpdateImageProcess() * Call DisplayUpdateProgressLib from UpdateImageProgress(). * Split out a boot service and runtime version of UpdateImageProgress() so the DisplayUpdateProgressLib is not used at runtime. * If gEdkiiFirmwareManagementProgressProtocolGuid is present, then use its progress bar color and watchdog timer value. * If gEdkiiFirmwareManagementProgressProtocolGuid is not present, then use default progress bar color and 5 min watchdog timer. * Remove Print() calls during capsule processing. Instead, the DisplayUpdateProgressLib is used to inform the user of progress during a capsule update. Cc: Star Zeng Cc: Eric Dong Cc: Jiewen Yao Cc: Sean Brogan Signed-off-by: Michael D Kinney Contributed-under: TianoCore Contribution Agreement 1.1 Reviewed-by: Ard Biesheuvel Reviewed-by: Star Zeng Tested-by: Ard Biesheuvel --- .../Library/DxeCapsuleLibFmp/DxeCapsuleLib.c | 47 +++++++++--- .../Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf | 8 ++- .../DxeCapsuleLibFmp/DxeCapsuleProcessLib.c | 84 ++++++++++++++++--= ---- .../DxeCapsuleLibFmp/DxeCapsuleProcessLibNull.c | 21 +++++- .../DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf | 7 +- 5 files changed, 131 insertions(+), 36 deletions(-) diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c b/MdeMod= ulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c index 05fcd92deb..f0226eafa5 100644 --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.c @@ -45,6 +45,7 @@ #include #include #include +#include #include =20 EFI_SYSTEM_RESOURCE_TABLE *mEsrtTable =3D NULL; @@ -53,6 +54,8 @@ BOOLEAN mIsVirtualAddrConverted = =3D FALSE; BOOLEAN mDxeCapsuleLibEndOfDxe =3D FALSE; EFI_EVENT mDxeCapsuleLibEndOfDxeEvent =3D NULL; =20 +EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL *mFmpProgress =3D NULL; + /** Initialize capsule related variables. **/ @@ -101,18 +104,17 @@ RecordFmpCapsuleStatusVariable ( Function indicate the current completion progress of the firmware update. Platform may override with own specific progress function. =20 - @param[in] Completion A value between 1 and 100 indicating the curre= nt completion progress of the firmware update + @param[in] Completion A value between 1 and 100 indicating the current + completion progress of the firmware update =20 - @retval EFI_SUCESS Input capsule is a correct FMP capsule. + @retval EFI_SUCESS The capsule update progress was updated. + @retval EFI_INVALID_PARAMETER Completion is greater than 100%. **/ EFI_STATUS EFIAPI -Update_Image_Progress ( +UpdateImageProgress ( IN UINTN Completion - ) -{ - return EFI_SUCCESS; -} + ); =20 /** Return if this CapsuleGuid is a FMP capsule GUID or not. @@ -849,6 +851,19 @@ SetFmpImageData ( return Status; } =20 + // + // Lookup Firmware Management Progress Protocol before SetImage() is cal= led + // This is an optional protocol that may not be present on Handle. + // + Status =3D gBS->HandleProtocol ( + Handle, + &gEdkiiFirmwareManagementProgressProtocolGuid, + (VOID **)&mFmpProgress + ); + if (EFI_ERROR (Status)) { + mFmpProgress =3D NULL; + } + if (ImageHeader->Version >=3D EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEAD= ER_INIT_VERSION) { Image =3D (UINT8 *)(ImageHeader + 1); } else { @@ -873,21 +888,37 @@ SetFmpImageData ( DEBUG((DEBUG_INFO, "(UpdateHardwareInstance - 0x%x)", ImageHeader->Upd= ateHardwareInstance)); } DEBUG((DEBUG_INFO, "\n")); + + // + // Before calling SetImage(), reset the progress bar to 0% + // + UpdateImageProgress (0); + Status =3D Fmp->SetImage( Fmp, ImageHeader->UpdateImageIndex, // ImageIndex Image, // Image ImageHeader->UpdateImageSize, // ImageSize VendorCode, // VendorCode - Update_Image_Progress, // Progress + UpdateImageProgress, // Progress &AbortReason // AbortReason ); + // + // Set the progress bar to 100% after returning from SetImage() + // + UpdateImageProgress (100); + DEBUG((DEBUG_INFO, "Fmp->SetImage - %r\n", Status)); if (AbortReason !=3D NULL) { DEBUG ((DEBUG_ERROR, "%s\n", AbortReason)); FreePool(AbortReason); } =20 + // + // Clear mFmpProgress after SetImage() returns + // + mFmpProgress =3D NULL; + return Status; } =20 diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf b/MdeM= odulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf index 1d947101d3..8367264f76 100644 --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleLib.inf @@ -52,6 +52,7 @@ [LibraryClasses] PrintLib HobLib BmpSupportLib + DisplayUpdateProgressLib =20 [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleMax = ## CONSUMES @@ -66,9 +67,10 @@ [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleStatusCodeResettingSystem = ## CONSUMES =20 [Protocols] - gEsrtManagementProtocolGuid ## CONSUMES - gEfiFirmwareManagementProtocolGuid ## CONSUMES - gEdkiiVariableLockProtocolGuid ## SOMETIMES_CONSUMES + gEsrtManagementProtocolGuid ## CONSUMES + gEfiFirmwareManagementProtocolGuid ## CONSUMES + gEdkiiVariableLockProtocolGuid ## SOMETIMES_CONSUMES + gEdkiiFirmwareManagementProgressProtocolGuid ## SOMETIMES_CONSUMES =20 [Guids] gEfiFmpCapsuleGuid ## SOMETIMES_CONSUMES ## GUID diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLib.c b= /MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLib.c index ba3ff90b9f..26ca4e295f 100644 --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLib.c +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLib.c @@ -9,7 +9,7 @@ ProcessCapsules(), ProcessTheseCapsules() will receive untrusted input and do basic validation. =20 - Copyright (c) 2016, Intel Corporation. All rights reserved.
+ Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BS= D License which accompanies this distribution. The full text of the license may b= e found at @@ -22,6 +22,7 @@ =20 #include #include +#include =20 #include #include @@ -34,9 +35,12 @@ #include #include #include +#include =20 #include =20 +extern EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL *mFmpProgress; + /** Return if this FMP is a system FMP or a device FMP, based upon CapsuleHe= ader. =20 @@ -101,6 +105,62 @@ VOID **mCapsulePtr; EFI_STATUS *mCapsuleStatusArray; UINT32 mCapsuleTotalNumber; =20 +/** + Function indicate the current completion progress of the firmware + update. Platform may override with own specific progress function. + + @param[in] Completion A value between 1 and 100 indicating the current + completion progress of the firmware update + + @retval EFI_SUCESS The capsule update progress was updated. + @retval EFI_INVALID_PARAMETER Completion is greater than 100%. +**/ +EFI_STATUS +EFIAPI +UpdateImageProgress ( + IN UINTN Completion + ) +{ + EFI_STATUS Status; + UINTN Seconds; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION *Color; + + DEBUG((DEBUG_INFO, "Update Progress - %d%%\n", Completion)); + + if (Completion > 100) { + return EFI_INVALID_PARAMETER; + } + + // + // Use a default timeout of 5 minutes if there is not FMP Progress Proto= col. + // + Seconds =3D 5 * 60; + Color =3D NULL; + if (mFmpProgress !=3D NULL) { + Seconds =3D mFmpProgress->WatchdogSeconds; + Color =3D &mFmpProgress->ProgressBarForegroundColor; + } + + // + // Cancel the watchdog timer + // + gBS->SetWatchdogTimer (0, 0x0000, 0, NULL); + + if (Completion !=3D 100) { + // + // Arm the watchdog timer from PCD setting + // + if (Seconds !=3D 0) { + DEBUG ((DEBUG_VERBOSE, "Arm watchdog timer %d seconds\n", Seconds)); + gBS->SetWatchdogTimer (Seconds, 0x0000, 0, NULL); + } + } + + Status =3D DisplayUpdateProgress (Completion, Color); + + return Status; +} + /** This function initializes the mCapsulePtr, mCapsuleStatusArray and mCaps= uleTotalNumber. **/ @@ -319,7 +379,6 @@ ProcessTheseCapsules ( EFI_STATUS Status; EFI_CAPSULE_HEADER *CapsuleHeader; UINT32 Index; - BOOLEAN DisplayCapsuleExist; ESRT_MANAGEMENT_PROTOCOL *EsrtManagement; UINT16 EmbeddedDriverCount; =20 @@ -354,12 +413,10 @@ ProcessTheseCapsules ( // // If Windows UX capsule exist, process it first // - DisplayCapsuleExist =3D FALSE; for (Index =3D 0; Index < mCapsuleTotalNumber; Index++) { CapsuleHeader =3D (EFI_CAPSULE_HEADER*) mCapsulePtr [Index]; if (CompareGuid (&CapsuleHeader->CapsuleGuid, &gWindowsUxCapsuleGuid))= { DEBUG ((DEBUG_INFO, "ProcessCapsuleImage (Ux) - 0x%x\n", CapsuleHead= er)); - DisplayCapsuleExist =3D TRUE; DEBUG ((DEBUG_INFO, "Display logo capsule is found.\n")); Status =3D ProcessCapsuleImage (CapsuleHeader); mCapsuleStatusArray [Index] =3D EFI_SUCCESS; @@ -368,12 +425,7 @@ ProcessTheseCapsules ( } } =20 - if (!DisplayCapsuleExist) { - // - // Display Capsule not found. Display the default string. - // - Print (L"Updating the firmware ......\r\n"); - } + DEBUG ((DEBUG_INFO, "Updating the firmware ......\n")); =20 // // All capsules left are recognized by platform. @@ -411,7 +463,6 @@ ProcessTheseCapsules ( if (EFI_ERROR(Status)) { REPORT_STATUS_CODE(EFI_ERROR_CODE, (EFI_SOFTWARE | PcdGet32(Pc= dStatusCodeSubClassCapsule) | PcdGet32(PcdCapsuleStatusCodeUpdateFirmwareFa= iled))); DEBUG ((DEBUG_ERROR, "Capsule process failed!\n")); - Print (L"Firmware update failed...\r\n"); } else { REPORT_STATUS_CODE(EFI_PROGRESS_CODE, (EFI_SOFTWARE | PcdGet32= (PcdStatusCodeSubClassCapsule) | PcdGet32(PcdCapsuleStatusCodeUpdateFirmwar= eSuccess))); } @@ -447,18 +498,9 @@ DoResetSystem ( VOID ) { - UINTN Index; - - REPORT_STATUS_CODE(EFI_PROGRESS_CODE, (EFI_SOFTWARE | PcdGet32(PcdStatus= CodeSubClassCapsule) | PcdGet32(PcdCapsuleStatusCodeResettingSystem))); - - Print(L"Capsule Request Cold Reboot.\n"); DEBUG((DEBUG_INFO, "Capsule Request Cold Reboot.")); =20 - for (Index =3D 5; Index > 0; Index--) { - Print(L"\rResetting system in %d seconds ...", Index); - DEBUG((DEBUG_INFO, "\rResetting system in %d seconds ...", Index)); - gBS->Stall(1000000); - } + REPORT_STATUS_CODE(EFI_PROGRESS_CODE, (EFI_SOFTWARE | PcdGet32(PcdStatus= CodeSubClassCapsule) | PcdGet32(PcdCapsuleStatusCodeResettingSystem))); =20 gRT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL); =20 diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLibNull= .c b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLibNull.c index 07e9e46eae..274c1c4c1c 100644 --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLibNull.c +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleProcessLibNull.c @@ -3,7 +3,7 @@ Dummy function for runtime module, because CapsuleDxeRuntime does not need call ProcessCapsules(). =20 - Copyright (c) 2016, Intel Corporation. All rights reserved.
+ Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BS= D License which accompanies this distribution. The full text of the license may b= e found at @@ -17,6 +17,25 @@ #include #include =20 +/** + Function indicate the current completion progress of the firmware + update. Platform may override with own specific progress function. + + @param[in] Completion A value between 1 and 100 indicating the current + completion progress of the firmware update + + @retval EFI_SUCESS The capsule update progress was updated. + @retval EFI_INVALID_PARAMETER Completion is greater than 100%. +**/ +EFI_STATUS +EFIAPI +UpdateImageProgress ( + IN UINTN Completion + ) +{ + return EFI_SUCCESS; +} + /** =20 This routine is called to process capsules. diff --git a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf= b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf index 1659b13ef4..342df9e99c 100644 --- a/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf +++ b/MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf @@ -69,9 +69,10 @@ [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdCapsuleStatusCodeResettingSystem = ## CONSUMES =20 [Protocols] - gEsrtManagementProtocolGuid ## CONSUMES - gEfiFirmwareManagementProtocolGuid ## CONSUMES - gEdkiiVariableLockProtocolGuid ## SOMETIMES_CONSUMES + gEsrtManagementProtocolGuid ## CONSUMES + gEfiFirmwareManagementProtocolGuid ## CONSUMES + gEdkiiVariableLockProtocolGuid ## SOMETIMES_CONSUMES + gEdkiiFirmwareManagementProgressProtocolGuid ## SOMETIMES_CONSUMES =20 [Guids] gEfiFmpCapsuleGuid ## SOMETIMES_CONSUMES ## GUID --=20 2.14.2.windows.3 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Thu May 2 06:37:05 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1527610688989972.9146074800541; Tue, 29 May 2018 09:18:08 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 2B9AC20985998; Tue, 29 May 2018 09:18:05 -0700 (PDT) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id F29AA21B02845 for ; Tue, 29 May 2018 09:18:02 -0700 (PDT) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 May 2018 09:18:02 -0700 Received: from mdkinney-mobl2.amr.corp.intel.com ([10.241.98.50]) by fmsmga006.fm.intel.com with ESMTP; 29 May 2018 09:18:02 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.93; helo=mga11.intel.com; envelope-from=michael.d.kinney@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,457,1520924400"; d="scan'208";a="232867456" From: Michael D Kinney To: edk2-devel@lists.01.org Date: Tue, 29 May 2018 09:17:55 -0700 Message-Id: <20180529161755.9424-3-michael.d.kinney@intel.com> X-Mailer: git-send-email 2.14.2.windows.3 In-Reply-To: <20180529161755.9424-1-michael.d.kinney@intel.com> References: <20180529161755.9424-1-michael.d.kinney@intel.com> Subject: [edk2] [Patch v3 2/2] SignedCapsulePkg/SystemFirmwareUpdateDxe: Use progress API X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Kinney, Michael D" , Jiewen Yao MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: "Kinney, Michael D" https://bugzilla.tianocore.org/show_bug.cgi?id=3D801 Use PlatformFlashWriteWithProgress() instead of PlatformFLashWrite() so the user can be informed of the progress as a capsule is used to update a firmware image in a firmware device. Cc: Jiewen Yao Signed-off-by: Michael D Kinney Contributed-under: TianoCore Contribution Agreement 1.1 Reviewed-by: Ard Biesheuvel Tested-by: Ard Biesheuvel --- .../SystemFirmwareUpdate/SystemFirmwareUpdateDxe.c | 90 ++++++++++++++++--= ---- 1 file changed, 67 insertions(+), 23 deletions(-) diff --git a/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmware= UpdateDxe.c b/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwar= eUpdateDxe.c index ce6892d6a9..8e66aedf62 100644 --- a/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateD= xe.c +++ b/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateD= xe.c @@ -65,11 +65,14 @@ ParseUpdateDataFile ( **/ EFI_STATUS PerformUpdate ( - IN VOID *SystemFirmwareImage, - IN UINTN SystemFirmwareImageSize, - IN UPDATE_CONFIG_DATA *ConfigData, - OUT UINT32 *LastAttemptVersion, - OUT UINT32 *LastAttemptStatus + IN VOID *SystemFirmwareImage, + IN UINTN SystemFirmwareImageSiz= e, + IN UPDATE_CONFIG_DATA *ConfigData, + OUT UINT32 *LastAttemptVersion, + OUT UINT32 *LastAttemptStatus, + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress, + IN UINTN StartPercentage, + IN UINTN EndPercentage ) { EFI_STATUS Status; @@ -78,13 +81,22 @@ PerformUpdate ( DEBUG((DEBUG_INFO, " BaseAddress - 0x%lx,", ConfigData->BaseAddress)); DEBUG((DEBUG_INFO, " ImageOffset - 0x%x,", ConfigData->ImageOffset)); DEBUG((DEBUG_INFO, " Legnth - 0x%x\n", ConfigData->Length)); - Status =3D PerformFlashWrite ( + if (Progress !=3D NULL) { + Progress (StartPercentage); + } + Status =3D PerformFlashWriteWithProgress ( ConfigData->FirmwareType, ConfigData->BaseAddress, ConfigData->AddressType, (VOID *)((UINTN)SystemFirmwareImage + (UINTN)ConfigData->Imag= eOffset), - ConfigData->Length + ConfigData->Length, + Progress, + StartPercentage, + EndPercentage ); + if (Progress !=3D NULL) { + Progress (EndPercentage); + } if (!EFI_ERROR(Status)) { *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_SUCCESS; if (ConfigData->FirmwareType =3D=3D PlatformFirmwareTypeNvRam) { @@ -111,12 +123,13 @@ PerformUpdate ( **/ EFI_STATUS UpdateImage ( - IN VOID *SystemFirmwareImage, - IN UINTN SystemFirmwareImageSize, - IN VOID *ConfigImage, - IN UINTN ConfigImageSize, - OUT UINT32 *LastAttemptVersion, - OUT UINT32 *LastAttemptStatus + IN VOID *SystemFirmwareImage, + IN UINTN SystemFirmwareImageSiz= e, + IN VOID *ConfigImage, + IN UINTN ConfigImageSize, + OUT UINT32 *LastAttemptVersion, + OUT UINT32 *LastAttemptStatus, + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress ) { EFI_STATUS Status; @@ -124,19 +137,34 @@ UpdateImage ( UPDATE_CONFIG_DATA *UpdateConfigData; CONFIG_HEADER ConfigHeader; UINTN Index; + UINTN TotalSize; + UINTN BytesWritten; + UINTN StartPercentage; + UINTN EndPercentage; =20 if (ConfigImage =3D=3D NULL) { DEBUG((DEBUG_INFO, "PlatformUpdate (NoConfig):")); DEBUG((DEBUG_INFO, " BaseAddress - 0x%x,", 0)); DEBUG((DEBUG_INFO, " Length - 0x%x\n", SystemFirmwareImageSize)); // ASSUME the whole System Firmware include NVRAM region. - Status =3D PerformFlashWrite ( + StartPercentage =3D 0; + EndPercentage =3D 100; + if (Progress !=3D NULL) { + Progress (StartPercentage); + } + Status =3D PerformFlashWriteWithProgress ( PlatformFirmwareTypeNvRam, 0, FlashAddressTypeRelativeAddress, SystemFirmwareImage, - SystemFirmwareImageSize + SystemFirmwareImageSize, + Progress, + StartPercentage, + EndPercentage ); + if (Progress !=3D NULL) { + Progress (EndPercentage); + } if (!EFI_ERROR(Status)) { *LastAttemptStatus =3D LAST_ATTEMPT_STATUS_SUCCESS; mNvRamUpdated =3D TRUE; @@ -163,17 +191,30 @@ UpdateImage ( DEBUG((DEBUG_INFO, "ConfigHeader.NumOfUpdates - 0x%x\n", ConfigHeader.Nu= mOfUpdates)); DEBUG((DEBUG_INFO, "PcdEdkiiSystemFirmwareFileGuid - %g\n", PcdGetPtr(Pc= dEdkiiSystemFirmwareFileGuid))); =20 + TotalSize =3D 0; + for (Index =3D 0; Index < ConfigHeader.NumOfUpdates; Index++) { + if (CompareGuid(&ConfigData[Index].FileGuid, PcdGetPtr(PcdEdkiiSystemF= irmwareFileGuid))) { + TotalSize =3D TotalSize + ConfigData[Index].Length; + } + } + + BytesWritten =3D 0; Index =3D 0; UpdateConfigData =3D ConfigData; while (Index < ConfigHeader.NumOfUpdates) { if (CompareGuid(&UpdateConfigData->FileGuid, PcdGetPtr(PcdEdkiiSystemF= irmwareFileGuid))) { DEBUG((DEBUG_INFO, "FileGuid - %g (processing)\n", &UpdateConfigData= ->FileGuid)); + StartPercentage =3D (BytesWritten * 100) / TotalSize; + EndPercentage =3D ((BytesWritten + UpdateConfigData->Length) * 100= ) / TotalSize; Status =3D PerformUpdate ( SystemFirmwareImage, SystemFirmwareImageSize, UpdateConfigData, LastAttemptVersion, - LastAttemptStatus + LastAttemptStatus, + Progress, + StartPercentage, + EndPercentage ); // // Shall updates be serialized so that if an update is not successfu= lly completed, @@ -186,6 +227,8 @@ UpdateImage ( DEBUG((DEBUG_INFO, "FileGuid - %g (ignored)\n", &UpdateConfigData->F= ileGuid)); } =20 + BytesWritten +=3D UpdateConfigData->Length; + Index++; UpdateConfigData++; } @@ -209,10 +252,11 @@ UpdateImage ( **/ EFI_STATUS SystemFirmwareAuthenticatedUpdate ( - IN VOID *Image, - IN UINTN ImageSize, - OUT UINT32 *LastAttemptVersion, - OUT UINT32 *LastAttemptStatus + IN VOID *Image, + IN UINTN ImageSize, + OUT UINT32 *LastAttemptVersion, + OUT UINT32 *LastAttemptStatus, + IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress ) { EFI_STATUS Status; @@ -240,7 +284,7 @@ SystemFirmwareAuthenticatedUpdate ( ExtractConfigImage(AuthenticatedImage, AuthenticatedImageSize, &ConfigIm= age, &ConfigImageSize); =20 DEBUG((DEBUG_INFO, "UpdateImage ...\n")); - Status =3D UpdateImage(SystemFirmwareImage, SystemFirmwareImageSize, Con= figImage, ConfigImageSize, LastAttemptVersion, LastAttemptStatus); + Status =3D UpdateImage(SystemFirmwareImage, SystemFirmwareImageSize, Con= figImage, ConfigImageSize, LastAttemptVersion, LastAttemptStatus, Progress); if (EFI_ERROR(Status)) { DEBUG((DEBUG_INFO, "UpdateImage - %r\n", Status)); return Status; @@ -442,8 +486,8 @@ FmpSetImage ( return EFI_INVALID_PARAMETER; } =20 - Status =3D SystemFirmwareAuthenticatedUpdate((VOID *)Image, ImageSize, &= SystemFmpPrivate->LastAttempt.LastAttemptVersion, &SystemFmpPrivate->LastAt= tempt.LastAttemptStatus); - DEBUG((DEBUG_INFO, "SetImage - LastAttemp Version - 0x%x, State - 0x%x\n= ", SystemFmpPrivate->LastAttempt.LastAttemptVersion, SystemFmpPrivate->Last= Attempt.LastAttemptStatus)); + Status =3D SystemFirmwareAuthenticatedUpdate((VOID *)Image, ImageSize, &= SystemFmpPrivate->LastAttempt.LastAttemptVersion, &SystemFmpPrivate->LastAt= tempt.LastAttemptStatus, Progress); + DEBUG((DEBUG_INFO, "SetImage - LastAttempt Version - 0x%x, State - 0x%x\= n", SystemFmpPrivate->LastAttempt.LastAttemptVersion, SystemFmpPrivate->Las= tAttempt.LastAttemptStatus)); =20 // // If NVRAM is updated, we should no longer touch variable services, bec= ause --=20 2.14.2.windows.3 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel