
On Thu, Feb 03, 2022 at 06:23:27PM +0900, Masami Hiramatsu wrote:
Add a cold reset soon after processing capsule update on disk. This is required in UEFI specification 2.9 Section 8.5.5 "Delivery of Capsules via file on Mass Storage device" as;
In all cases that a capsule is identified for processing the system is restarted after capsule processing is completed.
Once this behavior is enforced on U-Boot, CONFIG_EFI_CAPSULE_ON_DISK_EARLY will make little sense. This option will have to always be set. Otherwise, a user will see a sudden system reboot when he or she types any of efi commands, like "env print -e".
-Takahiro Akashi
This also reports the result of each capsule update so that the user can notice that the capsule update has been succeeded or not from console log.
Signed-off-by: Masami Hiramatsu masami.hiramatsu@linaro.org
Changes in v4:
- Do not use sysreset because that is a warm reset.
- Fix patch description.
lib/efi_loader/efi_capsule.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c index 1ec7ea29ff..20d9490dbd 100644 --- a/lib/efi_loader/efi_capsule.c +++ b/lib/efi_loader/efi_capsule.c @@ -14,6 +14,7 @@ #include <env.h> #include <fdtdec.h> #include <fs.h> +#include <hang.h> #include <malloc.h> #include <mapmem.h> #include <sort.h> @@ -1120,8 +1121,11 @@ efi_status_t efi_launch_capsules(void) if (ret == EFI_SUCCESS) { ret = efi_capsule_update_firmware(capsule); if (ret != EFI_SUCCESS)
log_err("Applying capsule %ls failed\n",
log_err("Applying capsule %ls failed.\n", files[i]);
else
log_info("Applying capsule %ls succeeded.\n",
files[i]); /* create CapsuleXXXX */ set_capsule_result(index, capsule, ret);
@@ -1142,6 +1146,16 @@ efi_status_t efi_launch_capsules(void) free(files[i]); free(files);
- return ret;
- /*
* UEFI spec requires to reset system after complete processing capsule
* update on the storage.
*/
- log_info("Reboot after firmware update");
- /* Cold reset is required for loading the new firmware. */
- do_reset(NULL, 0, 0, NULL);
- hang();
- /* not reach here */
- return 0;
} #endif /* CONFIG_EFI_CAPSULE_ON_DISK */