From 6b1cd2d3ad5c23c8702a1babeec5fb005904884f Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Tue, 16 Jul 2024 11:04:38 +0200 Subject: [PATCH 1/5] llext: change a function parameter llext_manager_link() doesn't need the whole of struct module_data, it only needs a pointer to a pointer to struct llext. Modify it to only receive the scope, that it needs. Signed-off-by: Guennadi Liakhovetski --- src/library_manager/llext_manager.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/library_manager/llext_manager.c b/src/library_manager/llext_manager.c index 0aaa0797419f..bb84e3131ee9 100644 --- a/src/library_manager/llext_manager.c +++ b/src/library_manager/llext_manager.c @@ -230,7 +230,7 @@ static bool llext_manager_section_detached(const elf_shdr_t *shdr) } static int llext_manager_link(struct llext_buf_loader *ebl, const char *name, - struct lib_manager_module *mctx, struct module_data *md, + struct lib_manager_module *mctx, struct llext **llext, const void **buildinfo, const struct sof_man_module_manifest **mod_manifest) { @@ -240,7 +240,7 @@ static int llext_manager_link(struct llext_buf_loader *ebl, const char *name, .pre_located = true, .section_detached = llext_manager_section_detached, }; - int ret = llext_load(&ebl->loader, name, &md->llext, &ldr_parm); + int ret = llext_load(&ebl->loader, name, llext, &ldr_parm); if (ret) return ret; @@ -407,7 +407,7 @@ uintptr_t llext_manager_allocate_module(struct processing_module *proc, struct llext_buf_loader ebl = LLEXT_BUF_LOADER((uint8_t *)dram_base + mod_offset, mod_size); /* LLEXT linking is only needed once for all the drivers in each module */ - ret = llext_manager_link(&ebl, mod_array[entry_index - inst_idx].name, mctx, md, + ret = llext_manager_link(&ebl, mod_array[entry_index - inst_idx].name, mctx, &md->llext, (const void **)&buildinfo, &mod_manifest); if (ret < 0) { tr_err(&lib_manager_tr, "linking failed: %d", ret); From 129b3b0bcbf68534424ce4d349f88c5471558aad Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Fri, 24 Jan 2025 10:56:39 +0100 Subject: [PATCH 2/5] llext: (cosmetic) document some structure fields Add comments to two structure fields, whose meaning isn't immediately obvious otherwise. Signed-off-by: Guennadi Liakhovetski --- src/include/sof/lib_manager.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/include/sof/lib_manager.h b/src/include/sof/lib_manager.h index ba1f8eadbfb0..96915cb639e8 100644 --- a/src/include/sof/lib_manager.h +++ b/src/include/sof/lib_manager.h @@ -96,13 +96,14 @@ struct lib_manager_segment_desc { }; struct lib_manager_module { - unsigned int start_idx; + unsigned int start_idx; /* Index of the first driver from this module in + * the library-global driver list */ const struct sof_man_module_manifest *mod_manifest; struct lib_manager_segment_desc segment[LIB_MANAGER_N_SEGMENTS]; }; struct lib_manager_mod_ctx { - void *base_addr; + void *base_addr; /* library cold storage address (e.g. DRAM) */ unsigned int n_mod; struct lib_manager_module *mod; }; From 86c82acf5244c49aa1f9c6d083ef5c7f4d9a977b Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Fri, 24 Jan 2025 15:39:44 +0100 Subject: [PATCH 3/5] llext: simplify llext_manager_mod_init() prototype Let llext_manager_mod_init() calculate mod_array itself internally, it has all the data for that. Signed-off-by: Guennadi Liakhovetski --- src/library_manager/llext_manager.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/library_manager/llext_manager.c b/src/library_manager/llext_manager.c index bb84e3131ee9..c2cd5254ed76 100644 --- a/src/library_manager/llext_manager.c +++ b/src/library_manager/llext_manager.c @@ -284,9 +284,10 @@ static int llext_manager_link(struct llext_buf_loader *ebl, const char *name, } static int llext_manager_mod_init(struct lib_manager_mod_ctx *ctx, - const struct sof_man_fw_desc *desc, - const struct sof_man_module *mod_array) + const struct sof_man_fw_desc *desc) { + struct sof_man_module *mod_array = (struct sof_man_module *)((uint8_t *)desc + + SOF_MAN_MODULE_OFFSET(0)); unsigned int i, n_mod; size_t offs; @@ -356,7 +357,7 @@ uintptr_t llext_manager_allocate_module(struct processing_module *proc, tr_dbg(&lib_manager_tr, "mod_id: %#x", ipc_config->id); if (!ctx->mod) - llext_manager_mod_init(ctx, desc, mod_array); + llext_manager_mod_init(ctx, desc); if (entry_index >= desc->header.num_module_entries) { tr_err(&lib_manager_tr, "Invalid driver index %u exceeds %d", From 85e9323016461fb23434165c18d35bfdeb4f2f66 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Fri, 31 Jan 2025 17:05:47 +0100 Subject: [PATCH 4/5] llext: fir: fix a cmake dependency Fix a typo, making it impossible to build eq_fir without eq_iir as LLEXT. Signed-off-by: Guennadi Liakhovetski --- zephyr/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zephyr/CMakeLists.txt b/zephyr/CMakeLists.txt index ed4f7e904d2e..ac70953d8dec 100644 --- a/zephyr/CMakeLists.txt +++ b/zephyr/CMakeLists.txt @@ -650,7 +650,7 @@ endif() if(CONFIG_COMP_FIR STREQUAL "m") add_subdirectory(${SOF_AUDIO_PATH}/eq_fir/llext ${PROJECT_BINARY_DIR}/eq_fir_llext) - add_dependencies(app eq_iir) + add_dependencies(app eq_fir) elseif(CONFIG_COMP_FIR) zephyr_library_sources( ${SOF_AUDIO_PATH}/eq_fir/eq_fir_hifi3.c From ae5452f24868b3682a308b9d56881c66c6ae016c Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Tue, 4 Feb 2025 10:58:23 +0100 Subject: [PATCH 5/5] llext: export symbols, needed by TDFB Modular TDFB needs additional exported symbols from Zephyr and SOF core. Signed-off-by: Guennadi Liakhovetski --- src/ipc/ipc-common.c | 1 + src/math/sqrt_int16.c | 2 ++ src/math/trig.c | 2 ++ 3 files changed, 5 insertions(+) diff --git a/src/ipc/ipc-common.c b/src/ipc/ipc-common.c index 6557fdd50b59..244a218d5be8 100644 --- a/src/ipc/ipc-common.c +++ b/src/ipc/ipc-common.c @@ -252,6 +252,7 @@ void ipc_msg_send(struct ipc_msg *msg, void *data, bool high_priority) k_spin_unlock(&ipc->lock, key); } +EXPORT_SYMBOL(ipc_msg_send); #ifdef __ZEPHYR__ static void ipc_work_handler(struct k_work *work) diff --git a/src/math/sqrt_int16.c b/src/math/sqrt_int16.c index 0d62e8145187..9068717d638d 100644 --- a/src/math/sqrt_int16.c +++ b/src/math/sqrt_int16.c @@ -6,6 +6,7 @@ // // +#include #include #define SQRT_WRAP_SCHAR_BITS 0xFF @@ -145,3 +146,4 @@ uint16_t sqrt_int16(uint16_t u) return y; } +EXPORT_SYMBOL(sqrt_int16); diff --git a/src/math/trig.c b/src/math/trig.c index ee5014cf91d2..32613d393034 100644 --- a/src/math/trig.c +++ b/src/math/trig.c @@ -7,6 +7,7 @@ // Keyon Jie // Shriram Shastry +#include #include #include #include @@ -99,6 +100,7 @@ void cordic_approx(int32_t th_rad_fxp, int32_t a_idx, int32_t *sign, int32_t *b_ /* Q2.30 format -sine, cosine*/ *th_cdc_fxp = th_rad_fxp; } +EXPORT_SYMBOL(cordic_approx); /** * CORDIC-based approximation for inverse cosine