Remove OP-TEE dependency on trace functions

Introducing a custom trace component which replaces the one that comes
from the SP dev kit. The new component provides the same DMSG, IMSG,
EMSG macros for printing trace messages with different levels.

Signed-off-by: Imre Kis <imre.kis@arm.com>
Change-Id: I5f9466c5a32fefeb9ef350b179dc22ee33324f7e
diff --git a/components/common/trace/trace.c b/components/common/trace/trace.c
new file mode 100644
index 0000000..bc7f0a9
--- /dev/null
+++ b/components/common/trace/trace.c
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ */
+
+#include "trace.h"
+#include <stdarg.h>
+#include <stdio.h>
+
+#if TRACE_LEVEL >= TRACE_LEVEL_ERROR
+#ifndef TRACE_PREFIX
+#error TRACE_PREFIX must be defined
+#endif /* TRACE_PREFIX */
+
+void trace_printf(const char *func, int line, int level, const char *fmt, ...)
+{
+	char buffer[256];
+	char level_char = 0;
+	int offset = 0;
+	va_list ap;
+	static const char levels[] = {'E', 'I', 'D'};
+
+	if (TRACE_LEVEL_ERROR <= level && TRACE_LEVEL_DEBUG >= level)
+		level_char = levels[level - TRACE_LEVEL_ERROR];
+	else
+		level_char = '?';
+
+	offset = snprintf(buffer, sizeof(buffer), "%c/" TRACE_PREFIX ": %s:%d ",
+			  level_char, func, line);
+
+	if (offset < sizeof(buffer)) {
+		va_start(ap, fmt);
+		vsnprintf(buffer + offset, sizeof(buffer) - offset, fmt, ap);
+		va_end(ap);
+	}
+
+	trace_puts(buffer);
+}
+#endif