Lines Matching +full:pri +full:- +full:dai +full:- +full:link
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
14 #include <sound/intel-nhlt.h>
15 #include "sof-priv.h"
16 #include "sof-audio.h"
17 #include "ipc4-priv.h"
18 #include "ipc4-topology.h"
188 [SOF_DAI_TOKENS] = {"DAI tokens", dai_tokens, ARRAY_SIZE(dai_tokens)},
216 list_for_each_entry(swidget, &sdev->widget_list, list) { in sof_ipc4_find_swidget_by_ids()
217 struct sof_ipc4_fw_module *fw_module = swidget->module_info; in sof_ipc4_find_swidget_by_ids()
220 if (!swidget->use_count) in sof_ipc4_find_swidget_by_ids()
223 if (fw_module && fw_module->man4_module_entry.id == module_id && in sof_ipc4_find_swidget_by_ids()
224 swidget->instance_id == instance_id) in sof_ipc4_find_swidget_by_ids()
240 pin_fmt[i].pin_index, fmt->sampling_frequency, fmt->bit_depth, in sof_ipc4_dbg_audio_format()
241 SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg), in sof_ipc4_dbg_audio_format()
242 fmt->ch_map, fmt->ch_cfg, fmt->interleaving_style, fmt->fmt_cfg, in sof_ipc4_dbg_audio_format()
258 if (!available_fmt->num_input_formats && in sof_ipc4_dbg_module_audio_format()
259 !available_fmt->num_output_formats) in sof_ipc4_dbg_module_audio_format()
263 if (!available_fmt->num_input_formats) { in sof_ipc4_dbg_module_audio_format()
264 if (available_fmt->num_output_formats == 1) in sof_ipc4_dbg_module_audio_format()
266 swidget->widget->name); in sof_ipc4_dbg_module_audio_format()
270 out_fmt_index, swidget->widget->name); in sof_ipc4_dbg_module_audio_format()
272 pin_fmt = &available_fmt->output_pin_fmts[out_fmt_index]; in sof_ipc4_dbg_module_audio_format()
276 } else if (!available_fmt->num_output_formats) { in sof_ipc4_dbg_module_audio_format()
277 if (available_fmt->num_input_formats == 1) in sof_ipc4_dbg_module_audio_format()
279 swidget->widget->name); in sof_ipc4_dbg_module_audio_format()
283 out_fmt_index, swidget->widget->name); in sof_ipc4_dbg_module_audio_format()
285 pin_fmt = &available_fmt->input_pin_fmts[in_fmt_index]; in sof_ipc4_dbg_module_audio_format()
291 in_fmt = &available_fmt->input_pin_fmts[in_fmt_index].audio_fmt; in sof_ipc4_dbg_module_audio_format()
292 out_fmt = &available_fmt->output_pin_fmts[out_fmt_index].audio_fmt; in sof_ipc4_dbg_module_audio_format()
294 in_rate = in_fmt->sampling_frequency; in sof_ipc4_dbg_module_audio_format()
295 in_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(in_fmt->fmt_cfg); in sof_ipc4_dbg_module_audio_format()
296 in_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(in_fmt->fmt_cfg); in sof_ipc4_dbg_module_audio_format()
298 out_rate = out_fmt->sampling_frequency; in sof_ipc4_dbg_module_audio_format()
299 out_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(out_fmt->fmt_cfg); in sof_ipc4_dbg_module_audio_format()
300 out_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(out_fmt->fmt_cfg); in sof_ipc4_dbg_module_audio_format()
305 if (available_fmt->num_input_formats == 1 && in sof_ipc4_dbg_module_audio_format()
306 available_fmt->num_output_formats == 1) in sof_ipc4_dbg_module_audio_format()
308 swidget->widget->name); in sof_ipc4_dbg_module_audio_format()
312 in_fmt_index, out_fmt_index, swidget->widget->name); in sof_ipc4_dbg_module_audio_format()
314 pin_fmt = &available_fmt->input_pin_fmts[in_fmt_index]; in sof_ipc4_dbg_module_audio_format()
321 if (available_fmt->num_input_formats == 1) in sof_ipc4_dbg_module_audio_format()
323 swidget->widget->name); in sof_ipc4_dbg_module_audio_format()
326 in_fmt_index, swidget->widget->name); in sof_ipc4_dbg_module_audio_format()
328 pin_fmt = &available_fmt->input_pin_fmts[in_fmt_index]; in sof_ipc4_dbg_module_audio_format()
331 if (available_fmt->num_output_formats == 1) in sof_ipc4_dbg_module_audio_format()
333 swidget->widget->name); in sof_ipc4_dbg_module_audio_format()
336 out_fmt_index, swidget->widget->name); in sof_ipc4_dbg_module_audio_format()
338 pin_fmt = &available_fmt->output_pin_fmts[out_fmt_index]; in sof_ipc4_dbg_module_audio_format()
349 if (swidget->id != snd_soc_dapm_effect) { in sof_ipc4_get_input_pin_audio_fmt()
350 struct sof_ipc4_base_module_cfg *base = swidget->private; in sof_ipc4_get_input_pin_audio_fmt()
352 /* For non-process modules, base module config format is used for all input pins */ in sof_ipc4_get_input_pin_audio_fmt()
353 return &base->audio_fmt; in sof_ipc4_get_input_pin_audio_fmt()
356 process = swidget->private; in sof_ipc4_get_input_pin_audio_fmt()
362 if (process->init_config != SOF_IPC4_MODULE_INIT_CONFIG_TYPE_BASE_CFG_WITH_EXT) in sof_ipc4_get_input_pin_audio_fmt()
363 return &process->base_config.audio_fmt; in sof_ipc4_get_input_pin_audio_fmt()
365 base_cfg_ext = process->base_config_ext; in sof_ipc4_get_input_pin_audio_fmt()
371 for (i = 0; i < base_cfg_ext->num_input_pin_fmts; i++) { in sof_ipc4_get_input_pin_audio_fmt()
372 struct sof_ipc4_pin_format *pin_format = &base_cfg_ext->pin_formats[i]; in sof_ipc4_get_input_pin_audio_fmt()
374 if (pin_format->pin_index == pin_index) in sof_ipc4_get_input_pin_audio_fmt()
375 return &pin_format->audio_fmt; in sof_ipc4_get_input_pin_audio_fmt()
382 * sof_ipc4_get_audio_fmt - get available audio formats from swidget->tuples
400 SOF_AUDIO_FMT_NUM_TOKENS, swidget->tuples, in sof_ipc4_get_audio_fmt()
401 swidget->num_tuples, sizeof(*available_fmt), 1); in sof_ipc4_get_audio_fmt()
403 dev_err(scomp->dev, "Failed to parse audio format token count\n"); in sof_ipc4_get_audio_fmt()
407 if (!available_fmt->num_input_formats && !available_fmt->num_output_formats) { in sof_ipc4_get_audio_fmt()
408 dev_err(scomp->dev, "No input/output pin formats set in topology\n"); in sof_ipc4_get_audio_fmt()
409 return -EINVAL; in sof_ipc4_get_audio_fmt()
412 dev_dbg(scomp->dev, in sof_ipc4_get_audio_fmt()
414 available_fmt->num_input_formats, available_fmt->num_output_formats); in sof_ipc4_get_audio_fmt()
417 ret = sof_update_ipc_object(scomp, module_base_cfg, SOF_COMP_TOKENS, swidget->tuples, in sof_ipc4_get_audio_fmt()
418 swidget->num_tuples, sizeof(*module_base_cfg), 1); in sof_ipc4_get_audio_fmt()
420 dev_err(scomp->dev, "parse comp tokens for %s failed, error: %d\n", in sof_ipc4_get_audio_fmt()
421 swidget->widget->name, ret); in sof_ipc4_get_audio_fmt()
425 dev_dbg(scomp->dev, "widget %s: is_pages: %d\n", swidget->widget->name, in sof_ipc4_get_audio_fmt()
426 module_base_cfg->is_pages); in sof_ipc4_get_audio_fmt()
428 if (available_fmt->num_input_formats) { in sof_ipc4_get_audio_fmt()
429 in_format = kcalloc(available_fmt->num_input_formats, in sof_ipc4_get_audio_fmt()
432 return -ENOMEM; in sof_ipc4_get_audio_fmt()
433 available_fmt->input_pin_fmts = in_format; in sof_ipc4_get_audio_fmt()
436 SOF_IN_AUDIO_FORMAT_TOKENS, swidget->tuples, in sof_ipc4_get_audio_fmt()
437 swidget->num_tuples, sizeof(*in_format), in sof_ipc4_get_audio_fmt()
438 available_fmt->num_input_formats); in sof_ipc4_get_audio_fmt()
440 dev_err(scomp->dev, "parse input audio fmt tokens failed %d\n", ret); in sof_ipc4_get_audio_fmt()
444 dev_dbg(scomp->dev, "Input audio formats for %s\n", swidget->widget->name); in sof_ipc4_get_audio_fmt()
445 sof_ipc4_dbg_audio_format(scomp->dev, in_format, in sof_ipc4_get_audio_fmt()
446 available_fmt->num_input_formats); in sof_ipc4_get_audio_fmt()
449 if (available_fmt->num_output_formats) { in sof_ipc4_get_audio_fmt()
450 out_format = kcalloc(available_fmt->num_output_formats, sizeof(*out_format), in sof_ipc4_get_audio_fmt()
453 ret = -ENOMEM; in sof_ipc4_get_audio_fmt()
458 SOF_OUT_AUDIO_FORMAT_TOKENS, swidget->tuples, in sof_ipc4_get_audio_fmt()
459 swidget->num_tuples, sizeof(*out_format), in sof_ipc4_get_audio_fmt()
460 available_fmt->num_output_formats); in sof_ipc4_get_audio_fmt()
462 dev_err(scomp->dev, "parse output audio fmt tokens failed\n"); in sof_ipc4_get_audio_fmt()
466 available_fmt->output_pin_fmts = out_format; in sof_ipc4_get_audio_fmt()
467 dev_dbg(scomp->dev, "Output audio formats for %s\n", swidget->widget->name); in sof_ipc4_get_audio_fmt()
468 sof_ipc4_dbg_audio_format(scomp->dev, out_format, in sof_ipc4_get_audio_fmt()
469 available_fmt->num_output_formats); in sof_ipc4_get_audio_fmt()
478 available_fmt->input_pin_fmts = NULL; in sof_ipc4_get_audio_fmt()
486 kfree(available_fmt->output_pin_fmts); in sof_ipc4_free_audio_fmt()
487 available_fmt->output_pin_fmts = NULL; in sof_ipc4_free_audio_fmt()
488 kfree(available_fmt->input_pin_fmts); in sof_ipc4_free_audio_fmt()
489 available_fmt->input_pin_fmts = NULL; in sof_ipc4_free_audio_fmt()
494 kfree(swidget->private); in sof_ipc4_widget_free_comp_pipeline()
499 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_widget_set_module_info()
502 swidget->module_info = sof_ipc4_find_module_by_uuid(sdev, &swidget->uuid); in sof_ipc4_widget_set_module_info()
504 if (swidget->module_info) in sof_ipc4_widget_set_module_info()
507 dev_err(sdev->dev, "failed to find module info for widget %s with UUID %pUL\n", in sof_ipc4_widget_set_module_info()
508 swidget->widget->name, &swidget->uuid); in sof_ipc4_widget_set_module_info()
509 return -EINVAL; in sof_ipc4_widget_set_module_info()
522 fw_module = swidget->module_info; in sof_ipc4_widget_setup_msg()
524 msg->primary = fw_module->man4_module_entry.id; in sof_ipc4_widget_setup_msg()
525 msg->primary |= SOF_IPC4_MSG_TYPE_SET(SOF_IPC4_MOD_INIT_INSTANCE); in sof_ipc4_widget_setup_msg()
526 msg->primary |= SOF_IPC4_MSG_DIR(SOF_IPC4_MSG_REQUEST); in sof_ipc4_widget_setup_msg()
527 msg->primary |= SOF_IPC4_MSG_TARGET(SOF_IPC4_MODULE_MSG); in sof_ipc4_widget_setup_msg()
529 msg->extension = SOF_IPC4_MOD_EXT_CORE_ID(swidget->core); in sof_ipc4_widget_setup_msg()
531 switch (swidget->comp_domain) { in sof_ipc4_widget_setup_msg()
539 type = (fw_module->man4_module_entry.type & SOF_IPC4_MODULE_DP) ? 1 : 0; in sof_ipc4_widget_setup_msg()
542 msg->extension |= SOF_IPC4_MOD_EXT_DOMAIN(type); in sof_ipc4_widget_setup_msg()
549 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_widget_update_kcontrol_module_id()
551 struct sof_ipc4_fw_module *fw_module = swidget->module_info; in sof_ipc4_widget_update_kcontrol_module_id()
555 list_for_each_entry(scontrol, &sdev->kcontrol_list, list) { in sof_ipc4_widget_update_kcontrol_module_id()
556 if (scontrol->comp_id == swidget->comp_id) { in sof_ipc4_widget_update_kcontrol_module_id()
557 struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; in sof_ipc4_widget_update_kcontrol_module_id()
558 struct sof_ipc4_msg *msg = &cdata->msg; in sof_ipc4_widget_update_kcontrol_module_id()
560 msg->primary |= fw_module->man4_module_entry.id; in sof_ipc4_widget_update_kcontrol_module_id()
569 struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget; in sof_ipc4_update_card_components_string()
570 struct sof_ipc4_pipeline *pipeline = pipe_widget->private; in sof_ipc4_update_card_components_string()
571 struct snd_soc_component *scomp = spcm->scomp; in sof_ipc4_update_card_components_string()
572 struct snd_soc_card *card = scomp->card; in sof_ipc4_update_card_components_string()
573 const char *pt_marker = "iec61937-pcm"; in sof_ipc4_update_card_components_string()
576 * Update the card's components list with iec61937-pcm and a list of PCM in sof_ipc4_update_card_components_string()
580 if (!pipeline->use_chain_dma) in sof_ipc4_update_card_components_string()
583 if (card->components) { in sof_ipc4_update_card_components_string()
584 const char *tmp = card->components; in sof_ipc4_update_card_components_string()
586 if (strstr(card->components, pt_marker)) in sof_ipc4_update_card_components_string()
587 card->components = devm_kasprintf(card->dev, GFP_KERNEL, in sof_ipc4_update_card_components_string()
589 card->components, in sof_ipc4_update_card_components_string()
590 spcm->pcm.pcm_id); in sof_ipc4_update_card_components_string()
592 card->components = devm_kasprintf(card->dev, GFP_KERNEL, in sof_ipc4_update_card_components_string()
594 card->components, in sof_ipc4_update_card_components_string()
596 spcm->pcm.pcm_id); in sof_ipc4_update_card_components_string()
598 devm_kfree(card->dev, tmp); in sof_ipc4_update_card_components_string()
600 card->components = devm_kasprintf(card->dev, GFP_KERNEL, in sof_ipc4_update_card_components_string()
602 spcm->pcm.pcm_id); in sof_ipc4_update_card_components_string()
605 if (!card->components) in sof_ipc4_update_card_components_string()
606 return -ENOMEM; in sof_ipc4_update_card_components_string()
614 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_widget_setup_pcm()
622 return -ENOMEM; in sof_ipc4_widget_setup_pcm()
624 swidget->private = ipc4_copier; in sof_ipc4_widget_setup_pcm()
625 available_fmt = &ipc4_copier->available_fmt; in sof_ipc4_widget_setup_pcm()
627 dev_dbg(scomp->dev, "Updating IPC structure for %s\n", swidget->widget->name); in sof_ipc4_widget_setup_pcm()
630 &ipc4_copier->data.base_config); in sof_ipc4_widget_setup_pcm()
635 * This callback is used by host copier and module-to-module copier, in sof_ipc4_widget_setup_pcm()
638 if (!WIDGET_IS_AIF(swidget->id)) in sof_ipc4_widget_setup_pcm()
642 SOF_COPIER_TOKENS, swidget->tuples, in sof_ipc4_widget_setup_pcm()
643 swidget->num_tuples, sizeof(node_type), 1); in sof_ipc4_widget_setup_pcm()
646 dev_err(scomp->dev, "parse host copier node type token failed %d\n", in sof_ipc4_widget_setup_pcm()
650 dev_dbg(scomp->dev, "host copier '%s' node_type %u\n", swidget->widget->name, node_type); in sof_ipc4_widget_setup_pcm()
652 spcm = snd_sof_find_spcm_comp(scomp, swidget->comp_id, &dir); in sof_ipc4_widget_setup_pcm()
661 struct snd_sof_pcm_stream *sps = &spcm->stream[dir]; in sof_ipc4_widget_setup_pcm()
663 sof_update_ipc_object(scomp, &sps->dsp_max_burst_size_in_ms, in sof_ipc4_widget_setup_pcm()
665 swidget->tuples, in sof_ipc4_widget_setup_pcm()
666 swidget->num_tuples, sizeof(u32), 1); in sof_ipc4_widget_setup_pcm()
668 if (!sps->dsp_max_burst_size_in_ms) { in sof_ipc4_widget_setup_pcm()
669 struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget; in sof_ipc4_widget_setup_pcm()
670 struct sof_ipc4_pipeline *pipeline = pipe_widget->private; in sof_ipc4_widget_setup_pcm()
672 sps->dsp_max_burst_size_in_ms = pipeline->use_chain_dma ? in sof_ipc4_widget_setup_pcm()
677 spcm->stream[dir].dsp_max_burst_size_in_ms = 1; in sof_ipc4_widget_setup_pcm()
681 ipc4_copier->gtw_attr = kzalloc(sizeof(*ipc4_copier->gtw_attr), GFP_KERNEL); in sof_ipc4_widget_setup_pcm()
682 if (!ipc4_copier->gtw_attr) { in sof_ipc4_widget_setup_pcm()
683 ret = -ENOMEM; in sof_ipc4_widget_setup_pcm()
687 ipc4_copier->copier_config = (uint32_t *)ipc4_copier->gtw_attr; in sof_ipc4_widget_setup_pcm()
688 ipc4_copier->data.gtw_cfg.config_length = in sof_ipc4_widget_setup_pcm()
691 switch (swidget->id) { in sof_ipc4_widget_setup_pcm()
694 ipc4_copier->data.gtw_cfg.node_id = SOF_IPC4_NODE_TYPE(node_type); in sof_ipc4_widget_setup_pcm()
697 ipc4_copier->data.gtw_cfg.node_id = SOF_IPC4_INVALID_NODE_ID; in sof_ipc4_widget_setup_pcm()
698 ipc4_copier->ipc_config_size = 0; in sof_ipc4_widget_setup_pcm()
701 dev_err(scomp->dev, "invalid widget type %d\n", swidget->id); in sof_ipc4_widget_setup_pcm()
702 ret = -EINVAL; in sof_ipc4_widget_setup_pcm()
707 ret = sof_ipc4_widget_setup_msg(swidget, &ipc4_copier->msg); in sof_ipc4_widget_setup_pcm()
714 kfree(ipc4_copier->gtw_attr); in sof_ipc4_widget_setup_pcm()
719 swidget->private = NULL; in sof_ipc4_widget_setup_pcm()
725 struct sof_ipc4_copier *ipc4_copier = swidget->private; in sof_ipc4_widget_free_comp_pcm()
731 available_fmt = &ipc4_copier->available_fmt; in sof_ipc4_widget_free_comp_pcm()
732 kfree(available_fmt->output_pin_fmts); in sof_ipc4_widget_free_comp_pcm()
733 kfree(ipc4_copier->gtw_attr); in sof_ipc4_widget_free_comp_pcm()
735 swidget->private = NULL; in sof_ipc4_widget_free_comp_pcm()
741 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_widget_setup_comp_dai()
743 struct snd_sof_dai *dai = swidget->private; in sof_ipc4_widget_setup_comp_dai() local
752 return -ENOMEM; in sof_ipc4_widget_setup_comp_dai()
754 available_fmt = &ipc4_copier->available_fmt; in sof_ipc4_widget_setup_comp_dai()
756 dev_dbg(scomp->dev, "Updating IPC structure for %s\n", swidget->widget->name); in sof_ipc4_widget_setup_comp_dai()
759 &ipc4_copier->data.base_config); in sof_ipc4_widget_setup_comp_dai()
764 SOF_COPIER_TOKENS, swidget->tuples, in sof_ipc4_widget_setup_comp_dai()
765 swidget->num_tuples, sizeof(node_type), 1); in sof_ipc4_widget_setup_comp_dai()
767 dev_err(scomp->dev, "parse dai node type failed %d\n", ret); in sof_ipc4_widget_setup_comp_dai()
772 SOF_DAI_TOKENS, swidget->tuples, in sof_ipc4_widget_setup_comp_dai()
773 swidget->num_tuples, sizeof(u32), 1); in sof_ipc4_widget_setup_comp_dai()
775 dev_err(scomp->dev, "parse dai copier node token failed %d\n", ret); in sof_ipc4_widget_setup_comp_dai()
779 dev_dbg(scomp->dev, "dai %s node_type %u dai_type %u dai_index %d\n", swidget->widget->name, in sof_ipc4_widget_setup_comp_dai()
780 node_type, ipc4_copier->dai_type, ipc4_copier->dai_index); in sof_ipc4_widget_setup_comp_dai()
782 dai->type = ipc4_copier->dai_type; in sof_ipc4_widget_setup_comp_dai()
783 ipc4_copier->data.gtw_cfg.node_id = SOF_IPC4_NODE_TYPE(node_type); in sof_ipc4_widget_setup_comp_dai()
785 pipe_widget = swidget->spipe->pipe_widget; in sof_ipc4_widget_setup_comp_dai()
786 pipeline = pipe_widget->private; in sof_ipc4_widget_setup_comp_dai()
788 if (pipeline->use_chain_dma && in sof_ipc4_widget_setup_comp_dai()
789 !snd_sof_is_chain_dma_supported(sdev, ipc4_copier->dai_type)) { in sof_ipc4_widget_setup_comp_dai()
790 dev_err(scomp->dev, "Bad DAI type '%d', Chain DMA is not supported\n", in sof_ipc4_widget_setup_comp_dai()
791 ipc4_copier->dai_type); in sof_ipc4_widget_setup_comp_dai()
792 ret = -ENODEV; in sof_ipc4_widget_setup_comp_dai()
796 switch (ipc4_copier->dai_type) { in sof_ipc4_widget_setup_comp_dai()
804 snd_soc_dapm_widget_for_each_source_path(swidget->widget, p) in sof_ipc4_widget_setup_comp_dai()
807 if (swidget->id == snd_soc_dapm_dai_in && src_num == 0) { in sof_ipc4_widget_setup_comp_dai()
811 * It is fine to call kfree(ipc4_copier->copier_config) since in sof_ipc4_widget_setup_comp_dai()
812 * ipc4_copier->copier_config is null. in sof_ipc4_widget_setup_comp_dai()
819 ret = -ENOMEM; in sof_ipc4_widget_setup_comp_dai()
823 list_for_each_entry(w, &sdev->widget_list, list) { in sof_ipc4_widget_setup_comp_dai()
826 if (!WIDGET_IS_DAI(w->id) || !w->widget->sname || in sof_ipc4_widget_setup_comp_dai()
827 strcmp(w->widget->sname, swidget->widget->sname)) in sof_ipc4_widget_setup_comp_dai()
830 alh_dai = w->private; in sof_ipc4_widget_setup_comp_dai()
831 if (alh_dai->type != SOF_DAI_INTEL_ALH) in sof_ipc4_widget_setup_comp_dai()
834 blob->alh_cfg.device_count++; in sof_ipc4_widget_setup_comp_dai()
837 ipc4_copier->copier_config = (uint32_t *)blob; in sof_ipc4_widget_setup_comp_dai()
839 ipc4_copier->data.gtw_cfg.config_length = (sizeof(blob->gw_attr) + in sof_ipc4_widget_setup_comp_dai()
840 sizeof(blob->alh_cfg.device_count) + in sof_ipc4_widget_setup_comp_dai()
841 sizeof(*blob->alh_cfg.mapping) * in sof_ipc4_widget_setup_comp_dai()
842 blob->alh_cfg.device_count) >> 2; in sof_ipc4_widget_setup_comp_dai()
846 /* set SSP DAI index as the node_id */ in sof_ipc4_widget_setup_comp_dai()
847 ipc4_copier->data.gtw_cfg.node_id |= in sof_ipc4_widget_setup_comp_dai()
848 SOF_IPC4_NODE_INDEX_INTEL_SSP(ipc4_copier->dai_index); in sof_ipc4_widget_setup_comp_dai()
851 /* set DMIC DAI index as the node_id */ in sof_ipc4_widget_setup_comp_dai()
852 ipc4_copier->data.gtw_cfg.node_id |= in sof_ipc4_widget_setup_comp_dai()
853 SOF_IPC4_NODE_INDEX_INTEL_DMIC(ipc4_copier->dai_index); in sof_ipc4_widget_setup_comp_dai()
856 ipc4_copier->gtw_attr = kzalloc(sizeof(*ipc4_copier->gtw_attr), GFP_KERNEL); in sof_ipc4_widget_setup_comp_dai()
857 if (!ipc4_copier->gtw_attr) { in sof_ipc4_widget_setup_comp_dai()
858 ret = -ENOMEM; in sof_ipc4_widget_setup_comp_dai()
862 ipc4_copier->copier_config = (uint32_t *)ipc4_copier->gtw_attr; in sof_ipc4_widget_setup_comp_dai()
863 ipc4_copier->data.gtw_cfg.config_length = in sof_ipc4_widget_setup_comp_dai()
868 dai->scomp = scomp; in sof_ipc4_widget_setup_comp_dai()
869 dai->private = ipc4_copier; in sof_ipc4_widget_setup_comp_dai()
872 ret = sof_ipc4_widget_setup_msg(swidget, &ipc4_copier->msg); in sof_ipc4_widget_setup_comp_dai()
879 kfree(ipc4_copier->copier_config); in sof_ipc4_widget_setup_comp_dai()
884 dai->private = NULL; in sof_ipc4_widget_setup_comp_dai()
885 dai->scomp = NULL; in sof_ipc4_widget_setup_comp_dai()
892 struct snd_sof_dai *dai = swidget->private; in sof_ipc4_widget_free_comp_dai() local
895 if (!dai) in sof_ipc4_widget_free_comp_dai()
898 if (!dai->private) { in sof_ipc4_widget_free_comp_dai()
899 kfree(dai); in sof_ipc4_widget_free_comp_dai()
900 swidget->private = NULL; in sof_ipc4_widget_free_comp_dai()
904 ipc4_copier = dai->private; in sof_ipc4_widget_free_comp_dai()
905 available_fmt = &ipc4_copier->available_fmt; in sof_ipc4_widget_free_comp_dai()
907 kfree(available_fmt->output_pin_fmts); in sof_ipc4_widget_free_comp_dai()
908 if (ipc4_copier->dai_type != SOF_DAI_INTEL_SSP && in sof_ipc4_widget_free_comp_dai()
909 ipc4_copier->dai_type != SOF_DAI_INTEL_DMIC) in sof_ipc4_widget_free_comp_dai()
910 kfree(ipc4_copier->copier_config); in sof_ipc4_widget_free_comp_dai()
911 kfree(dai->private); in sof_ipc4_widget_free_comp_dai()
912 kfree(dai); in sof_ipc4_widget_free_comp_dai()
913 swidget->private = NULL; in sof_ipc4_widget_free_comp_dai()
918 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_widget_setup_comp_pipeline()
920 struct snd_sof_pipeline *spipe = swidget->spipe; in sof_ipc4_widget_setup_comp_pipeline()
925 return -ENOMEM; in sof_ipc4_widget_setup_comp_pipeline()
927 ret = sof_update_ipc_object(scomp, pipeline, SOF_SCHED_TOKENS, swidget->tuples, in sof_ipc4_widget_setup_comp_pipeline()
928 swidget->num_tuples, sizeof(*pipeline), 1); in sof_ipc4_widget_setup_comp_pipeline()
930 dev_err(scomp->dev, "parsing scheduler tokens failed\n"); in sof_ipc4_widget_setup_comp_pipeline()
934 swidget->core = pipeline->core_id; in sof_ipc4_widget_setup_comp_pipeline()
935 spipe->core_mask |= BIT(pipeline->core_id); in sof_ipc4_widget_setup_comp_pipeline()
937 if (pipeline->use_chain_dma) { in sof_ipc4_widget_setup_comp_pipeline()
938 dev_dbg(scomp->dev, "Set up chain DMA for %s\n", swidget->widget->name); in sof_ipc4_widget_setup_comp_pipeline()
939 swidget->private = pipeline; in sof_ipc4_widget_setup_comp_pipeline()
944 ret = sof_update_ipc_object(scomp, swidget, SOF_PIPELINE_TOKENS, swidget->tuples, in sof_ipc4_widget_setup_comp_pipeline()
945 swidget->num_tuples, sizeof(*swidget), 1); in sof_ipc4_widget_setup_comp_pipeline()
947 dev_err(scomp->dev, "parsing pipeline tokens failed\n"); in sof_ipc4_widget_setup_comp_pipeline()
951 dev_dbg(scomp->dev, "pipeline '%s': id %d, pri %d, core_id %u, lp mode %d\n", in sof_ipc4_widget_setup_comp_pipeline()
952 swidget->widget->name, swidget->pipeline_id, in sof_ipc4_widget_setup_comp_pipeline()
953 pipeline->priority, pipeline->core_id, pipeline->lp_mode); in sof_ipc4_widget_setup_comp_pipeline()
955 swidget->private = pipeline; in sof_ipc4_widget_setup_comp_pipeline()
957 pipeline->msg.primary = SOF_IPC4_GLB_PIPE_PRIORITY(pipeline->priority); in sof_ipc4_widget_setup_comp_pipeline()
958 pipeline->msg.primary |= SOF_IPC4_MSG_TYPE_SET(SOF_IPC4_GLB_CREATE_PIPELINE); in sof_ipc4_widget_setup_comp_pipeline()
959 pipeline->msg.primary |= SOF_IPC4_MSG_DIR(SOF_IPC4_MSG_REQUEST); in sof_ipc4_widget_setup_comp_pipeline()
960 pipeline->msg.primary |= SOF_IPC4_MSG_TARGET(SOF_IPC4_FW_GEN_MSG); in sof_ipc4_widget_setup_comp_pipeline()
962 pipeline->msg.extension = pipeline->lp_mode; in sof_ipc4_widget_setup_comp_pipeline()
963 pipeline->msg.extension |= SOF_IPC4_GLB_PIPE_EXT_CORE_ID(pipeline->core_id); in sof_ipc4_widget_setup_comp_pipeline()
964 pipeline->state = SOF_IPC4_PIPE_UNINITIALIZED; in sof_ipc4_widget_setup_comp_pipeline()
974 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_widget_setup_comp_pga()
980 return -ENOMEM; in sof_ipc4_widget_setup_comp_pga()
982 swidget->private = gain; in sof_ipc4_widget_setup_comp_pga()
984 gain->data.params.channels = SOF_IPC4_GAIN_ALL_CHANNELS_MASK; in sof_ipc4_widget_setup_comp_pga()
985 gain->data.params.init_val = SOF_IPC4_VOL_ZERO_DB; in sof_ipc4_widget_setup_comp_pga()
987 ret = sof_ipc4_get_audio_fmt(scomp, swidget, &gain->available_fmt, &gain->data.base_config); in sof_ipc4_widget_setup_comp_pga()
991 ret = sof_update_ipc_object(scomp, &gain->data.params, SOF_GAIN_TOKENS, in sof_ipc4_widget_setup_comp_pga()
992 swidget->tuples, swidget->num_tuples, sizeof(gain->data), 1); in sof_ipc4_widget_setup_comp_pga()
994 dev_err(scomp->dev, "Parsing gain tokens failed\n"); in sof_ipc4_widget_setup_comp_pga()
998 dev_dbg(scomp->dev, in sof_ipc4_widget_setup_comp_pga()
1000 swidget->widget->name, gain->data.params.curve_type, in sof_ipc4_widget_setup_comp_pga()
1001 gain->data.params.curve_duration_l, gain->data.params.init_val); in sof_ipc4_widget_setup_comp_pga()
1003 ret = sof_ipc4_widget_setup_msg(swidget, &gain->msg); in sof_ipc4_widget_setup_comp_pga()
1011 sof_ipc4_free_audio_fmt(&gain->available_fmt); in sof_ipc4_widget_setup_comp_pga()
1013 swidget->private = NULL; in sof_ipc4_widget_setup_comp_pga()
1019 struct sof_ipc4_gain *gain = swidget->private; in sof_ipc4_widget_free_comp_pga()
1024 sof_ipc4_free_audio_fmt(&gain->available_fmt); in sof_ipc4_widget_free_comp_pga()
1025 kfree(swidget->private); in sof_ipc4_widget_free_comp_pga()
1026 swidget->private = NULL; in sof_ipc4_widget_free_comp_pga()
1031 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_widget_setup_comp_mixer()
1035 dev_dbg(scomp->dev, "Updating IPC structure for %s\n", swidget->widget->name); in sof_ipc4_widget_setup_comp_mixer()
1039 return -ENOMEM; in sof_ipc4_widget_setup_comp_mixer()
1041 swidget->private = mixer; in sof_ipc4_widget_setup_comp_mixer()
1043 ret = sof_ipc4_get_audio_fmt(scomp, swidget, &mixer->available_fmt, in sof_ipc4_widget_setup_comp_mixer()
1044 &mixer->base_config); in sof_ipc4_widget_setup_comp_mixer()
1048 ret = sof_ipc4_widget_setup_msg(swidget, &mixer->msg); in sof_ipc4_widget_setup_comp_mixer()
1054 sof_ipc4_free_audio_fmt(&mixer->available_fmt); in sof_ipc4_widget_setup_comp_mixer()
1056 swidget->private = NULL; in sof_ipc4_widget_setup_comp_mixer()
1062 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_widget_setup_comp_src()
1063 struct snd_sof_pipeline *spipe = swidget->spipe; in sof_ipc4_widget_setup_comp_src()
1067 dev_dbg(scomp->dev, "Updating IPC structure for %s\n", swidget->widget->name); in sof_ipc4_widget_setup_comp_src()
1071 return -ENOMEM; in sof_ipc4_widget_setup_comp_src()
1073 swidget->private = src; in sof_ipc4_widget_setup_comp_src()
1075 ret = sof_ipc4_get_audio_fmt(scomp, swidget, &src->available_fmt, in sof_ipc4_widget_setup_comp_src()
1076 &src->data.base_config); in sof_ipc4_widget_setup_comp_src()
1080 ret = sof_update_ipc_object(scomp, &src->data, SOF_SRC_TOKENS, swidget->tuples, in sof_ipc4_widget_setup_comp_src()
1081 swidget->num_tuples, sizeof(*src), 1); in sof_ipc4_widget_setup_comp_src()
1083 dev_err(scomp->dev, "Parsing SRC tokens failed\n"); in sof_ipc4_widget_setup_comp_src()
1087 spipe->core_mask |= BIT(swidget->core); in sof_ipc4_widget_setup_comp_src()
1089 dev_dbg(scomp->dev, "SRC sink rate %d\n", src->data.sink_rate); in sof_ipc4_widget_setup_comp_src()
1091 ret = sof_ipc4_widget_setup_msg(swidget, &src->msg); in sof_ipc4_widget_setup_comp_src()
1097 sof_ipc4_free_audio_fmt(&src->available_fmt); in sof_ipc4_widget_setup_comp_src()
1099 swidget->private = NULL; in sof_ipc4_widget_setup_comp_src()
1105 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_widget_setup_comp_asrc()
1106 struct snd_sof_pipeline *spipe = swidget->spipe; in sof_ipc4_widget_setup_comp_asrc()
1110 dev_dbg(scomp->dev, "Updating IPC structure for %s\n", swidget->widget->name); in sof_ipc4_widget_setup_comp_asrc()
1114 return -ENOMEM; in sof_ipc4_widget_setup_comp_asrc()
1116 swidget->private = asrc; in sof_ipc4_widget_setup_comp_asrc()
1118 ret = sof_ipc4_get_audio_fmt(scomp, swidget, &asrc->available_fmt, in sof_ipc4_widget_setup_comp_asrc()
1119 &asrc->data.base_config); in sof_ipc4_widget_setup_comp_asrc()
1123 ret = sof_update_ipc_object(scomp, &asrc->data, SOF_ASRC_TOKENS, swidget->tuples, in sof_ipc4_widget_setup_comp_asrc()
1124 swidget->num_tuples, sizeof(*asrc), 1); in sof_ipc4_widget_setup_comp_asrc()
1126 dev_err(scomp->dev, "Parsing ASRC tokens failed\n"); in sof_ipc4_widget_setup_comp_asrc()
1130 spipe->core_mask |= BIT(swidget->core); in sof_ipc4_widget_setup_comp_asrc()
1132 dev_dbg(scomp->dev, "ASRC sink rate %d, mode 0x%08x\n", in sof_ipc4_widget_setup_comp_asrc()
1133 asrc->data.out_freq, asrc->data.asrc_mode); in sof_ipc4_widget_setup_comp_asrc()
1135 ret = sof_ipc4_widget_setup_msg(swidget, &asrc->msg); in sof_ipc4_widget_setup_comp_asrc()
1141 sof_ipc4_free_audio_fmt(&asrc->available_fmt); in sof_ipc4_widget_setup_comp_asrc()
1143 swidget->private = NULL; in sof_ipc4_widget_setup_comp_asrc()
1149 struct sof_ipc4_src *src = swidget->private; in sof_ipc4_widget_free_comp_src()
1154 sof_ipc4_free_audio_fmt(&src->available_fmt); in sof_ipc4_widget_free_comp_src()
1155 kfree(swidget->private); in sof_ipc4_widget_free_comp_src()
1156 swidget->private = NULL; in sof_ipc4_widget_free_comp_src()
1161 struct sof_ipc4_asrc *asrc = swidget->private; in sof_ipc4_widget_free_comp_asrc()
1166 sof_ipc4_free_audio_fmt(&asrc->available_fmt); in sof_ipc4_widget_free_comp_asrc()
1167 kfree(swidget->private); in sof_ipc4_widget_free_comp_asrc()
1168 swidget->private = NULL; in sof_ipc4_widget_free_comp_asrc()
1173 struct sof_ipc4_mixer *mixer = swidget->private; in sof_ipc4_widget_free_comp_mixer()
1178 sof_ipc4_free_audio_fmt(&mixer->available_fmt); in sof_ipc4_widget_free_comp_mixer()
1179 kfree(swidget->private); in sof_ipc4_widget_free_comp_mixer()
1180 swidget->private = NULL; in sof_ipc4_widget_free_comp_mixer()
1188 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_widget_setup_comp_process()
1190 struct snd_sof_pipeline *spipe = swidget->spipe; in sof_ipc4_widget_setup_comp_process()
1197 return -ENOMEM; in sof_ipc4_widget_setup_comp_process()
1199 swidget->private = process; in sof_ipc4_widget_setup_comp_process()
1201 ret = sof_ipc4_get_audio_fmt(scomp, swidget, &process->available_fmt, in sof_ipc4_widget_setup_comp_process()
1202 &process->base_config); in sof_ipc4_widget_setup_comp_process()
1206 ret = sof_ipc4_widget_setup_msg(swidget, &process->msg); in sof_ipc4_widget_setup_comp_process()
1211 fw_module = swidget->module_info; in sof_ipc4_widget_setup_comp_process()
1212 process->init_config = FIELD_GET(SOF_IPC4_MODULE_INIT_CONFIG_MASK, in sof_ipc4_widget_setup_comp_process()
1213 fw_module->man4_module_entry.type); in sof_ipc4_widget_setup_comp_process()
1215 process->ipc_config_size = sizeof(struct sof_ipc4_base_module_cfg); in sof_ipc4_widget_setup_comp_process()
1218 if (process->init_config == SOF_IPC4_MODULE_INIT_CONFIG_TYPE_BASE_CFG_WITH_EXT) { in sof_ipc4_widget_setup_comp_process()
1221 size_add(swidget->num_input_pins, in sof_ipc4_widget_setup_comp_process()
1222 swidget->num_output_pins)); in sof_ipc4_widget_setup_comp_process()
1226 ret = -ENOMEM; in sof_ipc4_widget_setup_comp_process()
1230 base_cfg_ext->num_input_pin_fmts = swidget->num_input_pins; in sof_ipc4_widget_setup_comp_process()
1231 base_cfg_ext->num_output_pin_fmts = swidget->num_output_pins; in sof_ipc4_widget_setup_comp_process()
1232 process->base_config_ext = base_cfg_ext; in sof_ipc4_widget_setup_comp_process()
1233 process->base_config_ext_size = ext_size; in sof_ipc4_widget_setup_comp_process()
1234 process->ipc_config_size += ext_size; in sof_ipc4_widget_setup_comp_process()
1237 cfg = kzalloc(process->ipc_config_size, GFP_KERNEL); in sof_ipc4_widget_setup_comp_process()
1239 ret = -ENOMEM; in sof_ipc4_widget_setup_comp_process()
1243 process->ipc_config_data = cfg; in sof_ipc4_widget_setup_comp_process()
1248 spipe->core_mask |= BIT(swidget->core); in sof_ipc4_widget_setup_comp_process()
1252 kfree(process->base_config_ext); in sof_ipc4_widget_setup_comp_process()
1253 process->base_config_ext = NULL; in sof_ipc4_widget_setup_comp_process()
1255 sof_ipc4_free_audio_fmt(&process->available_fmt); in sof_ipc4_widget_setup_comp_process()
1258 swidget->private = NULL; in sof_ipc4_widget_setup_comp_process()
1264 struct sof_ipc4_process *process = swidget->private; in sof_ipc4_widget_free_comp_process()
1269 kfree(process->ipc_config_data); in sof_ipc4_widget_free_comp_process()
1270 kfree(process->base_config_ext); in sof_ipc4_widget_free_comp_process()
1271 sof_ipc4_free_audio_fmt(&process->available_fmt); in sof_ipc4_widget_free_comp_process()
1272 kfree(swidget->private); in sof_ipc4_widget_free_comp_process()
1273 swidget->private = NULL; in sof_ipc4_widget_free_comp_process()
1280 struct sof_ipc4_fw_module *fw_module = swidget->module_info; in sof_ipc4_update_resource_usage()
1286 ibs = base_config->ibs; in sof_ipc4_update_resource_usage()
1287 bss = base_config->is_pages; in sof_ipc4_update_resource_usage()
1292 if (fw_module->man4_module_entry.type & SOF_IPC4_MODULE_LL) { in sof_ipc4_update_resource_usage()
1306 pipe_widget = swidget->spipe->pipe_widget; in sof_ipc4_update_resource_usage()
1307 pipeline = pipe_widget->private; in sof_ipc4_update_resource_usage()
1308 pipeline->mem_usage += total; in sof_ipc4_update_resource_usage()
1310 /* Update base_config->cpc from the module manifest */ in sof_ipc4_update_resource_usage()
1314 dev_dbg(sdev->dev, "%s: ibs / obs: %u / %u, forcing cpc to 0 from %u\n", in sof_ipc4_update_resource_usage()
1315 swidget->widget->name, base_config->ibs, base_config->obs, in sof_ipc4_update_resource_usage()
1316 base_config->cpc); in sof_ipc4_update_resource_usage()
1317 base_config->cpc = 0; in sof_ipc4_update_resource_usage()
1319 dev_dbg(sdev->dev, "%s: ibs / obs / cpc: %u / %u / %u\n", in sof_ipc4_update_resource_usage()
1320 swidget->widget->name, base_config->ibs, base_config->obs, in sof_ipc4_update_resource_usage()
1321 base_config->cpc); in sof_ipc4_update_resource_usage()
1328 struct sof_ipc4_fw_module *fw_module = swidget->module_info; in sof_ipc4_widget_assign_instance_id()
1329 int max_instances = fw_module->man4_module_entry.instance_max_count; in sof_ipc4_widget_assign_instance_id()
1331 swidget->instance_id = ida_alloc_max(&fw_module->m_ida, max_instances, GFP_KERNEL); in sof_ipc4_widget_assign_instance_id()
1332 if (swidget->instance_id < 0) { in sof_ipc4_widget_assign_instance_id()
1333 dev_err(sdev->dev, "failed to assign instance id for widget %s", in sof_ipc4_widget_assign_instance_id()
1334 swidget->widget->name); in sof_ipc4_widget_assign_instance_id()
1335 return swidget->instance_id; in sof_ipc4_widget_assign_instance_id()
1365 int valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg); in sof_ipc4_update_hw_params()
1366 int type = sof_ipc4_fmt_cfg_to_type(fmt->fmt_cfg); in sof_ipc4_update_hw_params()
1383 dev_err(sdev->dev, "Unsupported PCM 8-bit IPC4 type %d\n", type); in sof_ipc4_update_hw_params()
1384 return -EINVAL; in sof_ipc4_update_hw_params()
1402 dev_err(sdev->dev, "Unsupported PCM 32-bit IPC4 type %d\n", type); in sof_ipc4_update_hw_params()
1403 return -EINVAL; in sof_ipc4_update_hw_params()
1407 dev_err(sdev->dev, "invalid PCM valid_bits %d\n", valid_bits); in sof_ipc4_update_hw_params()
1408 return -EINVAL; in sof_ipc4_update_hw_params()
1417 unsigned int rate = fmt->sampling_frequency; in sof_ipc4_update_hw_params()
1420 i->min = rate; in sof_ipc4_update_hw_params()
1421 i->max = rate; in sof_ipc4_update_hw_params()
1425 unsigned int channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg); in sof_ipc4_update_hw_params()
1428 i->min = channels; in sof_ipc4_update_hw_params()
1429 i->max = channels; in sof_ipc4_update_hw_params()
1443 rate = fmt->sampling_frequency; in sof_ipc4_is_single_format()
1444 channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg); in sof_ipc4_is_single_format()
1445 valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg); in sof_ipc4_is_single_format()
1452 _rate = fmt->sampling_frequency; in sof_ipc4_is_single_format()
1453 _channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg); in sof_ipc4_is_single_format()
1454 _valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg); in sof_ipc4_is_single_format()
1470 struct sof_ipc4_pin_format *pin_fmts = available_fmt->output_pin_fmts; in sof_ipc4_init_output_audio_fmt()
1471 u32 pin_fmts_size = available_fmt->num_output_formats; in sof_ipc4_init_output_audio_fmt()
1476 dev_err(sdev->dev, "no output formats for %s\n", in sof_ipc4_init_output_audio_fmt()
1477 swidget->widget->name); in sof_ipc4_init_output_audio_fmt()
1478 return -EINVAL; in sof_ipc4_init_output_audio_fmt()
1496 _out_rate = fmt->sampling_frequency; in sof_ipc4_init_output_audio_fmt()
1497 _out_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg); in sof_ipc4_init_output_audio_fmt()
1498 _out_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg); in sof_ipc4_init_output_audio_fmt()
1499 _out_type = sof_ipc4_fmt_cfg_to_type(fmt->fmt_cfg); in sof_ipc4_init_output_audio_fmt()
1506 dev_err(sdev->dev, in sof_ipc4_init_output_audio_fmt()
1511 return -EINVAL; in sof_ipc4_init_output_audio_fmt()
1514 base_config->obs = pin_fmts[i].buffer_size; in sof_ipc4_init_output_audio_fmt()
1535 dev_err(sdev->dev, "invalid pcm frame format %d\n", params_format(params)); in sof_ipc4_get_valid_bits()
1536 return -EINVAL; in sof_ipc4_get_valid_bits()
1557 dev_err(sdev->dev, "invalid pcm sample type %d\n", params_format(params)); in sof_ipc4_get_sample_type()
1558 return -EINVAL; in sof_ipc4_get_sample_type()
1568 struct sof_ipc4_pin_format *pin_fmts = available_fmt->input_pin_fmts; in sof_ipc4_init_input_audio_fmt()
1569 u32 pin_fmts_size = available_fmt->num_input_formats; in sof_ipc4_init_input_audio_fmt()
1580 dev_err(sdev->dev, "no input formats for %s\n", swidget->widget->name); in sof_ipc4_init_input_audio_fmt()
1581 return -EINVAL; in sof_ipc4_init_input_audio_fmt()
1606 rate = fmt->sampling_frequency; in sof_ipc4_init_input_audio_fmt()
1607 channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg); in sof_ipc4_init_input_audio_fmt()
1608 valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg); in sof_ipc4_init_input_audio_fmt()
1609 type = sof_ipc4_fmt_cfg_to_type(fmt->fmt_cfg); in sof_ipc4_init_input_audio_fmt()
1616 dev_err(sdev->dev, in sof_ipc4_init_input_audio_fmt()
1620 return -EINVAL; in sof_ipc4_init_input_audio_fmt()
1625 memcpy(&base_config->audio_fmt, &pin_fmts[i].audio_fmt, in sof_ipc4_init_input_audio_fmt()
1629 base_config->ibs = pin_fmts[i].buffer_size; in sof_ipc4_init_input_audio_fmt()
1641 pipe_widget = swidget->spipe->pipe_widget; in sof_ipc4_unprepare_copier_module()
1642 pipeline = pipe_widget->private; in sof_ipc4_unprepare_copier_module()
1643 pipeline->mem_usage = 0; in sof_ipc4_unprepare_copier_module()
1645 if (WIDGET_IS_AIF(swidget->id) || swidget->id == snd_soc_dapm_buffer) { in sof_ipc4_unprepare_copier_module()
1646 if (pipeline->use_chain_dma) { in sof_ipc4_unprepare_copier_module()
1647 pipeline->msg.primary = 0; in sof_ipc4_unprepare_copier_module()
1648 pipeline->msg.extension = 0; in sof_ipc4_unprepare_copier_module()
1650 ipc4_copier = swidget->private; in sof_ipc4_unprepare_copier_module()
1651 } else if (WIDGET_IS_DAI(swidget->id)) { in sof_ipc4_unprepare_copier_module()
1652 struct snd_sof_dai *dai = swidget->private; in sof_ipc4_unprepare_copier_module() local
1654 ipc4_copier = dai->private; in sof_ipc4_unprepare_copier_module()
1656 if (pipeline->use_chain_dma) { in sof_ipc4_unprepare_copier_module()
1658 * Preserve the DMA Link ID and clear other bits since in sof_ipc4_unprepare_copier_module()
1659 * the DMA Link ID is only configured once during in sof_ipc4_unprepare_copier_module()
1661 * re-configuration in sof_ipc4_unprepare_copier_module()
1663 pipeline->msg.primary &= SOF_IPC4_GLB_CHAIN_DMA_LINK_ID_MASK; in sof_ipc4_unprepare_copier_module()
1664 pipeline->msg.extension = 0; in sof_ipc4_unprepare_copier_module()
1667 if (ipc4_copier->dai_type == SOF_DAI_INTEL_ALH) { in sof_ipc4_unprepare_copier_module()
1671 blob = (struct sof_ipc4_alh_configuration_blob *)ipc4_copier->copier_config; in sof_ipc4_unprepare_copier_module()
1672 if (blob->alh_cfg.device_count > 1) { in sof_ipc4_unprepare_copier_module()
1673 group_id = SOF_IPC4_NODE_INDEX(ipc4_copier->data.gtw_cfg.node_id) - in sof_ipc4_unprepare_copier_module()
1681 kfree(ipc4_copier->ipc_config_data); in sof_ipc4_unprepare_copier_module()
1682 ipc4_copier->ipc_config_data = NULL; in sof_ipc4_unprepare_copier_module()
1683 ipc4_copier->ipc_config_size = 0; in sof_ipc4_unprepare_copier_module()
1688 static int snd_sof_get_hw_config_params(struct snd_sof_dev *sdev, struct snd_sof_dai *dai, in snd_sof_get_hw_config_params() argument
1697 /* get current hw_config from link */ in snd_sof_get_hw_config_params()
1698 list_for_each_entry(slink, &sdev->dai_link_list, list) { in snd_sof_get_hw_config_params()
1699 if (!strcmp(slink->link->name, dai->name)) { in snd_sof_get_hw_config_params()
1706 dev_err(sdev->dev, "%s: no DAI link found for DAI %s\n", __func__, dai->name); in snd_sof_get_hw_config_params()
1707 return -EINVAL; in snd_sof_get_hw_config_params()
1710 for (i = 0; i < slink->num_hw_configs; i++) { in snd_sof_get_hw_config_params()
1711 hw_config = &slink->hw_configs[i]; in snd_sof_get_hw_config_params()
1712 if (dai->current_config == le32_to_cpu(hw_config->id)) { in snd_sof_get_hw_config_params()
1719 dev_err(sdev->dev, "%s: no matching hw_config found for DAI %s\n", __func__, in snd_sof_get_hw_config_params()
1720 dai->name); in snd_sof_get_hw_config_params()
1721 return -EINVAL; in snd_sof_get_hw_config_params()
1724 *bit_depth = le32_to_cpu(hw_config->tdm_slot_width); in snd_sof_get_hw_config_params()
1725 *channel_count = le32_to_cpu(hw_config->tdm_slots); in snd_sof_get_hw_config_params()
1726 *sample_rate = le32_to_cpu(hw_config->fsync_rate); in snd_sof_get_hw_config_params()
1728 dev_dbg(sdev->dev, "sample rate: %d sample width: %d channels: %d\n", in snd_sof_get_hw_config_params()
1735 snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai, in snd_sof_get_nhlt_endpoint_data() argument
1740 struct sof_ipc4_fw_data *ipc4_data = sdev->private; in snd_sof_get_nhlt_endpoint_data()
1756 * Look for 32-bit blob first instead of 16-bit if copier in snd_sof_get_nhlt_endpoint_data()
1760 dev_dbg(sdev->dev, "Looking for 32-bit blob first for DMIC\n"); in snd_sof_get_nhlt_endpoint_data()
1767 ret = snd_sof_get_hw_config_params(sdev, dai, &sample_rate, &channel_count, in snd_sof_get_nhlt_endpoint_data()
1779 dev_type = intel_nhlt_ssp_device_type(sdev->dev, ipc4_data->nhlt, in snd_sof_get_nhlt_endpoint_data()
1788 dev_dbg(sdev->dev, "dai index %d nhlt type %d direction %d dev type %d\n", in snd_sof_get_nhlt_endpoint_data()
1792 cfg = intel_nhlt_get_endpoint_blob(sdev->dev, ipc4_data->nhlt, dai_index, nhlt_type, in snd_sof_get_nhlt_endpoint_data()
1801 * The 32-bit blob was not found in NHLT table, try to in snd_sof_get_nhlt_endpoint_data()
1809 * The requested 32-bit blob (no format change for the in snd_sof_get_nhlt_endpoint_data()
1811 * look for 16-bit blob if the copier supports multiple in snd_sof_get_nhlt_endpoint_data()
1820 cfg = intel_nhlt_get_endpoint_blob(sdev->dev, ipc4_data->nhlt, in snd_sof_get_nhlt_endpoint_data()
1829 dev_err(sdev->dev, in snd_sof_get_nhlt_endpoint_data()
1832 return -EINVAL; in snd_sof_get_nhlt_endpoint_data()
1837 *len = cfg->size >> 2; in snd_sof_get_nhlt_endpoint_data()
1838 *dst = (u32 *)cfg->caps; in snd_sof_get_nhlt_endpoint_data()
1843 * instead of the requested bit depth (16 -> 32 or 32 -> 16). in snd_sof_get_nhlt_endpoint_data()
1845 * matching copier format on the dai side. in snd_sof_get_nhlt_endpoint_data()
1862 snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai, in snd_sof_get_nhlt_endpoint_data() argument
1880 valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg); in sof_ipc4_copier_is_single_bitdepth()
1887 _valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg); in sof_ipc4_copier_is_single_bitdepth()
1910 rate = fmt->sampling_frequency; in sof_ipc4_adjust_params_to_dai_format()
1911 channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg); in sof_ipc4_adjust_params_to_dai_format()
1912 valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg); in sof_ipc4_adjust_params_to_dai_format()
1921 val = fmt->sampling_frequency; in sof_ipc4_adjust_params_to_dai_format()
1926 val = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg); in sof_ipc4_adjust_params_to_dai_format()
1931 val = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg); in sof_ipc4_adjust_params_to_dai_format()
1946 sof_ipc4_prepare_dai_copier(struct snd_sof_dev *sdev, struct snd_sof_dai *dai, in sof_ipc4_prepare_dai_copier() argument
1958 ipc4_copier = dai->private; in sof_ipc4_prepare_dai_copier()
1959 copier_data = &ipc4_copier->data; in sof_ipc4_prepare_dai_copier()
1960 available_fmt = &ipc4_copier->available_fmt; in sof_ipc4_prepare_dai_copier()
1963 * Fixup the params based on the format parameters of the DAI. If any in sof_ipc4_prepare_dai_copier()
1968 pin_fmts = available_fmt->output_pin_fmts; in sof_ipc4_prepare_dai_copier()
1969 num_pin_fmts = available_fmt->num_output_formats; in sof_ipc4_prepare_dai_copier()
1971 pin_fmts = available_fmt->input_pin_fmts; in sof_ipc4_prepare_dai_copier()
1972 num_pin_fmts = available_fmt->num_input_formats; in sof_ipc4_prepare_dai_copier()
1982 ret = snd_sof_get_nhlt_endpoint_data(sdev, dai, single_bitdepth, in sof_ipc4_prepare_dai_copier()
1984 ipc4_copier->dai_index, in sof_ipc4_prepare_dai_copier()
1985 ipc4_copier->dai_type, dir, in sof_ipc4_prepare_dai_copier()
1986 &ipc4_copier->copier_config, in sof_ipc4_prepare_dai_copier()
1987 &copier_data->gtw_cfg.config_length); in sof_ipc4_prepare_dai_copier()
2002 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_prepare_copier_module()
2008 struct snd_sof_dai *dai; in sof_ipc4_prepare_copier_module() local
2020 switch (swidget->id) { in sof_ipc4_prepare_copier_module()
2024 struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget; in sof_ipc4_prepare_copier_module()
2025 struct sof_ipc4_pipeline *pipeline = pipe_widget->private; in sof_ipc4_prepare_copier_module()
2028 dev_dbg(sdev->dev, in sof_ipc4_prepare_copier_module()
2030 swidget->widget->name, swidget->id, in sof_ipc4_prepare_copier_module()
2031 str_yes_no(pipeline->use_chain_dma), in sof_ipc4_prepare_copier_module()
2032 platform_params->stream_tag); in sof_ipc4_prepare_copier_module()
2036 SOF_COPIER_DEEP_BUFFER_TOKENS, swidget->tuples, in sof_ipc4_prepare_copier_module()
2037 swidget->num_tuples, sizeof(u32), 1); in sof_ipc4_prepare_copier_module()
2039 dev_err(scomp->dev, "Failed to parse deep buffer dma size for %s\n", in sof_ipc4_prepare_copier_module()
2040 swidget->widget->name); in sof_ipc4_prepare_copier_module()
2044 ipc4_copier = (struct sof_ipc4_copier *)swidget->private; in sof_ipc4_prepare_copier_module()
2045 gtw_attr = ipc4_copier->gtw_attr; in sof_ipc4_prepare_copier_module()
2046 copier_data = &ipc4_copier->data; in sof_ipc4_prepare_copier_module()
2047 available_fmt = &ipc4_copier->available_fmt; in sof_ipc4_prepare_copier_module()
2049 if (pipeline->use_chain_dma) { in sof_ipc4_prepare_copier_module()
2053 host_dma_id = platform_params->stream_tag - 1; in sof_ipc4_prepare_copier_module()
2054 pipeline->msg.primary |= SOF_IPC4_GLB_CHAIN_DMA_HOST_ID(host_dma_id); in sof_ipc4_prepare_copier_module()
2057 pipeline->msg.primary |= SOF_IPC4_GLB_CHAIN_DMA_SCS_MASK; in sof_ipc4_prepare_copier_module()
2061 pipeline->msg.primary |= SOF_IPC4_GLB_CHAIN_DMA_SCS_MASK; in sof_ipc4_prepare_copier_module()
2071 pipeline->msg.extension |= SOF_IPC4_GLB_EXT_CHAIN_DMA_FIFO_SIZE(fifo_size); in sof_ipc4_prepare_copier_module()
2077 copier_data->gtw_cfg.node_id = SOF_IPC4_CHAIN_DMA_NODE_ID; in sof_ipc4_prepare_copier_module()
2091 return -ENOMEM; in sof_ipc4_prepare_copier_module()
2093 copier_data->gtw_cfg.node_id &= ~SOF_IPC4_NODE_INDEX_MASK; in sof_ipc4_prepare_copier_module()
2094 copier_data->gtw_cfg.node_id |= in sof_ipc4_prepare_copier_module()
2095 SOF_IPC4_NODE_INDEX(platform_params->stream_tag - 1); in sof_ipc4_prepare_copier_module()
2098 gtw_attr->lp_buffer_alloc = pipeline->lp_mode; in sof_ipc4_prepare_copier_module()
2104 struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget; in sof_ipc4_prepare_copier_module()
2105 struct sof_ipc4_pipeline *pipeline = pipe_widget->private; in sof_ipc4_prepare_copier_module()
2107 dev_dbg(sdev->dev, "Dai copier %s, type %d, ChainDMA: %s\n", in sof_ipc4_prepare_copier_module()
2108 swidget->widget->name, swidget->id, in sof_ipc4_prepare_copier_module()
2109 str_yes_no(pipeline->use_chain_dma)); in sof_ipc4_prepare_copier_module()
2111 if (pipeline->use_chain_dma) in sof_ipc4_prepare_copier_module()
2114 dai = swidget->private; in sof_ipc4_prepare_copier_module()
2116 ipc4_copier = (struct sof_ipc4_copier *)dai->private; in sof_ipc4_prepare_copier_module()
2117 copier_data = &ipc4_copier->data; in sof_ipc4_prepare_copier_module()
2118 available_fmt = &ipc4_copier->available_fmt; in sof_ipc4_prepare_copier_module()
2123 * supported by the copier on the DAI side. in sof_ipc4_prepare_copier_module()
2130 return -ENOMEM; in sof_ipc4_prepare_copier_module()
2132 ret = sof_ipc4_prepare_dai_copier(sdev, dai, ref_params, dir); in sof_ipc4_prepare_copier_module()
2147 dev_dbg(sdev->dev, "Module copier %s, type %d\n", in sof_ipc4_prepare_copier_module()
2148 swidget->widget->name, swidget->id); in sof_ipc4_prepare_copier_module()
2150 ipc4_copier = (struct sof_ipc4_copier *)swidget->private; in sof_ipc4_prepare_copier_module()
2151 copier_data = &ipc4_copier->data; in sof_ipc4_prepare_copier_module()
2152 available_fmt = &ipc4_copier->available_fmt; in sof_ipc4_prepare_copier_module()
2156 return -ENOMEM; in sof_ipc4_prepare_copier_module()
2161 dev_err(sdev->dev, "unsupported type %d for copier %s", in sof_ipc4_prepare_copier_module()
2162 swidget->id, swidget->widget->name); in sof_ipc4_prepare_copier_module()
2163 return -EINVAL; in sof_ipc4_prepare_copier_module()
2168 &copier_data->base_config, in sof_ipc4_prepare_copier_module()
2175 available_fmt->output_pin_fmts, in sof_ipc4_prepare_copier_module()
2176 available_fmt->num_output_formats); in sof_ipc4_prepare_copier_module()
2177 switch (swidget->id) { in sof_ipc4_prepare_copier_module()
2184 in_fmt = &available_fmt->input_pin_fmts[input_fmt_index].audio_fmt; in sof_ipc4_prepare_copier_module()
2185 out_ref_rate = in_fmt->sampling_frequency; in sof_ipc4_prepare_copier_module()
2186 out_ref_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(in_fmt->fmt_cfg); in sof_ipc4_prepare_copier_module()
2187 out_ref_type = sof_ipc4_fmt_cfg_to_type(in_fmt->fmt_cfg); in sof_ipc4_prepare_copier_module()
2191 SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(in_fmt->fmt_cfg); in sof_ipc4_prepare_copier_module()
2214 return -EINVAL; in sof_ipc4_prepare_copier_module()
2224 out_fmt = &available_fmt->output_pin_fmts[0].audio_fmt; in sof_ipc4_prepare_copier_module()
2226 SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(out_fmt->fmt_cfg); in sof_ipc4_prepare_copier_module()
2227 out_ref_type = sof_ipc4_fmt_cfg_to_type(out_fmt->fmt_cfg); in sof_ipc4_prepare_copier_module()
2231 &copier_data->base_config, in sof_ipc4_prepare_copier_module()
2245 memcpy(&copier_data->out_format, in sof_ipc4_prepare_copier_module()
2246 &available_fmt->output_pin_fmts[output_fmt_index].audio_fmt, in sof_ipc4_prepare_copier_module()
2249 switch (swidget->id) { in sof_ipc4_prepare_copier_module()
2255 * That's why only ALH dai's blob is set after sof_ipc4_init_input_audio_fmt in sof_ipc4_prepare_copier_module()
2257 if (ipc4_copier->dai_type == SOF_DAI_INTEL_ALH) { in sof_ipc4_prepare_copier_module()
2269 blob = (struct sof_ipc4_alh_configuration_blob *)ipc4_copier->copier_config; in sof_ipc4_prepare_copier_module()
2271 blob->gw_attr.lp_buffer_alloc = 0; in sof_ipc4_prepare_copier_module()
2274 ch_map = copier_data->base_config.audio_fmt.ch_map; in sof_ipc4_prepare_copier_module()
2283 step = ch_count / blob->alh_cfg.device_count; in sof_ipc4_prepare_copier_module()
2284 mask = GENMASK(step - 1, 0); in sof_ipc4_prepare_copier_module()
2286 * Set each gtw_cfg.node_id to blob->alh_cfg.mapping[] in sof_ipc4_prepare_copier_module()
2290 list_for_each_entry(w, &sdev->widget_list, list) { in sof_ipc4_prepare_copier_module()
2293 if (!WIDGET_IS_DAI(w->id) || !w->widget->sname || in sof_ipc4_prepare_copier_module()
2294 strcmp(w->widget->sname, swidget->widget->sname)) in sof_ipc4_prepare_copier_module()
2297 dai = w->private; in sof_ipc4_prepare_copier_module()
2298 if (dai->type != SOF_DAI_INTEL_ALH) in sof_ipc4_prepare_copier_module()
2300 alh_copier = (struct sof_ipc4_copier *)dai->private; in sof_ipc4_prepare_copier_module()
2301 alh_data = &alh_copier->data; in sof_ipc4_prepare_copier_module()
2302 node_type = SOF_IPC4_GET_NODE_TYPE(alh_data->gtw_cfg.node_id); in sof_ipc4_prepare_copier_module()
2303 blob->alh_cfg.mapping[i].device = SOF_IPC4_NODE_TYPE(node_type); in sof_ipc4_prepare_copier_module()
2304 blob->alh_cfg.mapping[i].device |= in sof_ipc4_prepare_copier_module()
2305 SOF_IPC4_NODE_INDEX(alh_copier->dai_index); in sof_ipc4_prepare_copier_module()
2312 if (ipc4_copier->dma_config_tlv[i].length) { in sof_ipc4_prepare_copier_module()
2313 dma_config = &ipc4_copier->dma_config_tlv[i].dma_config; in sof_ipc4_prepare_copier_module()
2314 blob->alh_cfg.mapping[i].device = in sof_ipc4_prepare_copier_module()
2315 dma_config->dma_stream_channel_map.mapping[0].device; in sof_ipc4_prepare_copier_module()
2323 * two DAI's. in sof_ipc4_prepare_copier_module()
2329 if (w->id == snd_soc_dapm_dai_in) in sof_ipc4_prepare_copier_module()
2330 blob->alh_cfg.mapping[i].channel_mask = ch_mask; in sof_ipc4_prepare_copier_module()
2332 blob->alh_cfg.mapping[i].channel_mask = mask << (step * i); in sof_ipc4_prepare_copier_module()
2336 if (blob->alh_cfg.device_count > 1) { in sof_ipc4_prepare_copier_module()
2339 group_id = ida_alloc_max(&alh_group_ida, ALH_MULTI_GTW_COUNT - 1, in sof_ipc4_prepare_copier_module()
2345 /* add multi-gateway base */ in sof_ipc4_prepare_copier_module()
2347 copier_data->gtw_cfg.node_id &= ~SOF_IPC4_NODE_INDEX_MASK; in sof_ipc4_prepare_copier_module()
2348 copier_data->gtw_cfg.node_id |= SOF_IPC4_NODE_INDEX(group_id); in sof_ipc4_prepare_copier_module()
2356 &copier_data->out_format, in sof_ipc4_prepare_copier_module()
2368 switch (swidget->id) { in sof_ipc4_prepare_copier_module()
2370 copier_data->gtw_cfg.dma_buffer_size = in sof_ipc4_prepare_copier_module()
2371 SOF_IPC4_MIN_DMA_BUFFER_SIZE * copier_data->base_config.ibs; in sof_ipc4_prepare_copier_module()
2374 copier_data->gtw_cfg.dma_buffer_size = in sof_ipc4_prepare_copier_module()
2376 copier_data->base_config.ibs; in sof_ipc4_prepare_copier_module()
2377 dev_dbg(sdev->dev, "copier %s, dma buffer%s: %u ms (%u bytes)", in sof_ipc4_prepare_copier_module()
2378 swidget->widget->name, in sof_ipc4_prepare_copier_module()
2381 copier_data->gtw_cfg.dma_buffer_size); in sof_ipc4_prepare_copier_module()
2385 copier_data->gtw_cfg.dma_buffer_size = in sof_ipc4_prepare_copier_module()
2386 SOF_IPC4_MIN_DMA_BUFFER_SIZE * copier_data->base_config.obs; in sof_ipc4_prepare_copier_module()
2392 data = &ipc4_copier->copier_config; in sof_ipc4_prepare_copier_module()
2393 ipc_config_size = &ipc4_copier->ipc_config_size; in sof_ipc4_prepare_copier_module()
2394 ipc_config_data = &ipc4_copier->ipc_config_data; in sof_ipc4_prepare_copier_module()
2397 gtw_cfg_config_length = copier_data->gtw_cfg.config_length * 4; in sof_ipc4_prepare_copier_module()
2402 if (ipc4_copier->dma_config_tlv[i].type != SOF_IPC4_GTW_DMA_CONFIG_ID) in sof_ipc4_prepare_copier_module()
2404 dma_config_tlv_size += ipc4_copier->dma_config_tlv[i].length; in sof_ipc4_prepare_copier_module()
2406 ipc4_copier->dma_config_tlv[i].dma_config.dma_priv_config_size; in sof_ipc4_prepare_copier_module()
2407 dma_config_tlv_size += (sizeof(ipc4_copier->dma_config_tlv[i]) - in sof_ipc4_prepare_copier_module()
2408 sizeof(ipc4_copier->dma_config_tlv[i].dma_config)); in sof_ipc4_prepare_copier_module()
2415 copier_data->gtw_cfg.config_length += dma_config_tlv_size / 4; in sof_ipc4_prepare_copier_module()
2418 dev_dbg(sdev->dev, "copier %s, IPC size is %d", swidget->widget->name, ipc_size); in sof_ipc4_prepare_copier_module()
2422 return -ENOMEM; in sof_ipc4_prepare_copier_module()
2426 sof_ipc4_dbg_module_audio_format(sdev->dev, swidget, available_fmt, in sof_ipc4_prepare_copier_module()
2430 sof_ipc4_update_resource_usage(sdev, swidget, &copier_data->base_config); in sof_ipc4_prepare_copier_module()
2442 &ipc4_copier->dma_config_tlv, dma_config_tlv_size); in sof_ipc4_prepare_copier_module()
2448 copier_data->gtw_cfg.config_length = gtw_cfg_config_length / 4; in sof_ipc4_prepare_copier_module()
2458 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_prepare_gain_module()
2460 struct sof_ipc4_gain *gain = swidget->private; in sof_ipc4_prepare_gain_module()
2461 struct sof_ipc4_available_audio_format *available_fmt = &gain->available_fmt; in sof_ipc4_prepare_gain_module()
2467 &gain->data.base_config, in sof_ipc4_prepare_gain_module()
2473 in_fmt = &available_fmt->input_pin_fmts[input_fmt_index].audio_fmt; in sof_ipc4_prepare_gain_module()
2474 out_ref_rate = in_fmt->sampling_frequency; in sof_ipc4_prepare_gain_module()
2475 out_ref_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(in_fmt->fmt_cfg); in sof_ipc4_prepare_gain_module()
2476 out_ref_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(in_fmt->fmt_cfg); in sof_ipc4_prepare_gain_module()
2477 out_ref_type = sof_ipc4_fmt_cfg_to_type(in_fmt->fmt_cfg); in sof_ipc4_prepare_gain_module()
2480 &gain->data.base_config, in sof_ipc4_prepare_gain_module()
2489 sof_ipc4_dbg_module_audio_format(sdev->dev, swidget, available_fmt, in sof_ipc4_prepare_gain_module()
2493 sof_ipc4_update_resource_usage(sdev, swidget, &gain->data.base_config); in sof_ipc4_prepare_gain_module()
2503 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_prepare_mixer_module()
2505 struct sof_ipc4_mixer *mixer = swidget->private; in sof_ipc4_prepare_mixer_module()
2506 struct sof_ipc4_available_audio_format *available_fmt = &mixer->available_fmt; in sof_ipc4_prepare_mixer_module()
2512 &mixer->base_config, in sof_ipc4_prepare_mixer_module()
2518 in_fmt = &available_fmt->input_pin_fmts[input_fmt_index].audio_fmt; in sof_ipc4_prepare_mixer_module()
2519 out_ref_rate = in_fmt->sampling_frequency; in sof_ipc4_prepare_mixer_module()
2520 out_ref_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(in_fmt->fmt_cfg); in sof_ipc4_prepare_mixer_module()
2521 out_ref_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(in_fmt->fmt_cfg); in sof_ipc4_prepare_mixer_module()
2522 out_ref_type = sof_ipc4_fmt_cfg_to_type(in_fmt->fmt_cfg); in sof_ipc4_prepare_mixer_module()
2525 &mixer->base_config, in sof_ipc4_prepare_mixer_module()
2534 sof_ipc4_dbg_module_audio_format(sdev->dev, swidget, available_fmt, in sof_ipc4_prepare_mixer_module()
2538 sof_ipc4_update_resource_usage(sdev, swidget, &mixer->base_config); in sof_ipc4_prepare_mixer_module()
2548 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_prepare_src_module()
2550 struct sof_ipc4_src *src = swidget->private; in sof_ipc4_prepare_src_module()
2551 struct sof_ipc4_available_audio_format *available_fmt = &src->available_fmt; in sof_ipc4_prepare_src_module()
2558 &src->data.base_config, in sof_ipc4_prepare_src_module()
2566 * format, which is restricted to only deal with DAI's with a single format for now. in sof_ipc4_prepare_src_module()
2568 if (dir == SNDRV_PCM_STREAM_PLAYBACK && available_fmt->num_output_formats > 1) { in sof_ipc4_prepare_src_module()
2569 dev_err(sdev->dev, "Invalid number of output formats: %d for SRC %s\n", in sof_ipc4_prepare_src_module()
2570 available_fmt->num_output_formats, swidget->widget->name); in sof_ipc4_prepare_src_module()
2571 return -EINVAL; in sof_ipc4_prepare_src_module()
2578 in_audio_fmt = &available_fmt->input_pin_fmts[input_fmt_index].audio_fmt; in sof_ipc4_prepare_src_module()
2579 out_ref_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(in_audio_fmt->fmt_cfg); in sof_ipc4_prepare_src_module()
2580 out_ref_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(in_audio_fmt->fmt_cfg); in sof_ipc4_prepare_src_module()
2581 out_ref_type = sof_ipc4_fmt_cfg_to_type(in_audio_fmt->fmt_cfg); in sof_ipc4_prepare_src_module()
2591 &src->data.base_config, in sof_ipc4_prepare_src_module()
2600 sof_ipc4_dbg_module_audio_format(sdev->dev, swidget, available_fmt, in sof_ipc4_prepare_src_module()
2604 sof_ipc4_update_resource_usage(sdev, swidget, &src->data.base_config); in sof_ipc4_prepare_src_module()
2606 out_audio_fmt = &available_fmt->output_pin_fmts[output_fmt_index].audio_fmt; in sof_ipc4_prepare_src_module()
2607 src->data.sink_rate = out_audio_fmt->sampling_frequency; in sof_ipc4_prepare_src_module()
2619 struct sof_ipc4_process *process = swidget->private; in sof_ipc4_process_set_pin_formats()
2620 struct sof_ipc4_base_module_cfg_ext *base_cfg_ext = process->base_config_ext; in sof_ipc4_process_set_pin_formats()
2621 struct sof_ipc4_available_audio_format *available_fmt = &process->available_fmt; in sof_ipc4_process_set_pin_formats()
2623 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_process_set_pin_formats()
2630 num_pins = swidget->num_input_pins; in sof_ipc4_process_set_pin_formats()
2631 format_list_to_search = available_fmt->input_pin_fmts; in sof_ipc4_process_set_pin_formats()
2632 format_list_count = available_fmt->num_input_formats; in sof_ipc4_process_set_pin_formats()
2634 num_pins = swidget->num_output_pins; in sof_ipc4_process_set_pin_formats()
2635 pin_format_offset = swidget->num_input_pins; in sof_ipc4_process_set_pin_formats()
2636 format_list_to_search = available_fmt->output_pin_fmts; in sof_ipc4_process_set_pin_formats()
2637 format_list_count = available_fmt->num_output_formats; in sof_ipc4_process_set_pin_formats()
2641 pin_format = &base_cfg_ext->pin_formats[i]; in sof_ipc4_process_set_pin_formats()
2646 pin_format->buffer_size = process->base_config.ibs; in sof_ipc4_process_set_pin_formats()
2647 pin_format->audio_fmt = process->base_config.audio_fmt; in sof_ipc4_process_set_pin_formats()
2649 pin_format->buffer_size = process->base_config.obs; in sof_ipc4_process_set_pin_formats()
2650 pin_format->audio_fmt = process->output_format; in sof_ipc4_process_set_pin_formats()
2663 if (pin_format_item->pin_index == i - pin_format_offset) { in sof_ipc4_process_set_pin_formats()
2670 dev_err(scomp->dev, "%s pin %d format not found for %s\n", in sof_ipc4_process_set_pin_formats()
2672 i - pin_format_offset, swidget->widget->name); in sof_ipc4_process_set_pin_formats()
2673 return -EINVAL; in sof_ipc4_process_set_pin_formats()
2699 struct snd_soc_component *scomp = swidget->scomp; in sof_ipc4_prepare_process_module()
2701 struct sof_ipc4_process *process = swidget->private; in sof_ipc4_prepare_process_module()
2702 struct sof_ipc4_available_audio_format *available_fmt = &process->available_fmt; in sof_ipc4_prepare_process_module()
2703 void *cfg = process->ipc_config_data; in sof_ipc4_prepare_process_module()
2709 &process->base_config, in sof_ipc4_prepare_process_module()
2716 if (available_fmt->num_output_formats) { in sof_ipc4_prepare_process_module()
2722 in_fmt = &available_fmt->input_pin_fmts[input_fmt_index].audio_fmt; in sof_ipc4_prepare_process_module()
2724 out_ref_rate = in_fmt->sampling_frequency; in sof_ipc4_prepare_process_module()
2725 out_ref_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(in_fmt->fmt_cfg); in sof_ipc4_prepare_process_module()
2726 out_ref_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(in_fmt->fmt_cfg); in sof_ipc4_prepare_process_module()
2727 out_ref_type = sof_ipc4_fmt_cfg_to_type(in_fmt->fmt_cfg); in sof_ipc4_prepare_process_module()
2730 &process->base_config, in sof_ipc4_prepare_process_module()
2739 pin_fmt = &available_fmt->output_pin_fmts[output_fmt_index]; in sof_ipc4_prepare_process_module()
2742 if (pin_fmt->pin_index == 0) { in sof_ipc4_prepare_process_module()
2743 memcpy(&process->output_format, &pin_fmt->audio_fmt, in sof_ipc4_prepare_process_module()
2748 &process->output_format, in sof_ipc4_prepare_process_module()
2757 sof_ipc4_dbg_module_audio_format(sdev->dev, swidget, available_fmt, in sof_ipc4_prepare_process_module()
2761 sof_ipc4_update_resource_usage(sdev, swidget, &process->base_config); in sof_ipc4_prepare_process_module()
2764 memcpy(cfg, &process->base_config, sizeof(struct sof_ipc4_base_module_cfg)); in sof_ipc4_prepare_process_module()
2767 if (process->init_config == SOF_IPC4_MODULE_INIT_CONFIG_TYPE_BASE_CFG_WITH_EXT) { in sof_ipc4_prepare_process_module()
2768 struct sof_ipc4_base_module_cfg_ext *base_cfg_ext = process->base_config_ext; in sof_ipc4_prepare_process_module()
2774 memcpy(cfg, base_cfg_ext, process->base_config_ext_size); in sof_ipc4_prepare_process_module()
2786 scontrol->size = struct_size(control_data, chanv, scontrol->num_channels); in sof_ipc4_control_load_volume()
2788 /* scontrol->ipc_control_data will be freed in sof_control_unload */ in sof_ipc4_control_load_volume()
2789 scontrol->ipc_control_data = kzalloc(scontrol->size, GFP_KERNEL); in sof_ipc4_control_load_volume()
2790 if (!scontrol->ipc_control_data) in sof_ipc4_control_load_volume()
2791 return -ENOMEM; in sof_ipc4_control_load_volume()
2793 control_data = scontrol->ipc_control_data; in sof_ipc4_control_load_volume()
2794 control_data->index = scontrol->index; in sof_ipc4_control_load_volume()
2796 msg = &control_data->msg; in sof_ipc4_control_load_volume()
2797 msg->primary = SOF_IPC4_MSG_TYPE_SET(SOF_IPC4_MOD_LARGE_CONFIG_SET); in sof_ipc4_control_load_volume()
2798 msg->primary |= SOF_IPC4_MSG_DIR(SOF_IPC4_MSG_REQUEST); in sof_ipc4_control_load_volume()
2799 msg->primary |= SOF_IPC4_MSG_TARGET(SOF_IPC4_MODULE_MSG); in sof_ipc4_control_load_volume()
2801 /* volume controls with range 0-1 (off/on) are switch controls */ in sof_ipc4_control_load_volume()
2802 if (scontrol->max == 1) in sof_ipc4_control_load_volume()
2803 msg->extension = SOF_IPC4_MOD_EXT_MSG_PARAM_ID(SOF_IPC4_SWITCH_CONTROL_PARAM_ID); in sof_ipc4_control_load_volume()
2805 msg->extension = SOF_IPC4_MOD_EXT_MSG_PARAM_ID(SOF_IPC4_GAIN_PARAM_ID); in sof_ipc4_control_load_volume()
2807 for (i = 0; i < scontrol->num_channels; i++) { in sof_ipc4_control_load_volume()
2808 control_data->chanv[i].channel = i; in sof_ipc4_control_load_volume()
2811 * - 0dB for volume controls in sof_ipc4_control_load_volume()
2812 * - off (0) for switch controls - value already zero after in sof_ipc4_control_load_volume()
2815 if (scontrol->max > 1) in sof_ipc4_control_load_volume()
2816 control_data->chanv[i].value = SOF_IPC4_VOL_ZERO_DB; in sof_ipc4_control_load_volume()
2828 scontrol->size = struct_size(control_data, chanv, scontrol->num_channels); in sof_ipc4_control_load_enum()
2830 /* scontrol->ipc_control_data will be freed in sof_control_unload */ in sof_ipc4_control_load_enum()
2831 scontrol->ipc_control_data = kzalloc(scontrol->size, GFP_KERNEL); in sof_ipc4_control_load_enum()
2832 if (!scontrol->ipc_control_data) in sof_ipc4_control_load_enum()
2833 return -ENOMEM; in sof_ipc4_control_load_enum()
2835 control_data = scontrol->ipc_control_data; in sof_ipc4_control_load_enum()
2836 control_data->index = scontrol->index; in sof_ipc4_control_load_enum()
2838 msg = &control_data->msg; in sof_ipc4_control_load_enum()
2839 msg->primary = SOF_IPC4_MSG_TYPE_SET(SOF_IPC4_MOD_LARGE_CONFIG_SET); in sof_ipc4_control_load_enum()
2840 msg->primary |= SOF_IPC4_MSG_DIR(SOF_IPC4_MSG_REQUEST); in sof_ipc4_control_load_enum()
2841 msg->primary |= SOF_IPC4_MSG_TARGET(SOF_IPC4_MODULE_MSG); in sof_ipc4_control_load_enum()
2843 msg->extension = SOF_IPC4_MOD_EXT_MSG_PARAM_ID(SOF_IPC4_ENUM_CONTROL_PARAM_ID); in sof_ipc4_control_load_enum()
2846 for (i = 0; i < scontrol->num_channels; i++) in sof_ipc4_control_load_enum()
2847 control_data->chanv[i].channel = i; in sof_ipc4_control_load_enum()
2858 if (scontrol->max_size < (sizeof(*control_data) + sizeof(struct sof_abi_hdr))) { in sof_ipc4_control_load_bytes()
2859 dev_err(sdev->dev, "insufficient size for a bytes control %s: %zu.\n", in sof_ipc4_control_load_bytes()
2860 scontrol->name, scontrol->max_size); in sof_ipc4_control_load_bytes()
2861 return -EINVAL; in sof_ipc4_control_load_bytes()
2864 if (scontrol->priv_size > scontrol->max_size - sizeof(*control_data)) { in sof_ipc4_control_load_bytes()
2865 dev_err(sdev->dev, "scontrol %s bytes data size %zu exceeds max %zu.\n", in sof_ipc4_control_load_bytes()
2866 scontrol->name, scontrol->priv_size, in sof_ipc4_control_load_bytes()
2867 scontrol->max_size - sizeof(*control_data)); in sof_ipc4_control_load_bytes()
2868 return -EINVAL; in sof_ipc4_control_load_bytes()
2871 scontrol->size = sizeof(struct sof_ipc4_control_data) + scontrol->priv_size; in sof_ipc4_control_load_bytes()
2873 scontrol->ipc_control_data = kzalloc(scontrol->max_size, GFP_KERNEL); in sof_ipc4_control_load_bytes()
2874 if (!scontrol->ipc_control_data) in sof_ipc4_control_load_bytes()
2875 return -ENOMEM; in sof_ipc4_control_load_bytes()
2877 control_data = scontrol->ipc_control_data; in sof_ipc4_control_load_bytes()
2878 control_data->index = scontrol->index; in sof_ipc4_control_load_bytes()
2879 if (scontrol->priv_size > 0) { in sof_ipc4_control_load_bytes()
2880 memcpy(control_data->data, scontrol->priv, scontrol->priv_size); in sof_ipc4_control_load_bytes()
2881 kfree(scontrol->priv); in sof_ipc4_control_load_bytes()
2882 scontrol->priv = NULL; in sof_ipc4_control_load_bytes()
2884 if (control_data->data->magic != SOF_IPC4_ABI_MAGIC) { in sof_ipc4_control_load_bytes()
2885 dev_err(sdev->dev, "Wrong ABI magic (%#x) for control: %s\n", in sof_ipc4_control_load_bytes()
2886 control_data->data->magic, scontrol->name); in sof_ipc4_control_load_bytes()
2887 ret = -EINVAL; in sof_ipc4_control_load_bytes()
2893 if (control_data->data->size + sizeof(struct sof_abi_hdr) != in sof_ipc4_control_load_bytes()
2894 scontrol->priv_size) { in sof_ipc4_control_load_bytes()
2895 dev_err(sdev->dev, "Control %s conflict in bytes %zu vs. priv size %zu.\n", in sof_ipc4_control_load_bytes()
2896 scontrol->name, in sof_ipc4_control_load_bytes()
2897 control_data->data->size + sizeof(struct sof_abi_hdr), in sof_ipc4_control_load_bytes()
2898 scontrol->priv_size); in sof_ipc4_control_load_bytes()
2899 ret = -EINVAL; in sof_ipc4_control_load_bytes()
2904 msg = &control_data->msg; in sof_ipc4_control_load_bytes()
2905 msg->primary = SOF_IPC4_MSG_TYPE_SET(SOF_IPC4_MOD_LARGE_CONFIG_SET); in sof_ipc4_control_load_bytes()
2906 msg->primary |= SOF_IPC4_MSG_DIR(SOF_IPC4_MSG_REQUEST); in sof_ipc4_control_load_bytes()
2907 msg->primary |= SOF_IPC4_MSG_TARGET(SOF_IPC4_MODULE_MSG); in sof_ipc4_control_load_bytes()
2912 kfree(scontrol->ipc_control_data); in sof_ipc4_control_load_bytes()
2913 scontrol->ipc_control_data = NULL; in sof_ipc4_control_load_bytes()
2919 switch (scontrol->info_type) { in sof_ipc4_control_setup()
2938 struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget; in sof_ipc4_widget_setup()
2939 struct sof_ipc4_fw_data *ipc4_data = sdev->private; in sof_ipc4_widget_setup()
2946 switch (swidget->id) { in sof_ipc4_widget_setup()
2948 pipeline = swidget->private; in sof_ipc4_widget_setup()
2950 if (pipeline->use_chain_dma) { in sof_ipc4_widget_setup()
2951 dev_warn(sdev->dev, "use_chain_dma set for scheduler %s", in sof_ipc4_widget_setup()
2952 swidget->widget->name); in sof_ipc4_widget_setup()
2956 dev_dbg(sdev->dev, "pipeline: %d memory pages: %d\n", swidget->pipeline_id, in sof_ipc4_widget_setup()
2957 pipeline->mem_usage); in sof_ipc4_widget_setup()
2959 msg = &pipeline->msg; in sof_ipc4_widget_setup()
2960 msg->primary |= pipeline->mem_usage; in sof_ipc4_widget_setup()
2962 swidget->instance_id = ida_alloc_max(&pipeline_ida, ipc4_data->max_num_pipelines, in sof_ipc4_widget_setup()
2964 if (swidget->instance_id < 0) { in sof_ipc4_widget_setup()
2965 dev_err(sdev->dev, "failed to assign pipeline id for %s: %d\n", in sof_ipc4_widget_setup()
2966 swidget->widget->name, swidget->instance_id); in sof_ipc4_widget_setup()
2967 return swidget->instance_id; in sof_ipc4_widget_setup()
2969 msg->primary &= ~SOF_IPC4_GLB_PIPE_INSTANCE_MASK; in sof_ipc4_widget_setup()
2970 msg->primary |= SOF_IPC4_GLB_PIPE_INSTANCE_ID(swidget->instance_id); in sof_ipc4_widget_setup()
2976 struct sof_ipc4_copier *ipc4_copier = swidget->private; in sof_ipc4_widget_setup()
2978 pipeline = pipe_widget->private; in sof_ipc4_widget_setup()
2979 if (pipeline->use_chain_dma) in sof_ipc4_widget_setup()
2982 ipc_size = ipc4_copier->ipc_config_size; in sof_ipc4_widget_setup()
2983 ipc_data = ipc4_copier->ipc_config_data; in sof_ipc4_widget_setup()
2985 msg = &ipc4_copier->msg; in sof_ipc4_widget_setup()
2991 struct snd_sof_dai *dai = swidget->private; in sof_ipc4_widget_setup() local
2992 struct sof_ipc4_copier *ipc4_copier = dai->private; in sof_ipc4_widget_setup()
2994 pipeline = pipe_widget->private; in sof_ipc4_widget_setup()
2995 if (pipeline->use_chain_dma) in sof_ipc4_widget_setup()
2998 ipc_size = ipc4_copier->ipc_config_size; in sof_ipc4_widget_setup()
2999 ipc_data = ipc4_copier->ipc_config_data; in sof_ipc4_widget_setup()
3001 msg = &ipc4_copier->msg; in sof_ipc4_widget_setup()
3006 struct sof_ipc4_gain *gain = swidget->private; in sof_ipc4_widget_setup()
3008 ipc_size = sizeof(gain->data); in sof_ipc4_widget_setup()
3009 ipc_data = &gain->data; in sof_ipc4_widget_setup()
3011 msg = &gain->msg; in sof_ipc4_widget_setup()
3016 struct sof_ipc4_mixer *mixer = swidget->private; in sof_ipc4_widget_setup()
3018 ipc_size = sizeof(mixer->base_config); in sof_ipc4_widget_setup()
3019 ipc_data = &mixer->base_config; in sof_ipc4_widget_setup()
3021 msg = &mixer->msg; in sof_ipc4_widget_setup()
3026 struct sof_ipc4_src *src = swidget->private; in sof_ipc4_widget_setup()
3028 ipc_size = sizeof(src->data); in sof_ipc4_widget_setup()
3029 ipc_data = &src->data; in sof_ipc4_widget_setup()
3031 msg = &src->msg; in sof_ipc4_widget_setup()
3036 struct sof_ipc4_asrc *asrc = swidget->private; in sof_ipc4_widget_setup()
3038 ipc_size = sizeof(asrc->data); in sof_ipc4_widget_setup()
3039 ipc_data = &asrc->data; in sof_ipc4_widget_setup()
3041 msg = &asrc->msg; in sof_ipc4_widget_setup()
3046 struct sof_ipc4_process *process = swidget->private; in sof_ipc4_widget_setup()
3048 if (!process->ipc_config_size) { in sof_ipc4_widget_setup()
3049 dev_err(sdev->dev, "module %s has no config data!\n", in sof_ipc4_widget_setup()
3050 swidget->widget->name); in sof_ipc4_widget_setup()
3051 return -EINVAL; in sof_ipc4_widget_setup()
3054 ipc_size = process->ipc_config_size; in sof_ipc4_widget_setup()
3055 ipc_data = process->ipc_config_data; in sof_ipc4_widget_setup()
3057 msg = &process->msg; in sof_ipc4_widget_setup()
3061 dev_err(sdev->dev, "widget type %d not supported", swidget->id); in sof_ipc4_widget_setup()
3062 return -EINVAL; in sof_ipc4_widget_setup()
3065 if (swidget->id != snd_soc_dapm_scheduler) { in sof_ipc4_widget_setup()
3066 int module_id = msg->primary & SOF_IPC4_MOD_ID_MASK; in sof_ipc4_widget_setup()
3070 dev_err(sdev->dev, "failed to assign instance id for %s\n", in sof_ipc4_widget_setup()
3071 swidget->widget->name); in sof_ipc4_widget_setup()
3075 msg->primary &= ~SOF_IPC4_MOD_INSTANCE_MASK; in sof_ipc4_widget_setup()
3076 msg->primary |= SOF_IPC4_MOD_INSTANCE(swidget->instance_id); in sof_ipc4_widget_setup()
3078 msg->extension &= ~SOF_IPC4_MOD_EXT_PARAM_SIZE_MASK; in sof_ipc4_widget_setup()
3079 msg->extension |= SOF_IPC4_MOD_EXT_PARAM_SIZE(ipc_size >> 2); in sof_ipc4_widget_setup()
3081 msg->extension &= ~SOF_IPC4_MOD_EXT_PPL_ID_MASK; in sof_ipc4_widget_setup()
3082 msg->extension |= SOF_IPC4_MOD_EXT_PPL_ID(pipe_widget->instance_id); in sof_ipc4_widget_setup()
3084 dev_dbg(sdev->dev, "Create widget %s (pipe %d) - ID %d, instance %d, core %d\n", in sof_ipc4_widget_setup()
3085 swidget->widget->name, swidget->pipeline_id, module_id, in sof_ipc4_widget_setup()
3086 swidget->instance_id, swidget->core); in sof_ipc4_widget_setup()
3088 dev_dbg(sdev->dev, "Create pipeline %s (pipe %d) - instance %d, core %d\n", in sof_ipc4_widget_setup()
3089 swidget->widget->name, swidget->pipeline_id, in sof_ipc4_widget_setup()
3090 swidget->instance_id, swidget->core); in sof_ipc4_widget_setup()
3093 msg->data_size = ipc_size; in sof_ipc4_widget_setup()
3094 msg->data_ptr = ipc_data; in sof_ipc4_widget_setup()
3096 ret = sof_ipc_tx_message_no_reply(sdev->ipc, msg, ipc_size); in sof_ipc4_widget_setup()
3098 dev_err(sdev->dev, "failed to create module %s\n", swidget->widget->name); in sof_ipc4_widget_setup()
3100 if (swidget->id != snd_soc_dapm_scheduler) { in sof_ipc4_widget_setup()
3101 struct sof_ipc4_fw_module *fw_module = swidget->module_info; in sof_ipc4_widget_setup()
3103 ida_free(&fw_module->m_ida, swidget->instance_id); in sof_ipc4_widget_setup()
3105 ida_free(&pipeline_ida, swidget->instance_id); in sof_ipc4_widget_setup()
3114 struct sof_ipc4_fw_module *fw_module = swidget->module_info; in sof_ipc4_widget_free()
3115 struct sof_ipc4_fw_data *ipc4_data = sdev->private; in sof_ipc4_widget_free()
3118 mutex_lock(&ipc4_data->pipeline_state_mutex); in sof_ipc4_widget_free()
3121 if (swidget->id == snd_soc_dapm_scheduler) { in sof_ipc4_widget_free()
3122 struct sof_ipc4_pipeline *pipeline = swidget->private; in sof_ipc4_widget_free()
3126 if (pipeline->use_chain_dma) { in sof_ipc4_widget_free()
3127 dev_warn(sdev->dev, "use_chain_dma set for scheduler %s", in sof_ipc4_widget_free()
3128 swidget->widget->name); in sof_ipc4_widget_free()
3129 mutex_unlock(&ipc4_data->pipeline_state_mutex); in sof_ipc4_widget_free()
3133 header = SOF_IPC4_GLB_PIPE_INSTANCE_ID(swidget->instance_id); in sof_ipc4_widget_free()
3140 ret = sof_ipc_tx_message_no_reply(sdev->ipc, &msg, 0); in sof_ipc4_widget_free()
3142 dev_err(sdev->dev, "failed to free pipeline widget %s\n", in sof_ipc4_widget_free()
3143 swidget->widget->name); in sof_ipc4_widget_free()
3145 pipeline->mem_usage = 0; in sof_ipc4_widget_free()
3146 pipeline->state = SOF_IPC4_PIPE_UNINITIALIZED; in sof_ipc4_widget_free()
3147 ida_free(&pipeline_ida, swidget->instance_id); in sof_ipc4_widget_free()
3148 swidget->instance_id = -EINVAL; in sof_ipc4_widget_free()
3150 struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget; in sof_ipc4_widget_free()
3151 struct sof_ipc4_pipeline *pipeline = pipe_widget->private; in sof_ipc4_widget_free()
3153 if (!pipeline->use_chain_dma) in sof_ipc4_widget_free()
3154 ida_free(&fw_module->m_ida, swidget->instance_id); in sof_ipc4_widget_free()
3157 mutex_unlock(&ipc4_data->pipeline_state_mutex); in sof_ipc4_widget_free()
3175 pin_binding = src_widget->output_pin_binding; in sof_ipc4_get_queue_id()
3176 queue_ida = &src_widget->output_queue_ida; in sof_ipc4_get_queue_id()
3177 num_pins = src_widget->num_output_pins; in sof_ipc4_get_queue_id()
3178 buddy_name = sink_widget->widget->name; in sof_ipc4_get_queue_id()
3181 pin_binding = sink_widget->input_pin_binding; in sof_ipc4_get_queue_id()
3182 queue_ida = &sink_widget->input_queue_ida; in sof_ipc4_get_queue_id()
3183 num_pins = sink_widget->num_input_pins; in sof_ipc4_get_queue_id()
3184 buddy_name = src_widget->widget->name; in sof_ipc4_get_queue_id()
3187 scomp = current_swidget->scomp; in sof_ipc4_get_queue_id()
3190 dev_err(scomp->dev, "invalid %s num_pins: %d for queue allocation for %s\n", in sof_ipc4_get_queue_id()
3192 num_pins, current_swidget->widget->name); in sof_ipc4_get_queue_id()
3193 return -EINVAL; in sof_ipc4_get_queue_id()
3210 dev_err(scomp->dev, "no %s queue id found from pin binding array for %s\n", in sof_ipc4_get_queue_id()
3212 current_swidget->widget->name); in sof_ipc4_get_queue_id()
3213 return -EINVAL; in sof_ipc4_get_queue_id()
3228 pin_binding = swidget->output_pin_binding; in sof_ipc4_put_queue_id()
3229 queue_ida = &swidget->output_queue_ida; in sof_ipc4_put_queue_id()
3230 num_pins = swidget->num_output_pins; in sof_ipc4_put_queue_id()
3232 pin_binding = swidget->input_pin_binding; in sof_ipc4_put_queue_id()
3233 queue_ida = &swidget->input_queue_ida; in sof_ipc4_put_queue_id()
3234 num_pins = swidget->num_input_pins; in sof_ipc4_put_queue_id()
3250 const struct sof_ipc_ops *iops = sdev->ipc->ops; in sof_ipc4_set_copier_sink_format()
3256 if (WIDGET_IS_DAI(src_widget->id)) { in sof_ipc4_set_copier_sink_format()
3257 struct snd_sof_dai *dai = src_widget->private; in sof_ipc4_set_copier_sink_format() local
3259 src_config = dai->private; in sof_ipc4_set_copier_sink_format()
3261 src_config = src_widget->private; in sof_ipc4_set_copier_sink_format()
3264 fw_module = src_widget->module_info; in sof_ipc4_set_copier_sink_format()
3266 format.sink_id = sroute->src_queue_id; in sof_ipc4_set_copier_sink_format()
3267 memcpy(&format.source_fmt, &src_config->audio_fmt, sizeof(format.source_fmt)); in sof_ipc4_set_copier_sink_format()
3269 pin_fmt = sof_ipc4_get_input_pin_audio_fmt(sink_widget, sroute->dst_queue_id); in sof_ipc4_set_copier_sink_format()
3271 dev_err(sdev->dev, in sof_ipc4_set_copier_sink_format()
3273 sink_widget->widget->name, sroute->dst_queue_id, in sof_ipc4_set_copier_sink_format()
3274 src_widget->widget->name, sroute->src_queue_id); in sof_ipc4_set_copier_sink_format()
3275 return -EINVAL; in sof_ipc4_set_copier_sink_format()
3283 msg.primary = fw_module->man4_module_entry.id; in sof_ipc4_set_copier_sink_format()
3284 msg.primary |= SOF_IPC4_MOD_INSTANCE(src_widget->instance_id); in sof_ipc4_set_copier_sink_format()
3291 return iops->set_get_data(sdev, &msg, msg.data_size, true); in sof_ipc4_set_copier_sink_format()
3296 struct snd_sof_widget *src_widget = sroute->src_widget; in sof_ipc4_route_setup()
3297 struct snd_sof_widget *sink_widget = sroute->sink_widget; in sof_ipc4_route_setup()
3298 struct snd_sof_widget *src_pipe_widget = src_widget->spipe->pipe_widget; in sof_ipc4_route_setup()
3299 struct snd_sof_widget *sink_pipe_widget = sink_widget->spipe->pipe_widget; in sof_ipc4_route_setup()
3300 struct sof_ipc4_fw_module *src_fw_module = src_widget->module_info; in sof_ipc4_route_setup()
3301 struct sof_ipc4_fw_module *sink_fw_module = sink_widget->module_info; in sof_ipc4_route_setup()
3302 struct sof_ipc4_pipeline *src_pipeline = src_pipe_widget->private; in sof_ipc4_route_setup()
3303 struct sof_ipc4_pipeline *sink_pipeline = sink_pipe_widget->private; in sof_ipc4_route_setup()
3309 if (src_pipeline->use_chain_dma || sink_pipeline->use_chain_dma) { in sof_ipc4_route_setup()
3310 if (!src_pipeline->use_chain_dma || !sink_pipeline->use_chain_dma) { in sof_ipc4_route_setup()
3311 dev_err(sdev->dev, in sof_ipc4_route_setup()
3313 src_widget->widget->name, sink_widget->widget->name); in sof_ipc4_route_setup()
3314 return -EINVAL; in sof_ipc4_route_setup()
3320 dev_err(sdev->dev, in sof_ipc4_route_setup()
3321 "cannot bind %s -> %s, no firmware module for: %s%s\n", in sof_ipc4_route_setup()
3322 src_widget->widget->name, sink_widget->widget->name, in sof_ipc4_route_setup()
3326 return -ENODEV; in sof_ipc4_route_setup()
3329 sroute->src_queue_id = sof_ipc4_get_queue_id(src_widget, sink_widget, in sof_ipc4_route_setup()
3331 if (sroute->src_queue_id < 0) { in sof_ipc4_route_setup()
3332 dev_err(sdev->dev, in sof_ipc4_route_setup()
3334 src_widget->widget->name); in sof_ipc4_route_setup()
3335 return sroute->src_queue_id; in sof_ipc4_route_setup()
3338 sroute->dst_queue_id = sof_ipc4_get_queue_id(src_widget, sink_widget, in sof_ipc4_route_setup()
3340 if (sroute->dst_queue_id < 0) { in sof_ipc4_route_setup()
3341 dev_err(sdev->dev, in sof_ipc4_route_setup()
3343 sink_widget->widget->name); in sof_ipc4_route_setup()
3344 sof_ipc4_put_queue_id(src_widget, sroute->src_queue_id, in sof_ipc4_route_setup()
3346 return sroute->dst_queue_id; in sof_ipc4_route_setup()
3350 if (sroute->src_queue_id > 0 && WIDGET_IS_COPIER(src_widget->id)) { in sof_ipc4_route_setup()
3354 dev_err(sdev->dev, in sof_ipc4_route_setup()
3356 src_widget->widget->name, sroute->src_queue_id); in sof_ipc4_route_setup()
3361 dev_dbg(sdev->dev, "bind %s:%d -> %s:%d\n", in sof_ipc4_route_setup()
3362 src_widget->widget->name, sroute->src_queue_id, in sof_ipc4_route_setup()
3363 sink_widget->widget->name, sroute->dst_queue_id); in sof_ipc4_route_setup()
3365 header = src_fw_module->man4_module_entry.id; in sof_ipc4_route_setup()
3366 header |= SOF_IPC4_MOD_INSTANCE(src_widget->instance_id); in sof_ipc4_route_setup()
3371 extension = sink_fw_module->man4_module_entry.id; in sof_ipc4_route_setup()
3372 extension |= SOF_IPC4_MOD_EXT_DST_MOD_INSTANCE(sink_widget->instance_id); in sof_ipc4_route_setup()
3373 extension |= SOF_IPC4_MOD_EXT_DST_MOD_QUEUE_ID(sroute->dst_queue_id); in sof_ipc4_route_setup()
3374 extension |= SOF_IPC4_MOD_EXT_SRC_MOD_QUEUE_ID(sroute->src_queue_id); in sof_ipc4_route_setup()
3379 ret = sof_ipc_tx_message_no_reply(sdev->ipc, &msg, 0); in sof_ipc4_route_setup()
3381 dev_err(sdev->dev, "failed to bind modules %s:%d -> %s:%d\n", in sof_ipc4_route_setup()
3382 src_widget->widget->name, sroute->src_queue_id, in sof_ipc4_route_setup()
3383 sink_widget->widget->name, sroute->dst_queue_id); in sof_ipc4_route_setup()
3390 sof_ipc4_put_queue_id(src_widget, sroute->src_queue_id, SOF_PIN_TYPE_OUTPUT); in sof_ipc4_route_setup()
3391 sof_ipc4_put_queue_id(sink_widget, sroute->dst_queue_id, SOF_PIN_TYPE_INPUT); in sof_ipc4_route_setup()
3397 struct snd_sof_widget *src_widget = sroute->src_widget; in sof_ipc4_route_free()
3398 struct snd_sof_widget *sink_widget = sroute->sink_widget; in sof_ipc4_route_free()
3399 struct sof_ipc4_fw_module *src_fw_module = src_widget->module_info; in sof_ipc4_route_free()
3400 struct sof_ipc4_fw_module *sink_fw_module = sink_widget->module_info; in sof_ipc4_route_free()
3402 struct snd_sof_widget *src_pipe_widget = src_widget->spipe->pipe_widget; in sof_ipc4_route_free()
3403 struct snd_sof_widget *sink_pipe_widget = sink_widget->spipe->pipe_widget; in sof_ipc4_route_free()
3404 struct sof_ipc4_pipeline *src_pipeline = src_pipe_widget->private; in sof_ipc4_route_free()
3405 struct sof_ipc4_pipeline *sink_pipeline = sink_pipe_widget->private; in sof_ipc4_route_free()
3410 if (src_pipeline->use_chain_dma || sink_pipeline->use_chain_dma) in sof_ipc4_route_free()
3413 dev_dbg(sdev->dev, "unbind modules %s:%d -> %s:%d\n", in sof_ipc4_route_free()
3414 src_widget->widget->name, sroute->src_queue_id, in sof_ipc4_route_free()
3415 sink_widget->widget->name, sroute->dst_queue_id); in sof_ipc4_route_free()
3421 if (src_widget->spipe->pipe_widget == sink_widget->spipe->pipe_widget) in sof_ipc4_route_free()
3424 header = src_fw_module->man4_module_entry.id; in sof_ipc4_route_free()
3425 header |= SOF_IPC4_MOD_INSTANCE(src_widget->instance_id); in sof_ipc4_route_free()
3430 extension = sink_fw_module->man4_module_entry.id; in sof_ipc4_route_free()
3431 extension |= SOF_IPC4_MOD_EXT_DST_MOD_INSTANCE(sink_widget->instance_id); in sof_ipc4_route_free()
3432 extension |= SOF_IPC4_MOD_EXT_DST_MOD_QUEUE_ID(sroute->dst_queue_id); in sof_ipc4_route_free()
3433 extension |= SOF_IPC4_MOD_EXT_SRC_MOD_QUEUE_ID(sroute->src_queue_id); in sof_ipc4_route_free()
3438 ret = sof_ipc_tx_message_no_reply(sdev->ipc, &msg, 0); in sof_ipc4_route_free()
3440 dev_err(sdev->dev, "failed to unbind modules %s:%d -> %s:%d\n", in sof_ipc4_route_free()
3441 src_widget->widget->name, sroute->src_queue_id, in sof_ipc4_route_free()
3442 sink_widget->widget->name, sroute->dst_queue_id); in sof_ipc4_route_free()
3444 sof_ipc4_put_queue_id(sink_widget, sroute->dst_queue_id, SOF_PIN_TYPE_INPUT); in sof_ipc4_route_free()
3445 sof_ipc4_put_queue_id(src_widget, sroute->src_queue_id, SOF_PIN_TYPE_OUTPUT); in sof_ipc4_route_free()
3453 struct snd_sof_widget *pipe_widget = swidget->spipe->pipe_widget; in sof_ipc4_dai_config()
3454 struct sof_ipc4_pipeline *pipeline = pipe_widget->private; in sof_ipc4_dai_config()
3455 struct snd_sof_dai *dai = swidget->private; in sof_ipc4_dai_config() local
3460 if (!dai || !dai->private) { in sof_ipc4_dai_config()
3461 dev_err(sdev->dev, "Invalid DAI or DAI private data for %s\n", in sof_ipc4_dai_config()
3462 swidget->widget->name); in sof_ipc4_dai_config()
3463 return -EINVAL; in sof_ipc4_dai_config()
3466 ipc4_copier = (struct sof_ipc4_copier *)dai->private; in sof_ipc4_dai_config()
3467 copier_data = &ipc4_copier->data; in sof_ipc4_dai_config()
3472 if (pipeline->use_chain_dma) { in sof_ipc4_dai_config()
3474 * Only configure the DMA Link ID for ChainDMA when this op is in sof_ipc4_dai_config()
3478 pipeline->msg.primary &= ~SOF_IPC4_GLB_CHAIN_DMA_LINK_ID_MASK; in sof_ipc4_dai_config()
3479 pipeline->msg.primary |= SOF_IPC4_GLB_CHAIN_DMA_LINK_ID(data->dai_data); in sof_ipc4_dai_config()
3484 switch (ipc4_copier->dai_type) { in sof_ipc4_dai_config()
3486 gtw_attr = ipc4_copier->gtw_attr; in sof_ipc4_dai_config()
3487 gtw_attr->lp_buffer_alloc = pipeline->lp_mode; in sof_ipc4_dai_config()
3489 copier_data->gtw_cfg.node_id &= ~SOF_IPC4_NODE_INDEX_MASK; in sof_ipc4_dai_config()
3490 copier_data->gtw_cfg.node_id |= SOF_IPC4_NODE_INDEX(data->dai_data); in sof_ipc4_dai_config()
3497 * unprepare. The node_id for multi-gateway DAI's will be overwritten with the in sof_ipc4_dai_config()
3503 blob = (struct sof_ipc4_alh_configuration_blob *)ipc4_copier->copier_config; in sof_ipc4_dai_config()
3504 ipc4_copier->dai_index = data->dai_node_id; in sof_ipc4_dai_config()
3507 * no need to set the node_id for aggregated DAI's. These will be assigned in sof_ipc4_dai_config()
3510 if (blob->alh_cfg.device_count == 1) { in sof_ipc4_dai_config()
3511 copier_data->gtw_cfg.node_id &= ~SOF_IPC4_NODE_INDEX_MASK; in sof_ipc4_dai_config()
3512 copier_data->gtw_cfg.node_id |= in sof_ipc4_dai_config()
3513 SOF_IPC4_NODE_INDEX(data->dai_node_id); in sof_ipc4_dai_config()
3523 dev_err(sdev->dev, "%s: unsupported dai type %d\n", __func__, in sof_ipc4_dai_config()
3524 ipc4_copier->dai_type); in sof_ipc4_dai_config()
3525 return -EINVAL; in sof_ipc4_dai_config()
3535 struct sof_ipc4_fw_data *ipc4_data = sdev->private; in sof_ipc4_parse_manifest()
3538 u32 size = le32_to_cpu(man->priv.size); in sof_ipc4_parse_manifest()
3539 u8 *man_ptr = man->priv.data; in sof_ipc4_parse_manifest()
3544 dev_err(scomp->dev, "%s: Invalid topology ABI size: %u\n", in sof_ipc4_parse_manifest()
3546 return -EINVAL; in sof_ipc4_parse_manifest()
3551 dev_info(scomp->dev, in sof_ipc4_parse_manifest()
3553 le16_to_cpu(manifest->abi_major), le16_to_cpu(manifest->abi_minor), in sof_ipc4_parse_manifest()
3554 le16_to_cpu(manifest->abi_patch), in sof_ipc4_parse_manifest()
3563 manifest_tlv = manifest->items; in sof_ipc4_parse_manifest()
3565 for (i = 0; i < le16_to_cpu(manifest->count); i++) { in sof_ipc4_parse_manifest()
3566 len_check += sizeof(struct sof_manifest_tlv) + le32_to_cpu(manifest_tlv->size); in sof_ipc4_parse_manifest()
3568 return -EINVAL; in sof_ipc4_parse_manifest()
3570 switch (le32_to_cpu(manifest_tlv->type)) { in sof_ipc4_parse_manifest()
3573 if (ipc4_data->nhlt) in sof_ipc4_parse_manifest()
3575 ipc4_data->nhlt = devm_kmemdup(sdev->dev, manifest_tlv->data, in sof_ipc4_parse_manifest()
3576 le32_to_cpu(manifest_tlv->size), GFP_KERNEL); in sof_ipc4_parse_manifest()
3577 if (!ipc4_data->nhlt) in sof_ipc4_parse_manifest()
3578 return -ENOMEM; in sof_ipc4_parse_manifest()
3581 dev_warn(scomp->dev, "Skipping unknown manifest data type %d\n", in sof_ipc4_parse_manifest()
3582 manifest_tlv->type); in sof_ipc4_parse_manifest()
3585 man_ptr += sizeof(struct sof_manifest_tlv) + le32_to_cpu(manifest_tlv->size); in sof_ipc4_parse_manifest()
3592 static int sof_ipc4_dai_get_param(struct snd_sof_dev *sdev, struct snd_sof_dai *dai, int param_type) in sof_ipc4_dai_get_param() argument
3594 struct sof_ipc4_copier *ipc4_copier = dai->private; in sof_ipc4_dai_get_param()
3604 list_for_each_entry(slink, &sdev->dai_link_list, list) { in sof_ipc4_dai_get_param()
3605 if (!strcmp(slink->link->name, dai->name)) { in sof_ipc4_dai_get_param()
3612 dev_err(sdev->dev, "no DAI link found for DAI %s\n", dai->name); in sof_ipc4_dai_get_param()
3613 return -EINVAL; in sof_ipc4_dai_get_param()
3616 for (i = 0; i < slink->num_hw_configs; i++) { in sof_ipc4_dai_get_param()
3617 hw_config = &slink->hw_configs[i]; in sof_ipc4_dai_get_param()
3618 if (dai->current_config == le32_to_cpu(hw_config->id)) { in sof_ipc4_dai_get_param()
3625 dev_err(sdev->dev, "no matching hw_config found for DAI %s\n", dai->name); in sof_ipc4_dai_get_param()
3626 return -EINVAL; in sof_ipc4_dai_get_param()
3629 switch (ipc4_copier->dai_type) { in sof_ipc4_dai_get_param()
3633 return le32_to_cpu(hw_config->mclk_rate); in sof_ipc4_dai_get_param()
3635 return le32_to_cpu(hw_config->bclk_rate); in sof_ipc4_dai_get_param()
3637 return le32_to_cpu(hw_config->tdm_slots); in sof_ipc4_dai_get_param()
3639 dev_err(sdev->dev, "invalid SSP param %d\n", param_type); in sof_ipc4_dai_get_param()
3644 dev_err(sdev->dev, "DAI type %d not supported yet!\n", ipc4_copier->dai_type); in sof_ipc4_dai_get_param()
3648 return -EINVAL; in sof_ipc4_dai_get_param()
3668 static int sof_ipc4_link_setup(struct snd_sof_dev *sdev, struct snd_soc_dai_link *link) in sof_ipc4_link_setup() argument
3670 if (link->no_pcm) in sof_ipc4_link_setup()
3680 link->trigger[SNDRV_PCM_STREAM_PLAYBACK] = SND_SOC_DPCM_TRIGGER_POST; in sof_ipc4_link_setup()
3681 link->trigger[SNDRV_PCM_STREAM_CAPTURE] = SND_SOC_DPCM_TRIGGER_PRE; in sof_ipc4_link_setup()
3686 /* Tokens needed for different copier variants (aif, dai and buffer) */
3696 SOF_DAI_TOKENS, /* for DAI copier */