Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions posix/include/sof/lib/cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,11 @@ static inline bool cpu_is_primary(int id)

static inline bool cpu_is_me(int id)
{
#if CONFIG_LIBRARY
return true;
#else
return id == cpu_get_id();
#endif
}
#endif

Expand Down
6 changes: 6 additions & 0 deletions src/arch/host/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ target_compile_options(sof_options INTERFACE -g -O3 -fPIC -DPIC -std=c99 -std=gn
-Wall -Werror -Wmissing-prototypes ${implicit_fallthrough} -Wno-pointer-to-int-cast
-Wno-int-to-pointer-cast -Wpointer-arith
-DCONFIG_LIBRARY "-imacros${CONFIG_H_PATH}")
if(CMAKE_C_COMPILER MATCHES "xt-|xtensa-")
target_compile_options(sof_options INTERFACE
-U__INT32_TYPE__ -D__INT32_TYPE__=int
-U__UINT32_TYPE__ "-D__UINT32_TYPE__=unsigned int"
-Wno-format)
endif()

if(NOT BUILD_UNIT_TESTS_HOST)
add_subdirectory(lib)
Expand Down
6 changes: 6 additions & 0 deletions src/arch/host/configs/library_defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ CONFIG_COMP_RTNR=y
CONFIG_COMP_SEL=y
CONFIG_COMP_SOUND_DOSE=y
CONFIG_COMP_SRC=y
CONFIG_COMP_SRC_LITE=y
CONFIG_COMP_SRC_IPC4_FULL_MATRIX=y
CONFIG_COMP_STFT_PROCESS=y
CONFIG_COMP_STUBS=y
Expand All @@ -27,10 +28,15 @@ CONFIG_COMP_TONE=y
CONFIG_COMP_VOLUME=y
CONFIG_COMP_VOLUME_LINEAR_RAMP=y
CONFIG_COMP_VOLUME_WINDOWS_FADE=y
CONFIG_CORE_COUNT=8
CONFIG_CROSS_CORE_STREAM=y
CONFIG_DEBUG_MEMORY_USAGE_SCAN=n
CONFIG_IPC_MAJOR_3=n
CONFIG_IPC_MAJOR_4=y
CONFIG_LIBRARY=y
CONFIG_MATH_IIR_DF2T=y
CONFIG_MP_MAX_NUM_CPUS=8
CONFIG_PIPELINE_2_0=y
CONFIG_TRACEV=y
CONFIG_XT_RUN=y
CONFIG_ZEPHYR_DP_SCHEDULER=y
37 changes: 32 additions & 5 deletions src/arch/host/include/arch/lib/cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,29 +10,56 @@
#ifndef __ARCH_LIB_CPU_H__
#define __ARCH_LIB_CPU_H__

int __attribute__((weak)) host_cpu_num_cores(void);
int __attribute__((weak)) host_cpu_enable_core(int id);
void __attribute__((weak)) host_cpu_disable_core(int id);
int __attribute__((weak)) host_cpu_is_core_enabled(int id);
int __attribute__((weak)) host_cpu_enabled_cores(void);

static inline int arch_cpu_num_cores(void)
{
if (host_cpu_num_cores)
return host_cpu_num_cores();
#ifdef CONFIG_CORE_COUNT
return CONFIG_CORE_COUNT;
#else
return 1;
#endif
}

static inline int arch_cpu_enable_core(int id)
{
if (host_cpu_enable_core)
return host_cpu_enable_core(id);
return 0;
}

static inline void arch_cpu_disable_core(int id)
{
if (host_cpu_disable_core)
host_cpu_disable_core(id);
}

static inline int arch_cpu_is_core_enabled(int id)
{
return 0;
if (host_cpu_is_core_enabled)
return host_cpu_is_core_enabled(id);
return 1;
}

static inline int arch_cpu_enabled_cores(void)
{
if (host_cpu_enabled_cores)
return host_cpu_enabled_cores();
#ifdef CONFIG_CORE_COUNT
return (1 << CONFIG_CORE_COUNT) - 1;
#else
return 1;
#endif
}

