[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 06:15:26 CET 2017
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(+)
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;
--
2.11.0
More information about the Sound-open-firmware
mailing list