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:
parent
5747610657
commit
eb59431346
@ -65,11 +65,14 @@ ParseUpdateDataFile (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
PerformUpdate (
|
PerformUpdate (
|
||||||
IN VOID *SystemFirmwareImage,
|
IN VOID *SystemFirmwareImage,
|
||||||
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) {
|
||||||
@ -111,12 +123,13 @@ PerformUpdate (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
UpdateImage (
|
UpdateImage (
|
||||||
IN VOID *SystemFirmwareImage,
|
IN VOID *SystemFirmwareImage,
|
||||||
IN UINTN SystemFirmwareImageSize,
|
IN UINTN SystemFirmwareImageSize,
|
||||||
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++;
|
||||||
}
|
}
|
||||||
@ -209,10 +252,11 @@ UpdateImage (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
SystemFirmwareAuthenticatedUpdate (
|
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user