Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e5f0324
scripts: llext: support relocatable link bypass
lrgirdwo Jun 16, 2026
9f31eec
library_manager: llext: implement page-level VMA allocator for reloca…
lrgirdwo Jun 16, 2026
1a8d1bb
zephyr: llext: link non-relocatable modules -Bsymbolic-functions
lrgirdwo Aug 16, 2026
a75c52f
lib: cpp: export operator new/delete and __cxa_pure_virtual for LLEXT
lrgirdwo Aug 16, 2026
bfd9f59
lib: ams: export producer API for LLEXT modules
lrgirdwo Aug 16, 2026
26154bf
scripts: xtensa-build-zephyr: create per-UUID symlinks in install_lib()
lrgirdwo Aug 16, 2026
75e79db
platform: cavs: initialize DP scheduler during platform_init
singalsu Aug 24, 2026
2cae5b7
audio: mfcc: add mel40 and mel40_10ms profiles for microWakeWord fron…
singalsu Aug 27, 2026
a378a67
audio: microwakeword: implement mww component
singalsu Aug 27, 2026
6303c52
audio: microwakeword: update default strawberry model
singalsu Aug 27, 2026
8686a5c
audio: microwakeword: tune: add model training and verification toolc…
singalsu Aug 27, 2026
d9b2248
tools: topology2: add microWakeWord (MWW) Wake-on-Voice topologies an…
singalsu Aug 27, 2026
c43d049
rimage: config: include microWakeWord (MWW) module in platform manifests
singalsu Aug 27, 2026
916969e
[DNM] platform: cavs25: enable MWW model loading from bytes control
singalsu Sep 4, 2026
4bc2cc8
audio: microwakeword: Add models data for additional two keywords
singalsu Sep 7, 2026
7f3b53e
[DNM] audio: buffers: add support for DP-to-DP component binding
singalsu Sep 8, 2026
083c474
audio: pipeline: guard against NULL source or sink in pipeline_copy()
singalsu Sep 9, 2026
304152b
tools: topology2: enlarge KPB to micsel buffer in MWW capture pipeline
singalsu Sep 9, 2026
6081eff
audio: microwakeword: double AGC gain release rate during silence
singalsu Sep 9, 2026
600f8f8
audio: microwakeword: lower detection threshold to 60 percent
singalsu Sep 9, 2026
89de145
topology2: decoder/encoder: bump heap/stack requirement for DP userspace
ujfalusi Sep 9, 2026
561fdfb
library_manager: skip LLEXT domain add/remove for native modules
ujfalusi Sep 9, 2026
c00c436
schedule: dp: flatten ext_data across the DP userspace thread boundary
ujfalusi Sep 9, 2026
97b4b61
module_adapter: cadence: make cadence_api_table const
ujfalusi Sep 9, 2026
4652d43
module_adapter: route mod_balloc_align() through the module's vregion
ujfalusi Sep 9, 2026
02646b7
pipeline: move End Of Stream to component
lyakh Sep 8, 2026
3e4bda9
vregion: allocate vregion metadata as coherent memory
ujfalusi Sep 9, 2026
310cdf9
WIP: pcm101 debug snapshot (option C + defensive edits)
singalsu Sep 10, 2026
f2422eb
[DNM] audio: kpb: add polling drain notify and handle sink loss
singalsu Sep 11, 2026
0cccfa3
[DNM] audio: microwakeword: use kpb polling notify for keyword trigger
singalsu Sep 11, 2026
619ce20
audio: mfcc: set DP schedule period from FFT hop cadence
singalsu Sep 11, 2026
b196550
audio: module_adapter: skip zero-rate sinks in DP period calc
singalsu Sep 11, 2026
0d173c7
sink: guard sink_get_free_frames against zero frame size
singalsu Sep 11, 2026
a59bd42
vregion: include llext/symbol.h for EXPORT_SYMBOL
singalsu Sep 11, 2026
d55a66d
audio: mfcc: tune: disable VAD control updates for mel40_10ms_compress
singalsu Sep 11, 2026
454fa66
tools: topology2: drop MFCC VAD switch from MWW capture topologies
singalsu Sep 11, 2026
420c21a
[DNM] boards: intel_adsp_ace30_ptl: build MWW/KPB pipeline statically
singalsu Sep 11, 2026
72f20b8
audio: microwakeword: tune: mix broadband noise into positive samples
singalsu Sep 11, 2026
d36213c
audio: microwakeword: update models for keywords
singalsu Sep 11, 2026
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
3 changes: 3 additions & 0 deletions app/boards/intel_adsp/Kconfig.defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@ config L3_HEAP
config ZEPHYR_DP_SCHEDULER
default y

