Interface: Make the NS interface functions common

This patch implements common TF-M NS interface functions defined in
tfm_ns_interface.h, by calling the os_wrapper APIs.
With this change, the NSPE does not need to implement the TF-M NS
interface functions but only the os_wrapper APIs.
Still NSPE can overwrite the whole TF-M NS interface functions to
fulfill their special requirements.

Change-Id: Ifec47b99d6cba73acd94cfc0fde584f08333ab3c
Signed-off-by: Kevin Peng <kevin.peng@arm.com>
diff --git a/interface/src/tfm_ns_interface.c b/interface/src/tfm_ns_interface.c
new file mode 100644
index 0000000..916af19
--- /dev/null
+++ b/interface/src/tfm_ns_interface.c
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2017-2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "os_wrapper.h"
+
+#include "tfm_api.h"
+#include "tfm_ns_interface.h"
+
+/**
+ * \brief the ns_lock ID
+ */
+static uint32_t ns_lock_id = (uint32_t)NULL;
+
+__attribute__((weak))
+int32_t tfm_ns_interface_dispatch(veneer_fn fn,
+                                  uint32_t arg0, uint32_t arg1,
+                                  uint32_t arg2, uint32_t arg3)
+{
+    int32_t result;
+
+    /* TFM request protected by NS lock */
+    if (os_wrapper_mutex_acquire(ns_lock_id, OS_WRAPPER_WAIT_FOREVER)
+            != OS_WRAPPER_SUCCESS) {
+        return (int32_t)TFM_ERROR_GENERIC;
+    }
+
+    result = fn(arg0, arg1, arg2, arg3);
+
+    if (os_wrapper_mutex_release(ns_lock_id) != OS_WRAPPER_SUCCESS) {
+        return (int32_t)TFM_ERROR_GENERIC;
+    }
+
+    return result;
+}
+
+__attribute__((weak))
+enum tfm_status_e tfm_ns_interface_init(void)
+{
+    uint32_t id;
+
+    id = os_wrapper_mutex_create();
+    if (id == OS_WRAPPER_ERROR) {
+        return TFM_ERROR_GENERIC;
+    }
+
+    ns_lock_id = id;
+    return TFM_SUCCESS;
+}