Skip to content

Commit 3ec8e72

Browse files
authored
Merge pull request #255 from tlauda/topic/dma_trace_buffer_alloc
dma-trace: allocate trace buffer only after enabling traces
2 parents 13bf871 + eca2089 commit 3ec8e72

File tree

1 file changed

+43
-29
lines changed

1 file changed

+43
-29
lines changed

src/lib/dma-trace.c

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -143,27 +143,7 @@ static uint64_t trace_work(void *data, uint64_t delay)
143143

144144
int dma_trace_init_early(struct sof *sof)
145145
{
146-
struct dma_trace_buf *buffer;
147-
148146
trace_data = rzalloc(RZONE_SYS, SOF_MEM_CAPS_RAM, sizeof(*trace_data));
149-
buffer = &trace_data->dmatb;
150-
151-
/* allocate new buffer */
152-
buffer->addr = rballoc(RZONE_RUNTIME,
153-
SOF_MEM_CAPS_RAM | SOF_MEM_CAPS_DMA,
154-
DMA_TRACE_LOCAL_SIZE);
155-
if (buffer->addr == NULL) {
156-
trace_buffer_error("ebm");
157-
return -ENOMEM;
158-
}
159-
160-
bzero(buffer->addr, DMA_TRACE_LOCAL_SIZE);
161-
162-
/* initialise the DMA buffer */
163-
buffer->size = DMA_TRACE_LOCAL_SIZE;
164-
buffer->w_ptr = buffer->r_ptr = buffer->addr;
165-
buffer->end_addr = buffer->addr + buffer->size;
166-
buffer->avail = 0;
167147

168148
list_init(&trace_data->config.elem_list);
169149
spinlock_init(&trace_data->lock);
@@ -174,7 +154,6 @@ int dma_trace_init_early(struct sof *sof)
174154

175155
int dma_trace_init_complete(struct dma_trace_data *d)
176156
{
177-
struct dma_trace_buf *buffer = &d->dmatb;
178157
int ret;
179158

180159
trace_buffer("dtn");
@@ -183,7 +162,6 @@ int dma_trace_init_complete(struct dma_trace_data *d)
183162
ret = dma_copy_new(&d->dc);
184163
if (ret < 0) {
185164
trace_buffer_error("edm");
186-
rfree(buffer->addr);
187165
return ret;
188166
}
189167

@@ -212,6 +190,31 @@ int dma_trace_host_buffer(struct dma_trace_data *d, struct dma_sg_elem *elem,
212190
return 0;
213191
}
214192

193+
static int dma_trace_buffer_init(struct dma_trace_data *d)
194+
{
195+
struct dma_trace_buf *buffer = &d->dmatb;
196+
197+
/* allocate new buffer */
198+
buffer->addr = rballoc(RZONE_RUNTIME,
199+
SOF_MEM_CAPS_RAM | SOF_MEM_CAPS_DMA,
200+
DMA_TRACE_LOCAL_SIZE);
201+
if (!buffer->addr) {
202+
trace_buffer_error("ebm");
203+
return -ENOMEM;
204+
}
205+
206+
bzero(buffer->addr, DMA_TRACE_LOCAL_SIZE);
207+
208+
/* initialise the DMA buffer */
209+
buffer->size = DMA_TRACE_LOCAL_SIZE;
210+
buffer->w_ptr = buffer->addr;
211+
buffer->r_ptr = buffer->addr;
212+
buffer->end_addr = buffer->addr + buffer->size;
213+
buffer->avail = 0;
214+
215+
return 0;
216+
}
217+
215218
#if defined CONFIG_DMA_GW
216219

217220
static int dma_trace_start(struct dma_trace_data *d)
@@ -271,9 +274,14 @@ static int dma_trace_start(struct dma_trace_data *d)
271274

272275
int dma_trace_enable(struct dma_trace_data *d)
273276
{
274-
#if defined CONFIG_DMA_GW
275277
int err;
276278

279+
/* initialize dma trace buffer */
280+
err = dma_trace_buffer_init(d);
281+
if (err < 0)
282+
return err;
283+
284+
#if defined CONFIG_DMA_GW
277285
/*
278286
* GW DMA need finish DMA config and start before
279287
* host driver trigger start DMA
@@ -296,11 +304,17 @@ int dma_trace_enable(struct dma_trace_data *d)
296304

297305
void dma_trace_flush(void *t)
298306
{
299-
struct dma_trace_buf *buffer = &trace_data->dmatb;
300-
uint32_t avail = buffer->avail;
307+
struct dma_trace_buf *buffer = NULL;
308+
uint32_t avail;
301309
int32_t size;
302310
int32_t wrap_count;
303311

312+
if (!trace_data || !trace_data->dmatb.addr)
313+
return;
314+
315+
buffer = &trace_data->dmatb;
316+
avail = buffer->avail;
317+
304318
/* number of bytes to flush */
305319
if (avail > DMA_FLUSH_TRACE_SIZE) {
306320
size = DMA_FLUSH_TRACE_SIZE;
@@ -359,8 +373,8 @@ void dtrace_event(const char *e, uint32_t length)
359373
struct dma_trace_buf *buffer = NULL;
360374
unsigned long flags;
361375

362-
if (trace_data == NULL ||
363-
length > DMA_TRACE_LOCAL_SIZE / 8 || length == 0)
376+
if (!trace_data || !trace_data->dmatb.addr ||
377+
length > DMA_TRACE_LOCAL_SIZE / 8 || length == 0)
364378
return;
365379

366380
buffer = &trace_data->dmatb;
@@ -391,8 +405,8 @@ void dtrace_event(const char *e, uint32_t length)
391405

392406
void dtrace_event_atomic(const char *e, uint32_t length)
393407
{
394-
if (trace_data == NULL ||
395-
length > DMA_TRACE_LOCAL_SIZE / 8 || length == 0)
408+
if (!trace_data || !trace_data->dmatb.addr ||
409+
length > DMA_TRACE_LOCAL_SIZE / 8 || length == 0)
396410
return;
397411

398412
dtrace_add_event(e, length);

0 commit comments

Comments
 (0)