blob: e8bddb070d238c66b8b4f0dba697860f3ec2ef5b [file] [log] [blame]
/*
* 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 */