blob: cff9972ea43bd121ec0e25304a7331221a331887 [file] [log] [blame]
/*
* Copyright (c) 2018-2020, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
#ifndef __TFM_PLAT_NV_COUNTERS_H__
#define __TFM_PLAT_NV_COUNTERS_H__
/**
* \file tfm_plat_nv_counters.h
*
* \note The interfaces defined in this file must be implemented for each
* SoC.
* \note The interface must be implemented in a fail-safe way that is
* resistant to asynchronous power failures or it can use hardware
* counters that have this capability, if supported by the platform.
* When a counter incrementation was interrupted it must be able to
* continue the incrementation process or recover the previous consistent
* status of the counters. If the counters have reached a stable status
* (every counter incrementation operation has finished), from that point
* their value cannot decrease due to any kind of power failure.
*/
#include <stdint.h>
#include "tfm_plat_defs.h"
enum tfm_nv_counter_t {
PLAT_NV_COUNTER_0 = 0, /* Used by PS service */
PLAT_NV_COUNTER_1, /* Used by PS service */
PLAT_NV_COUNTER_2, /* Used by PS service */
#ifdef BL2
PLAT_NV_COUNTER_3, /* Used by bootloader */
PLAT_NV_COUNTER_4, /* Used by bootloader */
#endif
PLAT_NV_COUNTER_MAX,
PLAT_NV_COUNTER_BOUNDARY = UINT32_MAX /* Fix tfm_nv_counter_t size
to 4 bytes */
};
#ifdef __cplusplus
extern "C" {
#endif
/**
* \brief Initialises all non-volatile (NV) counters.
*
* \return TFM_PLAT_ERR_SUCCESS if the initialization succeeds, otherwise
* TFM_PLAT_ERR_SYSTEM_ERR
*/
enum tfm_plat_err_t tfm_plat_init_nv_counter(void);
/**
* \brief Reads the given non-volatile (NV) counter.
*
* \param[in] counter_id NV counter ID.
* \param[in] size Size of the buffer to store NV counter value
* in bytes.
* \param[out] val Pointer to store the current NV counter value.
*
* \return TFM_PLAT_ERR_SUCCESS if the value is read correctly. Otherwise,
* it returns TFM_PLAT_ERR_SYSTEM_ERR.
*/
enum tfm_plat_err_t tfm_plat_read_nv_counter(enum tfm_nv_counter_t counter_id,
uint32_t size, uint8_t *val);
/**
* \brief Increments the given non-volatile (NV) counter.
*
* \param[in] counter_id NV counter ID.
*
* \return When the NV counter reaches its maximum value, the
* TFM_PLAT_ERR_MAX_VALUE error is returned to indicate the value
* cannot be incremented. Otherwise, it returns TFM_PLAT_ERR_SUCCESS.
*/
enum tfm_plat_err_t tfm_plat_increment_nv_counter(
enum tfm_nv_counter_t counter_id);
/**
* \brief Sets the given non-volatile (NV) counter to the specified value.
*
* \param[in] counter_id NV counter ID.
* \param[in] value New value of the NV counter. The maximum value that
* can be set depends on the constraints of the
* underlying implementation, but it always must be
* greater than or equal to the current NV counter value.
*
* \retval TFM_PLAT_ERR_SUCCESS The NV counter is set successfully
* \retval TFM_PLAT_ERR_INVALID_INPUT The new value is less than the current
* counter value
* \retval TFM_PLAT_ERR_MAX_VALUE The new value is greater than the
* maximum value of the NV counter
* \retval TFM_PLAT_ERR_UNSUPPORTED The function is not implemented for
* the given platform or the new value is
* not representable on the underlying
* counter implementation
* \retval TFM_PLAT_ERR_SYSTEM_ERR An unspecified error occurred
* (none of the other standard error codes
* are applicable)
*/
enum tfm_plat_err_t tfm_plat_set_nv_counter(enum tfm_nv_counter_t counter_id,
uint32_t value);
#ifdef __cplusplus
}
#endif
#endif /* __TFM_PLAT_NV_COUNTERS_H__ */