diff options
-rw-r--r-- | cmake/install.cmake | 3 | ||||
-rw-r--r-- | interface/include/tfm_multi_core_api.h | 32 | ||||
-rw-r--r-- | interface/include/tfm_ns_mailbox.h | 110 | ||||
-rw-r--r-- | interface/src/tfm_multi_core_api.c | 45 | ||||
-rw-r--r-- | interface/src/tfm_multi_core_ns_api.c | 20 | ||||
-rw-r--r-- | interface/src/tfm_ns_mailbox.c | 19 | ||||
-rw-r--r-- | interface/src/tfm_ns_mailbox_rtos_api.c | 62 | ||||
-rw-r--r-- | platform/ext/target/cypress/psoc64/mailbox/platform_ns_mailbox.c | 16 |
8 files changed, 172 insertions, 135 deletions
diff --git a/cmake/install.cmake b/cmake/install.cmake index dd1ffc80e1..cb7f100a80 100644 --- a/cmake/install.cmake +++ b/cmake/install.cmake @@ -113,8 +113,9 @@ endif() if (TFM_MULTI_CORE_TOPOLOGY) install(FILES ${INTERFACE_SRC_DIR}/tfm_ns_mailbox.c - ${INTERFACE_SRC_DIR}/tfm_multi_core_api.c + ${INTERFACE_SRC_DIR}/tfm_multi_core_ns_api.c ${INTERFACE_SRC_DIR}/tfm_multi_core_psa_ns_api.c + ${INTERFACE_SRC_DIR}/tfm_ns_mailbox_rtos_api.c DESTINATION ${INSTALL_INTERFACE_SRC_DIR}) else() install(FILES ${INTERFACE_SRC_DIR}/tfm_ns_interface.c diff --git a/interface/include/tfm_multi_core_api.h b/interface/include/tfm_multi_core_api.h index 908b1376cf..752cf963bb 100644 --- a/interface/include/tfm_multi_core_api.h +++ b/interface/include/tfm_multi_core_api.h @@ -14,8 +14,6 @@ extern "C" { #include <stdint.h> -#include "os_wrapper/common.h" - /** * \brief Called on the non-secure CPU. * Flags that the non-secure side has completed its initialization. @@ -38,36 +36,6 @@ int32_t tfm_ns_wait_for_s_cpu_ready(void); */ int32_t tfm_platform_ns_wait_for_s_cpu_ready(void); -#ifdef FORWARD_PROT_MSG -static inline uint32_t tfm_ns_multi_core_lock_acquire(void) -{ - return OS_WRAPPER_SUCCESS; -} - -static inline uint32_t tfm_ns_multi_core_lock_release(void) -{ - return OS_WRAPPER_SUCCESS; -} -#else /* FORWARD_PROT_MSG */ -/** - * \brief Acquire the multi-core lock for synchronizing PSA client call(s) - * The actual implementation depends on the use scenario. - * - * \return \ref OS_WRAPPER_SUCCESS on success - * \return \ref OS_WRAPPER_ERROR on error - */ -uint32_t tfm_ns_multi_core_lock_acquire(void); - -/** - * \brief Release the multi-core lock for synchronizing PSA client call(s) - * The actual implementation depends on the use scenario. - * - * \return \ref OS_WRAPPER_SUCCESS on success - * \return \ref OS_WRAPPER_ERROR on error - */ -uint32_t tfm_ns_multi_core_lock_release(void); -#endif /* FORWARD_PROT_MSG */ - #ifdef __cplusplus } #endif diff --git a/interface/include/tfm_ns_mailbox.h b/interface/include/tfm_ns_mailbox.h index bdca18c99e..a2902d6ab5 100644 --- a/interface/include/tfm_ns_mailbox.h +++ b/interface/include/tfm_ns_mailbox.h @@ -64,26 +64,6 @@ int32_t tfm_ns_mailbox_client_call(uint32_t call_type, int32_t client_id, int32_t *reply); -#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 Wake up the owner task of the first replied mailbox message in the * NSPE mailbox queue. @@ -152,38 +132,102 @@ void tfm_ns_mailbox_hal_enter_critical_isr(void); */ void tfm_ns_mailbox_hal_exit_critical_isr(void); +#ifdef FORWARD_PROT_MSG +static inline int32_t tfm_ns_mailbox_os_lock_init(void) +{ + return MAILBOX_SUCCESS; +} + +static inline uint32_t tfm_ns_mailbox_os_lock_acquire(void) +{ + return MAILBOX_SUCCESS; +} + +static inline uint32_t tfm_ns_mailbox_os_lock_release(void) +{ + return MAILBOX_SUCCESS; +} +#else /* FORWARD_PROT_MSG */ +/** + * \brief Initialize the multi-core lock for synchronizing PSA client call(s) + * The actual implementation depends on the non-secure use scenario. + * + * \return \ref MAILBOX_SUCCESS on success + * \return \ref MAILBOX_GENERIC_ERROR on error + */ +int32_t tfm_ns_mailbox_os_lock_init(void); + +/** + * \brief Acquire the multi-core lock for synchronizing PSA client call(s) + * The actual implementation depends on the non-secure use scenario. + * + * \return \ref MAILBOX_SUCCESS on success + * \return \ref MAILBOX_GENERIC_ERROR on error + */ +int32_t tfm_ns_mailbox_os_lock_acquire(void); + +/** + * \brief Release the multi-core lock for synchronizing PSA client call(s) + * The actual implementation depends on the non-secure use scenario. + * + * \return \ref MAILBOX_SUCCESS on success + * \return \ref MAILBOX_GENERIC_ERROR on error + */ +int32_t tfm_ns_mailbox_os_lock_release(void); +#endif /* FORWARD_PROT_MSG */ + #ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL /** - * \brief Performs platform and NS OS specific waiting mechanism to wait for + * \brief Get the handle of the current non-secure task executing mailbox + * functionalities + * + * \note This function should be implemented according to 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_os_get_task_handle(void); + +/** + * \brief Performs use scenario 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 according to use scenario. + * \note This function is implemented by NS OS specific waiting mechanism + * according to use scenario. * * \param[in] handle The handle of mailbox message. */ -void tfm_ns_mailbox_hal_wait_reply(mailbox_msg_handle_t handle); +void tfm_ns_mailbox_os_wait_reply(mailbox_msg_handle_t handle); /* - * \brief Performs platform and NS OS specific mechanism in a mailbox IRQ + * \brief Performs use scenario and NS OS specific mechanism in a mailbox IRQ * handler, to wake up a sleeping task which is waiting for its mailbox * message reply. * - * \note The underlying platform and NS OS specific function called inside this - * function should be able to work in an IRQ handler. + * \note The underlying NS OS specific function called inside this function + * should be able to work in an IRQ handler. * - * \note This function is implemented by platform and NS OS specific waiting + * \note This function is implemented by NS OS specific waiting * mechanism according to use scenario. * * \param[in] task_handle The handle to the task to be woken up. * \param[in] handle The mailbox handle which can be used as thread * flag. */ -void tfm_ns_mailbox_hal_wake_task_isr(const void *task_handle, - mailbox_msg_handle_t handle); -#else -#define tfm_ns_mailbox_hal_wait_reply(handle) do {} while (0) -#endif +void tfm_ns_mailbox_os_wake_task_isr(const void *task_handle, + mailbox_msg_handle_t handle); +#else /* TFM_MULTI_CORE_MULTI_CLIENT_CALL */ +#define tfm_ns_mailbox_os_wait_reply(handle) do {} while (0) + +static inline const void *tfm_ns_mailbox_os_get_task_handle(void) +{ + return NULL; +} + +#define tfm_ns_mailbox_os_wake_task_isr(task, handle) do {} while (0) +#endif /* TFM_MULTI_CORE_MULTI_CLIENT_CALL */ #ifdef TFM_MULTI_CORE_TEST /** diff --git a/interface/src/tfm_multi_core_api.c b/interface/src/tfm_multi_core_api.c deleted file mode 100644 index c3deb50da7..0000000000 --- a/interface/src/tfm_multi_core_api.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2019, Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - * - */ - -#include "os_wrapper/semaphore.h" - -#include "tfm_api.h" -#include "tfm_mailbox.h" -#include "tfm_multi_core_api.h" - -#define MAX_SEMAPHORE_COUNT NUM_MAILBOX_QUEUE_SLOT - -static void *ns_lock_handle = NULL; - -__attribute__((weak)) -enum tfm_status_e tfm_ns_interface_init(void) -{ - ns_lock_handle = os_wrapper_semaphore_create(MAX_SEMAPHORE_COUNT, - MAX_SEMAPHORE_COUNT, - NULL); - if (!ns_lock_handle) { - return TFM_ERROR_GENERIC; - } - - return TFM_SUCCESS; -} - -int32_t tfm_ns_wait_for_s_cpu_ready(void) -{ - return tfm_platform_ns_wait_for_s_cpu_ready(); -} - -uint32_t tfm_ns_multi_core_lock_acquire(void) -{ - return os_wrapper_semaphore_acquire(ns_lock_handle, - OS_WRAPPER_WAIT_FOREVER); -} - -uint32_t tfm_ns_multi_core_lock_release(void) -{ - return os_wrapper_semaphore_release(ns_lock_handle); -} diff --git a/interface/src/tfm_multi_core_ns_api.c b/interface/src/tfm_multi_core_ns_api.c new file mode 100644 index 0000000000..ce9233c65f --- /dev/null +++ b/interface/src/tfm_multi_core_ns_api.c @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2019-2021, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include "tfm_api.h" +#include "tfm_multi_core_api.h" + +__attribute__((weak)) +enum tfm_status_e tfm_ns_interface_init(void) +{ + return TFM_SUCCESS; +} + +int32_t tfm_ns_wait_for_s_cpu_ready(void) +{ + return tfm_platform_ns_wait_for_s_cpu_ready(); +} diff --git a/interface/src/tfm_ns_mailbox.c b/interface/src/tfm_ns_mailbox.c index 4e44fae8d6..b256fa2027 100644 --- a/interface/src/tfm_ns_mailbox.c +++ b/interface/src/tfm_ns_mailbox.c @@ -8,8 +8,6 @@ #include <string.h> #include "cmsis_compiler.h" -#include "os_wrapper/common.h" -#include "tfm_multi_core_api.h" #include "tfm_ns_mailbox.h" /* The pointer to NSPE mailbox queue */ @@ -234,7 +232,7 @@ static int32_t mailbox_tx_client_req(uint32_t call_type, * Fetch the current task handle. The task will be woken up according the * handle value set in the owner field. */ - task_handle = tfm_ns_mailbox_get_task_handle(); + task_handle = tfm_ns_mailbox_os_get_task_handle(); set_msg_owner(idx, task_handle); get_mailbox_msg_handle(idx, handle); @@ -297,7 +295,7 @@ int32_t tfm_ns_mailbox_client_call(uint32_t call_type, return MAILBOX_INVAL_PARAMS; } - if (tfm_ns_multi_core_lock_acquire() != OS_WRAPPER_SUCCESS) { + if (tfm_ns_mailbox_os_lock_acquire() != MAILBOX_SUCCESS) { return MAILBOX_QUEUE_FULL; } @@ -316,7 +314,7 @@ int32_t tfm_ns_mailbox_client_call(uint32_t call_type, } exit: - if (tfm_ns_multi_core_lock_release() != OS_WRAPPER_SUCCESS) { + if (tfm_ns_mailbox_os_lock_release() != MAILBOX_SUCCESS) { return MAILBOX_GENERIC_ERROR; } @@ -365,8 +363,8 @@ int32_t tfm_ns_mailbox_wake_reply_owner_isr(void) return ret; } - tfm_ns_mailbox_hal_wake_task_isr(mailbox_queue_ptr->queue[idx].owner, - handle); + tfm_ns_mailbox_os_wake_task_isr(mailbox_queue_ptr->queue[idx].owner, + handle); return MAILBOX_SUCCESS; } @@ -397,6 +395,11 @@ int32_t tfm_ns_mailbox_init(struct ns_mailbox_queue_t *queue) /* Platform specific initialization. */ ret = tfm_ns_mailbox_hal_init(queue); + if (ret != MAILBOX_SUCCESS) { + return ret; + } + + ret = tfm_ns_mailbox_os_lock_init(); #ifdef TFM_MULTI_CORE_TEST tfm_ns_mailbox_tx_stats_init(); @@ -420,7 +423,7 @@ static int32_t mailbox_wait_reply(mailbox_msg_handle_t handle) } while (1) { - tfm_ns_mailbox_hal_wait_reply(handle); + tfm_ns_mailbox_os_wait_reply(handle); /* * Woken up from sleep diff --git a/interface/src/tfm_ns_mailbox_rtos_api.c b/interface/src/tfm_ns_mailbox_rtos_api.c new file mode 100644 index 0000000000..1e9e8d2dda --- /dev/null +++ b/interface/src/tfm_ns_mailbox_rtos_api.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020-2021, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +/* + * This file is a reference implementation of Non-secure mailbox RTOS API. + * This reference implementation is based on TF-M ROTS wrapper API. + * It can be replaced by RTOS specific implementation. + */ + +#include "os_wrapper/semaphore.h" +#include "os_wrapper/thread.h" + +#include "tfm_ns_mailbox.h" + +#define MAX_SEMAPHORE_COUNT NUM_MAILBOX_QUEUE_SLOT + +static void *ns_lock_handle = NULL; + +#ifdef TFM_MULTI_CORE_MULTI_CLIENT_CALL +const void *tfm_ns_mailbox_os_get_task_handle(void) +{ + return os_wrapper_thread_get_handle(); +} + +void tfm_ns_mailbox_os_wait_reply(mailbox_msg_handle_t handle) +{ + os_wrapper_thread_wait_flag((uint32_t)handle, OS_WRAPPER_WAIT_FOREVER); +} + +void tfm_ns_mailbox_os_wake_task_isr(const void *task_handle, + mailbox_msg_handle_t handle) +{ + os_wrapper_thread_set_flag_isr((void *)task_handle, (uint32_t)handle); +} +#endif /* TFM_MULTI_CORE_MULTI_CLIENT_CALL */ + +int32_t tfm_ns_mailbox_os_lock_init(void) +{ + ns_lock_handle = os_wrapper_semaphore_create(MAX_SEMAPHORE_COUNT, + MAX_SEMAPHORE_COUNT, + NULL); + if (!ns_lock_handle) { + return MAILBOX_GENERIC_ERROR; + } + + return MAILBOX_SUCCESS; +} + +int32_t tfm_ns_mailbox_os_lock_acquire(void) +{ + return os_wrapper_semaphore_acquire(ns_lock_handle, + OS_WRAPPER_WAIT_FOREVER); +} + +int32_t tfm_ns_mailbox_os_lock_release(void) +{ + return os_wrapper_semaphore_release(ns_lock_handle); +} diff --git a/platform/ext/target/cypress/psoc64/mailbox/platform_ns_mailbox.c b/platform/ext/target/cypress/psoc64/mailbox/platform_ns_mailbox.c index 6a616e0530..23b1b3715a 100644 --- a/platform/ext/target/cypress/psoc64/mailbox/platform_ns_mailbox.c +++ b/platform/ext/target/cypress/psoc64/mailbox/platform_ns_mailbox.c @@ -98,22 +98,6 @@ int32_t tfm_ns_mailbox_hal_init(struct ns_mailbox_queue_t *queue) return MAILBOX_SUCCESS; } -const void *tfm_ns_mailbox_get_task_handle(void) -{ - return os_wrapper_thread_get_handle(); -} - -void tfm_ns_mailbox_hal_wait_reply(mailbox_msg_handle_t handle) -{ - os_wrapper_thread_wait_flag((uint32_t)handle, OS_WRAPPER_WAIT_FOREVER); -} - -void tfm_ns_mailbox_hal_wake_task_isr(const void *task_handle, - mailbox_msg_handle_t handle) -{ - os_wrapper_thread_set_flag_isr((void *)task_handle, (uint32_t)handle); -} - void tfm_ns_mailbox_hal_enter_critical(void) { saved_irq_state = Cy_SysLib_EnterCriticalSection(); |