static inline int arch_cpu_get_id(void)
{
return 0;
}
int arch_cpu_get_id(void);
void host_cpu_set_id(int id);

static inline int arch_cpu_restore_secondary_cores(void)
{
Expand Down
6 changes: 4 additions & 2 deletions src/audio/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,9 @@ if(CONFIG_ZEPHYR_NATIVE_DRIVERS)
sof_list_append_ifdef(CONFIG_COMP_DAI base_files dai-zephyr.c)
else()
list(APPEND base_files host-legacy.c)
sof_list_append_ifdef(CONFIG_COMP_DAI base_files dai-legacy.c)
if(CONFIG_COMP_DAI AND NOT CONFIG_LIBRARY)
list(APPEND base_files dai-legacy.c)
endif()
endif()

### Common files
Expand All @@ -180,7 +182,7 @@ else() ### library, e.g. testbench ###
${base_files}
)

if(CONFIG_COMP_DAI)
if(CONFIG_COMP_DAI AND NOT CONFIG_LIBRARY)
add_local_sources(sof
dai-legacy.c
)
Expand Down
68 changes: 63 additions & 5 deletions src/audio/buffers/comp_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,43 @@ SOF_DEFINE_REG_UUID(buffer);
/* unused with Zephyr, generates no output */
DECLARE_TR_CTX(buffer_tr, SOF_UUID(buffer_uuid), LOG_LEVEL_INFO);

#if defined(CONFIG_LIBRARY) && !defined(__XTENSA__) && !defined(CONFIG_XT_SIMULATOR) && \
!defined(UNIT_TEST)
static volatile int shared_comp_buf_lock;
static __thread int shared_comp_buf_lock_depth;

void comp_buffer_shared_lock(struct comp_buffer *buffer)
{
if (buffer && audio_buffer_is_shared(&buffer->audio_buffer)) {
if (shared_comp_buf_lock_depth++ == 0) {
while (__atomic_test_and_set(&shared_comp_buf_lock, __ATOMIC_ACQUIRE))
;
}
}
}

void comp_buffer_shared_unlock(struct comp_buffer *buffer)
{
if (buffer && audio_buffer_is_shared(&buffer->audio_buffer)) {
if (--shared_comp_buf_lock_depth == 0)
__atomic_clear(&shared_comp_buf_lock, __ATOMIC_RELEASE);
}
}
#endif

#define shared_buf_lock(buffer) comp_buffer_shared_lock(buffer)
#define shared_buf_unlock(buffer) comp_buffer_shared_unlock(buffer)

static size_t comp_buffer_get_data_available(struct sof_source *source)
{
struct comp_buffer *buffer = comp_buffer_get_from_source(source);
size_t avail;

shared_buf_lock(buffer);
avail = audio_stream_get_avail_bytes(&buffer->stream);
shared_buf_unlock(buffer);

return audio_stream_get_avail_bytes(&buffer->stream);
return avail;
}