config DP_TO_DP_BIND
default y

config ZEPHYR_NATIVE_DRIVERS
default y

Expand Down
75 changes: 45 additions & 30 deletions app/boards/intel_adsp_ace30_ptl.conf
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,59 @@ CONFIG_RIMAGE_SIGNING_SCHEMA="ptl"
CONFIG_IPC_MAJOR_4=y

# SOF / audio pipeline and module settings
CONFIG_COMP_TESTER=m
# cavs25-style static build for PTL: no LLEXT / library-manager /
# userspace. mww and everything the mww capture pipeline uses is built
# statically into the base FW image.
CONFIG_COMP_TESTER=n
CONFIG_COMP_SRC_IPC4_FULL_MATRIX=y
CONFIG_FORMAT_CONVERT_HIFI3=n

# SOF / audio modules / mocks
# This mock is part of official sof-bin releases because the CI that
# tests it can't use extra CONFIGs. See #9410, #8722 and #9386
CONFIG_COMP_GOOGLE_RTC_AUDIO_PROCESSING=m
CONFIG_GOOGLE_RTC_AUDIO_PROCESSING_MOCK=y
CONFIG_COMP_STFT_PROCESS=y
CONFIG_COMP_GOOGLE_RTC_AUDIO_PROCESSING=n
CONFIG_COMP_STFT_PROCESS=n
CONFIG_SOF_STAGING=y
CONFIG_COMP_KPB=y
CONFIG_CPP=y
CONFIG_STD_CPP17=y
# tflmcly (stock keyword model) is not GNU-toolchain-clean on aphid;
# mww builds its own independent TFLM lib copy.
CONFIG_COMP_TENSORFLOW=n
CONFIG_COMP_MFCC=y
CONFIG_COMP_MWW=y
CONFIG_COMP_MWW_DEBUG_TRACE=y
CONFIG_COMP_MWW_MODEL_FROM_CONTROL=y
CONFIG_AMS=y
CONFIG_STACK_SIZE_EDF=32768
CONFIG_COMP_VOLUME=y
CONFIG_COMP_GAIN=y
CONFIG_COMP_IIR=y
CONFIG_COMP_SRC=y
CONFIG_MATH_IIR=y
# Standard hda-generic components, built statically (cavs25 parity).
CONFIG_COMP_ARIA=y
CONFIG_COMP_CROSSOVER=y
CONFIG_COMP_DRC=y
CONFIG_COMP_MULTIBAND_DRC=y
CONFIG_COMP_VOLUME_WINDOWS_FADE=y
CONFIG_PCM_CONVERTER_FORMAT_S16LE=y
CONFIG_PCM_CONVERTER_FORMAT_S24LE=y
CONFIG_PCM_CONVERTER_FORMAT_S32LE=y
CONFIG_PCM_CONVERTER_FORMAT_S24_3LE=y

# SOF / infrastructure
CONFIG_KCPS_DYNAMIC_CLOCK_CONTROL=n
# Match cavs25 static-mww build: 15 ms default IDC timeout is too tight
# for CREATE_PIPELINE forwarded to a secondary core while the DP scheduler
# and TFLM tensor-arena setup are in flight.
CONFIG_IDC_TIMEOUT_US=100000
CONFIG_PROBE=y
CONFIG_PROBE_DMA_MAX=2
CONFIG_SOF_TELEMETRY=y
CONFIG_SOF_TELEMETRY_IO_PERFORMANCE_MEASUREMENTS=y
CONFIG_SOF_TELEMETRY_PERFORMANCE_MEASUREMENTS=y
CONFIG_COLD_STORE_EXECUTE_DRAM=y

# SOF / loadable modules
# SOF / loadable modules -- disabled for cavs25-style static build.
CONFIG_INTEL_MODULES=y
CONFIG_LIBRARY_AUTH_SUPPORT=y
CONFIG_LIBRARY_MANAGER=y
CONFIG_LIBRARY_BASE_ADDRESS=0xa0688000
CONFIG_LIBRARY_BUILD_LIB=y
CONFIG_LIBRARY_DEFAULT_MODULAR=y
CONFIG_LIBRARY_MANAGER=n

