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

Liam Girdwood liam.r.girdwood at linux.intel.com
Thu May 17 16:23:31 CEST 2018


On Mon, 2018-05-14 at 09:17 -0700, Ranjani Sridharan wrote:
> 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
> +


What's this for ? You can use AC_ macro in configure.ac to detect the presence
of an installed header.

>  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 */

trace.sh in another patch ?

Liam

> +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",


More information about the Sound-open-firmware mailing list