1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Copyright(c) 2021 Intel Corporation. All rights reserved. 4 * 5 * Authors: Cezary Rojewski <cezary.rojewski@intel.com> 6 * Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com> 7 */ 8 9#ifndef __SOUND_SOC_INTEL_AVS_TPLG_H 10#define __SOUND_SOC_INTEL_AVS_TPLG_H 11 12#include <linux/list.h> 13#include "messages.h" 14 15#define INVALID_OBJECT_ID UINT_MAX 16 17struct snd_soc_component; 18 19struct avs_tplg { 20 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 21 u32 version; 22 struct snd_soc_component *comp; 23 24 struct avs_tplg_library *libs; 25 u32 num_libs; 26 struct avs_audio_format *fmts; 27 u32 num_fmts; 28 struct avs_tplg_modcfg_base *modcfgs_base; 29 u32 num_modcfgs_base; 30 struct avs_tplg_modcfg_ext *modcfgs_ext; 31 u32 num_modcfgs_ext; 32 struct avs_tplg_pplcfg *pplcfgs; 33 u32 num_pplcfgs; 34 struct avs_tplg_binding *bindings; 35 u32 num_bindings; 36 u32 num_condpath_tmpls; 37 struct avs_tplg_init_config *init_configs; 38 u32 num_init_configs; 39 40 struct list_head path_tmpl_list; 41}; 42 43struct avs_tplg_library { 44 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 45}; 46 47/* Matches header of struct avs_mod_cfg_base. */ 48struct avs_tplg_modcfg_base { 49 u32 cpc; 50 u32 ibs; 51 u32 obs; 52 u32 is_pages; 53}; 54 55struct avs_tplg_pin_format { 56 u32 pin_index; 57 u32 iobs; 58 struct avs_audio_format *fmt; 59}; 60 61struct avs_tplg_modcfg_ext { 62 guid_t type; 63 64 union { 65 struct { 66 u16 num_input_pins; 67 u16 num_output_pins; 68 struct avs_tplg_pin_format *pin_fmts; 69 } generic; 70 struct { 71 struct avs_audio_format *out_fmt; 72 struct avs_audio_format *blob_fmt; /* optional override */ 73 u32 feature_mask; 74 union avs_virtual_index vindex; 75 u32 dma_type; 76 u32 dma_buffer_size; 77 u32 config_length; 78 /* config_data part of priv data */ 79 } copier; 80 struct { 81 u32 out_channel_config; 82 u32 coefficients_select; 83 s32 coefficients[AVS_CHANNELS_MAX]; 84 u32 channel_map; 85 } updown_mix; 86 struct { 87 u32 out_freq; 88 } src; 89 struct { 90 u32 out_freq; 91 u8 mode; 92 u8 disable_jitter_buffer; 93 } asrc; 94 struct { 95 u32 cpc_lp_mode; 96 } wov; 97 struct { 98 struct avs_audio_format *ref_fmt; 99 struct avs_audio_format *out_fmt; 100 u32 cpc_lp_mode; 101 } aec; 102 struct { 103 struct avs_audio_format *ref_fmt; 104 struct avs_audio_format *out_fmt; 105 } mux; 106 struct { 107 struct avs_audio_format *out_fmt; 108 } micsel; 109 }; 110}; 111 112/* Specifies path behaviour during PCM ->trigger(START) command. */ 113enum avs_tplg_trigger { 114 AVS_TPLG_TRIGGER_AUTO = 0, 115}; 116 117struct avs_tplg_pplcfg { 118 u16 req_size; 119 u8 priority; 120 bool lp; 121 u16 attributes; 122 enum avs_tplg_trigger trigger; 123}; 124 125struct avs_tplg_binding { 126 char target_tplg_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 127 u32 target_path_tmpl_id; 128 u32 target_ppl_id; 129 u32 target_mod_id; 130 u8 target_mod_pin; 131 u32 mod_id; 132 u8 mod_pin; 133 u8 is_sink; 134}; 135 136struct avs_tplg_path_template_id { 137 u32 id; 138 char tplg_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 139}; 140 141struct avs_tplg_path_template { 142 u32 id; 143 144 struct snd_soc_dapm_widget *w; 145 146 struct list_head path_list; 147 148 struct avs_tplg *owner; 149 /* Driver path templates management. */ 150 struct list_head node; 151}; 152 153struct avs_tplg_init_config { 154 u32 id; 155 156 u8 param; 157 size_t length; 158 void *data; 159}; 160 161struct avs_tplg_path { 162 u32 id; 163 164 /* Path format requirements. */ 165 struct avs_audio_format *fe_fmt; 166 struct avs_audio_format *be_fmt; 167 168 struct list_head ppl_list; 169 170 struct avs_tplg_path_template *owner; 171 /* Path template path-variants management. */ 172 struct list_head node; 173}; 174 175struct avs_tplg_pipeline { 176 u32 id; 177 178 struct avs_tplg_pplcfg *cfg; 179 struct avs_tplg_binding **bindings; 180 u32 num_bindings; 181 struct list_head mod_list; 182 183 struct avs_tplg_path *owner; 184 /* Path pipelines management. */ 185 struct list_head node; 186}; 187 188struct avs_tplg_module { 189 u32 id; 190 191 struct avs_tplg_modcfg_base *cfg_base; 192 struct avs_audio_format *in_fmt; 193 u8 core_id; 194 u8 domain; 195 struct avs_tplg_modcfg_ext *cfg_ext; 196 u32 ctl_id; 197 u32 num_config_ids; 198 u32 *config_ids; 199 200 struct avs_tplg_pipeline *owner; 201 /* Pipeline modules management. */ 202 struct list_head node; 203}; 204 205struct avs_tplg *avs_tplg_new(struct snd_soc_component *comp); 206 207int avs_load_topology(struct snd_soc_component *comp, const char *filename); 208int avs_remove_topology(struct snd_soc_component *comp); 209 210#endif 211