Skip to content

Commit 6b88ed7

Browse files
committed
buffer: refine write-back and invalidate logic for produce/consume
We only need to handle data consistency for buffer and cache when new data produced: 1. source(DMA) --> buffer --> sink(non-DMA): invalidate cache. 2. source(non-DMA) --> buffer --> sink(DMA): write back to memory. 3. source(DMA) --> buffer --> sink(DMA): do nothing. 4. source(non-DMA) --> buffer --> sink(non-DMA): do nothing. Signed-off-by: Keyon Jie <yang.jie@linux.intel.com>
1 parent 6b94226 commit 6b88ed7

1 file changed

Lines changed: 13 additions & 2 deletions

File tree

src/audio/buffer.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,20 @@ void comp_update_buffer_produce(struct comp_buffer *buffer, uint32_t bytes)
106106

107107
spin_lock_irq(&buffer->lock, flags);
108108

109-
if (buffer->source->is_dma_connected)
109+
/*
110+
* new data produce, handle consistency for buffer and cache:
111+
* 1. source(DMA) --> buffer --> sink(non-DMA): invalidate cache.
112+
* 2. source(non-DMA) --> buffer --> sink(DMA): write back to memory.
113+
* 3. source(DMA) --> buffer --> sink(DMA): do nothing.
114+
* 4. source(non-DMA) --> buffer --> sink(non-DMA): do nothing.
115+
*/
116+
if (buffer->source->is_dma_connected &&
117+
!buffer->sink->is_dma_connected)
118+
/* need invalidate cache for sink component to use */
110119
dcache_invalidate_region(buffer->w_ptr, bytes);
111-
else if (buffer->sink->is_dma_connected)
120+
else if (!buffer->source->is_dma_connected &&
121+
buffer->sink->is_dma_connected)
122+
/* need write back to memory for sink component to use */
112123
dcache_writeback_region(buffer->w_ptr, bytes);
113124

114125
buffer->w_ptr += bytes;

0 commit comments

Comments
 (0)