1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright(c) 2020 Intel Corporation. All rights reserved.
4 *
5 * Author: Cezary Rojewski <cezary.rojewski@intel.com>
6 */
7
8#ifndef __SND_SOC_INTEL_CATPT_MSG_H
9#define __SND_SOC_INTEL_CATPT_MSG_H
10
11struct catpt_dev;
12
13/* IPC messages base types */
14
15enum catpt_reply_status {
16 CATPT_REPLY_SUCCESS = 0,
17 CATPT_REPLY_ERROR_INVALID_PARAM = 1,
18 CATPT_REPLY_UNKNOWN_MESSAGE_TYPE = 2,
19 CATPT_REPLY_OUT_OF_RESOURCES = 3,
20 CATPT_REPLY_BUSY = 4,
21 CATPT_REPLY_PENDING = 5,
22 CATPT_REPLY_FAILURE = 6,
23 CATPT_REPLY_INVALID_REQUEST = 7,
24 CATPT_REPLY_UNINITIALIZED = 8,
25 CATPT_REPLY_NOT_FOUND = 9,
26 CATPT_REPLY_SOURCE_NOT_STARTED = 10,
27};
28
29/* GLOBAL messages */
30
31enum catpt_global_msg_type {
32 CATPT_GLB_GET_FW_VERSION = 0,
33 CATPT_GLB_ALLOCATE_STREAM = 3,
34 CATPT_GLB_FREE_STREAM = 4,
35 CATPT_GLB_STREAM_MESSAGE = 6,
36 CATPT_GLB_REQUEST_CORE_DUMP = 7,
37 CATPT_GLB_SET_DEVICE_FORMATS = 10,
38 CATPT_GLB_ENTER_DX_STATE = 12,
39 CATPT_GLB_GET_MIXER_STREAM_INFO = 13,
40};
41
42union catpt_global_msg {
43 u32 val;
44 struct {
45 u32 status:5;
46 u32 context:19; /* stream or module specific */
47 u32 global_msg_type:5;
48 u32 fw_ready:1;
49 u32 done:1;
50 u32 busy:1;
51 };
52} __packed;
53
54#define CATPT_MSG(hdr) { .val = hdr }
55#define CATPT_GLOBAL_MSG(msg_type) \
56 { .global_msg_type = CATPT_GLB_##msg_type }
57
58#define BUILD_HASH_SIZE 40
59
60struct catpt_fw_version {
61 u8 build;
62 u8 minor;
63 u8 major;
64 u8 type;
65 u8 build_hash[BUILD_HASH_SIZE];
66 u32 log_providers_hash;
67} __packed;
68
69int catpt_ipc_get_fw_version(struct catpt_dev *cdev,
70 struct catpt_fw_version *version);
71
72enum catpt_pin_id {
73 CATPT_PIN_ID_SYSTEM = 0,
74 CATPT_PIN_ID_REFERENCE = 1,
75 CATPT_PIN_ID_CAPTURE1 = 2,
76 CATPT_PIN_ID_CAPTURE2 = 3,
77 CATPT_PIN_ID_OFFLOAD1 = 4,
78 CATPT_PIN_ID_OFFLOAD2 = 5,
79 CATPT_PIN_ID_MIXER = 7,
80 CATPT_PIN_ID_BLUETOOTH_CAPTURE = 8,
81 CATPT_PIN_ID_BLUETOOTH_RENDER = 9,
82};
83
84enum catpt_path_id {
85 CATPT_PATH_SSP0_OUT = 0,
86 CATPT_PATH_SSP0_IN = 1,
87 CATPT_PATH_SSP1_OUT = 2,
88 CATPT_PATH_SSP1_IN = 3,
89 /* duplicated audio in capture path */
90 CATPT_PATH_SSP0_IN_DUP = 4,
91};
92
93enum catpt_stream_type {
94 CATPT_STRM_TYPE_RENDER = 0, /* offload */
95 CATPT_STRM_TYPE_SYSTEM = 1,
96 CATPT_STRM_TYPE_CAPTURE = 2,
97 CATPT_STRM_TYPE_LOOPBACK = 3,
98 CATPT_STRM_TYPE_BLUETOOTH_RENDER = 4,
99 CATPT_STRM_TYPE_BLUETOOTH_CAPTURE = 5,
100};
101
102enum catpt_format_id {
103 CATPT_FORMAT_PCM = 0,
104 CATPT_FORMAT_MP3 = 1,
105 CATPT_FORMAT_AAC = 2,
106 CATPT_FORMAT_WMA = 3,
107};
108
109enum catpt_channel_index {
110 CATPT_CHANNEL_LEFT = 0x0,
111 CATPT_CHANNEL_CENTER = 0x1,
112 CATPT_CHANNEL_RIGHT = 0x2,
113 CATPT_CHANNEL_LEFT_SURROUND = 0x3,
114 CATPT_CHANNEL_CENTER_SURROUND = 0x3,
115 CATPT_CHANNEL_RIGHT_SURROUND = 0x4,
116 CATPT_CHANNEL_LFE = 0x7,
117 CATPT_CHANNEL_INVALID = 0xF,
118};
119
120enum catpt_channel_config {
121 CATPT_CHANNEL_CONFIG_MONO = 0, /* One channel only */
122 CATPT_CHANNEL_CONFIG_STEREO = 1, /* L & R */
123 CATPT_CHANNEL_CONFIG_2_POINT_1 = 2, /* L, R & LFE; PCM only */
124 CATPT_CHANNEL_CONFIG_3_POINT_0 = 3, /* L, C & R; MP3 & AAC only */
125 CATPT_CHANNEL_CONFIG_3_POINT_1 = 4, /* L, C, R & LFE; PCM only */
126 CATPT_CHANNEL_CONFIG_QUATRO = 5, /* L, R, Ls & Rs; PCM only */
127 CATPT_CHANNEL_CONFIG_4_POINT_0 = 6, /* L, C, R & Cs; MP3 & AAC only */
128 CATPT_CHANNEL_CONFIG_5_POINT_0 = 7, /* L, C, R, Ls & Rs */
129 CATPT_CHANNEL_CONFIG_5_POINT_1 = 8, /* L, C, R, Ls, Rs & LFE */
130 CATPT_CHANNEL_CONFIG_DUAL_MONO = 9, /* One channel replicated in two */
131 CATPT_CHANNEL_CONFIG_INVALID = 10,
132};
133
134enum catpt_interleaving_style {
135 CATPT_INTERLEAVING_PER_CHANNEL = 0,
136 CATPT_INTERLEAVING_PER_SAMPLE = 1,
137};
138
139struct catpt_audio_format {
140 u32 sample_rate;
141 u32 bit_depth;
142 u32 channel_map;
143 u32 channel_config;
144 u32 interleaving;
145 u8 num_channels;
146 u8 valid_bit_depth;
147 u8 reserved[2];
148} __packed;
149
150struct catpt_ring_info {
151 u32 page_table_addr;
152 u32 num_pages;
153 u32 size;
154 u32 offset;
155 u32 ring_first_page_pfn;
156} __packed;
157
158#define CATPT_MODULE_COUNT (CATPT_MODID_LAST + 1)
159
160enum catpt_module_id {
161 CATPT_MODID_BASE_FW = 0x0,
162 CATPT_MODID_MP3 = 0x1,
163 CATPT_MODID_AAC_5_1 = 0x2,
164 CATPT_MODID_AAC_2_0 = 0x3,
165 CATPT_MODID_SRC = 0x4,
166 CATPT_MODID_WAVES = 0x5,
167 CATPT_MODID_DOLBY = 0x6,
168 CATPT_MODID_BOOST = 0x7,
169 CATPT_MODID_LPAL = 0x8,
170 CATPT_MODID_DTS = 0x9,
171 CATPT_MODID_PCM_CAPTURE = 0xA,
172 CATPT_MODID_PCM_SYSTEM = 0xB,
173 CATPT_MODID_PCM_REFERENCE = 0xC,
174 CATPT_MODID_PCM = 0xD, /* offload */
175 CATPT_MODID_BLUETOOTH_RENDER = 0xE,
176 CATPT_MODID_BLUETOOTH_CAPTURE = 0xF,
177 CATPT_MODID_LAST = CATPT_MODID_BLUETOOTH_CAPTURE,
178};
179
180struct catpt_module_entry {
181 u32 module_id;
182 u32 entry_point;
183} __packed;
184
185struct catpt_module_map {
186 u8 num_entries;
187 struct catpt_module_entry entries[];
188} __packed;
189
190struct catpt_memory_info {
191 u32 offset;
192 u32 size;
193} __packed;
194
195#define CATPT_CHANNELS_MAX 4
196#define CATPT_ALL_CHANNELS_MASK UINT_MAX
197
198struct catpt_stream_info {
199 u32 stream_hw_id;
200 u32 reserved;
201 u32 read_pos_regaddr;
202 u32 pres_pos_regaddr;
203 u32 peak_meter_regaddr[CATPT_CHANNELS_MAX];
204 u32 volume_regaddr[CATPT_CHANNELS_MAX];
205} __packed;
206
207int catpt_ipc_alloc_stream(struct catpt_dev *cdev,
208 enum catpt_path_id path_id,
209 enum catpt_stream_type type,
210 struct catpt_audio_format *afmt,
211 struct catpt_ring_info *rinfo,
212 u8 num_modules,
213 struct catpt_module_entry *modules,
214 struct resource *persistent,
215 struct resource *scratch,
216 struct catpt_stream_info *sinfo);
217int catpt_ipc_free_stream(struct catpt_dev *cdev, u8 stream_hw_id);
218
219enum catpt_ssp_iface {
220 CATPT_SSP_IFACE_0 = 0,
221 CATPT_SSP_IFACE_1 = 1,
222 CATPT_SSP_COUNT,
223};
224
225enum catpt_mclk_frequency {
226 CATPT_MCLK_OFF = 0,
227 CATPT_MCLK_FREQ_6_MHZ = 1,
228 CATPT_MCLK_FREQ_21_MHZ = 2,
229 CATPT_MCLK_FREQ_24_MHZ = 3,
230};
231
232enum catpt_ssp_mode {
233 CATPT_SSP_MODE_I2S_CONSUMER = 0,
234 CATPT_SSP_MODE_I2S_PROVIDER = 1,
235 CATPT_SSP_MODE_TDM_PROVIDER = 2,
236};
237
238struct catpt_ssp_device_format {
239 u32 iface;
240 u32 mclk;
241 u32 mode;
242 u16 clock_divider;
243 u8 channels;
244} __packed;
245
246int catpt_ipc_set_device_format(struct catpt_dev *cdev,
247 struct catpt_ssp_device_format *devfmt);
248
249enum catpt_dx_state {
250 CATPT_DX_STATE_D3 = 3,
251};
252
253enum catpt_dx_type {
254 CATPT_DX_TYPE_FW_IMAGE = 0,
255 CATPT_DX_TYPE_MEMORY_DUMP = 1,
256};
257
258struct catpt_save_meminfo {
259 u32 offset;
260 u32 size;
261 u32 source;
262} __packed;
263
264#define SAVE_MEMINFO_MAX 14
265
266struct catpt_dx_context {
267 u32 num_meminfo;
268 struct catpt_save_meminfo meminfo[SAVE_MEMINFO_MAX];
269} __packed;
270
271int catpt_ipc_enter_dxstate(struct catpt_dev *cdev, enum catpt_dx_state state,
272 struct catpt_dx_context *context);
273
274struct catpt_mixer_stream_info {
275 u32 mixer_hw_id;
276 u32 peak_meter_regaddr[CATPT_CHANNELS_MAX];
277 u32 volume_regaddr[CATPT_CHANNELS_MAX];
278} __packed;
279
280int catpt_ipc_get_mixer_stream_info(struct catpt_dev *cdev,
281 struct catpt_mixer_stream_info *info);
282
283/* STREAM messages */
284
285enum catpt_stream_msg_type {
286 CATPT_STRM_RESET_STREAM = 0,
287 CATPT_STRM_PAUSE_STREAM = 1,
288 CATPT_STRM_RESUME_STREAM = 2,
289 CATPT_STRM_STAGE_MESSAGE = 3,
290 CATPT_STRM_NOTIFICATION = 4,
291};
292
293enum catpt_stage_action {
294 CATPT_STG_SET_VOLUME = 1,
295 CATPT_STG_SET_WRITE_POSITION = 2,
296 CATPT_STG_MUTE_LOOPBACK = 3,
297};
298
299union catpt_stream_msg {
300 u32 val;
301 struct {
302 u32 status:5;
303 u32 reserved:7;
304 u32 stage_action:4;
305 u32 stream_hw_id:4;
306 u32 stream_msg_type:4;
307 u32 global_msg_type:5;
308 u32 fw_ready:1;
309 u32 done:1;
310 u32 busy:1;
311 };
312} __packed;
313
314#define CATPT_STREAM_MSG(msg_type) \
315{ \
316 .stream_msg_type = CATPT_STRM_##msg_type, \
317 .global_msg_type = CATPT_GLB_STREAM_MESSAGE }
318#define CATPT_STAGE_MSG(msg_type) \
319{ \
320 .stage_action = CATPT_STG_##msg_type, \
321 .stream_msg_type = CATPT_STRM_STAGE_MESSAGE, \
322 .global_msg_type = CATPT_GLB_STREAM_MESSAGE }
323
324int catpt_ipc_reset_stream(struct catpt_dev *cdev, u8 stream_hw_id);
325int catpt_ipc_pause_stream(struct catpt_dev *cdev, u8 stream_hw_id);
326int catpt_ipc_resume_stream(struct catpt_dev *cdev, u8 stream_hw_id);
327
328/* STREAM messages - STAGE subtype */
329
330enum catpt_audio_curve_type {
331 CATPT_AUDIO_CURVE_NONE = 0,
332 CATPT_AUDIO_CURVE_WINDOWS_FADE = 1,
333};
334
335int catpt_ipc_set_volume(struct catpt_dev *cdev, u8 stream_hw_id,
336 u32 channel, u32 volume,
337 u32 curve_duration,
338 enum catpt_audio_curve_type curve_type);
339
340int catpt_ipc_set_write_pos(struct catpt_dev *cdev, u8 stream_hw_id,
341 u32 pos, bool eob, bool ll);
342
343int catpt_ipc_mute_loopback(struct catpt_dev *cdev, u8 stream_hw_id, bool mute);
344
345/* NOTIFICATION messages */
346
347enum catpt_notify_reason {
348 CATPT_NOTIFY_POSITION_CHANGED = 0,
349 CATPT_NOTIFY_GLITCH_OCCURRED = 1,
350};
351
352union catpt_notify_msg {
353 u32 val;
354 struct {
355 u32 mailbox_address:29;
356 u32 fw_ready:1;
357 u32 done:1;
358 u32 busy:1;
359 };
360 struct {
361 u32 status:5;
362 u32 reserved:7;
363 u32 notify_reason:4;
364 u32 stream_hw_id:4;
365 u32 stream_msg_type:4;
366 u32 global_msg_type:5;
367 u32 hdr:3; /* fw_ready, done, busy */
368 };
369} __packed;
370
371#define FW_INFO_SIZE_MAX 100
372
373struct catpt_fw_ready {
374 u32 inbox_offset;
375 u32 outbox_offset;
376 u32 inbox_size;
377 u32 outbox_size;
378 u32 fw_info_size;
379 char fw_info[FW_INFO_SIZE_MAX];
380} __packed;
381
382struct catpt_notify_position {
383 u32 stream_position;
384 u32 fw_cycle_count;
385} __packed;
386
387enum catpt_glitch_type {
388 CATPT_GLITCH_UNDERRUN = 1,
389 CATPT_GLITCH_DECODER_ERROR = 2,
390 CATPT_GLITCH_DOUBLED_WRITE_POS = 3,
391};
392
393struct catpt_notify_glitch {
394 u32 type;
395 u64 presentation_pos;
396 u32 write_pos;
397} __packed;
398
399#endif
400

source code of linux/sound/soc/intel/catpt/messages.h