App: Create a dedicated mailbox thread

Create a dedicated mailbox thread to align with TF-M dual-cpu NS
mailbox new working model.
Update other NS mailbox APIs to align with TF-M changes.

Signed-off-by: David Hu <david.hu@arm.com>
Change-Id: I1eac4b84085b9e5a329cf82f7bf4e017fcf6062a
diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
index a98f856..aabdaed 100644
--- a/app/CMakeLists.txt
+++ b/app/CMakeLists.txt
@@ -37,6 +37,7 @@
         ${CMAKE_BINARY_DIR}/generated/interface/include
         ${INTERFACE_INC_DIR}/os_wrapper
         $<$<BOOL:${TFM_MULTI_CORE_TOPOLOGY}>:${INTERFACE_INC_DIR}/multi_core>
+        $<$<BOOL:${TFM_MULTI_CORE_TOPOLOGY}>:${CMAKE_SOURCE_DIR}/platform/ext/cmsis>
 )
 
 # PSA interface files are generated from a template
@@ -58,6 +59,7 @@
         $<$<BOOL:${TFM_NS_CLIENT_IDENTIFICATION}>:TFM_NS_CLIENT_IDENTIFICATION>
         $<$<BOOL:${TFM_MULTI_CORE_TOPOLOGY}>:TFM_MULTI_CORE_TOPOLOGY>
         $<$<BOOL:${TFM_MULTI_CORE_NS_OS}>:TFM_MULTI_CORE_NS_OS>
+        $<$<AND:$<BOOL:${TFM_MULTI_CORE_NS_OS_MAILBOX_THREAD}>,$<BOOL:${TFM_MULTI_CORE_NS_OS}>>:TFM_MULTI_CORE_NS_OS_MAILBOX_THREAD>
         $<$<BOOL:${FORWARD_PROT_MSG}>:FORWARD_PROT_MSG>
 )
 
@@ -82,10 +84,12 @@
 
     if (TFM_MULTI_CORE_TOPOLOGY)
         target_sources(tfm_api_ns PRIVATE
-            ${INTERFACE_SRC_DIR}/multi_core/tfm_ns_mailbox.c
             ${INTERFACE_SRC_DIR}/multi_core/tfm_multi_core_ns_api.c
             ${INTERFACE_SRC_DIR}/multi_core/tfm_multi_core_psa_ns_api.c
             $<$<BOOL:${TFM_MULTI_CORE_NS_OS}>:${INTERFACE_SRC_DIR}/multi_core/tfm_ns_mailbox_rtos_api.c>
+            $<$<NOT:$<BOOL:${TFM_MULTI_CORE_NS_OS_MAILBOX_THREAD}>>:${INTERFACE_SRC_DIR}/multi_core/tfm_ns_mailbox.c>
+            $<$<AND:$<BOOL:${TFM_MULTI_CORE_NS_OS}>,$<BOOL:${TFM_MULTI_CORE_NS_OS_MAILBOX_THREAD}>>:${INTERFACE_SRC_DIR}/multi_core/tfm_ns_mailbox_thread.c>
+            $<$<BOOL:${TEST_NS}>:${INTERFACE_SRC_DIR}/multi_core/tfm_ns_mailbox_test.c>
         )
     else()
         target_sources(tfm_api_ns PRIVATE
diff --git a/app/main_ns.c b/app/main_ns.c
index e153572..850b6a6 100644
--- a/app/main_ns.c
+++ b/app/main_ns.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2020, Arm Limited. All rights reserved.
+ * Copyright (c) 2017-2021, Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  *
@@ -71,6 +71,19 @@
 };
 #endif
 
+#ifdef TFM_MULTI_CORE_NS_OS_MAILBOX_THREAD
+static osThreadFunc_t mailbox_thread_func = tfm_ns_mailbox_thread_runner;
+/* 1KB stack */
+#define MAILBOX_THREAD_STACK_SIZE           (1u * 1024u)
+static uint64_t mailbox_thread_stack[MAILBOX_THREAD_STACK_SIZE /
+                                     sizeof(uint64_t)];
+static const osThreadAttr_t mailbox_thread_attr = {
+    .name = "mailbox_thread",
+    .stack_mem = mailbox_thread_stack,
+    .stack_size = sizeof(mailbox_thread_stack),
+};
+#endif
+
 /**
  * \brief Static globals to hold RTOS related quantities,
  *        main thread
@@ -163,6 +176,10 @@
     /* Initialize the TFM NS interface */
     tfm_ns_interface_init();
 
+#ifdef TFM_MULTI_CORE_NS_OS_MAILBOX_THREAD
+    (void) osThreadNew(mailbox_thread_func, NULL, &mailbox_thread_attr);
+#endif
+
 #if defined(TEST_FRAMEWORK_NS) || defined(TEST_FRAMEWORK_S)
     thread_func = test_app;
 #elif defined(PSA_API_TEST_NS)
diff --git a/test/suites/multi_core/non_secure/multi_core_ns_interface_testsuite.c b/test/suites/multi_core/non_secure/multi_core_ns_interface_testsuite.c
index 74f452a..be21695 100644
--- a/test/suites/multi_core/non_secure/multi_core_ns_interface_testsuite.c
+++ b/test/suites/multi_core/non_secure/multi_core_ns_interface_testsuite.c
@@ -122,7 +122,7 @@
     struct ns_mailbox_stats_res_t stats_res;
     struct test_params parent_params, params[NR_MULTI_CALL_CHILD];
 
-    tfm_ns_mailbox_tx_stats_init();
+    tfm_ns_mailbox_tx_stats_reinit();
 
     current_thread_handle = os_wrapper_thread_get_handle();
     if (!current_thread_handle) {