[PATCH v2 1/2] fwu: Pass bank state enum to fwu_state_machine_updates()
Ilias Apalodimas
ilias.apalodimas at linaro.org
Tue Jan 20 13:26:53 CET 2026
Thanks Kory,
This looks cleaner.
I got ont nit, I don't think you need to cast the states to a unit8.
On Tue, 20 Jan 2026 at 03:35, Kory Maincent <kory.maincent at bootlin.com> wrote:
>
> Change fwu_state_machine_updates() to accept an enum fwu_bank_states
> parameter instead of a boolean. This makes the function interface more
> explicit and prepares for adding FWU_BANK_INVALID support to handle
> boot failures on the active bank.
>
> Convert the FWU_BANK_* defines to an enum and update all call sites
> accordingly.
>
> Signed-off-by: Kory Maincent <kory.maincent at bootlin.com>
> ---
Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
> Changes in v2:
> - Refactors fwu_state_machine_updates() to use enum as parameter instead
> of adding a new fwu_invalid_bank() helper.
> ---
> include/fwu.h | 22 ++++++++--------
> lib/efi_loader/efi_capsule.c | 5 ++--
> lib/fwu_updates/fwu_v1.c | 16 ++++++------
> lib/fwu_updates/fwu_v2.c | 50 +++++++++++++++---------------------
> 4 files changed, 44 insertions(+), 49 deletions(-)
>
> diff --git a/include/fwu.h b/include/fwu.h
> index e7bd1d492af..9cee8fb085c 100644
> --- a/include/fwu.h
> +++ b/include/fwu.h
> @@ -80,9 +80,11 @@ struct fwu_mdata_ops {
>
> #define FWU_IMAGE_ACCEPTED 0x1
>
> -#define FWU_BANK_INVALID (uint8_t)0xFF
> -#define FWU_BANK_VALID (uint8_t)0xFE
> -#define FWU_BANK_ACCEPTED (uint8_t)0xFC
> +enum fwu_bank_states {
> + FWU_BANK_INVALID = 0xFF,
> + FWU_BANK_VALID = 0xFE,
> + FWU_BANK_ACCEPTED = 0xFC,
> +};
>
> enum {
> PRIMARY_PART = 1,
> @@ -396,24 +398,24 @@ int fwu_get_mdata_size(uint32_t *mdata_size);
>
> /**
> * fwu_state_machine_updates() - Update FWU state of the platform
> - * @trial_state: Is platform transitioning into Trial State
> + * @state: FWU bank state
> * @update_index: Bank number to which images have been updated
> *
> - * On successful completion of updates, transition the platform to
> - * either Trial State or Regular State.
> + * FWU_BANK_VALID transition the platform to Trial state
> + * FWU_BANK_ACCEPTED accept the FWU bank state
> + * FWU_BANK_INVALID invalid the FWU bank state
> *
> * To transition the platform to Trial State, start the
> * TrialStateCtr counter, followed by setting the value of bank_state
> * field of the metadata to Valid state(applicable only in version 2
> * of metadata).
> *
> - * In case, the platform is to transition directly to Regular State,
> - * update the bank_state field of the metadata to Accepted
> - * state(applicable only in version 2 of metadata).
> + * Saving the bank_state field of the metadata is only applicable in
> + * version 2 of metadata.
> *
> * Return: 0 if OK, -ve on error
> */
> -int fwu_state_machine_updates(bool trial_state, uint32_t update_index);
> +int fwu_state_machine_updates(enum fwu_bank_states state, uint32_t update_index);
>
> /**
> * fwu_init() - FWU specific initialisations
> diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c
> index 89e63ed8dd5..e0f9a6efa25 100644
> --- a/lib/efi_loader/efi_capsule.c
> +++ b/lib/efi_loader/efi_capsule.c
> @@ -465,7 +465,7 @@ static __maybe_unused efi_status_t fwu_empty_capsule_process(
> log_err("Unable to set the Accept bit for the image %pUs\n",
> image_guid);
>
> - status = fwu_state_machine_updates(0, active_idx);
> + status = fwu_state_machine_updates(FWU_BANK_ACCEPTED, active_idx);
> if (status < 0)
> ret = EFI_DEVICE_ERROR;
>
> @@ -510,7 +510,8 @@ static __maybe_unused efi_status_t fwu_post_update_process(bool fw_accept_os)
> log_err("Failed to update FWU metadata index values\n");
> } else {
> log_debug("Successfully updated the active_index\n");
> - status = fwu_state_machine_updates(fw_accept_os ? 1 : 0,
> + status = fwu_state_machine_updates(fw_accept_os ?
> + FWU_BANK_VALID : FWU_BANK_ACCEPTED,
> update_index);
> if (status < 0)
> ret = EFI_DEVICE_ERROR;
> diff --git a/lib/fwu_updates/fwu_v1.c b/lib/fwu_updates/fwu_v1.c
> index 974abf216f6..5824cca98cf 100644
> --- a/lib/fwu_updates/fwu_v1.c
> +++ b/lib/fwu_updates/fwu_v1.c
> @@ -98,27 +98,27 @@ void fwu_populate_mdata_image_info(struct fwu_data *data)
>
> /**
> * fwu_state_machine_updates() - Update FWU state of the platform
> - * @trial_state: Is platform transitioning into Trial State
> + * @state: FWU bank state
> * @update_index: Bank number to which images have been updated
> *
> - * On successful completion of updates, transition the platform to
> - * either Trial State or Regular State.
> + * FWU_BANK_VALID transition the platform to Trial state
> + * FWU_BANK_ACCEPTED accept the FWU bank state
> + * FWU_BANK_INVALID invalid the FWU bank state
> *
> * To transition the platform to Trial State, start the
> * TrialStateCtr counter, followed by setting the value of bank_state
> * field of the metadata to Valid state(applicable only in version 2
> * of metadata).
> *
> - * In case, the platform is to transition directly to Regular State,
> - * update the bank_state field of the metadata to Accepted
> - * state(applicable only in version 2 of metadata).
> + * Saving the bank_state field of the metadata is only applicable in
> + * version 2 of metadata.
> *
> * Return: 0 if OK, -ve on error
> */
> -int fwu_state_machine_updates(bool trial_state,
> +int fwu_state_machine_updates(enum fwu_bank_states state,
> uint32_t update_index)
> {
> - return fwu_trial_state_update(trial_state, update_index);
> + return fwu_trial_state_update(state == FWU_BANK_VALID, update_index);
> }
>
> /**
> diff --git a/lib/fwu_updates/fwu_v2.c b/lib/fwu_updates/fwu_v2.c
> index 159315b45b9..f48b6d1264b 100644
> --- a/lib/fwu_updates/fwu_v2.c
> +++ b/lib/fwu_updates/fwu_v2.c
> @@ -80,42 +80,27 @@ static int fwu_mdata_sanity_checks(void)
> return 0;
> }
>
> -static int fwu_bank_state_update(bool trial_state, uint32_t bank)
> +static int fwu_bank_state_update(enum fwu_bank_states state, uint32_t bank)
> {
> int ret;
> struct fwu_data *data = fwu_get_data();
> struct fwu_mdata *mdata = data->fwu_mdata;
>
> - if (!trial_state && !fwu_bank_accepted(data, bank))
> + if (state == FWU_BANK_ACCEPTED && !fwu_bank_accepted(data, bank))
> return 0;
>
> - mdata->bank_state[bank] = data->bank_state[bank] = trial_state ?
> - FWU_BANK_VALID : FWU_BANK_ACCEPTED;
> + mdata->bank_state[bank] = (uint8_t)state;
> + data->bank_state[bank] = (uint8_t)state;
>
> ret = fwu_sync_mdata(mdata, BOTH_PARTS);
> if (ret)
> log_err("Unable to set bank_state for bank %u\n", bank);
> else
> - data->trial_state = trial_state;
> + data->trial_state = state == FWU_BANK_VALID ? 1 : 0;
>
> return ret;
> }
>
> -static int fwu_trial_state_start(uint update_index)
> -{
> - int ret;
> -
> - ret = fwu_trial_state_ctr_start();
> - if (ret)
> - return ret;
> -
> - ret = fwu_bank_state_update(1, update_index);
> - if (ret)
> - return ret;
> -
> - return 0;
> -}
> -
> static bool fwu_get_mdata_mandatory(uint part)
> {
> int ret = 0;
> @@ -171,27 +156,34 @@ void fwu_populate_mdata_image_info(struct fwu_data *data)
>
> /**
> * fwu_state_machine_updates() - Update FWU state of the platform
> - * @trial_state: Is platform transitioning into Trial State
> + * @state: FWU bank state
> * @update_index: Bank number to which images have been updated
> *
> - * On successful completion of updates, transition the platform to
> - * either Trial State or Regular State.
> + * FWU_BANK_VALID transition the platform to Trial state
> + * FWU_BANK_ACCEPTED accept the FWU bank state
> + * FWU_BANK_INVALID invalid the FWU bank state
> *
> * To transition the platform to Trial State, start the
> * TrialStateCtr counter, followed by setting the value of bank_state
> * field of the metadata to Valid state(applicable only in version 2
> * of metadata).
> *
> - * In case, the platform is to transition directly to Regular State,
> - * update the bank_state field of the metadata to Accepted
> - * state(applicable only in version 2 of metadata).
> + * Saving the bank_state field of the metadata is only applicable in
> + * version 2 of metadata.
> *
> * Return: 0 if OK, -ve on error
> */
> -int fwu_state_machine_updates(bool trial_state, uint32_t update_index)
> +int fwu_state_machine_updates(enum fwu_bank_states state, uint32_t update_index)
> {
> - return trial_state ? fwu_trial_state_start(update_index) :
> - fwu_bank_state_update(0, update_index);
> + int ret;
> +
> + if (state == FWU_BANK_VALID) {
> + ret = fwu_trial_state_ctr_start();
> + if (ret)
> + return ret;
> + }
> +
> + return fwu_bank_state_update(state, update_index);
> }
>
> /**
> --
> 2.43.0
>
More information about the U-Boot
mailing list