static int comp_buffer_get_data(struct sof_source *source, size_t req_size,
Expand All @@ -44,47 +76,63 @@ static int comp_buffer_get_data(struct sof_source *source, size_t req_size,
{
struct comp_buffer *buffer = comp_buffer_get_from_source(source);

if (req_size > audio_stream_get_avail_bytes(&buffer->stream))
shared_buf_lock(buffer);
if (req_size > audio_stream_get_avail_bytes(&buffer->stream)) {
shared_buf_unlock(buffer);
return -ENODATA;
}

buffer_stream_invalidate(buffer, req_size);

/* get circular buffer parameters */
*data_ptr = buffer->stream.r_ptr;
*buffer_start = buffer->stream.addr;
*buffer_size = buffer->stream.size;
shared_buf_unlock(buffer);
return 0;
}

static int comp_buffer_release_data(struct sof_source *source, size_t free_size)
{
struct comp_buffer *buffer = comp_buffer_get_from_source(source);

if (free_size)
if (free_size) {
shared_buf_lock(buffer);
audio_stream_consume(&buffer->stream, free_size);
shared_buf_unlock(buffer);
}

return 0;
}

static size_t comp_buffer_get_free_size(struct sof_sink *sink)
{
struct comp_buffer *buffer = comp_buffer_get_from_sink(sink);
size_t free_size;

shared_buf_lock(buffer);
free_size = audio_stream_get_free_bytes(&buffer->stream);
shared_buf_unlock(buffer);

return audio_stream_get_free_bytes(&buffer->stream);
return free_size;
}

static int comp_buffer_get_buffer(struct sof_sink *sink, size_t req_size,
void **data_ptr, void **buffer_start, size_t *buffer_size)
{
struct comp_buffer *buffer = comp_buffer_get_from_sink(sink);

if (req_size > audio_stream_get_free_bytes(&buffer->stream))
shared_buf_lock(buffer);
if (req_size > audio_stream_get_free_bytes(&buffer->stream)) {
shared_buf_unlock(buffer);
return -ENODATA;
}

/* get circular buffer parameters */
*data_ptr = buffer->stream.w_ptr;
*buffer_start = buffer->stream.addr;
*buffer_size = buffer->stream.size;
shared_buf_unlock(buffer);
return 0;
}

Expand All @@ -93,8 +141,10 @@ static int comp_buffer_commit_buffer(struct sof_sink *sink, size_t commit_size)
struct comp_buffer *buffer = comp_buffer_get_from_sink(sink);

if (commit_size) {
shared_buf_lock(buffer);
buffer_stream_writeback(buffer, commit_size);
comp_update_buffer_produce(buffer, commit_size);
shared_buf_unlock(buffer);
Comment on lines +144 to +147

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in d152cdb and bb95a2a: exposed thread-reentrant comp_buffer_shared_lock() / comp_buffer_shared_unlock() helpers and guarded comp_update_buffer_produce(), comp_update_buffer_consume(), module_adapter_audio_stream_copy_1to1(), module_adapter_audio_stream_type_copy(), and file_process().

}

return 0;
Expand Down Expand Up @@ -560,6 +610,8 @@ void comp_update_buffer_produce(struct comp_buffer *buffer, uint32_t bytes)
return;
}

shared_buf_lock(buffer);

#if CONFIG_PROBE
void *produce_begin = audio_stream_get_wptr(&buffer->stream);
#endif
Expand Down Expand Up @@ -589,6 +641,8 @@ void comp_update_buffer_produce(struct comp_buffer *buffer, uint32_t bytes)
((char *)audio_stream_get_wptr(&buffer->stream) -
(char *)audio_stream_get_addr(&buffer->stream)));
#endif

shared_buf_unlock(buffer);
}

void comp_update_buffer_consume(struct comp_buffer *buffer, uint32_t bytes)
Expand All @@ -610,6 +664,8 @@ void comp_update_buffer_consume(struct comp_buffer *buffer, uint32_t bytes)
return;
}

shared_buf_lock(buffer);

audio_stream_consume(&buffer->stream, bytes);

#if CONFIG_SOF_LOG_DBG_BUFFER
Expand All @@ -622,6 +678,8 @@ void comp_update_buffer_consume(struct comp_buffer *buffer, uint32_t bytes)
((char *)audio_stream_get_wptr(&buffer->stream) -
(char *)audio_stream_get_addr(&buffer->stream)));
#endif

shared_buf_unlock(buffer);
}

