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