@@ -217,7 +217,7 @@ static struct comp_dev *dai_new(struct sof_ipc_comp *comp)
217217 goto error ;
218218 }
219219
220- list_init (& dd -> config .elem_list );
220+ dma_sg_init (& dd -> config .elem_array );
221221 dd -> dai_pos = NULL ;
222222 dd -> dai_pos_blks = 0 ;
223223 dd -> xrun = 0 ;
@@ -248,11 +248,7 @@ static int dai_playback_params(struct comp_dev *dev)
248248 struct dai_data * dd = comp_get_drvdata (dev );
249249 struct dma_sg_config * config = & dd -> config ;
250250 struct sof_ipc_comp_config * source_config ;
251- struct dma_sg_elem * elem ;
252251 struct comp_buffer * dma_buffer ;
253- struct list_item * elist ;
254- struct list_item * tlist ;
255- int i ;
256252 int err ;
257253 uint32_t buffer_size ;
258254
@@ -281,47 +277,28 @@ static int dai_playback_params(struct comp_dev *dev)
281277 return err ;
282278 }
283279
284- if (list_is_empty (& config -> elem_list )) {
285- /* set up cyclic list of DMA elems */
286- for (i = 0 ; i < source_config -> periods_sink ; i ++ ) {
287-
288- elem = rzalloc (RZONE_RUNTIME , SOF_MEM_CAPS_RAM ,
289- sizeof (* elem ));
290- if (elem == NULL )
291- goto err_unwind ;
292-
293- elem -> size = dd -> period_bytes ;
294- elem -> src = (uintptr_t )(dma_buffer -> r_ptr ) +
295- i * dd -> period_bytes ;
296-
297- elem -> dest = dai_fifo (dd -> dai , SOF_IPC_STREAM_PLAYBACK );
298-
299- list_item_append (& elem -> list , & config -> elem_list );
280+ if (!config -> elem_array .elems ) {
281+ err = dma_sg_alloc (& config -> elem_array , RZONE_RUNTIME ,
282+ config -> direction ,
283+ source_config -> periods_sink ,
284+ dd -> period_bytes ,
285+ (uintptr_t )(dma_buffer -> r_ptr ),
286+ dai_fifo (dd -> dai , SOF_IPC_STREAM_PLAYBACK ));
287+ if (err < 0 ) {
288+ trace_dai_error ("ep3" );
289+ return err ;
300290 }
301291 }
302292
303293 return 0 ;
304-
305- err_unwind :
306- trace_dai_error ("ep3" );
307- list_for_item_safe (elist , tlist , & config -> elem_list ) {
308- elem = container_of (elist , struct dma_sg_elem , list );
309- list_item_del (& elem -> list );
310- rfree (elem );
311- }
312- return - ENOMEM ;
313294}
314295
315296static int dai_capture_params (struct comp_dev * dev )
316297{
317298 struct dai_data * dd = comp_get_drvdata (dev );
318299 struct dma_sg_config * config = & dd -> config ;
319300 struct sof_ipc_comp_config * sink_config ;
320- struct dma_sg_elem * elem ;
321301 struct comp_buffer * dma_buffer ;
322- struct list_item * elist ;
323- struct list_item * tlist ;
324- int i ;
325302 int err ;
326303 uint32_t buffer_size ;
327304
@@ -350,33 +327,20 @@ static int dai_capture_params(struct comp_dev *dev)
350327 return err ;
351328 }
352329
353- if (list_is_empty (& config -> elem_list )) {
354- /* set up cyclic list of DMA elems */
355- for (i = 0 ; i < sink_config -> periods_source ; i ++ ) {
356-
357- elem = rzalloc (RZONE_RUNTIME , SOF_MEM_CAPS_RAM ,
358- sizeof (* elem ));
359- if (elem == NULL )
360- goto err_unwind ;
361-
362- elem -> size = dd -> period_bytes ;
363- elem -> dest = (uintptr_t )(dma_buffer -> w_ptr ) +
364- i * dd -> period_bytes ;
365- elem -> src = dai_fifo (dd -> dai , SOF_IPC_STREAM_CAPTURE );
366- list_item_append (& elem -> list , & config -> elem_list );
330+ if (!config -> elem_array .elems ) {
331+ err = dma_sg_alloc (& config -> elem_array , RZONE_RUNTIME ,
332+ config -> direction ,
333+ sink_config -> periods_source ,
334+ dd -> period_bytes ,
335+ (uintptr_t )(dma_buffer -> w_ptr ),
336+ dai_fifo (dd -> dai , SOF_IPC_STREAM_CAPTURE ));
337+ if (err < 0 ) {
338+ trace_dai_error ("ec3" );
339+ return err ;
367340 }
368341 }
369342
370343 return 0 ;
371-
372- err_unwind :
373- trace_dai_error ("ec3" );
374- list_for_item_safe (elist , tlist , & config -> elem_list ) {
375- elem = container_of (elist , struct dma_sg_elem , list );
376- list_item_del (& elem -> list );
377- rfree (elem );
378- }
379- return - ENOMEM ;
380344}
381345
382346static int dai_params (struct comp_dev * dev )
@@ -450,7 +414,7 @@ static int dai_prepare(struct comp_dev *dev)
450414
451415 dev -> position = 0 ;
452416
453- if (list_is_empty ( & dd -> config .elem_list ) ) {
417+ if (! dd -> config .elem_array . elems ) {
454418 trace_dai_error ("wdm" );
455419 comp_set_state (dev , COMP_TRIGGER_RESET );
456420 return - EINVAL ;
@@ -489,19 +453,12 @@ static int dai_reset(struct comp_dev *dev)
489453{
490454 struct dai_data * dd = comp_get_drvdata (dev );
491455 struct dma_sg_config * config = & dd -> config ;
492- struct list_item * elist ;
493- struct list_item * tlist ;
494- struct dma_sg_elem * elem ;
495456
496457 trace_dai ("res" );
497458
498459 dma_channel_put (dd -> dma , dd -> chan );
499460
500- list_for_item_safe (elist , tlist , & config -> elem_list ) {
501- elem = container_of (elist , struct dma_sg_elem , list );
502- list_item_del (& elem -> list );
503- rfree (elem );
504- }
461+ dma_sg_free (& config -> elem_array );
505462
506463 dd -> dai_pos_blks = 0 ;
507464 if (dd -> dai_pos )
@@ -750,21 +707,14 @@ static int dai_config(struct comp_dev *dev, struct sof_ipc_dai_config *config)
750707static void dai_cache (struct comp_dev * dev , int cmd )
751708{
752709 struct dai_data * dd ;
753- struct list_item * item ;
754- struct dma_sg_elem * e ;
755710
756711 switch (cmd ) {
757712 case COMP_CACHE_WRITEBACK_INV :
758713 trace_dai ("wtb" );
759714
760715 dd = comp_get_drvdata (dev );
761716
762- list_for_item (item , & dd -> config .elem_list ) {
763- e = container_of (item , struct dma_sg_elem , list );
764- dcache_writeback_invalidate_region (e , sizeof (* e ));
765- dcache_writeback_invalidate_region (item ,
766- sizeof (* item ));
767- }
717+ dma_sg_cache_wb_inv (& dd -> config .elem_array );
768718
769719 dcache_writeback_invalidate_region (dd -> dai , sizeof (* dd -> dai ));
770720 dcache_writeback_invalidate_region (dd -> dma , sizeof (* dd -> dma ));
@@ -782,11 +732,7 @@ static void dai_cache(struct comp_dev *dev, int cmd)
782732 dcache_invalidate_region (dd -> dma , sizeof (* dd -> dma ));
783733 dcache_invalidate_region (dd -> dai , sizeof (* dd -> dai ));
784734
785- list_for_item (item , & dd -> config .elem_list ) {
786- dcache_invalidate_region (item , sizeof (* item ));
787- e = container_of (item , struct dma_sg_elem , list );
788- dcache_invalidate_region (e , sizeof (* e ));
789- }
735+ dma_sg_cache_inv (& dd -> config .elem_array );
790736 break ;
791737 }
792738}
0 commit comments