[Sound-open-firmware] [PATCH] trace: provide locking around trace output.

Liam Girdwood liam.r.girdwood at linux.intel.com
Wed Aug 9 18:51:15 CEST 2017


Make sure trace mailbox writes are atomic and provide reef context.

Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
---
 src/include/reef/trace.h |  2 ++
 src/init/init.c          |  2 ++
 src/lib/trace.c          | 41 +++++++++++++++++++++++++++++++----------
 3 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/src/include/reef/trace.h b/src/include/reef/trace.h
index 00dbb5b..300e8d8 100644
--- a/src/include/reef/trace.h
+++ b/src/include/reef/trace.h
@@ -34,6 +34,7 @@
 
 #include <stdint.h>
 #include <stdlib.h>
+#include <reef/reef.h>
 #include <reef/mailbox.h>
 #include <reef/debug.h>
 #include <reef/timer.h>
@@ -94,6 +95,7 @@
 
 void _trace_event(uint32_t event);
 void trace_off(void);
+void trace_init(struct reef * reef);
 
 #if TRACE
 
diff --git a/src/init/init.c b/src/init/init.c
index 1dc1237..491a6ad 100644
--- a/src/init/init.c
+++ b/src/init/init.c
@@ -65,6 +65,8 @@ int main(int argc, char *argv[])
 	trace_point(TRACE_BOOT_SYS_HEAP);
 	init_heap(&reef);
 
+	trace_init(&reef);
+
 	trace_point(TRACE_BOOT_SYS_NOTE);
 	init_system_notify(&reef);
 
diff --git a/src/lib/trace.c b/src/lib/trace.c
index 79d026e..5da7c95 100644
--- a/src/lib/trace.c
+++ b/src/lib/trace.c
@@ -29,34 +29,55 @@
  */
 
 #include <reef/trace.h>
+#include <reef/reef.h>
+#include <reef/alloc.h>
 #include <arch/cache.h>
+#include <platform/timer.h>
+#include <reef/lock.h>
 #include <stdint.h>
 
-/* trace position */
-static uint32_t trace_pos = 0;
-static uint32_t trace_enable = 1;
+struct trace {
+	uint32_t pos ;	/* trace position */
+	uint32_t enable;
+	spinlock_t lock;
+};
+
+static struct trace trace;
 
 void _trace_event(uint32_t event)
 {
-	volatile uint32_t *t =
-		(volatile uint32_t*)(MAILBOX_TRACE_BASE + trace_pos);
+	unsigned long flags;
+	volatile uint32_t *t;
 
-	if (!trace_enable)
+	if (!trace.enable)
 		return;
 
+	spin_lock_irq(&trace.lock, flags);
+
 	/* write timestamp and event to trace buffer */
+	t =(volatile uint32_t*)(MAILBOX_TRACE_BASE + trace.pos);
 	t[0] = platform_timer_get(0);
 	t[1] = event;
 
 	/* writeback trace data */
 	dcache_writeback_region((void*)t, sizeof(uint32_t) * 2);
 
-	trace_pos += (sizeof(uint32_t) << 1);
-	if (trace_pos >= MAILBOX_TRACE_SIZE)
-		trace_pos = 0;
+	trace.pos += (sizeof(uint32_t) << 1);
+
+	if (trace.pos >= MAILBOX_TRACE_SIZE)
+		trace.pos = 0;
+
+	spin_unlock_irq(&trace.lock, flags);
 }
 
 void trace_off(void)
 {
-	trace_enable = 0;
+	trace.enable = 0;
 };
+
+void trace_init(struct reef *reef)
+{
+	trace.enable = 1;
+	trace.pos = 0;
+	spinlock_init(&trace.lock);
+}
-- 
2.11.0



More information about the Sound-open-firmware mailing list