From d38f9cd7688acbb055020f965143ecf2c983c48d Mon Sep 17 00:00:00 2001 From: Marcin Szkudlinski Date: Fri, 14 Jun 2024 11:01:01 +0200 Subject: [PATCH] fix: some code does not care for non-module adapter components Legacy API that is not using module_adapter is now depreciated, but there are still some modules that use it. So all common code must work properly with both types of modules. This commit is fixing crash in bind operation when binding a legacy module. There also some comments added in potentially similar places, but where legacy modules cannot be used. Signed-off-by: Marcin Szkudlinski --- src/audio/module_adapter/module/generic.c | 1 + src/audio/pipeline/pipeline-schedule.c | 1 + src/include/sof/audio/component.h | 4 ++- src/ipc/ipc4/helper.c | 31 ++++++++++++----------- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/audio/module_adapter/module/generic.c b/src/audio/module_adapter/module/generic.c index e4448922b9f9..3436293a9cf8 100644 --- a/src/audio/module_adapter/module/generic.c +++ b/src/audio/module_adapter/module/generic.c @@ -26,6 +26,7 @@ int module_load_config(struct comp_dev *dev, const void *cfg, size_t size) { int ret; struct module_config *dst; + /* loadable module must use module adapter */ struct processing_module *mod = comp_mod(dev); struct module_data *md = &mod->priv; diff --git a/src/audio/pipeline/pipeline-schedule.c b/src/audio/pipeline/pipeline-schedule.c index 3ff48bce8d9d..76b3f1fe1f28 100644 --- a/src/audio/pipeline/pipeline-schedule.c +++ b/src/audio/pipeline/pipeline-schedule.c @@ -390,6 +390,7 @@ static enum task_state dp_task_run(void *data) int pipeline_comp_dp_task_init(struct comp_dev *comp) { int ret; + /* DP tasks are guaranteed to have a module_adapter */ struct processing_module *mod = comp_mod(comp); struct task_ops ops = { .run = dp_task_run, diff --git a/src/include/sof/audio/component.h b/src/include/sof/audio/component.h index 9c23e43f740c..4dfa2e66a26a 100644 --- a/src/include/sof/audio/component.h +++ b/src/include/sof/audio/component.h @@ -590,7 +590,9 @@ struct comp_dev { const struct comp_driver *drv; /**< driver */ - struct processing_module *mod; /**< self->mod->dev == self, always */ + struct processing_module *mod; /**< self->mod->dev == self, NULL if component is not using + * module adapter + */ /* lists */ struct list_item bsource_list; /**< list of source buffers */ diff --git a/src/ipc/ipc4/helper.c b/src/ipc/ipc4/helper.c index 63425c9a6147..08f6298c88f1 100644 --- a/src/ipc/ipc4/helper.c +++ b/src/ipc/ipc4/helper.c @@ -468,14 +468,14 @@ int ipc_comp_connect(struct ipc *ipc, ipc_pipe_comp_connect *_connect) if (!cpu_is_me(source->ipc_config.core) && !cross_core_bind) return ipc4_process_on_core(source->ipc_config.core, false); - struct processing_module *srcmod = comp_mod(source); - struct processing_module *dstmod = comp_mod(sink); - struct module_config *dstcfg = &dstmod->priv.cfg; - struct module_config *srccfg = &srcmod->priv.cfg; + if (source->drv->type == SOF_COMP_MODULE_ADAPTER) { + struct processing_module *srcmod = comp_mod(source); + struct module_config *srccfg = &srcmod->priv.cfg; - /* get obs from the base config extension if the src queue ID is non-zero */ - if (bu->extension.r.src_queue && bu->extension.r.src_queue < srccfg->nb_output_pins) - obs = srccfg->output_pins[bu->extension.r.src_queue].obs; + /* get obs from the base config extension if the src queue ID is non-zero */ + if (bu->extension.r.src_queue && bu->extension.r.src_queue < srccfg->nb_output_pins) + obs = srccfg->output_pins[bu->extension.r.src_queue].obs; + } /* get obs from base config if src queue ID is 0 or if base config extn is missing */ if (!obs) { @@ -490,10 +490,14 @@ int ipc_comp_connect(struct ipc *ipc, ipc_pipe_comp_connect *_connect) obs = source_src_cfg.obs; } - /* get ibs from the base config extension if the sink queue ID is non-zero */ - if (bu->extension.r.dst_queue && bu->extension.r.dst_queue < dstcfg->nb_input_pins) - ibs = dstcfg->input_pins[bu->extension.r.dst_queue].ibs; + if (sink->drv->type == SOF_COMP_MODULE_ADAPTER) { + struct processing_module *dstmod = comp_mod(sink); + struct module_config *dstcfg = &dstmod->priv.cfg; + /* get ibs from the base config extension if the sink queue ID is non-zero */ + if (bu->extension.r.dst_queue && bu->extension.r.dst_queue < dstcfg->nb_input_pins) + ibs = dstcfg->input_pins[bu->extension.r.dst_queue].ibs; + } /* get ibs from base config if sink queue ID is 0 or if base config extn is missing */ if (!ibs) { ret = comp_get_attribute(sink, COMP_ATTR_BASE_CONFIG, &sink_src_cfg); @@ -538,13 +542,10 @@ int ipc_comp_connect(struct ipc *ipc, ipc_pipe_comp_connect *_connect) source_set_min_available(audio_stream_get_source(&buffer->stream), ibs); #if CONFIG_ZEPHYR_DP_SCHEDULER - /* mod->dev may be null in case of a module not using module adapter */ - if (dstmod->dev && - dstmod->dev->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_DP) + if (sink->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_DP) /* data destination module needs to use dp_queue */ buffer_create_shadow_dp_queue(buffer, false /* at_input = false */); - else if (srcmod->dev && - srcmod->dev->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_DP) + else if (source->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_DP) /* data source module needs to use dp_queue */ buffer_create_shadow_dp_queue(buffer, true /* at_input = true */); #endif /* CONFIG_ZEPHYR_DP_SCHEDULER */