xref: /openbmc/linux/sound/soc/intel/catpt/messages.h (revision b695f5c0)
192946c1dSCezary Rojewski /* SPDX-License-Identifier: GPL-2.0-only */
292946c1dSCezary Rojewski /*
392946c1dSCezary Rojewski  * Copyright(c) 2020 Intel Corporation. All rights reserved.
492946c1dSCezary Rojewski  *
592946c1dSCezary Rojewski  * Author: Cezary Rojewski <cezary.rojewski@intel.com>
692946c1dSCezary Rojewski  */
792946c1dSCezary Rojewski 
892946c1dSCezary Rojewski #ifndef __SND_SOC_INTEL_CATPT_MSG_H
992946c1dSCezary Rojewski #define __SND_SOC_INTEL_CATPT_MSG_H
1092946c1dSCezary Rojewski 
1192946c1dSCezary Rojewski struct catpt_dev;
1292946c1dSCezary Rojewski 
1392946c1dSCezary Rojewski /* IPC messages base types  */
1492946c1dSCezary Rojewski 
1592946c1dSCezary Rojewski enum catpt_reply_status {
1692946c1dSCezary Rojewski 	CATPT_REPLY_SUCCESS = 0,
1792946c1dSCezary Rojewski 	CATPT_REPLY_ERROR_INVALID_PARAM = 1,
1892946c1dSCezary Rojewski 	CATPT_REPLY_UNKNOWN_MESSAGE_TYPE = 2,
1992946c1dSCezary Rojewski 	CATPT_REPLY_OUT_OF_RESOURCES = 3,
2092946c1dSCezary Rojewski 	CATPT_REPLY_BUSY = 4,
2192946c1dSCezary Rojewski 	CATPT_REPLY_PENDING = 5,
2292946c1dSCezary Rojewski 	CATPT_REPLY_FAILURE = 6,
2392946c1dSCezary Rojewski 	CATPT_REPLY_INVALID_REQUEST = 7,
2492946c1dSCezary Rojewski 	CATPT_REPLY_UNINITIALIZED = 8,
2592946c1dSCezary Rojewski 	CATPT_REPLY_NOT_FOUND = 9,
2692946c1dSCezary Rojewski 	CATPT_REPLY_SOURCE_NOT_STARTED = 10,
2792946c1dSCezary Rojewski };
2892946c1dSCezary Rojewski 
2992946c1dSCezary Rojewski /* GLOBAL messages */
3092946c1dSCezary Rojewski 
3192946c1dSCezary Rojewski enum catpt_global_msg_type {
3292946c1dSCezary Rojewski 	CATPT_GLB_GET_FW_VERSION = 0,
3392946c1dSCezary Rojewski 	CATPT_GLB_ALLOCATE_STREAM = 3,
3492946c1dSCezary Rojewski 	CATPT_GLB_FREE_STREAM = 4,
3592946c1dSCezary Rojewski 	CATPT_GLB_STREAM_MESSAGE = 6,
3692946c1dSCezary Rojewski 	CATPT_GLB_REQUEST_CORE_DUMP = 7,
3792946c1dSCezary Rojewski 	CATPT_GLB_SET_DEVICE_FORMATS = 10,
3892946c1dSCezary Rojewski 	CATPT_GLB_ENTER_DX_STATE = 12,
3992946c1dSCezary Rojewski 	CATPT_GLB_GET_MIXER_STREAM_INFO = 13,
4092946c1dSCezary Rojewski };
4192946c1dSCezary Rojewski 
4292946c1dSCezary Rojewski union catpt_global_msg {
4392946c1dSCezary Rojewski 	u32 val;
4492946c1dSCezary Rojewski 	struct {
4592946c1dSCezary Rojewski 		u32 status:5;
4692946c1dSCezary Rojewski 		u32 context:19; /* stream or module specific */
4792946c1dSCezary Rojewski 		u32 global_msg_type:5;
4892946c1dSCezary Rojewski 		u32 fw_ready:1;
4992946c1dSCezary Rojewski 		u32 done:1;
5092946c1dSCezary Rojewski 		u32 busy:1;
5192946c1dSCezary Rojewski 	};
5292946c1dSCezary Rojewski } __packed;
5392946c1dSCezary Rojewski 
5492946c1dSCezary Rojewski #define CATPT_MSG(hdr) { .val = hdr }
5592946c1dSCezary Rojewski #define CATPT_GLOBAL_MSG(msg_type) \
5692946c1dSCezary Rojewski 	{ .global_msg_type = CATPT_GLB_##msg_type }
5792946c1dSCezary Rojewski 
5892946c1dSCezary Rojewski #define BUILD_HASH_SIZE		40
5992946c1dSCezary Rojewski 
6092946c1dSCezary Rojewski struct catpt_fw_version {
6192946c1dSCezary Rojewski 	u8 build;
6292946c1dSCezary Rojewski 	u8 minor;
6392946c1dSCezary Rojewski 	u8 major;
6492946c1dSCezary Rojewski 	u8 type;
6592946c1dSCezary Rojewski 	u8 build_hash[BUILD_HASH_SIZE];
6692946c1dSCezary Rojewski 	u32 log_providers_hash;
6792946c1dSCezary Rojewski } __packed;
6892946c1dSCezary Rojewski 
6992946c1dSCezary Rojewski int catpt_ipc_get_fw_version(struct catpt_dev *cdev,
7092946c1dSCezary Rojewski 			     struct catpt_fw_version *version);
7192946c1dSCezary Rojewski 
7292946c1dSCezary Rojewski enum catpt_pin_id {
7392946c1dSCezary Rojewski 	CATPT_PIN_ID_SYSTEM = 0,
7492946c1dSCezary Rojewski 	CATPT_PIN_ID_REFERENCE = 1,
7592946c1dSCezary Rojewski 	CATPT_PIN_ID_CAPTURE1 = 2,
7692946c1dSCezary Rojewski 	CATPT_PIN_ID_CAPTURE2 = 3,
7792946c1dSCezary Rojewski 	CATPT_PIN_ID_OFFLOAD1 = 4,
7892946c1dSCezary Rojewski 	CATPT_PIN_ID_OFFLOAD2 = 5,
7992946c1dSCezary Rojewski 	CATPT_PIN_ID_MIXER = 7,
8092946c1dSCezary Rojewski 	CATPT_PIN_ID_BLUETOOTH_CAPTURE = 8,
8192946c1dSCezary Rojewski 	CATPT_PIN_ID_BLUETOOTH_RENDER = 9,
8292946c1dSCezary Rojewski };
8392946c1dSCezary Rojewski 
8492946c1dSCezary Rojewski enum catpt_path_id {
8592946c1dSCezary Rojewski 	CATPT_PATH_SSP0_OUT = 0,
8692946c1dSCezary Rojewski 	CATPT_PATH_SSP0_IN = 1,
8792946c1dSCezary Rojewski 	CATPT_PATH_SSP1_OUT = 2,
8892946c1dSCezary Rojewski 	CATPT_PATH_SSP1_IN = 3,
8992946c1dSCezary Rojewski 	/* duplicated audio in capture path */
9092946c1dSCezary Rojewski 	CATPT_PATH_SSP0_IN_DUP = 4,
9192946c1dSCezary Rojewski };
9292946c1dSCezary Rojewski 
9392946c1dSCezary Rojewski enum catpt_stream_type {
9492946c1dSCezary Rojewski 	CATPT_STRM_TYPE_RENDER = 0, /* offload */
9592946c1dSCezary Rojewski 	CATPT_STRM_TYPE_SYSTEM = 1,
9692946c1dSCezary Rojewski 	CATPT_STRM_TYPE_CAPTURE = 2,
9792946c1dSCezary Rojewski 	CATPT_STRM_TYPE_LOOPBACK = 3,
9892946c1dSCezary Rojewski 	CATPT_STRM_TYPE_BLUETOOTH_RENDER = 4,
9992946c1dSCezary Rojewski 	CATPT_STRM_TYPE_BLUETOOTH_CAPTURE = 5,
10092946c1dSCezary Rojewski };
10192946c1dSCezary Rojewski 
10292946c1dSCezary Rojewski enum catpt_format_id {
10392946c1dSCezary Rojewski 	CATPT_FORMAT_PCM = 0,
10492946c1dSCezary Rojewski 	CATPT_FORMAT_MP3 = 1,
10592946c1dSCezary Rojewski 	CATPT_FORMAT_AAC = 2,
10692946c1dSCezary Rojewski 	CATPT_FORMAT_WMA = 3,
10792946c1dSCezary Rojewski };
10892946c1dSCezary Rojewski 
10992946c1dSCezary Rojewski enum catpt_channel_index {
11092946c1dSCezary Rojewski 	CATPT_CHANNEL_LEFT = 0x0,
11192946c1dSCezary Rojewski 	CATPT_CHANNEL_CENTER = 0x1,
11292946c1dSCezary Rojewski 	CATPT_CHANNEL_RIGHT = 0x2,
11392946c1dSCezary Rojewski 	CATPT_CHANNEL_LEFT_SURROUND = 0x3,
11492946c1dSCezary Rojewski 	CATPT_CHANNEL_CENTER_SURROUND = 0x3,
11592946c1dSCezary Rojewski 	CATPT_CHANNEL_RIGHT_SURROUND = 0x4,
11692946c1dSCezary Rojewski 	CATPT_CHANNEL_LFE = 0x7,
11792946c1dSCezary Rojewski 	CATPT_CHANNEL_INVALID = 0xF,
11892946c1dSCezary Rojewski };
11992946c1dSCezary Rojewski 
12092946c1dSCezary Rojewski enum catpt_channel_config {
12192946c1dSCezary Rojewski 	CATPT_CHANNEL_CONFIG_MONO	= 0, /* One channel only */
12292946c1dSCezary Rojewski 	CATPT_CHANNEL_CONFIG_STEREO	= 1, /* L & R */
12392946c1dSCezary Rojewski 	CATPT_CHANNEL_CONFIG_2_POINT_1	= 2, /* L, R & LFE; PCM only */
12492946c1dSCezary Rojewski 	CATPT_CHANNEL_CONFIG_3_POINT_0	= 3, /* L, C & R; MP3 & AAC only */
12592946c1dSCezary Rojewski 	CATPT_CHANNEL_CONFIG_3_POINT_1	= 4, /* L, C, R & LFE; PCM only */
12692946c1dSCezary Rojewski 	CATPT_CHANNEL_CONFIG_QUATRO	= 5, /* L, R, Ls & Rs; PCM only */
12792946c1dSCezary Rojewski 	CATPT_CHANNEL_CONFIG_4_POINT_0	= 6, /* L, C, R & Cs; MP3 & AAC only */
12892946c1dSCezary Rojewski 	CATPT_CHANNEL_CONFIG_5_POINT_0	= 7, /* L, C, R, Ls & Rs */
12992946c1dSCezary Rojewski 	CATPT_CHANNEL_CONFIG_5_POINT_1	= 8, /* L, C, R, Ls, Rs & LFE */
13092946c1dSCezary Rojewski 	CATPT_CHANNEL_CONFIG_DUAL_MONO	= 9, /* One channel replicated in two */
13192946c1dSCezary Rojewski 	CATPT_CHANNEL_CONFIG_INVALID	= 10,
13292946c1dSCezary Rojewski };
13392946c1dSCezary Rojewski 
13492946c1dSCezary Rojewski enum catpt_interleaving_style {
13592946c1dSCezary Rojewski 	CATPT_INTERLEAVING_PER_CHANNEL	= 0,
13692946c1dSCezary Rojewski 	CATPT_INTERLEAVING_PER_SAMPLE	= 1,
13792946c1dSCezary Rojewski };
13892946c1dSCezary Rojewski 
13992946c1dSCezary Rojewski struct catpt_audio_format {
14092946c1dSCezary Rojewski 	u32 sample_rate;
14192946c1dSCezary Rojewski 	u32 bit_depth;
14292946c1dSCezary Rojewski 	u32 channel_map;
14392946c1dSCezary Rojewski 	u32 channel_config;
14492946c1dSCezary Rojewski 	u32 interleaving;
14592946c1dSCezary Rojewski 	u8 num_channels;
14692946c1dSCezary Rojewski 	u8 valid_bit_depth;
14792946c1dSCezary Rojewski 	u8 reserved[2];
14892946c1dSCezary Rojewski } __packed;
14992946c1dSCezary Rojewski 
15092946c1dSCezary Rojewski struct catpt_ring_info {
15192946c1dSCezary Rojewski 	u32 page_table_addr;
15292946c1dSCezary Rojewski 	u32 num_pages;
15392946c1dSCezary Rojewski 	u32 size;
15492946c1dSCezary Rojewski 	u32 offset;
15592946c1dSCezary Rojewski 	u32 ring_first_page_pfn;
15692946c1dSCezary Rojewski } __packed;
15792946c1dSCezary Rojewski 
15892946c1dSCezary Rojewski #define CATPT_MODULE_COUNT (CATPT_MODID_LAST + 1)
15992946c1dSCezary Rojewski 
16092946c1dSCezary Rojewski enum catpt_module_id {
16192946c1dSCezary Rojewski 	CATPT_MODID_BASE_FW		= 0x0,
16292946c1dSCezary Rojewski 	CATPT_MODID_MP3			= 0x1,
16392946c1dSCezary Rojewski 	CATPT_MODID_AAC_5_1		= 0x2,
16492946c1dSCezary Rojewski 	CATPT_MODID_AAC_2_0		= 0x3,
16592946c1dSCezary Rojewski 	CATPT_MODID_SRC			= 0x4,
16692946c1dSCezary Rojewski 	CATPT_MODID_WAVES		= 0x5,
16792946c1dSCezary Rojewski 	CATPT_MODID_DOLBY		= 0x6,
16892946c1dSCezary Rojewski 	CATPT_MODID_BOOST		= 0x7,
16992946c1dSCezary Rojewski 	CATPT_MODID_LPAL		= 0x8,
17092946c1dSCezary Rojewski 	CATPT_MODID_DTS			= 0x9,
17192946c1dSCezary Rojewski 	CATPT_MODID_PCM_CAPTURE		= 0xA,
17292946c1dSCezary Rojewski 	CATPT_MODID_PCM_SYSTEM		= 0xB,
17392946c1dSCezary Rojewski 	CATPT_MODID_PCM_REFERENCE	= 0xC,
17492946c1dSCezary Rojewski 	CATPT_MODID_PCM			= 0xD, /* offload */
17592946c1dSCezary Rojewski 	CATPT_MODID_BLUETOOTH_RENDER	= 0xE,
17692946c1dSCezary Rojewski 	CATPT_MODID_BLUETOOTH_CAPTURE	= 0xF,
17792946c1dSCezary Rojewski 	CATPT_MODID_LAST		= CATPT_MODID_BLUETOOTH_CAPTURE,
17892946c1dSCezary Rojewski };
17992946c1dSCezary Rojewski 
18092946c1dSCezary Rojewski struct catpt_module_entry {
18192946c1dSCezary Rojewski 	u32 module_id;
18292946c1dSCezary Rojewski 	u32 entry_point;
18392946c1dSCezary Rojewski } __packed;
18492946c1dSCezary Rojewski 
18592946c1dSCezary Rojewski struct catpt_module_map {
18692946c1dSCezary Rojewski 	u8 num_entries;
18792946c1dSCezary Rojewski 	struct catpt_module_entry entries[];
18892946c1dSCezary Rojewski } __packed;
18992946c1dSCezary Rojewski 
19092946c1dSCezary Rojewski struct catpt_memory_info {
19192946c1dSCezary Rojewski 	u32 offset;
19292946c1dSCezary Rojewski 	u32 size;
19392946c1dSCezary Rojewski } __packed;
19492946c1dSCezary Rojewski 
19592946c1dSCezary Rojewski #define CATPT_CHANNELS_MAX	4
19692946c1dSCezary Rojewski #define CATPT_ALL_CHANNELS_MASK	UINT_MAX
19792946c1dSCezary Rojewski 
19892946c1dSCezary Rojewski struct catpt_stream_info {
19992946c1dSCezary Rojewski 	u32 stream_hw_id;
20092946c1dSCezary Rojewski 	u32 reserved;
20192946c1dSCezary Rojewski 	u32 read_pos_regaddr;
20292946c1dSCezary Rojewski 	u32 pres_pos_regaddr;
20392946c1dSCezary Rojewski 	u32 peak_meter_regaddr[CATPT_CHANNELS_MAX];
20492946c1dSCezary Rojewski 	u32 volume_regaddr[CATPT_CHANNELS_MAX];
20592946c1dSCezary Rojewski } __packed;
20692946c1dSCezary Rojewski 
20792946c1dSCezary Rojewski int catpt_ipc_alloc_stream(struct catpt_dev *cdev,
20892946c1dSCezary Rojewski 			   enum catpt_path_id path_id,
20992946c1dSCezary Rojewski 			   enum catpt_stream_type type,
21092946c1dSCezary Rojewski 			   struct catpt_audio_format *afmt,
21192946c1dSCezary Rojewski 			   struct catpt_ring_info *rinfo,
21292946c1dSCezary Rojewski 			   u8 num_modules,
21392946c1dSCezary Rojewski 			   struct catpt_module_entry *modules,
21492946c1dSCezary Rojewski 			   struct resource *persistent,
21592946c1dSCezary Rojewski 			   struct resource *scratch,
21692946c1dSCezary Rojewski 			   struct catpt_stream_info *sinfo);
21792946c1dSCezary Rojewski int catpt_ipc_free_stream(struct catpt_dev *cdev, u8 stream_hw_id);
21892946c1dSCezary Rojewski 
21992946c1dSCezary Rojewski enum catpt_ssp_iface {
22092946c1dSCezary Rojewski 	CATPT_SSP_IFACE_0 = 0,
22192946c1dSCezary Rojewski 	CATPT_SSP_IFACE_1 = 1,
222*b695f5c0SCezary Rojewski 	CATPT_SSP_COUNT,
22392946c1dSCezary Rojewski };
22492946c1dSCezary Rojewski 
22592946c1dSCezary Rojewski enum catpt_mclk_frequency {
22692946c1dSCezary Rojewski 	CATPT_MCLK_OFF = 0,
22792946c1dSCezary Rojewski 	CATPT_MCLK_FREQ_6_MHZ = 1,
22892946c1dSCezary Rojewski 	CATPT_MCLK_FREQ_21_MHZ = 2,
22992946c1dSCezary Rojewski 	CATPT_MCLK_FREQ_24_MHZ = 3,
23092946c1dSCezary Rojewski };
23192946c1dSCezary Rojewski 
23292946c1dSCezary Rojewski enum catpt_ssp_mode {
23392946c1dSCezary Rojewski 	CATPT_SSP_MODE_I2S_CONSUMER = 0,
23492946c1dSCezary Rojewski 	CATPT_SSP_MODE_I2S_PROVIDER = 1,
23592946c1dSCezary Rojewski 	CATPT_SSP_MODE_TDM_PROVIDER = 2,
23692946c1dSCezary Rojewski };
23792946c1dSCezary Rojewski 
23892946c1dSCezary Rojewski struct catpt_ssp_device_format {
23992946c1dSCezary Rojewski 	u32 iface;
24092946c1dSCezary Rojewski 	u32 mclk;
24192946c1dSCezary Rojewski 	u32 mode;
24292946c1dSCezary Rojewski 	u16 clock_divider;
24392946c1dSCezary Rojewski 	u8 channels;
24492946c1dSCezary Rojewski } __packed;
24592946c1dSCezary Rojewski 
24692946c1dSCezary Rojewski int catpt_ipc_set_device_format(struct catpt_dev *cdev,
24792946c1dSCezary Rojewski 				struct catpt_ssp_device_format *devfmt);
24892946c1dSCezary Rojewski 
24992946c1dSCezary Rojewski enum catpt_dx_state {
25092946c1dSCezary Rojewski 	CATPT_DX_STATE_D3 = 3,
25192946c1dSCezary Rojewski };
25292946c1dSCezary Rojewski 
25392946c1dSCezary Rojewski enum catpt_dx_type {
25492946c1dSCezary Rojewski 	CATPT_DX_TYPE_FW_IMAGE = 0,
25592946c1dSCezary Rojewski 	CATPT_DX_TYPE_MEMORY_DUMP = 1,
25692946c1dSCezary Rojewski };
25792946c1dSCezary Rojewski 
25892946c1dSCezary Rojewski struct catpt_save_meminfo {
25992946c1dSCezary Rojewski 	u32 offset;
26092946c1dSCezary Rojewski 	u32 size;
26192946c1dSCezary Rojewski 	u32 source;
26292946c1dSCezary Rojewski } __packed;
26392946c1dSCezary Rojewski 
26492946c1dSCezary Rojewski #define SAVE_MEMINFO_MAX	14
26592946c1dSCezary Rojewski 
26692946c1dSCezary Rojewski struct catpt_dx_context {
26792946c1dSCezary Rojewski 	u32 num_meminfo;
26892946c1dSCezary Rojewski 	struct catpt_save_meminfo meminfo[SAVE_MEMINFO_MAX];
26992946c1dSCezary Rojewski } __packed;
27092946c1dSCezary Rojewski 
27192946c1dSCezary Rojewski int catpt_ipc_enter_dxstate(struct catpt_dev *cdev, enum catpt_dx_state state,
27292946c1dSCezary Rojewski 			    struct catpt_dx_context *context);
27392946c1dSCezary Rojewski 
27492946c1dSCezary Rojewski struct catpt_mixer_stream_info {
27592946c1dSCezary Rojewski 	u32 mixer_hw_id;
27692946c1dSCezary Rojewski 	u32 peak_meter_regaddr[CATPT_CHANNELS_MAX];
27792946c1dSCezary Rojewski 	u32 volume_regaddr[CATPT_CHANNELS_MAX];
27892946c1dSCezary Rojewski } __packed;
27992946c1dSCezary Rojewski 
28092946c1dSCezary Rojewski int catpt_ipc_get_mixer_stream_info(struct catpt_dev *cdev,
28192946c1dSCezary Rojewski 				    struct catpt_mixer_stream_info *info);
28292946c1dSCezary Rojewski 
28392946c1dSCezary Rojewski /* STREAM messages */
28492946c1dSCezary Rojewski 
28592946c1dSCezary Rojewski enum catpt_stream_msg_type {
28692946c1dSCezary Rojewski 	CATPT_STRM_RESET_STREAM = 0,
28792946c1dSCezary Rojewski 	CATPT_STRM_PAUSE_STREAM = 1,
28892946c1dSCezary Rojewski 	CATPT_STRM_RESUME_STREAM = 2,
28992946c1dSCezary Rojewski 	CATPT_STRM_STAGE_MESSAGE = 3,
29092946c1dSCezary Rojewski 	CATPT_STRM_NOTIFICATION = 4,
29192946c1dSCezary Rojewski };
29292946c1dSCezary Rojewski 
29392946c1dSCezary Rojewski enum catpt_stage_action {
29492946c1dSCezary Rojewski 	CATPT_STG_SET_VOLUME = 1,
29592946c1dSCezary Rojewski 	CATPT_STG_SET_WRITE_POSITION = 2,
29692946c1dSCezary Rojewski 	CATPT_STG_MUTE_LOOPBACK = 3,
29792946c1dSCezary Rojewski };
29892946c1dSCezary Rojewski 
29992946c1dSCezary Rojewski union catpt_stream_msg {
30092946c1dSCezary Rojewski 	u32 val;
30192946c1dSCezary Rojewski 	struct {
30292946c1dSCezary Rojewski 		u32 status:5;
30392946c1dSCezary Rojewski 		u32 reserved:7;
30492946c1dSCezary Rojewski 		u32 stage_action:4;
30592946c1dSCezary Rojewski 		u32 stream_hw_id:4;
30692946c1dSCezary Rojewski 		u32 stream_msg_type:4;
30792946c1dSCezary Rojewski 		u32 global_msg_type:5;
30892946c1dSCezary Rojewski 		u32 fw_ready:1;
30992946c1dSCezary Rojewski 		u32 done:1;
31092946c1dSCezary Rojewski 		u32 busy:1;
31192946c1dSCezary Rojewski 	};
31292946c1dSCezary Rojewski } __packed;
31392946c1dSCezary Rojewski 
31492946c1dSCezary Rojewski #define CATPT_STREAM_MSG(msg_type) \
31592946c1dSCezary Rojewski { \
31692946c1dSCezary Rojewski 	.stream_msg_type = CATPT_STRM_##msg_type, \
31792946c1dSCezary Rojewski 	.global_msg_type = CATPT_GLB_STREAM_MESSAGE }
31892946c1dSCezary Rojewski #define CATPT_STAGE_MSG(msg_type) \
31992946c1dSCezary Rojewski { \
32092946c1dSCezary Rojewski 	.stage_action = CATPT_STG_##msg_type, \
32192946c1dSCezary Rojewski 	.stream_msg_type = CATPT_STRM_STAGE_MESSAGE, \
32292946c1dSCezary Rojewski 	.global_msg_type = CATPT_GLB_STREAM_MESSAGE }
32392946c1dSCezary Rojewski 
32492946c1dSCezary Rojewski int catpt_ipc_reset_stream(struct catpt_dev *cdev, u8 stream_hw_id);
32592946c1dSCezary Rojewski int catpt_ipc_pause_stream(struct catpt_dev *cdev, u8 stream_hw_id);
32692946c1dSCezary Rojewski int catpt_ipc_resume_stream(struct catpt_dev *cdev, u8 stream_hw_id);
32792946c1dSCezary Rojewski 
32892946c1dSCezary Rojewski /* STREAM messages - STAGE subtype */
32992946c1dSCezary Rojewski 
33092946c1dSCezary Rojewski enum catpt_audio_curve_type {
33192946c1dSCezary Rojewski 	CATPT_AUDIO_CURVE_NONE = 0,
33292946c1dSCezary Rojewski 	CATPT_AUDIO_CURVE_WINDOWS_FADE = 1,
33392946c1dSCezary Rojewski };
33492946c1dSCezary Rojewski 
33592946c1dSCezary Rojewski int catpt_ipc_set_volume(struct catpt_dev *cdev, u8 stream_hw_id,
33692946c1dSCezary Rojewski 			 u32 channel, u32 volume,
33792946c1dSCezary Rojewski 			 u32 curve_duration,
33892946c1dSCezary Rojewski 			 enum catpt_audio_curve_type curve_type);
33992946c1dSCezary Rojewski 
34092946c1dSCezary Rojewski int catpt_ipc_set_write_pos(struct catpt_dev *cdev, u8 stream_hw_id,
34192946c1dSCezary Rojewski 			    u32 pos, bool eob, bool ll);
34292946c1dSCezary Rojewski 
34392946c1dSCezary Rojewski int catpt_ipc_mute_loopback(struct catpt_dev *cdev, u8 stream_hw_id, bool mute);
34492946c1dSCezary Rojewski 
34592946c1dSCezary Rojewski /* NOTIFICATION messages */
34692946c1dSCezary Rojewski 
34792946c1dSCezary Rojewski enum catpt_notify_reason {
34892946c1dSCezary Rojewski 	CATPT_NOTIFY_POSITION_CHANGED = 0,
34992946c1dSCezary Rojewski 	CATPT_NOTIFY_GLITCH_OCCURRED = 1,
35092946c1dSCezary Rojewski };
35192946c1dSCezary Rojewski 
35292946c1dSCezary Rojewski union catpt_notify_msg {
35392946c1dSCezary Rojewski 	u32 val;
35492946c1dSCezary Rojewski 	struct {
35592946c1dSCezary Rojewski 		u32 mailbox_address:29;
35692946c1dSCezary Rojewski 		u32 fw_ready:1;
35792946c1dSCezary Rojewski 		u32 done:1;
35892946c1dSCezary Rojewski 		u32 busy:1;
35992946c1dSCezary Rojewski 	};
36092946c1dSCezary Rojewski 	struct {
36192946c1dSCezary Rojewski 		u32 status:5;
36292946c1dSCezary Rojewski 		u32 reserved:7;
36392946c1dSCezary Rojewski 		u32 notify_reason:4;
36492946c1dSCezary Rojewski 		u32 stream_hw_id:4;
36592946c1dSCezary Rojewski 		u32 stream_msg_type:4;
36692946c1dSCezary Rojewski 		u32 global_msg_type:5;
36792946c1dSCezary Rojewski 		u32 hdr:3; /* fw_ready, done, busy */
36892946c1dSCezary Rojewski 	};
36992946c1dSCezary Rojewski } __packed;
37092946c1dSCezary Rojewski 
37192946c1dSCezary Rojewski #define FW_INFO_SIZE_MAX	100
37292946c1dSCezary Rojewski 
37392946c1dSCezary Rojewski struct catpt_fw_ready {
37492946c1dSCezary Rojewski 	u32 inbox_offset;
37592946c1dSCezary Rojewski 	u32 outbox_offset;
37692946c1dSCezary Rojewski 	u32 inbox_size;
37792946c1dSCezary Rojewski 	u32 outbox_size;
37892946c1dSCezary Rojewski 	u32 fw_info_size;
37992946c1dSCezary Rojewski 	char fw_info[FW_INFO_SIZE_MAX];
38092946c1dSCezary Rojewski } __packed;
38192946c1dSCezary Rojewski 
38292946c1dSCezary Rojewski struct catpt_notify_position {
38392946c1dSCezary Rojewski 	u32 stream_position;
38492946c1dSCezary Rojewski 	u32 fw_cycle_count;
38592946c1dSCezary Rojewski } __packed;
38692946c1dSCezary Rojewski 
38792946c1dSCezary Rojewski enum catpt_glitch_type {
38892946c1dSCezary Rojewski 	CATPT_GLITCH_UNDERRUN = 1,
38992946c1dSCezary Rojewski 	CATPT_GLITCH_DECODER_ERROR = 2,
39092946c1dSCezary Rojewski 	CATPT_GLITCH_DOUBLED_WRITE_POS = 3,
39192946c1dSCezary Rojewski };
39292946c1dSCezary Rojewski 
39392946c1dSCezary Rojewski struct catpt_notify_glitch {
39492946c1dSCezary Rojewski 	u32 type;
39592946c1dSCezary Rojewski 	u64 presentation_pos;
39692946c1dSCezary Rojewski 	u32 write_pos;
39792946c1dSCezary Rojewski } __packed;
39892946c1dSCezary Rojewski 
39992946c1dSCezary Rojewski #endif
400