# SOF / logging
CONFIG_SOF_LOG_LEVEL_INF=y
Expand All @@ -43,12 +69,8 @@ CONFIG_SOF_LOG_LEVEL_INF=y
CONFIG_DEBUG_COREDUMP_BACKEND_INTEL_ADSP_MEM_WINDOW=y
CONFIG_DEBUG_COREDUMP_MEMORY_DUMP_MIN=y
CONFIG_COUNTER=y
CONFIG_HEAP_MEM_POOL_SIZE=8192
CONFIG_LLEXT=y
CONFIG_LLEXT_STORAGE_WRITABLE=y
CONFIG_LLEXT_EXPERIMENTAL=y
CONFIG_LLEXT_EDK=n
CONFIG_MODULES=y
CONFIG_HEAP_MEM_POOL_SIZE=32768
CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE=32768

# Zephyr / device drivers
CONFIG_DAI_INIT_PRIORITY=70
Expand All @@ -73,13 +95,6 @@ CONFIG_LOG_BACKEND_ADSP=n
CONFIG_LOG_FLUSH_SLEEP_US=5000
CONFIG_WINSTREAM_CONSOLE=n

# Userspace options
CONFIG_USERSPACE=y
CONFIG_DYNAMIC_THREAD=y
CONFIG_DYNAMIC_THREAD_ALLOC=y
CONFIG_DYNAMIC_THREAD_PREFER_ALLOC=y
CONFIG_SOF_STACK_SIZE=8192
CONFIG_SOF_USERSPACE_PROXY=y
CONFIG_MAX_THREAD_BYTES=3

CONFIG_MAX_DOMAIN_PARTITIONS=32
# Diagnostics (kept from LLEXT-era conf while validating static build).
CONFIG_SYS_HEAP_RUNTIME_STATS=y
CONFIG_SOF_ZEPHYR_HEAP_SIZE=0x80000
14 changes: 13 additions & 1 deletion app/boards/intel_adsp_cavs25.conf
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,24 @@ CONFIG_COMP_MFCC=y
CONFIG_COMP_MULTIBAND_DRC=y
CONFIG_COMP_VOLUME_WINDOWS_FADE=y
CONFIG_FORMAT_CONVERT_HIFI3=n
CONFIG_SOF_STAGING=y
CONFIG_CPP=y
CONFIG_STD_CPP17=y
# cavs2.5 has no LLEXT/module-manager support (see CONFIG_LIBRARY_MANAGER=n
# below), so build mww in statically rather than as an LLEXT module.
CONFIG_COMP_MWW=y
CONFIG_COMP_MWW_DEBUG_TRACE=y
CONFIG_COMP_MWW_MODEL_FROM_CONTROL=y
CONFIG_STACK_SIZE_EDF=32768
CONFIG_PCM_CONVERTER_FORMAT_S16LE=y
CONFIG_PCM_CONVERTER_FORMAT_S24LE=y
CONFIG_PCM_CONVERTER_FORMAT_S32LE=y
CONFIG_PCM_CONVERTER_FORMAT_S24_3LE=y

# SOF / infrastructure
CONFIG_AMS=y
CONFIG_IDC_TIMEOUT_US=100000
CONFIG_P4WQ_INIT_STAGE_EARLY=y
CONFIG_LP_MEMORY_BANKS=1
CONFIG_HP_MEMORY_BANKS=30

Expand All @@ -35,7 +46,8 @@ CONFIG_SOF_LOG_LEVEL_INF=y
# choices have to be selected per board.
CONFIG_DEBUG_COREDUMP_BACKEND_INTEL_ADSP_MEM_WINDOW=y
CONFIG_DEBUG_COREDUMP_MEMORY_DUMP_MIN=y
CONFIG_HEAP_MEM_POOL_SIZE=8192
CONFIG_HEAP_MEM_POOL_SIZE=32768
CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE=32768

# Zephyr / device drivers
CONFIG_DAI_INIT_PRIORITY=70
Expand Down
1 change: 1 addition & 0 deletions app/llext_relocatable.conf
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
CONFIG_LLEXT_TYPE_ELF_RELOCATABLE=y
CONFIG_LLEXT_EXPORT_BUILTINS_BY_SLID=y
3 changes: 3 additions & 0 deletions scripts/llext_offset_calc.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ def get_elf_size(elf_name):
if section.header['sh_addr'] + section.header['sh_size'] > end:
end = section.header['sh_addr'] + section.header['sh_size']

if start == 0xffffffff:
return 0

