Skip to content

Commit cc5182d

Browse files
committed
audio: buffers: ring_buffer: Allocate memory from shared heap for userspace
Signed-off-by: Adrian Warecki <adrian.warecki@intel.com>
1 parent 5057668 commit cc5182d

File tree

3 files changed

+22
-21
lines changed

3 files changed

+22
-21
lines changed

src/audio/buffers/ring_buffer.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <sof/lib/uuid.h>
99

1010
#include <sof/audio/ring_buffer.h>
11+
#include <sof/audio/component.h>
1112

1213
#include <rtos/alloc.h>
1314
#include <ipc/topology.h>
@@ -261,7 +262,7 @@ static struct source_ops ring_buffer_source_ops = {
261262
.release_data = ring_buffer_release_data,
262263
};
263264

264-
static struct sink_ops ring_buffer_sink_ops = {
265+
APP_TASK_DATA static struct sink_ops ring_buffer_sink_ops = {
265266
.get_free_size = ring_buffer_get_free_size,
266267
.get_buffer = ring_buffer_get_buffer,
267268
.commit_buffer = ring_buffer_commit_buffer,
@@ -273,18 +274,17 @@ static const struct audio_buffer_ops audio_buffer_ops = {
273274
.reset = ring_buffer_reset
274275
};
275276

276-
struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_space, bool is_shared,
277+
struct ring_buffer *ring_buffer_create(struct comp_dev *dev, size_t min_available,
278+
size_t min_free_space, bool is_shared,
277279
uint32_t id)
278280
{
279281
struct ring_buffer *ring_buffer;
282+
enum mem_zone zone = is_shared ?
283+
SOF_MEM_ZONE_RUNTIME_SHARED : SOF_MEM_ZONE_RUNTIME;
284+
int memory_caps = SOF_MEM_CAPS_RAM | (dev->drv->drv_heap ? SOF_MEM_CAPS_MMU_SHD : 0);
280285

281286
/* allocate ring_buffer structure */
282-
if (is_shared)
283-
ring_buffer = rzalloc(SOF_MEM_ZONE_RUNTIME_SHARED, 0, SOF_MEM_CAPS_RAM,
284-
sizeof(*ring_buffer));
285-
else
286-
ring_buffer = rzalloc(SOF_MEM_ZONE_RUNTIME, 0, SOF_MEM_CAPS_RAM,
287-
sizeof(*ring_buffer));
287+
ring_buffer = rzalloc(zone, 0, memory_caps, sizeof(*ring_buffer));
288288
if (!ring_buffer)
289289
return NULL;
290290

@@ -354,7 +354,8 @@ struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_spa
354354
ring_buffer->data_buffer_size =
355355
ALIGN_UP(ring_buffer->data_buffer_size, PLATFORM_DCACHE_ALIGN);
356356
ring_buffer->_data_buffer = (__sparse_force __sparse_cache void *)
357-
rballoc_align(0, 0, ring_buffer->data_buffer_size, PLATFORM_DCACHE_ALIGN);
357+
rballoc_align(0, memory_caps, ring_buffer->data_buffer_size,
358+
PLATFORM_DCACHE_ALIGN);
358359
if (!ring_buffer->_data_buffer)
359360
goto err;
360361

src/include/sof/audio/ring_buffer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
* always means "buffer full"
9898
*/
9999

100+
struct comp_dev;
100101
struct ring_buffer;
101102
struct sof_audio_stream_params;
102103

@@ -122,7 +123,8 @@ struct ring_buffer {
122123
* @param id a stream ID, accessible later by sink_get_id/source_get_id
123124
*
124125
*/
125-
struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_space, bool is_shared,
126+
struct ring_buffer *ring_buffer_create(struct comp_dev *dev, size_t min_available,
127+
size_t min_free_space, bool is_shared,
126128
uint32_t id);
127129

128130
#endif /* __SOF_RING_BUFFER_H__ */

src/ipc/ipc4/helper.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -603,25 +603,23 @@ __cold int ipc_comp_connect(struct ipc *ipc, ipc_pipe_comp_connect *_connect)
603603

604604
if (sink->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_DP ||
605605
source->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_DP) {
606-
struct sof_source *source = audio_buffer_get_source(&buffer->audio_buffer);
607-
struct sof_sink *sink = audio_buffer_get_sink(&buffer->audio_buffer);
606+
bool dp_on_source = source->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_DP;
607+
struct sof_source *src = audio_buffer_get_source(&buffer->audio_buffer);
608+
struct sof_sink *snk = audio_buffer_get_sink(&buffer->audio_buffer);
608609

609-
ring_buffer = ring_buffer_create(source_get_min_available(source),
610-
sink_get_min_free_space(sink),
610+
ring_buffer = ring_buffer_create(dp_on_source ? source : sink,
611+
source_get_min_available(src),
612+
sink_get_min_free_space(snk),
611613
audio_buffer_is_shared(&buffer->audio_buffer),
612614
buf_get_id(buffer));
613615
if (!ring_buffer)
614616
goto free;
615-
}
616617

617-
if (sink->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_DP)
618618
/* data destination module needs to use ring_buffer */
619-
audio_buffer_attach_secondary_buffer(&buffer->audio_buffer, false, /* at_input */
620-
&ring_buffer->audio_buffer);
621-
else if (source->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_DP)
622-
/* data source module needs to use ring_buffer */
623-
audio_buffer_attach_secondary_buffer(&buffer->audio_buffer, true, /* at_input */
619+
audio_buffer_attach_secondary_buffer(&buffer->audio_buffer, dp_on_source,
624620
&ring_buffer->audio_buffer);
621+
}
622+
625623
#endif /* CONFIG_ZEPHYR_DP_SCHEDULER */
626624
/*
627625
* Connect and bind the buffer to both source and sink components with LL processing been

0 commit comments

Comments
 (0)