[Sound-open-firmware] [PATCH] [RFC]rmbox: include trace class definitions from trace header

Ranjani Sridharan ranjani.sridharan at linux.intel.com
Mon May 14 18:17:50 CEST 2018


Remove hard-coded trace class definitions from rmbox and use sof
trace header instead. This makes it easier to keep track of any new
trace class definitions.

This introduces a dependency on the sof headers being pre-installed
before building rmbox.

Signed-off-by: Ranjani Sridharan <ranjani.sridharan at linux.intel.com>
Signed-off-by: Yan Wang <yan.wang at linux.intel.com>
---
 rmbox/Makefile.am |  20 +++++-
 rmbox/rmbox.c     | 171 +++++++++++++++++++++++++++-------------------
 2 files changed, 121 insertions(+), 70 deletions(-)

diff --git a/rmbox/Makefile.am b/rmbox/Makefile.am
index bfeb184..9763361 100644
--- a/rmbox/Makefile.am
+++ b/rmbox/Makefile.am
@@ -1,4 +1,22 @@
+SOF_INC = $(prefix)/include/sof
+SOF_INC_NEW := $(subst /,_,$(SOF_INC))
+START_OLD =_binary_$(SOF_INC_NEW)_sof_trace_h_start
+END_OLD =_binary_$(SOF_INC_NEW)_sof_trace_h_end
+
 bin_PROGRAMS = rmbox
 
 rmbox_SOURCES = \
-	rmbox.c
\ No newline at end of file
+	rmbox.c
+
+rmbox_CFLAGS = \
+	-I $(SOF_INC)
+
+rmbox_LDADD = \
+	trace.o
+
+trace.o:
+	objcopy --input binary --output elf64-x86-64 \
+	--binary-architecture i386:x86-64 \
+	$(SOF_INC)/sof/trace.h trace.o
+	objcopy --redefine-sym $(START_OLD)=_trace_start trace.o
+	objcopy --redefine-sym $(END_OLD)=_trace_end trace.o
diff --git a/rmbox/rmbox.c b/rmbox/rmbox.c
index 4df2ee1..0281904 100644
--- a/rmbox/rmbox.c
+++ b/rmbox/rmbox.c
@@ -20,37 +20,109 @@
 #include <errno.h>
 #include <string.h>
 #include <ctype.h>
+#include <sof/trace.h>
 
 #define KNRM  "\x1B[0m"
 #define KRED  "\x1B[31m"
 
-// TODO: include all this stuff
-
-#define TRACE_CLASS_IRQ		(1 << 24)
-#define TRACE_CLASS_IPC		(2 << 24)
-#define TRACE_CLASS_PIPE	(3 << 24)
-#define TRACE_CLASS_HOST	(4 << 24)
-#define TRACE_CLASS_DAI		(5 << 24)
-#define TRACE_CLASS_DMA		(6 << 24)
-#define TRACE_CLASS_SSP		(7 << 24)
-#define TRACE_CLASS_COMP	(8 << 24)
-#define TRACE_CLASS_WAIT	(9 << 24)
-#define TRACE_CLASS_LOCK	(10 << 24)
-#define TRACE_CLASS_MEM		(11 << 24)
-#define TRACE_CLASS_MIXER	(12 << 24)
-#define TRACE_CLASS_BUFFER	(13 << 24)
-#define TRACE_CLASS_VOLUME	(14 << 24)
-#define TRACE_CLASS_SWITCH	(15 << 24)
-#define TRACE_CLASS_MUX		(16 << 24)
-#define TRACE_CLASS_SRC         (17 << 24)
-#define TRACE_CLASS_TONE        (18 << 24)
-#define TRACE_CLASS_EQ_FIR      (19 << 24)
-#define TRACE_CLASS_EQ_IIR      (20 << 24)
-
-#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
+#define TRACE_BLOCK_SIZE	8
 
+#define MAX_LINE_LEN	1024
 
