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