size = end - start

return size
Expand Down
67 changes: 47 additions & 20 deletions scripts/tensorflow-clone.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/bin/bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2025 Intel Corporation. All rights reserved.
# Copyright(c) 2025-2026 Intel Corporation. All rights reserved.

# fail immediately on any errors
set -e
Expand All @@ -14,8 +14,7 @@ declare -a REPOS=(
"https://github.com/google/ruy"
)

# Commit ID to check for (optional). If specified, the script will update
# the repository if this commit ID is not found. Leave empty to skip.
# Commit ID to check out. If specified, the script will checkout this commit.
declare -a COMMIT_ID=(
"cdedfb1a1044eb774915de21b63a1b6aa93276f6"
"e86d97b6237f88ab5925c0b41e3e3589a1560d86"
Expand All @@ -25,7 +24,10 @@ declare -a COMMIT_ID=(
)

# Directory where repositories will be cloned/updated.
BASE_DIR="$HOME/work/sof" # Or any other desired location
# Default to the parent directory containing the SOF workspace.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SOF_PARENT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
BASE_DIR="${1:-"$SOF_PARENT_DIR"}"

# Function to check if a commit ID exists in a repository
check_commit() {
Expand All @@ -36,40 +38,65 @@ check_commit() {
return 0 # Skip check if no commit ID is provided
fi

if ! git -C "$repo_dir" rev-parse --quiet --verify "$commit_id" >/dev/null 2>&1; then
return 1 # Commit ID not found
if ! git -C "$repo_dir" rev-parse --quiet --verify "$commit_id^{commit}" >/dev/null 2>&1; then
return 1 # Commit ID not found locally
else
return 0 # Commit ID found
return 0 # Commit ID found locally
fi
}


# Function to update the repository
update_repo() {
local repo_dir="$1"
echo "Updating repository: $repo_dir"
git -C "$repo_dir" fetch --all
git -C "$repo_dir" pull
git -C "$repo_dir" fetch --all --tags --prune
}

# Function to checkout the required commit ID
checkout_commit() {
local repo_dir="$1"
local commit_id="$2"
local repo_name="$3"

if [ -z "$commit_id" ]; then
return 0
fi

local current_commit
current_commit=$(git -C "$repo_dir" rev-parse HEAD)

local target_commit
target_commit=$(git -C "$repo_dir" rev-parse "$commit_id^{commit}")

if [ "$current_commit" != "$target_commit" ]; then
echo "Checking out $commit_id in $repo_name..."
git -C "$repo_dir" checkout -q "$commit_id"
else
echo "Repository $repo_name is already at commit $commit_id."
fi
}

# Main script logic
mkdir -p "$BASE_DIR"

for ((i = 0; i < ${#REPOS[@]}; i++)); do
echo "Counter: $i, Value: ${REPOS[i]}"
repo_url=${REPOS[i]}

repo_name=$(basename "$repo_url" .git) # Extract repo name
repo_url="${REPOS[i]}"
commit_id="${COMMIT_ID[i]}"
repo_name=$(basename "$repo_url" .git)
repo_dir="$BASE_DIR/$repo_name"

if [ ! -d "$repo_dir" ]; then
echo "Cloning repository: $repo_url"
echo "=== [$((i + 1))/${#REPOS[@]}] $repo_name ==="

if [ ! -d "$repo_dir/.git" ]; then
echo "Cloning repository: $repo_url -> $repo_dir"
git clone "$repo_url" "$repo_dir" || { echo "git clone failed for $repo_url"; exit 1; }
elif ! check_commit "$repo_dir" "${COMMIT_ID[i]}"; then
fi

if ! check_commit "$repo_dir" "$commit_id"; then
update_repo "$repo_dir"
else
echo "Repository $repo_name is up to date."
fi

checkout_commit "$repo_dir" "$commit_id" "$repo_name"
done

echo "All repositories processed."
echo "All repositories processed and checked out to required commits."
4 changes: 4 additions & 0 deletions scripts/xtensa-build-zephyr.py
Original file line number Diff line number Diff line change
Expand Up @@ -1174,6 +1174,10 @@ def install_lib(platform, sof_output_dir, abs_build_dir, platform_wconfig):
symlink_or_copy(lib_install_dir, lib_name,
lib_dir, alias_libname)

for uuid in lib_uuids.get(key, []):
linkname = uuid + '.bin'
symlink_or_copy(lib_install_dir, lib_name, sof_lib_dir, linkname)

def install_platform(platform, sof_output_dir, platf_build_environ, platform_wconfig):

# Keep in sync with caller
Expand Down
3 changes: 3 additions & 0 deletions src/audio/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ if(NOT CONFIG_COMP_MODULE_SHARED_LIBRARY_BUILD)
if(CONFIG_COMP_MFCC)
add_subdirectory(mfcc)
endif()
if(CONFIG_COMP_MWW)
add_subdirectory(microwakeword)
endif()
if(CONFIG_COMP_MIXER)
add_subdirectory(mixer)
endif()
Expand Down
1 change: 1 addition & 0 deletions src/audio/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ rsource "eq_iir/Kconfig"
rsource "google/Kconfig"
rsource "igo_nr/Kconfig"
rsource "mfcc/Kconfig"
rsource "microwakeword/Kconfig"
rsource "mixer/Kconfig"
rsource "mixin_mixout/Kconfig"
rsource "module_adapter/Kconfig"
Expand Down
43 changes: 32 additions & 11 deletions src/audio/buffers/audio_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,16 @@
int audio_buffer_attach_secondary_buffer(struct sof_audio_buffer *buffer, bool at_input,
struct sof_audio_buffer *secondary_buffer)
{
#ifdef CONFIG_DP_TO_DP_BIND
/* check per-side: allow attaching on both sides (needed for DP-to-DP) */
if (at_input && buffer->secondary_buffer_sink)
return -EINVAL;
if (!at_input && buffer->secondary_buffer_source)
return -EINVAL;
#else
if (buffer->secondary_buffer_sink || buffer->secondary_buffer_source)
return -EINVAL;
#endif

/* secondary buffer must share audio params with the primary buffer */
secondary_buffer->audio_stream_params = buffer->audio_stream_params;
Expand All @@ -48,6 +56,18 @@ int audio_buffer_sync_secondary_buffer(struct sof_audio_buffer *buffer, size_t l
struct sof_source *data_src;
struct sof_sink *data_dst;

#ifdef CONFIG_DP_TO_DP_BIND
if (buffer->secondary_buffer_sink && buffer->secondary_buffer_source) {
/*
* DP-to-DP case: a single shared ring_buffer is attached on both sides.
* The source DP writes directly to the ring_buffer sink API, and the
* sink DP reads directly from the ring_buffer source API.
* No copying is needed during the LL cycle.
*/
return 0;
}
#endif

if (buffer->secondary_buffer_sink) {
/*
* audio_buffer sink API is shadowed, that means there's a secondary_buffer
Expand Down Expand Up @@ -95,7 +115,12 @@ void audio_buffer_free(struct sof_audio_buffer *buffer)
CORE_CHECK_STRUCT(buffer);
#if CONFIG_PIPELINE_2_0
audio_buffer_free(buffer->secondary_buffer_sink);
#ifdef CONFIG_DP_TO_DP_BIND
if (buffer->secondary_buffer_source != buffer->secondary_buffer_sink)
audio_buffer_free(buffer->secondary_buffer_source);
#else
audio_buffer_free(buffer->secondary_buffer_source);
#endif
#endif /* CONFIG_PIPELINE_2_0 */
/* "virtual destructor": free the buffer internals and buffer memory */
buffer->ops->free(buffer);
Expand Down Expand Up @@ -203,18 +228,14 @@ uint32_t audio_buffer_sink_get_lft(struct sof_sink *sink)
return us_in_buffer;

/*
* TODO, Currently there's no DP to DP connection
* >>> the code below is never accessible and won't work because of cache incoherence <<<
*
* to make DP to DP connection possible:
* NOTE: DP-to-DP connections are now supported via a single shared ring_buffer
* attached as secondary buffer on both sides of a comp_buffer.
*
* 1) module data must be ALWAYS located in non cached memory alias, allowing
* cross core access to params like period (needed below) and calling
* module_get_deadline for the next module, regardless of cores the modules are
* running on
* 2) comp_buffer must be removed from all pipeline code, replaced with a generic abstract
* class audio_buffer - allowing using comp_buffer and ring_buffer without current
* "hybrid buffer" solution
* Future improvements:
* 1) module data should be in non-cached memory alias for reliable
* cross-core access to params like period and deadlines
* 2) comp_buffer should be replaced with generic audio_buffer
* throughout pipeline code (Pipeline 2.0)
*/
}

Expand Down
Loading
Loading