Lines Matching refs:skl
3 * skl-topology.c - Implements Platform component ALSA controls/widget
20 #include <uapi/sound/skl-tplg-interface.h>
21 #include "skl-sst-dsp.h"
22 #include "skl-sst-ipc.h"
23 #include "skl-topology.h"
24 #include "skl.h"
50 void skl_tplg_d0i3_get(struct skl_dev *skl, enum d0i3_capability caps)
52 struct skl_d0i3_data *d0i3 = &skl->d0i3;
69 void skl_tplg_d0i3_put(struct skl_dev *skl, enum d0i3_capability caps)
71 struct skl_d0i3_data *d0i3 = &skl->d0i3;
114 static void skl_dump_mconfig(struct skl_dev *skl, struct skl_module_cfg *mcfg)
118 dev_dbg(skl->dev, "Dumping config\n");
119 dev_dbg(skl->dev, "Input Format:\n");
120 dev_dbg(skl->dev, "channels = %d\n", iface->inputs[0].fmt.channels);
121 dev_dbg(skl->dev, "s_freq = %d\n", iface->inputs[0].fmt.s_freq);
122 dev_dbg(skl->dev, "ch_cfg = %d\n", iface->inputs[0].fmt.ch_cfg);
123 dev_dbg(skl->dev, "valid bit depth = %d\n",
125 dev_dbg(skl->dev, "Output Format:\n");
126 dev_dbg(skl->dev, "channels = %d\n", iface->outputs[0].fmt.channels);
127 dev_dbg(skl->dev, "s_freq = %d\n", iface->outputs[0].fmt.s_freq);
128 dev_dbg(skl->dev, "valid bit depth = %d\n",
130 dev_dbg(skl->dev, "ch_cfg = %d\n", iface->outputs[0].fmt.ch_cfg);
232 static void skl_tplg_update_buffer_size(struct skl_dev *skl,
284 struct skl_dev *skl)
298 dev_dbg(skl->dev, "Applying default cfg blob\n");
328 cfg = skl_get_ep_blob(skl, m_cfg->vbus_id, link_type,
334 dev_err(skl->dev, "Blob NULL for id %x type %d dirn %d\n",
336 dev_err(skl->dev, "PCM: ch %d, freq %d, fmt %d\n",
345 struct skl_dev *skl)
355 dev_dbg(skl->dev, "Mconfig for widget=%s BEFORE updation\n",
358 skl_dump_mconfig(skl, m_cfg);
366 skl_tplg_update_buffer_size(skl, m_cfg);
368 dev_dbg(skl->dev, "Mconfig for widget=%s AFTER updation\n",
371 skl_dump_mconfig(skl, m_cfg);
380 struct skl_dev *skl)
392 ret = skl_set_module_params(skl, sp_cfg->caps,
406 ret = skl_set_module_params(skl,
451 static int skl_tplg_module_prepare(struct skl_dev *skl, struct skl_pipe *pipe,
456 return skl_pcm_host_dma_prepare(skl->dev, pipe->p_params);
459 return skl_pcm_link_dma_prepare(skl->dev, pipe->p_params);
471 skl_tplg_init_pipe_modules(struct skl_dev *skl, struct skl_pipe *pipe)
486 dev_err(skl->dev,
496 if (mconfig->module->loadable && skl->dsp->fw_ops.load_mod) {
497 ret = skl->dsp->fw_ops.load_mod(skl->dsp,
506 ret = skl_tplg_module_prepare(skl, pipe, w, mconfig);
511 skl_tplg_update_be_blob(w, skl);
517 skl_tplg_update_module_params(w, skl);
519 mconfig->id.pvt_id = skl_get_pvt_id(skl, uuid_mod,
525 ret = skl_dsp_get_core(skl->dsp, mconfig->core_id);
527 dev_err(skl->dev, "Failed to wake up core %d ret=%d\n",
532 ret = skl_init_module(skl, mconfig);
534 skl_put_pvt_id(skl, uuid_mod, &mconfig->id.pvt_id);
538 ret = skl_tplg_set_module_params(w, skl);
545 skl_dsp_put_core(skl->dsp, mconfig->core_id);
549 static int skl_tplg_unload_pipe_modules(struct skl_dev *skl,
561 if (mconfig->module->loadable && skl->dsp->fw_ops.unload_mod &&
563 ret = skl->dsp->fw_ops.unload_mod(skl->dsp,
568 skl_put_pvt_id(skl, uuid_mod, &mconfig->id.pvt_id);
570 ret = skl_dsp_put_core(skl->dsp, mconfig->core_id);
573 dev_err(skl->dev, "Failed to sleep core %d ret=%d\n",
582 static bool skl_tplg_is_multi_fmt(struct skl_dev *skl, struct skl_pipe *pipe)
622 skl_tplg_get_pipe_config(struct skl_dev *skl, struct skl_module_cfg *mconfig)
636 if (skl_tplg_is_multi_fmt(skl, pipe)) {
639 dev_dbg(skl->dev, "found pipe config idx:%d\n",
645 dev_dbg(skl->dev, "No conn_type detected, take 0th config\n");
669 dev_dbg(skl->dev, "Using pipe config: %d\n", i);
675 dev_err(skl->dev, "Invalid pipe config: %d %d %d for pipe: %d\n",
688 struct skl_dev *skl)
697 ret = skl_tplg_get_pipe_config(skl, mconfig);
705 ret = skl_create_pipeline(skl, mconfig->pipe);
710 ret = skl_tplg_init_pipe_modules(skl, s_pipe);
723 ret = skl_bind_modules(skl, src_module, dst_module);
735 if (list_empty(&skl->bind_list))
738 list_for_each_entry(modules, &skl->bind_list, node) {
741 skl_bind_modules(skl, modules->src,
749 static int skl_fill_sink_instance_id(struct skl_dev *skl, u32 *params,
760 pvt_id = skl_get_pvt_instance_id_map(skl, inst->mod_id,
780 struct skl_module_cfg *mcfg, struct skl_dev *skl)
807 ret = skl_set_module_params(skl, sp_cfg->caps,
825 skl_fill_sink_instance_id(skl, params, bc->max,
828 ret = skl_set_module_params(skl, params,
841 static int skl_get_module_id(struct skl_dev *skl, guid_t *uuid)
845 list_for_each_entry(module, &skl->uuid_list, list) {
853 static int skl_tplg_find_moduleid_from_uuid(struct skl_dev *skl,
859 struct hdac_bus *bus = skl_to_bus(skl);
873 module_id = skl_get_module_id(skl,
897 void skl_tplg_add_moduleid_in_bind_params(struct skl_dev *skl,
914 (skl_tplg_find_moduleid_from_uuid(skl,
916 dev_err(skl->dev,
921 static int skl_tplg_module_add_deferred_bind(struct skl_dev *skl,
937 if (!list_empty(&skl->bind_list)) {
938 list_for_each_entry(modules, &skl->bind_list, node) {
951 list_add(&m_list->node, &skl->bind_list);
959 struct skl_dev *skl,
972 dev_dbg(skl->dev,
974 dev_dbg(skl->dev,
979 if (!is_skl_dsp_widget_type(p->sink, skl->dev))
980 return skl_tplg_bind_sinks(p->sink, skl, src_w, src_mconfig);
988 is_skl_dsp_widget_type(p->sink, skl->dev)) {
1006 ret = skl_tplg_module_add_deferred_bind(skl,
1020 ret = skl_bind_modules(skl, src_mconfig, sink_mconfig);
1026 src_mconfig, skl);
1028 sink_mconfig, skl);
1034 ret = skl_run_pipe(skl,
1043 return skl_tplg_bind_sinks(next_sink, skl, src_w, src_mconfig);
1059 struct skl_dev *skl)
1071 ret = skl_tplg_bind_sinks(w, skl, w, src_mconfig);
1077 return skl_run_pipe(skl, src_mconfig->pipe);
1083 struct snd_soc_dapm_widget *w, struct skl_dev *skl)
1093 dev_dbg(skl->dev, "sink widget=%s\n", w->name);
1094 dev_dbg(skl->dev, "src widget=%s\n", p->source->name);
1102 is_skl_dsp_widget_type(p->source, skl->dev)) {
1108 return skl_get_src_dsp_widget(src_w, skl);
1123 struct skl_dev *skl)
1138 source = skl_get_src_dsp_widget(w, skl);
1153 ret = skl_bind_modules(skl, src_mconfig, sink_mconfig);
1158 skl_tplg_set_module_bind_params(source, src_mconfig, skl);
1159 skl_tplg_set_module_bind_params(sink, sink_mconfig, skl);
1162 ret = skl_run_pipe(skl, sink_mconfig->pipe);
1175 struct skl_dev *skl)
1183 ret = skl_stop_pipe(skl, sink_mconfig->pipe);
1193 ret = skl_unbind_modules(skl,
1208 struct skl_dev *skl)
1220 if (list_empty(&skl->bind_list))
1225 list_for_each_entry_safe(modules, tmp, &skl->bind_list, node) {
1231 skl_unbind_modules(skl, modules->src,
1256 skl_unbind_modules(skl, src_module, dst_module);
1260 skl_delete_pipe(skl, mconfig->pipe);
1267 return skl_tplg_unload_pipe_modules(skl, s_pipe);
1276 struct skl_dev *skl)
1284 ret = skl_stop_pipe(skl, src_mconfig->pipe);
1297 ret = skl_unbind_modules(skl, src_mconfig,
1315 struct skl_dev *skl = get_skl_ctx(dapm->dev);
1319 return skl_tplg_mixer_dapm_pre_pmu_event(w, skl);
1322 return skl_tplg_mixer_dapm_post_pmu_event(w, skl);
1325 return skl_tplg_mixer_dapm_pre_pmd_event(w, skl);
1328 return skl_tplg_mixer_dapm_post_pmd_event(w, skl);
1345 struct skl_dev *skl = get_skl_ctx(dapm->dev);
1349 return skl_tplg_pga_dapm_pre_pmu_event(w, skl);
1352 return skl_tplg_pga_dapm_post_pmd_event(w, skl);
1365 struct skl_dev *skl = bus_to_skl(bus);
1379 list_for_each_entry(ppl, &skl->ppl_list, node) {
1428 struct skl_dev *skl = get_skl_ctx(w->dapm->dev);
1431 skl_get_module_params(skl, (u32 *)bc->params,
1463 struct skl_dev *skl = get_skl_ctx(w->dapm->dev);
1474 return skl_set_module_params(skl,
1635 struct skl_dev *skl = get_skl_ctx(dev);
1644 if (skl->nr_modules)
1833 struct skl_dev *skl = get_skl_ctx(dai->dev);
1843 cfg = skl_get_ep_blob(skl, mconfig->vbus_id, link_type,
2057 struct skl_module_cfg *mconfig, struct skl_dev *skl,
2064 list_for_each_entry(ppl, &skl->ppl_list, node) {
2088 list_add(&ppl->node, &skl->ppl_list);
2365 struct skl_dev *skl, struct skl_module_cfg *mconfig)
2381 if (skl->nr_modules == 0) {
2477 mconfig, skl, tkn_elem);
2615 char *pvt_data, struct skl_dev *skl,
2634 dev_warn(dev, "no string tokens expected for skl tplg\n");
2643 ret = skl_tplg_get_token(dev, array->value, skl,
2662 skl, mconfig);
2711 struct skl_module_cfg *mconfig, struct skl_dev *skl,
2718 list_for_each_entry(ppl, &skl->ppl_list, node) {
2746 list_add(&ppl->node, &skl->ppl_list);
2788 struct skl_dev *skl, struct device *dev,
2820 ret = skl_tplg_add_pipe_v4(dev, mconfig, skl, &dfw->pipe);
2870 struct skl_dev *skl, struct device *dev,
2883 return skl_tplg_get_pvt_data_v4(tplg_w, skl, dev, mconfig);
2922 skl, mconfig, block_size);
2965 void skl_cleanup_resources(struct skl_dev *skl)
2967 struct snd_soc_component *soc_component = skl->component;
2979 if (is_skl_dsp_widget_type(w, skl->dev) && w->priv != NULL)
2983 skl_clear_module_cnt(skl->dsp);
2999 struct skl_dev *skl = bus_to_skl(bus);
3010 if (skl->nr_modules == 0) {
3026 ret = skl_tplg_get_pvt_data(tplg_w, skl, bus->dev, mconfig);
3030 skl_debug_init_module(skl->debugfs, w, mconfig);
3152 struct skl_dev *skl)
3159 if (ref_count > skl->lib_count - 1) {
3164 strncpy(skl->lib_info[ref_count].name,
3166 ARRAY_SIZE(skl->lib_info[ref_count].name));
3181 struct skl_dev *skl)
3188 ret = skl_tplg_fill_str_mfest_tkn(dev, str_elem, skl);
3288 struct skl_dev *skl)
3300 if (skl->modules) {
3301 mod = skl->modules[mod_idx];
3308 skl->lib_count = tkn_elem->value;
3312 skl->nr_modules = tkn_elem->value;
3313 skl->modules = devm_kcalloc(dev, skl->nr_modules,
3314 sizeof(*skl->modules), GFP_KERNEL);
3315 if (!skl->modules)
3318 for (i = 0; i < skl->nr_modules; i++) {
3319 skl->modules[i] = devm_kzalloc(dev,
3321 if (!skl->modules[i])
3342 size = struct_size(skl->cfg.astate_cfg, astate_table,
3344 skl->cfg.astate_cfg = devm_kzalloc(dev, size, GFP_KERNEL);
3345 if (!skl->cfg.astate_cfg)
3348 astate_table = skl->cfg.astate_cfg->astate_table;
3349 count = skl->cfg.astate_cfg->count = tkn_elem->value;
3459 char *pvt_data, struct skl_dev *skl,
3476 ret = skl_tplg_get_str_tkn(dev, array, skl);
3492 if (uuid_index >= skl->nr_modules) {
3496 import_guid(&skl->modules[uuid_index++]->uuid,
3510 tkn_elem, skl);
3529 struct device *dev, struct skl_dev *skl)
3571 ret = skl_tplg_get_manifest_tkn(dev, data, skl,
3591 struct skl_dev *skl = bus_to_skl(bus);
3597 skl_tplg_get_manifest_data(manifest, bus->dev, skl);
3599 if (skl->lib_count > SKL_MAX_LIB) {
3601 skl->lib_count);
3683 static void skl_tplg_set_pipe_type(struct skl_dev *skl, struct skl_pipe *pipe)
3713 struct skl_dev *skl = bus_to_skl(bus);
3716 ret = request_firmware(&fw, skl->tplg_name, bus->dev);
3721 skl->mach->drv_name);
3723 skl->tplg_name, ret, alt_tplg_name);
3759 list_for_each_entry(ppl, &skl->ppl_list, node)
3760 skl_tplg_set_pipe_type(skl, ppl->pipe);
3769 struct skl_dev *skl = bus_to_skl(bus);
3772 list_for_each_entry_safe(ppl, tmp, &skl->ppl_list, node)