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 17 struct snd_soc_component; 18 19 struct 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 43 struct avs_tplg_library { 44 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 45 }; 46 47 /* Matches header of struct avs_mod_cfg_base. */ 48 struct avs_tplg_modcfg_base { 49 u32 cpc; 50 u32 ibs; 51 u32 obs; 52 u32 is_pages; 53 }; 54 55 struct avs_tplg_pin_format { 56 u32 pin_index; 57 u32 iobs; 58 struct avs_audio_format *fmt; 59 }; 60 61 struct 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. */ 113 enum avs_tplg_trigger { 114 AVS_TPLG_TRIGGER_AUTO = 0, 115 }; 116 117 struct avs_tplg_pplcfg { 118 u16 req_size; 119 u8 priority; 120 bool lp; 121 u16 attributes; 122 enum avs_tplg_trigger trigger; 123 }; 124 125 struct 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 136 struct avs_tplg_path_template_id { 137 u32 id; 138 char tplg_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 139 }; 140 141 struct 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 153 struct avs_tplg_init_config { 154 u32 id; 155 156 u8 param; 157 size_t length; 158 void *data; 159 }; 160 161 struct 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 175 struct 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 188 struct 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 205 struct avs_tplg *avs_tplg_new(struct snd_soc_component *comp); 206 207 int avs_load_topology(struct snd_soc_component *comp, const char *filename); 208 int avs_remove_topology(struct snd_soc_component *comp); 209 210 #endif 211