162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright(c) 2020 Intel Corporation. All rights reserved.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Author: Cezary Rojewski <cezary.rojewski@intel.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef __SND_SOC_INTEL_CATPT_MSG_H
962306a36Sopenharmony_ci#define __SND_SOC_INTEL_CATPT_MSG_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistruct catpt_dev;
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/* IPC messages base types  */
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cienum catpt_reply_status {
1662306a36Sopenharmony_ci	CATPT_REPLY_SUCCESS = 0,
1762306a36Sopenharmony_ci	CATPT_REPLY_ERROR_INVALID_PARAM = 1,
1862306a36Sopenharmony_ci	CATPT_REPLY_UNKNOWN_MESSAGE_TYPE = 2,
1962306a36Sopenharmony_ci	CATPT_REPLY_OUT_OF_RESOURCES = 3,
2062306a36Sopenharmony_ci	CATPT_REPLY_BUSY = 4,
2162306a36Sopenharmony_ci	CATPT_REPLY_PENDING = 5,
2262306a36Sopenharmony_ci	CATPT_REPLY_FAILURE = 6,
2362306a36Sopenharmony_ci	CATPT_REPLY_INVALID_REQUEST = 7,
2462306a36Sopenharmony_ci	CATPT_REPLY_UNINITIALIZED = 8,
2562306a36Sopenharmony_ci	CATPT_REPLY_NOT_FOUND = 9,
2662306a36Sopenharmony_ci	CATPT_REPLY_SOURCE_NOT_STARTED = 10,
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/* GLOBAL messages */
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cienum catpt_global_msg_type {
3262306a36Sopenharmony_ci	CATPT_GLB_GET_FW_VERSION = 0,
3362306a36Sopenharmony_ci	CATPT_GLB_ALLOCATE_STREAM = 3,
3462306a36Sopenharmony_ci	CATPT_GLB_FREE_STREAM = 4,
3562306a36Sopenharmony_ci	CATPT_GLB_STREAM_MESSAGE = 6,
3662306a36Sopenharmony_ci	CATPT_GLB_REQUEST_CORE_DUMP = 7,
3762306a36Sopenharmony_ci	CATPT_GLB_SET_DEVICE_FORMATS = 10,
3862306a36Sopenharmony_ci	CATPT_GLB_ENTER_DX_STATE = 12,
3962306a36Sopenharmony_ci	CATPT_GLB_GET_MIXER_STREAM_INFO = 13,
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ciunion catpt_global_msg {
4362306a36Sopenharmony_ci	u32 val;
4462306a36Sopenharmony_ci	struct {
4562306a36Sopenharmony_ci		u32 status:5;
4662306a36Sopenharmony_ci		u32 context:19; /* stream or module specific */
4762306a36Sopenharmony_ci		u32 global_msg_type:5;
4862306a36Sopenharmony_ci		u32 fw_ready:1;
4962306a36Sopenharmony_ci		u32 done:1;
5062306a36Sopenharmony_ci		u32 busy:1;
5162306a36Sopenharmony_ci	};
5262306a36Sopenharmony_ci} __packed;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#define CATPT_MSG(hdr) { .val = hdr }
5562306a36Sopenharmony_ci#define CATPT_GLOBAL_MSG(msg_type) \
5662306a36Sopenharmony_ci	{ .global_msg_type = CATPT_GLB_##msg_type }
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#define BUILD_HASH_SIZE		40
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistruct catpt_fw_version {
6162306a36Sopenharmony_ci	u8 build;
6262306a36Sopenharmony_ci	u8 minor;
6362306a36Sopenharmony_ci	u8 major;
6462306a36Sopenharmony_ci	u8 type;
6562306a36Sopenharmony_ci	u8 build_hash[BUILD_HASH_SIZE];
6662306a36Sopenharmony_ci	u32 log_providers_hash;
6762306a36Sopenharmony_ci} __packed;
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ciint catpt_ipc_get_fw_version(struct catpt_dev *cdev,
7062306a36Sopenharmony_ci			     struct catpt_fw_version *version);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cienum catpt_pin_id {
7362306a36Sopenharmony_ci	CATPT_PIN_ID_SYSTEM = 0,
7462306a36Sopenharmony_ci	CATPT_PIN_ID_REFERENCE = 1,
7562306a36Sopenharmony_ci	CATPT_PIN_ID_CAPTURE1 = 2,
7662306a36Sopenharmony_ci	CATPT_PIN_ID_CAPTURE2 = 3,
7762306a36Sopenharmony_ci	CATPT_PIN_ID_OFFLOAD1 = 4,
7862306a36Sopenharmony_ci	CATPT_PIN_ID_OFFLOAD2 = 5,
7962306a36Sopenharmony_ci	CATPT_PIN_ID_MIXER = 7,
8062306a36Sopenharmony_ci	CATPT_PIN_ID_BLUETOOTH_CAPTURE = 8,
8162306a36Sopenharmony_ci	CATPT_PIN_ID_BLUETOOTH_RENDER = 9,
8262306a36Sopenharmony_ci};
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cienum catpt_path_id {
8562306a36Sopenharmony_ci	CATPT_PATH_SSP0_OUT = 0,
8662306a36Sopenharmony_ci	CATPT_PATH_SSP0_IN = 1,
8762306a36Sopenharmony_ci	CATPT_PATH_SSP1_OUT = 2,
8862306a36Sopenharmony_ci	CATPT_PATH_SSP1_IN = 3,
8962306a36Sopenharmony_ci	/* duplicated audio in capture path */
9062306a36Sopenharmony_ci	CATPT_PATH_SSP0_IN_DUP = 4,
9162306a36Sopenharmony_ci};
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cienum catpt_stream_type {
9462306a36Sopenharmony_ci	CATPT_STRM_TYPE_RENDER = 0, /* offload */
9562306a36Sopenharmony_ci	CATPT_STRM_TYPE_SYSTEM = 1,
9662306a36Sopenharmony_ci	CATPT_STRM_TYPE_CAPTURE = 2,
9762306a36Sopenharmony_ci	CATPT_STRM_TYPE_LOOPBACK = 3,
9862306a36Sopenharmony_ci	CATPT_STRM_TYPE_BLUETOOTH_RENDER = 4,
9962306a36Sopenharmony_ci	CATPT_STRM_TYPE_BLUETOOTH_CAPTURE = 5,
10062306a36Sopenharmony_ci};
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cienum catpt_format_id {
10362306a36Sopenharmony_ci	CATPT_FORMAT_PCM = 0,
10462306a36Sopenharmony_ci	CATPT_FORMAT_MP3 = 1,
10562306a36Sopenharmony_ci	CATPT_FORMAT_AAC = 2,
10662306a36Sopenharmony_ci	CATPT_FORMAT_WMA = 3,
10762306a36Sopenharmony_ci};
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_cienum catpt_channel_index {
11062306a36Sopenharmony_ci	CATPT_CHANNEL_LEFT = 0x0,
11162306a36Sopenharmony_ci	CATPT_CHANNEL_CENTER = 0x1,
11262306a36Sopenharmony_ci	CATPT_CHANNEL_RIGHT = 0x2,
11362306a36Sopenharmony_ci	CATPT_CHANNEL_LEFT_SURROUND = 0x3,
11462306a36Sopenharmony_ci	CATPT_CHANNEL_CENTER_SURROUND = 0x3,
11562306a36Sopenharmony_ci	CATPT_CHANNEL_RIGHT_SURROUND = 0x4,
11662306a36Sopenharmony_ci	CATPT_CHANNEL_LFE = 0x7,
11762306a36Sopenharmony_ci	CATPT_CHANNEL_INVALID = 0xF,
11862306a36Sopenharmony_ci};
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cienum catpt_channel_config {
12162306a36Sopenharmony_ci	CATPT_CHANNEL_CONFIG_MONO	= 0, /* One channel only */
12262306a36Sopenharmony_ci	CATPT_CHANNEL_CONFIG_STEREO	= 1, /* L & R */
12362306a36Sopenharmony_ci	CATPT_CHANNEL_CONFIG_2_POINT_1	= 2, /* L, R & LFE; PCM only */
12462306a36Sopenharmony_ci	CATPT_CHANNEL_CONFIG_3_POINT_0	= 3, /* L, C & R; MP3 & AAC only */
12562306a36Sopenharmony_ci	CATPT_CHANNEL_CONFIG_3_POINT_1	= 4, /* L, C, R & LFE; PCM only */
12662306a36Sopenharmony_ci	CATPT_CHANNEL_CONFIG_QUATRO	= 5, /* L, R, Ls & Rs; PCM only */
12762306a36Sopenharmony_ci	CATPT_CHANNEL_CONFIG_4_POINT_0	= 6, /* L, C, R & Cs; MP3 & AAC only */
12862306a36Sopenharmony_ci	CATPT_CHANNEL_CONFIG_5_POINT_0	= 7, /* L, C, R, Ls & Rs */
12962306a36Sopenharmony_ci	CATPT_CHANNEL_CONFIG_5_POINT_1	= 8, /* L, C, R, Ls, Rs & LFE */
13062306a36Sopenharmony_ci	CATPT_CHANNEL_CONFIG_DUAL_MONO	= 9, /* One channel replicated in two */
13162306a36Sopenharmony_ci	CATPT_CHANNEL_CONFIG_INVALID	= 10,
13262306a36Sopenharmony_ci};
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_cienum catpt_interleaving_style {
13562306a36Sopenharmony_ci	CATPT_INTERLEAVING_PER_CHANNEL	= 0,
13662306a36Sopenharmony_ci	CATPT_INTERLEAVING_PER_SAMPLE	= 1,
13762306a36Sopenharmony_ci};
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_cistruct catpt_audio_format {
14062306a36Sopenharmony_ci	u32 sample_rate;
14162306a36Sopenharmony_ci	u32 bit_depth;
14262306a36Sopenharmony_ci	u32 channel_map;
14362306a36Sopenharmony_ci	u32 channel_config;
14462306a36Sopenharmony_ci	u32 interleaving;
14562306a36Sopenharmony_ci	u8 num_channels;
14662306a36Sopenharmony_ci	u8 valid_bit_depth;
14762306a36Sopenharmony_ci	u8 reserved[2];
14862306a36Sopenharmony_ci} __packed;
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_cistruct catpt_ring_info {
15162306a36Sopenharmony_ci	u32 page_table_addr;
15262306a36Sopenharmony_ci	u32 num_pages;
15362306a36Sopenharmony_ci	u32 size;
15462306a36Sopenharmony_ci	u32 offset;
15562306a36Sopenharmony_ci	u32 ring_first_page_pfn;
15662306a36Sopenharmony_ci} __packed;
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci#define CATPT_MODULE_COUNT (CATPT_MODID_LAST + 1)
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_cienum catpt_module_id {
16162306a36Sopenharmony_ci	CATPT_MODID_BASE_FW		= 0x0,
16262306a36Sopenharmony_ci	CATPT_MODID_MP3			= 0x1,
16362306a36Sopenharmony_ci	CATPT_MODID_AAC_5_1		= 0x2,
16462306a36Sopenharmony_ci	CATPT_MODID_AAC_2_0		= 0x3,
16562306a36Sopenharmony_ci	CATPT_MODID_SRC			= 0x4,
16662306a36Sopenharmony_ci	CATPT_MODID_WAVES		= 0x5,
16762306a36Sopenharmony_ci	CATPT_MODID_DOLBY		= 0x6,
16862306a36Sopenharmony_ci	CATPT_MODID_BOOST		= 0x7,
16962306a36Sopenharmony_ci	CATPT_MODID_LPAL		= 0x8,
17062306a36Sopenharmony_ci	CATPT_MODID_DTS			= 0x9,
17162306a36Sopenharmony_ci	CATPT_MODID_PCM_CAPTURE		= 0xA,
17262306a36Sopenharmony_ci	CATPT_MODID_PCM_SYSTEM		= 0xB,
17362306a36Sopenharmony_ci	CATPT_MODID_PCM_REFERENCE	= 0xC,
17462306a36Sopenharmony_ci	CATPT_MODID_PCM			= 0xD, /* offload */
17562306a36Sopenharmony_ci	CATPT_MODID_BLUETOOTH_RENDER	= 0xE,
17662306a36Sopenharmony_ci	CATPT_MODID_BLUETOOTH_CAPTURE	= 0xF,
17762306a36Sopenharmony_ci	CATPT_MODID_LAST		= CATPT_MODID_BLUETOOTH_CAPTURE,
17862306a36Sopenharmony_ci};
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_cistruct catpt_module_entry {
18162306a36Sopenharmony_ci	u32 module_id;
18262306a36Sopenharmony_ci	u32 entry_point;
18362306a36Sopenharmony_ci} __packed;
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_cistruct catpt_module_map {
18662306a36Sopenharmony_ci	u8 num_entries;
18762306a36Sopenharmony_ci	struct catpt_module_entry entries[];
18862306a36Sopenharmony_ci} __packed;
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_cistruct catpt_memory_info {
19162306a36Sopenharmony_ci	u32 offset;
19262306a36Sopenharmony_ci	u32 size;
19362306a36Sopenharmony_ci} __packed;
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci#define CATPT_CHANNELS_MAX	4
19662306a36Sopenharmony_ci#define CATPT_ALL_CHANNELS_MASK	UINT_MAX
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_cistruct catpt_stream_info {
19962306a36Sopenharmony_ci	u32 stream_hw_id;
20062306a36Sopenharmony_ci	u32 reserved;
20162306a36Sopenharmony_ci	u32 read_pos_regaddr;
20262306a36Sopenharmony_ci	u32 pres_pos_regaddr;
20362306a36Sopenharmony_ci	u32 peak_meter_regaddr[CATPT_CHANNELS_MAX];
20462306a36Sopenharmony_ci	u32 volume_regaddr[CATPT_CHANNELS_MAX];
20562306a36Sopenharmony_ci} __packed;
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ciint catpt_ipc_alloc_stream(struct catpt_dev *cdev,
20862306a36Sopenharmony_ci			   enum catpt_path_id path_id,
20962306a36Sopenharmony_ci			   enum catpt_stream_type type,
21062306a36Sopenharmony_ci			   struct catpt_audio_format *afmt,
21162306a36Sopenharmony_ci			   struct catpt_ring_info *rinfo,
21262306a36Sopenharmony_ci			   u8 num_modules,
21362306a36Sopenharmony_ci			   struct catpt_module_entry *modules,
21462306a36Sopenharmony_ci			   struct resource *persistent,
21562306a36Sopenharmony_ci			   struct resource *scratch,
21662306a36Sopenharmony_ci			   struct catpt_stream_info *sinfo);
21762306a36Sopenharmony_ciint catpt_ipc_free_stream(struct catpt_dev *cdev, u8 stream_hw_id);
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_cienum catpt_ssp_iface {
22062306a36Sopenharmony_ci	CATPT_SSP_IFACE_0 = 0,
22162306a36Sopenharmony_ci	CATPT_SSP_IFACE_1 = 1,
22262306a36Sopenharmony_ci	CATPT_SSP_COUNT,
22362306a36Sopenharmony_ci};
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_cienum catpt_mclk_frequency {
22662306a36Sopenharmony_ci	CATPT_MCLK_OFF = 0,
22762306a36Sopenharmony_ci	CATPT_MCLK_FREQ_6_MHZ = 1,
22862306a36Sopenharmony_ci	CATPT_MCLK_FREQ_21_MHZ = 2,
22962306a36Sopenharmony_ci	CATPT_MCLK_FREQ_24_MHZ = 3,
23062306a36Sopenharmony_ci};
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_cienum catpt_ssp_mode {
23362306a36Sopenharmony_ci	CATPT_SSP_MODE_I2S_CONSUMER = 0,
23462306a36Sopenharmony_ci	CATPT_SSP_MODE_I2S_PROVIDER = 1,
23562306a36Sopenharmony_ci	CATPT_SSP_MODE_TDM_PROVIDER = 2,
23662306a36Sopenharmony_ci};
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_cistruct catpt_ssp_device_format {
23962306a36Sopenharmony_ci	u32 iface;
24062306a36Sopenharmony_ci	u32 mclk;
24162306a36Sopenharmony_ci	u32 mode;
24262306a36Sopenharmony_ci	u16 clock_divider;
24362306a36Sopenharmony_ci	u8 channels;
24462306a36Sopenharmony_ci} __packed;
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ciint catpt_ipc_set_device_format(struct catpt_dev *cdev,
24762306a36Sopenharmony_ci				struct catpt_ssp_device_format *devfmt);
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_cienum catpt_dx_state {
25062306a36Sopenharmony_ci	CATPT_DX_STATE_D3 = 3,
25162306a36Sopenharmony_ci};
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_cienum catpt_dx_type {
25462306a36Sopenharmony_ci	CATPT_DX_TYPE_FW_IMAGE = 0,
25562306a36Sopenharmony_ci	CATPT_DX_TYPE_MEMORY_DUMP = 1,
25662306a36Sopenharmony_ci};
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_cistruct catpt_save_meminfo {
25962306a36Sopenharmony_ci	u32 offset;
26062306a36Sopenharmony_ci	u32 size;
26162306a36Sopenharmony_ci	u32 source;
26262306a36Sopenharmony_ci} __packed;
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci#define SAVE_MEMINFO_MAX	14
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_cistruct catpt_dx_context {
26762306a36Sopenharmony_ci	u32 num_meminfo;
26862306a36Sopenharmony_ci	struct catpt_save_meminfo meminfo[SAVE_MEMINFO_MAX];
26962306a36Sopenharmony_ci} __packed;
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ciint catpt_ipc_enter_dxstate(struct catpt_dev *cdev, enum catpt_dx_state state,
27262306a36Sopenharmony_ci			    struct catpt_dx_context *context);
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_cistruct catpt_mixer_stream_info {
27562306a36Sopenharmony_ci	u32 mixer_hw_id;
27662306a36Sopenharmony_ci	u32 peak_meter_regaddr[CATPT_CHANNELS_MAX];
27762306a36Sopenharmony_ci	u32 volume_regaddr[CATPT_CHANNELS_MAX];
27862306a36Sopenharmony_ci} __packed;
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ciint catpt_ipc_get_mixer_stream_info(struct catpt_dev *cdev,
28162306a36Sopenharmony_ci				    struct catpt_mixer_stream_info *info);
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci/* STREAM messages */
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_cienum catpt_stream_msg_type {
28662306a36Sopenharmony_ci	CATPT_STRM_RESET_STREAM = 0,
28762306a36Sopenharmony_ci	CATPT_STRM_PAUSE_STREAM = 1,
28862306a36Sopenharmony_ci	CATPT_STRM_RESUME_STREAM = 2,
28962306a36Sopenharmony_ci	CATPT_STRM_STAGE_MESSAGE = 3,
29062306a36Sopenharmony_ci	CATPT_STRM_NOTIFICATION = 4,
29162306a36Sopenharmony_ci};
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_cienum catpt_stage_action {
29462306a36Sopenharmony_ci	CATPT_STG_SET_VOLUME = 1,
29562306a36Sopenharmony_ci	CATPT_STG_SET_WRITE_POSITION = 2,
29662306a36Sopenharmony_ci	CATPT_STG_MUTE_LOOPBACK = 3,
29762306a36Sopenharmony_ci};
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ciunion catpt_stream_msg {
30062306a36Sopenharmony_ci	u32 val;
30162306a36Sopenharmony_ci	struct {
30262306a36Sopenharmony_ci		u32 status:5;
30362306a36Sopenharmony_ci		u32 reserved:7;
30462306a36Sopenharmony_ci		u32 stage_action:4;
30562306a36Sopenharmony_ci		u32 stream_hw_id:4;
30662306a36Sopenharmony_ci		u32 stream_msg_type:4;
30762306a36Sopenharmony_ci		u32 global_msg_type:5;
30862306a36Sopenharmony_ci		u32 fw_ready:1;
30962306a36Sopenharmony_ci		u32 done:1;
31062306a36Sopenharmony_ci		u32 busy:1;
31162306a36Sopenharmony_ci	};
31262306a36Sopenharmony_ci} __packed;
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci#define CATPT_STREAM_MSG(msg_type) \
31562306a36Sopenharmony_ci{ \
31662306a36Sopenharmony_ci	.stream_msg_type = CATPT_STRM_##msg_type, \
31762306a36Sopenharmony_ci	.global_msg_type = CATPT_GLB_STREAM_MESSAGE }
31862306a36Sopenharmony_ci#define CATPT_STAGE_MSG(msg_type) \
31962306a36Sopenharmony_ci{ \
32062306a36Sopenharmony_ci	.stage_action = CATPT_STG_##msg_type, \
32162306a36Sopenharmony_ci	.stream_msg_type = CATPT_STRM_STAGE_MESSAGE, \
32262306a36Sopenharmony_ci	.global_msg_type = CATPT_GLB_STREAM_MESSAGE }
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ciint catpt_ipc_reset_stream(struct catpt_dev *cdev, u8 stream_hw_id);
32562306a36Sopenharmony_ciint catpt_ipc_pause_stream(struct catpt_dev *cdev, u8 stream_hw_id);
32662306a36Sopenharmony_ciint catpt_ipc_resume_stream(struct catpt_dev *cdev, u8 stream_hw_id);
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci/* STREAM messages - STAGE subtype */
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_cienum catpt_audio_curve_type {
33162306a36Sopenharmony_ci	CATPT_AUDIO_CURVE_NONE = 0,
33262306a36Sopenharmony_ci	CATPT_AUDIO_CURVE_WINDOWS_FADE = 1,
33362306a36Sopenharmony_ci};
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ciint catpt_ipc_set_volume(struct catpt_dev *cdev, u8 stream_hw_id,
33662306a36Sopenharmony_ci			 u32 channel, u32 volume,
33762306a36Sopenharmony_ci			 u32 curve_duration,
33862306a36Sopenharmony_ci			 enum catpt_audio_curve_type curve_type);
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ciint catpt_ipc_set_write_pos(struct catpt_dev *cdev, u8 stream_hw_id,
34162306a36Sopenharmony_ci			    u32 pos, bool eob, bool ll);
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_ciint catpt_ipc_mute_loopback(struct catpt_dev *cdev, u8 stream_hw_id, bool mute);
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci/* NOTIFICATION messages */
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_cienum catpt_notify_reason {
34862306a36Sopenharmony_ci	CATPT_NOTIFY_POSITION_CHANGED = 0,
34962306a36Sopenharmony_ci	CATPT_NOTIFY_GLITCH_OCCURRED = 1,
35062306a36Sopenharmony_ci};
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ciunion catpt_notify_msg {
35362306a36Sopenharmony_ci	u32 val;
35462306a36Sopenharmony_ci	struct {
35562306a36Sopenharmony_ci		u32 mailbox_address:29;
35662306a36Sopenharmony_ci		u32 fw_ready:1;
35762306a36Sopenharmony_ci		u32 done:1;
35862306a36Sopenharmony_ci		u32 busy:1;
35962306a36Sopenharmony_ci	};
36062306a36Sopenharmony_ci	struct {
36162306a36Sopenharmony_ci		u32 status:5;
36262306a36Sopenharmony_ci		u32 reserved:7;
36362306a36Sopenharmony_ci		u32 notify_reason:4;
36462306a36Sopenharmony_ci		u32 stream_hw_id:4;
36562306a36Sopenharmony_ci		u32 stream_msg_type:4;
36662306a36Sopenharmony_ci		u32 global_msg_type:5;
36762306a36Sopenharmony_ci		u32 hdr:3; /* fw_ready, done, busy */
36862306a36Sopenharmony_ci	};
36962306a36Sopenharmony_ci} __packed;
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci#define FW_INFO_SIZE_MAX	100
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_cistruct catpt_fw_ready {
37462306a36Sopenharmony_ci	u32 inbox_offset;
37562306a36Sopenharmony_ci	u32 outbox_offset;
37662306a36Sopenharmony_ci	u32 inbox_size;
37762306a36Sopenharmony_ci	u32 outbox_size;
37862306a36Sopenharmony_ci	u32 fw_info_size;
37962306a36Sopenharmony_ci	char fw_info[FW_INFO_SIZE_MAX];
38062306a36Sopenharmony_ci} __packed;
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_cistruct catpt_notify_position {
38362306a36Sopenharmony_ci	u32 stream_position;
38462306a36Sopenharmony_ci	u32 fw_cycle_count;
38562306a36Sopenharmony_ci} __packed;
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_cienum catpt_glitch_type {
38862306a36Sopenharmony_ci	CATPT_GLITCH_UNDERRUN = 1,
38962306a36Sopenharmony_ci	CATPT_GLITCH_DECODER_ERROR = 2,
39062306a36Sopenharmony_ci	CATPT_GLITCH_DOUBLED_WRITE_POS = 3,
39162306a36Sopenharmony_ci};
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_cistruct catpt_notify_glitch {
39462306a36Sopenharmony_ci	u32 type;
39562306a36Sopenharmony_ci	u64 presentation_pos;
39662306a36Sopenharmony_ci	u32 write_pos;
39762306a36Sopenharmony_ci} __packed;
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_ci#endif
400