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