dai-zephyr: check max block count supported by DMA

Check max block count supported by DMA using new Zephyr API
This will allow to prepare a correct config regardless of
specific DMA capabilities

Signed-off-by: Adrian Bonislawski <adrian.bonislawski@intel.com>
This commit is contained in:
Adrian Bonislawski 2022-12-13 16:30:13 +01:00 committed by Kai Vehmanen
parent 0658767b72
commit fef58eea86
1 changed files with 44 additions and 2 deletions

View File

@ -452,7 +452,7 @@ static int dai_playback_params(struct comp_dev *dev, uint32_t period_bytes,
*local_buf = buffer_acquire(dd->local_buffer); *local_buf = buffer_acquire(dd->local_buffer);
uint32_t local_fmt = local_buf->stream.frame_fmt; uint32_t local_fmt = local_buf->stream.frame_fmt;
uint32_t dma_fmt = dma_buf->stream.frame_fmt; uint32_t dma_fmt = dma_buf->stream.frame_fmt;
uint32_t fifo; uint32_t fifo, max_block_count, buf_size;
int i, err = 0; int i, err = 0;
buffer_release(local_buf); buffer_release(local_buf);
@ -487,6 +487,27 @@ static int dai_playback_params(struct comp_dev *dev, uint32_t period_bytes,
comp_dbg(dev, "dai_playback_params() fifo 0x%x", fifo); comp_dbg(dev, "dai_playback_params() fifo 0x%x", fifo);
err = dma_get_attribute(dd->dma->z_dev, DMA_ATTR_MAX_BLOCK_COUNT,
&max_block_count);
if (err < 0) {
comp_err(dev, "dai_playback_params(): could not get dma attr max block count, err = %d", err);
goto out;
}
if (max_block_count < period_count) {
comp_dbg(dev, "dai_playback_params(): block count = %d not supported by DMA", period_count);
buf_size = period_count * period_bytes;
do {
if (IS_ALIGNED(buf_size, max_block_count)) {
period_count = max_block_count;
period_bytes = buf_size / period_count;
break;
} else {
comp_warn(dev, "dai_playback_params(): alignment error for buffer = %d, block count = %d", buf_size, max_block_count);
}
} while (--max_block_count > 0);
}
err = dma_sg_alloc(&config->elem_array, SOF_MEM_ZONE_RUNTIME, err = dma_sg_alloc(&config->elem_array, SOF_MEM_ZONE_RUNTIME,
config->direction, config->direction,
period_count, period_count,
@ -569,7 +590,7 @@ static int dai_capture_params(struct comp_dev *dev, uint32_t period_bytes,
*local_buf = buffer_acquire(dd->local_buffer); *local_buf = buffer_acquire(dd->local_buffer);
uint32_t local_fmt = local_buf->stream.frame_fmt; uint32_t local_fmt = local_buf->stream.frame_fmt;
uint32_t dma_fmt = dma_buf->stream.frame_fmt; uint32_t dma_fmt = dma_buf->stream.frame_fmt;
uint32_t fifo; uint32_t fifo, max_block_count, buf_size;
int i, err = 0; int i, err = 0;
buffer_release(local_buf); buffer_release(local_buf);
@ -616,6 +637,27 @@ static int dai_capture_params(struct comp_dev *dev, uint32_t period_bytes,
comp_dbg(dev, "dai_capture_params() fifo 0x%x", fifo); comp_dbg(dev, "dai_capture_params() fifo 0x%x", fifo);
err = dma_get_attribute(dd->dma->z_dev, DMA_ATTR_MAX_BLOCK_COUNT,
&max_block_count);
if (err < 0) {
comp_err(dev, "dai_capture_params(): could not get dma attr max block count, err = %d", err);
goto out;
}
if (max_block_count < period_count) {
comp_dbg(dev, "dai_capture_params(): block count = %d not supported by DMA", period_count);
buf_size = period_count * period_bytes;
do {
if (IS_ALIGNED(buf_size, max_block_count)) {
period_count = max_block_count;
period_bytes = buf_size / period_count;
break;
} else {
comp_warn(dev, "dai_capture_params(): alignment error for buffer = %d, block count = %d", buf_size, max_block_count);
}
} while (--max_block_count > 0);
}
err = dma_sg_alloc(&config->elem_array, SOF_MEM_ZONE_RUNTIME, err = dma_sg_alloc(&config->elem_array, SOF_MEM_ZONE_RUNTIME,
config->direction, config->direction,
period_count, period_count,