Skip to content
Merged
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
5 changes: 0 additions & 5 deletions src/audio/module_adapter/module/modules.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,11 +145,6 @@ static int modules_free(struct processing_module *mod)
if (ret)
comp_err(dev, "modules_free(): iadk_wrapper_free failed with error: %d", ret);

/* Free module resources allocated in L2 memory. */
ret = lib_manager_free_module(dev->ipc_config.id);
if (ret < 0)
comp_err(dev, "modules_free(), lib_manager_free_module() failed!");

return ret;
}

Expand Down
4 changes: 4 additions & 0 deletions src/audio/module_adapter/module_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,10 @@ struct comp_dev *module_adapter_new(const struct comp_driver *drv,
comp_dbg(dev, "module_adapter_new() done");
return dev;
err:
#if CONFIG_IPC_MAJOR_4
if (mod)
rfree(mod->priv.cfg.input_pins);
#endif
rfree(mod);
rfree(dev);
return NULL;
Expand Down
2 changes: 1 addition & 1 deletion src/include/sof/lib_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ static inline struct lib_manager_mod_ctx *lib_manager_get_mod_ctx(int module_id)
uint32_t lib_id = LIB_MANAGER_GET_LIB_ID(module_id);
struct ext_library *_ext_lib = ext_lib_get();

if (!_ext_lib)
if (!_ext_lib || lib_id >= LIB_MANAGER_MAX_LIBS)
return NULL;

return _ext_lib->desc[lib_id];
Expand Down
66 changes: 32 additions & 34 deletions src/library_manager/lib_manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,31 +280,27 @@ static int lib_manager_unload_libcode_modules(const uint32_t module_id)
}
#endif /* CONFIG_LIBCODE_MODULE_SUPPORT */

static void __sparse_cache *lib_manager_get_instance_bss_address(uint32_t module_id,
uint32_t instance_id,
const struct sof_man_module *mod)
static void lib_manager_get_instance_bss_address(uint32_t instance_id,
const struct sof_man_module *mod,
void __sparse_cache **va_addr, size_t *size)
{
uint32_t instance_bss_size =
mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length / mod->instance_max_count;
uint32_t inst_offset = instance_bss_size * PAGE_SZ * instance_id;
void __sparse_cache *va_base =
(void __sparse_cache *)(mod->segment[SOF_MAN_SEGMENT_BSS].v_base_addr +
inst_offset);

tr_dbg(&lib_manager_tr, "instance_bss_size: %#x, pointer: %p",
instance_bss_size, (__sparse_force void *)va_base);

return va_base;
*size = mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length / mod->instance_max_count *
PAGE_SZ;
size_t inst_offset = *size * instance_id;
*va_addr = (void __sparse_cache *)(mod->segment[SOF_MAN_SEGMENT_BSS].v_base_addr +
inst_offset);

tr_dbg(&lib_manager_tr, "instance_bss_size: %#zx, pointer: %p", *size,
(__sparse_force void *)*va_addr);
}

static int lib_manager_allocate_module_instance(uint32_t module_id, uint32_t instance_id,
uint32_t is_pages, const struct sof_man_module *mod)
static int lib_manager_allocate_module_instance(uint32_t instance_id, uint32_t is_pages,
const struct sof_man_module *mod)
{
uint32_t bss_size =
(mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length / mod->instance_max_count)
* PAGE_SZ;
void __sparse_cache *va_base = lib_manager_get_instance_bss_address(module_id,
instance_id, mod);
size_t bss_size;
void __sparse_cache *va_base;

lib_manager_get_instance_bss_address(instance_id, mod, &va_base, &bss_size);

if ((is_pages * PAGE_SZ) > bss_size) {
tr_err(&lib_manager_tr, "invalid is_pages: %u, required: %u",
Expand All @@ -324,14 +320,12 @@ static int lib_manager_allocate_module_instance(uint32_t module_id, uint32_t ins
return 0;
}

static int lib_manager_free_module_instance(uint32_t module_id, uint32_t instance_id,
const struct sof_man_module *mod)
static int lib_manager_free_module_instance(uint32_t instance_id, const struct sof_man_module *mod)
{
uint32_t bss_size =
(mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length / mod->instance_max_count)
* PAGE_SZ;
void __sparse_cache *va_base = lib_manager_get_instance_bss_address(module_id,
instance_id, mod);
size_t bss_size;
void __sparse_cache *va_base;

lib_manager_get_instance_bss_address(instance_id, mod, &va_base, &bss_size);
/*
* Unmap bss memory.
*/
Expand All @@ -343,8 +337,8 @@ uintptr_t lib_manager_allocate_module(const struct comp_ipc_config *ipc_config,
{
const struct sof_man_module *mod;
const struct ipc4_base_module_cfg *base_cfg = ipc_specific_config;
const uint32_t module_id = IPC4_MOD_ID(ipc_config->id);
int ret;
uint32_t module_id = IPC4_MOD_ID(ipc_config->id);

tr_dbg(&lib_manager_tr, "mod_id: %#x", ipc_config->id);

Expand All @@ -367,8 +361,8 @@ uintptr_t lib_manager_allocate_module(const struct comp_ipc_config *ipc_config,
goto err;
#endif /* CONFIG_LIBCODE_MODULE_SUPPORT */

ret = lib_manager_allocate_module_instance(module_id, IPC4_INST_ID(ipc_config->id),
base_cfg->is_pages, mod);
ret = lib_manager_allocate_module_instance(IPC4_INST_ID(ipc_config->id), base_cfg->is_pages,
mod);
if (ret < 0) {
tr_err(&lib_manager_tr, "module allocation failed: %d", ret);
#ifdef CONFIG_LIBCODE_MODULE_SUPPORT
Expand All @@ -392,6 +386,10 @@ int lib_manager_free_module(const uint32_t component_id)
tr_dbg(&lib_manager_tr, "mod_id: %#x", component_id);

mod = lib_manager_get_module_manifest(module_id);
if (!mod) {
tr_err(&lib_manager_tr, "failed to get module descriptor");
return -EINVAL;
}

if (module_is_llext(mod))
return llext_manager_free_module(component_id);
Expand All @@ -406,7 +404,7 @@ int lib_manager_free_module(const uint32_t component_id)
return ret;
#endif /* CONFIG_LIBCODE_MODULE_SUPPORT */

ret = lib_manager_free_module_instance(module_id, IPC4_INST_ID(component_id), mod);
ret = lib_manager_free_module_instance(IPC4_INST_ID(component_id), mod);
if (ret < 0) {
tr_err(&lib_manager_tr, "free module instance failed: %d", ret);
return ret;
Expand Down Expand Up @@ -655,13 +653,13 @@ int lib_manager_register_module(const uint32_t component_id)
build_info->api_version_number.full == IADK_MODULE_API_CURRENT_VERSION) {
/* Use module_adapter functions */
drv->ops.create = module_adapter_new;
drv->ops.prepare = module_adapter_prepare;
} else {
/* Check if module is NOT native */
if (build_info->format != SOF_MODULE_API_BUILD_INFO_FORMAT ||
build_info->api_version_number.full != SOF_MODULE_API_CURRENT_VERSION) {
tr_err(&lib_manager_tr, "Unsupported module API version");
return -ENOEXEC;
ret = -ENOEXEC;
goto cleanup;
}
}
}
Expand Down
Loading