| /* |
| * Copyright (c) 2022-2023, Arm Limited. All rights reserved. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| * |
| */ |
| |
| #ifndef FWU_INSTALLATION_INSTALLER_H |
| #define FWU_INSTALLATION_INSTALLER_H |
| |
| #include <stdbool.h> |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include "common/uuid/uuid.h" |
| #include "service/fwu/agent/install_type.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /** |
| * Interface dependencies |
| */ |
| struct image_info; |
| struct fw_directory; |
| |
| /** |
| * \brief Image installer interface |
| * |
| * The installer_interface structure provides a common interface for |
| * any image installer. Concrete installers will implement installation |
| * strategies that match the class of image being installed (e.g. component, |
| * whole firmware). |
| */ |
| struct installer_interface { |
| /** |
| * \brief Begin a transaction of one or more image install operations |
| * |
| * \param[in] context The concrete installer context |
| * \param[in] current_volume_id Where the active fw was loaded from |
| * \param[out] update_volume_id Where the update should be installed |
| * |
| * \return FWU status |
| */ |
| int (*begin)(void *context, uint32_t current_volume_id, uint32_t update_volume_id); |
| |
| /** |
| * \brief Finalize a transaction of one or more image install operations |
| * |
| * \param[in] context The concrete installer context |
| * |
| * \return FWU status |
| */ |
| int (*finalize)(void *context); |
| |
| /** |
| * \brief Abort a transaction |
| * |
| * \param[in] context The concrete installer context |
| */ |
| void (*abort)(void *context); |
| |
| /** |
| * \brief Open a stream for writing installation data |
| * |
| * \param[in] context The concrete installer context |
| * \param[in] image_info Describes the image to install |
| * |
| * \return FWU status |
| */ |
| int (*open)(void *context, const struct image_info *image_info); |
| |
| /** |
| * \brief Commit installed data (called once per open) |
| * |
| * \param[in] context The concrete installer context |
| * |
| * \return FWU status |
| */ |
| int (*commit)(void *context); |
| |
| /** |
| * \brief Write installation data to an opened installer |
| * |
| * \param[in] context The concrete installer context |
| * \param[in] data Data to write |
| * \param[in] data_len Length of data |
| * |
| * \return FWU status |
| */ |
| int (*write)(void *context, const uint8_t *data, size_t data_len); |
| |
| /** |
| * \brief Enumerate the collection of images that can be handled by the installer |
| * |
| * A concrete installer will use its specialized knowledge of the associated |
| * storage volume to enumerate the set of images that can be handled by the |
| * installer. |
| * |
| * \param[in] context The concrete installer context |
| * \param[in] volume_id Identifies the target volume |
| * \param[in] fw_directory Add results to this fw_directory |
| * |
| * \return FWU status |
| */ |
| int (*enumerate)(void *context, uint32_t volume_id, struct fw_directory *fw_directory); |
| }; |
| |
| /** |
| * \brief Base installer structure |
| * |
| */ |
| struct installer { |
| /* The installation type handled by the installer */ |
| enum install_type install_type; |
| |
| /* The location id is a short ID that identifies an updatable logical |
| * portion of the firmware store. The location id only needs to be |
| * unique within the device and will have been assigned dynamically |
| * during FWU configuration. The location id is used to bind a set of |
| * installers to the intended set of target volumes. |
| */ |
| uint32_t location_id; |
| |
| /* The location UUID is a globally unique ID that reflects the same |
| * logical scope as a location id. It is used to associate incoming |
| * update images, either directly or indirectly, to the corresponding |
| * location within the firmware store. For images contained within a |
| * disk partition, this will correspond to the partition type UUID. |
| */ |
| struct uuid_octets location_uuid; |
| |
| /* The opaque context for the concrete installer */ |
| void *context; |
| |
| /* Pointer to a concrete installer_interface */ |
| const struct installer_interface *interface; |
| |
| /* Error status encountered during an update transaction. During an update, |
| * an installer will be called multiple times. If one or more errors are encountered |
| * during the update transaction, the first error status is saved to allow for |
| * appropriate handling. |
| */ |
| uint32_t install_status; |
| |
| /** |
| * During a multi-image update, images may be delegated to different concrete |
| * installers to allow for alternative installation strategies and install destinations. |
| * Each active installer must be sequenced through a begin->finalize transaction to |
| * ensure that installation operations are completed for all images handled by an |
| * installer and by all installers used during the update. |
| */ |
| bool is_active; |
| struct installer *next; |
| }; |
| |
| static inline bool installer_is_active(const struct installer *installer) |
| { |
| return installer->is_active; |
| } |
| |
| static inline uint32_t installer_status(const struct installer *installer) |
| { |
| return installer->install_status; |
| } |
| |
| void installer_init(struct installer *installer, enum install_type install_type, |
| uint32_t location_id, const struct uuid_octets *location_uuid, void *context, |
| const struct installer_interface *interface); |
| |
| int installer_begin(struct installer *installer, uint32_t current_volume_id, |
| uint32_t update_volume_id); |
| |
| int installer_finalize(struct installer *installer); |
| |
| void installer_abort(struct installer *installer); |
| |
| int installer_open(struct installer *installer, const struct image_info *image_info); |
| |
| int installer_commit(struct installer *installer); |
| |
| int installer_write(struct installer *installer, const uint8_t *data, size_t data_len); |
| |
| int installer_enumerate(struct installer *installer, uint32_t volume_id, |
| struct fw_directory *fw_directory); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* FWU_INSTALLATION_INSTALLER_H */ |