Skip to content

Commit

Permalink
modules: don't re-load on each restart
Browse files Browse the repository at this point in the history
While modules are in use, no need to unload and re-load them,
re-initialising audio interfaces is enough.

Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
  • Loading branch information
lyakh committed Dec 7, 2023
1 parent 916577f commit a10a6bb
Showing 1 changed file with 64 additions and 70 deletions.
134 changes: 64 additions & 70 deletions src/audio/module_adapter/module/modules.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
}

Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit a10a6bb

Please sign in to comment.