[Sound-open-firmware] [PATCH] comp: host: make sure we have enough data to copy to/from host
Liam Girdwood
liam.r.girdwood at linux.intel.com
Thu Aug 24 00:57:46 CEST 2017
Perform a check in the copy() function to make sure there is enough
data to copy to/from host buffers.
Signed-off-by: Liam Girdwood <liam.r.girdwood at linux.intel.com>
---
src/audio/host.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/src/audio/host.c b/src/audio/host.c
index b467036..e71e95f 100644
--- a/src/audio/host.c
+++ b/src/audio/host.c
@@ -636,12 +636,30 @@ static int host_reset(struct comp_dev *dev)
static int host_copy(struct comp_dev *dev)
{
struct host_data *hd = comp_get_drvdata(dev);
+ struct comp_buffer *dma_buffer;
+ struct dma_sg_elem *local_elem;
tracev_host("cpy");
if (dev->state != COMP_STATE_RUNNING)
return 0;
+ local_elem = list_first_item(&hd->config.elem_list,
+ struct dma_sg_elem, list);
+
+ /* enough free or avail to copy ? */
+ if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK) {
+ dma_buffer = list_first_item(&dev->bsink_list,
+ struct comp_buffer, source_list);
+ if (dma_buffer->free < local_elem->size)
+ return 0;
+ } else {
+ dma_buffer = list_first_item(&dev->bsource_list,
+ struct comp_buffer, sink_list);
+ if (dma_buffer->avail < local_elem->size)
+ return 0;
+ }
+
/* do DMA transfer */
dma_set_config(hd->dma, hd->chan, &hd->config);
dma_start(hd->dma, hd->chan);
--
2.11.0
More information about the Sound-open-firmware
mailing list