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