Create S-EL1 OP-TEE SP deployment as log provider
Logging RPC calls are handled by the deployment and printed as OP-TEE
log messages.
Co-developed-by: Benedek Tomasik <benedek.tomasik@arm.com>
Signed-off-by: Benedek Tomasik <benedek.tomasik@arm.com>
Signed-off-by: Imre Kis <imre.kis@arm.com>
Change-Id: Ia2115a8fdf1608e02e976f73102324d088e2fd22
diff --git a/deployments/log/sel1_opteesp/sp_optee_log.c b/deployments/log/sel1_opteesp/sp_optee_log.c
new file mode 100644
index 0000000..18229e5
--- /dev/null
+++ b/deployments/log/sel1_opteesp/sp_optee_log.c
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ */
+
+#include "components/rpc/ffarpc/endpoint/sel1_sp/sel1_sp_ffarpc_call_ep.h"
+#include "components/service/log/provider/log_provider.h"
+#include <ffa.h>
+#include <kernel/pseudo_sp.h>
+#include <stdio.h>
+#include <trace.h>
+
+#define SP_NAME "log.psp"
+
+#define SP_LOG_UUID \
+ { \
+ 0xda9dffbd, 0xd590, 0x40ed, \
+ { \
+ 0x97, 0x5f, 0x19, 0xc6, 0x5a, 0x3d, 0x52, 0xd3 \
+ } \
+ }
+
+static void optee_log_puts(const char *str)
+{
+ trace_ext_puts(str);
+}
+
+static struct log_interface optee_log_interface = { .puts = optee_log_puts };
+
+static TEE_Result sp_log_main(uint32_t session_id)
+{
+ struct sp_session *s = sp_get_session(session_id);
+ struct thread_smc_args args = { 0 };
+ struct log_provider log_provider = { 0 };
+ struct rpc_interface *log_iface = NULL;
+ struct ffa_call_ep ffa_call_ep = { 0 };
+ uint16_t caller_id = 0;
+ uint16_t own_id = 0;
+
+ DMSG("SEL1 log SP init");
+
+ pseudo_sp_ffa(s, &args);
+
+ log_iface = log_provider_init(&log_provider, &optee_log_interface);
+ ffa_call_ep_init(&ffa_call_ep, log_iface);
+
+ while (true) {
+ caller_id = ((args.a1 >> 16) & 0xffff);
+ own_id = (args.a1 & 0xffff);
+
+ ffa_call_ep_receive(&ffa_call_ep, &args, &args);
+
+ args.a0 = FFA_MSG_SEND_DIRECT_RESP_32;
+ args.a1 = ((own_id) << 16) | caller_id;
+ args.a2 = 0x00;
+ args.a3 = 0x00; /* RC = 0 */
+ pseudo_sp_ffa(s, &args);
+ }
+
+ return TEE_SUCCESS;
+}
+
+pseudo_sp_register(.uuid = SP_LOG_UUID, .name = SP_NAME, .invoke_command_entry_point = sp_log_main);
diff --git a/deployments/log/sel1_opteesp/sub.mk b/deployments/log/sel1_opteesp/sub.mk
new file mode 100644
index 0000000..85e60e2
--- /dev/null
+++ b/deployments/log/sel1_opteesp/sub.mk
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2021, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+ts-root-dir := ../../../
+
+global-incdirs-y += $(ts-root-dir)
+global-incdirs-y += $(ts-root-dir)/components
+global-incdirs-y += $(ts-root-dir)/components/rpc/common/interface
+global-incdirs-y += $(ts-root-dir)/components/service/common/include/
+
+srcs-y += $(ts-root-dir)/components/rpc/ffarpc/endpoint/sel1_sp/sel1_sp_ffarpc_call_ep.c
+srcs-y += $(ts-root-dir)/components/service/common/provider/service_provider.c
+
+srcs-y += $(ts-root-dir)/components/service/log/provider/log_provider.c
+
+srcs-y += sp_optee_log.c