blob: faaded8f7cfa77f49d845ff18c27b97b96296fe9 [file] [log] [blame]
/**
* Copyright (c) 2019 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-BSD-5-Clause-Nordic
*/
/**@file
* @defgroup nrf_cc310_platform_mutex nrf_cc310_platform mutex APIs
* @ingroup nrf_cc310_platform
* @{
* @brief The nrf_cc310_platform_mutex APIs provides RTOS integration for mutex
* usage in nrf_cc310_platform and dependent libraries.
*/
#ifndef NRF_CC310_PLATFORM_MUTEX_H__
#define NRF_CC310_PLATFORM_MUTEX_H__
#include <stdint.h>
#include <stddef.h>
#include "nrf_cc310_platform_abort.h"
#ifdef __cplusplus
extern "C"
{
#endif
#define NRF_CC310_PLATFORM_MUTEX_MASK_INVALID (0) /*!< Mask indicating that the mutex is invalid (not initialized or allocated). */
#define NRF_CC310_PLATFORM_MUTEX_MASK_IS_VALID (1<<0) /*!< Mask value indicating that the mutex is valid for use. */
#define NRF_CC310_PLATFORM_MUTEX_MASK_IS_ALLOCATED (1<<1) /*!< Mask value indicating that the mutex is allocated and requires deallocation once freed. */
/** @brief Type definition of architecture neutral mutex type */
typedef struct nrf_cc310_platform_mutex
{
void * mutex;
uint32_t flags;
} nrf_cc310_platform_mutex_t;
/** @brief Type definition of function pointer to initialize a mutex
*
* Calling this function pointer should initialize a previously uninitialized
* mutex or do nothing if the mutex is already initialized.
*
* @note Initialization may not imply memory allocation, as this can be done
* using static allocation through other APIs in the RTOS.
*
* @param[in] mutex Pointer to a mutex to initialize.
*/
typedef void (*nrf_cc310_platform_mutex_init_fn_t)(nrf_cc310_platform_mutex_t *mutex);
/** @brief Type definition of function pointer to free a mutex
*
* Calling this function pointer should free a mutex.
*
* @note If the RTOS does not provide an API to free the mutex it is advised
* to reset the mutex to an initialized state with no owner.
*
* @param[in] mutex Pointer to a mutex to free.
*/
typedef void (*nrf_cc310_platform_mutex_free_fn_t)(nrf_cc310_platform_mutex_t *mutex);
/** @brief Type definition of function pointer to lock a mutex
*
* Calling this function pointer should lock a mutex.
*
* @param[in] mutex Pointer to a mutex to lock.
*/
typedef int (*nrf_cc310_platform_mutex_lock_fn_t)(nrf_cc310_platform_mutex_t *mutex);
/** @brief Type definition of function pointer to unlock a mutex
*
* Calling this function pointer should unlock a mutex.
*
* @param[in] mutex Pointer to a mutex to unlock.
*/
typedef int (*nrf_cc310_platform_mutex_unlock_fn_t)(nrf_cc310_platform_mutex_t *mutex);
/**@brief Type definition of structure holding platform mutex APIs
*/
typedef struct nrf_cc310_platform_mutex_apis_t
{
/* The platform mutex init function */
nrf_cc310_platform_mutex_init_fn_t mutex_init_fn;
/* The platform mutex free function */
nrf_cc310_platform_mutex_free_fn_t mutex_free_fn;
/* The platform lock function */
nrf_cc310_platform_mutex_lock_fn_t mutex_lock_fn;
/* The platform unlock function */
nrf_cc310_platform_mutex_unlock_fn_t mutex_unlock_fn;
} nrf_cc310_platform_mutex_apis_t;
/** @brief Type definition of structure to platform hw mutexes
*/
typedef struct nrf_cc310_platform_mutexes_t
{
/* Mutex for symmetric operations. */
void * sym_mutex;
/* Mutex for asymetric operations. */
void * asym_mutex;
/* Mutex for rng operations. */
void * rng_mutex;
/* Mutex reserved for future use. */
void * reserved;
/* Mutex for power mode changes */
void * power_mutex;
} nrf_cc310_platform_mutexes_t;
/**@brief External reference to structure holding the currently set platform
* mutexe APIs.
*/
extern nrf_cc310_platform_mutex_apis_t platform_mutex_apis;
/**@brief External reference to currently set platform hw mutexes */
extern nrf_cc310_platform_mutexes_t platform_mutexes;
/** @brief Function to set platform mutex APIs and mutexes
*
* @param[in] apis Structure holding the mutex APIs.
* @param[in] mutexes Structure holding the mutexes.
*/
void nrf_cc310_platform_set_mutexes(
nrf_cc310_platform_mutex_apis_t const * const apis,
nrf_cc310_platform_mutexes_t const * const mutexes);
/** @brief Function to initialize RTOS thread-safe mutexes
*
* This function must be implemented to set the platform mutex APIS,
* and platform mutexes.
*
* @note This function must be called once before calling
* @ref nrf_cc310_platform_init or @ref nrf_cc310_platform_init_no_rng.
*
* @note This function is not expected to be thread-safe.
*/
void nrf_cc310_platform_mutex_init(void);
#ifdef __cplusplus
}
#endif
#endif /* NRF_CC310_PLATFORM_MUTEX_H__ */