public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
To: Michael D Kinney <michael.d.kinney@intel.com>
Cc: "edk2-devel@lists.01.org" <edk2-devel@lists.01.org>,
	Jiewen Yao <jiewen.yao@intel.com>
Subject: Re: [Patch v3 2/2] SignedCapsulePkg/SystemFirmwareUpdateDxe: Use progress API
Date: Wed, 6 Jun 2018 19:35:26 +0200	[thread overview]
Message-ID: <CAKv+Gu8i834G1Pd1s-aaCbH3kNLVrrgLq6JxCugw1s4R5uM=Tw@mail.gmail.com> (raw)
In-Reply-To: <20180529161755.9424-3-michael.d.kinney@intel.com>

On 29 May 2018 at 18:17, Michael D Kinney <michael.d.kinney@intel.com> wrote:
> From: "Kinney, Michael D" <michael.d.kinney@intel.com>
>
> https://bugzilla.tianocore.org/show_bug.cgi?id=801
>
> 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 <jiewen.yao@intel.com>
> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1

Tested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>


> ---
>  .../SystemFirmwareUpdate/SystemFirmwareUpdateDxe.c | 90 ++++++++++++++++------
>  1 file changed, 67 insertions(+), 23 deletions(-)
>
> diff --git a/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.c b/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.c
> index ce6892d6a9..8e66aedf62 100644
> --- a/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.c
> +++ b/SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.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                                          SystemFirmwareImageSize,
> +  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 = PerformFlashWrite (
> +  if (Progress != NULL) {
> +    Progress (StartPercentage);
> +  }
> +  Status = PerformFlashWriteWithProgress (
>               ConfigData->FirmwareType,
>               ConfigData->BaseAddress,
>               ConfigData->AddressType,
>               (VOID *)((UINTN)SystemFirmwareImage + (UINTN)ConfigData->ImageOffset),
> -             ConfigData->Length
> +             ConfigData->Length,
> +             Progress,
> +             StartPercentage,
> +             EndPercentage
>               );
> +  if (Progress != NULL) {
> +    Progress (EndPercentage);
> +  }
>    if (!EFI_ERROR(Status)) {
>      *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS;
>      if (ConfigData->FirmwareType == 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                                          SystemFirmwareImageSize,
> +  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;
>
>    if (ConfigImage == 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 = PerformFlashWrite (
> +    StartPercentage = 0;
> +    EndPercentage = 100;
> +    if (Progress != NULL) {
> +      Progress (StartPercentage);
> +    }
> +    Status = PerformFlashWriteWithProgress (
>                 PlatformFirmwareTypeNvRam,
>                 0,
>                 FlashAddressTypeRelativeAddress,
>                 SystemFirmwareImage,
> -               SystemFirmwareImageSize
> +               SystemFirmwareImageSize,
> +               Progress,
> +               StartPercentage,
> +               EndPercentage
>                 );
> +    if (Progress != NULL) {
> +      Progress (EndPercentage);
> +    }
>      if (!EFI_ERROR(Status)) {
>        *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS;
>        mNvRamUpdated = TRUE;
> @@ -163,17 +191,30 @@ UpdateImage (
>    DEBUG((DEBUG_INFO, "ConfigHeader.NumOfUpdates - 0x%x\n", ConfigHeader.NumOfUpdates));
>    DEBUG((DEBUG_INFO, "PcdEdkiiSystemFirmwareFileGuid - %g\n", PcdGetPtr(PcdEdkiiSystemFirmwareFileGuid)));
>
> +  TotalSize = 0;
> +  for (Index = 0; Index < ConfigHeader.NumOfUpdates; Index++) {
> +    if (CompareGuid(&ConfigData[Index].FileGuid, PcdGetPtr(PcdEdkiiSystemFirmwareFileGuid))) {
> +      TotalSize = TotalSize + ConfigData[Index].Length;
> +    }
> +  }
> +
> +  BytesWritten = 0;
>    Index = 0;
>    UpdateConfigData = ConfigData;
>    while (Index < ConfigHeader.NumOfUpdates) {
>      if (CompareGuid(&UpdateConfigData->FileGuid, PcdGetPtr(PcdEdkiiSystemFirmwareFileGuid))) {
>        DEBUG((DEBUG_INFO, "FileGuid - %g (processing)\n", &UpdateConfigData->FileGuid));
> +      StartPercentage = (BytesWritten * 100) / TotalSize;
> +      EndPercentage   = ((BytesWritten + UpdateConfigData->Length) * 100) / TotalSize;
>        Status = PerformUpdate (
>                   SystemFirmwareImage,
>                   SystemFirmwareImageSize,
>                   UpdateConfigData,
>                   LastAttemptVersion,
> -                 LastAttemptStatus
> +                 LastAttemptStatus,
> +                 Progress,
> +                 StartPercentage,
> +                 EndPercentage
>                   );
>        //
>        // Shall updates be serialized so that if an update is not successfully completed,
> @@ -186,6 +227,8 @@ UpdateImage (
>        DEBUG((DEBUG_INFO, "FileGuid - %g (ignored)\n", &UpdateConfigData->FileGuid));
>      }
>
> +    BytesWritten += 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, &ConfigImage, &ConfigImageSize);
>
>    DEBUG((DEBUG_INFO, "UpdateImage ...\n"));
> -  Status = UpdateImage(SystemFirmwareImage, SystemFirmwareImageSize, ConfigImage, ConfigImageSize, LastAttemptVersion, LastAttemptStatus);
> +  Status = UpdateImage(SystemFirmwareImage, SystemFirmwareImageSize, ConfigImage, 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;
>    }
>
> -  Status = SystemFirmwareAuthenticatedUpdate((VOID *)Image, ImageSize, &SystemFmpPrivate->LastAttempt.LastAttemptVersion, &SystemFmpPrivate->LastAttempt.LastAttemptStatus);
> -  DEBUG((DEBUG_INFO, "SetImage - LastAttemp Version - 0x%x, State - 0x%x\n", SystemFmpPrivate->LastAttempt.LastAttemptVersion, SystemFmpPrivate->LastAttempt.LastAttemptStatus));
> +  Status = SystemFirmwareAuthenticatedUpdate((VOID *)Image, ImageSize, &SystemFmpPrivate->LastAttempt.LastAttemptVersion, &SystemFmpPrivate->LastAttempt.LastAttemptStatus, Progress);
> +  DEBUG((DEBUG_INFO, "SetImage - LastAttempt Version - 0x%x, State - 0x%x\n", SystemFmpPrivate->LastAttempt.LastAttemptVersion, SystemFmpPrivate->LastAttempt.LastAttemptStatus));
>
>    //
>    // If NVRAM is updated, we should no longer touch variable services, because
> --
> 2.14.2.windows.3
>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel


      reply	other threads:[~2018-06-06 17:35 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-29 16:17 [Patch v3 0/2] Use DisplayUpdateProgressLib and PerformFlashWriteWithProgress() Michael D Kinney
2018-05-29 16:17 ` [Patch v3 1/2] MdeModulePkg/DxeCapsuleLibFmp: Add progress bar support Michael D Kinney
2018-05-31  9:43   ` Zeng, Star
2018-05-31 13:03   ` Ard Biesheuvel
2018-06-06 17:34   ` Ard Biesheuvel
2018-05-29 16:17 ` [Patch v3 2/2] SignedCapsulePkg/SystemFirmwareUpdateDxe: Use progress API Michael D Kinney
2018-06-06 17:35   ` Ard Biesheuvel [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='CAKv+Gu8i834G1Pd1s-aaCbH3kNLVrrgLq6JxCugw1s4R5uM=Tw@mail.gmail.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