2 * skl-message.c - HDA DSP interface for FW registration, Pipe and Module
5 * Copyright (C) 2015 Intel Corp
6 * Author:Rafal Redzimski <rafal.f.redzimski@intel.com>
7 * Jeeja KP <jeeja.kp@intel.com>
8 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as version 2, as
12 * published by the Free Software Foundation.
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
20 #include <linux/slab.h>
21 #include <linux/pci.h>
22 #include <sound/core.h>
23 #include <sound/pcm.h>
24 #include "skl-sst-dsp.h"
25 #include "skl-sst-ipc.h"
27 #include "../common/sst-dsp.h"
28 #include "../common/sst-dsp-priv.h"
29 #include "skl-topology.h"
30 #include "skl-tplg-interface.h"
32 static int skl_alloc_dma_buf(struct device
*dev
,
33 struct snd_dma_buffer
*dmab
, size_t size
)
35 struct hdac_ext_bus
*ebus
= dev_get_drvdata(dev
);
36 struct hdac_bus
*bus
= ebus_to_hbus(ebus
);
41 return bus
->io_ops
->dma_alloc_pages(bus
, SNDRV_DMA_TYPE_DEV
, size
, dmab
);
44 static int skl_free_dma_buf(struct device
*dev
, struct snd_dma_buffer
*dmab
)
46 struct hdac_ext_bus
*ebus
= dev_get_drvdata(dev
);
47 struct hdac_bus
*bus
= ebus_to_hbus(ebus
);
52 bus
->io_ops
->dma_free_pages(bus
, dmab
);
57 #define NOTIFICATION_PARAM_ID 3
58 #define NOTIFICATION_MASK 0xf
60 /* disable notfication for underruns/overruns from firmware module */
61 static void skl_dsp_enable_notification(struct skl_sst
*ctx
, bool enable
)
63 struct notification_mask mask
;
64 struct skl_ipc_large_config_msg msg
= {0};
66 mask
.notify
= NOTIFICATION_MASK
;
69 msg
.large_param_id
= NOTIFICATION_PARAM_ID
;
70 msg
.param_data_size
= sizeof(mask
);
72 skl_ipc_set_large_config(&ctx
->ipc
, &msg
, (u32
*)&mask
);
75 int skl_init_dsp(struct skl
*skl
)
77 void __iomem
*mmio_base
;
78 struct hdac_ext_bus
*ebus
= &skl
->ebus
;
79 struct hdac_bus
*bus
= ebus_to_hbus(ebus
);
81 struct skl_dsp_loader_ops loader_ops
;
84 loader_ops
.alloc_dma_buf
= skl_alloc_dma_buf
;
85 loader_ops
.free_dma_buf
= skl_free_dma_buf
;
87 /* enable ppcap interrupt */
88 snd_hdac_ext_bus_ppcap_enable(&skl
->ebus
, true);
89 snd_hdac_ext_bus_ppcap_int_enable(&skl
->ebus
, true);
91 /* read the BAR of the ADSP MMIO */
92 mmio_base
= pci_ioremap_bar(skl
->pci
, 4);
93 if (mmio_base
== NULL
) {
94 dev_err(bus
->dev
, "ioremap error\n");
98 ret
= skl_sst_dsp_init(bus
->dev
, mmio_base
, irq
,
99 skl
->fw_name
, loader_ops
, &skl
->skl_sst
);
103 skl_dsp_enable_notification(skl
->skl_sst
, false);
104 dev_dbg(bus
->dev
, "dsp registration status=%d\n", ret
);
109 void skl_free_dsp(struct skl
*skl
)
111 struct hdac_ext_bus
*ebus
= &skl
->ebus
;
112 struct hdac_bus
*bus
= ebus_to_hbus(ebus
);
113 struct skl_sst
*ctx
= skl
->skl_sst
;
115 /* disable ppcap interrupt */
116 snd_hdac_ext_bus_ppcap_int_enable(&skl
->ebus
, false);
118 skl_sst_dsp_cleanup(bus
->dev
, ctx
);
119 if (ctx
->dsp
->addr
.lpe
)
120 iounmap(ctx
->dsp
->addr
.lpe
);
123 int skl_suspend_dsp(struct skl
*skl
)
125 struct skl_sst
*ctx
= skl
->skl_sst
;
128 /* if ppcap is not supported return 0 */
129 if (!skl
->ebus
.ppcap
)
132 ret
= skl_dsp_sleep(ctx
->dsp
);
136 /* disable ppcap interrupt */
137 snd_hdac_ext_bus_ppcap_int_enable(&skl
->ebus
, false);
138 snd_hdac_ext_bus_ppcap_enable(&skl
->ebus
, false);
143 int skl_resume_dsp(struct skl
*skl
)
145 struct skl_sst
*ctx
= skl
->skl_sst
;
148 /* if ppcap is not supported return 0 */
149 if (!skl
->ebus
.ppcap
)
152 /* enable ppcap interrupt */
153 snd_hdac_ext_bus_ppcap_enable(&skl
->ebus
, true);
154 snd_hdac_ext_bus_ppcap_int_enable(&skl
->ebus
, true);
156 ret
= skl_dsp_wake(ctx
->dsp
);
160 skl_dsp_enable_notification(skl
->skl_sst
, false);
164 enum skl_bitdepth
skl_get_bit_depth(int params
)
168 return SKL_DEPTH_8BIT
;
171 return SKL_DEPTH_16BIT
;
174 return SKL_DEPTH_24BIT
;
177 return SKL_DEPTH_32BIT
;
180 return SKL_DEPTH_INVALID
;
186 * Each module in DSP expects a base module configuration, which consists of
187 * PCM format information, which we calculate in driver and resource values
188 * which are read from widget information passed through topology binary
189 * This is send when we create a module with INIT_INSTANCE IPC msg
191 static void skl_set_base_module_format(struct skl_sst
*ctx
,
192 struct skl_module_cfg
*mconfig
,
193 struct skl_base_cfg
*base_cfg
)
195 struct skl_module_fmt
*format
= &mconfig
->in_fmt
[0];
197 base_cfg
->audio_fmt
.number_of_channels
= (u8
)format
->channels
;
199 base_cfg
->audio_fmt
.s_freq
= format
->s_freq
;
200 base_cfg
->audio_fmt
.bit_depth
= format
->bit_depth
;
201 base_cfg
->audio_fmt
.valid_bit_depth
= format
->valid_bit_depth
;
202 base_cfg
->audio_fmt
.ch_cfg
= format
->ch_cfg
;
204 dev_dbg(ctx
->dev
, "bit_depth=%x valid_bd=%x ch_config=%x\n",
205 format
->bit_depth
, format
->valid_bit_depth
,
208 base_cfg
->audio_fmt
.channel_map
= format
->ch_map
;
210 base_cfg
->audio_fmt
.interleaving
= format
->interleaving_style
;
212 base_cfg
->cps
= mconfig
->mcps
;
213 base_cfg
->ibs
= mconfig
->ibs
;
214 base_cfg
->obs
= mconfig
->obs
;
215 base_cfg
->is_pages
= mconfig
->mem_pages
;
219 * Copies copier capabilities into copier module and updates copier module
222 static void skl_copy_copier_caps(struct skl_module_cfg
*mconfig
,
223 struct skl_cpr_cfg
*cpr_mconfig
)
225 if (mconfig
->formats_config
.caps_size
== 0)
228 memcpy(cpr_mconfig
->gtw_cfg
.config_data
,
229 mconfig
->formats_config
.caps
,
230 mconfig
->formats_config
.caps_size
);
232 cpr_mconfig
->gtw_cfg
.config_length
=
233 (mconfig
->formats_config
.caps_size
) / 4;
236 #define SKL_NON_GATEWAY_CPR_NODE_ID 0xFFFFFFFF
238 * Calculate the gatewat settings required for copier module, type of
239 * gateway and index of gateway to use
241 static void skl_setup_cpr_gateway_cfg(struct skl_sst
*ctx
,
242 struct skl_module_cfg
*mconfig
,
243 struct skl_cpr_cfg
*cpr_mconfig
)
245 union skl_connector_node_id node_id
= {0};
246 union skl_ssp_dma_node ssp_node
= {0};
247 struct skl_pipe_params
*params
= mconfig
->pipe
->p_params
;
249 switch (mconfig
->dev_type
) {
251 node_id
.node
.dma_type
=
252 (SKL_CONN_SOURCE
== mconfig
->hw_conn_type
) ?
253 SKL_DMA_I2S_LINK_OUTPUT_CLASS
:
254 SKL_DMA_I2S_LINK_INPUT_CLASS
;
255 node_id
.node
.vindex
= params
->host_dma_id
+
256 (mconfig
->vbus_id
<< 3);
260 node_id
.node
.dma_type
=
261 (SKL_CONN_SOURCE
== mconfig
->hw_conn_type
) ?
262 SKL_DMA_I2S_LINK_OUTPUT_CLASS
:
263 SKL_DMA_I2S_LINK_INPUT_CLASS
;
264 ssp_node
.dma_node
.time_slot_index
= mconfig
->time_slot
;
265 ssp_node
.dma_node
.i2s_instance
= mconfig
->vbus_id
;
266 node_id
.node
.vindex
= ssp_node
.val
;
269 case SKL_DEVICE_DMIC
:
270 node_id
.node
.dma_type
= SKL_DMA_DMIC_LINK_INPUT_CLASS
;
271 node_id
.node
.vindex
= mconfig
->vbus_id
+
272 (mconfig
->time_slot
);
275 case SKL_DEVICE_HDALINK
:
276 node_id
.node
.dma_type
=
277 (SKL_CONN_SOURCE
== mconfig
->hw_conn_type
) ?
278 SKL_DMA_HDA_LINK_OUTPUT_CLASS
:
279 SKL_DMA_HDA_LINK_INPUT_CLASS
;
280 node_id
.node
.vindex
= params
->link_dma_id
;
283 case SKL_DEVICE_HDAHOST
:
284 node_id
.node
.dma_type
=
285 (SKL_CONN_SOURCE
== mconfig
->hw_conn_type
) ?
286 SKL_DMA_HDA_HOST_OUTPUT_CLASS
:
287 SKL_DMA_HDA_HOST_INPUT_CLASS
;
288 node_id
.node
.vindex
= params
->host_dma_id
;
292 cpr_mconfig
->gtw_cfg
.node_id
= SKL_NON_GATEWAY_CPR_NODE_ID
;
293 cpr_mconfig
->cpr_feature_mask
= 0;
297 cpr_mconfig
->gtw_cfg
.node_id
= node_id
.val
;
299 if (SKL_CONN_SOURCE
== mconfig
->hw_conn_type
)
300 cpr_mconfig
->gtw_cfg
.dma_buffer_size
= 2 * mconfig
->obs
;
302 cpr_mconfig
->gtw_cfg
.dma_buffer_size
= 2 * mconfig
->ibs
;
304 cpr_mconfig
->cpr_feature_mask
= 0;
305 cpr_mconfig
->gtw_cfg
.config_length
= 0;
307 skl_copy_copier_caps(mconfig
, cpr_mconfig
);
310 static void skl_setup_out_format(struct skl_sst
*ctx
,
311 struct skl_module_cfg
*mconfig
,
312 struct skl_audio_data_format
*out_fmt
)
314 struct skl_module_fmt
*format
= &mconfig
->out_fmt
[0];
316 out_fmt
->number_of_channels
= (u8
)format
->channels
;
317 out_fmt
->s_freq
= format
->s_freq
;
318 out_fmt
->bit_depth
= format
->bit_depth
;
319 out_fmt
->valid_bit_depth
= format
->valid_bit_depth
;
320 out_fmt
->ch_cfg
= format
->ch_cfg
;
322 out_fmt
->channel_map
= format
->ch_map
;
323 out_fmt
->interleaving
= format
->interleaving_style
;
324 out_fmt
->sample_type
= format
->sample_type
;
326 dev_dbg(ctx
->dev
, "copier out format chan=%d fre=%d bitdepth=%d\n",
327 out_fmt
->number_of_channels
, format
->s_freq
, format
->bit_depth
);
331 * DSP needs SRC module for frequency conversion, SRC takes base module
332 * configuration and the target frequency as extra parameter passed as src
335 static void skl_set_src_format(struct skl_sst
*ctx
,
336 struct skl_module_cfg
*mconfig
,
337 struct skl_src_module_cfg
*src_mconfig
)
339 struct skl_module_fmt
*fmt
= &mconfig
->out_fmt
[0];
341 skl_set_base_module_format(ctx
, mconfig
,
342 (struct skl_base_cfg
*)src_mconfig
);
344 src_mconfig
->src_cfg
= fmt
->s_freq
;
348 * DSP needs updown module to do channel conversion. updown module take base
349 * module configuration and channel configuration
350 * It also take coefficients and now we have defaults applied here
352 static void skl_set_updown_mixer_format(struct skl_sst
*ctx
,
353 struct skl_module_cfg
*mconfig
,
354 struct skl_up_down_mixer_cfg
*mixer_mconfig
)
356 struct skl_module_fmt
*fmt
= &mconfig
->out_fmt
[0];
359 skl_set_base_module_format(ctx
, mconfig
,
360 (struct skl_base_cfg
*)mixer_mconfig
);
361 mixer_mconfig
->out_ch_cfg
= fmt
->ch_cfg
;
363 /* Select F/W default coefficient */
364 mixer_mconfig
->coeff_sel
= 0x0;
366 /* User coeff, don't care since we are selecting F/W defaults */
367 for (i
= 0; i
< UP_DOWN_MIXER_MAX_COEFF
; i
++)
368 mixer_mconfig
->coeff
[i
] = 0xDEADBEEF;
372 * 'copier' is DSP internal module which copies data from Host DMA (HDA host
373 * dma) or link (hda link, SSP, PDM)
374 * Here we calculate the copier module parameters, like PCM format, output
375 * format, gateway settings
376 * copier_module_config is sent as input buffer with INIT_INSTANCE IPC msg
378 static void skl_set_copier_format(struct skl_sst
*ctx
,
379 struct skl_module_cfg
*mconfig
,
380 struct skl_cpr_cfg
*cpr_mconfig
)
382 struct skl_audio_data_format
*out_fmt
= &cpr_mconfig
->out_fmt
;
383 struct skl_base_cfg
*base_cfg
= (struct skl_base_cfg
*)cpr_mconfig
;
385 skl_set_base_module_format(ctx
, mconfig
, base_cfg
);
387 skl_setup_out_format(ctx
, mconfig
, out_fmt
);
388 skl_setup_cpr_gateway_cfg(ctx
, mconfig
, cpr_mconfig
);
392 * Algo module are DSP pre processing modules. Algo module take base module
393 * configuration and params
396 static void skl_set_algo_format(struct skl_sst
*ctx
,
397 struct skl_module_cfg
*mconfig
,
398 struct skl_algo_cfg
*algo_mcfg
)
400 struct skl_base_cfg
*base_cfg
= (struct skl_base_cfg
*)algo_mcfg
;
402 skl_set_base_module_format(ctx
, mconfig
, base_cfg
);
404 if (mconfig
->formats_config
.caps_size
== 0)
407 memcpy(algo_mcfg
->params
,
408 mconfig
->formats_config
.caps
,
409 mconfig
->formats_config
.caps_size
);
414 * Mic select module allows selecting one or many input channels, thus
417 * Mic select module take base module configuration and out-format
420 static void skl_set_base_outfmt_format(struct skl_sst
*ctx
,
421 struct skl_module_cfg
*mconfig
,
422 struct skl_base_outfmt_cfg
*base_outfmt_mcfg
)
424 struct skl_audio_data_format
*out_fmt
= &base_outfmt_mcfg
->out_fmt
;
425 struct skl_base_cfg
*base_cfg
=
426 (struct skl_base_cfg
*)base_outfmt_mcfg
;
428 skl_set_base_module_format(ctx
, mconfig
, base_cfg
);
429 skl_setup_out_format(ctx
, mconfig
, out_fmt
);
432 static u16
skl_get_module_param_size(struct skl_sst
*ctx
,
433 struct skl_module_cfg
*mconfig
)
437 switch (mconfig
->m_type
) {
438 case SKL_MODULE_TYPE_COPIER
:
439 param_size
= sizeof(struct skl_cpr_cfg
);
440 param_size
+= mconfig
->formats_config
.caps_size
;
443 case SKL_MODULE_TYPE_SRCINT
:
444 return sizeof(struct skl_src_module_cfg
);
446 case SKL_MODULE_TYPE_UPDWMIX
:
447 return sizeof(struct skl_up_down_mixer_cfg
);
449 case SKL_MODULE_TYPE_ALGO
:
450 param_size
= sizeof(struct skl_base_cfg
);
451 param_size
+= mconfig
->formats_config
.caps_size
;
454 case SKL_MODULE_TYPE_BASE_OUTFMT
:
455 return sizeof(struct skl_base_outfmt_cfg
);
459 * return only base cfg when no specific module type is
462 return sizeof(struct skl_base_cfg
);
469 * DSP firmware supports various modules like copier, SRC, updown etc.
470 * These modules required various parameters to be calculated and sent for
471 * the module initialization to DSP. By default a generic module needs only
472 * base module format configuration
475 static int skl_set_module_format(struct skl_sst
*ctx
,
476 struct skl_module_cfg
*module_config
,
477 u16
*module_config_size
,
482 param_size
= skl_get_module_param_size(ctx
, module_config
);
484 *param_data
= kzalloc(param_size
, GFP_KERNEL
);
485 if (NULL
== *param_data
)
488 *module_config_size
= param_size
;
490 switch (module_config
->m_type
) {
491 case SKL_MODULE_TYPE_COPIER
:
492 skl_set_copier_format(ctx
, module_config
, *param_data
);
495 case SKL_MODULE_TYPE_SRCINT
:
496 skl_set_src_format(ctx
, module_config
, *param_data
);
499 case SKL_MODULE_TYPE_UPDWMIX
:
500 skl_set_updown_mixer_format(ctx
, module_config
, *param_data
);
503 case SKL_MODULE_TYPE_ALGO
:
504 skl_set_algo_format(ctx
, module_config
, *param_data
);
507 case SKL_MODULE_TYPE_BASE_OUTFMT
:
508 skl_set_base_outfmt_format(ctx
, module_config
, *param_data
);
512 skl_set_base_module_format(ctx
, module_config
, *param_data
);
517 dev_dbg(ctx
->dev
, "Module type=%d config size: %d bytes\n",
518 module_config
->id
.module_id
, param_size
);
519 print_hex_dump(KERN_DEBUG
, "Module params:", DUMP_PREFIX_OFFSET
, 8, 4,
520 *param_data
, param_size
, false);
524 static int skl_get_queue_index(struct skl_module_pin
*mpin
,
525 struct skl_module_inst_id id
, int max
)
529 for (i
= 0; i
< max
; i
++) {
530 if (mpin
[i
].id
.module_id
== id
.module_id
&&
531 mpin
[i
].id
.instance_id
== id
.instance_id
)
539 * Allocates queue for each module.
540 * if dynamic, the pin_index is allocated 0 to max_pin.
541 * In static, the pin_index is fixed based on module_id and instance id
543 static int skl_alloc_queue(struct skl_module_pin
*mpin
,
544 struct skl_module_cfg
*tgt_cfg
, int max
)
547 struct skl_module_inst_id id
= tgt_cfg
->id
;
549 * if pin in dynamic, find first free pin
550 * otherwise find match module and instance id pin as topology will
551 * ensure a unique pin is assigned to this so no need to
554 for (i
= 0; i
< max
; i
++) {
555 if (mpin
[i
].is_dynamic
) {
556 if (!mpin
[i
].in_use
&&
557 mpin
[i
].pin_state
== SKL_PIN_UNBIND
) {
559 mpin
[i
].in_use
= true;
560 mpin
[i
].id
.module_id
= id
.module_id
;
561 mpin
[i
].id
.instance_id
= id
.instance_id
;
562 mpin
[i
].tgt_mcfg
= tgt_cfg
;
566 if (mpin
[i
].id
.module_id
== id
.module_id
&&
567 mpin
[i
].id
.instance_id
== id
.instance_id
&&
568 mpin
[i
].pin_state
== SKL_PIN_UNBIND
) {
570 mpin
[i
].tgt_mcfg
= tgt_cfg
;
579 static void skl_free_queue(struct skl_module_pin
*mpin
, int q_index
)
581 if (mpin
[q_index
].is_dynamic
) {
582 mpin
[q_index
].in_use
= false;
583 mpin
[q_index
].id
.module_id
= 0;
584 mpin
[q_index
].id
.instance_id
= 0;
586 mpin
[q_index
].pin_state
= SKL_PIN_UNBIND
;
587 mpin
[q_index
].tgt_mcfg
= NULL
;
590 /* Module state will be set to unint, if all the out pin state is UNBIND */
592 static void skl_clear_module_state(struct skl_module_pin
*mpin
, int max
,
593 struct skl_module_cfg
*mcfg
)
598 for (i
= 0; i
< max
; i
++) {
599 if (mpin
[i
].pin_state
== SKL_PIN_UNBIND
)
606 mcfg
->m_state
= SKL_MODULE_UNINIT
;
611 * A module needs to be instanataited in DSP. A mdoule is present in a
612 * collection of module referred as a PIPE.
613 * We first calculate the module format, based on module type and then
614 * invoke the DSP by sending IPC INIT_INSTANCE using ipc helper
616 int skl_init_module(struct skl_sst
*ctx
,
617 struct skl_module_cfg
*mconfig
)
619 u16 module_config_size
= 0;
620 void *param_data
= NULL
;
622 struct skl_ipc_init_instance_msg msg
;
624 dev_dbg(ctx
->dev
, "%s: module_id = %d instance=%d\n", __func__
,
625 mconfig
->id
.module_id
, mconfig
->id
.instance_id
);
627 if (mconfig
->pipe
->state
!= SKL_PIPE_CREATED
) {
628 dev_err(ctx
->dev
, "Pipe not created state= %d pipe_id= %d\n",
629 mconfig
->pipe
->state
, mconfig
->pipe
->ppl_id
);
633 ret
= skl_set_module_format(ctx
, mconfig
,
634 &module_config_size
, ¶m_data
);
636 dev_err(ctx
->dev
, "Failed to set module format ret=%d\n", ret
);
640 msg
.module_id
= mconfig
->id
.module_id
;
641 msg
.instance_id
= mconfig
->id
.instance_id
;
642 msg
.ppl_instance_id
= mconfig
->pipe
->ppl_id
;
643 msg
.param_data_size
= module_config_size
;
644 msg
.core_id
= mconfig
->core_id
;
646 ret
= skl_ipc_init_instance(&ctx
->ipc
, &msg
, param_data
);
648 dev_err(ctx
->dev
, "Failed to init instance ret=%d\n", ret
);
652 mconfig
->m_state
= SKL_MODULE_INIT_DONE
;
657 static void skl_dump_bind_info(struct skl_sst
*ctx
, struct skl_module_cfg
658 *src_module
, struct skl_module_cfg
*dst_module
)
660 dev_dbg(ctx
->dev
, "%s: src module_id = %d src_instance=%d\n",
661 __func__
, src_module
->id
.module_id
, src_module
->id
.instance_id
);
662 dev_dbg(ctx
->dev
, "%s: dst_module=%d dst_instacne=%d\n", __func__
,
663 dst_module
->id
.module_id
, dst_module
->id
.instance_id
);
665 dev_dbg(ctx
->dev
, "src_module state = %d dst module state = %d\n",
666 src_module
->m_state
, dst_module
->m_state
);
670 * On module freeup, we need to unbind the module with modules
671 * it is already bind.
672 * Find the pin allocated and unbind then using bind_unbind IPC
674 int skl_unbind_modules(struct skl_sst
*ctx
,
675 struct skl_module_cfg
*src_mcfg
,
676 struct skl_module_cfg
*dst_mcfg
)
679 struct skl_ipc_bind_unbind_msg msg
;
680 struct skl_module_inst_id src_id
= src_mcfg
->id
;
681 struct skl_module_inst_id dst_id
= dst_mcfg
->id
;
682 int in_max
= dst_mcfg
->max_in_queue
;
683 int out_max
= src_mcfg
->max_out_queue
;
684 int src_index
, dst_index
, src_pin_state
, dst_pin_state
;
686 skl_dump_bind_info(ctx
, src_mcfg
, dst_mcfg
);
688 /* get src queue index */
689 src_index
= skl_get_queue_index(src_mcfg
->m_out_pin
, dst_id
, out_max
);
693 msg
.src_queue
= src_index
;
695 /* get dst queue index */
696 dst_index
= skl_get_queue_index(dst_mcfg
->m_in_pin
, src_id
, in_max
);
700 msg
.dst_queue
= dst_index
;
702 src_pin_state
= src_mcfg
->m_out_pin
[src_index
].pin_state
;
703 dst_pin_state
= dst_mcfg
->m_in_pin
[dst_index
].pin_state
;
705 if (src_pin_state
!= SKL_PIN_BIND_DONE
||
706 dst_pin_state
!= SKL_PIN_BIND_DONE
)
709 msg
.module_id
= src_mcfg
->id
.module_id
;
710 msg
.instance_id
= src_mcfg
->id
.instance_id
;
711 msg
.dst_module_id
= dst_mcfg
->id
.module_id
;
712 msg
.dst_instance_id
= dst_mcfg
->id
.instance_id
;
715 ret
= skl_ipc_bind_unbind(&ctx
->ipc
, &msg
);
717 /* free queue only if unbind is success */
718 skl_free_queue(src_mcfg
->m_out_pin
, src_index
);
719 skl_free_queue(dst_mcfg
->m_in_pin
, dst_index
);
722 * check only if src module bind state, bind is
723 * always from src -> sink
725 skl_clear_module_state(src_mcfg
->m_out_pin
, out_max
, src_mcfg
);
732 * Once a module is instantiated it need to be 'bind' with other modules in
733 * the pipeline. For binding we need to find the module pins which are bind
735 * This function finds the pins and then sends bund_unbind IPC message to
736 * DSP using IPC helper
738 int skl_bind_modules(struct skl_sst
*ctx
,
739 struct skl_module_cfg
*src_mcfg
,
740 struct skl_module_cfg
*dst_mcfg
)
743 struct skl_ipc_bind_unbind_msg msg
;
744 int in_max
= dst_mcfg
->max_in_queue
;
745 int out_max
= src_mcfg
->max_out_queue
;
746 int src_index
, dst_index
;
748 skl_dump_bind_info(ctx
, src_mcfg
, dst_mcfg
);
750 if (src_mcfg
->m_state
< SKL_MODULE_INIT_DONE
&&
751 dst_mcfg
->m_state
< SKL_MODULE_INIT_DONE
)
754 src_index
= skl_alloc_queue(src_mcfg
->m_out_pin
, dst_mcfg
, out_max
);
758 msg
.src_queue
= src_index
;
759 dst_index
= skl_alloc_queue(dst_mcfg
->m_in_pin
, src_mcfg
, in_max
);
761 skl_free_queue(src_mcfg
->m_out_pin
, src_index
);
765 msg
.dst_queue
= dst_index
;
767 dev_dbg(ctx
->dev
, "src queue = %d dst queue =%d\n",
768 msg
.src_queue
, msg
.dst_queue
);
770 msg
.module_id
= src_mcfg
->id
.module_id
;
771 msg
.instance_id
= src_mcfg
->id
.instance_id
;
772 msg
.dst_module_id
= dst_mcfg
->id
.module_id
;
773 msg
.dst_instance_id
= dst_mcfg
->id
.instance_id
;
776 ret
= skl_ipc_bind_unbind(&ctx
->ipc
, &msg
);
779 src_mcfg
->m_state
= SKL_MODULE_BIND_DONE
;
780 src_mcfg
->m_out_pin
[src_index
].pin_state
= SKL_PIN_BIND_DONE
;
781 dst_mcfg
->m_in_pin
[dst_index
].pin_state
= SKL_PIN_BIND_DONE
;
783 /* error case , if IPC fails, clear the queue index */
784 skl_free_queue(src_mcfg
->m_out_pin
, src_index
);
785 skl_free_queue(dst_mcfg
->m_in_pin
, dst_index
);
791 static int skl_set_pipe_state(struct skl_sst
*ctx
, struct skl_pipe
*pipe
,
792 enum skl_ipc_pipeline_state state
)
794 dev_dbg(ctx
->dev
, "%s: pipe_satate = %d\n", __func__
, state
);
796 return skl_ipc_set_pipeline_state(&ctx
->ipc
, pipe
->ppl_id
, state
);
800 * A pipeline is a collection of modules. Before a module in instantiated a
801 * pipeline needs to be created for it.
802 * This function creates pipeline, by sending create pipeline IPC messages
805 int skl_create_pipeline(struct skl_sst
*ctx
, struct skl_pipe
*pipe
)
809 dev_dbg(ctx
->dev
, "%s: pipe_id = %d\n", __func__
, pipe
->ppl_id
);
811 ret
= skl_ipc_create_pipeline(&ctx
->ipc
, pipe
->memory_pages
,
812 pipe
->pipe_priority
, pipe
->ppl_id
);
814 dev_err(ctx
->dev
, "Failed to create pipeline\n");
818 pipe
->state
= SKL_PIPE_CREATED
;
824 * A pipeline needs to be deleted on cleanup. If a pipeline is running, then
825 * pause the pipeline first and then delete it
826 * The pipe delete is done by sending delete pipeline IPC. DSP will stop the
827 * DMA engines and releases resources
829 int skl_delete_pipe(struct skl_sst
*ctx
, struct skl_pipe
*pipe
)
833 dev_dbg(ctx
->dev
, "%s: pipe = %d\n", __func__
, pipe
->ppl_id
);
835 /* If pipe is not started, do not try to stop the pipe in FW. */
836 if (pipe
->state
> SKL_PIPE_STARTED
) {
837 ret
= skl_set_pipe_state(ctx
, pipe
, PPL_PAUSED
);
839 dev_err(ctx
->dev
, "Failed to stop pipeline\n");
843 pipe
->state
= SKL_PIPE_PAUSED
;
845 /* If pipe was not created in FW, do not try to delete it */
846 if (pipe
->state
< SKL_PIPE_CREATED
)
849 ret
= skl_ipc_delete_pipeline(&ctx
->ipc
, pipe
->ppl_id
);
851 dev_err(ctx
->dev
, "Failed to delete pipeline\n");
853 pipe
->state
= SKL_PIPE_INVALID
;
860 * A pipeline is also a scheduling entity in DSP which can be run, stopped
861 * For processing data the pipe need to be run by sending IPC set pipe state
864 int skl_run_pipe(struct skl_sst
*ctx
, struct skl_pipe
*pipe
)
868 dev_dbg(ctx
->dev
, "%s: pipe = %d\n", __func__
, pipe
->ppl_id
);
870 /* If pipe was not created in FW, do not try to pause or delete */
871 if (pipe
->state
< SKL_PIPE_CREATED
)
874 /* Pipe has to be paused before it is started */
875 ret
= skl_set_pipe_state(ctx
, pipe
, PPL_PAUSED
);
877 dev_err(ctx
->dev
, "Failed to pause pipe\n");
881 pipe
->state
= SKL_PIPE_PAUSED
;
883 ret
= skl_set_pipe_state(ctx
, pipe
, PPL_RUNNING
);
885 dev_err(ctx
->dev
, "Failed to start pipe\n");
889 pipe
->state
= SKL_PIPE_STARTED
;
895 * Stop the pipeline by sending set pipe state IPC
896 * DSP doesnt implement stop so we always send pause message
898 int skl_stop_pipe(struct skl_sst
*ctx
, struct skl_pipe
*pipe
)
902 dev_dbg(ctx
->dev
, "In %s pipe=%d\n", __func__
, pipe
->ppl_id
);
904 /* If pipe was not created in FW, do not try to pause or delete */
905 if (pipe
->state
< SKL_PIPE_PAUSED
)
908 ret
= skl_set_pipe_state(ctx
, pipe
, PPL_PAUSED
);
910 dev_dbg(ctx
->dev
, "Failed to stop pipe\n");
914 pipe
->state
= SKL_PIPE_CREATED
;
919 /* Algo parameter set helper function */
920 int skl_set_module_params(struct skl_sst
*ctx
, u32
*params
, int size
,
921 u32 param_id
, struct skl_module_cfg
*mcfg
)
923 struct skl_ipc_large_config_msg msg
;
925 msg
.module_id
= mcfg
->id
.module_id
;
926 msg
.instance_id
= mcfg
->id
.instance_id
;
927 msg
.param_data_size
= size
;
928 msg
.large_param_id
= param_id
;
930 return skl_ipc_set_large_config(&ctx
->ipc
, &msg
, params
);
933 int skl_get_module_params(struct skl_sst
*ctx
, u32
*params
, int size
,
934 u32 param_id
, struct skl_module_cfg
*mcfg
)
936 struct skl_ipc_large_config_msg msg
;
938 msg
.module_id
= mcfg
->id
.module_id
;
939 msg
.instance_id
= mcfg
->id
.instance_id
;
940 msg
.param_data_size
= size
;
941 msg
.large_param_id
= param_id
;
943 return skl_ipc_get_large_config(&ctx
->ipc
, &msg
, params
);