[Sound-open-firmware] [PATCH] configure.ac: add CONFIG_DMA_TRACE flag for DMA trace feature

Keyon Jie yang.jie at linux.intel.com
Wed Dec 6 08:53:35 CET 2017



On 2017年12月06日 15:23, Liam Girdwood wrote:
> On Wed, 2017-12-06 at 13:15 +0800, Keyon Jie wrote:
>> We only support DMA trace feature on Baytrail, Cherrytrail
>> at the moment, if CONFIG_DMA_TRACE flag is not defined, we
>> will use traditional mailbox trace instead.
>>
>> Signed-off-by: Keyon Jie <yang.jie at linux.intel.com>
>> ---
>>   configure.ac        |  2 ++
>>   src/ipc/dma-copy.c  |  2 ++
>>   src/ipc/intel-ipc.c |  4 ++++
>>   src/lib/trace.c     | 58
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++
>>   4 files changed, 66 insertions(+)
>>
> 
> This is more useful as a DEBUG option when DMA is broken/suspect as all
> platforms should use DMA trace as default tracing mechanism. You could
> use a cmd line option in configure.ac using AC_ARG_WITH() to
> enable/disable DMA trace (default is enabled).

OK, make sense. let me change it in v2.

thanks,
~Keyon

> 
> Liam
> 
>> diff --git a/configure.ac b/configure.ac
>> index 8946c36..093d0b4 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -81,6 +81,7 @@ case "$with_platform" in
>>   	AC_SUBST(XTENSA_CORE)
>>   
>>   	AC_DEFINE([CONFIG_BAYTRAIL], [1], [Configure for Baytrail])
>> +	AC_DEFINE([CONFIG_DMA_TRACE], [1], [Configure DMA trace])
>>       ;;
>>       cherrytrail*)
>>   
>> @@ -97,6 +98,7 @@ case "$with_platform" in
>>   	AC_SUBST(XTENSA_CORE)
>>   
>>   	AC_DEFINE([CONFIG_CHERRYTRAIL], [1], [Configure for
>> Cherrytrail])
>> +	AC_DEFINE([CONFIG_DMA_TRACE], [1], [Configure DMA trace])
>>       ;;
>>       *)
>>           AC_MSG_ERROR([Host platform not specified])
>> diff --git a/src/ipc/dma-copy.c b/src/ipc/dma-copy.c
>> index 8565966..57d3e3d 100644
>> --- a/src/ipc/dma-copy.c
>> +++ b/src/ipc/dma-copy.c
>> @@ -77,7 +77,9 @@ static void dma_complete(void *data, uint32_t type,
>> struct dma_sg_elem *next)
>>   	if (type == DMA_IRQ_TYPE_LLIST)
>>   		wait_completed(comp);
>>   
>> +#if defined(CONFIG_DMA_TRACE)
>>   	ipc_dma_trace_send_position();
>> +#endif
>>   
>>   	next->size = DMA_RELOAD_END;
>>   }
>> diff --git a/src/ipc/intel-ipc.c b/src/ipc/intel-ipc.c
>> index e13b541..4c310b6 100644
>> --- a/src/ipc/intel-ipc.c
>> +++ b/src/ipc/intel-ipc.c
>> @@ -585,6 +585,7 @@ static int ipc_glb_pm_message(uint32_t header)
>>   	}
>>   }
>>   
>> +#if defined(CONFIG_DMA_TRACE)
>>   /*
>>    * Debug IPC Operations.
>>    */
>> @@ -662,6 +663,7 @@ static int ipc_glb_debug_message(uint32_t header)
>>   		return -EINVAL;
>>   	}
>>   }
>> +#endif
>>   
>>   /*
>>    * Topology IPC Operations.
>> @@ -877,8 +879,10 @@ int ipc_cmd(void)
>>   		return ipc_glb_stream_message(hdr->cmd);
>>   	case iGS(SOF_IPC_GLB_DAI_MSG):
>>   		return ipc_glb_dai_message(hdr->cmd);
>> +#if defined(CONFIG_DMA_TRACE)
>>   	case iGS(SOF_IPC_GLB_TRACE_MSG):
>>   		return ipc_glb_debug_message(hdr->cmd);
>> +#endif
>>   	default:
>>   		trace_ipc_error("eGc");
>>   		trace_value(type);
>> diff --git a/src/lib/trace.c b/src/lib/trace.c
>> index eec93b5..bb81d47 100644
>> --- a/src/lib/trace.c
>> +++ b/src/lib/trace.c
>> @@ -111,6 +111,8 @@ void _trace_error_atomic(uint32_t event)
>>   	dcache_writeback_region((void*)t, sizeof(uint64_t) * 2);
>>   }
>>   
>> +#if defined(CONFIG_DMA_TRACE)
>> +
>>   void _trace_event(uint32_t event)
>>   {
>>   	uint64_t dt[2];
>> @@ -135,6 +137,62 @@ void _trace_event_atomic(uint32_t event)
>>   	dtrace_event_atomic((const char*)dt, sizeof(uint64_t) * 2);
>>   }
>>   
>> +#else
>> +
>> +void _trace_event(uint32_t event)
>> +{
>> +	unsigned long flags;
>> +	uint64_t time, *t;
>> +
>> +	if (!trace.enable)
>> +		return;
>> +
>> +	time = platform_timer_get(platform_timer);
>> +
>> +	/* send event by mail box too. */
>> +	spin_lock_irq(&trace.lock, flags);
>> +
>> +	/* write timestamp and event to trace buffer */
>> +	t = (uint64_t *)(MAILBOX_TRACE_BASE + trace.pos);
>> +	trace.pos += (sizeof(uint64_t) << 1);
>> +
>> +	if (trace.pos > MAILBOX_TRACE_SIZE - sizeof(uint64_t) * 2)
>> +		trace.pos = 0;
>> +
>> +	spin_unlock_irq(&trace.lock, flags);
>> +
>> +	t[0] = time;
>> +	t[1] = event;
>> +
>> +	/* writeback trace data */
>> +	dcache_writeback_region((void *)t, sizeof(uint64_t) * 2);
>> +}
>> +
>> +void _trace_event_atomic(uint32_t event)
>> +{
>> +	uint64_t time, *t;
>> +
>> +	if (!trace.enable)
>> +		return;
>> +
>> +	time = platform_timer_get(platform_timer);
>> +
>> +	/* write timestamp and event to trace buffer */
>> +	t = (uint64_t *)(MAILBOX_TRACE_BASE + trace.pos);
>> +	trace.pos += (sizeof(uint64_t) << 1);
>> +
>> +	if (trace.pos > MAILBOX_TRACE_SIZE - sizeof(uint64_t) * 2)
>> +		trace.pos = 0;
>> +
>> +	t[0] = time;
>> +	t[1] = event;
>> +
>> +	/* writeback trace data */
>> +	dcache_writeback_region((void *)t, sizeof(uint64_t) * 2);
>> +}
>> +
>> +#endif
>> +
>>   void trace_off(void)
>>   {
>>   	trace.enable = 0;
> _______________________________________________
> Sound-open-firmware mailing list
> Sound-open-firmware at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/sound-open-firmware
> 


More information about the Sound-open-firmware mailing list