@@ -143,27 +143,7 @@ static uint64_t trace_work(void *data, uint64_t delay)
143143
144144int 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
175155int 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
217220static int dma_trace_start (struct dma_trace_data * d )
@@ -271,9 +274,14 @@ static int dma_trace_start(struct dma_trace_data *d)
271274
272275int 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
297305void 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
392406void 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