18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright(c) 2020 Intel Corporation. All rights reserved.
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Author: Cezary Rojewski <cezary.rojewski@intel.com>
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#ifndef __SND_SOC_INTEL_CATPT_MSG_H
98c2ecf20Sopenharmony_ci#define __SND_SOC_INTEL_CATPT_MSG_H
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cistruct catpt_dev;
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci/* IPC messages base types  */
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cienum catpt_reply_status {
168c2ecf20Sopenharmony_ci	CATPT_REPLY_SUCCESS = 0,
178c2ecf20Sopenharmony_ci	CATPT_REPLY_ERROR_INVALID_PARAM = 1,
188c2ecf20Sopenharmony_ci	CATPT_REPLY_UNKNOWN_MESSAGE_TYPE = 2,
198c2ecf20Sopenharmony_ci	CATPT_REPLY_OUT_OF_RESOURCES = 3,
208c2ecf20Sopenharmony_ci	CATPT_REPLY_BUSY = 4,
218c2ecf20Sopenharmony_ci	CATPT_REPLY_PENDING = 5,
228c2ecf20Sopenharmony_ci	CATPT_REPLY_FAILURE = 6,
238c2ecf20Sopenharmony_ci	CATPT_REPLY_INVALID_REQUEST = 7,
248c2ecf20Sopenharmony_ci	CATPT_REPLY_UNINITIALIZED = 8,
258c2ecf20Sopenharmony_ci	CATPT_REPLY_NOT_FOUND = 9,
268c2ecf20Sopenharmony_ci	CATPT_REPLY_SOURCE_NOT_STARTED = 10,
278c2ecf20Sopenharmony_ci};
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci/* GLOBAL messages */
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cienum catpt_global_msg_type {
328c2ecf20Sopenharmony_ci	CATPT_GLB_GET_FW_VERSION = 0,
338c2ecf20Sopenharmony_ci	CATPT_GLB_ALLOCATE_STREAM = 3,
348c2ecf20Sopenharmony_ci	CATPT_GLB_FREE_STREAM = 4,
358c2ecf20Sopenharmony_ci	CATPT_GLB_STREAM_MESSAGE = 6,
368c2ecf20Sopenharmony_ci	CATPT_GLB_REQUEST_CORE_DUMP = 7,
378c2ecf20Sopenharmony_ci	CATPT_GLB_SET_DEVICE_FORMATS = 10,
388c2ecf20Sopenharmony_ci	CATPT_GLB_ENTER_DX_STATE = 12,
398c2ecf20Sopenharmony_ci	CATPT_GLB_GET_MIXER_STREAM_INFO = 13,
408c2ecf20Sopenharmony_ci};
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ciunion catpt_global_msg {
438c2ecf20Sopenharmony_ci	u32 val;
448c2ecf20Sopenharmony_ci	struct {
458c2ecf20Sopenharmony_ci		u32 status:5;
468c2ecf20Sopenharmony_ci		u32 context:19; /* stream or module specific */
478c2ecf20Sopenharmony_ci		u32 global_msg_type:5;
488c2ecf20Sopenharmony_ci		u32 fw_ready:1;
498c2ecf20Sopenharmony_ci		u32 done:1;
508c2ecf20Sopenharmony_ci		u32 busy:1;
518c2ecf20Sopenharmony_ci	};
528c2ecf20Sopenharmony_ci} __packed;
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci#define CATPT_MSG(hdr) { .val = hdr }
558c2ecf20Sopenharmony_ci#define CATPT_GLOBAL_MSG(msg_type) \
568c2ecf20Sopenharmony_ci	{ .global_msg_type = CATPT_GLB_##msg_type }
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci#define BUILD_HASH_SIZE		40
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_cistruct catpt_fw_version {
618c2ecf20Sopenharmony_ci	u8 build;
628c2ecf20Sopenharmony_ci	u8 minor;
638c2ecf20Sopenharmony_ci	u8 major;
648c2ecf20Sopenharmony_ci	u8 type;
658c2ecf20Sopenharmony_ci	u8 build_hash[BUILD_HASH_SIZE];
668c2ecf20Sopenharmony_ci	u32 log_providers_hash;
678c2ecf20Sopenharmony_ci} __packed;
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ciint catpt_ipc_get_fw_version(struct catpt_dev *cdev,
708c2ecf20Sopenharmony_ci			     struct catpt_fw_version *version);
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_cienum catpt_pin_id {
738c2ecf20Sopenharmony_ci	CATPT_PIN_ID_SYSTEM = 0,
748c2ecf20Sopenharmony_ci	CATPT_PIN_ID_REFERENCE = 1,
758c2ecf20Sopenharmony_ci	CATPT_PIN_ID_CAPTURE1 = 2,
768c2ecf20Sopenharmony_ci	CATPT_PIN_ID_CAPTURE2 = 3,
778c2ecf20Sopenharmony_ci	CATPT_PIN_ID_OFFLOAD1 = 4,
788c2ecf20Sopenharmony_ci	CATPT_PIN_ID_OFFLOAD2 = 5,
798c2ecf20Sopenharmony_ci	CATPT_PIN_ID_MIXER = 7,
808c2ecf20Sopenharmony_ci	CATPT_PIN_ID_BLUETOOTH_CAPTURE = 8,
818c2ecf20Sopenharmony_ci	CATPT_PIN_ID_BLUETOOTH_RENDER = 9,
828c2ecf20Sopenharmony_ci};
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_cienum catpt_path_id {
858c2ecf20Sopenharmony_ci	CATPT_PATH_SSP0_OUT = 0,
868c2ecf20Sopenharmony_ci	CATPT_PATH_SSP0_IN = 1,
878c2ecf20Sopenharmony_ci	CATPT_PATH_SSP1_OUT = 2,
888c2ecf20Sopenharmony_ci	CATPT_PATH_SSP1_IN = 3,
898c2ecf20Sopenharmony_ci	/* duplicated audio in capture path */
908c2ecf20Sopenharmony_ci	CATPT_PATH_SSP0_IN_DUP = 4,
918c2ecf20Sopenharmony_ci};
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_cienum catpt_stream_type {
948c2ecf20Sopenharmony_ci	CATPT_STRM_TYPE_RENDER = 0, /* offload */
958c2ecf20Sopenharmony_ci	CATPT_STRM_TYPE_SYSTEM = 1,
968c2ecf20Sopenharmony_ci	CATPT_STRM_TYPE_CAPTURE = 2,
978c2ecf20Sopenharmony_ci	CATPT_STRM_TYPE_LOOPBACK = 3,
988c2ecf20Sopenharmony_ci	CATPT_STRM_TYPE_BLUETOOTH_RENDER = 4,
998c2ecf20Sopenharmony_ci	CATPT_STRM_TYPE_BLUETOOTH_CAPTURE = 5,
1008c2ecf20Sopenharmony_ci};
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_cienum catpt_format_id {
1038c2ecf20Sopenharmony_ci	CATPT_FORMAT_PCM = 0,
1048c2ecf20Sopenharmony_ci	CATPT_FORMAT_MP3 = 1,
1058c2ecf20Sopenharmony_ci	CATPT_FORMAT_AAC = 2,
1068c2ecf20Sopenharmony_ci	CATPT_FORMAT_WMA = 3,
1078c2ecf20Sopenharmony_ci};
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_cienum catpt_channel_index {
1108c2ecf20Sopenharmony_ci	CATPT_CHANNEL_LEFT = 0x0,
1118c2ecf20Sopenharmony_ci	CATPT_CHANNEL_CENTER = 0x1,
1128c2ecf20Sopenharmony_ci	CATPT_CHANNEL_RIGHT = 0x2,
1138c2ecf20Sopenharmony_ci	CATPT_CHANNEL_LEFT_SURROUND = 0x3,
1148c2ecf20Sopenharmony_ci	CATPT_CHANNEL_CENTER_SURROUND = 0x3,
1158c2ecf20Sopenharmony_ci	CATPT_CHANNEL_RIGHT_SURROUND = 0x4,
1168c2ecf20Sopenharmony_ci	CATPT_CHANNEL_LFE = 0x7,
1178c2ecf20Sopenharmony_ci	CATPT_CHANNEL_INVALID = 0xF,
1188c2ecf20Sopenharmony_ci};
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_cienum catpt_channel_config {
1218c2ecf20Sopenharmony_ci	CATPT_CHANNEL_CONFIG_MONO	= 0, /* One channel only */
1228c2ecf20Sopenharmony_ci	CATPT_CHANNEL_CONFIG_STEREO	= 1, /* L & R */
1238c2ecf20Sopenharmony_ci	CATPT_CHANNEL_CONFIG_2_POINT_1	= 2, /* L, R & LFE; PCM only */
1248c2ecf20Sopenharmony_ci	CATPT_CHANNEL_CONFIG_3_POINT_0	= 3, /* L, C & R; MP3 & AAC only */
1258c2ecf20Sopenharmony_ci	CATPT_CHANNEL_CONFIG_3_POINT_1	= 4, /* L, C, R & LFE; PCM only */
1268c2ecf20Sopenharmony_ci	CATPT_CHANNEL_CONFIG_QUATRO	= 5, /* L, R, Ls & Rs; PCM only */
1278c2ecf20Sopenharmony_ci	CATPT_CHANNEL_CONFIG_4_POINT_0	= 6, /* L, C, R & Cs; MP3 & AAC only */
1288c2ecf20Sopenharmony_ci	CATPT_CHANNEL_CONFIG_5_POINT_0	= 7, /* L, C, R, Ls & Rs */
1298c2ecf20Sopenharmony_ci	CATPT_CHANNEL_CONFIG_5_POINT_1	= 8, /* L, C, R, Ls, Rs & LFE */
1308c2ecf20Sopenharmony_ci	CATPT_CHANNEL_CONFIG_DUAL_MONO	= 9, /* One channel replicated in two */
1318c2ecf20Sopenharmony_ci	CATPT_CHANNEL_CONFIG_INVALID	= 10,
1328c2ecf20Sopenharmony_ci};
1338c2ecf20Sopenharmony_ci
1348c2ecf20Sopenharmony_cienum catpt_interleaving_style {
1358c2ecf20Sopenharmony_ci	CATPT_INTERLEAVING_PER_CHANNEL	= 0,
1368c2ecf20Sopenharmony_ci	CATPT_INTERLEAVING_PER_SAMPLE	= 1,
1378c2ecf20Sopenharmony_ci};
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_cistruct catpt_audio_format {
1408c2ecf20Sopenharmony_ci	u32 sample_rate;
1418c2ecf20Sopenharmony_ci	u32 bit_depth;
1428c2ecf20Sopenharmony_ci	u32 channel_map;
1438c2ecf20Sopenharmony_ci	u32 channel_config;
1448c2ecf20Sopenharmony_ci	u32 interleaving;
1458c2ecf20Sopenharmony_ci	u8 num_channels;
1468c2ecf20Sopenharmony_ci	u8 valid_bit_depth;
1478c2ecf20Sopenharmony_ci	u8 reserved[2];
1488c2ecf20Sopenharmony_ci} __packed;
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_cistruct catpt_ring_info {
1518c2ecf20Sopenharmony_ci	u32 page_table_addr;
1528c2ecf20Sopenharmony_ci	u32 num_pages;
1538c2ecf20Sopenharmony_ci	u32 size;
1548c2ecf20Sopenharmony_ci	u32 offset;
1558c2ecf20Sopenharmony_ci	u32 ring_first_page_pfn;
1568c2ecf20Sopenharmony_ci} __packed;
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_ci#define CATPT_MODULE_COUNT (CATPT_MODID_LAST + 1)
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_cienum catpt_module_id {
1618c2ecf20Sopenharmony_ci	CATPT_MODID_BASE_FW		= 0x0,
1628c2ecf20Sopenharmony_ci	CATPT_MODID_MP3			= 0x1,
1638c2ecf20Sopenharmony_ci	CATPT_MODID_AAC_5_1		= 0x2,
1648c2ecf20Sopenharmony_ci	CATPT_MODID_AAC_2_0		= 0x3,
1658c2ecf20Sopenharmony_ci	CATPT_MODID_SRC			= 0x4,
1668c2ecf20Sopenharmony_ci	CATPT_MODID_WAVES		= 0x5,
1678c2ecf20Sopenharmony_ci	CATPT_MODID_DOLBY		= 0x6,
1688c2ecf20Sopenharmony_ci	CATPT_MODID_BOOST		= 0x7,
1698c2ecf20Sopenharmony_ci	CATPT_MODID_LPAL		= 0x8,
1708c2ecf20Sopenharmony_ci	CATPT_MODID_DTS			= 0x9,
1718c2ecf20Sopenharmony_ci	CATPT_MODID_PCM_CAPTURE		= 0xA,
1728c2ecf20Sopenharmony_ci	CATPT_MODID_PCM_SYSTEM		= 0xB,
1738c2ecf20Sopenharmony_ci	CATPT_MODID_PCM_REFERENCE	= 0xC,
1748c2ecf20Sopenharmony_ci	CATPT_MODID_PCM			= 0xD, /* offload */
1758c2ecf20Sopenharmony_ci	CATPT_MODID_BLUETOOTH_RENDER	= 0xE,
1768c2ecf20Sopenharmony_ci	CATPT_MODID_BLUETOOTH_CAPTURE	= 0xF,
1778c2ecf20Sopenharmony_ci	CATPT_MODID_LAST		= CATPT_MODID_BLUETOOTH_CAPTURE,
1788c2ecf20Sopenharmony_ci};
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_cistruct catpt_module_entry {
1818c2ecf20Sopenharmony_ci	u32 module_id;
1828c2ecf20Sopenharmony_ci	u32 entry_point;
1838c2ecf20Sopenharmony_ci} __packed;
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_cistruct catpt_module_map {
1868c2ecf20Sopenharmony_ci	u8 num_entries;
1878c2ecf20Sopenharmony_ci	struct catpt_module_entry entries[];
1888c2ecf20Sopenharmony_ci} __packed;
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_cistruct catpt_memory_info {
1918c2ecf20Sopenharmony_ci	u32 offset;
1928c2ecf20Sopenharmony_ci	u32 size;
1938c2ecf20Sopenharmony_ci} __packed;
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_ci#define CATPT_CHANNELS_MAX	4
1968c2ecf20Sopenharmony_ci#define CATPT_ALL_CHANNELS_MASK	UINT_MAX
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_cistruct catpt_stream_info {
1998c2ecf20Sopenharmony_ci	u32 stream_hw_id;
2008c2ecf20Sopenharmony_ci	u32 reserved;
2018c2ecf20Sopenharmony_ci	u32 read_pos_regaddr;
2028c2ecf20Sopenharmony_ci	u32 pres_pos_regaddr;
2038c2ecf20Sopenharmony_ci	u32 peak_meter_regaddr[CATPT_CHANNELS_MAX];
2048c2ecf20Sopenharmony_ci	u32 volume_regaddr[CATPT_CHANNELS_MAX];
2058c2ecf20Sopenharmony_ci} __packed;
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ciint catpt_ipc_alloc_stream(struct catpt_dev *cdev,
2088c2ecf20Sopenharmony_ci			   enum catpt_path_id path_id,
2098c2ecf20Sopenharmony_ci			   enum catpt_stream_type type,
2108c2ecf20Sopenharmony_ci			   struct catpt_audio_format *afmt,
2118c2ecf20Sopenharmony_ci			   struct catpt_ring_info *rinfo,
2128c2ecf20Sopenharmony_ci			   u8 num_modules,
2138c2ecf20Sopenharmony_ci			   struct catpt_module_entry *modules,
2148c2ecf20Sopenharmony_ci			   struct resource *persistent,
2158c2ecf20Sopenharmony_ci			   struct resource *scratch,
2168c2ecf20Sopenharmony_ci			   struct catpt_stream_info *sinfo);
2178c2ecf20Sopenharmony_ciint catpt_ipc_free_stream(struct catpt_dev *cdev, u8 stream_hw_id);
2188c2ecf20Sopenharmony_ci
2198c2ecf20Sopenharmony_cienum catpt_ssp_iface {
2208c2ecf20Sopenharmony_ci	CATPT_SSP_IFACE_0 = 0,
2218c2ecf20Sopenharmony_ci	CATPT_SSP_IFACE_1 = 1,
2228c2ecf20Sopenharmony_ci	CATPT_SSP_IFACE_LAST = CATPT_SSP_IFACE_1,
2238c2ecf20Sopenharmony_ci};
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci#define CATPT_SSP_COUNT (CATPT_SSP_IFACE_LAST + 1)
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_cienum catpt_mclk_frequency {
2288c2ecf20Sopenharmony_ci	CATPT_MCLK_OFF = 0,
2298c2ecf20Sopenharmony_ci	CATPT_MCLK_FREQ_6_MHZ = 1,
2308c2ecf20Sopenharmony_ci	CATPT_MCLK_FREQ_21_MHZ = 2,
2318c2ecf20Sopenharmony_ci	CATPT_MCLK_FREQ_24_MHZ = 3,
2328c2ecf20Sopenharmony_ci};
2338c2ecf20Sopenharmony_ci
2348c2ecf20Sopenharmony_cienum catpt_ssp_mode {
2358c2ecf20Sopenharmony_ci	CATPT_SSP_MODE_I2S_CONSUMER = 0,
2368c2ecf20Sopenharmony_ci	CATPT_SSP_MODE_I2S_PROVIDER = 1,
2378c2ecf20Sopenharmony_ci	CATPT_SSP_MODE_TDM_PROVIDER = 2,
2388c2ecf20Sopenharmony_ci};
2398c2ecf20Sopenharmony_ci
2408c2ecf20Sopenharmony_cistruct catpt_ssp_device_format {
2418c2ecf20Sopenharmony_ci	u32 iface;
2428c2ecf20Sopenharmony_ci	u32 mclk;
2438c2ecf20Sopenharmony_ci	u32 mode;
2448c2ecf20Sopenharmony_ci	u16 clock_divider;
2458c2ecf20Sopenharmony_ci	u8 channels;
2468c2ecf20Sopenharmony_ci} __packed;
2478c2ecf20Sopenharmony_ci
2488c2ecf20Sopenharmony_ciint catpt_ipc_set_device_format(struct catpt_dev *cdev,
2498c2ecf20Sopenharmony_ci				struct catpt_ssp_device_format *devfmt);
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_cienum catpt_dx_state {
2528c2ecf20Sopenharmony_ci	CATPT_DX_STATE_D3 = 3,
2538c2ecf20Sopenharmony_ci};
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_cienum catpt_dx_type {
2568c2ecf20Sopenharmony_ci	CATPT_DX_TYPE_FW_IMAGE = 0,
2578c2ecf20Sopenharmony_ci	CATPT_DX_TYPE_MEMORY_DUMP = 1,
2588c2ecf20Sopenharmony_ci};
2598c2ecf20Sopenharmony_ci
2608c2ecf20Sopenharmony_cistruct catpt_save_meminfo {
2618c2ecf20Sopenharmony_ci	u32 offset;
2628c2ecf20Sopenharmony_ci	u32 size;
2638c2ecf20Sopenharmony_ci	u32 source;
2648c2ecf20Sopenharmony_ci} __packed;
2658c2ecf20Sopenharmony_ci
2668c2ecf20Sopenharmony_ci#define SAVE_MEMINFO_MAX	14
2678c2ecf20Sopenharmony_ci
2688c2ecf20Sopenharmony_cistruct catpt_dx_context {
2698c2ecf20Sopenharmony_ci	u32 num_meminfo;
2708c2ecf20Sopenharmony_ci	struct catpt_save_meminfo meminfo[SAVE_MEMINFO_MAX];
2718c2ecf20Sopenharmony_ci} __packed;
2728c2ecf20Sopenharmony_ci
2738c2ecf20Sopenharmony_ciint catpt_ipc_enter_dxstate(struct catpt_dev *cdev, enum catpt_dx_state state,
2748c2ecf20Sopenharmony_ci			    struct catpt_dx_context *context);
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_cistruct catpt_mixer_stream_info {
2778c2ecf20Sopenharmony_ci	u32 mixer_hw_id;
2788c2ecf20Sopenharmony_ci	u32 peak_meter_regaddr[CATPT_CHANNELS_MAX];
2798c2ecf20Sopenharmony_ci	u32 volume_regaddr[CATPT_CHANNELS_MAX];
2808c2ecf20Sopenharmony_ci} __packed;
2818c2ecf20Sopenharmony_ci
2828c2ecf20Sopenharmony_ciint catpt_ipc_get_mixer_stream_info(struct catpt_dev *cdev,
2838c2ecf20Sopenharmony_ci				    struct catpt_mixer_stream_info *info);
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_ci/* STREAM messages */
2868c2ecf20Sopenharmony_ci
2878c2ecf20Sopenharmony_cienum catpt_stream_msg_type {
2888c2ecf20Sopenharmony_ci	CATPT_STRM_RESET_STREAM = 0,
2898c2ecf20Sopenharmony_ci	CATPT_STRM_PAUSE_STREAM = 1,
2908c2ecf20Sopenharmony_ci	CATPT_STRM_RESUME_STREAM = 2,
2918c2ecf20Sopenharmony_ci	CATPT_STRM_STAGE_MESSAGE = 3,
2928c2ecf20Sopenharmony_ci	CATPT_STRM_NOTIFICATION = 4,
2938c2ecf20Sopenharmony_ci};
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_cienum catpt_stage_action {
2968c2ecf20Sopenharmony_ci	CATPT_STG_SET_VOLUME = 1,
2978c2ecf20Sopenharmony_ci	CATPT_STG_SET_WRITE_POSITION = 2,
2988c2ecf20Sopenharmony_ci	CATPT_STG_MUTE_LOOPBACK = 3,
2998c2ecf20Sopenharmony_ci};
3008c2ecf20Sopenharmony_ci
3018c2ecf20Sopenharmony_ciunion catpt_stream_msg {
3028c2ecf20Sopenharmony_ci	u32 val;
3038c2ecf20Sopenharmony_ci	struct {
3048c2ecf20Sopenharmony_ci		u32 status:5;
3058c2ecf20Sopenharmony_ci		u32 reserved:7;
3068c2ecf20Sopenharmony_ci		u32 stage_action:4;
3078c2ecf20Sopenharmony_ci		u32 stream_hw_id:4;
3088c2ecf20Sopenharmony_ci		u32 stream_msg_type:4;
3098c2ecf20Sopenharmony_ci		u32 global_msg_type:5;
3108c2ecf20Sopenharmony_ci		u32 fw_ready:1;
3118c2ecf20Sopenharmony_ci		u32 done:1;
3128c2ecf20Sopenharmony_ci		u32 busy:1;
3138c2ecf20Sopenharmony_ci	};
3148c2ecf20Sopenharmony_ci} __packed;
3158c2ecf20Sopenharmony_ci
3168c2ecf20Sopenharmony_ci#define CATPT_STREAM_MSG(msg_type) \
3178c2ecf20Sopenharmony_ci{ \
3188c2ecf20Sopenharmony_ci	.stream_msg_type = CATPT_STRM_##msg_type, \
3198c2ecf20Sopenharmony_ci	.global_msg_type = CATPT_GLB_STREAM_MESSAGE }
3208c2ecf20Sopenharmony_ci#define CATPT_STAGE_MSG(msg_type) \
3218c2ecf20Sopenharmony_ci{ \
3228c2ecf20Sopenharmony_ci	.stage_action = CATPT_STG_##msg_type, \
3238c2ecf20Sopenharmony_ci	.stream_msg_type = CATPT_STRM_STAGE_MESSAGE, \
3248c2ecf20Sopenharmony_ci	.global_msg_type = CATPT_GLB_STREAM_MESSAGE }
3258c2ecf20Sopenharmony_ci
3268c2ecf20Sopenharmony_ciint catpt_ipc_reset_stream(struct catpt_dev *cdev, u8 stream_hw_id);
3278c2ecf20Sopenharmony_ciint catpt_ipc_pause_stream(struct catpt_dev *cdev, u8 stream_hw_id);
3288c2ecf20Sopenharmony_ciint catpt_ipc_resume_stream(struct catpt_dev *cdev, u8 stream_hw_id);
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_ci/* STREAM messages - STAGE subtype */
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_cienum catpt_audio_curve_type {
3338c2ecf20Sopenharmony_ci	CATPT_AUDIO_CURVE_NONE = 0,
3348c2ecf20Sopenharmony_ci	CATPT_AUDIO_CURVE_WINDOWS_FADE = 1,
3358c2ecf20Sopenharmony_ci};
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_ciint catpt_ipc_set_volume(struct catpt_dev *cdev, u8 stream_hw_id,
3388c2ecf20Sopenharmony_ci			 u32 channel, u32 volume,
3398c2ecf20Sopenharmony_ci			 u32 curve_duration,
3408c2ecf20Sopenharmony_ci			 enum catpt_audio_curve_type curve_type);
3418c2ecf20Sopenharmony_ci
3428c2ecf20Sopenharmony_ciint catpt_ipc_set_write_pos(struct catpt_dev *cdev, u8 stream_hw_id,
3438c2ecf20Sopenharmony_ci			    u32 pos, bool eob, bool ll);
3448c2ecf20Sopenharmony_ci
3458c2ecf20Sopenharmony_ciint catpt_ipc_mute_loopback(struct catpt_dev *cdev, u8 stream_hw_id, bool mute);
3468c2ecf20Sopenharmony_ci
3478c2ecf20Sopenharmony_ci/* NOTIFICATION messages */
3488c2ecf20Sopenharmony_ci
3498c2ecf20Sopenharmony_cienum catpt_notify_reason {
3508c2ecf20Sopenharmony_ci	CATPT_NOTIFY_POSITION_CHANGED = 0,
3518c2ecf20Sopenharmony_ci	CATPT_NOTIFY_GLITCH_OCCURRED = 1,
3528c2ecf20Sopenharmony_ci};
3538c2ecf20Sopenharmony_ci
3548c2ecf20Sopenharmony_ciunion catpt_notify_msg {
3558c2ecf20Sopenharmony_ci	u32 val;
3568c2ecf20Sopenharmony_ci	struct {
3578c2ecf20Sopenharmony_ci		u32 mailbox_address:29;
3588c2ecf20Sopenharmony_ci		u32 fw_ready:1;
3598c2ecf20Sopenharmony_ci		u32 done:1;
3608c2ecf20Sopenharmony_ci		u32 busy:1;
3618c2ecf20Sopenharmony_ci	};
3628c2ecf20Sopenharmony_ci	struct {
3638c2ecf20Sopenharmony_ci		u32 status:5;
3648c2ecf20Sopenharmony_ci		u32 reserved:7;
3658c2ecf20Sopenharmony_ci		u32 notify_reason:4;
3668c2ecf20Sopenharmony_ci		u32 stream_hw_id:4;
3678c2ecf20Sopenharmony_ci		u32 stream_msg_type:4;
3688c2ecf20Sopenharmony_ci		u32 global_msg_type:5;
3698c2ecf20Sopenharmony_ci		u32 hdr:3; /* fw_ready, done, busy */
3708c2ecf20Sopenharmony_ci	};
3718c2ecf20Sopenharmony_ci} __packed;
3728c2ecf20Sopenharmony_ci
3738c2ecf20Sopenharmony_ci#define FW_INFO_SIZE_MAX	100
3748c2ecf20Sopenharmony_ci
3758c2ecf20Sopenharmony_cistruct catpt_fw_ready {
3768c2ecf20Sopenharmony_ci	u32 inbox_offset;
3778c2ecf20Sopenharmony_ci	u32 outbox_offset;
3788c2ecf20Sopenharmony_ci	u32 inbox_size;
3798c2ecf20Sopenharmony_ci	u32 outbox_size;
3808c2ecf20Sopenharmony_ci	u32 fw_info_size;
3818c2ecf20Sopenharmony_ci	char fw_info[FW_INFO_SIZE_MAX];
3828c2ecf20Sopenharmony_ci} __packed;
3838c2ecf20Sopenharmony_ci
3848c2ecf20Sopenharmony_cistruct catpt_notify_position {
3858c2ecf20Sopenharmony_ci	u32 stream_position;
3868c2ecf20Sopenharmony_ci	u32 fw_cycle_count;
3878c2ecf20Sopenharmony_ci} __packed;
3888c2ecf20Sopenharmony_ci
3898c2ecf20Sopenharmony_cienum catpt_glitch_type {
3908c2ecf20Sopenharmony_ci	CATPT_GLITCH_UNDERRUN = 1,
3918c2ecf20Sopenharmony_ci	CATPT_GLITCH_DECODER_ERROR = 2,
3928c2ecf20Sopenharmony_ci	CATPT_GLITCH_DOUBLED_WRITE_POS = 3,
3938c2ecf20Sopenharmony_ci};
3948c2ecf20Sopenharmony_ci
3958c2ecf20Sopenharmony_cistruct catpt_notify_glitch {
3968c2ecf20Sopenharmony_ci	u32 type;
3978c2ecf20Sopenharmony_ci	u64 presentation_pos;
3988c2ecf20Sopenharmony_ci	u32 write_pos;
3998c2ecf20Sopenharmony_ci} __packed;
4008c2ecf20Sopenharmony_ci
4018c2ecf20Sopenharmony_ci#endif
402