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 <[email protected]> --- 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

