Merge branch 'linux-4.12' of git://github.com/skeggsb/linux into drm-next
[sfrench/cifs-2.6.git] / sound / soc / intel / skylake / skl-topology.c
1 /*
2  *  skl-topology.c - Implements Platform component ALSA controls/widget
3  *  handlers.
4  *
5  *  Copyright (C) 2014-2015 Intel Corp
6  *  Author: Jeeja KP <jeeja.kp@intel.com>
7  *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as version 2, as
11  * published by the Free Software Foundation.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  */
18
19 #include <linux/slab.h>
20 #include <linux/types.h>
21 #include <linux/firmware.h>
22 #include <sound/soc.h>
23 #include <sound/soc-topology.h>
24 #include <uapi/sound/snd_sst_tokens.h>
25 #include "skl-sst-dsp.h"
26 #include "skl-sst-ipc.h"
27 #include "skl-topology.h"
28 #include "skl.h"
29 #include "skl-tplg-interface.h"
30 #include "../common/sst-dsp.h"
31 #include "../common/sst-dsp-priv.h"
32
33 #define SKL_CH_FIXUP_MASK               (1 << 0)
34 #define SKL_RATE_FIXUP_MASK             (1 << 1)
35 #define SKL_FMT_FIXUP_MASK              (1 << 2)
36 #define SKL_IN_DIR_BIT_MASK             BIT(0)
37 #define SKL_PIN_COUNT_MASK              GENMASK(7, 4)
38
39 void skl_tplg_d0i3_get(struct skl *skl, enum d0i3_capability caps)
40 {
41         struct skl_d0i3_data *d0i3 =  &skl->skl_sst->d0i3;
42
43         switch (caps) {
44         case SKL_D0I3_NONE:
45                 d0i3->non_d0i3++;
46                 break;
47
48         case SKL_D0I3_STREAMING:
49                 d0i3->streaming++;
50                 break;
51
52         case SKL_D0I3_NON_STREAMING:
53                 d0i3->non_streaming++;
54                 break;
55         }
56 }
57
58 void skl_tplg_d0i3_put(struct skl *skl, enum d0i3_capability caps)
59 {
60         struct skl_d0i3_data *d0i3 =  &skl->skl_sst->d0i3;
61
62         switch (caps) {
63         case SKL_D0I3_NONE:
64                 d0i3->non_d0i3--;
65                 break;
66
67         case SKL_D0I3_STREAMING:
68                 d0i3->streaming--;
69                 break;
70
71         case SKL_D0I3_NON_STREAMING:
72                 d0i3->non_streaming--;
73                 break;
74         }
75 }
76
77 /*
78  * SKL DSP driver modelling uses only few DAPM widgets so for rest we will
79  * ignore. This helpers checks if the SKL driver handles this widget type
80  */
81 static int is_skl_dsp_widget_type(struct snd_soc_dapm_widget *w)
82 {
83         switch (w->id) {
84         case snd_soc_dapm_dai_link:
85         case snd_soc_dapm_dai_in:
86         case snd_soc_dapm_aif_in:
87         case snd_soc_dapm_aif_out:
88         case snd_soc_dapm_dai_out:
89         case snd_soc_dapm_switch:
90                 return false;
91         default:
92                 return true;
93         }
94 }
95
96 /*
97  * Each pipelines needs memory to be allocated. Check if we have free memory
98  * from available pool.
99  */
100 static bool skl_is_pipe_mem_avail(struct skl *skl,
101                                 struct skl_module_cfg *mconfig)
102 {
103         struct skl_sst *ctx = skl->skl_sst;
104
105         if (skl->resource.mem + mconfig->pipe->memory_pages >
106                                 skl->resource.max_mem) {
107                 dev_err(ctx->dev,
108                                 "%s: module_id %d instance %d\n", __func__,
109                                 mconfig->id.module_id,
110                                 mconfig->id.instance_id);
111                 dev_err(ctx->dev,
112                                 "exceeds ppl memory available %d mem %d\n",
113                                 skl->resource.max_mem, skl->resource.mem);
114                 return false;
115         } else {
116                 return true;
117         }
118 }
119
120 /*
121  * Add the mem to the mem pool. This is freed when pipe is deleted.
122  * Note: DSP does actual memory management we only keep track for complete
123  * pool
124  */
125 static void skl_tplg_alloc_pipe_mem(struct skl *skl,
126                                 struct skl_module_cfg *mconfig)
127 {
128         skl->resource.mem += mconfig->pipe->memory_pages;
129 }
130
131 /*
132  * Pipeline needs needs DSP CPU resources for computation, this is
133  * quantified in MCPS (Million Clocks Per Second) required for module/pipe
134  *
135  * Each pipelines needs mcps to be allocated. Check if we have mcps for this
136  * pipe.
137  */
138
139 static bool skl_is_pipe_mcps_avail(struct skl *skl,
140                                 struct skl_module_cfg *mconfig)
141 {
142         struct skl_sst *ctx = skl->skl_sst;
143
144         if (skl->resource.mcps + mconfig->mcps > skl->resource.max_mcps) {
145                 dev_err(ctx->dev,
146                         "%s: module_id %d instance %d\n", __func__,
147                         mconfig->id.module_id, mconfig->id.instance_id);
148                 dev_err(ctx->dev,
149                         "exceeds ppl mcps available %d > mem %d\n",
150                         skl->resource.max_mcps, skl->resource.mcps);
151                 return false;
152         } else {
153                 return true;
154         }
155 }
156
157 static void skl_tplg_alloc_pipe_mcps(struct skl *skl,
158                                 struct skl_module_cfg *mconfig)
159 {
160         skl->resource.mcps += mconfig->mcps;
161 }
162
163 /*
164  * Free the mcps when tearing down
165  */
166 static void
167 skl_tplg_free_pipe_mcps(struct skl *skl, struct skl_module_cfg *mconfig)
168 {
169         skl->resource.mcps -= mconfig->mcps;
170 }
171
172 /*
173  * Free the memory when tearing down
174  */
175 static void
176 skl_tplg_free_pipe_mem(struct skl *skl, struct skl_module_cfg *mconfig)
177 {
178         skl->resource.mem -= mconfig->pipe->memory_pages;
179 }
180
181
182 static void skl_dump_mconfig(struct skl_sst *ctx,
183                                         struct skl_module_cfg *mcfg)
184 {
185         dev_dbg(ctx->dev, "Dumping config\n");
186         dev_dbg(ctx->dev, "Input Format:\n");
187         dev_dbg(ctx->dev, "channels = %d\n", mcfg->in_fmt[0].channels);
188         dev_dbg(ctx->dev, "s_freq = %d\n", mcfg->in_fmt[0].s_freq);
189         dev_dbg(ctx->dev, "ch_cfg = %d\n", mcfg->in_fmt[0].ch_cfg);
190         dev_dbg(ctx->dev, "valid bit depth = %d\n", mcfg->in_fmt[0].valid_bit_depth);
191         dev_dbg(ctx->dev, "Output Format:\n");
192         dev_dbg(ctx->dev, "channels = %d\n", mcfg->out_fmt[0].channels);
193         dev_dbg(ctx->dev, "s_freq = %d\n", mcfg->out_fmt[0].s_freq);
194         dev_dbg(ctx->dev, "valid bit depth = %d\n", mcfg->out_fmt[0].valid_bit_depth);
195         dev_dbg(ctx->dev, "ch_cfg = %d\n", mcfg->out_fmt[0].ch_cfg);
196 }
197
198 static void skl_tplg_update_chmap(struct skl_module_fmt *fmt, int chs)
199 {
200         int slot_map = 0xFFFFFFFF;
201         int start_slot = 0;
202         int i;
203
204         for (i = 0; i < chs; i++) {
205                 /*
206                  * For 2 channels with starting slot as 0, slot map will
207                  * look like 0xFFFFFF10.
208                  */
209                 slot_map &= (~(0xF << (4 * i)) | (start_slot << (4 * i)));
210                 start_slot++;
211         }
212         fmt->ch_map = slot_map;
213 }
214
215 static void skl_tplg_update_params(struct skl_module_fmt *fmt,
216                         struct skl_pipe_params *params, int fixup)
217 {
218         if (fixup & SKL_RATE_FIXUP_MASK)
219                 fmt->s_freq = params->s_freq;
220         if (fixup & SKL_CH_FIXUP_MASK) {
221                 fmt->channels = params->ch;
222                 skl_tplg_update_chmap(fmt, fmt->channels);
223         }
224         if (fixup & SKL_FMT_FIXUP_MASK) {
225                 fmt->valid_bit_depth = skl_get_bit_depth(params->s_fmt);
226
227                 /*
228                  * 16 bit is 16 bit container whereas 24 bit is in 32 bit
229                  * container so update bit depth accordingly
230                  */
231                 switch (fmt->valid_bit_depth) {
232                 case SKL_DEPTH_16BIT:
233                         fmt->bit_depth = fmt->valid_bit_depth;
234                         break;
235
236                 default:
237                         fmt->bit_depth = SKL_DEPTH_32BIT;
238                         break;
239                 }
240         }
241
242 }
243
244 /*
245  * A pipeline may have modules which impact the pcm parameters, like SRC,
246  * channel converter, format converter.
247  * We need to calculate the output params by applying the 'fixup'
248  * Topology will tell driver which type of fixup is to be applied by
249  * supplying the fixup mask, so based on that we calculate the output
250  *
251  * Now In FE the pcm hw_params is source/target format. Same is applicable
252  * for BE with its hw_params invoked.
253  * here based on FE, BE pipeline and direction we calculate the input and
254  * outfix and then apply that for a module
255  */
256 static void skl_tplg_update_params_fixup(struct skl_module_cfg *m_cfg,
257                 struct skl_pipe_params *params, bool is_fe)
258 {
259         int in_fixup, out_fixup;
260         struct skl_module_fmt *in_fmt, *out_fmt;
261
262         /* Fixups will be applied to pin 0 only */
263         in_fmt = &m_cfg->in_fmt[0];
264         out_fmt = &m_cfg->out_fmt[0];
265
266         if (params->stream == SNDRV_PCM_STREAM_PLAYBACK) {
267                 if (is_fe) {
268                         in_fixup = m_cfg->params_fixup;
269                         out_fixup = (~m_cfg->converter) &
270                                         m_cfg->params_fixup;
271                 } else {
272                         out_fixup = m_cfg->params_fixup;
273                         in_fixup = (~m_cfg->converter) &
274                                         m_cfg->params_fixup;
275                 }
276         } else {
277                 if (is_fe) {
278                         out_fixup = m_cfg->params_fixup;
279                         in_fixup = (~m_cfg->converter) &
280                                         m_cfg->params_fixup;
281                 } else {
282                         in_fixup = m_cfg->params_fixup;
283                         out_fixup = (~m_cfg->converter) &
284                                         m_cfg->params_fixup;
285                 }
286         }
287
288         skl_tplg_update_params(in_fmt, params, in_fixup);
289         skl_tplg_update_params(out_fmt, params, out_fixup);
290 }
291
292 /*
293  * A module needs input and output buffers, which are dependent upon pcm
294  * params, so once we have calculate params, we need buffer calculation as
295  * well.
296  */
297 static void skl_tplg_update_buffer_size(struct skl_sst *ctx,
298                                 struct skl_module_cfg *mcfg)
299 {
300         int multiplier = 1;
301         struct skl_module_fmt *in_fmt, *out_fmt;
302         int in_rate, out_rate;
303
304
305         /* Since fixups is applied to pin 0 only, ibs, obs needs
306          * change for pin 0 only
307          */
308         in_fmt = &mcfg->in_fmt[0];
309         out_fmt = &mcfg->out_fmt[0];
310
311         if (mcfg->m_type == SKL_MODULE_TYPE_SRCINT)
312                 multiplier = 5;
313
314         if (in_fmt->s_freq % 1000)
315                 in_rate = (in_fmt->s_freq / 1000) + 1;
316         else
317                 in_rate = (in_fmt->s_freq / 1000);
318
319         mcfg->ibs = in_rate * (mcfg->in_fmt->channels) *
320                         (mcfg->in_fmt->bit_depth >> 3) *
321                         multiplier;
322
323         if (mcfg->out_fmt->s_freq % 1000)
324                 out_rate = (mcfg->out_fmt->s_freq / 1000) + 1;
325         else
326                 out_rate = (mcfg->out_fmt->s_freq / 1000);
327
328         mcfg->obs = out_rate * (mcfg->out_fmt->channels) *
329                         (mcfg->out_fmt->bit_depth >> 3) *
330                         multiplier;
331 }
332
333 static u8 skl_tplg_be_dev_type(int dev_type)
334 {
335         int ret;
336
337         switch (dev_type) {
338         case SKL_DEVICE_BT:
339                 ret = NHLT_DEVICE_BT;
340                 break;
341
342         case SKL_DEVICE_DMIC:
343                 ret = NHLT_DEVICE_DMIC;
344                 break;
345
346         case SKL_DEVICE_I2S:
347                 ret = NHLT_DEVICE_I2S;
348                 break;
349
350         default:
351                 ret = NHLT_DEVICE_INVALID;
352                 break;
353         }
354
355         return ret;
356 }
357
358 static int skl_tplg_update_be_blob(struct snd_soc_dapm_widget *w,
359                                                 struct skl_sst *ctx)
360 {
361         struct skl_module_cfg *m_cfg = w->priv;
362         int link_type, dir;
363         u32 ch, s_freq, s_fmt;
364         struct nhlt_specific_cfg *cfg;
365         struct skl *skl = get_skl_ctx(ctx->dev);
366         u8 dev_type = skl_tplg_be_dev_type(m_cfg->dev_type);
367
368         /* check if we already have blob */
369         if (m_cfg->formats_config.caps_size > 0)
370                 return 0;
371
372         dev_dbg(ctx->dev, "Applying default cfg blob\n");
373         switch (m_cfg->dev_type) {
374         case SKL_DEVICE_DMIC:
375                 link_type = NHLT_LINK_DMIC;
376                 dir = SNDRV_PCM_STREAM_CAPTURE;
377                 s_freq = m_cfg->in_fmt[0].s_freq;
378                 s_fmt = m_cfg->in_fmt[0].bit_depth;
379                 ch = m_cfg->in_fmt[0].channels;
380                 break;
381
382         case SKL_DEVICE_I2S:
383                 link_type = NHLT_LINK_SSP;
384                 if (m_cfg->hw_conn_type == SKL_CONN_SOURCE) {
385                         dir = SNDRV_PCM_STREAM_PLAYBACK;
386                         s_freq = m_cfg->out_fmt[0].s_freq;
387                         s_fmt = m_cfg->out_fmt[0].bit_depth;
388                         ch = m_cfg->out_fmt[0].channels;
389                 } else {
390                         dir = SNDRV_PCM_STREAM_CAPTURE;
391                         s_freq = m_cfg->in_fmt[0].s_freq;
392                         s_fmt = m_cfg->in_fmt[0].bit_depth;
393                         ch = m_cfg->in_fmt[0].channels;
394                 }
395                 break;
396
397         default:
398                 return -EINVAL;
399         }
400
401         /* update the blob based on virtual bus_id and default params */
402         cfg = skl_get_ep_blob(skl, m_cfg->vbus_id, link_type,
403                                         s_fmt, ch, s_freq, dir, dev_type);
404         if (cfg) {
405                 m_cfg->formats_config.caps_size = cfg->size;
406                 m_cfg->formats_config.caps = (u32 *) &cfg->caps;
407         } else {
408                 dev_err(ctx->dev, "Blob NULL for id %x type %d dirn %d\n",
409                                         m_cfg->vbus_id, link_type, dir);
410                 dev_err(ctx->dev, "PCM: ch %d, freq %d, fmt %d\n",
411                                         ch, s_freq, s_fmt);
412                 return -EIO;
413         }
414
415         return 0;
416 }
417
418 static void skl_tplg_update_module_params(struct snd_soc_dapm_widget *w,
419                                                         struct skl_sst *ctx)
420 {
421         struct skl_module_cfg *m_cfg = w->priv;
422         struct skl_pipe_params *params = m_cfg->pipe->p_params;
423         int p_conn_type = m_cfg->pipe->conn_type;
424         bool is_fe;
425
426         if (!m_cfg->params_fixup)
427                 return;
428
429         dev_dbg(ctx->dev, "Mconfig for widget=%s BEFORE updation\n",
430                                 w->name);
431
432         skl_dump_mconfig(ctx, m_cfg);
433
434         if (p_conn_type == SKL_PIPE_CONN_TYPE_FE)
435                 is_fe = true;
436         else
437                 is_fe = false;
438
439         skl_tplg_update_params_fixup(m_cfg, params, is_fe);
440         skl_tplg_update_buffer_size(ctx, m_cfg);
441
442         dev_dbg(ctx->dev, "Mconfig for widget=%s AFTER updation\n",
443                                 w->name);
444
445         skl_dump_mconfig(ctx, m_cfg);
446 }
447
448 /*
449  * some modules can have multiple params set from user control and
450  * need to be set after module is initialized. If set_param flag is
451  * set module params will be done after module is initialised.
452  */
453 static int skl_tplg_set_module_params(struct snd_soc_dapm_widget *w,
454                                                 struct skl_sst *ctx)
455 {
456         int i, ret;
457         struct skl_module_cfg *mconfig = w->priv;
458         const struct snd_kcontrol_new *k;
459         struct soc_bytes_ext *sb;
460         struct skl_algo_data *bc;
461         struct skl_specific_cfg *sp_cfg;
462
463         if (mconfig->formats_config.caps_size > 0 &&
464                 mconfig->formats_config.set_params == SKL_PARAM_SET) {
465                 sp_cfg = &mconfig->formats_config;
466                 ret = skl_set_module_params(ctx, sp_cfg->caps,
467                                         sp_cfg->caps_size,
468                                         sp_cfg->param_id, mconfig);
469                 if (ret < 0)
470                         return ret;
471         }
472
473         for (i = 0; i < w->num_kcontrols; i++) {
474                 k = &w->kcontrol_news[i];
475                 if (k->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) {
476                         sb = (void *) k->private_value;
477                         bc = (struct skl_algo_data *)sb->dobj.private;
478
479                         if (bc->set_params == SKL_PARAM_SET) {
480                                 ret = skl_set_module_params(ctx,
481                                                 (u32 *)bc->params, bc->size,
482                                                 bc->param_id, mconfig);
483                                 if (ret < 0)
484                                         return ret;
485                         }
486                 }
487         }
488
489         return 0;
490 }
491
492 /*
493  * some module param can set from user control and this is required as
494  * when module is initailzed. if module param is required in init it is
495  * identifed by set_param flag. if set_param flag is not set, then this
496  * parameter needs to set as part of module init.
497  */
498 static int skl_tplg_set_module_init_data(struct snd_soc_dapm_widget *w)
499 {
500         const struct snd_kcontrol_new *k;
501         struct soc_bytes_ext *sb;
502         struct skl_algo_data *bc;
503         struct skl_module_cfg *mconfig = w->priv;
504         int i;
505
506         for (i = 0; i < w->num_kcontrols; i++) {
507                 k = &w->kcontrol_news[i];
508                 if (k->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) {
509                         sb = (struct soc_bytes_ext *)k->private_value;
510                         bc = (struct skl_algo_data *)sb->dobj.private;
511
512                         if (bc->set_params != SKL_PARAM_INIT)
513                                 continue;
514
515                         mconfig->formats_config.caps = (u32 *)bc->params;
516                         mconfig->formats_config.caps_size = bc->size;
517
518                         break;
519                 }
520         }
521
522         return 0;
523 }
524
525 static int skl_tplg_module_prepare(struct skl_sst *ctx, struct skl_pipe *pipe,
526                 struct snd_soc_dapm_widget *w, struct skl_module_cfg *mcfg)
527 {
528         switch (mcfg->dev_type) {
529         case SKL_DEVICE_HDAHOST:
530                 return skl_pcm_host_dma_prepare(ctx->dev, pipe->p_params);
531
532         case SKL_DEVICE_HDALINK:
533                 return skl_pcm_link_dma_prepare(ctx->dev, pipe->p_params);
534         }
535
536         return 0;
537 }
538
539 /*
540  * Inside a pipe instance, we can have various modules. These modules need
541  * to instantiated in DSP by invoking INIT_MODULE IPC, which is achieved by
542  * skl_init_module() routine, so invoke that for all modules in a pipeline
543  */
544 static int
545 skl_tplg_init_pipe_modules(struct skl *skl, struct skl_pipe *pipe)
546 {
547         struct skl_pipe_module *w_module;
548         struct snd_soc_dapm_widget *w;
549         struct skl_module_cfg *mconfig;
550         struct skl_sst *ctx = skl->skl_sst;
551         int ret = 0;
552
553         list_for_each_entry(w_module, &pipe->w_list, node) {
554                 w = w_module->w;
555                 mconfig = w->priv;
556
557                 /* check if module ids are populated */
558                 if (mconfig->id.module_id < 0) {
559                         dev_err(skl->skl_sst->dev,
560                                         "module %pUL id not populated\n",
561                                         (uuid_le *)mconfig->guid);
562                         return -EIO;
563                 }
564
565                 /* check resource available */
566                 if (!skl_is_pipe_mcps_avail(skl, mconfig))
567                         return -ENOMEM;
568
569                 if (mconfig->is_loadable && ctx->dsp->fw_ops.load_mod) {
570                         ret = ctx->dsp->fw_ops.load_mod(ctx->dsp,
571                                 mconfig->id.module_id, mconfig->guid);
572                         if (ret < 0)
573                                 return ret;
574
575                         mconfig->m_state = SKL_MODULE_LOADED;
576                 }
577
578                 /* prepare the DMA if the module is gateway cpr */
579                 ret = skl_tplg_module_prepare(ctx, pipe, w, mconfig);
580                 if (ret < 0)
581                         return ret;
582
583                 /* update blob if blob is null for be with default value */
584                 skl_tplg_update_be_blob(w, ctx);
585
586                 /*
587                  * apply fix/conversion to module params based on
588                  * FE/BE params
589                  */
590                 skl_tplg_update_module_params(w, ctx);
591                 mconfig->id.pvt_id = skl_get_pvt_id(ctx, mconfig);
592                 if (mconfig->id.pvt_id < 0)
593                         return ret;
594                 skl_tplg_set_module_init_data(w);
595                 ret = skl_init_module(ctx, mconfig);
596                 if (ret < 0) {
597                         skl_put_pvt_id(ctx, mconfig);
598                         return ret;
599                 }
600                 skl_tplg_alloc_pipe_mcps(skl, mconfig);
601                 ret = skl_tplg_set_module_params(w, ctx);
602                 if (ret < 0)
603                         return ret;
604         }
605
606         return 0;
607 }
608
609 static int skl_tplg_unload_pipe_modules(struct skl_sst *ctx,
610          struct skl_pipe *pipe)
611 {
612         int ret;
613         struct skl_pipe_module *w_module = NULL;
614         struct skl_module_cfg *mconfig = NULL;
615
616         list_for_each_entry(w_module, &pipe->w_list, node) {
617                 mconfig  = w_module->w->priv;
618
619                 if (mconfig->is_loadable && ctx->dsp->fw_ops.unload_mod &&
620                         mconfig->m_state > SKL_MODULE_UNINIT) {
621                         ret = ctx->dsp->fw_ops.unload_mod(ctx->dsp,
622                                                 mconfig->id.module_id);
623                         if (ret < 0)
624                                 return -EIO;
625                 }
626                 skl_put_pvt_id(ctx, mconfig);
627         }
628
629         /* no modules to unload in this path, so return */
630         return 0;
631 }
632
633 /*
634  * Mixer module represents a pipeline. So in the Pre-PMU event of mixer we
635  * need create the pipeline. So we do following:
636  *   - check the resources
637  *   - Create the pipeline
638  *   - Initialize the modules in pipeline
639  *   - finally bind all modules together
640  */
641 static int skl_tplg_mixer_dapm_pre_pmu_event(struct snd_soc_dapm_widget *w,
642                                                         struct skl *skl)
643 {
644         int ret;
645         struct skl_module_cfg *mconfig = w->priv;
646         struct skl_pipe_module *w_module;
647         struct skl_pipe *s_pipe = mconfig->pipe;
648         struct skl_module_cfg *src_module = NULL, *dst_module;
649         struct skl_sst *ctx = skl->skl_sst;
650
651         /* check resource available */
652         if (!skl_is_pipe_mcps_avail(skl, mconfig))
653                 return -EBUSY;
654
655         if (!skl_is_pipe_mem_avail(skl, mconfig))
656                 return -ENOMEM;
657
658         /*
659          * Create a list of modules for pipe.
660          * This list contains modules from source to sink
661          */
662         ret = skl_create_pipeline(ctx, mconfig->pipe);
663         if (ret < 0)
664                 return ret;
665
666         skl_tplg_alloc_pipe_mem(skl, mconfig);
667         skl_tplg_alloc_pipe_mcps(skl, mconfig);
668
669         /* Init all pipe modules from source to sink */
670         ret = skl_tplg_init_pipe_modules(skl, s_pipe);
671         if (ret < 0)
672                 return ret;
673
674         /* Bind modules from source to sink */
675         list_for_each_entry(w_module, &s_pipe->w_list, node) {
676                 dst_module = w_module->w->priv;
677
678                 if (src_module == NULL) {
679                         src_module = dst_module;
680                         continue;
681                 }
682
683                 ret = skl_bind_modules(ctx, src_module, dst_module);
684                 if (ret < 0)
685                         return ret;
686
687                 src_module = dst_module;
688         }
689
690         return 0;
691 }
692
693 static int skl_fill_sink_instance_id(struct skl_sst *ctx,
694                                 struct skl_algo_data *alg_data)
695 {
696         struct skl_kpb_params *params = (struct skl_kpb_params *)alg_data->params;
697         struct skl_mod_inst_map *inst;
698         int i, pvt_id;
699
700         inst = params->map;
701
702         for (i = 0; i < params->num_modules; i++) {
703                 pvt_id = skl_get_pvt_instance_id_map(ctx,
704                                         inst->mod_id, inst->inst_id);
705                 if (pvt_id < 0)
706                         return -EINVAL;
707                 inst->inst_id = pvt_id;
708                 inst++;
709         }
710         return 0;
711 }
712
713 /*
714  * Some modules require params to be set after the module is bound to
715  * all pins connected.
716  *
717  * The module provider initializes set_param flag for such modules and we
718  * send params after binding
719  */
720 static int skl_tplg_set_module_bind_params(struct snd_soc_dapm_widget *w,
721                         struct skl_module_cfg *mcfg, struct skl_sst *ctx)
722 {
723         int i, ret;
724         struct skl_module_cfg *mconfig = w->priv;
725         const struct snd_kcontrol_new *k;
726         struct soc_bytes_ext *sb;
727         struct skl_algo_data *bc;
728         struct skl_specific_cfg *sp_cfg;
729
730         /*
731          * check all out/in pins are in bind state.
732          * if so set the module param
733          */
734         for (i = 0; i < mcfg->max_out_queue; i++) {
735                 if (mcfg->m_out_pin[i].pin_state != SKL_PIN_BIND_DONE)
736                         return 0;
737         }
738
739         for (i = 0; i < mcfg->max_in_queue; i++) {
740                 if (mcfg->m_in_pin[i].pin_state != SKL_PIN_BIND_DONE)
741                         return 0;
742         }
743
744         if (mconfig->formats_config.caps_size > 0 &&
745                 mconfig->formats_config.set_params == SKL_PARAM_BIND) {
746                 sp_cfg = &mconfig->formats_config;
747                 ret = skl_set_module_params(ctx, sp_cfg->caps,
748                                         sp_cfg->caps_size,
749                                         sp_cfg->param_id, mconfig);
750                 if (ret < 0)
751                         return ret;
752         }
753
754         for (i = 0; i < w->num_kcontrols; i++) {
755                 k = &w->kcontrol_news[i];
756                 if (k->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) {
757                         sb = (void *) k->private_value;
758                         bc = (struct skl_algo_data *)sb->dobj.private;
759
760                         if (bc->set_params == SKL_PARAM_BIND) {
761                                 if (mconfig->m_type == SKL_MODULE_TYPE_KPB)
762                                         skl_fill_sink_instance_id(ctx, bc);
763                                 ret = skl_set_module_params(ctx,
764                                                 (u32 *)bc->params, bc->max,
765                                                 bc->param_id, mconfig);
766                                 if (ret < 0)
767                                         return ret;
768                         }
769                 }
770         }
771
772         return 0;
773 }
774
775 static int skl_tplg_bind_sinks(struct snd_soc_dapm_widget *w,
776                                 struct skl *skl,
777                                 struct snd_soc_dapm_widget *src_w,
778                                 struct skl_module_cfg *src_mconfig)
779 {
780         struct snd_soc_dapm_path *p;
781         struct snd_soc_dapm_widget *sink = NULL, *next_sink = NULL;
782         struct skl_module_cfg *sink_mconfig;
783         struct skl_sst *ctx = skl->skl_sst;
784         int ret;
785
786         snd_soc_dapm_widget_for_each_sink_path(w, p) {
787                 if (!p->connect)
788                         continue;
789
790                 dev_dbg(ctx->dev, "%s: src widget=%s\n", __func__, w->name);
791                 dev_dbg(ctx->dev, "%s: sink widget=%s\n", __func__, p->sink->name);
792
793                 next_sink = p->sink;
794
795                 if (!is_skl_dsp_widget_type(p->sink))
796                         return skl_tplg_bind_sinks(p->sink, skl, src_w, src_mconfig);
797
798                 /*
799                  * here we will check widgets in sink pipelines, so that
800                  * can be any widgets type and we are only interested if
801                  * they are ones used for SKL so check that first
802                  */
803                 if ((p->sink->priv != NULL) &&
804                                         is_skl_dsp_widget_type(p->sink)) {
805
806                         sink = p->sink;
807                         sink_mconfig = sink->priv;
808
809                         if (src_mconfig->m_state == SKL_MODULE_UNINIT ||
810                                 sink_mconfig->m_state == SKL_MODULE_UNINIT)
811                                 continue;
812
813                         /* Bind source to sink, mixin is always source */
814                         ret = skl_bind_modules(ctx, src_mconfig, sink_mconfig);
815                         if (ret)
816                                 return ret;
817
818                         /* set module params after bind */
819                         skl_tplg_set_module_bind_params(src_w, src_mconfig, ctx);
820                         skl_tplg_set_module_bind_params(sink, sink_mconfig, ctx);
821
822                         /* Start sinks pipe first */
823                         if (sink_mconfig->pipe->state != SKL_PIPE_STARTED) {
824                                 if (sink_mconfig->pipe->conn_type !=
825                                                         SKL_PIPE_CONN_TYPE_FE)
826                                         ret = skl_run_pipe(ctx,
827                                                         sink_mconfig->pipe);
828                                 if (ret)
829                                         return ret;
830                         }
831                 }
832         }
833
834         if (!sink)
835                 return skl_tplg_bind_sinks(next_sink, skl, src_w, src_mconfig);
836
837         return 0;
838 }
839
840 /*
841  * A PGA represents a module in a pipeline. So in the Pre-PMU event of PGA
842  * we need to do following:
843  *   - Bind to sink pipeline
844  *      Since the sink pipes can be running and we don't get mixer event on
845  *      connect for already running mixer, we need to find the sink pipes
846  *      here and bind to them. This way dynamic connect works.
847  *   - Start sink pipeline, if not running
848  *   - Then run current pipe
849  */
850 static int skl_tplg_pga_dapm_pre_pmu_event(struct snd_soc_dapm_widget *w,
851                                                                 struct skl *skl)
852 {
853         struct skl_module_cfg *src_mconfig;
854         struct skl_sst *ctx = skl->skl_sst;
855         int ret = 0;
856
857         src_mconfig = w->priv;
858
859         /*
860          * find which sink it is connected to, bind with the sink,
861          * if sink is not started, start sink pipe first, then start
862          * this pipe
863          */
864         ret = skl_tplg_bind_sinks(w, skl, w, src_mconfig);
865         if (ret)
866                 return ret;
867
868         /* Start source pipe last after starting all sinks */
869         if (src_mconfig->pipe->conn_type != SKL_PIPE_CONN_TYPE_FE)
870                 return skl_run_pipe(ctx, src_mconfig->pipe);
871
872         return 0;
873 }
874
875 static struct snd_soc_dapm_widget *skl_get_src_dsp_widget(
876                 struct snd_soc_dapm_widget *w, struct skl *skl)
877 {
878         struct snd_soc_dapm_path *p;
879         struct snd_soc_dapm_widget *src_w = NULL;
880         struct skl_sst *ctx = skl->skl_sst;
881
882         snd_soc_dapm_widget_for_each_source_path(w, p) {
883                 src_w = p->source;
884                 if (!p->connect)
885                         continue;
886
887                 dev_dbg(ctx->dev, "sink widget=%s\n", w->name);
888                 dev_dbg(ctx->dev, "src widget=%s\n", p->source->name);
889
890                 /*
891                  * here we will check widgets in sink pipelines, so that can
892                  * be any widgets type and we are only interested if they are
893                  * ones used for SKL so check that first
894                  */
895                 if ((p->source->priv != NULL) &&
896                                         is_skl_dsp_widget_type(p->source)) {
897                         return p->source;
898                 }
899         }
900
901         if (src_w != NULL)
902                 return skl_get_src_dsp_widget(src_w, skl);
903
904         return NULL;
905 }
906
907 /*
908  * in the Post-PMU event of mixer we need to do following:
909  *   - Check if this pipe is running
910  *   - if not, then
911  *      - bind this pipeline to its source pipeline
912  *        if source pipe is already running, this means it is a dynamic
913  *        connection and we need to bind only to that pipe
914  *      - start this pipeline
915  */
916 static int skl_tplg_mixer_dapm_post_pmu_event(struct snd_soc_dapm_widget *w,
917                                                         struct skl *skl)
918 {
919         int ret = 0;
920         struct snd_soc_dapm_widget *source, *sink;
921         struct skl_module_cfg *src_mconfig, *sink_mconfig;
922         struct skl_sst *ctx = skl->skl_sst;
923         int src_pipe_started = 0;
924
925         sink = w;
926         sink_mconfig = sink->priv;
927
928         /*
929          * If source pipe is already started, that means source is driving
930          * one more sink before this sink got connected, Since source is
931          * started, bind this sink to source and start this pipe.
932          */
933         source = skl_get_src_dsp_widget(w, skl);
934         if (source != NULL) {
935                 src_mconfig = source->priv;
936                 sink_mconfig = sink->priv;
937                 src_pipe_started = 1;
938
939                 /*
940                  * check pipe state, then no need to bind or start the
941                  * pipe
942                  */
943                 if (src_mconfig->pipe->state != SKL_PIPE_STARTED)
944                         src_pipe_started = 0;
945         }
946
947         if (src_pipe_started) {
948                 ret = skl_bind_modules(ctx, src_mconfig, sink_mconfig);
949                 if (ret)
950                         return ret;
951
952                 /* set module params after bind */
953                 skl_tplg_set_module_bind_params(source, src_mconfig, ctx);
954                 skl_tplg_set_module_bind_params(sink, sink_mconfig, ctx);
955
956                 if (sink_mconfig->pipe->conn_type != SKL_PIPE_CONN_TYPE_FE)
957                         ret = skl_run_pipe(ctx, sink_mconfig->pipe);
958         }
959
960         return ret;
961 }
962
963 /*
964  * in the Pre-PMD event of mixer we need to do following:
965  *   - Stop the pipe
966  *   - find the source connections and remove that from dapm_path_list
967  *   - unbind with source pipelines if still connected
968  */
969 static int skl_tplg_mixer_dapm_pre_pmd_event(struct snd_soc_dapm_widget *w,
970                                                         struct skl *skl)
971 {
972         struct skl_module_cfg *src_mconfig, *sink_mconfig;
973         int ret = 0, i;
974         struct skl_sst *ctx = skl->skl_sst;
975
976         sink_mconfig = w->priv;
977
978         /* Stop the pipe */
979         ret = skl_stop_pipe(ctx, sink_mconfig->pipe);
980         if (ret)
981                 return ret;
982
983         for (i = 0; i < sink_mconfig->max_in_queue; i++) {
984                 if (sink_mconfig->m_in_pin[i].pin_state == SKL_PIN_BIND_DONE) {
985                         src_mconfig = sink_mconfig->m_in_pin[i].tgt_mcfg;
986                         if (!src_mconfig)
987                                 continue;
988                         /*
989                          * If path_found == 1, that means pmd for source
990                          * pipe has not occurred, source is connected to
991                          * some other sink. so its responsibility of sink
992                          * to unbind itself from source.
993                          */
994                         ret = skl_stop_pipe(ctx, src_mconfig->pipe);
995                         if (ret < 0)
996                                 return ret;
997
998                         ret = skl_unbind_modules(ctx,
999                                                 src_mconfig, sink_mconfig);
1000                 }
1001         }
1002
1003         return ret;
1004 }
1005
1006 /*
1007  * in the Post-PMD event of mixer we need to do following:
1008  *   - Free the mcps used
1009  *   - Free the mem used
1010  *   - Unbind the modules within the pipeline
1011  *   - Delete the pipeline (modules are not required to be explicitly
1012  *     deleted, pipeline delete is enough here
1013  */
1014 static int skl_tplg_mixer_dapm_post_pmd_event(struct snd_soc_dapm_widget *w,
1015                                                         struct skl *skl)
1016 {
1017         struct skl_module_cfg *mconfig = w->priv;
1018         struct skl_pipe_module *w_module;
1019         struct skl_module_cfg *src_module = NULL, *dst_module;
1020         struct skl_sst *ctx = skl->skl_sst;
1021         struct skl_pipe *s_pipe = mconfig->pipe;
1022
1023         if (s_pipe->state == SKL_PIPE_INVALID)
1024                 return -EINVAL;
1025
1026         skl_tplg_free_pipe_mcps(skl, mconfig);
1027         skl_tplg_free_pipe_mem(skl, mconfig);
1028
1029         list_for_each_entry(w_module, &s_pipe->w_list, node) {
1030                 dst_module = w_module->w->priv;
1031
1032                 if (mconfig->m_state >= SKL_MODULE_INIT_DONE)
1033                         skl_tplg_free_pipe_mcps(skl, dst_module);
1034                 if (src_module == NULL) {
1035                         src_module = dst_module;
1036                         continue;
1037                 }
1038
1039                 skl_unbind_modules(ctx, src_module, dst_module);
1040                 src_module = dst_module;
1041         }
1042
1043         skl_delete_pipe(ctx, mconfig->pipe);
1044
1045         return skl_tplg_unload_pipe_modules(ctx, s_pipe);
1046 }
1047
1048 /*
1049  * in the Post-PMD event of PGA we need to do following:
1050  *   - Free the mcps used
1051  *   - Stop the pipeline
1052  *   - In source pipe is connected, unbind with source pipelines
1053  */
1054 static int skl_tplg_pga_dapm_post_pmd_event(struct snd_soc_dapm_widget *w,
1055                                                                 struct skl *skl)
1056 {
1057         struct skl_module_cfg *src_mconfig, *sink_mconfig;
1058         int ret = 0, i;
1059         struct skl_sst *ctx = skl->skl_sst;
1060
1061         src_mconfig = w->priv;
1062
1063         /* Stop the pipe since this is a mixin module */
1064         ret = skl_stop_pipe(ctx, src_mconfig->pipe);
1065         if (ret)
1066                 return ret;
1067
1068         for (i = 0; i < src_mconfig->max_out_queue; i++) {
1069                 if (src_mconfig->m_out_pin[i].pin_state == SKL_PIN_BIND_DONE) {
1070                         sink_mconfig = src_mconfig->m_out_pin[i].tgt_mcfg;
1071                         if (!sink_mconfig)
1072                                 continue;
1073                         /*
1074                          * This is a connecter and if path is found that means
1075                          * unbind between source and sink has not happened yet
1076                          */
1077                         ret = skl_unbind_modules(ctx, src_mconfig,
1078                                                         sink_mconfig);
1079                 }
1080         }
1081
1082         return ret;
1083 }
1084
1085 /*
1086  * In modelling, we assume there will be ONLY one mixer in a pipeline.  If
1087  * mixer is not required then it is treated as static mixer aka vmixer with
1088  * a hard path to source module
1089  * So we don't need to check if source is started or not as hard path puts
1090  * dependency on each other
1091  */
1092 static int skl_tplg_vmixer_event(struct snd_soc_dapm_widget *w,
1093                                 struct snd_kcontrol *k, int event)
1094 {
1095         struct snd_soc_dapm_context *dapm = w->dapm;
1096         struct skl *skl = get_skl_ctx(dapm->dev);
1097
1098         switch (event) {
1099         case SND_SOC_DAPM_PRE_PMU:
1100                 return skl_tplg_mixer_dapm_pre_pmu_event(w, skl);
1101
1102         case SND_SOC_DAPM_POST_PMU:
1103                 return skl_tplg_mixer_dapm_post_pmu_event(w, skl);
1104
1105         case SND_SOC_DAPM_PRE_PMD:
1106                 return skl_tplg_mixer_dapm_pre_pmd_event(w, skl);
1107
1108         case SND_SOC_DAPM_POST_PMD:
1109                 return skl_tplg_mixer_dapm_post_pmd_event(w, skl);
1110         }
1111
1112         return 0;
1113 }
1114
1115 /*
1116  * In modelling, we assume there will be ONLY one mixer in a pipeline. If a
1117  * second one is required that is created as another pipe entity.
1118  * The mixer is responsible for pipe management and represent a pipeline
1119  * instance
1120  */
1121 static int skl_tplg_mixer_event(struct snd_soc_dapm_widget *w,
1122                                 struct snd_kcontrol *k, int event)
1123 {
1124         struct snd_soc_dapm_context *dapm = w->dapm;
1125         struct skl *skl = get_skl_ctx(dapm->dev);
1126
1127         switch (event) {
1128         case SND_SOC_DAPM_PRE_PMU:
1129                 return skl_tplg_mixer_dapm_pre_pmu_event(w, skl);
1130
1131         case SND_SOC_DAPM_POST_PMU:
1132                 return skl_tplg_mixer_dapm_post_pmu_event(w, skl);
1133
1134         case SND_SOC_DAPM_PRE_PMD:
1135                 return skl_tplg_mixer_dapm_pre_pmd_event(w, skl);
1136
1137         case SND_SOC_DAPM_POST_PMD:
1138                 return skl_tplg_mixer_dapm_post_pmd_event(w, skl);
1139         }
1140
1141         return 0;
1142 }
1143
1144 /*
1145  * In modelling, we assumed rest of the modules in pipeline are PGA. But we
1146  * are interested in last PGA (leaf PGA) in a pipeline to disconnect with
1147  * the sink when it is running (two FE to one BE or one FE to two BE)
1148  * scenarios
1149  */
1150 static int skl_tplg_pga_event(struct snd_soc_dapm_widget *w,
1151                         struct snd_kcontrol *k, int event)
1152
1153 {
1154         struct snd_soc_dapm_context *dapm = w->dapm;
1155         struct skl *skl = get_skl_ctx(dapm->dev);
1156
1157         switch (event) {
1158         case SND_SOC_DAPM_PRE_PMU:
1159                 return skl_tplg_pga_dapm_pre_pmu_event(w, skl);
1160
1161         case SND_SOC_DAPM_POST_PMD:
1162                 return skl_tplg_pga_dapm_post_pmd_event(w, skl);
1163         }
1164
1165         return 0;
1166 }
1167
1168 static int skl_tplg_tlv_control_get(struct snd_kcontrol *kcontrol,
1169                         unsigned int __user *data, unsigned int size)
1170 {
1171         struct soc_bytes_ext *sb =
1172                         (struct soc_bytes_ext *)kcontrol->private_value;
1173         struct skl_algo_data *bc = (struct skl_algo_data *)sb->dobj.private;
1174         struct snd_soc_dapm_widget *w = snd_soc_dapm_kcontrol_widget(kcontrol);
1175         struct skl_module_cfg *mconfig = w->priv;
1176         struct skl *skl = get_skl_ctx(w->dapm->dev);
1177
1178         if (w->power)
1179                 skl_get_module_params(skl->skl_sst, (u32 *)bc->params,
1180                                       bc->size, bc->param_id, mconfig);
1181
1182         /* decrement size for TLV header */
1183         size -= 2 * sizeof(u32);
1184
1185         /* check size as we don't want to send kernel data */
1186         if (size > bc->max)
1187                 size = bc->max;
1188
1189         if (bc->params) {
1190                 if (copy_to_user(data, &bc->param_id, sizeof(u32)))
1191                         return -EFAULT;
1192                 if (copy_to_user(data + 1, &size, sizeof(u32)))
1193                         return -EFAULT;
1194                 if (copy_to_user(data + 2, bc->params, size))
1195                         return -EFAULT;
1196         }
1197
1198         return 0;
1199 }
1200
1201 #define SKL_PARAM_VENDOR_ID 0xff
1202
1203 static int skl_tplg_tlv_control_set(struct snd_kcontrol *kcontrol,
1204                         const unsigned int __user *data, unsigned int size)
1205 {
1206         struct snd_soc_dapm_widget *w = snd_soc_dapm_kcontrol_widget(kcontrol);
1207         struct skl_module_cfg *mconfig = w->priv;
1208         struct soc_bytes_ext *sb =
1209                         (struct soc_bytes_ext *)kcontrol->private_value;
1210         struct skl_algo_data *ac = (struct skl_algo_data *)sb->dobj.private;
1211         struct skl *skl = get_skl_ctx(w->dapm->dev);
1212
1213         if (ac->params) {
1214                 if (size > ac->max)
1215                         return -EINVAL;
1216
1217                 ac->size = size;
1218                 /*
1219                  * if the param_is is of type Vendor, firmware expects actual
1220                  * parameter id and size from the control.
1221                  */
1222                 if (ac->param_id == SKL_PARAM_VENDOR_ID) {
1223                         if (copy_from_user(ac->params, data, size))
1224                                 return -EFAULT;
1225                 } else {
1226                         if (copy_from_user(ac->params,
1227                                            data + 2, size))
1228                                 return -EFAULT;
1229                 }
1230
1231                 if (w->power)
1232                         return skl_set_module_params(skl->skl_sst,
1233                                                 (u32 *)ac->params, ac->size,
1234                                                 ac->param_id, mconfig);
1235         }
1236
1237         return 0;
1238 }
1239
1240 /*
1241  * Fill the dma id for host and link. In case of passthrough
1242  * pipeline, this will both host and link in the same
1243  * pipeline, so need to copy the link and host based on dev_type
1244  */
1245 static void skl_tplg_fill_dma_id(struct skl_module_cfg *mcfg,
1246                                 struct skl_pipe_params *params)
1247 {
1248         struct skl_pipe *pipe = mcfg->pipe;
1249
1250         if (pipe->passthru) {
1251                 switch (mcfg->dev_type) {
1252                 case SKL_DEVICE_HDALINK:
1253                         pipe->p_params->link_dma_id = params->link_dma_id;
1254                         pipe->p_params->link_index = params->link_index;
1255                         break;
1256
1257                 case SKL_DEVICE_HDAHOST:
1258                         pipe->p_params->host_dma_id = params->host_dma_id;
1259                         break;
1260
1261                 default:
1262                         break;
1263                 }
1264                 pipe->p_params->s_fmt = params->s_fmt;
1265                 pipe->p_params->ch = params->ch;
1266                 pipe->p_params->s_freq = params->s_freq;
1267                 pipe->p_params->stream = params->stream;
1268                 pipe->p_params->format = params->format;
1269
1270         } else {
1271                 memcpy(pipe->p_params, params, sizeof(*params));
1272         }
1273 }
1274
1275 /*
1276  * The FE params are passed by hw_params of the DAI.
1277  * On hw_params, the params are stored in Gateway module of the FE and we
1278  * need to calculate the format in DSP module configuration, that
1279  * conversion is done here
1280  */
1281 int skl_tplg_update_pipe_params(struct device *dev,
1282                         struct skl_module_cfg *mconfig,
1283                         struct skl_pipe_params *params)
1284 {
1285         struct skl_module_fmt *format = NULL;
1286
1287         skl_tplg_fill_dma_id(mconfig, params);
1288
1289         if (params->stream == SNDRV_PCM_STREAM_PLAYBACK)
1290                 format = &mconfig->in_fmt[0];
1291         else
1292                 format = &mconfig->out_fmt[0];
1293
1294         /* set the hw_params */
1295         format->s_freq = params->s_freq;
1296         format->channels = params->ch;
1297         format->valid_bit_depth = skl_get_bit_depth(params->s_fmt);
1298
1299         /*
1300          * 16 bit is 16 bit container whereas 24 bit is in 32 bit
1301          * container so update bit depth accordingly
1302          */
1303         switch (format->valid_bit_depth) {
1304         case SKL_DEPTH_16BIT:
1305                 format->bit_depth = format->valid_bit_depth;
1306                 break;
1307
1308         case SKL_DEPTH_24BIT:
1309         case SKL_DEPTH_32BIT:
1310                 format->bit_depth = SKL_DEPTH_32BIT;
1311                 break;
1312
1313         default:
1314                 dev_err(dev, "Invalid bit depth %x for pipe\n",
1315                                 format->valid_bit_depth);
1316                 return -EINVAL;
1317         }
1318
1319         if (params->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1320                 mconfig->ibs = (format->s_freq / 1000) *
1321                                 (format->channels) *
1322                                 (format->bit_depth >> 3);
1323         } else {
1324                 mconfig->obs = (format->s_freq / 1000) *
1325                                 (format->channels) *
1326                                 (format->bit_depth >> 3);
1327         }
1328
1329         return 0;
1330 }
1331
1332 /*
1333  * Query the module config for the FE DAI
1334  * This is used to find the hw_params set for that DAI and apply to FE
1335  * pipeline
1336  */
1337 struct skl_module_cfg *
1338 skl_tplg_fe_get_cpr_module(struct snd_soc_dai *dai, int stream)
1339 {
1340         struct snd_soc_dapm_widget *w;
1341         struct snd_soc_dapm_path *p = NULL;
1342
1343         if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
1344                 w = dai->playback_widget;
1345                 snd_soc_dapm_widget_for_each_sink_path(w, p) {
1346                         if (p->connect && p->sink->power &&
1347                                         !is_skl_dsp_widget_type(p->sink))
1348                                 continue;
1349
1350                         if (p->sink->priv) {
1351                                 dev_dbg(dai->dev, "set params for %s\n",
1352                                                 p->sink->name);
1353                                 return p->sink->priv;
1354                         }
1355                 }
1356         } else {
1357                 w = dai->capture_widget;
1358                 snd_soc_dapm_widget_for_each_source_path(w, p) {
1359                         if (p->connect && p->source->power &&
1360                                         !is_skl_dsp_widget_type(p->source))
1361                                 continue;
1362
1363                         if (p->source->priv) {
1364                                 dev_dbg(dai->dev, "set params for %s\n",
1365                                                 p->source->name);
1366                                 return p->source->priv;
1367                         }
1368                 }
1369         }
1370
1371         return NULL;
1372 }
1373
1374 static struct skl_module_cfg *skl_get_mconfig_pb_cpr(
1375                 struct snd_soc_dai *dai, struct snd_soc_dapm_widget *w)
1376 {
1377         struct snd_soc_dapm_path *p;
1378         struct skl_module_cfg *mconfig = NULL;
1379
1380         snd_soc_dapm_widget_for_each_source_path(w, p) {
1381                 if (w->endpoints[SND_SOC_DAPM_DIR_OUT] > 0) {
1382                         if (p->connect &&
1383                                     (p->sink->id == snd_soc_dapm_aif_out) &&
1384                                     p->source->priv) {
1385                                 mconfig = p->source->priv;
1386                                 return mconfig;
1387                         }
1388                         mconfig = skl_get_mconfig_pb_cpr(dai, p->source);
1389                         if (mconfig)
1390                                 return mconfig;
1391                 }
1392         }
1393         return mconfig;
1394 }
1395
1396 static struct skl_module_cfg *skl_get_mconfig_cap_cpr(
1397                 struct snd_soc_dai *dai, struct snd_soc_dapm_widget *w)
1398 {
1399         struct snd_soc_dapm_path *p;
1400         struct skl_module_cfg *mconfig = NULL;
1401
1402         snd_soc_dapm_widget_for_each_sink_path(w, p) {
1403                 if (w->endpoints[SND_SOC_DAPM_DIR_IN] > 0) {
1404                         if (p->connect &&
1405                                     (p->source->id == snd_soc_dapm_aif_in) &&
1406                                     p->sink->priv) {
1407                                 mconfig = p->sink->priv;
1408                                 return mconfig;
1409                         }
1410                         mconfig = skl_get_mconfig_cap_cpr(dai, p->sink);
1411                         if (mconfig)
1412                                 return mconfig;
1413                 }
1414         }
1415         return mconfig;
1416 }
1417
1418 struct skl_module_cfg *
1419 skl_tplg_be_get_cpr_module(struct snd_soc_dai *dai, int stream)
1420 {
1421         struct snd_soc_dapm_widget *w;
1422         struct skl_module_cfg *mconfig;
1423
1424         if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
1425                 w = dai->playback_widget;
1426                 mconfig = skl_get_mconfig_pb_cpr(dai, w);
1427         } else {
1428                 w = dai->capture_widget;
1429                 mconfig = skl_get_mconfig_cap_cpr(dai, w);
1430         }
1431         return mconfig;
1432 }
1433
1434 static u8 skl_tplg_be_link_type(int dev_type)
1435 {
1436         int ret;
1437
1438         switch (dev_type) {
1439         case SKL_DEVICE_BT:
1440                 ret = NHLT_LINK_SSP;
1441                 break;
1442
1443         case SKL_DEVICE_DMIC:
1444                 ret = NHLT_LINK_DMIC;
1445                 break;
1446
1447         case SKL_DEVICE_I2S:
1448                 ret = NHLT_LINK_SSP;
1449                 break;
1450
1451         case SKL_DEVICE_HDALINK:
1452                 ret = NHLT_LINK_HDA;
1453                 break;
1454
1455         default:
1456                 ret = NHLT_LINK_INVALID;
1457                 break;
1458         }
1459
1460         return ret;
1461 }
1462
1463 /*
1464  * Fill the BE gateway parameters
1465  * The BE gateway expects a blob of parameters which are kept in the ACPI
1466  * NHLT blob, so query the blob for interface type (i2s/pdm) and instance.
1467  * The port can have multiple settings so pick based on the PCM
1468  * parameters
1469  */
1470 static int skl_tplg_be_fill_pipe_params(struct snd_soc_dai *dai,
1471                                 struct skl_module_cfg *mconfig,
1472                                 struct skl_pipe_params *params)
1473 {
1474         struct nhlt_specific_cfg *cfg;
1475         struct skl *skl = get_skl_ctx(dai->dev);
1476         int link_type = skl_tplg_be_link_type(mconfig->dev_type);
1477         u8 dev_type = skl_tplg_be_dev_type(mconfig->dev_type);
1478
1479         skl_tplg_fill_dma_id(mconfig, params);
1480
1481         if (link_type == NHLT_LINK_HDA)
1482                 return 0;
1483
1484         /* update the blob based on virtual bus_id*/
1485         cfg = skl_get_ep_blob(skl, mconfig->vbus_id, link_type,
1486                                         params->s_fmt, params->ch,
1487                                         params->s_freq, params->stream,
1488                                         dev_type);
1489         if (cfg) {
1490                 mconfig->formats_config.caps_size = cfg->size;
1491                 mconfig->formats_config.caps = (u32 *) &cfg->caps;
1492         } else {
1493                 dev_err(dai->dev, "Blob NULL for id %x type %d dirn %d\n",
1494                                         mconfig->vbus_id, link_type,
1495                                         params->stream);
1496                 dev_err(dai->dev, "PCM: ch %d, freq %d, fmt %d\n",
1497                                  params->ch, params->s_freq, params->s_fmt);
1498                 return -EINVAL;
1499         }
1500
1501         return 0;
1502 }
1503
1504 static int skl_tplg_be_set_src_pipe_params(struct snd_soc_dai *dai,
1505                                 struct snd_soc_dapm_widget *w,
1506                                 struct skl_pipe_params *params)
1507 {
1508         struct snd_soc_dapm_path *p;
1509         int ret = -EIO;
1510
1511         snd_soc_dapm_widget_for_each_source_path(w, p) {
1512                 if (p->connect && is_skl_dsp_widget_type(p->source) &&
1513                                                 p->source->priv) {
1514
1515                         ret = skl_tplg_be_fill_pipe_params(dai,
1516                                                 p->source->priv, params);
1517                         if (ret < 0)
1518                                 return ret;
1519                 } else {
1520                         ret = skl_tplg_be_set_src_pipe_params(dai,
1521                                                 p->source, params);
1522                         if (ret < 0)
1523                                 return ret;
1524                 }
1525         }
1526
1527         return ret;
1528 }
1529
1530 static int skl_tplg_be_set_sink_pipe_params(struct snd_soc_dai *dai,
1531         struct snd_soc_dapm_widget *w, struct skl_pipe_params *params)
1532 {
1533         struct snd_soc_dapm_path *p = NULL;
1534         int ret = -EIO;
1535
1536         snd_soc_dapm_widget_for_each_sink_path(w, p) {
1537                 if (p->connect && is_skl_dsp_widget_type(p->sink) &&
1538                                                 p->sink->priv) {
1539
1540                         ret = skl_tplg_be_fill_pipe_params(dai,
1541                                                 p->sink->priv, params);
1542                         if (ret < 0)
1543                                 return ret;
1544                 } else {
1545                         ret = skl_tplg_be_set_sink_pipe_params(
1546                                                 dai, p->sink, params);
1547                         if (ret < 0)
1548                                 return ret;
1549                 }
1550         }
1551
1552         return ret;
1553 }
1554
1555 /*
1556  * BE hw_params can be a source parameters (capture) or sink parameters
1557  * (playback). Based on sink and source we need to either find the source
1558  * list or the sink list and set the pipeline parameters
1559  */
1560 int skl_tplg_be_update_params(struct snd_soc_dai *dai,
1561                                 struct skl_pipe_params *params)
1562 {
1563         struct snd_soc_dapm_widget *w;
1564
1565         if (params->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1566                 w = dai->playback_widget;
1567
1568                 return skl_tplg_be_set_src_pipe_params(dai, w, params);
1569
1570         } else {
1571                 w = dai->capture_widget;
1572
1573                 return skl_tplg_be_set_sink_pipe_params(dai, w, params);
1574         }
1575
1576         return 0;
1577 }
1578
1579 static const struct snd_soc_tplg_widget_events skl_tplg_widget_ops[] = {
1580         {SKL_MIXER_EVENT, skl_tplg_mixer_event},
1581         {SKL_VMIXER_EVENT, skl_tplg_vmixer_event},
1582         {SKL_PGA_EVENT, skl_tplg_pga_event},
1583 };
1584
1585 static const struct snd_soc_tplg_bytes_ext_ops skl_tlv_ops[] = {
1586         {SKL_CONTROL_TYPE_BYTE_TLV, skl_tplg_tlv_control_get,
1587                                         skl_tplg_tlv_control_set},
1588 };
1589
1590 static int skl_tplg_fill_pipe_tkn(struct device *dev,
1591                         struct skl_pipe *pipe, u32 tkn,
1592                         u32 tkn_val)
1593 {
1594
1595         switch (tkn) {
1596         case SKL_TKN_U32_PIPE_CONN_TYPE:
1597                 pipe->conn_type = tkn_val;
1598                 break;
1599
1600         case SKL_TKN_U32_PIPE_PRIORITY:
1601                 pipe->pipe_priority = tkn_val;
1602                 break;
1603
1604         case SKL_TKN_U32_PIPE_MEM_PGS:
1605                 pipe->memory_pages = tkn_val;
1606                 break;
1607
1608         case SKL_TKN_U32_PMODE:
1609                 pipe->lp_mode = tkn_val;
1610                 break;
1611
1612         default:
1613                 dev_err(dev, "Token not handled %d\n", tkn);
1614                 return -EINVAL;
1615         }
1616
1617         return 0;
1618 }
1619
1620 /*
1621  * Add pipeline by parsing the relevant tokens
1622  * Return an existing pipe if the pipe already exists.
1623  */
1624 static int skl_tplg_add_pipe(struct device *dev,
1625                 struct skl_module_cfg *mconfig, struct skl *skl,
1626                 struct snd_soc_tplg_vendor_value_elem *tkn_elem)
1627 {
1628         struct skl_pipeline *ppl;
1629         struct skl_pipe *pipe;
1630         struct skl_pipe_params *params;
1631
1632         list_for_each_entry(ppl, &skl->ppl_list, node) {
1633                 if (ppl->pipe->ppl_id == tkn_elem->value) {
1634                         mconfig->pipe = ppl->pipe;
1635                         return EEXIST;
1636                 }
1637         }
1638
1639         ppl = devm_kzalloc(dev, sizeof(*ppl), GFP_KERNEL);
1640         if (!ppl)
1641                 return -ENOMEM;
1642
1643         pipe = devm_kzalloc(dev, sizeof(*pipe), GFP_KERNEL);
1644         if (!pipe)
1645                 return -ENOMEM;
1646
1647         params = devm_kzalloc(dev, sizeof(*params), GFP_KERNEL);
1648         if (!params)
1649                 return -ENOMEM;
1650
1651         pipe->p_params = params;
1652         pipe->ppl_id = tkn_elem->value;
1653         INIT_LIST_HEAD(&pipe->w_list);
1654
1655         ppl->pipe = pipe;
1656         list_add(&ppl->node, &skl->ppl_list);
1657
1658         mconfig->pipe = pipe;
1659         mconfig->pipe->state = SKL_PIPE_INVALID;
1660
1661         return 0;
1662 }
1663
1664 static int skl_tplg_fill_pin(struct device *dev, u32 tkn,
1665                         struct skl_module_pin *m_pin,
1666                         int pin_index, u32 value)
1667 {
1668         switch (tkn) {
1669         case SKL_TKN_U32_PIN_MOD_ID:
1670                 m_pin[pin_index].id.module_id = value;
1671                 break;
1672
1673         case SKL_TKN_U32_PIN_INST_ID:
1674                 m_pin[pin_index].id.instance_id = value;
1675                 break;
1676
1677         default:
1678                 dev_err(dev, "%d Not a pin token\n", value);
1679                 return -EINVAL;
1680         }
1681
1682         return 0;
1683 }
1684
1685 /*
1686  * Parse for pin config specific tokens to fill up the
1687  * module private data
1688  */
1689 static int skl_tplg_fill_pins_info(struct device *dev,
1690                 struct skl_module_cfg *mconfig,
1691                 struct snd_soc_tplg_vendor_value_elem *tkn_elem,
1692                 int dir, int pin_count)
1693 {
1694         int ret;
1695         struct skl_module_pin *m_pin;
1696
1697         switch (dir) {
1698         case SKL_DIR_IN:
1699                 m_pin = mconfig->m_in_pin;
1700                 break;
1701
1702         case SKL_DIR_OUT:
1703                 m_pin = mconfig->m_out_pin;
1704                 break;
1705
1706         default:
1707                 dev_err(dev, "Invalid direction value\n");
1708                 return -EINVAL;
1709         }
1710
1711         ret = skl_tplg_fill_pin(dev, tkn_elem->token,
1712                         m_pin, pin_count, tkn_elem->value);
1713
1714         if (ret < 0)
1715                 return ret;
1716
1717         m_pin[pin_count].in_use = false;
1718         m_pin[pin_count].pin_state = SKL_PIN_UNBIND;
1719
1720         return 0;
1721 }
1722
1723 /*
1724  * Fill up input/output module config format based
1725  * on the direction
1726  */
1727 static int skl_tplg_fill_fmt(struct device *dev,
1728                 struct skl_module_cfg *mconfig, u32 tkn,
1729                 u32 value, u32 dir, u32 pin_count)
1730 {
1731         struct skl_module_fmt *dst_fmt;
1732
1733         switch (dir) {
1734         case SKL_DIR_IN:
1735                 dst_fmt = mconfig->in_fmt;
1736                 dst_fmt += pin_count;
1737                 break;
1738
1739         case SKL_DIR_OUT:
1740                 dst_fmt = mconfig->out_fmt;
1741                 dst_fmt += pin_count;
1742                 break;
1743
1744         default:
1745                 dev_err(dev, "Invalid direction value\n");
1746                 return -EINVAL;
1747         }
1748
1749         switch (tkn) {
1750         case SKL_TKN_U32_FMT_CH:
1751                 dst_fmt->channels  = value;
1752                 break;
1753
1754         case SKL_TKN_U32_FMT_FREQ:
1755                 dst_fmt->s_freq = value;
1756                 break;
1757
1758         case SKL_TKN_U32_FMT_BIT_DEPTH:
1759                 dst_fmt->bit_depth = value;
1760                 break;
1761
1762         case SKL_TKN_U32_FMT_SAMPLE_SIZE:
1763                 dst_fmt->valid_bit_depth = value;
1764                 break;
1765
1766         case SKL_TKN_U32_FMT_CH_CONFIG:
1767                 dst_fmt->ch_cfg = value;
1768                 break;
1769
1770         case SKL_TKN_U32_FMT_INTERLEAVE:
1771                 dst_fmt->interleaving_style = value;
1772                 break;
1773
1774         case SKL_TKN_U32_FMT_SAMPLE_TYPE:
1775                 dst_fmt->sample_type = value;
1776                 break;
1777
1778         case SKL_TKN_U32_FMT_CH_MAP:
1779                 dst_fmt->ch_map = value;
1780                 break;
1781
1782         default:
1783                 dev_err(dev, "Invalid token %d\n", tkn);
1784                 return -EINVAL;
1785         }
1786
1787         return 0;
1788 }
1789
1790 static int skl_tplg_get_uuid(struct device *dev, struct skl_module_cfg *mconfig,
1791               struct snd_soc_tplg_vendor_uuid_elem *uuid_tkn)
1792 {
1793         if (uuid_tkn->token == SKL_TKN_UUID)
1794                 memcpy(&mconfig->guid, &uuid_tkn->uuid, 16);
1795         else {
1796                 dev_err(dev, "Not an UUID token tkn %d\n", uuid_tkn->token);
1797                 return -EINVAL;
1798         }
1799
1800         return 0;
1801 }
1802
1803 static void skl_tplg_fill_pin_dynamic_val(
1804                 struct skl_module_pin *mpin, u32 pin_count, u32 value)
1805 {
1806         int i;
1807
1808         for (i = 0; i < pin_count; i++)
1809                 mpin[i].is_dynamic = value;
1810 }
1811
1812 /*
1813  * Parse tokens to fill up the module private data
1814  */
1815 static int skl_tplg_get_token(struct device *dev,
1816                 struct snd_soc_tplg_vendor_value_elem *tkn_elem,
1817                 struct skl *skl, struct skl_module_cfg *mconfig)
1818 {
1819         int tkn_count = 0;
1820         int ret;
1821         static int is_pipe_exists;
1822         static int pin_index, dir;
1823
1824         if (tkn_elem->token > SKL_TKN_MAX)
1825                 return -EINVAL;
1826
1827         switch (tkn_elem->token) {
1828         case SKL_TKN_U8_IN_QUEUE_COUNT:
1829                 mconfig->max_in_queue = tkn_elem->value;
1830                 mconfig->m_in_pin = devm_kzalloc(dev, mconfig->max_in_queue *
1831                                         sizeof(*mconfig->m_in_pin),
1832                                         GFP_KERNEL);
1833                 if (!mconfig->m_in_pin)
1834                         return -ENOMEM;
1835
1836                 break;
1837
1838         case SKL_TKN_U8_OUT_QUEUE_COUNT:
1839                 mconfig->max_out_queue = tkn_elem->value;
1840                 mconfig->m_out_pin = devm_kzalloc(dev, mconfig->max_out_queue *
1841                                         sizeof(*mconfig->m_out_pin),
1842                                         GFP_KERNEL);
1843
1844                 if (!mconfig->m_out_pin)
1845                         return -ENOMEM;
1846
1847                 break;
1848
1849         case SKL_TKN_U8_DYN_IN_PIN:
1850                 if (!mconfig->m_in_pin)
1851                         return -ENOMEM;
1852
1853                 skl_tplg_fill_pin_dynamic_val(mconfig->m_in_pin,
1854                         mconfig->max_in_queue, tkn_elem->value);
1855
1856                 break;
1857
1858         case SKL_TKN_U8_DYN_OUT_PIN:
1859                 if (!mconfig->m_out_pin)
1860                         return -ENOMEM;
1861
1862                 skl_tplg_fill_pin_dynamic_val(mconfig->m_out_pin,
1863                         mconfig->max_out_queue, tkn_elem->value);
1864
1865                 break;
1866
1867         case SKL_TKN_U8_TIME_SLOT:
1868                 mconfig->time_slot = tkn_elem->value;
1869                 break;
1870
1871         case SKL_TKN_U8_CORE_ID:
1872                 mconfig->core_id = tkn_elem->value;
1873
1874         case SKL_TKN_U8_MOD_TYPE:
1875                 mconfig->m_type = tkn_elem->value;
1876                 break;
1877
1878         case SKL_TKN_U8_DEV_TYPE:
1879                 mconfig->dev_type = tkn_elem->value;
1880                 break;
1881
1882         case SKL_TKN_U8_HW_CONN_TYPE:
1883                 mconfig->hw_conn_type = tkn_elem->value;
1884                 break;
1885
1886         case SKL_TKN_U16_MOD_INST_ID:
1887                 mconfig->id.instance_id =
1888                 tkn_elem->value;
1889                 break;
1890
1891         case SKL_TKN_U32_MEM_PAGES:
1892                 mconfig->mem_pages = tkn_elem->value;
1893                 break;
1894
1895         case SKL_TKN_U32_MAX_MCPS:
1896                 mconfig->mcps = tkn_elem->value;
1897                 break;
1898
1899         case SKL_TKN_U32_OBS:
1900                 mconfig->obs = tkn_elem->value;
1901                 break;
1902
1903         case SKL_TKN_U32_IBS:
1904                 mconfig->ibs = tkn_elem->value;
1905                 break;
1906
1907         case SKL_TKN_U32_VBUS_ID:
1908                 mconfig->vbus_id = tkn_elem->value;
1909                 break;
1910
1911         case SKL_TKN_U32_PARAMS_FIXUP:
1912                 mconfig->params_fixup = tkn_elem->value;
1913                 break;
1914
1915         case SKL_TKN_U32_CONVERTER:
1916                 mconfig->converter = tkn_elem->value;
1917                 break;
1918
1919         case SKL_TKL_U32_D0I3_CAPS:
1920                 mconfig->d0i3_caps = tkn_elem->value;
1921                 break;
1922
1923         case SKL_TKN_U32_PIPE_ID:
1924                 ret = skl_tplg_add_pipe(dev,
1925                                 mconfig, skl, tkn_elem);
1926
1927                 if (ret < 0)
1928                         return is_pipe_exists;
1929
1930                 if (ret == EEXIST)
1931                         is_pipe_exists = 1;
1932
1933                 break;
1934
1935         case SKL_TKN_U32_PIPE_CONN_TYPE:
1936         case SKL_TKN_U32_PIPE_PRIORITY:
1937         case SKL_TKN_U32_PIPE_MEM_PGS:
1938         case SKL_TKN_U32_PMODE:
1939                 if (is_pipe_exists) {
1940                         ret = skl_tplg_fill_pipe_tkn(dev, mconfig->pipe,
1941                                         tkn_elem->token, tkn_elem->value);
1942                         if (ret < 0)
1943                                 return ret;
1944                 }
1945
1946                 break;
1947
1948         /*
1949          * SKL_TKN_U32_DIR_PIN_COUNT token has the value for both
1950          * direction and the pin count. The first four bits represent
1951          * direction and next four the pin count.
1952          */
1953         case SKL_TKN_U32_DIR_PIN_COUNT:
1954                 dir = tkn_elem->value & SKL_IN_DIR_BIT_MASK;
1955                 pin_index = (tkn_elem->value &
1956                         SKL_PIN_COUNT_MASK) >> 4;
1957
1958                 break;
1959
1960         case SKL_TKN_U32_FMT_CH:
1961         case SKL_TKN_U32_FMT_FREQ:
1962         case SKL_TKN_U32_FMT_BIT_DEPTH:
1963         case SKL_TKN_U32_FMT_SAMPLE_SIZE:
1964         case SKL_TKN_U32_FMT_CH_CONFIG:
1965         case SKL_TKN_U32_FMT_INTERLEAVE:
1966         case SKL_TKN_U32_FMT_SAMPLE_TYPE:
1967         case SKL_TKN_U32_FMT_CH_MAP:
1968                 ret = skl_tplg_fill_fmt(dev, mconfig, tkn_elem->token,
1969                                 tkn_elem->value, dir, pin_index);
1970
1971                 if (ret < 0)
1972                         return ret;
1973
1974                 break;
1975
1976         case SKL_TKN_U32_PIN_MOD_ID:
1977         case SKL_TKN_U32_PIN_INST_ID:
1978                 ret = skl_tplg_fill_pins_info(dev,
1979                                 mconfig, tkn_elem, dir,
1980                                 pin_index);
1981                 if (ret < 0)
1982                         return ret;
1983
1984                 break;
1985
1986         case SKL_TKN_U32_CAPS_SIZE:
1987                 mconfig->formats_config.caps_size =
1988                         tkn_elem->value;
1989
1990                 break;
1991
1992         case SKL_TKN_U32_PROC_DOMAIN:
1993                 mconfig->domain =
1994                         tkn_elem->value;
1995
1996                 break;
1997
1998         case SKL_TKN_U8_IN_PIN_TYPE:
1999         case SKL_TKN_U8_OUT_PIN_TYPE:
2000         case SKL_TKN_U8_CONN_TYPE:
2001                 break;
2002
2003         default:
2004                 dev_err(dev, "Token %d not handled\n",
2005                                 tkn_elem->token);
2006                 return -EINVAL;
2007         }
2008
2009         tkn_count++;
2010
2011         return tkn_count;
2012 }
2013
2014 /*
2015  * Parse the vendor array for specific tokens to construct
2016  * module private data
2017  */
2018 static int skl_tplg_get_tokens(struct device *dev,
2019                 char *pvt_data, struct skl *skl,
2020                 struct skl_module_cfg *mconfig, int block_size)
2021 {
2022         struct snd_soc_tplg_vendor_array *array;
2023         struct snd_soc_tplg_vendor_value_elem *tkn_elem;
2024         int tkn_count = 0, ret;
2025         int off = 0, tuple_size = 0;
2026
2027         if (block_size <= 0)
2028                 return -EINVAL;
2029
2030         while (tuple_size < block_size) {
2031                 array = (struct snd_soc_tplg_vendor_array *)(pvt_data + off);
2032
2033                 off += array->size;
2034
2035                 switch (array->type) {
2036                 case SND_SOC_TPLG_TUPLE_TYPE_STRING:
2037                         dev_warn(dev, "no string tokens expected for skl tplg\n");
2038                         continue;
2039
2040                 case SND_SOC_TPLG_TUPLE_TYPE_UUID:
2041                         ret = skl_tplg_get_uuid(dev, mconfig, array->uuid);
2042                         if (ret < 0)
2043                                 return ret;
2044
2045                         tuple_size += sizeof(*array->uuid);
2046
2047                         continue;
2048
2049                 default:
2050                         tkn_elem = array->value;
2051                         tkn_count = 0;
2052                         break;
2053                 }
2054
2055                 while (tkn_count <= (array->num_elems - 1)) {
2056                         ret = skl_tplg_get_token(dev, tkn_elem,
2057                                         skl, mconfig);
2058
2059                         if (ret < 0)
2060                                 return ret;
2061
2062                         tkn_count = tkn_count + ret;
2063                         tkn_elem++;
2064                 }
2065
2066                 tuple_size += tkn_count * sizeof(*tkn_elem);
2067         }
2068
2069         return 0;
2070 }
2071
2072 /*
2073  * Every data block is preceded by a descriptor to read the number
2074  * of data blocks, they type of the block and it's size
2075  */
2076 static int skl_tplg_get_desc_blocks(struct device *dev,
2077                 struct snd_soc_tplg_vendor_array *array)
2078 {
2079         struct snd_soc_tplg_vendor_value_elem *tkn_elem;
2080
2081         tkn_elem = array->value;
2082
2083         switch (tkn_elem->token) {
2084         case SKL_TKN_U8_NUM_BLOCKS:
2085         case SKL_TKN_U8_BLOCK_TYPE:
2086         case SKL_TKN_U16_BLOCK_SIZE:
2087                 return tkn_elem->value;
2088
2089         default:
2090                 dev_err(dev, "Invalid descriptor token %d\n", tkn_elem->token);
2091                 break;
2092         }
2093
2094         return -EINVAL;
2095 }
2096
2097 /*
2098  * Parse the private data for the token and corresponding value.
2099  * The private data can have multiple data blocks. So, a data block
2100  * is preceded by a descriptor for number of blocks and a descriptor
2101  * for the type and size of the suceeding data block.
2102  */
2103 static int skl_tplg_get_pvt_data(struct snd_soc_tplg_dapm_widget *tplg_w,
2104                                 struct skl *skl, struct device *dev,
2105                                 struct skl_module_cfg *mconfig)
2106 {
2107         struct snd_soc_tplg_vendor_array *array;
2108         int num_blocks, block_size = 0, block_type, off = 0;
2109         char *data;
2110         int ret;
2111
2112         /* Read the NUM_DATA_BLOCKS descriptor */
2113         array = (struct snd_soc_tplg_vendor_array *)tplg_w->priv.data;
2114         ret = skl_tplg_get_desc_blocks(dev, array);
2115         if (ret < 0)
2116                 return ret;
2117         num_blocks = ret;
2118
2119         off += array->size;
2120         array = (struct snd_soc_tplg_vendor_array *)(tplg_w->priv.data + off);
2121
2122         /* Read the BLOCK_TYPE and BLOCK_SIZE descriptor */
2123         while (num_blocks > 0) {
2124                 ret = skl_tplg_get_desc_blocks(dev, array);
2125
2126                 if (ret < 0)
2127                         return ret;
2128                 block_type = ret;
2129                 off += array->size;
2130
2131                 array = (struct snd_soc_tplg_vendor_array *)
2132                         (tplg_w->priv.data + off);
2133
2134                 ret = skl_tplg_get_desc_blocks(dev, array);
2135
2136                 if (ret < 0)
2137                         return ret;
2138                 block_size = ret;
2139                 off += array->size;
2140
2141                 array = (struct snd_soc_tplg_vendor_array *)
2142                         (tplg_w->priv.data + off);
2143
2144                 data = (tplg_w->priv.data + off);
2145
2146                 if (block_type == SKL_TYPE_TUPLE) {
2147                         ret = skl_tplg_get_tokens(dev, data,
2148                                         skl, mconfig, block_size);
2149
2150                         if (ret < 0)
2151                                 return ret;
2152
2153                         --num_blocks;
2154                 } else {
2155                         if (mconfig->formats_config.caps_size > 0)
2156                                 memcpy(mconfig->formats_config.caps, data,
2157                                         mconfig->formats_config.caps_size);
2158                         --num_blocks;
2159                 }
2160         }
2161
2162         return 0;
2163 }
2164
2165 static void skl_clear_pin_config(struct snd_soc_platform *platform,
2166                                 struct snd_soc_dapm_widget *w)
2167 {
2168         int i;
2169         struct skl_module_cfg *mconfig;
2170         struct skl_pipe *pipe;
2171
2172         if (!strncmp(w->dapm->component->name, platform->component.name,
2173                                         strlen(platform->component.name))) {
2174                 mconfig = w->priv;
2175                 pipe = mconfig->pipe;
2176                 for (i = 0; i < mconfig->max_in_queue; i++) {
2177                         mconfig->m_in_pin[i].in_use = false;
2178                         mconfig->m_in_pin[i].pin_state = SKL_PIN_UNBIND;
2179                 }
2180                 for (i = 0; i < mconfig->max_out_queue; i++) {
2181                         mconfig->m_out_pin[i].in_use = false;
2182                         mconfig->m_out_pin[i].pin_state = SKL_PIN_UNBIND;
2183                 }
2184                 pipe->state = SKL_PIPE_INVALID;
2185                 mconfig->m_state = SKL_MODULE_UNINIT;
2186         }
2187 }
2188
2189 void skl_cleanup_resources(struct skl *skl)
2190 {
2191         struct skl_sst *ctx = skl->skl_sst;
2192         struct snd_soc_platform *soc_platform = skl->platform;
2193         struct snd_soc_dapm_widget *w;
2194         struct snd_soc_card *card;
2195
2196         if (soc_platform == NULL)
2197                 return;
2198
2199         card = soc_platform->component.card;
2200         if (!card || !card->instantiated)
2201                 return;
2202
2203         skl->resource.mem = 0;
2204         skl->resource.mcps = 0;
2205
2206         list_for_each_entry(w, &card->widgets, list) {
2207                 if (is_skl_dsp_widget_type(w) && (w->priv != NULL))
2208                         skl_clear_pin_config(soc_platform, w);
2209         }
2210
2211         skl_clear_module_cnt(ctx->dsp);
2212 }
2213
2214 /*
2215  * Topology core widget load callback
2216  *
2217  * This is used to save the private data for each widget which gives
2218  * information to the driver about module and pipeline parameters which DSP
2219  * FW expects like ids, resource values, formats etc
2220  */
2221 static int skl_tplg_widget_load(struct snd_soc_component *cmpnt,
2222                                 struct snd_soc_dapm_widget *w,
2223                                 struct snd_soc_tplg_dapm_widget *tplg_w)
2224 {
2225         int ret;
2226         struct hdac_ext_bus *ebus = snd_soc_component_get_drvdata(cmpnt);
2227         struct skl *skl = ebus_to_skl(ebus);
2228         struct hdac_bus *bus = ebus_to_hbus(ebus);
2229         struct skl_module_cfg *mconfig;
2230
2231         if (!tplg_w->priv.size)
2232                 goto bind_event;
2233
2234         mconfig = devm_kzalloc(bus->dev, sizeof(*mconfig), GFP_KERNEL);
2235
2236         if (!mconfig)
2237                 return -ENOMEM;
2238
2239         w->priv = mconfig;
2240
2241         /*
2242          * module binary can be loaded later, so set it to query when
2243          * module is load for a use case
2244          */
2245         mconfig->id.module_id = -1;
2246
2247         /* Parse private data for tuples */
2248         ret = skl_tplg_get_pvt_data(tplg_w, skl, bus->dev, mconfig);
2249         if (ret < 0)
2250                 return ret;
2251 bind_event:
2252         if (tplg_w->event_type == 0) {
2253                 dev_dbg(bus->dev, "ASoC: No event handler required\n");
2254                 return 0;
2255         }
2256
2257         ret = snd_soc_tplg_widget_bind_event(w, skl_tplg_widget_ops,
2258                                         ARRAY_SIZE(skl_tplg_widget_ops),
2259                                         tplg_w->event_type);
2260
2261         if (ret) {
2262                 dev_err(bus->dev, "%s: No matching event handlers found for %d\n",
2263                                         __func__, tplg_w->event_type);
2264                 return -EINVAL;
2265         }
2266
2267         return 0;
2268 }
2269
2270 static int skl_init_algo_data(struct device *dev, struct soc_bytes_ext *be,
2271                                         struct snd_soc_tplg_bytes_control *bc)
2272 {
2273         struct skl_algo_data *ac;
2274         struct skl_dfw_algo_data *dfw_ac =
2275                                 (struct skl_dfw_algo_data *)bc->priv.data;
2276
2277         ac = devm_kzalloc(dev, sizeof(*ac), GFP_KERNEL);
2278         if (!ac)
2279                 return -ENOMEM;
2280
2281         /* Fill private data */
2282         ac->max = dfw_ac->max;
2283         ac->param_id = dfw_ac->param_id;
2284         ac->set_params = dfw_ac->set_params;
2285         ac->size = dfw_ac->max;
2286
2287         if (ac->max) {
2288                 ac->params = (char *) devm_kzalloc(dev, ac->max, GFP_KERNEL);
2289                 if (!ac->params)
2290                         return -ENOMEM;
2291
2292                 memcpy(ac->params, dfw_ac->params, ac->max);
2293         }
2294
2295         be->dobj.private  = ac;
2296         return 0;
2297 }
2298
2299 static int skl_tplg_control_load(struct snd_soc_component *cmpnt,
2300                                 struct snd_kcontrol_new *kctl,
2301                                 struct snd_soc_tplg_ctl_hdr *hdr)
2302 {
2303         struct soc_bytes_ext *sb;
2304         struct snd_soc_tplg_bytes_control *tplg_bc;
2305         struct hdac_ext_bus *ebus  = snd_soc_component_get_drvdata(cmpnt);
2306         struct hdac_bus *bus = ebus_to_hbus(ebus);
2307
2308         switch (hdr->ops.info) {
2309         case SND_SOC_TPLG_CTL_BYTES:
2310                 tplg_bc = container_of(hdr,
2311                                 struct snd_soc_tplg_bytes_control, hdr);
2312                 if (kctl->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) {
2313                         sb = (struct soc_bytes_ext *)kctl->private_value;
2314                         if (tplg_bc->priv.size)
2315                                 return skl_init_algo_data(
2316                                                 bus->dev, sb, tplg_bc);
2317                 }
2318                 break;
2319
2320         default:
2321                 dev_warn(bus->dev, "Control load not supported %d:%d:%d\n",
2322                         hdr->ops.get, hdr->ops.put, hdr->ops.info);
2323                 break;
2324         }
2325
2326         return 0;
2327 }
2328
2329 static int skl_tplg_fill_str_mfest_tkn(struct device *dev,
2330                 struct snd_soc_tplg_vendor_string_elem *str_elem,
2331                 struct skl *skl)
2332 {
2333         int tkn_count = 0;
2334         static int ref_count;
2335
2336         switch (str_elem->token) {
2337         case SKL_TKN_STR_LIB_NAME:
2338                 if (ref_count > skl->skl_sst->lib_count - 1) {
2339                         ref_count = 0;
2340                         return -EINVAL;
2341                 }
2342
2343                 strncpy(skl->skl_sst->lib_info[ref_count].name,
2344                         str_elem->string,
2345                         ARRAY_SIZE(skl->skl_sst->lib_info[ref_count].name));
2346                 ref_count++;
2347                 tkn_count++;
2348                 break;
2349
2350         default:
2351                 dev_err(dev, "Not a string token %d\n", str_elem->token);
2352                 break;
2353         }
2354
2355         return tkn_count;
2356 }
2357
2358 static int skl_tplg_get_str_tkn(struct device *dev,
2359                 struct snd_soc_tplg_vendor_array *array,
2360                 struct skl *skl)
2361 {
2362         int tkn_count = 0, ret;
2363         struct snd_soc_tplg_vendor_string_elem *str_elem;
2364
2365         str_elem = (struct snd_soc_tplg_vendor_string_elem *)array->value;
2366         while (tkn_count < array->num_elems) {
2367                 ret = skl_tplg_fill_str_mfest_tkn(dev, str_elem, skl);
2368                 str_elem++;
2369
2370                 if (ret < 0)
2371                         return ret;
2372
2373                 tkn_count = tkn_count + ret;
2374         }
2375
2376         return tkn_count;
2377 }
2378
2379 static int skl_tplg_get_int_tkn(struct device *dev,
2380                 struct snd_soc_tplg_vendor_value_elem *tkn_elem,
2381                 struct skl *skl)
2382 {
2383         int tkn_count = 0;
2384
2385         switch (tkn_elem->token) {
2386         case SKL_TKN_U32_LIB_COUNT:
2387                 skl->skl_sst->lib_count = tkn_elem->value;
2388                 tkn_count++;
2389                 break;
2390
2391         default:
2392                 dev_err(dev, "Not a manifest token %d\n", tkn_elem->token);
2393                 return -EINVAL;
2394         }
2395
2396         return tkn_count;
2397 }
2398
2399 /*
2400  * Fill the manifest structure by parsing the tokens based on the
2401  * type.
2402  */
2403 static int skl_tplg_get_manifest_tkn(struct device *dev,
2404                 char *pvt_data, struct skl *skl,
2405                 int block_size)
2406 {
2407         int tkn_count = 0, ret;
2408         int off = 0, tuple_size = 0;
2409         struct snd_soc_tplg_vendor_array *array;
2410         struct snd_soc_tplg_vendor_value_elem *tkn_elem;
2411
2412         if (block_size <= 0)
2413                 return -EINVAL;
2414
2415         while (tuple_size < block_size) {
2416                 array = (struct snd_soc_tplg_vendor_array *)(pvt_data + off);
2417                 off += array->size;
2418                 switch (array->type) {
2419                 case SND_SOC_TPLG_TUPLE_TYPE_STRING:
2420                         ret = skl_tplg_get_str_tkn(dev, array, skl);
2421
2422                         if (ret < 0)
2423                                 return ret;
2424                         tkn_count += ret;
2425
2426                         tuple_size += tkn_count *
2427                                 sizeof(struct snd_soc_tplg_vendor_string_elem);
2428                         continue;
2429
2430                 case SND_SOC_TPLG_TUPLE_TYPE_UUID:
2431                         dev_warn(dev, "no uuid tokens for skl tplf manifest\n");
2432                         continue;
2433
2434                 default:
2435                         tkn_elem = array->value;
2436                         tkn_count = 0;
2437                         break;
2438                 }
2439
2440                 while (tkn_count <= array->num_elems - 1) {
2441                         ret = skl_tplg_get_int_tkn(dev,
2442                                         tkn_elem, skl);
2443                         if (ret < 0)
2444                                 return ret;
2445
2446                         tkn_count = tkn_count + ret;
2447                         tkn_elem++;
2448                         tuple_size += tkn_count *
2449                                 sizeof(struct snd_soc_tplg_vendor_value_elem);
2450                         break;
2451                 }
2452                 tkn_count = 0;
2453         }
2454
2455         return 0;
2456 }
2457
2458 /*
2459  * Parse manifest private data for tokens. The private data block is
2460  * preceded by descriptors for type and size of data block.
2461  */
2462 static int skl_tplg_get_manifest_data(struct snd_soc_tplg_manifest *manifest,
2463                         struct device *dev, struct skl *skl)
2464 {
2465         struct snd_soc_tplg_vendor_array *array;
2466         int num_blocks, block_size = 0, block_type, off = 0;
2467         char *data;
2468         int ret;
2469
2470         /* Read the NUM_DATA_BLOCKS descriptor */
2471         array = (struct snd_soc_tplg_vendor_array *)manifest->priv.data;
2472         ret = skl_tplg_get_desc_blocks(dev, array);
2473         if (ret < 0)
2474                 return ret;
2475         num_blocks = ret;
2476
2477         off += array->size;
2478         array = (struct snd_soc_tplg_vendor_array *)
2479                         (manifest->priv.data + off);
2480
2481         /* Read the BLOCK_TYPE and BLOCK_SIZE descriptor */
2482         while (num_blocks > 0) {
2483                 ret = skl_tplg_get_desc_blocks(dev, array);
2484
2485                 if (ret < 0)
2486                         return ret;
2487                 block_type = ret;
2488                 off += array->size;
2489
2490                 array = (struct snd_soc_tplg_vendor_array *)
2491                         (manifest->priv.data + off);
2492
2493                 ret = skl_tplg_get_desc_blocks(dev, array);
2494
2495                 if (ret < 0)
2496                         return ret;
2497                 block_size = ret;
2498                 off += array->size;
2499
2500                 array = (struct snd_soc_tplg_vendor_array *)
2501                         (manifest->priv.data + off);
2502
2503                 data = (manifest->priv.data + off);
2504
2505                 if (block_type == SKL_TYPE_TUPLE) {
2506                         ret = skl_tplg_get_manifest_tkn(dev, data, skl,
2507                                         block_size);
2508
2509                         if (ret < 0)
2510                                 return ret;
2511
2512                         --num_blocks;
2513                 } else {
2514                         return -EINVAL;
2515                 }
2516         }
2517
2518         return 0;
2519 }
2520
2521 static int skl_manifest_load(struct snd_soc_component *cmpnt,
2522                                 struct snd_soc_tplg_manifest *manifest)
2523 {
2524         struct hdac_ext_bus *ebus = snd_soc_component_get_drvdata(cmpnt);
2525         struct hdac_bus *bus = ebus_to_hbus(ebus);
2526         struct skl *skl = ebus_to_skl(ebus);
2527
2528         /* proceed only if we have private data defined */
2529         if (manifest->priv.size == 0)
2530                 return 0;
2531
2532         skl_tplg_get_manifest_data(manifest, bus->dev, skl);
2533
2534         if (skl->skl_sst->lib_count > SKL_MAX_LIB) {
2535                 dev_err(bus->dev, "Exceeding max Library count. Got:%d\n",
2536                                         skl->skl_sst->lib_count);
2537                 return  -EINVAL;
2538         }
2539
2540         return 0;
2541 }
2542
2543 static struct snd_soc_tplg_ops skl_tplg_ops  = {
2544         .widget_load = skl_tplg_widget_load,
2545         .control_load = skl_tplg_control_load,
2546         .bytes_ext_ops = skl_tlv_ops,
2547         .bytes_ext_ops_count = ARRAY_SIZE(skl_tlv_ops),
2548         .manifest = skl_manifest_load,
2549 };
2550
2551 /*
2552  * A pipe can have multiple modules, each of them will be a DAPM widget as
2553  * well. While managing a pipeline we need to get the list of all the
2554  * widgets in a pipelines, so this helper - skl_tplg_create_pipe_widget_list()
2555  * helps to get the SKL type widgets in that pipeline
2556  */
2557 static int skl_tplg_create_pipe_widget_list(struct snd_soc_platform *platform)
2558 {
2559         struct snd_soc_dapm_widget *w;
2560         struct skl_module_cfg *mcfg = NULL;
2561         struct skl_pipe_module *p_module = NULL;
2562         struct skl_pipe *pipe;
2563
2564         list_for_each_entry(w, &platform->component.card->widgets, list) {
2565                 if (is_skl_dsp_widget_type(w) && w->priv != NULL) {
2566                         mcfg = w->priv;
2567                         pipe = mcfg->pipe;
2568
2569                         p_module = devm_kzalloc(platform->dev,
2570                                                 sizeof(*p_module), GFP_KERNEL);
2571                         if (!p_module)
2572                                 return -ENOMEM;
2573
2574                         p_module->w = w;
2575                         list_add_tail(&p_module->node, &pipe->w_list);
2576                 }
2577         }
2578
2579         return 0;
2580 }
2581
2582 static void skl_tplg_set_pipe_type(struct skl *skl, struct skl_pipe *pipe)
2583 {
2584         struct skl_pipe_module *w_module;
2585         struct snd_soc_dapm_widget *w;
2586         struct skl_module_cfg *mconfig;
2587         bool host_found = false, link_found = false;
2588
2589         list_for_each_entry(w_module, &pipe->w_list, node) {
2590                 w = w_module->w;
2591                 mconfig = w->priv;
2592
2593                 if (mconfig->dev_type == SKL_DEVICE_HDAHOST)
2594                         host_found = true;
2595                 else if (mconfig->dev_type != SKL_DEVICE_NONE)
2596                         link_found = true;
2597         }
2598
2599         if (host_found && link_found)
2600                 pipe->passthru = true;
2601         else
2602                 pipe->passthru = false;
2603 }
2604
2605 /* This will be read from topology manifest, currently defined here */
2606 #define SKL_MAX_MCPS 30000000
2607 #define SKL_FW_MAX_MEM 1000000
2608
2609 /*
2610  * SKL topology init routine
2611  */
2612 int skl_tplg_init(struct snd_soc_platform *platform, struct hdac_ext_bus *ebus)
2613 {
2614         int ret;
2615         const struct firmware *fw;
2616         struct hdac_bus *bus = ebus_to_hbus(ebus);
2617         struct skl *skl = ebus_to_skl(ebus);
2618         struct skl_pipeline *ppl;
2619
2620         ret = request_firmware(&fw, skl->tplg_name, bus->dev);
2621         if (ret < 0) {
2622                 dev_err(bus->dev, "tplg fw %s load failed with %d\n",
2623                                 skl->tplg_name, ret);
2624                 ret = request_firmware(&fw, "dfw_sst.bin", bus->dev);
2625                 if (ret < 0) {
2626                         dev_err(bus->dev, "Fallback tplg fw %s load failed with %d\n",
2627                                         "dfw_sst.bin", ret);
2628                         return ret;
2629                 }
2630         }
2631
2632         /*
2633          * The complete tplg for SKL is loaded as index 0, we don't use
2634          * any other index
2635          */
2636         ret = snd_soc_tplg_component_load(&platform->component,
2637                                         &skl_tplg_ops, fw, 0);
2638         if (ret < 0) {
2639                 dev_err(bus->dev, "tplg component load failed%d\n", ret);
2640                 release_firmware(fw);
2641                 return -EINVAL;
2642         }
2643
2644         skl->resource.max_mcps = SKL_MAX_MCPS;
2645         skl->resource.max_mem = SKL_FW_MAX_MEM;
2646
2647         skl->tplg = fw;
2648         ret = skl_tplg_create_pipe_widget_list(platform);
2649         if (ret < 0)
2650                 return ret;
2651
2652         list_for_each_entry(ppl, &skl->ppl_list, node)
2653                 skl_tplg_set_pipe_type(skl, ppl->pipe);
2654
2655         return 0;
2656 }