SPM: Introduce SPRT C client library

Change-Id: I2f110b4d06d2821d8bdf818ab7523a5c0a6b9ab9
Signed-off-by: Antonio Nino Diaz <antonio.ninodiaz@arm.com>
diff --git a/lib/sprt/sprt_client.c b/lib/sprt/sprt_client.c
new file mode 100644
index 0000000..41f5307
--- /dev/null
+++ b/lib/sprt/sprt_client.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2018, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <sprt_svc.h>
+#include <stddef.h>
+
+#include "sprt_client.h"
+#include "sprt_client_private.h"
+#include "sprt_common.h"
+#include "sprt_queue.h"
+
+uint32_t sprt_version(void)
+{
+	struct svc_args args;
+
+	args.arg0 = SPRT_VERSION;
+
+	return sprt_client_svc(&args);
+}
+
+void sprt_wait_for_messages(void)
+{
+	struct svc_args args;
+
+	args.arg0 = SPRT_YIELD_AARCH64;
+
+	sprt_client_svc(&args);
+}
+
+/*
+ * Variable that points to the memory buffer that contains the queues used by
+ * this Secure Partition.
+ */
+static void *queue_messages;
+
+void sprt_initialize_queues(void *buffer_base)
+{
+	queue_messages = buffer_base;
+}
+
+int sprt_get_next_message(struct sprt_queue_entry_message *message,
+			  int queue_num)
+{
+	struct sprt_queue *q = queue_messages;
+
+	while (queue_num-- > 0) {
+		uintptr_t next_addr = (uintptr_t)q + sizeof(struct sprt_queue) +
+				      q->entry_num * q->entry_size;
+		q = (struct sprt_queue *) next_addr;
+	}
+
+	return sprt_queue_pop(q, message);
+}
+
+void sprt_message_end(struct sprt_queue_entry_message *message,
+		      u_register_t arg0, u_register_t arg1, u_register_t arg2,
+		      u_register_t arg3)
+{
+	struct svc_args args;
+
+	if (message->type == SPRT_MSG_TYPE_SERVICE_REQUEST) {
+		args.arg0 = SPRT_PUT_RESPONSE_AARCH64;
+		args.arg1 = message->token;
+	}
+
+	args.arg2 = arg0;
+	args.arg3 = arg1;
+	args.arg4 = arg2;
+	args.arg5 = arg3;
+	args.arg6 = ((uint32_t)message->service_handle << 16U)
+		  | message->client_id;
+	args.arg7 = message->session_id;
+
+	sprt_client_svc(&args);
+}