Twincpu: Add multi-core topology mailbox data types and APIs

Add NSPE and SPE data types, NSPE mailbox APIs and SPE mailbox APIs
declarations.
The implementations are based on design document [1].

[1]: https://developer.trustedfirmware.org/w/tf_m/design/twin-cpu/general_mailbox_design/

Change-Id: I4678ec669a8054a8834faecbd9be0397f04f5812
Signed-off-by: David Hu <david.hu@arm.com>
diff --git a/interface/include/tfm_mailbox.h b/interface/include/tfm_mailbox.h
new file mode 100644
index 0000000..f6bdae4
--- /dev/null
+++ b/interface/include/tfm_mailbox.h
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2019, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+/*
+ * This is header file of common mailbox objects shared by NSPE and SPE.
+ * Please refer to tfm_ns_mailbox.h for the definitions only used in NSPE
+ * mailbox library.
+ * Please refer to tfm_spe_mailbox.h for the SPE specific definitions and APIs.
+ */
+
+#ifndef __TFM_MAILBOX_H__
+#define __TFM_MAILBOX_H__
+
+#include <stdint.h>
+#include <stddef.h>
+#include "psa/client.h"
+
+/*
+ * The number of slots in NSPE mailbox queue and SPE mailbox queue.
+ * So far only one slot is supported in either NSPE mailbox queue or
+ * SPE mailbox queue.
+ */
+#define NUM_MAILBOX_QUEUE_SLOT              (1)
+
+/* PSA client call type value */
+#define MAILBOX_PSA_FRAMEWORK_VERSION       (0x1)
+#define MAILBOX_PSA_VERSION                 (0x2)
+#define MAILBOX_PSA_CONNECT                 (0x3)
+#define MAILBOX_PSA_CALL                    (0x4)
+#define MAILBOX_PSA_CLOSE                   (0x5)
+
+/* Return code of mailbox APIs */
+#define MAILBOX_SUCCESS                     (0)
+#define MAILBOX_QUEUE_FULL                  (INT32_MIN + 1)
+#define MAILBOX_INVAL_PARAMS                (INT32_MIN + 2)
+#define MAILBOX_NO_PERMS                    (INT32_MIN + 3)
+#define MAILBOX_NO_PEND_EVENT               (INT32_MIN + 4)
+#define MAILBOX_CHAN_BUSY                   (INT32_MIN + 5)
+#define MAILBOX_CALLBACK_REG_ERROR          (INT32_MIN + 6)
+#define MAILBOX_INIT_ERROR                  (INT32_MIN + 7)
+
+/*
+ * This structure holds the parameters used in a PSA client call.
+ */
+struct psa_client_params_t {
+    union {
+        struct {
+            uint32_t        sid;
+        } psa_version_params;
+
+        struct {
+            uint32_t        sid;
+            uint32_t        minor_version;
+        } psa_connect_params;
+
+        struct {
+            psa_handle_t    handle;
+            int32_t         type;
+            const psa_invec *in_vec;
+            size_t          in_len;
+            psa_outvec      *out_vec;
+            size_t          out_len;
+        } psa_call_params;
+
+        struct {
+            psa_handle_t    handle;
+        } psa_close_params;
+    };
+};
+
+/* Mailbox message passed from NSPE to SPE to deliver a PSA client call */
+struct mailbox_msg_t {
+    uint32_t                    call_type; /* PSA client call type */
+    struct psa_client_params_t  params;    /* Contain parameters used in PSA
+                                            * client call
+                                            */
+
+    int32_t                     client_id; /* Optional client ID of the
+                                            * non-secure caller.
+                                            * It is required to identify the
+                                            * non-secure task when NSPE OS
+                                            * enforces non-secure task isolation
+                                            */
+};
+
+/* A handle to a mailbox message in use */
+typedef int32_t    mailbox_msg_handle_t;
+
+#define MAILBOX_MSG_NULL_HANDLE          ((mailbox_msg_handle_t)0)
+
+/*
+ * Mailbox reply structure in non-secure memory
+ * to hold the PSA client call return result from SPE
+ */
+struct mailbox_reply_t {
+    int32_t return_val;
+};
+
+/* A single slot structure in NSPE mailbox queue */
+struct ns_mailbox_slot_t {
+    struct mailbox_msg_t   msg;
+    struct mailbox_reply_t reply;
+
+    void                   *owner;     /* Identification of the owner of this
+                                        * slot
+                                        */
+};
+
+typedef uint32_t   mailbox_queue_status_t;
+
+/* NSPE mailbox queue */
+struct ns_mailbox_queue_t {
+    mailbox_queue_status_t   empty_slots;       /* Bitmask of empty slots */
+    mailbox_queue_status_t   pend_slots;        /* Bitmask of slots pending
+                                                 * for SPE handling
+                                                 */
+    mailbox_queue_status_t   replied_slots;     /* Bitmask of active slots
+                                                 * containing PSA client call
+                                                 * return result
+                                                 */
+
+    struct ns_mailbox_slot_t queue[NUM_MAILBOX_QUEUE_SLOT];
+};
+
+#endif /* __TFM_MAILBOX_H__ */