Skip to content

Commit 7c63508

Browse files
committed
zephyr: host: Use the buffer_alloc_range function to allocate a buffer
Change buffer allocation functions to buffer_alloc_range and buffer_set_size_range. This makes it possible to allocate the buffer even if the suggested size given in ipc cannot be met. Signed-off-by: Adrian Warecki <adrian.warecki@intel.com>
1 parent 4f08e77 commit 7c63508

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

src/audio/host-zephyr.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,7 @@ int host_common_params(struct host_data *hd, struct comp_dev *dev,
748748
uint32_t period_count;
749749
uint32_t period_bytes;
750750
uint32_t buffer_size;
751+
uint32_t buffer_size_preferred;
751752
uint32_t addr_align;
752753
uint32_t align;
753754
int i, channel, err;
@@ -821,25 +822,27 @@ int host_common_params(struct host_data *hd, struct comp_dev *dev,
821822
/* calculate DMA buffer size */
822823
round_up_size = (params->frame_fmt == SOF_IPC_FRAME_S24_3LE) ? (3 * align) : align;
823824
buffer_size = ROUND_UP(period_bytes, round_up_size) * period_count;
825+
buffer_size_preferred = buffer_size;
824826
if (hd->ipc_host.dma_buffer_size != 0)
825-
buffer_size = ROUND_UP(hd->ipc_host.dma_buffer_size, buffer_size);
827+
buffer_size_preferred = ROUND_UP(hd->ipc_host.dma_buffer_size, buffer_size);
826828

827829
/* alloc DMA buffer or change its size if exists */
828830
/*
829831
* Host DMA buffer cannot be shared. So we actually don't need to lock,
830832
* but we have to write back caches after we finish anywae
831833
*/
832834
if (hd->dma_buffer) {
833-
err = buffer_set_size(hd->dma_buffer, buffer_size, addr_align);
835+
err = buffer_set_size_range(hd->dma_buffer, buffer_size_preferred, buffer_size,
836+
addr_align);
834837
if (err < 0) {
835838
comp_err(dev, "host_params(): buffer_set_size() failed, buffer_size = %u",
836839
buffer_size);
837840
return err;
838841
}
839842
} else {
840843
/* allocate not shared buffer */
841-
hd->dma_buffer = buffer_alloc(buffer_size, SOF_MEM_CAPS_DMA, 0,
842-
addr_align, false);
844+
hd->dma_buffer = buffer_alloc_range(buffer_size_preferred, buffer_size,
845+
SOF_MEM_CAPS_DMA, 0, addr_align, false);
843846
if (!hd->dma_buffer) {
844847
comp_err(dev, "host_params(): failed to alloc dma buffer");
845848
return -ENOMEM;
@@ -861,6 +864,7 @@ int host_common_params(struct host_data *hd, struct comp_dev *dev,
861864
config->dest_width = config->src_width;
862865
hd->dma_buffer_size = audio_stream_get_size(&hd->dma_buffer->stream);
863866
}
867+
buffer_size = audio_stream_get_size(&hd->dma_buffer->stream);
864868

865869
/* create SG DMA elems for local DMA buffer */
866870
err = create_local_elems(hd, dev, period_count, buffer_size / period_count,

0 commit comments

Comments
 (0)