Skip to content

Commit ccaff5c

Browse files
authored
Merge pull request #458 from thesofproject/topic/sgl-array
dma: SG elem lists replaced with arrays
2 parents ce7f99b + d5eaa8f commit ccaff5c

14 files changed

Lines changed: 257 additions & 485 deletions

File tree

src/audio/dai.c

Lines changed: 25 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -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

315296
static 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

382346
static 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)
750707
static 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

Comments
 (0)