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 |