Lines Matching +full:te +full:- +full:source
1 // SPDX-License-Identifier: GPL-2.0-only
18 /* Must be called with adev->comp_list_mutex held. */
24 list_for_each_entry(acomp, &adev->comp_list, node) in avs_path_find_tplg()
25 if (!strcmp(acomp->tplg->name, name)) in avs_path_find_tplg()
26 return acomp->tplg; in avs_path_find_tplg()
35 list_for_each_entry(mod, &ppl->mod_list, node) in avs_path_find_module()
36 if (mod->template->id == template_id) in avs_path_find_module()
46 list_for_each_entry(ppl, &path->ppl_list, node) in avs_path_find_pipeline()
47 if (ppl->template->id == template_id) in avs_path_find_pipeline()
63 list_for_each_entry(pos, &tplg->path_tmpl_list, node) { in avs_path_find_path()
64 if (pos->id == template_id) { in avs_path_find_path()
72 spin_lock(&adev->path_list_lock); in avs_path_find_path()
74 list_for_each_entry(path, &adev->path_list, node) { in avs_path_find_path()
75 if (path->template->owner == template) { in avs_path_find_path()
76 spin_unlock(&adev->path_list_lock); in avs_path_find_path()
81 spin_unlock(&adev->path_list_lock); in avs_path_find_path()
88 return (params_rate(params) == fmt->sampling_freq && in avs_test_hw_params()
89 params_channels(params) == fmt->num_channels && in avs_test_hw_params()
90 params_physical_width(params) == fmt->bit_depth && in avs_test_hw_params()
91 snd_pcm_hw_params_bits(params) == fmt->valid_bit_depth); in avs_test_hw_params()
102 list_for_each_entry(variant, &template->path_list, node) { in avs_path_find_variant()
103 dev_dbg(adev->dev, "check FE rate %d chn %d vbd %d bd %d\n", in avs_path_find_variant()
104 variant->fe_fmt->sampling_freq, variant->fe_fmt->num_channels, in avs_path_find_variant()
105 variant->fe_fmt->valid_bit_depth, variant->fe_fmt->bit_depth); in avs_path_find_variant()
106 dev_dbg(adev->dev, "check BE rate %d chn %d vbd %d bd %d\n", in avs_path_find_variant()
107 variant->be_fmt->sampling_freq, variant->be_fmt->num_channels, in avs_path_find_variant()
108 variant->be_fmt->valid_bit_depth, variant->be_fmt->bit_depth); in avs_path_find_variant()
110 if (variant->fe_fmt && avs_test_hw_params(fe_params, variant->fe_fmt) && in avs_path_find_variant()
111 variant->be_fmt && avs_test_hw_params(be_params, variant->be_fmt)) in avs_path_find_variant()
131 list_for_each_entry(path_template, &template->path_list, node) in avs_path_set_constraint()
139 list_for_each_entry(path_template, &template->path_list, node) { in avs_path_set_constraint()
142 list_for_each_entry(pipeline_template, &path_template->ppl_list, node) { in avs_path_set_constraint()
145 list_for_each_entry(module_template, &pipeline_template->mod_list, node) { in avs_path_set_constraint()
146 const guid_t *type = &module_template->cfg_ext->type; in avs_path_set_constraint()
153 switch (module_template->cfg_ext->copier.dma_type) { in avs_path_set_constraint()
166 rlist[i] = path_template->fe_fmt->sampling_freq; in avs_path_set_constraint()
167 clist[i] = path_template->fe_fmt->num_channels; in avs_path_set_constraint()
168 slist[i] = path_template->fe_fmt->bit_depth; in avs_path_set_constraint()
175 rate_list->count = i; in avs_path_set_constraint()
176 rate_list->list = rlist; in avs_path_set_constraint()
177 channels_list->count = i; in avs_path_set_constraint()
178 channels_list->list = clist; in avs_path_set_constraint()
179 sample_bits_list->count = i; in avs_path_set_constraint()
180 sample_bits_list->list = slist; in avs_path_set_constraint()
191 struct avs_tplg_modcfg_ext *te, u32 dma_id) in avs_init_node_id() argument
193 node_id->val = 0; in avs_init_node_id()
194 node_id->dma_type = te->copier.dma_type; in avs_init_node_id()
196 switch (node_id->dma_type) { in avs_init_node_id()
201 node_id->vindex = te->copier.vindex.val; in avs_init_node_id()
207 node_id->vindex = dma_id; in avs_init_node_id()
212 node_id->vindex = te->copier.vindex.val | dma_id; in avs_init_node_id()
228 struct avs_tplg_modcfg_ext *te; in avs_nhlt_config_or_default() local
233 te = t->cfg_ext; in avs_nhlt_config_or_default()
235 switch (te->copier.dma_type) { in avs_nhlt_config_or_default()
239 bus_id = te->copier.vindex.i2s.instance; in avs_nhlt_config_or_default()
241 fmt = te->copier.out_fmt; in avs_nhlt_config_or_default()
247 bus_id = te->copier.vindex.i2s.instance; in avs_nhlt_config_or_default()
249 fmt = t->in_fmt; in avs_nhlt_config_or_default()
254 dev_type = -1; /* ignored */ in avs_nhlt_config_or_default()
257 fmt = t->in_fmt; in avs_nhlt_config_or_default()
265 if (te->copier.blob_fmt) in avs_nhlt_config_or_default()
266 fmt = te->copier.blob_fmt; in avs_nhlt_config_or_default()
269 fmt->num_channels, fmt->sampling_freq, fmt->valid_bit_depth, in avs_nhlt_config_or_default()
270 fmt->bit_depth); in avs_nhlt_config_or_default()
272 dev_warn(adev->dev, "Endpoint format configuration not found.\n"); in avs_nhlt_config_or_default()
273 return ERR_PTR(-ENOENT); in avs_nhlt_config_or_default()
276 if (fmtcfg->config.capabilities_size < default_blob->capabilities_size) in avs_nhlt_config_or_default()
277 return ERR_PTR(-ETOOSMALL); in avs_nhlt_config_or_default()
278 /* The firmware expects the payload to be DWORD-aligned. */ in avs_nhlt_config_or_default()
279 if (fmtcfg->config.capabilities_size % sizeof(u32)) in avs_nhlt_config_or_default()
280 return ERR_PTR(-EINVAL); in avs_nhlt_config_or_default()
282 return &fmtcfg->config; in avs_nhlt_config_or_default()
295 gtw_size = blob->capabilities_size; in avs_fill_gtw_config()
297 return -E2BIG; in avs_fill_gtw_config()
299 gtw->config_length = gtw_size / sizeof(u32); in avs_fill_gtw_config()
300 memcpy(gtw->config.blob, blob->capabilities, blob->capabilities_size); in avs_fill_gtw_config()
308 struct avs_tplg_module *t = mod->template; in avs_copier_create()
309 struct avs_tplg_modcfg_ext *te; in avs_copier_create() local
315 te = t->cfg_ext; in avs_copier_create()
316 cfg = adev->modcfg_buf; in avs_copier_create()
317 dma_id = mod->owner->owner->dma_id; in avs_copier_create()
320 ret = avs_fill_gtw_config(adev, &cfg->gtw_cfg, t, &cfg_size); in avs_copier_create()
324 cfg->base.cpc = t->cfg_base->cpc; in avs_copier_create()
325 cfg->base.ibs = t->cfg_base->ibs; in avs_copier_create()
326 cfg->base.obs = t->cfg_base->obs; in avs_copier_create()
327 cfg->base.is_pages = t->cfg_base->is_pages; in avs_copier_create()
328 cfg->base.audio_fmt = *t->in_fmt; in avs_copier_create()
329 cfg->out_fmt = *te->copier.out_fmt; in avs_copier_create()
330 cfg->feature_mask = te->copier.feature_mask; in avs_copier_create()
331 avs_init_node_id(&cfg->gtw_cfg.node_id, te, dma_id); in avs_copier_create()
332 cfg->gtw_cfg.dma_buffer_size = te->copier.dma_buffer_size; in avs_copier_create()
333 mod->gtw_attrs = cfg->gtw_cfg.config.attrs; in avs_copier_create()
335 ret = avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, t->core_id, in avs_copier_create()
336 t->domain, cfg, cfg_size, &mod->instance_id); in avs_copier_create()
342 struct avs_tplg_module *t = mod->template; in avs_whm_create()
343 struct avs_tplg_modcfg_ext *te; in avs_whm_create() local
349 te = t->cfg_ext; in avs_whm_create()
350 cfg = adev->modcfg_buf; in avs_whm_create()
351 dma_id = mod->owner->owner->dma_id; in avs_whm_create()
354 ret = avs_fill_gtw_config(adev, &cfg->gtw_cfg, t, &cfg_size); in avs_whm_create()
358 cfg->base.cpc = t->cfg_base->cpc; in avs_whm_create()
359 cfg->base.ibs = t->cfg_base->ibs; in avs_whm_create()
360 cfg->base.obs = t->cfg_base->obs; in avs_whm_create()
361 cfg->base.is_pages = t->cfg_base->is_pages; in avs_whm_create()
362 cfg->base.audio_fmt = *t->in_fmt; in avs_whm_create()
363 cfg->ref_fmt = *te->whm.ref_fmt; in avs_whm_create()
364 cfg->out_fmt = *te->whm.out_fmt; in avs_whm_create()
365 cfg->wake_tick_period = te->whm.wake_tick_period; in avs_whm_create()
366 avs_init_node_id(&cfg->gtw_cfg.node_id, te, dma_id); in avs_whm_create()
367 cfg->gtw_cfg.dma_buffer_size = te->whm.dma_buffer_size; in avs_whm_create()
368 mod->gtw_attrs = cfg->gtw_cfg.config.attrs; in avs_whm_create()
370 ret = avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, t->core_id, in avs_whm_create()
371 t->domain, cfg, cfg_size, &mod->instance_id); in avs_whm_create()
378 struct avs_tplg_module *t = mod->template; in avs_get_module_control()
383 path_tmpl = t->owner->owner->owner; in avs_get_module_control()
384 w = path_tmpl->w; in avs_get_module_control()
386 for (i = 0; i < w->num_kcontrols; i++) { in avs_get_module_control()
390 mc = (struct soc_mixer_control *)w->kcontrols[i]->private_value; in avs_get_module_control()
391 ctl_data = (struct avs_control_data *)mc->dobj.private; in avs_get_module_control()
392 if (ctl_data->id == t->ctl_id && strstr(w->kcontrols[i]->id.name, name)) in avs_get_module_control()
407 ctl_data = mc->dobj.private; in avs_peakvol_set_volume()
408 t = mod->template; in avs_peakvol_set_volume()
410 input = ctl_data->values; in avs_peakvol_set_volume()
412 if (mc->num_channels) { in avs_peakvol_set_volume()
413 for (i = 0; i < mc->num_channels; i++) { in avs_peakvol_set_volume()
416 vols[i].curve_type = t->cfg_ext->peakvol.curve_type; in avs_peakvol_set_volume()
417 vols[i].curve_duration = t->cfg_ext->peakvol.curve_duration; in avs_peakvol_set_volume()
420 ret = avs_ipc_peakvol_set_volumes(adev, mod->module_id, mod->instance_id, vols, in avs_peakvol_set_volume()
421 mc->num_channels); in avs_peakvol_set_volume()
428 vols[0].curve_type = t->cfg_ext->peakvol.curve_type; in avs_peakvol_set_volume()
429 vols[0].curve_duration = t->cfg_ext->peakvol.curve_duration; in avs_peakvol_set_volume()
431 ret = avs_ipc_peakvol_set_volume(adev, mod->module_id, mod->instance_id, &vols[0]); in avs_peakvol_set_volume()
443 ctl_data = mc->dobj.private; in avs_peakvol_set_mute()
444 t = mod->template; in avs_peakvol_set_mute()
446 input = ctl_data->values; in avs_peakvol_set_mute()
448 if (mc->num_channels) { in avs_peakvol_set_mute()
449 for (i = 0; i < mc->num_channels; i++) { in avs_peakvol_set_mute()
452 mutes[i].curve_type = t->cfg_ext->peakvol.curve_type; in avs_peakvol_set_mute()
453 mutes[i].curve_duration = t->cfg_ext->peakvol.curve_duration; in avs_peakvol_set_mute()
456 ret = avs_ipc_peakvol_set_mutes(adev, mod->module_id, mod->instance_id, mutes, in avs_peakvol_set_mute()
457 mc->num_channels); in avs_peakvol_set_mute()
464 mutes[0].curve_type = t->cfg_ext->peakvol.curve_type; in avs_peakvol_set_mute()
465 mutes[0].curve_duration = t->cfg_ext->peakvol.curve_duration; in avs_peakvol_set_mute()
467 ret = avs_ipc_peakvol_set_mute(adev, mod->module_id, mod->instance_id, &mutes[0]); in avs_peakvol_set_mute()
473 struct avs_tplg_module *t = mod->template; in avs_peakvol_create()
481 return -EINVAL; in avs_peakvol_create()
483 cfg = adev->modcfg_buf; in avs_peakvol_create()
485 cfg->base.cpc = t->cfg_base->cpc; in avs_peakvol_create()
486 cfg->base.ibs = t->cfg_base->ibs; in avs_peakvol_create()
487 cfg->base.obs = t->cfg_base->obs; in avs_peakvol_create()
488 cfg->base.is_pages = t->cfg_base->is_pages; in avs_peakvol_create()
489 cfg->base.audio_fmt = *t->in_fmt; in avs_peakvol_create()
490 cfg->vols[0].channel_id = AVS_ALL_CHANNELS_MASK; in avs_peakvol_create()
491 cfg->vols[0].target_volume = S32_MAX; in avs_peakvol_create()
492 cfg->vols[0].curve_type = t->cfg_ext->peakvol.curve_type; in avs_peakvol_create()
493 cfg->vols[0].curve_duration = t->cfg_ext->peakvol.curve_duration; in avs_peakvol_create()
495 ret = avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, t->core_id, in avs_peakvol_create()
496 t->domain, cfg, cfg_size, &mod->instance_id); in avs_peakvol_create()
516 struct avs_tplg_module *t = mod->template; in avs_updown_mix_create()
520 cfg.base.cpc = t->cfg_base->cpc; in avs_updown_mix_create()
521 cfg.base.ibs = t->cfg_base->ibs; in avs_updown_mix_create()
522 cfg.base.obs = t->cfg_base->obs; in avs_updown_mix_create()
523 cfg.base.is_pages = t->cfg_base->is_pages; in avs_updown_mix_create()
524 cfg.base.audio_fmt = *t->in_fmt; in avs_updown_mix_create()
525 cfg.out_channel_config = t->cfg_ext->updown_mix.out_channel_config; in avs_updown_mix_create()
526 cfg.coefficients_select = t->cfg_ext->updown_mix.coefficients_select; in avs_updown_mix_create()
528 cfg.coefficients[i] = t->cfg_ext->updown_mix.coefficients[i]; in avs_updown_mix_create()
529 cfg.channel_map = t->cfg_ext->updown_mix.channel_map; in avs_updown_mix_create()
531 return avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, in avs_updown_mix_create()
532 t->core_id, t->domain, &cfg, sizeof(cfg), in avs_updown_mix_create()
533 &mod->instance_id); in avs_updown_mix_create()
538 struct avs_tplg_module *t = mod->template; in avs_src_create()
541 cfg.base.cpc = t->cfg_base->cpc; in avs_src_create()
542 cfg.base.ibs = t->cfg_base->ibs; in avs_src_create()
543 cfg.base.obs = t->cfg_base->obs; in avs_src_create()
544 cfg.base.is_pages = t->cfg_base->is_pages; in avs_src_create()
545 cfg.base.audio_fmt = *t->in_fmt; in avs_src_create()
546 cfg.out_freq = t->cfg_ext->src.out_freq; in avs_src_create()
548 return avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, in avs_src_create()
549 t->core_id, t->domain, &cfg, sizeof(cfg), in avs_src_create()
550 &mod->instance_id); in avs_src_create()
555 struct avs_tplg_module *t = mod->template; in avs_asrc_create()
559 cfg.base.cpc = t->cfg_base->cpc; in avs_asrc_create()
560 cfg.base.ibs = t->cfg_base->ibs; in avs_asrc_create()
561 cfg.base.obs = t->cfg_base->obs; in avs_asrc_create()
562 cfg.base.is_pages = t->cfg_base->is_pages; in avs_asrc_create()
563 cfg.base.audio_fmt = *t->in_fmt; in avs_asrc_create()
564 cfg.out_freq = t->cfg_ext->asrc.out_freq; in avs_asrc_create()
565 cfg.mode = t->cfg_ext->asrc.mode; in avs_asrc_create()
566 cfg.disable_jitter_buffer = t->cfg_ext->asrc.disable_jitter_buffer; in avs_asrc_create()
568 return avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, in avs_asrc_create()
569 t->core_id, t->domain, &cfg, sizeof(cfg), in avs_asrc_create()
570 &mod->instance_id); in avs_asrc_create()
575 struct avs_tplg_module *t = mod->template; in avs_aec_create()
578 cfg.base.cpc = t->cfg_base->cpc; in avs_aec_create()
579 cfg.base.ibs = t->cfg_base->ibs; in avs_aec_create()
580 cfg.base.obs = t->cfg_base->obs; in avs_aec_create()
581 cfg.base.is_pages = t->cfg_base->is_pages; in avs_aec_create()
582 cfg.base.audio_fmt = *t->in_fmt; in avs_aec_create()
583 cfg.ref_fmt = *t->cfg_ext->aec.ref_fmt; in avs_aec_create()
584 cfg.out_fmt = *t->cfg_ext->aec.out_fmt; in avs_aec_create()
585 cfg.cpc_lp_mode = t->cfg_ext->aec.cpc_lp_mode; in avs_aec_create()
587 return avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, in avs_aec_create()
588 t->core_id, t->domain, &cfg, sizeof(cfg), in avs_aec_create()
589 &mod->instance_id); in avs_aec_create()
594 struct avs_tplg_module *t = mod->template; in avs_mux_create()
597 cfg.base.cpc = t->cfg_base->cpc; in avs_mux_create()
598 cfg.base.ibs = t->cfg_base->ibs; in avs_mux_create()
599 cfg.base.obs = t->cfg_base->obs; in avs_mux_create()
600 cfg.base.is_pages = t->cfg_base->is_pages; in avs_mux_create()
601 cfg.base.audio_fmt = *t->in_fmt; in avs_mux_create()
602 cfg.ref_fmt = *t->cfg_ext->mux.ref_fmt; in avs_mux_create()
603 cfg.out_fmt = *t->cfg_ext->mux.out_fmt; in avs_mux_create()
605 return avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, in avs_mux_create()
606 t->core_id, t->domain, &cfg, sizeof(cfg), in avs_mux_create()
607 &mod->instance_id); in avs_mux_create()
612 struct avs_tplg_module *t = mod->template; in avs_wov_create()
615 cfg.base.cpc = t->cfg_base->cpc; in avs_wov_create()
616 cfg.base.ibs = t->cfg_base->ibs; in avs_wov_create()
617 cfg.base.obs = t->cfg_base->obs; in avs_wov_create()
618 cfg.base.is_pages = t->cfg_base->is_pages; in avs_wov_create()
619 cfg.base.audio_fmt = *t->in_fmt; in avs_wov_create()
620 cfg.cpc_lp_mode = t->cfg_ext->wov.cpc_lp_mode; in avs_wov_create()
622 return avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, in avs_wov_create()
623 t->core_id, t->domain, &cfg, sizeof(cfg), in avs_wov_create()
624 &mod->instance_id); in avs_wov_create()
629 struct avs_tplg_module *t = mod->template; in avs_micsel_create()
632 cfg.base.cpc = t->cfg_base->cpc; in avs_micsel_create()
633 cfg.base.ibs = t->cfg_base->ibs; in avs_micsel_create()
634 cfg.base.obs = t->cfg_base->obs; in avs_micsel_create()
635 cfg.base.is_pages = t->cfg_base->is_pages; in avs_micsel_create()
636 cfg.base.audio_fmt = *t->in_fmt; in avs_micsel_create()
637 cfg.out_fmt = *t->cfg_ext->micsel.out_fmt; in avs_micsel_create()
639 return avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, in avs_micsel_create()
640 t->core_id, t->domain, &cfg, sizeof(cfg), in avs_micsel_create()
641 &mod->instance_id); in avs_micsel_create()
646 struct avs_tplg_module *t = mod->template; in avs_modbase_create()
649 cfg.cpc = t->cfg_base->cpc; in avs_modbase_create()
650 cfg.ibs = t->cfg_base->ibs; in avs_modbase_create()
651 cfg.obs = t->cfg_base->obs; in avs_modbase_create()
652 cfg.is_pages = t->cfg_base->is_pages; in avs_modbase_create()
653 cfg.audio_fmt = *t->in_fmt; in avs_modbase_create()
655 return avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, in avs_modbase_create()
656 t->core_id, t->domain, &cfg, sizeof(cfg), in avs_modbase_create()
657 &mod->instance_id); in avs_modbase_create()
662 struct avs_tplg_module *t = mod->template; in avs_modext_create()
663 struct avs_tplg_modcfg_ext *tcfg = t->cfg_ext; in avs_modext_create()
668 num_pins = tcfg->generic.num_input_pins + tcfg->generic.num_output_pins; in avs_modext_create()
672 return -EINVAL; in avs_modext_create()
674 cfg = adev->modcfg_buf; in avs_modext_create()
676 cfg->base.cpc = t->cfg_base->cpc; in avs_modext_create()
677 cfg->base.ibs = t->cfg_base->ibs; in avs_modext_create()
678 cfg->base.obs = t->cfg_base->obs; in avs_modext_create()
679 cfg->base.is_pages = t->cfg_base->is_pages; in avs_modext_create()
680 cfg->base.audio_fmt = *t->in_fmt; in avs_modext_create()
681 cfg->num_input_pins = tcfg->generic.num_input_pins; in avs_modext_create()
682 cfg->num_output_pins = tcfg->generic.num_output_pins; in avs_modext_create()
686 struct avs_tplg_pin_format *tpin = &tcfg->generic.pin_fmts[i]; in avs_modext_create()
687 struct avs_pin_format *pin = &cfg->pin_fmts[i]; in avs_modext_create()
689 pin->pin_index = tpin->pin_index; in avs_modext_create()
690 pin->iobs = tpin->iobs; in avs_modext_create()
691 pin->audio_fmt = *tpin->fmt; in avs_modext_create()
694 ret = avs_dsp_init_module(adev, mod->module_id, mod->owner->instance_id, in avs_modext_create()
695 t->core_id, t->domain, cfg, cfg_size, in avs_modext_create()
696 &mod->instance_id); in avs_modext_create()
702 dev_err(adev->dev, "Probe module can't be instantiated by topology"); in avs_probe_create()
703 return -EINVAL; in avs_probe_create()
731 const guid_t *type = &mod->template->cfg_ext->type; in avs_path_module_type_create()
744 acomp = to_avs_soc_component(mod->template->owner->owner->owner->owner->comp); in avs_path_module_send_init_configs()
746 u32 num_ids = mod->template->num_config_ids; in avs_path_module_send_init_configs()
747 u32 *ids = mod->template->config_ids; in avs_path_module_send_init_configs()
750 struct avs_tplg_init_config *config = &acomp->tplg->init_configs[ids[i]]; in avs_path_module_send_init_configs()
751 size_t len = config->length; in avs_path_module_send_init_configs()
752 void *data = config->data; in avs_path_module_send_init_configs()
753 u32 param = config->param; in avs_path_module_send_init_configs()
756 ret = avs_ipc_set_large_config(adev, mod->module_id, mod->instance_id, in avs_path_module_send_init_configs()
759 dev_err(adev->dev, "send initial module config failed: %d\n", ret); in avs_path_module_send_init_configs()
780 module_id = avs_get_module_id(adev, &template->cfg_ext->type); in avs_path_module_create()
786 return ERR_PTR(-ENOMEM); in avs_path_module_create()
788 mod->template = template; in avs_path_module_create()
789 mod->module_id = module_id; in avs_path_module_create()
790 mod->owner = owner; in avs_path_module_create()
791 INIT_LIST_HEAD(&mod->node); in avs_path_module_create()
795 dev_err(adev->dev, "module-type create failed: %d\n", ret); in avs_path_module_create()
816 t = binding->template; in avs_path_binding_arm()
817 this_mod = avs_path_find_module(binding->owner, in avs_path_binding_arm()
818 t->mod_id); in avs_path_binding_arm()
820 dev_err(adev->dev, "path mod %d not found\n", t->mod_id); in avs_path_binding_arm()
821 return -EINVAL; in avs_path_binding_arm()
825 target_path = avs_path_find_path(adev, t->target_tplg_name, in avs_path_binding_arm()
826 t->target_path_tmpl_id); in avs_path_binding_arm()
828 dev_err(adev->dev, "target path %s:%d not found\n", in avs_path_binding_arm()
829 t->target_tplg_name, t->target_path_tmpl_id); in avs_path_binding_arm()
830 return -EINVAL; in avs_path_binding_arm()
834 t->target_ppl_id); in avs_path_binding_arm()
836 dev_err(adev->dev, "target ppl %d not found\n", t->target_ppl_id); in avs_path_binding_arm()
837 return -EINVAL; in avs_path_binding_arm()
840 target_mod = avs_path_find_module(target_ppl, t->target_mod_id); in avs_path_binding_arm()
842 dev_err(adev->dev, "target mod %d not found\n", t->target_mod_id); in avs_path_binding_arm()
843 return -EINVAL; in avs_path_binding_arm()
846 if (t->is_sink) { in avs_path_binding_arm()
847 binding->sink = this_mod; in avs_path_binding_arm()
848 binding->sink_pin = t->mod_pin; in avs_path_binding_arm()
849 binding->source = target_mod; in avs_path_binding_arm()
850 binding->source_pin = t->target_mod_pin; in avs_path_binding_arm()
852 binding->sink = target_mod; in avs_path_binding_arm()
853 binding->sink_pin = t->target_mod_pin; in avs_path_binding_arm()
854 binding->source = this_mod; in avs_path_binding_arm()
855 binding->source_pin = t->mod_pin; in avs_path_binding_arm()
874 return ERR_PTR(-ENOMEM); in avs_path_binding_create()
876 binding->template = t; in avs_path_binding_create()
877 binding->owner = owner; in avs_path_binding_create()
878 INIT_LIST_HEAD(&binding->node); in avs_path_binding_create()
888 list_for_each_entry(mod, &ppl->mod_list, node) { in avs_path_pipeline_arm()
889 struct avs_path_module *source, *sink; in avs_path_pipeline_arm() local
896 if (mod == list_last_entry(&ppl->mod_list, in avs_path_pipeline_arm()
901 source = mod; in avs_path_pipeline_arm()
904 ret = avs_ipc_bind(adev, source->module_id, source->instance_id, in avs_path_pipeline_arm()
905 sink->module_id, sink->instance_id, 0, 0); in avs_path_pipeline_arm()
919 list_for_each_entry_safe(binding, bsave, &ppl->binding_list, node) { in avs_path_pipeline_free()
920 list_del(&binding->node); in avs_path_pipeline_free()
924 avs_dsp_delete_pipeline(adev, ppl->instance_id); in avs_path_pipeline_free()
927 list_for_each_entry_safe(mod, save, &ppl->mod_list, node) { in avs_path_pipeline_free()
928 avs_dsp_delete_module(adev, mod->module_id, mod->instance_id, in avs_path_pipeline_free()
929 mod->owner->instance_id, in avs_path_pipeline_free()
930 mod->template->core_id); in avs_path_pipeline_free()
934 list_del(&ppl->node); in avs_path_pipeline_free()
943 struct avs_tplg_pplcfg *cfg = template->cfg; in avs_path_pipeline_create()
949 return ERR_PTR(-ENOMEM); in avs_path_pipeline_create()
951 ppl->template = template; in avs_path_pipeline_create()
952 ppl->owner = owner; in avs_path_pipeline_create()
953 INIT_LIST_HEAD(&ppl->binding_list); in avs_path_pipeline_create()
954 INIT_LIST_HEAD(&ppl->mod_list); in avs_path_pipeline_create()
955 INIT_LIST_HEAD(&ppl->node); in avs_path_pipeline_create()
957 ret = avs_dsp_create_pipeline(adev, cfg->req_size, cfg->priority, in avs_path_pipeline_create()
958 cfg->lp, cfg->attributes, in avs_path_pipeline_create()
959 &ppl->instance_id); in avs_path_pipeline_create()
961 dev_err(adev->dev, "error creating pipeline %d\n", ret); in avs_path_pipeline_create()
966 list_for_each_entry(tmod, &template->mod_list, node) { in avs_path_pipeline_create()
972 dev_err(adev->dev, "error creating module %d\n", ret); in avs_path_pipeline_create()
976 list_add_tail(&mod->node, &ppl->mod_list); in avs_path_pipeline_create()
979 for (i = 0; i < template->num_bindings; i++) { in avs_path_pipeline_create()
982 binding = avs_path_binding_create(adev, ppl, template->bindings[i]); in avs_path_pipeline_create()
985 dev_err(adev->dev, "error creating binding %d\n", ret); in avs_path_pipeline_create()
989 list_add_tail(&binding->node, &ppl->binding_list); in avs_path_pipeline_create()
1004 path->owner = adev; in avs_path_init()
1005 path->template = template; in avs_path_init()
1006 path->dma_id = dma_id; in avs_path_init()
1007 INIT_LIST_HEAD(&path->ppl_list); in avs_path_init()
1008 INIT_LIST_HEAD(&path->node); in avs_path_init()
1011 list_for_each_entry(tppl, &template->ppl_list, node) { in avs_path_init()
1018 list_add_tail(&ppl->node, &path->ppl_list); in avs_path_init()
1021 spin_lock(&adev->path_list_lock); in avs_path_init()
1022 list_add_tail(&path->node, &adev->path_list); in avs_path_init()
1023 spin_unlock(&adev->path_list_lock); in avs_path_init()
1034 list_for_each_entry(ppl, &path->ppl_list, node) { in avs_path_arm()
1039 list_for_each_entry(binding, &ppl->binding_list, node) { in avs_path_arm()
1057 spin_lock(&path->owner->path_list_lock); in avs_path_free_unlocked()
1058 list_del(&path->node); in avs_path_free_unlocked()
1059 spin_unlock(&path->owner->path_list_lock); in avs_path_free_unlocked()
1061 list_for_each_entry_safe(ppl, save, &path->ppl_list, node) in avs_path_free_unlocked()
1062 avs_path_pipeline_free(path->owner, ppl); in avs_path_free_unlocked()
1075 return ERR_PTR(-ENOMEM); in avs_path_create_unlocked()
1085 path->state = AVS_PPL_STATE_INVALID; in avs_path_create_unlocked()
1094 struct avs_dev *adev = path->owner; in avs_path_free()
1096 mutex_lock(&adev->path_mutex); in avs_path_free()
1098 mutex_unlock(&adev->path_mutex); in avs_path_free()
1111 dev_err(adev->dev, "no matching variant found\n"); in avs_path_create()
1112 return ERR_PTR(-ENOENT); in avs_path_create()
1116 mutex_lock(&adev->path_mutex); in avs_path_create()
1118 mutex_lock(&adev->comp_list_mutex); in avs_path_create()
1122 mutex_unlock(&adev->comp_list_mutex); in avs_path_create()
1123 mutex_unlock(&adev->path_mutex); in avs_path_create()
1132 struct avs_tplg_module *tsource = binding->source->template; in avs_path_bind_prepare()
1133 struct avs_path_module *source = binding->source; in avs_path_bind_prepare() local
1140 if (!binding->source_pin) in avs_path_bind_prepare()
1142 if (!guid_equal(&tsource->cfg_ext->type, &AVS_COPIER_MOD_UUID)) in avs_path_bind_prepare()
1145 src_fmt = tsource->in_fmt; in avs_path_bind_prepare()
1146 sink_fmt = binding->sink->template->in_fmt; in avs_path_bind_prepare()
1148 ret = avs_ipc_copier_set_sink_format(adev, source->module_id, in avs_path_bind_prepare()
1149 source->instance_id, binding->source_pin, in avs_path_bind_prepare()
1152 dev_err(adev->dev, "config copier failed: %d\n", ret); in avs_path_bind_prepare()
1162 struct avs_dev *adev = path->owner; in avs_path_bind()
1165 list_for_each_entry(ppl, &path->ppl_list, node) { in avs_path_bind()
1168 list_for_each_entry(binding, &ppl->binding_list, node) { in avs_path_bind()
1169 struct avs_path_module *source, *sink; in avs_path_bind() local
1171 source = binding->source; in avs_path_bind()
1172 sink = binding->sink; in avs_path_bind()
1178 ret = avs_ipc_bind(adev, source->module_id, in avs_path_bind()
1179 source->instance_id, sink->module_id, in avs_path_bind()
1180 sink->instance_id, binding->sink_pin, in avs_path_bind()
1181 binding->source_pin); in avs_path_bind()
1183 dev_err(adev->dev, "bind path failed: %d\n", ret); in avs_path_bind()
1195 struct avs_dev *adev = path->owner; in avs_path_unbind()
1198 list_for_each_entry(ppl, &path->ppl_list, node) { in avs_path_unbind()
1201 list_for_each_entry(binding, &ppl->binding_list, node) { in avs_path_unbind()
1202 struct avs_path_module *source, *sink; in avs_path_unbind() local
1204 source = binding->source; in avs_path_unbind()
1205 sink = binding->sink; in avs_path_unbind()
1207 ret = avs_ipc_unbind(adev, source->module_id, in avs_path_unbind()
1208 source->instance_id, sink->module_id, in avs_path_unbind()
1209 sink->instance_id, binding->sink_pin, in avs_path_unbind()
1210 binding->source_pin); in avs_path_unbind()
1212 dev_err(adev->dev, "unbind path failed: %d\n", ret); in avs_path_unbind()
1224 struct avs_dev *adev = path->owner; in avs_path_reset()
1227 if (path->state == AVS_PPL_STATE_RESET) in avs_path_reset()
1230 list_for_each_entry(ppl, &path->ppl_list, node) { in avs_path_reset()
1231 ret = avs_ipc_set_pipeline_state(adev, ppl->instance_id, in avs_path_reset()
1234 dev_err(adev->dev, "reset path failed: %d\n", ret); in avs_path_reset()
1235 path->state = AVS_PPL_STATE_INVALID; in avs_path_reset()
1240 path->state = AVS_PPL_STATE_RESET; in avs_path_reset()
1247 struct avs_dev *adev = path->owner; in avs_path_pause()
1250 if (path->state == AVS_PPL_STATE_PAUSED) in avs_path_pause()
1253 list_for_each_entry_reverse(ppl, &path->ppl_list, node) { in avs_path_pause()
1254 ret = avs_ipc_set_pipeline_state(adev, ppl->instance_id, in avs_path_pause()
1257 dev_err(adev->dev, "pause path failed: %d\n", ret); in avs_path_pause()
1258 path->state = AVS_PPL_STATE_INVALID; in avs_path_pause()
1263 path->state = AVS_PPL_STATE_PAUSED; in avs_path_pause()
1270 struct avs_dev *adev = path->owner; in avs_path_run()
1273 if (path->state == AVS_PPL_STATE_RUNNING && trigger == AVS_TPLG_TRIGGER_AUTO) in avs_path_run()
1276 list_for_each_entry(ppl, &path->ppl_list, node) { in avs_path_run()
1277 if (ppl->template->cfg->trigger != trigger) in avs_path_run()
1280 ret = avs_ipc_set_pipeline_state(adev, ppl->instance_id, in avs_path_run()
1283 dev_err(adev->dev, "run path failed: %d\n", ret); in avs_path_run()
1284 path->state = AVS_PPL_STATE_INVALID; in avs_path_run()
1289 path->state = AVS_PPL_STATE_RUNNING; in avs_path_run()