The host buffer may not be a multiple of host PHY page size, so provide so pass this value as part of our host buffer init.
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com --- src/audio/host.c | 5 +++-- src/audio/pipeline.c | 4 ++-- src/include/reef/audio/component.h | 4 ++-- src/include/reef/audio/pipeline.h | 2 +- src/ipc/intel-ipc.c | 3 ++- 5 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/src/audio/host.c b/src/audio/host.c index e76fe81..521380a 100644 --- a/src/audio/host.c +++ b/src/audio/host.c @@ -473,7 +473,8 @@ static int host_cmd(struct comp_dev *dev, int cmd, void *data) return ret; }
-static int host_buffer(struct comp_dev *dev, struct dma_sg_elem *elem) +static int host_buffer(struct comp_dev *dev, struct dma_sg_elem *elem, + uint32_t host_size) { struct host_data *hd = comp_get_drvdata(dev); struct dma_sg_elem *e; @@ -484,7 +485,7 @@ static int host_buffer(struct comp_dev *dev, struct dma_sg_elem *elem) return -ENOMEM;
*e = *elem; - hd->host_size += e->size; + hd->host_size = host_size;
list_item_append(&e->list, &hd->host.elem_list); return 0; diff --git a/src/audio/pipeline.c b/src/audio/pipeline.c index f42fa15..0026048 100644 --- a/src/audio/pipeline.c +++ b/src/audio/pipeline.c @@ -553,11 +553,11 @@ int pipeline_reset(struct pipeline *p, struct comp_dev *host)
/* TODO: remove ?? configure pipelines host DMA buffer */ int pipeline_host_buffer(struct pipeline *p, struct comp_dev *host, - struct dma_sg_elem *elem) + struct dma_sg_elem *elem, uint32_t host_size) { trace_pipe("PBr");
- return comp_host_buffer(host, elem); + return comp_host_buffer(host, elem, host_size); }
/* copy audio data from DAI buffer to host PCM buffer via pipeline */ diff --git a/src/include/reef/audio/component.h b/src/include/reef/audio/component.h index 850165b..fbd29e4 100644 --- a/src/include/reef/audio/component.h +++ b/src/include/reef/audio/component.h @@ -254,10 +254,10 @@ static inline int comp_params(struct comp_dev *dev, * mandatory for host components, optional for the others. */ static inline int comp_host_buffer(struct comp_dev *dev, - struct dma_sg_elem *elem) + struct dma_sg_elem *elem, uint32_t host_size) { if (dev->drv->ops.host_buffer) - return dev->drv->ops.host_buffer(dev, elem); + return dev->drv->ops.host_buffer(dev, elem, host_size); return 0; }
diff --git a/src/include/reef/audio/pipeline.h b/src/include/reef/audio/pipeline.h index f0f77fa..26c1dd6 100644 --- a/src/include/reef/audio/pipeline.h +++ b/src/include/reef/audio/pipeline.h @@ -89,7 +89,7 @@ int pipeline_params(struct pipeline *p, struct comp_dev *cd,
/* pipeline parameters */ int pipeline_host_buffer(struct pipeline *p, struct comp_dev *cd, - struct dma_sg_elem *elem); + struct dma_sg_elem *elem, uint32_t host_size);
/* prepare the pipeline for usage */ int pipeline_prepare(struct pipeline *p, struct comp_dev *cd); diff --git a/src/ipc/intel-ipc.c b/src/ipc/intel-ipc.c index d735f26..b7ecbba 100644 --- a/src/ipc/intel-ipc.c +++ b/src/ipc/intel-ipc.c @@ -244,7 +244,8 @@ static int parse_page_descriptors(struct intel_ipc_data *iipc, else elem.dest = phy_addr;
- err = pipeline_host_buffer(pipeline_static, host, &elem); + err = pipeline_host_buffer(pipeline_static, host, &elem, + req->ringinfo.ring_size); if (err < 0) { trace_ipc_error("ePb"); return err;