From a10a6bb4cfde0398764e3076ffa00b9aff8936d0 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Thu, 7 Dec 2023 17:41:00 +0100 Subject: [PATCH] modules: don't re-load on each restart While modules are in use, no need to unload and re-load them, re-initialising audio interfaces is enough. Signed-off-by: Guennadi Liakhovetski --- src/audio/module_adapter/module/modules.c | 134 +++++++++++----------- 1 file changed, 64 insertions(+), 70 deletions(-) diff --git a/src/audio/module_adapter/module/modules.c b/src/audio/module_adapter/module/modules.c index 86c6e693c9da..a8341d8be808 100644 --- a/src/audio/module_adapter/module/modules.c +++ b/src/audio/module_adapter/module/modules.c @@ -58,77 +58,77 @@ DECLARE_TR_CTX(intel_codec_tr, SOF_UUID(intel_uuid), LOG_LEVEL_INFO); */ static int modules_init(struct processing_module *mod) { - uint32_t module_entry_point; struct module_data *md = &mod->priv; struct comp_dev *dev = mod->dev; const struct ipc4_base_module_cfg *src_cfg = &md->cfg.base_cfg; - byte_array_t mod_cfg; - mod_cfg.data = (uint8_t *)md->cfg.init_data; - /* Intel modules expects DW size here */ - mod_cfg.size = md->cfg.size >> 2; - md->private = mod; + if (!md->module_adapter) { + byte_array_t mod_cfg; - struct comp_ipc_config *config = &(mod->dev->ipc_config); + mod_cfg.data = (uint8_t *)md->cfg.init_data; + /* Intel modules expects DW size here */ + mod_cfg.size = md->cfg.size >> 2; + md->private = mod; - /* At this point module resources are allocated and it is moved to L2 memory. */ - const void *buildinfo = NULL; + struct comp_ipc_config *config = &(mod->dev->ipc_config); - module_entry_point = lib_manager_allocate_module(dev->drv, config, src_cfg, &buildinfo); - if (module_entry_point == 0) { - comp_err(dev, "modules_init(), lib_manager_allocate_module() failed!"); - return -EINVAL; - } - md->module_entry_point = module_entry_point; - comp_info(mod->dev, "modules_init() start"); - - uint32_t module_id = IPC4_MOD_ID(mod->dev->ipc_config.id); - uint32_t instance_id = IPC4_INST_ID(mod->dev->ipc_config.id); - uint32_t log_handle = (uint32_t) mod->dev->drv->tctx; - /* Connect loadable module interfaces with module adapter entity. */ - /* Check if native Zephyr lib is loaded */ - struct sof_man_fw_desc *desc; - - desc = lib_manager_get_library_module_desc(module_id); - if (!desc) { - comp_err(dev, "modules_init(): Failed to load manifest"); - return -ENOMEM; - } - - const struct sof_module_api_build_info *mod_buildinfo; - - if (buildinfo) { - mod_buildinfo = buildinfo; - } else { - struct sof_man_module *module_entry = - (struct sof_man_module *)((char *)desc + SOF_MAN_MODULE_OFFSET(0)); - - mod_buildinfo = - (struct sof_module_api_build_info *) - (module_entry->segment[SOF_MAN_SEGMENT_TEXT].v_base_addr); + /* At this point module resources are allocated and it is moved to L2 memory. */ + const void *buildinfo = NULL; + uint32_t module_entry_point = lib_manager_allocate_module(dev->drv, config, + src_cfg, &buildinfo); + if (module_entry_point == 0) { + comp_err(dev, "modules_init(), lib_manager_allocate_module() failed!"); + return -EINVAL; + } + md->module_entry_point = module_entry_point; + comp_info(mod->dev, "modules_init() start"); + + uint32_t module_id = IPC4_MOD_ID(config->id); + uint32_t instance_id = IPC4_INST_ID(config->id); + uint32_t log_handle = (uint32_t)mod->dev->drv->tctx; + /* Connect loadable module interfaces with module adapter entity. */ + /* Check if native Zephyr lib is loaded */ + struct sof_man_fw_desc *desc; + + desc = lib_manager_get_library_module_desc(module_id); + if (!desc) { + comp_err(dev, "modules_init(): Failed to load manifest"); + return -ENOMEM; + } + + const struct sof_module_api_build_info *mod_buildinfo; + + if (buildinfo) { + mod_buildinfo = buildinfo; + } else { + struct sof_man_module *module_entry = + (struct sof_man_module *)((char *)desc + SOF_MAN_MODULE_OFFSET(0)); + + mod_buildinfo = + (struct sof_module_api_build_info *) + (module_entry->segment[SOF_MAN_SEGMENT_TEXT].v_base_addr); + } + + void *mod_adp; + + if (mod_buildinfo->format == IADK_MODULE_API_BUILD_INFO_FORMAT && + mod_buildinfo->api_version_number.full == IADK_MODULE_API_CURRENT_VERSION) { + /* Module is FDK */ + mod_adp = system_agent_start(md->module_entry_point, module_id, + instance_id, 0, log_handle, &mod_cfg); + } else if (mod_buildinfo->format == SOF_MODULE_API_BUILD_INFO_FORMAT && + mod_buildinfo->api_version_number.full == SOF_MODULE_API_CURRENT_VERSION) { + /* Module is native */ + mod->is_native_sof = true; + mod_adp = native_system_agent_start(mod->sys_service, + md->module_entry_point, module_id, + instance_id, 0, log_handle, &mod_cfg); + } else + return -ENOEXEC; + + md->module_adapter = mod_adp; } - void *mod_adp; - - /* Check if module is FDK */ - if (mod_buildinfo->format == IADK_MODULE_API_BUILD_INFO_FORMAT && - mod_buildinfo->api_version_number.full == IADK_MODULE_API_CURRENT_VERSION) { - mod_adp = system_agent_start(md->module_entry_point, module_id, - instance_id, 0, log_handle, &mod_cfg); - } else - /* Check if module is native */ - if (mod_buildinfo->format == SOF_MODULE_API_BUILD_INFO_FORMAT && - mod_buildinfo->api_version_number.full == SOF_MODULE_API_CURRENT_VERSION) { - /* If start agent for sof loadable */ - mod->is_native_sof = true; - mod_adp = native_system_agent_start(mod->sys_service, md->module_entry_point, - module_id, instance_id, 0, log_handle, - &mod_cfg); - } else - return -ENOEXEC; - - md->module_adapter = mod_adp; - /* Allocate module buffers */ md->mpd.in_buff = rballoc(0, SOF_MEM_CAPS_RAM, src_cfg->ibs); if (!md->mpd.in_buff) { @@ -296,8 +296,7 @@ static int modules_free(struct processing_module *mod) { struct comp_dev *dev = mod->dev; struct module_data *md = &mod->priv; - struct comp_ipc_config *config = &(mod->dev->ipc_config); - int ret = 0; + int ret; comp_info(dev, "modules_free()"); if (mod->is_native_sof) { @@ -311,11 +310,6 @@ static int modules_free(struct processing_module *mod) rfree(md->mpd.in_buff); rfree(md->mpd.out_buff); - /* Free module resources allocated in L2 memory. */ - ret = lib_manager_free_module(dev->drv, config); - if (ret < 0) - comp_err(dev, "modules_free(), lib_manager_free_module() failed!"); - return ret; } @@ -428,7 +422,7 @@ static int modules_reset(struct processing_module *mod) return iadk_wrapper_reset(mod->priv.module_adapter); } -/* Processing Module Adapter API*/ +/* Processing Module Adapter API */ static const struct module_interface interface = { .init = modules_init, .prepare = modules_prepare,