From: Abdellatif El Khlifi <abdellatif.elkhl...@arm.com> Implement set_image and get_image_info through RAW functions
The implementation is done using efi_firmware_raw_set_image() and efi_firmware_get_image_info() Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhl...@arm.com> Signed-off-by: Davidson kumaresan <davidson.kumare...@arm.com> Cc: Heinrich Schuchardt <xypron.g...@gmx.de> Cc: Sughosh Ganu <sughosh.g...@linaro.org> Cc: Tom Rini <tr...@konsulko.com> Cc: Ilias Apalodimas <ilias.apalodi...@linaro.org> Cc: Simon Glass <s...@chromium.org> Cc: Michal Simek <michal.si...@amd.com> Cc: Marek Vasut <marek.vasut+rene...@mailbox.org> Cc: Casey Connolly <casey.conno...@linaro.org> Cc: Adriano Cordova <adria...@gmail.com> --- lib/efi_loader/efi_firmware.c | 97 ++++++++++++++++++++++------------- 1 file changed, 60 insertions(+), 37 deletions(-) diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c index 75501e21557..dad80beb23e 100644 --- a/lib/efi_loader/efi_firmware.c +++ b/lib/efi_loader/efi_firmware.c @@ -4,6 +4,12 @@ * * Copyright (c) 2020 Linaro Limited * Author: AKASHI Takahiro + * + * Copyright 2025 Arm Limited and/or its affiliates <open-source-off...@arm.com> + * + * Authors: + * Abdellatif El Khlifi <abdellatif.elkhl...@arm.com> + * Davidson kumaresan <davidson.kumare...@arm.com> */ #define LOG_CATEGORY LOGC_EFI @@ -14,6 +20,7 @@ #include <efi_variable.h> #include <env.h> #include <fwu.h> +#include <fwu_arm_psa.h> #include <image.h> #include <signatures.h> @@ -601,10 +608,21 @@ efi_status_t EFIAPI efi_firmware_get_image_info( !descriptor_size || !package_version || !package_version_name)) return EFI_EXIT(EFI_INVALID_PARAMETER); - ret = efi_fill_image_desc_array(image_info_size, image_info, - descriptor_version, descriptor_count, - descriptor_size, package_version, - package_version_name); + if (IS_ENABLED(CONFIG_FWU_ARM_PSA)) { + ret = fwu_arm_psa_get_image_info(image_info_size, image_info, + descriptor_version, + descriptor_count, + descriptor_size, + package_version, + package_version_name); + } else { + ret = efi_fill_image_desc_array(image_info_size, image_info, + descriptor_version, + descriptor_count, + descriptor_size, + package_version, + package_version_name); + } return EFI_EXIT(ret); } @@ -749,48 +767,53 @@ efi_status_t EFIAPI efi_firmware_raw_set_image( if (status != EFI_SUCCESS) return EFI_EXIT(status); - /* - * dfu_alt_num is assigned from 0 while image_index starts from 1. - * dfu_alt_num is calculated by (image_index - 1) when multi bank update - * is not used. - */ - dfu_alt_num = image_index - 1; - if (IS_ENABLED(CONFIG_FWU_MULTI_BANK_UPDATE)) { + if (IS_ENABLED(CONFIG_FWU_ARM_PSA)) { + if (fwu_update_image(image, image_index, image_size)) + return EFI_EXIT(EFI_DEVICE_ERROR); + } else { /* - * Based on the value of update bank, derive the - * image index value. + * dfu_alt_num is assigned from 0 while image_index starts from 1. + * dfu_alt_num is calculated by (image_index - 1) when multi bank update + * is not used. */ - ret = fwu_get_dfu_alt_num(image_index, &dfu_alt_num); - if (ret) { - log_debug("Unable to get FWU image_index\n"); - return EFI_EXIT(EFI_DEVICE_ERROR); + dfu_alt_num = image_index - 1; + if (IS_ENABLED(CONFIG_FWU_MULTI_BANK_UPDATE)) { + /* + * Based on the value of update bank, derive the + * image index value. + */ + ret = fwu_get_dfu_alt_num(image_index, &dfu_alt_num); + if (ret) { + log_debug("Unable to get FWU image_index\n"); + return EFI_EXIT(EFI_DEVICE_ERROR); + } } - } - orig_dfu_env = env_get("dfu_alt_info"); - if (orig_dfu_env) { - orig_dfu_env = strdup(orig_dfu_env); - if (!orig_dfu_env) { - log_err("strdup() failed!\n"); - return EFI_EXIT(EFI_OUT_OF_RESOURCES); + orig_dfu_env = env_get("dfu_alt_info"); + if (orig_dfu_env) { + orig_dfu_env = strdup(orig_dfu_env); + if (!orig_dfu_env) { + log_err("strdup() failed!\n"); + return EFI_EXIT(EFI_OUT_OF_RESOURCES); + } + } + if (env_set("dfu_alt_info", update_info.dfu_string)) { + log_err("Unable to set env variable \"dfu_alt_info\"!\n"); + free(orig_dfu_env); + return EFI_EXIT(EFI_DEVICE_ERROR); } - } - if (env_set("dfu_alt_info", update_info.dfu_string)) { - log_err("Unable to set env variable \"dfu_alt_info\"!\n"); - free(orig_dfu_env); - return EFI_EXIT(EFI_DEVICE_ERROR); - } - ret = dfu_write_by_alt(dfu_alt_num, (void *)image, image_size, - NULL, NULL); + ret = dfu_write_by_alt(dfu_alt_num, (void *)image, image_size, + NULL, NULL); - if (env_set("dfu_alt_info", orig_dfu_env)) - log_warning("Unable to restore env variable \"dfu_alt_info\". Further DFU operations may fail!\n"); + if (env_set("dfu_alt_info", orig_dfu_env)) + log_warning("Unable to restore env variable \"dfu_alt_info\". Further DFU operations may fail!\n"); - free(orig_dfu_env); + free(orig_dfu_env); - if (ret) - return EFI_EXIT(EFI_DEVICE_ERROR); + if (ret) + return EFI_EXIT(EFI_DEVICE_ERROR); + } efi_firmware_set_fmp_state_var(&state, image_index); -- 2.25.1