-#define TRACE_BLOCK_SIZE	8
+struct trace_class_table {
+	int trace_class;
+	char *class_name;
+};
+
+struct trace_class_table *trace_table;
+int num_trace_classes;
+
+/* trace defines pointers */
+extern char _trace_start;
+extern char _trace_end;
+
+/* set up trace class identifier table based on trace.sh in sof */
+static void setup_trace_table()
+{
+	char *token;
+	char line[MAX_LINE_LEN];
+	int ret, i = 0, j = 0;
+	char*  p = &_trace_start;
+
+	/* find out the number of trace class definitions from trace header */
+	while (p != &_trace_end) {
+		line[i++] = *p;
+
+		/* read until new line character */
+		if (*p == '\n') {
+			line[i-1] = '\0';
+			char identifier[MAX_LINE_LEN];
+			int value = 0, shift = 0;
+			ret = sscanf(line, "#define %s (%d << %d)", identifier,
+				      &value, &shift);
+			if (ret == 3) {
+
+				/* if TRACE_CLASS definition */
+				if (strstr(identifier, "TRACE_CLASS"))
+					j++;
+			}
+			i = 0;
+		}
+		p++;
+	}
+
+	num_trace_classes = j;
+
+	/* allocate memory for trace table */
+	trace_table = (struct trace_class_table *)malloc(sizeof(struct trace_class_table) * num_trace_classes);
+
+	i = 0;
+	j = 0;
+
+	/* rewind pointer */
+	p = &_trace_start;
+
+	/* begin reading trace header */
+	while (p != &_trace_end) {
+		line[i++] = *p;
+		if (*p == '\n') {
+			line[i-1] = '\0';
+			char identifier[MAX_LINE_LEN];
+			int value = 0, shift = 0;
+			ret = sscanf(line, "#define %s (%d << %d)", identifier,
+				      &value, &shift);
+			if (ret == 3) {
+
+				/* if TRACE_CLASS definition */
+				if (strstr(identifier, "TRACE_CLASS")) {
+					token = strtok(identifier, "_");
+					token = strtok(NULL, "_");
+					token = strtok(NULL, "_");
+
+					/* add trace class entry */
+					trace_table[j].trace_class = value;
+					trace_table[j++].class_name = strdup(token);
+				}
+			}
+			i = 0;
+		}
+		p++;
+	}
+}
+
+/* look up subsystem class name from table */
+static char *get_trace_class(uint32_t trace_class)
+{
+	int i;
+
+	/* look up trace class table and return subsystem name */
+	for (i = 0; i < num_trace_classes; i++) {
+		if (trace_table[i].trace_class == trace_class)
+			return trace_table[i].class_name;
+	}
+
+	return "value";
+}
 
 static inline char get_char(uint32_t val, int idx)
 {
@@ -122,50 +194,9 @@ static void show_trace(uint64_t val, uint64_t addr, uint64_t *timestamp, double
 	}
 
 	class = val & 0xff000000;
-	if (class == TRACE_CLASS_IRQ)
-		trace = "irq";
-	else if (class == TRACE_CLASS_IPC)
-		trace = "ipc";
-	else if (class == TRACE_CLASS_PIPE)
-		trace = "pipe";
-	else if (class == TRACE_CLASS_HOST)
-		trace = "host";
-	else if (class == TRACE_CLASS_DAI)
-		trace = "dai";
-	else if (class == TRACE_CLASS_DMA)
-		trace = "dma";
-	else if (class == TRACE_CLASS_SSP)
-		trace = "ssp";
-	else if (class == TRACE_CLASS_COMP)
-		trace = "comp";
-	else if (class == TRACE_CLASS_WAIT)
-		trace = "wait";
-	else if (class == TRACE_CLASS_LOCK)
-		trace = "lock";
-	else if (class == TRACE_CLASS_MEM)
-		trace = "mem";
-	else if (class == TRACE_CLASS_MIXER)
-		trace = "mixer";
-	else if (class == TRACE_CLASS_BUFFER)
-		trace = "buffer";
-	else if (class == TRACE_CLASS_VOLUME)
-		trace = "volume";
-	else if (class == TRACE_CLASS_SWITCH)
-		trace = "switch";
-	else if (class == TRACE_CLASS_MUX)
-		trace = "mux";
-	else if (class == TRACE_CLASS_SRC)
-		trace = "src";
-	else if (class == TRACE_CLASS_TONE)
-		trace = "tone";
-	else if (class == TRACE_CLASS_EQ_FIR)
-		trace = "eq-fir";
-	else if (class == TRACE_CLASS_EQ_IIR)
-		trace = "eq-iir";
-	else {
-		printf("value 0x%8.8x\n", (uint32_t)val);
-		return;
-	}
+	
+	/* look up trace subsystem from table */
+	trace = strdup(get_trace_class(class >> 24));
 
 	switch ((char)(val >> 16)) {
 	case 'e':
@@ -343,6 +374,8 @@ int main(int argc, char *argv[])
 		}
 	}
 
+	setup_trace_table();
+
 	/* trace requested ? */
 	if (trace)
 		return trace_read("/sys/kernel/debug/sof/trace",
-- 
2.17.0



More information about the Sound-open-firmware mailing list