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