Skip to content

Commit 029758c

Browse files
marcinszkudlinskiandyross
authored andcommitted
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 <marcin.szkudlinski@intel.com>
1 parent 713dfdd commit 029758c

4 files changed

Lines changed: 21 additions & 16 deletions

File tree

src/audio/module_adapter/module/generic.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ int module_load_config(struct comp_dev *dev, const void *cfg, size_t size)
2626
{
2727
int ret;
2828
struct module_config *dst;
29+
/* loadable module must use module adapter */
2930
struct processing_module *mod = comp_mod(dev);
3031
struct module_data *md = &mod->priv;
3132

src/audio/pipeline/pipeline-schedule.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,7 @@ static enum task_state dp_task_run(void *data)
390390
int pipeline_comp_dp_task_init(struct comp_dev *comp)
391391
{
392392
int ret;
393+
/* DP is must use module_adapter */
393394
struct processing_module *mod = comp_mod(comp);
394395
struct task_ops ops = {
395396
.run = dp_task_run,

src/include/sof/audio/component.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,9 @@ struct comp_dev {
590590

591591
const struct comp_driver *drv; /**< driver */
592592

593-
struct processing_module *mod; /**< self->mod->dev == self, always */
593+
struct processing_module *mod; /**< self->mod->dev == self, NULL if component is not using
594+
* module adapter
595+
*/
594596

595597
/* lists */
596598
struct list_item bsource_list; /**< list of source buffers */

src/ipc/ipc4/helper.c

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -468,14 +468,14 @@ int ipc_comp_connect(struct ipc *ipc, ipc_pipe_comp_connect *_connect)
468468
if (!cpu_is_me(source->ipc_config.core) && !cross_core_bind)
469469
return ipc4_process_on_core(source->ipc_config.core, false);
470470

471-
struct processing_module *srcmod = comp_mod(source);
472-
struct processing_module *dstmod = comp_mod(sink);
473-
struct module_config *dstcfg = &dstmod->priv.cfg;
474-
struct module_config *srccfg = &srcmod->priv.cfg;
471+
if (source->drv->type == SOF_COMP_MODULE_ADAPTER) {
472+
struct processing_module *srcmod = comp_mod(source);
473+
struct module_config *srccfg = &srcmod->priv.cfg;
475474

476-
/* get obs from the base config extension if the src queue ID is non-zero */
477-
if (bu->extension.r.src_queue && bu->extension.r.src_queue < srccfg->nb_output_pins)
478-
obs = srccfg->output_pins[bu->extension.r.src_queue].obs;
475+
/* get obs from the base config extension if the src queue ID is non-zero */
476+
if (bu->extension.r.src_queue && bu->extension.r.src_queue < srccfg->nb_output_pins)
477+
obs = srccfg->output_pins[bu->extension.r.src_queue].obs;
478+
}
479479

480480
/* get obs from base config if src queue ID is 0 or if base config extn is missing */
481481
if (!obs) {
@@ -490,10 +490,14 @@ int ipc_comp_connect(struct ipc *ipc, ipc_pipe_comp_connect *_connect)
490490
obs = source_src_cfg.obs;
491491
}
492492

493-
/* get ibs from the base config extension if the sink queue ID is non-zero */
494-
if (bu->extension.r.dst_queue && bu->extension.r.dst_queue < dstcfg->nb_input_pins)
495-
ibs = dstcfg->input_pins[bu->extension.r.dst_queue].ibs;
493+
if (sink->drv->type == SOF_COMP_MODULE_ADAPTER) {
494+
struct processing_module *dstmod = comp_mod(sink);
495+
struct module_config *dstcfg = &dstmod->priv.cfg;
496496

497+
/* get ibs from the base config extension if the sink queue ID is non-zero */
498+
if (bu->extension.r.dst_queue && bu->extension.r.dst_queue < dstcfg->nb_input_pins)
499+
ibs = dstcfg->input_pins[bu->extension.r.dst_queue].ibs;
500+
}
497501
/* get ibs from base config if sink queue ID is 0 or if base config extn is missing */
498502
if (!ibs) {
499503
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)
538542
source_set_min_available(audio_stream_get_source(&buffer->stream), ibs);
539543

540544
#if CONFIG_ZEPHYR_DP_SCHEDULER
541-
/* mod->dev may be null in case of a module not using module adapter */
542-
if (dstmod->dev &&
543-
dstmod->dev->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_DP)
545+
if (sink->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_DP)
544546
/* data destination module needs to use dp_queue */
545547
buffer_create_shadow_dp_queue(buffer, false /* at_input = false */);
546-
else if (srcmod->dev &&
547-
srcmod->dev->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_DP)
548+
else if (source->ipc_config.proc_domain == COMP_PROCESSING_DOMAIN_DP)
548549
/* data source module needs to use dp_queue */
549550
buffer_create_shadow_dp_queue(buffer, true /* at_input = true */);
550551
#endif /* CONFIG_ZEPHYR_DP_SCHEDULER */

0 commit comments

Comments
 (0)