[Sound-open-firmware] [PATCH] Revert "dai: copy: Move buffer pointer updates into dai_copy()"

Liam Girdwood liam.r.girdwood at linux.intel.com
Mon Apr 2 11:02:33 CEST 2018


This reverts commit 7f9110c4c0ca26a67e0e4baa91e5f0bcc31a1c3e.

This does not work when both buffer data consumer and producer are DMACs.

Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
---
 src/audio/dai.c | 108 +++++++++++++++++++++++++++-----------------------------
 1 file changed, 52 insertions(+), 56 deletions(-)

diff --git a/src/audio/dai.c b/src/audio/dai.c
index 1383c14f..ed2f9f65 100644
--- a/src/audio/dai.c
+++ b/src/audio/dai.c
@@ -78,6 +78,7 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next)
 	struct comp_dev *dev = (struct comp_dev *)data;
 	struct dai_data *dd = comp_get_drvdata(dev);
 	struct comp_buffer *dma_buffer;
+	uint32_t copied_size;
 
 	trace_dai("irq");
 
@@ -113,6 +114,57 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next)
 		return;
 	}
 
+	if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK) {
+		dma_buffer = list_first_item(&dev->bsource_list,
+			struct comp_buffer, sink_list);
+
+		copied_size = dd->last_bytes ? dd->last_bytes : dd->period_bytes;
+
+		/* recalc available buffer space */
+		comp_update_buffer_consume(dma_buffer, copied_size);
+
+		/* writeback buffer contents from cache */
+		dcache_writeback_region(dma_buffer->r_ptr, copied_size);
+
+		/* update host position(in bytes offset) for drivers */
+		dev->position += copied_size;
+		if (dd->dai_pos) {
+			dd->dai_pos_blks += copied_size;
+			*dd->dai_pos = dd->dai_pos_blks +
+				dma_buffer->r_ptr - dma_buffer->addr;
+		}
+
+		/* make sure there is availble bytes for next period */
+		if (dma_buffer->avail < dd->period_bytes) {
+			trace_dai_error("xru");
+			comp_underrun(dev, dma_buffer, copied_size, 0);
+		}
+
+	} else {
+		dma_buffer = list_first_item(&dev->bsink_list,
+			struct comp_buffer, source_list);
+
+		/* invalidate buffer contents */
+		dcache_invalidate_region(dma_buffer->w_ptr, dd->period_bytes);
+
+		/* recalc available buffer space */
+		comp_update_buffer_produce(dma_buffer, dd->period_bytes);
+
+		/* update positions */
+		dev->position += dd->period_bytes;
+		if (dd->dai_pos) {
+			dd->dai_pos_blks += dd->period_bytes;
+			*dd->dai_pos = dd->dai_pos_blks +
+				dma_buffer->w_ptr - dma_buffer->addr;
+		}
+
+		/* make sure there is free bytes for next period */
+		if (dma_buffer->free < dd->period_bytes) {
+			trace_dai_error("xro");
+			comp_overrun(dev, dma_buffer, dd->period_bytes, 0);
+		}
+	}
+
 	/* notify pipeline that DAI needs its buffer processed */
 	if (dev->state == COMP_STATE_ACTIVE)
 		pipeline_schedule_copy(dev->pipeline, 0);
@@ -550,62 +602,6 @@ static int dai_comp_trigger(struct comp_dev *dev, int cmd)
 /* copy and process stream data from source to sink buffers */
 static int dai_copy(struct comp_dev *dev)
 {
-	struct dai_data *dd = comp_get_drvdata(dev);
-	struct comp_buffer *dma_buffer;
-	uint32_t copied_size;
-
-	if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK) {
-		dma_buffer = list_first_item(&dev->bsource_list,
-					     struct comp_buffer, sink_list);
-
-		copied_size = dd->last_bytes ?
-			dd->last_bytes : dd->period_bytes;
-
-		/* recalc available buffer space */
-		comp_update_buffer_consume(dma_buffer, copied_size);
-
-		/* writeback buffer contents from cache */
-		dcache_writeback_region(dma_buffer->r_ptr, copied_size);
-
-		/* update host position(in bytes offset) for drivers */
-		dev->position += copied_size;
-		if (dd->dai_pos) {
-			dd->dai_pos_blks += copied_size;
-			*dd->dai_pos = dd->dai_pos_blks +
-				dma_buffer->r_ptr - dma_buffer->addr;
-		}
-
-		/* make sure there is available bytes for next period */
-		if (dma_buffer->avail < dd->period_bytes) {
-			trace_dai_error("xru");
-			comp_underrun(dev, dma_buffer, copied_size, 0);
-		}
-
-	} else {
-		dma_buffer = list_first_item(&dev->bsink_list,
-					     struct comp_buffer, source_list);
-
-		/* invalidate buffer contents */
-		dcache_invalidate_region(dma_buffer->w_ptr, dd->period_bytes);
-
-		/* recalc available buffer space */
-		comp_update_buffer_produce(dma_buffer, dd->period_bytes);
-
-		/* update positions */
-		dev->position += dd->period_bytes;
-		if (dd->dai_pos) {
-			dd->dai_pos_blks += dd->period_bytes;
-			*dd->dai_pos = dd->dai_pos_blks +
-				dma_buffer->w_ptr - dma_buffer->addr;
-		}
-
-		/* make sure there is free bytes for next period */
-		if (dma_buffer->free < dd->period_bytes) {
-			trace_dai_error("xro");
-			comp_overrun(dev, dma_buffer, dd->period_bytes, 0);
-		}
-	}
-
 	return 0;
 }
 
-- 
2.14.1



More information about the Sound-open-firmware mailing list