Skip to content

Commit 1a19ba9

Browse files
committed
audio: buffers: ring_buffer: Allocate memory from shared heap for userspace
Allocates audio data buffer from shared memory heap. The security reqirements assume that the non-privileged modules data and code should be protected from other non-privileged modules access. The audio data could be accessible. This change is effective only when CONFIG_USERSPACE=y. Signed-off-by: Adrian Warecki <adrian.warecki@intel.com>
1 parent 2f924bd commit 1a19ba9

3 files changed

Lines changed: 21 additions & 19 deletions

File tree

src/audio/buffers/ring_buffer.c

Lines changed: 8 additions & 7 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>
@@ -279,17 +280,16 @@ static const struct audio_buffer_ops audio_buffer_ops = {
279280
.reset = ring_buffer_reset
280281
};
281282

282-
struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_space, bool is_shared,
283+
struct ring_buffer *ring_buffer_create(struct comp_dev *dev, size_t min_available,
284+
size_t min_free_space, bool is_shared,
283285
uint32_t id)
284286
{
285287
struct ring_buffer *ring_buffer;
288+
int memory_flags = (is_shared ? SOF_MEM_FLAG_COHERENT : 0) |
289+
user_get_buffer_memory_region(dev->drv);
286290

287291
/* allocate ring_buffer structure */
288-
if (is_shared)
289-
ring_buffer = rzalloc(SOF_MEM_FLAG_USER | SOF_MEM_FLAG_COHERENT,
290-
sizeof(*ring_buffer));
291-
else
292-
ring_buffer = rzalloc(SOF_MEM_FLAG_USER, sizeof(*ring_buffer));
292+
ring_buffer = rzalloc(memory_flags, sizeof(*ring_buffer));
293293
if (!ring_buffer)
294294
return NULL;
295295

@@ -359,7 +359,8 @@ struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_spa
359359
ring_buffer->data_buffer_size =
360360
ALIGN_UP(ring_buffer->data_buffer_size, PLATFORM_DCACHE_ALIGN);
361361
ring_buffer->_data_buffer = (__sparse_force __sparse_cache void *)
362-
rballoc_align(SOF_MEM_FLAG_USER, ring_buffer->data_buffer_size, PLATFORM_DCACHE_ALIGN);
362+
rballoc_align(memory_flags, ring_buffer->data_buffer_size,
363+
PLATFORM_DCACHE_ALIGN);
363364
if (!ring_buffer->_data_buffer)
364365
goto err;
365366

src/include/sof/audio/ring_buffer.h

Lines changed: 4 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

@@ -114,6 +115,7 @@ struct ring_buffer {
114115

115116
/**
116117
*
118+
* @param dev pointer to the DP module device structure
117119
* @param min_available minimum data available in queue required by the module using
118120
* ring_buffer's source api
119121
* @param min_free_space minimum buffer space in queue required by the module using
@@ -122,7 +124,8 @@ struct ring_buffer {
122124
* @param id a stream ID, accessible later by sink_get_id/source_get_id
123125
*
124126
*/
125-
struct ring_buffer *ring_buffer_create(size_t min_available, size_t min_free_space, bool is_shared,
127+
struct ring_buffer *ring_buffer_create(struct comp_dev *dev, size_t min_available,
128+
size_t min_free_space, bool is_shared,
126129
uint32_t id);
127130

128131
#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)