static inline struct list_item *buffer_comp_list(struct comp_buffer *buffer,
Expand Down
24 changes: 23 additions & 1 deletion src/audio/buffers/ring_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,13 @@ size_t ring_buffer_inc_offset(struct ring_buffer *ring_buffer, size_t offset, si
static inline
size_t _ring_buffer_get_data_available(struct ring_buffer *ring_buffer)
{
#if defined(CONFIG_LIBRARY) && !defined(__XTENSA__) && !defined(CONFIG_XT_SIMULATOR)
int32_t w_off = __atomic_load_n(&ring_buffer->_write_offset, __ATOMIC_ACQUIRE);
int32_t r_off = __atomic_load_n(&ring_buffer->_read_offset, __ATOMIC_ACQUIRE);
int32_t avail_data = w_off - r_off;
#else
int32_t avail_data = ring_buffer->_write_offset - ring_buffer->_read_offset;
#endif
/* wrap around ? 2*size because of "double area" */
if (avail_data < 0)
avail_data = 2 * ring_buffer->data_buffer_size + avail_data;
Expand Down Expand Up @@ -199,9 +205,17 @@ static int ring_buffer_commit_buffer(struct sof_sink *sink, size_t commit_size)
commit_size);

/* move write pointer */
#if defined(CONFIG_LIBRARY) && !defined(__XTENSA__) && !defined(CONFIG_XT_SIMULATOR)
__atomic_store_n(&ring_buffer->_write_offset,
ring_buffer_inc_offset(ring_buffer,
ring_buffer->_write_offset,
commit_size),
__ATOMIC_RELEASE);
#else
ring_buffer->_write_offset = ring_buffer_inc_offset(ring_buffer,
ring_buffer->_write_offset,
commit_size);
#endif
}

return 0;
Expand Down Expand Up @@ -237,15 +251,23 @@ static int ring_buffer_release_data(struct sof_source *source, size_t free_size)
CORE_CHECK_STRUCT(&ring_buffer->audio_buffer);
if (free_size) {
/* data consumed, free buffer space, no need for any special cache operations */
#if defined(CONFIG_LIBRARY) && !defined(__XTENSA__) && !defined(CONFIG_XT_SIMULATOR)
__atomic_store_n(&ring_buffer->_read_offset,
ring_buffer_inc_offset(ring_buffer,
ring_buffer->_read_offset,
free_size),
__ATOMIC_RELEASE);
#else
ring_buffer->_read_offset = ring_buffer_inc_offset(ring_buffer,
ring_buffer->_read_offset,
free_size);
#endif
}

return 0;
}

int ring_buffer_module_unbind(struct sof_sink *sink)
static int ring_buffer_module_unbind(struct sof_sink *sink)
{
struct ring_buffer *ring_buffer = ring_buffer_from_sink(sink);

Expand Down
10 changes: 10 additions & 0 deletions src/audio/component.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@
#include <stddef.h>
#include <stdint.h>

#if CONFIG_LIBRARY && !defined(UNIT_TEST)
#include <platform/lib/telemetry_sched.h>
#endif

#if defined(__XCC__)
#include <xtensa/config/core-isa.h>
# if XCHAL_HAVE_HIFI5
Expand Down Expand Up @@ -619,7 +623,13 @@ int comp_copy(struct comp_dev *dev)
if (comp_check_eos(dev))
return 0;

#if CONFIG_LIBRARY && !defined(UNIT_TEST)
uint64_t telem_start = host_telem_mod_entry(dev, false);
#endif
ret = dev->drv->ops.copy(dev);
#if CONFIG_LIBRARY && !defined(UNIT_TEST)
host_telem_mod_exit(dev, false, telem_start, ret);
#endif

#ifdef CONFIG_SOF_TELEMETRY_PERFORMANCE_MEASUREMENTS
const uint32_t cycles_consumed = (uint32_t)telemetry_timestamp() - begin_stamp;
Expand Down
5 changes: 4 additions & 1 deletion src/audio/copier/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
add_local_sources(sof copier.c copier_hifi.c copier_generic.c copier_host.c copier_dai.c)
add_local_sources(sof copier.c copier_hifi.c copier_generic.c copier_host.c)
if(NOT CONFIG_LIBRARY)
add_local_sources(sof copier_dai.c)
endif()
if(CONFIG_IPC4_GATEWAY)
add_local_sources(sof
copier_ipcgtw.c
Expand Down
Loading
Loading