135 lines
3.8 KiB
C
135 lines
3.8 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
*
|
|
* Copyright 2016 The Fuchsia Authors. All rights reserved.
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*
|
|
*/
|
|
|
|
#ifndef __ABR_H__
|
|
#define __ABR_H__
|
|
|
|
#include <stddef.h>
|
|
|
|
/* Return codes
|
|
*
|
|
* ABR_RESULT_OK is returned if the requested operation was
|
|
* successful.
|
|
*
|
|
* ABR_RESULT_ERROR_IO is returned if the underlying hardware (disk
|
|
* or other subsystem) encountered an I/O error.
|
|
*
|
|
* ABR_RESULT_ERROR_INVALID_DATA is returned if invalid argument
|
|
* is passed
|
|
*
|
|
* ABR_RESULT_ERROR_UNSUPPORTED_VERSION is returned if wrong version
|
|
* of ABRData is passed
|
|
*/
|
|
typedef enum {
|
|
ABR_RESULT_OK,
|
|
ABR_RESULT_ERROR_IO,
|
|
ABR_RESULT_ERROR_INVALID_DATA,
|
|
ABR_RESULT_ERROR_UNSUPPORTED_VERSION,
|
|
} ABRResult;
|
|
|
|
#include "abr_sysdeps.h"
|
|
#include "abr_data.h"
|
|
#include "abr_ops.h"
|
|
#include "abr_util.h"
|
|
|
|
#define ABR_R_SLOT_IDX 2
|
|
|
|
/* Describes a current status of the slot
|
|
* |valid|, true if the slot can be used for booting
|
|
* |successful_boot|, true if the slot was marked as successful/stable.
|
|
* |retry_count|, number of retries are left. Should be 0 if |valid| == false
|
|
* or |successful_boot| == true
|
|
*/
|
|
typedef struct {
|
|
bool valid;
|
|
bool successful_boot;
|
|
uint8_t retry_count;
|
|
} ABRSlotInfo;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Convert |src| buffer to |dest| ABRData.
|
|
* Returns false if the data is invalid (e.g. wrong magic,
|
|
* wrong CRC32 etc.), true otherwise.
|
|
*/
|
|
ABRResult abr_convert_buffer_to_data_and_verify(const unsigned char *src,
|
|
size_t size, ABRData *dest);
|
|
|
|
/* Convert |src| ABRData to |dest| buffer.
|
|
* Also updates the |crc32| field in |dest|.
|
|
*/
|
|
ABRResult abr_convert_data_to_buffer(const ABRData *src,
|
|
unsigned char *dest, size_t size);
|
|
|
|
/* High-level function to select a slot to boot. The following
|
|
* algorithm is used:
|
|
*
|
|
* 1. A/B/R metadata is loaded and validated. if it's invalid then it's
|
|
* reset and this reset metadata is returned.
|
|
*
|
|
* 2. if oneshot_recovery_mode is set in A/B/R metadata, R slot is
|
|
* selected to boot
|
|
*
|
|
* 3. A valid slot with highest priority is chosen to boot.
|
|
*
|
|
* 4. If there are no valid slots, R slot is chosen
|
|
*
|
|
* Set |update_metadata| as true to update A/B/R metadata, 'false' - to
|
|
* keep metadata unchanged.
|
|
*
|
|
* |is_successful| is set to true, if returned slot is marked as successful.
|
|
*/
|
|
unsigned int abr_get_boot_slot(ABROps *abr_ops, bool update_metadata, bool *is_successful);
|
|
|
|
/* Converts slot index into corresponding name
|
|
* NULL will be returned in case of error.
|
|
*/
|
|
const char *abr_get_slot_name_by_index(unsigned int index);
|
|
|
|
/* Marks the slot with the given slot number as active. Returns
|
|
* ABR_RESULT_OK on success, error code otherwise.
|
|
*
|
|
* This function is typically used by the OS updater when completing
|
|
* an update. It can also used by the firmware for implementing the
|
|
* "set_active" command.
|
|
*/
|
|
ABRResult abr_mark_slot_active(ABROps *abr_ops, unsigned int slot_number);
|
|
|
|
/* Marks the slot with the given slot number as unbootable. Returns
|
|
* ABR_RESULT_OK on success, error code otherwise.
|
|
*
|
|
* This function is typically used by the OS updater before writing to
|
|
* a slot.
|
|
*/
|
|
ABRResult abr_mark_slot_unbootable(ABROps *abr_ops, unsigned int slot_number);
|
|
|
|
/* Marks the slot with the given slot number as having booted
|
|
* successfully. Returns ABR_RESULT_OK on success, error code
|
|
* otherwise.
|
|
*
|
|
* Calling this on an unbootable slot is an error -
|
|
* ABR_RESULT_ERROR_INVALID_DATA will be returned.
|
|
*
|
|
* This function is typically used by the OS updater after having
|
|
* confirmed that the slot works as intended.
|
|
*/
|
|
ABRResult abr_mark_slot_successful(ABROps *abr_ops, unsigned int slot_number);
|
|
|
|
/* Get current slot info */
|
|
ABRResult abr_get_slot_info(ABROps *abr_ops,
|
|
unsigned int slot_number, ABRSlotInfo *info);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __ABR_H__ */
|
|
|