[Sound-open-firmware] [PATCH] dma-trace: move to earlier initialisation point
Liam Girdwood
liam.r.girdwood at linux.intel.com
Mon Feb 26 12:38:53 CET 2018
Initialise DMA trace prior to platform initialisation so that more users
may use trace as part of init.
Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
dma trace fix
---
src/include/reef/dma-trace.h | 2 +-
src/include/reef/ipc.h | 2 +-
src/include/reef/reef.h | 3 +++
src/init/init.c | 1 +
src/ipc/intel-ipc.c | 9 +++++----
src/ipc/ipc.c | 1 +
src/lib/dma-trace.c | 18 ++++++++----------
src/lib/trace.c | 4 ++++
src/platform/baytrail/platform.c | 4 +---
src/platform/haswell/platform.c | 4 +---
10 files changed, 26 insertions(+), 22 deletions(-)
diff --git a/src/include/reef/dma-trace.h b/src/include/reef/dma-trace.h
index ab9c112..dcbd491 100644
--- a/src/include/reef/dma-trace.h
+++ b/src/include/reef/dma-trace.h
@@ -66,7 +66,7 @@ struct dma_trace_data {
spinlock_t lock;
};
-int dma_trace_init_early(struct dma_trace_data *d);
+int dma_trace_init_early(struct reef *reef);
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,
uint32_t host_size);
diff --git a/src/include/reef/ipc.h b/src/include/reef/ipc.h
index bb814be..9261add 100644
--- a/src/include/reef/ipc.h
+++ b/src/include/reef/ipc.h
@@ -101,7 +101,7 @@ struct ipc {
struct list_item comp_list; /* list of component devices */
/* DMA for Trace*/
- struct dma_trace_data dmat;
+ struct dma_trace_data *dmat;
void *private;
};
diff --git a/src/include/reef/reef.h b/src/include/reef/reef.h
index c872acc..e0df031 100644
--- a/src/include/reef/reef.h
+++ b/src/include/reef/reef.h
@@ -68,6 +68,9 @@ struct reef {
/* system agent */
struct sa *sa;
+ /* DMA for Trace*/
+ struct dma_trace_data *dmat;
+
/* private data */
void *arch_private;
void *plat_private;
diff --git a/src/init/init.c b/src/init/init.c
index 03ac662..d847e11 100644
--- a/src/init/init.c
+++ b/src/init/init.c
@@ -41,6 +41,7 @@
#include <reef/work.h>
#include <reef/trace.h>
#include <reef/schedule.h>
+#include <reef/dma-trace.h>
#include <platform/platform.h>
/* main firmware context */
diff --git a/src/ipc/intel-ipc.c b/src/ipc/intel-ipc.c
index fac3371..0cfec42 100644
--- a/src/ipc/intel-ipc.c
+++ b/src/ipc/intel-ipc.c
@@ -56,6 +56,7 @@
#include <reef/audio/pipeline.h>
#include <uapi/ipc.h>
#include <reef/intel-ipc.h>
+#include <reef/dma-trace.h>
#include <config.h>
#define iGS(x) ((x >> SOF_GLB_TYPE_SHIFT) & 0xf)
@@ -626,7 +627,7 @@ static int ipc_dma_trace_config(uint32_t header)
#endif
trace_ipc("DAp");
- err = dma_trace_enable(&_ipc->dmat);
+ err = dma_trace_enable(_ipc->dmat);
if (err < 0)
goto error;
@@ -649,9 +650,9 @@ int ipc_dma_trace_send_position(void)
struct sof_ipc_dma_trace_posn posn;
posn.rhdr.hdr.cmd = SOF_IPC_GLB_TRACE_MSG | SOF_IPC_TRACE_DMA_POSITION;
- posn.host_offset = _ipc->dmat.host_offset;
- posn.overflow = _ipc->dmat.overflow;
- posn.messages = _ipc->dmat.messages;
+ posn.host_offset = _ipc->dmat->host_offset;
+ posn.overflow = _ipc->dmat->overflow;
+ posn.messages = _ipc->dmat->messages;
posn.rhdr.hdr.size = sizeof(posn);
return ipc_queue_host_message(_ipc, posn.rhdr.hdr.cmd, &posn,
diff --git a/src/ipc/ipc.c b/src/ipc/ipc.c
index 61b0cf2..b753efd 100644
--- a/src/ipc/ipc.c
+++ b/src/ipc/ipc.c
@@ -350,6 +350,7 @@ int ipc_init(struct reef *reef)
/* init ipc data */
reef->ipc = rzalloc(RZONE_SYS, RFLAGS_NONE, sizeof(*reef->ipc));
reef->ipc->comp_data = rzalloc(RZONE_SYS, RFLAGS_NONE, SOF_IPC_MSG_MAX_SIZE);
+ reef->ipc->dmat = reef->dmat;
list_init(&reef->ipc->comp_list);
diff --git a/src/lib/dma-trace.c b/src/lib/dma-trace.c
index 429c7b6..c72c55b 100644
--- a/src/lib/dma-trace.c
+++ b/src/lib/dma-trace.c
@@ -124,9 +124,12 @@ out:
return DMA_TRACE_PERIOD;
}
-int dma_trace_init_early(struct dma_trace_data *d)
+int dma_trace_init_early(struct reef *reef)
{
- struct dma_trace_buf *buffer = &d->dmatb;
+ struct dma_trace_buf *buffer;
+
+ trace_data = rzalloc(RZONE_SYS, RFLAGS_NONE, sizeof(*trace_data));
+ buffer = &trace_data->dmatb;
/* allocate new buffer */
buffer->addr = rballoc(RZONE_RUNTIME, RFLAGS_NONE, DMA_TRACE_LOCAL_SIZE);
@@ -142,15 +145,10 @@ int dma_trace_init_early(struct dma_trace_data *d)
buffer->w_ptr = buffer->r_ptr = buffer->addr;
buffer->end_addr = buffer->addr + buffer->size;
buffer->avail = 0;
- d->host_offset = 0;
- d->overflow = 0;
- d->messages = 0;
- d->enabled = 0;
- d->copy_in_progress = 0;
- list_init(&d->config.elem_list);
- spinlock_init(&d->lock);
- trace_data = d;
+ list_init(&trace_data->config.elem_list);
+ spinlock_init(&trace_data->lock);
+ reef->dmat = trace_data;
return 0;
}
diff --git a/src/lib/trace.c b/src/lib/trace.c
index 859bc0e..bfac6d3 100644
--- a/src/lib/trace.c
+++ b/src/lib/trace.c
@@ -208,6 +208,10 @@ void trace_off(void)
void trace_init(struct reef *reef)
{
+
+#if defined(CONFIG_DMA_TRACE)
+ dma_trace_init_early(reef);
+#endif
trace.enable = 1;
trace.pos = 0;
spinlock_init(&trace.lock);
diff --git a/src/platform/baytrail/platform.c b/src/platform/baytrail/platform.c
index 3114ac1..11ea731 100644
--- a/src/platform/baytrail/platform.c
+++ b/src/platform/baytrail/platform.c
@@ -301,8 +301,6 @@ int platform_init(struct reef *reef)
trace_point(TRACE_BOOT_PLATFORM_IPC);
ipc_init(reef);
- dma_trace_init_early(&reef->ipc->dmat);
-
/* init DMACs */
trace_point(TRACE_BOOT_PLATFORM_DMA);
dmac0 = dma_get(DMA_ID_DMAC0);
@@ -365,7 +363,7 @@ int platform_init(struct reef *reef)
#endif
/* Initialize DMA for Trace*/
- dma_trace_init_complete(&reef->ipc->dmat);
+ dma_trace_init_complete(reef->dmat);
return 0;
}
diff --git a/src/platform/haswell/platform.c b/src/platform/haswell/platform.c
index b83e5fb..0b9274f 100644
--- a/src/platform/haswell/platform.c
+++ b/src/platform/haswell/platform.c
@@ -207,8 +207,6 @@ int platform_init(struct reef *reef)
trace_point(TRACE_BOOT_PLATFORM_IPC);
ipc_init(reef);
- dma_trace_init_early(&reef->ipc->dmat);
-
/* init DMACs */
trace_point(TRACE_BOOT_PLATFORM_DMA);
dmac0 = dma_get(DMA_ID_DMAC0);
@@ -242,7 +240,7 @@ int platform_init(struct reef *reef)
dai_probe(ssp1);
/* Initialize DMA for Trace*/
- dma_trace_init_complete(&reef->ipc->dmat);
+ dma_trace_init_complete(reef->dmat);
return 0;
}
--
2.14.1
More information about the Sound-open-firmware
mailing list