trace: core: add trace_flush()

This patch adds a new trace_flush() feature to flush
the last remaining trace messages during panic.

Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Signed-off-by: Yan Wang <yan.wang@linux.intel.com>
This commit is contained in:
Ranjani Sridharan 2018-03-27 22:07:17 -07:00 committed by Liam Girdwood
parent 3d8089ed0f
commit cb1fc87454
9 changed files with 67 additions and 1 deletions

View File

@ -72,6 +72,7 @@ int dma_trace_init_complete(struct dma_trace_data *d);
int dma_trace_host_buffer(struct dma_trace_data *d, struct dma_sg_elem *elem, int dma_trace_host_buffer(struct dma_trace_data *d, struct dma_sg_elem *elem,
uint32_t host_size); uint32_t host_size);
int dma_trace_enable(struct dma_trace_data *d); int dma_trace_enable(struct dma_trace_data *d);
void dma_trace_flush(void *t);
void dtrace_event(const char *e, uint32_t size); void dtrace_event(const char *e, uint32_t size);
void dtrace_event_atomic(const char *e, uint32_t length); void dtrace_event_atomic(const char *e, uint32_t length);

View File

@ -34,6 +34,7 @@
#include <reef/reef.h> #include <reef/reef.h>
#include <reef/mailbox.h> #include <reef/mailbox.h>
#include <reef/interrupt.h> #include <reef/interrupt.h>
#include <reef/trace.h>
#include <platform/platform.h> #include <platform/platform.h>
#include <uapi/ipc.h> #include <uapi/ipc.h>
#include <stdint.h> #include <stdint.h>
@ -59,8 +60,13 @@ static inline void panic_rewind(uint32_t p, uint32_t stack_rewind_frames)
/* TODO: send IPC oops message to host */ /* TODO: send IPC oops message to host */
/* panic and loop forever */ /* panic */
platform_panic(p); platform_panic(p);
/* flush last trace messages */
trace_flush();
/* and loop forever */
while (1) {}; while (1) {};
} }

View File

@ -106,6 +106,7 @@ void _trace_error(uint32_t event);
void _trace_error_value(uint32_t event); void _trace_error_value(uint32_t event);
void _trace_event_atomic(uint32_t event); void _trace_event_atomic(uint32_t event);
void _trace_error_atomic(uint32_t event); void _trace_error_atomic(uint32_t event);
void trace_flush(void);
void trace_off(void); void trace_off(void);
void trace_init(struct reef * reef); void trace_init(struct reef * reef);

View File

@ -36,6 +36,7 @@
#include <arch/cache.h> #include <arch/cache.h>
#include <platform/timer.h> #include <platform/timer.h>
#include <platform/dma.h> #include <platform/dma.h>
#include <platform/platform.h>
#include <reef/lock.h> #include <reef/lock.h>
#include <stdint.h> #include <stdint.h>
@ -285,6 +286,40 @@ int dma_trace_enable(struct dma_trace_data *d)
return 0; return 0;
} }
void dma_trace_flush(void *t)
{
struct dma_trace_buf *buffer = &trace_data->dmatb;
uint32_t avail = buffer->avail;
int32_t size;
int32_t wrap_count;
/* number of bytes to flush */
if (avail > DMA_FLUSH_TRACE_SIZE) {
size = DMA_FLUSH_TRACE_SIZE;
} else {
/* check for buffer wrap */
if (buffer->w_ptr > buffer->r_ptr)
size = buffer->w_ptr - buffer->r_ptr;
else
size = buffer->end_addr - buffer->r_ptr +
buffer->w_ptr - buffer->addr;
}
/* check for buffer wrap */
if (buffer->w_ptr - size < buffer->addr) {
wrap_count = buffer->w_ptr - buffer->addr;
memcpy(t, buffer->end_addr - (size - wrap_count),
size - wrap_count);
memcpy(t + (size - wrap_count), buffer->addr,
wrap_count);
} else {
memcpy(t, buffer->w_ptr - size, size);
}
/* writeback trace data */
dcache_writeback_region(t, size);
}
static void dtrace_add_event(const char *e, uint32_t length) static void dtrace_add_event(const char *e, uint32_t length)
{ {
struct dma_trace_buf *buffer = &trace_data->dmatb; struct dma_trace_buf *buffer = &trace_data->dmatb;

View File

@ -136,6 +136,17 @@ void _trace_event_atomic(uint32_t event)
dtrace_event_atomic((const char*)dt, sizeof(uint64_t) * 2); dtrace_event_atomic((const char*)dt, sizeof(uint64_t) * 2);
} }
void trace_flush(void)
{
volatile uint64_t *t;
/* get mailbox position */
t = (volatile uint64_t *)(MAILBOX_TRACE_BASE + trace.pos);
/* flush dma trace messages */
dma_trace_flush((void *)t);
}
void trace_off(void) void trace_off(void)
{ {
trace.enable = 0; trace.enable = 0;

View File

@ -88,6 +88,9 @@ struct reef;
/* local buffer size of DMA tracing */ /* local buffer size of DMA tracing */
#define DMA_TRACE_LOCAL_SIZE HOST_PAGE_SIZE #define DMA_TRACE_LOCAL_SIZE HOST_PAGE_SIZE
/* trace bytes flushed during panic */
#define DMA_FLUSH_TRACE_SIZE (MAILBOX_TRACE_SIZE >> 2)
/* the interval of DMA trace copying */ /* the interval of DMA trace copying */
#define DMA_TRACE_PERIOD 500000 #define DMA_TRACE_PERIOD 500000

View File

@ -82,6 +82,9 @@ struct reef;
/* local buffer size of DMA tracing */ /* local buffer size of DMA tracing */
#define DMA_TRACE_LOCAL_SIZE HOST_PAGE_SIZE #define DMA_TRACE_LOCAL_SIZE HOST_PAGE_SIZE
/* trace bytes flushed during panic */
#define DMA_FLUSH_TRACE_SIZE (MAILBOX_TRACE_SIZE >> 2)
/* the interval of DMA trace copying */ /* the interval of DMA trace copying */
#define DMA_TRACE_PERIOD 500000 #define DMA_TRACE_PERIOD 500000

View File

@ -92,6 +92,9 @@ struct reef;
/* local buffer size of DMA tracing */ /* local buffer size of DMA tracing */
#define DMA_TRACE_LOCAL_SIZE HOST_PAGE_SIZE #define DMA_TRACE_LOCAL_SIZE HOST_PAGE_SIZE
/* trace bytes flushed during panic */
#define DMA_FLUSH_TRACE_SIZE (MAILBOX_TRACE_SIZE >> 2)
/* the interval of DMA trace copying */ /* the interval of DMA trace copying */
#define DMA_TRACE_PERIOD 500000 #define DMA_TRACE_PERIOD 500000

View File

@ -81,6 +81,9 @@ struct reef;
/* local buffer size of DMA tracing */ /* local buffer size of DMA tracing */
#define DMA_TRACE_LOCAL_SIZE HOST_PAGE_SIZE #define DMA_TRACE_LOCAL_SIZE HOST_PAGE_SIZE
/* trace bytes flushed during panic */
#define DMA_FLUSH_TRACE_SIZE (MAILBOX_TRACE_SIZE >> 2)
/* the interval of DMA trace copying */ /* the interval of DMA trace copying */
#define DMA_TRACE_PERIOD 500000 #define DMA_TRACE_PERIOD 500000