Skip to content

Commit 9567234

Browse files
lyakhlgirdwood
authored andcommitted
buffer: allocate on specific heap
Add a heap parameter to buffer allocation functions. This makes buffer structures accessible to the user-space. Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
1 parent 9802b40 commit 9567234

18 files changed

Lines changed: 90 additions & 65 deletions

File tree

src/audio/buffers/comp_buffer.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ static void comp_buffer_free(struct sof_audio_buffer *audio_buffer)
159159
notifier_unregister_all(NULL, buffer);
160160

161161
rfree(buffer->stream.addr);
162-
rfree(buffer);
162+
sof_heap_free(buffer->audio_buffer.heap, buffer);
163163
}
164164

165165
APP_TASK_DATA static const struct source_ops comp_buffer_source_ops = {
@@ -189,7 +189,8 @@ static const struct audio_buffer_ops audio_buffer_ops = {
189189
.set_alignment_constants = comp_buffer_set_alignment_constants,
190190
};
191191

192-
static struct comp_buffer *buffer_alloc_struct(void *stream_addr, size_t size,
192+
static struct comp_buffer *buffer_alloc_struct(struct k_heap *heap,
193+
void *stream_addr, size_t size,
193194
uint32_t flags, bool is_shared)
194195
{
195196
struct comp_buffer *buffer;
@@ -200,13 +201,14 @@ static struct comp_buffer *buffer_alloc_struct(void *stream_addr, size_t size,
200201
if (is_shared)
201202
flags |= SOF_MEM_FLAG_COHERENT;
202203

203-
buffer = rzalloc(flags, sizeof(*buffer));
204-
204+
buffer = sof_heap_alloc(heap, flags, sizeof(*buffer), 0);
205205
if (!buffer) {
206206
tr_err(&buffer_tr, "could not alloc structure");
207207
return NULL;
208208
}
209209

210+
memset(buffer, 0, sizeof(*buffer));
211+
210212
buffer->flags = flags;
211213
/* Force channels to 2 for init to prevent bad call to clz in buffer_init_stream */
212214
buffer->stream.runtime_stream_params.channels = 2;
@@ -221,14 +223,15 @@ static struct comp_buffer *buffer_alloc_struct(void *stream_addr, size_t size,
221223

222224
audio_stream_set_underrun(&buffer->stream, !!(flags & SOF_BUF_UNDERRUN_PERMITTED));
223225
audio_stream_set_overrun(&buffer->stream, !!(flags & SOF_BUF_OVERRUN_PERMITTED));
226+
buffer->audio_buffer.heap = heap;
224227

225228
comp_buffer_reset_source_list(buffer);
226229
comp_buffer_reset_sink_list(buffer);
227230

228231
return buffer;
229232
}
230233

231-
struct comp_buffer *buffer_alloc(size_t size, uint32_t flags, uint32_t align,
234+
struct comp_buffer *buffer_alloc(struct k_heap *heap, size_t size, uint32_t flags, uint32_t align,
232235
bool is_shared)
233236
{
234237
struct comp_buffer *buffer;
@@ -249,7 +252,7 @@ struct comp_buffer *buffer_alloc(size_t size, uint32_t flags, uint32_t align,
249252
return NULL;
250253
}
251254

252-
buffer = buffer_alloc_struct(stream_addr, size, flags, is_shared);
255+
buffer = buffer_alloc_struct(heap, stream_addr, size, flags, is_shared);
253256
if (!buffer) {
254257
tr_err(&buffer_tr, "could not alloc buffer structure");
255258
rfree(stream_addr);
@@ -258,7 +261,8 @@ struct comp_buffer *buffer_alloc(size_t size, uint32_t flags, uint32_t align,
258261
return buffer;
259262
}
260263

261-
struct comp_buffer *buffer_alloc_range(size_t preferred_size, size_t minimum_size,
264+
struct comp_buffer *buffer_alloc_range(struct k_heap *heap, size_t preferred_size,
265+
size_t minimum_size,
262266
uint32_t flags, uint32_t align, bool is_shared)
263267
{
264268
struct comp_buffer *buffer;
@@ -292,7 +296,7 @@ struct comp_buffer *buffer_alloc_range(size_t preferred_size, size_t minimum_siz
292296
return NULL;
293297
}
294298

295-
buffer = buffer_alloc_struct(stream_addr, size, flags, is_shared);
299+
buffer = buffer_alloc_struct(heap, stream_addr, size, flags, is_shared);
296300
if (!buffer) {
297301
tr_err(&buffer_tr, "could not alloc buffer structure");
298302
rfree(stream_addr);

src/audio/chain_dma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,7 @@ __cold static int chain_task_init(struct comp_dev *dev, uint8_t host_dma_id, uin
591591

592592
fifo_size = ALIGN_UP_INTERNAL(fifo_size, addr_align);
593593
/* allocate not shared buffer */
594-
cd->dma_buffer = buffer_alloc(fifo_size, SOF_MEM_FLAG_USER | SOF_MEM_FLAG_DMA,
594+
cd->dma_buffer = buffer_alloc(NULL, fifo_size, SOF_MEM_FLAG_USER | SOF_MEM_FLAG_DMA,
595595
addr_align, BUFFER_USAGE_NOT_SHARED);
596596

597597
if (!cd->dma_buffer) {

src/audio/copier/copier_generic.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ __cold int create_multi_endpoint_buffer(struct comp_dev *dev,
427427
ipc_buf.size = buf_size;
428428
ipc_buf.comp.pipeline_id = config->pipeline_id;
429429
ipc_buf.comp.core = config->core;
430-
buffer = buffer_new(&ipc_buf, BUFFER_USAGE_NOT_SHARED);
430+
buffer = buffer_new(NULL, &ipc_buf, BUFFER_USAGE_NOT_SHARED);
431431
if (!buffer)
432432
return -ENOMEM;
433433

src/audio/dai-legacy.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,8 @@ int dai_common_params(struct dai_data *dd, struct comp_dev *dev,
561561
return err;
562562
}
563563
} else {
564-
dd->dma_buffer = buffer_alloc(buffer_size, SOF_MEM_FLAG_USER | SOF_MEM_FLAG_DMA,
564+
dd->dma_buffer = buffer_alloc(NULL, buffer_size,
565+
SOF_MEM_FLAG_USER | SOF_MEM_FLAG_DMA,
565566
addr_align, BUFFER_USAGE_NOT_SHARED);
566567
if (!dd->dma_buffer) {
567568
comp_err(dev, "failed to alloc dma buffer");

src/audio/dai-zephyr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1019,7 +1019,7 @@ static int dai_set_dma_buffer(struct dai_data *dd, struct comp_dev *dev,
10191019
return err;
10201020
}
10211021
} else {
1022-
dd->dma_buffer = buffer_alloc_range(buffer_size_preferred, buffer_size,
1022+
dd->dma_buffer = buffer_alloc_range(NULL, buffer_size_preferred, buffer_size,
10231023
SOF_MEM_FLAG_USER | SOF_MEM_FLAG_DMA,
10241024
addr_align, BUFFER_USAGE_NOT_SHARED);
10251025
if (!dd->dma_buffer) {

src/audio/host-legacy.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,8 @@ int host_common_params(struct host_data *hd, struct comp_dev *dev,
764764
goto out;
765765
}
766766
} else {
767-
hd->dma_buffer = buffer_alloc(buffer_size, SOF_MEM_FLAG_USER | SOF_MEM_FLAG_DMA,
767+
hd->dma_buffer = buffer_alloc(NULL, buffer_size,
768+
SOF_MEM_FLAG_USER | SOF_MEM_FLAG_DMA,
768769
addr_align, BUFFER_USAGE_NOT_SHARED);
769770
if (!hd->dma_buffer) {
770771
comp_err(dev, "failed to alloc dma buffer");

src/audio/host-zephyr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,7 @@ int host_common_params(struct host_data *hd, struct comp_dev *dev,
954954
}
955955
} else {
956956
/* allocate not shared buffer */
957-
hd->dma_buffer = buffer_alloc_range(buffer_size_preferred, buffer_size,
957+
hd->dma_buffer = buffer_alloc_range(NULL, buffer_size_preferred, buffer_size,
958958
SOF_MEM_FLAG_USER | SOF_MEM_FLAG_DMA,
959959
addr_align, BUFFER_USAGE_NOT_SHARED);
960960
if (!hd->dma_buffer) {

src/audio/module_adapter/module_adapter.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,8 @@ int module_adapter_prepare(struct comp_dev *dev)
553553
if (list_is_empty(&mod->raw_data_buffers_list)) {
554554
for (i = 0; i < mod->num_of_sinks; i++) {
555555
/* allocate not shared buffer */
556-
struct comp_buffer *buffer = buffer_alloc(buff_size, memory_flags,
556+
struct comp_buffer *buffer = buffer_alloc(md->resources.heap, buff_size,
557+
memory_flags,
557558
PLATFORM_DCACHE_ALIGN,
558559
BUFFER_USAGE_NOT_SHARED);
559560
uint32_t flags;

src/include/sof/audio/buffer.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,12 +211,16 @@ struct buffer_cb_free {
211211
buffer->cb_type = type; \
212212
} while (0)
213213

214+
struct k_heap;
215+
214216
/* pipeline buffer creation and destruction */
215-
struct comp_buffer *buffer_alloc(size_t size, uint32_t flags, uint32_t align,
217+
struct comp_buffer *buffer_alloc(struct k_heap *heap, size_t size, uint32_t flags, uint32_t align,
216218
bool is_shared);
217-
struct comp_buffer *buffer_alloc_range(size_t preferred_size, size_t minimum_size,
219+
struct comp_buffer *buffer_alloc_range(struct k_heap *heap, size_t preferred_size,
220+
size_t minimum_size,
218221
uint32_t flags, uint32_t align, bool is_shared);
219-
struct comp_buffer *buffer_new(const struct sof_ipc_buffer *desc, bool is_shared);
222+
struct comp_buffer *buffer_new(struct k_heap *heap, const struct sof_ipc_buffer *desc,
223+
bool is_shared);
220224

221225
int buffer_set_size(struct comp_buffer *buffer, uint32_t size, uint32_t alignment);
222226
int buffer_set_size_range(struct comp_buffer *buffer, size_t preferred_size, size_t minimum_size,

src/ipc/ipc-helper.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ __cold static bool valid_ipc_buffer_desc(const struct sof_ipc_buffer *desc)
5050
}
5151

5252
/* create a new component in the pipeline */
53-
__cold struct comp_buffer *buffer_new(const struct sof_ipc_buffer *desc, bool is_shared)
53+
__cold struct comp_buffer *buffer_new(struct k_heap *heap, const struct sof_ipc_buffer *desc,
54+
bool is_shared)
5455
{
5556
struct comp_buffer *buffer;
5657
uint32_t flags = desc->flags;
@@ -78,7 +79,7 @@ __cold struct comp_buffer *buffer_new(const struct sof_ipc_buffer *desc, bool is
7879
desc->caps, flags);
7980

8081
/* allocate buffer */
81-
buffer = buffer_alloc(desc->size, flags, PLATFORM_DCACHE_ALIGN,
82+
buffer = buffer_alloc(heap, desc->size, flags, PLATFORM_DCACHE_ALIGN,
8283
is_shared);
8384
if (buffer) {
8485
buffer->stream.runtime_stream_params.id = desc->comp.id;

0 commit comments

Comments
 (0)