blob: ba902aa97740ef5e18c65329fc42f949726c1b50 [file] [log] [blame]
/*
* Copyright (c) 2019-2020, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
/* Data types and API definitions in NSPE mailbox library */
#ifndef __TFM_NS_MAILBOX_H__
#define __TFM_NS_MAILBOX_H__
#include <stdbool.h>
#include <stdint.h>
#include "tfm_mailbox.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifdef TFM_MULTI_CORE_TEST
/**
* \brief The structure to hold the statistics result of NSPE mailbox
*/
struct ns_mailbox_stats_res_t {
uint8_t avg_nr_slots; /* The value before the decimal point
* in the average number of NSPE
* mailbox slots in use.
*/
uint8_t avg_nr_slots_tenths; /* The first digit value after the
* decimal point in the average
* number of NSPE mailbox slots in use.
*/
};
#endif
/**
* \brief Prepare and send PSA client request to SPE via mailbox.
*
* \param[in] call_type PSA client call type
* \param[in] params Parmaters used for PSA client call
* \param[in] client_id Optional client ID of non-secure caller.
* It is required to identify the non-secure caller
* when NSPE OS enforces non-secure task isolation.
*
* \retval >= 0 The handle to the mailbox message assigned.
* \retval < 0 Operation failed with an error code.
*/
mailbox_msg_handle_t tfm_ns_mailbox_tx_client_req(uint32_t call_type,
const struct psa_client_params_t *params,
int32_t client_id);
/**
* \brief Fetch PSA client return result.
*
* \param[in] handle The handle to the mailbox message
* \param[out] reply The address to be written with return result.
*
* \retval MAILBOX_SUCCESS Successfully get PSA client call return result.
* \retval Other return code Operation failed with an error code.
*/
int32_t tfm_ns_mailbox_rx_client_reply(mailbox_msg_handle_t handle,
int32_t *reply);
/**
* \brief Check whether a specific mailbox message has been replied.
*
* \param[in] handle The handle to the mailbox message
*
* \retval true The PSA client call return value is replied.
* \retval false The PSA client call return value is not
* replied yet.
*/
bool tfm_ns_mailbox_is_msg_replied(mailbox_msg_handle_t handle);
/**
* \brief NSPE mailbox initialization
*
* \param[in] queue The base address of NSPE mailbox queue to be
* initialized.
*
* \retval MAILBOX_SUCCESS Operation succeeded.
* \retval Other return code Operation failed with an error code.
*/
int32_t tfm_ns_mailbox_init(struct ns_mailbox_queue_t *queue);
#ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL
/**
* \brief Get the handle of the current non-secure task executing mailbox
* functionalities
*
* \note This function should be implemented according to platform, NS OS
* and actual use scenario.
* This function can be ignored or return NULL if sleep/wake-up mechanism
* is not required in PSA Client API implementation.
*
* \return Return the handle of task.
*/
const void *tfm_ns_mailbox_get_task_handle(void);
#else
static inline const void *tfm_ns_mailbox_get_task_handle(void)
{
return NULL;
}
#endif
/**
* \brief Fetch the handle to the first replied mailbox message in the NSPE
* mailbox queue.
* This function is intended to be called inside platform specific
* notification IRQ handler.
*
* \note The replied status of the fetched mailbox message will be cleaned after
* the message is fetched. When this function is called again, it fetches
* the next replied mailbox message from the NSPE mailbox queue.
*
* \return Return the handle to the first replied mailbox message in the
* queue.
* Return \ref MAILBOX_MSG_NULL_HANDLE if no mailbox message is replied.
*/
mailbox_msg_handle_t tfm_ns_mailbox_fetch_reply_msg_isr(void);
/**
* \brief Return the handle of owner task of a mailbox message according to the
* \ref mailbox_msg_handle_t
*
* \param[in] handle The handle of mailbox message.
*
* \return Return the handle value of the owner task.
*/
const void *tfm_ns_mailbox_get_msg_owner(mailbox_msg_handle_t handle);
#ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL
/**
* \brief Wait for the reply returned from SPE to the mailbox message specified
* by handle
*
* \param[in] handle The handle of mailbox message.
*
* \retval MAILBOX_SUCCESS Return from waiting successfully.
* \retval Other return code Failed to wait with an error code.
*/
int32_t tfm_ns_mailbox_wait_reply(mailbox_msg_handle_t handle);
#endif
/**
* \brief Platform specific NSPE mailbox initialization.
* Invoked by \ref tfm_ns_mailbox_init().
*
* \param[in] queue The base address of NSPE mailbox queue to be
* initialized.
*
* \retval MAILBOX_SUCCESS Operation succeeded.
* \retval Other return code Operation failed with an error code.
*/
int32_t tfm_ns_mailbox_hal_init(struct ns_mailbox_queue_t *queue);
/**
* \brief Notify SPE to deal with the PSA client call sent via mailbox
*
* \note The implementation depends on platform specific hardware and use case.
*
* \retval MAILBOX_SUCCESS Operation succeeded.
* \retval Other return code Operation failed with an error code.
*/
int32_t tfm_ns_mailbox_hal_notify_peer(void);
/**
* \brief Enter critical section of NSPE mailbox.
*
* \note The implementation depends on platform specific hardware and use case.
*/
void tfm_ns_mailbox_hal_enter_critical(void);
/**
* \brief Exit critical section of NSPE mailbox.
*
* \note The implementation depends on platform specific hardware and use case.
*/
void tfm_ns_mailbox_hal_exit_critical(void);
/**
* \brief Enter critical section of NSPE mailbox in IRQ handler.
*
* \note The implementation depends on platform specific hardware and use case.
*/
void tfm_ns_mailbox_hal_enter_critical_isr(void);
/**
* \brief Enter critical section of NSPE mailbox in IRQ handler
*
* \note The implementation depends on platform specific hardware and use case.
*/
void tfm_ns_mailbox_hal_exit_critical_isr(void);
#ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL
/**
* \brief Performs platform and NS OS specific waiting mechanism to wait for
* the reply of the specified mailbox message to be returned from SPE.
*
* \note This function is implemented by platform and NS OS specific waiting
* mechanism accroding to use scenario.
*
* \param[in] handle The handle of mailbox message.
*/
void tfm_ns_mailbox_hal_wait_reply(mailbox_msg_handle_t handle);
#endif
#ifdef TFM_MULTI_CORE_TEST
/**
* \brief Initialize the statistics module in TF-M NSPE mailbox.
*
* \note This function is only available when multi-core tests are enabled.
*/
void tfm_ns_mailbox_tx_stats_init(void);
/**
* \brief Calculate the average number of used NS mailbox queue slots each time
* NS task requires a queue slot to submit mailbox message, which is
* recorded in NS mailbox statisitics module.
*
* \note This function is only available when multi-core tests are enabled.
*
* \param[in] stats_res The buffer to be written with
* \ref ns_mailbox_stats_res_t.
*
* \return Return the calculation result.
*/
void tfm_ns_mailbox_stats_avg_slot(struct ns_mailbox_stats_res_t *stats_res);
#endif
#ifdef __cplusplus
}
#endif
#endif /* __TFM_NS_MAILBOX_H__ */