Add log factory component

Add component for creating client instance for logging through RPC
calls from SPs.

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: I2aee17541d8bf809e0552b078eef20fded74b593
diff --git a/components/service/log/factory/component.cmake b/components/service/log/factory/component.cmake
new file mode 100644
index 0000000..372cd4d
--- /dev/null
+++ b/components/service/log/factory/component.cmake
@@ -0,0 +1,19 @@
+#-------------------------------------------------------------------------------
+# Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-------------------------------------------------------------------------------
+if (NOT DEFINED TGT)
+	message(FATAL_ERROR "mandatory parameter TGT is not defined.")
+endif()
+
+target_sources(${TGT} PRIVATE
+	"${CMAKE_CURRENT_LIST_DIR}/log_factory.c"
+	)
+
+
+target_include_directories(${TGT}
+	 PRIVATE
+		"${CMAKE_CURRENT_LIST_DIR}"
+	)
diff --git a/components/service/log/factory/log_factory.c b/components/service/log/factory/log_factory.c
new file mode 100644
index 0000000..14fcad5
--- /dev/null
+++ b/components/service/log/factory/log_factory.c
@@ -0,0 +1,59 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ */
+
+#include "protocols/rpc/common/packed-c/status.h"
+#include "rpc/ffarpc/caller/sp/ffarpc_caller.h"
+#include "service/log/client/log_client.h"
+#include <stdbool.h>
+#include <stddef.h>
+
+#define OPTEE_LOG_UUID_BYTES                                                                       \
+	{                                                                                          \
+		0xda, 0x9d, 0xff, 0xbd, 0xd5, 0x90, 0x40, 0xed, 0x97, 0x5f, 0x19, 0xc6, 0x5a,      \
+			0x3d, 0x52, 0xd3                                                           \
+	}
+
+static const uint8_t optee_log_uuid[] = OPTEE_LOG_UUID_BYTES;
+
+struct log_backend {
+	struct ffarpc_caller ffarpc_caller;
+	bool in_use;
+};
+
+static struct log_backend backend_instance = { .in_use = false };
+
+struct log_backend *log_factory_create(void)
+{
+	struct rpc_caller *log_caller = NULL;
+	uint16_t log_sp_id = 0;
+	struct log_backend *new_backend = &backend_instance;
+
+	if (new_backend->in_use)
+		return new_backend;
+
+	log_caller = ffarpc_caller_init(&new_backend->ffarpc_caller);
+
+	if (ffarpc_caller_discover(optee_log_uuid, &log_sp_id, 1))
+		if (ffarpc_caller_open(&new_backend->ffarpc_caller, log_sp_id, 0) == 0) {
+			log_client_init(log_caller);
+			new_backend->in_use = true;
+		}
+
+	/* Failed to discover or open an RPC session with provider */
+	if (!new_backend->in_use) {
+		ffarpc_caller_deinit(&new_backend->ffarpc_caller);
+		return NULL;
+	}
+
+	return new_backend;
+}
+
+void log_factory_destroy(struct log_backend *backend)
+{
+	if (backend) {
+		ffarpc_caller_deinit(&backend_instance.ffarpc_caller);
+		backend_instance.in_use = false;
+	}
+}
diff --git a/components/service/log/factory/log_factory.h b/components/service/log/factory/log_factory.h
new file mode 100644
index 0000000..f4d22d1
--- /dev/null
+++ b/components/service/log/factory/log_factory.h
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ */
+
+#ifndef LOG_FACTORY_H
+#define LOG_FACTORY_H
+
+#include "components/rpc/common/interface/rpc_caller.h"
+#include "components/service/log/common/log_status.h"
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct log_backend;
+
+struct log_backend *log_factory_create(void);
+void log_factory_destroy(struct log_backend *backend);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LOG_FACTORY_H */