SignedCapsulePkg/SystemFirmwareUpdateDxe: Use progress API
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> Reviewed-by: Star Zeng <star.zeng@intel.com>
This commit is contained in:
		| @@ -69,7 +69,10 @@ PerformUpdate ( | |||||||
|   IN UINTN                                          SystemFirmwareImageSize, |   IN UINTN                                          SystemFirmwareImageSize, | ||||||
|   IN UPDATE_CONFIG_DATA                             *ConfigData, |   IN UPDATE_CONFIG_DATA                             *ConfigData, | ||||||
|   OUT UINT32                                        *LastAttemptVersion, |   OUT UINT32                                        *LastAttemptVersion, | ||||||
|   OUT UINT32                      *LastAttemptStatus |   OUT UINT32                                        *LastAttemptStatus, | ||||||
|  |   IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS  Progress, | ||||||
|  |   IN UINTN                                          StartPercentage, | ||||||
|  |   IN UINTN                                          EndPercentage | ||||||
|   ) |   ) | ||||||
| { | { | ||||||
|   EFI_STATUS                   Status; |   EFI_STATUS                   Status; | ||||||
| @@ -78,13 +81,22 @@ PerformUpdate ( | |||||||
|   DEBUG((DEBUG_INFO, "  BaseAddress - 0x%lx,", ConfigData->BaseAddress)); |   DEBUG((DEBUG_INFO, "  BaseAddress - 0x%lx,", ConfigData->BaseAddress)); | ||||||
|   DEBUG((DEBUG_INFO, "  ImageOffset - 0x%x,", ConfigData->ImageOffset)); |   DEBUG((DEBUG_INFO, "  ImageOffset - 0x%x,", ConfigData->ImageOffset)); | ||||||
|   DEBUG((DEBUG_INFO, "  Legnth - 0x%x\n", ConfigData->Length)); |   DEBUG((DEBUG_INFO, "  Legnth - 0x%x\n", ConfigData->Length)); | ||||||
|   Status = PerformFlashWrite ( |   if (Progress != NULL) { | ||||||
|  |     Progress (StartPercentage); | ||||||
|  |   } | ||||||
|  |   Status = PerformFlashWriteWithProgress ( | ||||||
|              ConfigData->FirmwareType, |              ConfigData->FirmwareType, | ||||||
|              ConfigData->BaseAddress, |              ConfigData->BaseAddress, | ||||||
|              ConfigData->AddressType, |              ConfigData->AddressType, | ||||||
|              (VOID *)((UINTN)SystemFirmwareImage + (UINTN)ConfigData->ImageOffset), |              (VOID *)((UINTN)SystemFirmwareImage + (UINTN)ConfigData->ImageOffset), | ||||||
|              ConfigData->Length |              ConfigData->Length, | ||||||
|  |              Progress, | ||||||
|  |              StartPercentage, | ||||||
|  |              EndPercentage | ||||||
|              ); |              ); | ||||||
|  |   if (Progress != NULL) { | ||||||
|  |     Progress (EndPercentage); | ||||||
|  |   } | ||||||
|   if (!EFI_ERROR(Status)) { |   if (!EFI_ERROR(Status)) { | ||||||
|     *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; |     *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; | ||||||
|     if (ConfigData->FirmwareType == PlatformFirmwareTypeNvRam) { |     if (ConfigData->FirmwareType == PlatformFirmwareTypeNvRam) { | ||||||
| @@ -116,7 +128,8 @@ UpdateImage ( | |||||||
|   IN VOID                                           *ConfigImage, |   IN VOID                                           *ConfigImage, | ||||||
|   IN UINTN                                          ConfigImageSize, |   IN UINTN                                          ConfigImageSize, | ||||||
|   OUT UINT32                                        *LastAttemptVersion, |   OUT UINT32                                        *LastAttemptVersion, | ||||||
|   OUT UINT32                      *LastAttemptStatus |   OUT UINT32                                        *LastAttemptStatus, | ||||||
|  |   IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS  Progress | ||||||
|   ) |   ) | ||||||
| { | { | ||||||
|   EFI_STATUS                            Status; |   EFI_STATUS                            Status; | ||||||
| @@ -124,19 +137,34 @@ UpdateImage ( | |||||||
|   UPDATE_CONFIG_DATA                    *UpdateConfigData; |   UPDATE_CONFIG_DATA                    *UpdateConfigData; | ||||||
|   CONFIG_HEADER                         ConfigHeader; |   CONFIG_HEADER                         ConfigHeader; | ||||||
|   UINTN                                 Index; |   UINTN                                 Index; | ||||||
|  |   UINTN                                 TotalSize; | ||||||
|  |   UINTN                                 BytesWritten; | ||||||
|  |   UINTN                                 StartPercentage; | ||||||
|  |   UINTN                                 EndPercentage; | ||||||
|  |  | ||||||
|   if (ConfigImage == NULL) { |   if (ConfigImage == NULL) { | ||||||
|     DEBUG((DEBUG_INFO, "PlatformUpdate (NoConfig):")); |     DEBUG((DEBUG_INFO, "PlatformUpdate (NoConfig):")); | ||||||
|     DEBUG((DEBUG_INFO, "  BaseAddress - 0x%x,", 0)); |     DEBUG((DEBUG_INFO, "  BaseAddress - 0x%x,", 0)); | ||||||
|     DEBUG((DEBUG_INFO, "  Length - 0x%x\n", SystemFirmwareImageSize)); |     DEBUG((DEBUG_INFO, "  Length - 0x%x\n", SystemFirmwareImageSize)); | ||||||
|     // ASSUME the whole System Firmware include NVRAM region. |     // ASSUME the whole System Firmware include NVRAM region. | ||||||
|     Status = PerformFlashWrite ( |     StartPercentage = 0; | ||||||
|  |     EndPercentage = 100; | ||||||
|  |     if (Progress != NULL) { | ||||||
|  |       Progress (StartPercentage); | ||||||
|  |     } | ||||||
|  |     Status = PerformFlashWriteWithProgress ( | ||||||
|                PlatformFirmwareTypeNvRam, |                PlatformFirmwareTypeNvRam, | ||||||
|                0, |                0, | ||||||
|                FlashAddressTypeRelativeAddress, |                FlashAddressTypeRelativeAddress, | ||||||
|                SystemFirmwareImage, |                SystemFirmwareImage, | ||||||
|                SystemFirmwareImageSize |                SystemFirmwareImageSize, | ||||||
|  |                Progress, | ||||||
|  |                StartPercentage, | ||||||
|  |                EndPercentage | ||||||
|                ); |                ); | ||||||
|  |     if (Progress != NULL) { | ||||||
|  |       Progress (EndPercentage); | ||||||
|  |     } | ||||||
|     if (!EFI_ERROR(Status)) { |     if (!EFI_ERROR(Status)) { | ||||||
|       *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; |       *LastAttemptStatus = LAST_ATTEMPT_STATUS_SUCCESS; | ||||||
|       mNvRamUpdated = TRUE; |       mNvRamUpdated = TRUE; | ||||||
| @@ -163,17 +191,30 @@ UpdateImage ( | |||||||
|   DEBUG((DEBUG_INFO, "ConfigHeader.NumOfUpdates - 0x%x\n", ConfigHeader.NumOfUpdates)); |   DEBUG((DEBUG_INFO, "ConfigHeader.NumOfUpdates - 0x%x\n", ConfigHeader.NumOfUpdates)); | ||||||
|   DEBUG((DEBUG_INFO, "PcdEdkiiSystemFirmwareFileGuid - %g\n", PcdGetPtr(PcdEdkiiSystemFirmwareFileGuid))); |   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; |   Index = 0; | ||||||
|   UpdateConfigData = ConfigData; |   UpdateConfigData = ConfigData; | ||||||
|   while (Index < ConfigHeader.NumOfUpdates) { |   while (Index < ConfigHeader.NumOfUpdates) { | ||||||
|     if (CompareGuid(&UpdateConfigData->FileGuid, PcdGetPtr(PcdEdkiiSystemFirmwareFileGuid))) { |     if (CompareGuid(&UpdateConfigData->FileGuid, PcdGetPtr(PcdEdkiiSystemFirmwareFileGuid))) { | ||||||
|       DEBUG((DEBUG_INFO, "FileGuid - %g (processing)\n", &UpdateConfigData->FileGuid)); |       DEBUG((DEBUG_INFO, "FileGuid - %g (processing)\n", &UpdateConfigData->FileGuid)); | ||||||
|  |       StartPercentage = (BytesWritten * 100) / TotalSize; | ||||||
|  |       EndPercentage   = ((BytesWritten + UpdateConfigData->Length) * 100) / TotalSize; | ||||||
|       Status = PerformUpdate ( |       Status = PerformUpdate ( | ||||||
|                  SystemFirmwareImage, |                  SystemFirmwareImage, | ||||||
|                  SystemFirmwareImageSize, |                  SystemFirmwareImageSize, | ||||||
|                  UpdateConfigData, |                  UpdateConfigData, | ||||||
|                  LastAttemptVersion, |                  LastAttemptVersion, | ||||||
|                  LastAttemptStatus |                  LastAttemptStatus, | ||||||
|  |                  Progress, | ||||||
|  |                  StartPercentage, | ||||||
|  |                  EndPercentage | ||||||
|                  ); |                  ); | ||||||
|       // |       // | ||||||
|       // Shall updates be serialized so that if an update is not successfully completed, |       // 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)); |       DEBUG((DEBUG_INFO, "FileGuid - %g (ignored)\n", &UpdateConfigData->FileGuid)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     BytesWritten += UpdateConfigData->Length; | ||||||
|  |  | ||||||
|     Index++; |     Index++; | ||||||
|     UpdateConfigData++; |     UpdateConfigData++; | ||||||
|   } |   } | ||||||
| @@ -212,7 +255,8 @@ SystemFirmwareAuthenticatedUpdate ( | |||||||
|   IN VOID                                           *Image, |   IN VOID                                           *Image, | ||||||
|   IN UINTN                                          ImageSize, |   IN UINTN                                          ImageSize, | ||||||
|   OUT UINT32                                        *LastAttemptVersion, |   OUT UINT32                                        *LastAttemptVersion, | ||||||
|   OUT UINT32                      *LastAttemptStatus |   OUT UINT32                                        *LastAttemptStatus, | ||||||
|  |   IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS  Progress | ||||||
|   ) |   ) | ||||||
| { | { | ||||||
|   EFI_STATUS                  Status; |   EFI_STATUS                  Status; | ||||||
| @@ -240,7 +284,7 @@ SystemFirmwareAuthenticatedUpdate ( | |||||||
|   ExtractConfigImage(AuthenticatedImage, AuthenticatedImageSize, &ConfigImage, &ConfigImageSize); |   ExtractConfigImage(AuthenticatedImage, AuthenticatedImageSize, &ConfigImage, &ConfigImageSize); | ||||||
|  |  | ||||||
|   DEBUG((DEBUG_INFO, "UpdateImage ...\n")); |   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)) { |   if (EFI_ERROR(Status)) { | ||||||
|     DEBUG((DEBUG_INFO, "UpdateImage - %r\n", Status)); |     DEBUG((DEBUG_INFO, "UpdateImage - %r\n", Status)); | ||||||
|     return Status; |     return Status; | ||||||
| @@ -442,8 +486,8 @@ FmpSetImage ( | |||||||
|     return EFI_INVALID_PARAMETER; |     return EFI_INVALID_PARAMETER; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   Status = SystemFirmwareAuthenticatedUpdate((VOID *)Image, ImageSize, &SystemFmpPrivate->LastAttempt.LastAttemptVersion, &SystemFmpPrivate->LastAttempt.LastAttemptStatus); |   Status = SystemFirmwareAuthenticatedUpdate((VOID *)Image, ImageSize, &SystemFmpPrivate->LastAttempt.LastAttemptVersion, &SystemFmpPrivate->LastAttempt.LastAttemptStatus, Progress); | ||||||
|   DEBUG((DEBUG_INFO, "SetImage - LastAttemp Version - 0x%x, State - 0x%x\n", SystemFmpPrivate->LastAttempt.LastAttemptVersion, SystemFmpPrivate->LastAttempt.LastAttemptStatus)); |   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 |   // If NVRAM is updated, we should no longer touch variable services, because | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user