192946c1dSCezary Rojewski /* SPDX-License-Identifier: GPL-2.0-only */ 292946c1dSCezary Rojewski /* 392946c1dSCezary Rojewski * Copyright(c) 2020 Intel Corporation. All rights reserved. 492946c1dSCezary Rojewski * 592946c1dSCezary Rojewski * Author: Cezary Rojewski <cezary.rojewski@intel.com> 692946c1dSCezary Rojewski */ 792946c1dSCezary Rojewski 892946c1dSCezary Rojewski #ifndef __SND_SOC_INTEL_CATPT_MSG_H 992946c1dSCezary Rojewski #define __SND_SOC_INTEL_CATPT_MSG_H 1092946c1dSCezary Rojewski 1192946c1dSCezary Rojewski struct catpt_dev; 1292946c1dSCezary Rojewski 1392946c1dSCezary Rojewski /* IPC messages base types */ 1492946c1dSCezary Rojewski 1592946c1dSCezary Rojewski enum catpt_reply_status { 1692946c1dSCezary Rojewski CATPT_REPLY_SUCCESS = 0, 1792946c1dSCezary Rojewski CATPT_REPLY_ERROR_INVALID_PARAM = 1, 1892946c1dSCezary Rojewski CATPT_REPLY_UNKNOWN_MESSAGE_TYPE = 2, 1992946c1dSCezary Rojewski CATPT_REPLY_OUT_OF_RESOURCES = 3, 2092946c1dSCezary Rojewski CATPT_REPLY_BUSY = 4, 2192946c1dSCezary Rojewski CATPT_REPLY_PENDING = 5, 2292946c1dSCezary Rojewski CATPT_REPLY_FAILURE = 6, 2392946c1dSCezary Rojewski CATPT_REPLY_INVALID_REQUEST = 7, 2492946c1dSCezary Rojewski CATPT_REPLY_UNINITIALIZED = 8, 2592946c1dSCezary Rojewski CATPT_REPLY_NOT_FOUND = 9, 2692946c1dSCezary Rojewski CATPT_REPLY_SOURCE_NOT_STARTED = 10, 2792946c1dSCezary Rojewski }; 2892946c1dSCezary Rojewski 2992946c1dSCezary Rojewski /* GLOBAL messages */ 3092946c1dSCezary Rojewski 3192946c1dSCezary Rojewski enum catpt_global_msg_type { 3292946c1dSCezary Rojewski CATPT_GLB_GET_FW_VERSION = 0, 3392946c1dSCezary Rojewski CATPT_GLB_ALLOCATE_STREAM = 3, 3492946c1dSCezary Rojewski CATPT_GLB_FREE_STREAM = 4, 3592946c1dSCezary Rojewski CATPT_GLB_STREAM_MESSAGE = 6, 3692946c1dSCezary Rojewski CATPT_GLB_REQUEST_CORE_DUMP = 7, 3792946c1dSCezary Rojewski CATPT_GLB_SET_DEVICE_FORMATS = 10, 3892946c1dSCezary Rojewski CATPT_GLB_ENTER_DX_STATE = 12, 3992946c1dSCezary Rojewski CATPT_GLB_GET_MIXER_STREAM_INFO = 13, 4092946c1dSCezary Rojewski }; 4192946c1dSCezary Rojewski 4292946c1dSCezary Rojewski union catpt_global_msg { 4392946c1dSCezary Rojewski u32 val; 4492946c1dSCezary Rojewski struct { 4592946c1dSCezary Rojewski u32 status:5; 4692946c1dSCezary Rojewski u32 context:19; /* stream or module specific */ 4792946c1dSCezary Rojewski u32 global_msg_type:5; 4892946c1dSCezary Rojewski u32 fw_ready:1; 4992946c1dSCezary Rojewski u32 done:1; 5092946c1dSCezary Rojewski u32 busy:1; 5192946c1dSCezary Rojewski }; 5292946c1dSCezary Rojewski } __packed; 5392946c1dSCezary Rojewski 5492946c1dSCezary Rojewski #define CATPT_MSG(hdr) { .val = hdr } 5592946c1dSCezary Rojewski #define CATPT_GLOBAL_MSG(msg_type) \ 5692946c1dSCezary Rojewski { .global_msg_type = CATPT_GLB_##msg_type } 5792946c1dSCezary Rojewski 5892946c1dSCezary Rojewski #define BUILD_HASH_SIZE 40 5992946c1dSCezary Rojewski 6092946c1dSCezary Rojewski struct catpt_fw_version { 6192946c1dSCezary Rojewski u8 build; 6292946c1dSCezary Rojewski u8 minor; 6392946c1dSCezary Rojewski u8 major; 6492946c1dSCezary Rojewski u8 type; 6592946c1dSCezary Rojewski u8 build_hash[BUILD_HASH_SIZE]; 6692946c1dSCezary Rojewski u32 log_providers_hash; 6792946c1dSCezary Rojewski } __packed; 6892946c1dSCezary Rojewski 6992946c1dSCezary Rojewski int catpt_ipc_get_fw_version(struct catpt_dev *cdev, 7092946c1dSCezary Rojewski struct catpt_fw_version *version); 7192946c1dSCezary Rojewski 7292946c1dSCezary Rojewski enum catpt_pin_id { 7392946c1dSCezary Rojewski CATPT_PIN_ID_SYSTEM = 0, 7492946c1dSCezary Rojewski CATPT_PIN_ID_REFERENCE = 1, 7592946c1dSCezary Rojewski CATPT_PIN_ID_CAPTURE1 = 2, 7692946c1dSCezary Rojewski CATPT_PIN_ID_CAPTURE2 = 3, 7792946c1dSCezary Rojewski CATPT_PIN_ID_OFFLOAD1 = 4, 7892946c1dSCezary Rojewski CATPT_PIN_ID_OFFLOAD2 = 5, 7992946c1dSCezary Rojewski CATPT_PIN_ID_MIXER = 7, 8092946c1dSCezary Rojewski CATPT_PIN_ID_BLUETOOTH_CAPTURE = 8, 8192946c1dSCezary Rojewski CATPT_PIN_ID_BLUETOOTH_RENDER = 9, 8292946c1dSCezary Rojewski }; 8392946c1dSCezary Rojewski 8492946c1dSCezary Rojewski enum catpt_path_id { 8592946c1dSCezary Rojewski CATPT_PATH_SSP0_OUT = 0, 8692946c1dSCezary Rojewski CATPT_PATH_SSP0_IN = 1, 8792946c1dSCezary Rojewski CATPT_PATH_SSP1_OUT = 2, 8892946c1dSCezary Rojewski CATPT_PATH_SSP1_IN = 3, 8992946c1dSCezary Rojewski /* duplicated audio in capture path */ 9092946c1dSCezary Rojewski CATPT_PATH_SSP0_IN_DUP = 4, 9192946c1dSCezary Rojewski }; 9292946c1dSCezary Rojewski 9392946c1dSCezary Rojewski enum catpt_stream_type { 9492946c1dSCezary Rojewski CATPT_STRM_TYPE_RENDER = 0, /* offload */ 9592946c1dSCezary Rojewski CATPT_STRM_TYPE_SYSTEM = 1, 9692946c1dSCezary Rojewski CATPT_STRM_TYPE_CAPTURE = 2, 9792946c1dSCezary Rojewski CATPT_STRM_TYPE_LOOPBACK = 3, 9892946c1dSCezary Rojewski CATPT_STRM_TYPE_BLUETOOTH_RENDER = 4, 9992946c1dSCezary Rojewski CATPT_STRM_TYPE_BLUETOOTH_CAPTURE = 5, 10092946c1dSCezary Rojewski }; 10192946c1dSCezary Rojewski 10292946c1dSCezary Rojewski enum catpt_format_id { 10392946c1dSCezary Rojewski CATPT_FORMAT_PCM = 0, 10492946c1dSCezary Rojewski CATPT_FORMAT_MP3 = 1, 10592946c1dSCezary Rojewski CATPT_FORMAT_AAC = 2, 10692946c1dSCezary Rojewski CATPT_FORMAT_WMA = 3, 10792946c1dSCezary Rojewski }; 10892946c1dSCezary Rojewski 10992946c1dSCezary Rojewski enum catpt_channel_index { 11092946c1dSCezary Rojewski CATPT_CHANNEL_LEFT = 0x0, 11192946c1dSCezary Rojewski CATPT_CHANNEL_CENTER = 0x1, 11292946c1dSCezary Rojewski CATPT_CHANNEL_RIGHT = 0x2, 11392946c1dSCezary Rojewski CATPT_CHANNEL_LEFT_SURROUND = 0x3, 11492946c1dSCezary Rojewski CATPT_CHANNEL_CENTER_SURROUND = 0x3, 11592946c1dSCezary Rojewski CATPT_CHANNEL_RIGHT_SURROUND = 0x4, 11692946c1dSCezary Rojewski CATPT_CHANNEL_LFE = 0x7, 11792946c1dSCezary Rojewski CATPT_CHANNEL_INVALID = 0xF, 11892946c1dSCezary Rojewski }; 11992946c1dSCezary Rojewski 12092946c1dSCezary Rojewski enum catpt_channel_config { 12192946c1dSCezary Rojewski CATPT_CHANNEL_CONFIG_MONO = 0, /* One channel only */ 12292946c1dSCezary Rojewski CATPT_CHANNEL_CONFIG_STEREO = 1, /* L & R */ 12392946c1dSCezary Rojewski CATPT_CHANNEL_CONFIG_2_POINT_1 = 2, /* L, R & LFE; PCM only */ 12492946c1dSCezary Rojewski CATPT_CHANNEL_CONFIG_3_POINT_0 = 3, /* L, C & R; MP3 & AAC only */ 12592946c1dSCezary Rojewski CATPT_CHANNEL_CONFIG_3_POINT_1 = 4, /* L, C, R & LFE; PCM only */ 12692946c1dSCezary Rojewski CATPT_CHANNEL_CONFIG_QUATRO = 5, /* L, R, Ls & Rs; PCM only */ 12792946c1dSCezary Rojewski CATPT_CHANNEL_CONFIG_4_POINT_0 = 6, /* L, C, R & Cs; MP3 & AAC only */ 12892946c1dSCezary Rojewski CATPT_CHANNEL_CONFIG_5_POINT_0 = 7, /* L, C, R, Ls & Rs */ 12992946c1dSCezary Rojewski CATPT_CHANNEL_CONFIG_5_POINT_1 = 8, /* L, C, R, Ls, Rs & LFE */ 13092946c1dSCezary Rojewski CATPT_CHANNEL_CONFIG_DUAL_MONO = 9, /* One channel replicated in two */ 13192946c1dSCezary Rojewski CATPT_CHANNEL_CONFIG_INVALID = 10, 13292946c1dSCezary Rojewski }; 13392946c1dSCezary Rojewski 13492946c1dSCezary Rojewski enum catpt_interleaving_style { 13592946c1dSCezary Rojewski CATPT_INTERLEAVING_PER_CHANNEL = 0, 13692946c1dSCezary Rojewski CATPT_INTERLEAVING_PER_SAMPLE = 1, 13792946c1dSCezary Rojewski }; 13892946c1dSCezary Rojewski 13992946c1dSCezary Rojewski struct catpt_audio_format { 14092946c1dSCezary Rojewski u32 sample_rate; 14192946c1dSCezary Rojewski u32 bit_depth; 14292946c1dSCezary Rojewski u32 channel_map; 14392946c1dSCezary Rojewski u32 channel_config; 14492946c1dSCezary Rojewski u32 interleaving; 14592946c1dSCezary Rojewski u8 num_channels; 14692946c1dSCezary Rojewski u8 valid_bit_depth; 14792946c1dSCezary Rojewski u8 reserved[2]; 14892946c1dSCezary Rojewski } __packed; 14992946c1dSCezary Rojewski 15092946c1dSCezary Rojewski struct catpt_ring_info { 15192946c1dSCezary Rojewski u32 page_table_addr; 15292946c1dSCezary Rojewski u32 num_pages; 15392946c1dSCezary Rojewski u32 size; 15492946c1dSCezary Rojewski u32 offset; 15592946c1dSCezary Rojewski u32 ring_first_page_pfn; 15692946c1dSCezary Rojewski } __packed; 15792946c1dSCezary Rojewski 15892946c1dSCezary Rojewski #define CATPT_MODULE_COUNT (CATPT_MODID_LAST + 1) 15992946c1dSCezary Rojewski 16092946c1dSCezary Rojewski enum catpt_module_id { 16192946c1dSCezary Rojewski CATPT_MODID_BASE_FW = 0x0, 16292946c1dSCezary Rojewski CATPT_MODID_MP3 = 0x1, 16392946c1dSCezary Rojewski CATPT_MODID_AAC_5_1 = 0x2, 16492946c1dSCezary Rojewski CATPT_MODID_AAC_2_0 = 0x3, 16592946c1dSCezary Rojewski CATPT_MODID_SRC = 0x4, 16692946c1dSCezary Rojewski CATPT_MODID_WAVES = 0x5, 16792946c1dSCezary Rojewski CATPT_MODID_DOLBY = 0x6, 16892946c1dSCezary Rojewski CATPT_MODID_BOOST = 0x7, 16992946c1dSCezary Rojewski CATPT_MODID_LPAL = 0x8, 17092946c1dSCezary Rojewski CATPT_MODID_DTS = 0x9, 17192946c1dSCezary Rojewski CATPT_MODID_PCM_CAPTURE = 0xA, 17292946c1dSCezary Rojewski CATPT_MODID_PCM_SYSTEM = 0xB, 17392946c1dSCezary Rojewski CATPT_MODID_PCM_REFERENCE = 0xC, 17492946c1dSCezary Rojewski CATPT_MODID_PCM = 0xD, /* offload */ 17592946c1dSCezary Rojewski CATPT_MODID_BLUETOOTH_RENDER = 0xE, 17692946c1dSCezary Rojewski CATPT_MODID_BLUETOOTH_CAPTURE = 0xF, 17792946c1dSCezary Rojewski CATPT_MODID_LAST = CATPT_MODID_BLUETOOTH_CAPTURE, 17892946c1dSCezary Rojewski }; 17992946c1dSCezary Rojewski 18092946c1dSCezary Rojewski struct catpt_module_entry { 18192946c1dSCezary Rojewski u32 module_id; 18292946c1dSCezary Rojewski u32 entry_point; 18392946c1dSCezary Rojewski } __packed; 18492946c1dSCezary Rojewski 18592946c1dSCezary Rojewski struct catpt_module_map { 18692946c1dSCezary Rojewski u8 num_entries; 18792946c1dSCezary Rojewski struct catpt_module_entry entries[]; 18892946c1dSCezary Rojewski } __packed; 18992946c1dSCezary Rojewski 19092946c1dSCezary Rojewski struct catpt_memory_info { 19192946c1dSCezary Rojewski u32 offset; 19292946c1dSCezary Rojewski u32 size; 19392946c1dSCezary Rojewski } __packed; 19492946c1dSCezary Rojewski 19592946c1dSCezary Rojewski #define CATPT_CHANNELS_MAX 4 19692946c1dSCezary Rojewski #define CATPT_ALL_CHANNELS_MASK UINT_MAX 19792946c1dSCezary Rojewski 19892946c1dSCezary Rojewski struct catpt_stream_info { 19992946c1dSCezary Rojewski u32 stream_hw_id; 20092946c1dSCezary Rojewski u32 reserved; 20192946c1dSCezary Rojewski u32 read_pos_regaddr; 20292946c1dSCezary Rojewski u32 pres_pos_regaddr; 20392946c1dSCezary Rojewski u32 peak_meter_regaddr[CATPT_CHANNELS_MAX]; 20492946c1dSCezary Rojewski u32 volume_regaddr[CATPT_CHANNELS_MAX]; 20592946c1dSCezary Rojewski } __packed; 20692946c1dSCezary Rojewski 20792946c1dSCezary Rojewski int catpt_ipc_alloc_stream(struct catpt_dev *cdev, 20892946c1dSCezary Rojewski enum catpt_path_id path_id, 20992946c1dSCezary Rojewski enum catpt_stream_type type, 21092946c1dSCezary Rojewski struct catpt_audio_format *afmt, 21192946c1dSCezary Rojewski struct catpt_ring_info *rinfo, 21292946c1dSCezary Rojewski u8 num_modules, 21392946c1dSCezary Rojewski struct catpt_module_entry *modules, 21492946c1dSCezary Rojewski struct resource *persistent, 21592946c1dSCezary Rojewski struct resource *scratch, 21692946c1dSCezary Rojewski struct catpt_stream_info *sinfo); 21792946c1dSCezary Rojewski int catpt_ipc_free_stream(struct catpt_dev *cdev, u8 stream_hw_id); 21892946c1dSCezary Rojewski 21992946c1dSCezary Rojewski enum catpt_ssp_iface { 22092946c1dSCezary Rojewski CATPT_SSP_IFACE_0 = 0, 22192946c1dSCezary Rojewski CATPT_SSP_IFACE_1 = 1, 222*b695f5c0SCezary Rojewski CATPT_SSP_COUNT, 22392946c1dSCezary Rojewski }; 22492946c1dSCezary Rojewski 22592946c1dSCezary Rojewski enum catpt_mclk_frequency { 22692946c1dSCezary Rojewski CATPT_MCLK_OFF = 0, 22792946c1dSCezary Rojewski CATPT_MCLK_FREQ_6_MHZ = 1, 22892946c1dSCezary Rojewski CATPT_MCLK_FREQ_21_MHZ = 2, 22992946c1dSCezary Rojewski CATPT_MCLK_FREQ_24_MHZ = 3, 23092946c1dSCezary Rojewski }; 23192946c1dSCezary Rojewski 23292946c1dSCezary Rojewski enum catpt_ssp_mode { 23392946c1dSCezary Rojewski CATPT_SSP_MODE_I2S_CONSUMER = 0, 23492946c1dSCezary Rojewski CATPT_SSP_MODE_I2S_PROVIDER = 1, 23592946c1dSCezary Rojewski CATPT_SSP_MODE_TDM_PROVIDER = 2, 23692946c1dSCezary Rojewski }; 23792946c1dSCezary Rojewski 23892946c1dSCezary Rojewski struct catpt_ssp_device_format { 23992946c1dSCezary Rojewski u32 iface; 24092946c1dSCezary Rojewski u32 mclk; 24192946c1dSCezary Rojewski u32 mode; 24292946c1dSCezary Rojewski u16 clock_divider; 24392946c1dSCezary Rojewski u8 channels; 24492946c1dSCezary Rojewski } __packed; 24592946c1dSCezary Rojewski 24692946c1dSCezary Rojewski int catpt_ipc_set_device_format(struct catpt_dev *cdev, 24792946c1dSCezary Rojewski struct catpt_ssp_device_format *devfmt); 24892946c1dSCezary Rojewski 24992946c1dSCezary Rojewski enum catpt_dx_state { 25092946c1dSCezary Rojewski CATPT_DX_STATE_D3 = 3, 25192946c1dSCezary Rojewski }; 25292946c1dSCezary Rojewski 25392946c1dSCezary Rojewski enum catpt_dx_type { 25492946c1dSCezary Rojewski CATPT_DX_TYPE_FW_IMAGE = 0, 25592946c1dSCezary Rojewski CATPT_DX_TYPE_MEMORY_DUMP = 1, 25692946c1dSCezary Rojewski }; 25792946c1dSCezary Rojewski 25892946c1dSCezary Rojewski struct catpt_save_meminfo { 25992946c1dSCezary Rojewski u32 offset; 26092946c1dSCezary Rojewski u32 size; 26192946c1dSCezary Rojewski u32 source; 26292946c1dSCezary Rojewski } __packed; 26392946c1dSCezary Rojewski 26492946c1dSCezary Rojewski #define SAVE_MEMINFO_MAX 14 26592946c1dSCezary Rojewski 26692946c1dSCezary Rojewski struct catpt_dx_context { 26792946c1dSCezary Rojewski u32 num_meminfo; 26892946c1dSCezary Rojewski struct catpt_save_meminfo meminfo[SAVE_MEMINFO_MAX]; 26992946c1dSCezary Rojewski } __packed; 27092946c1dSCezary Rojewski 27192946c1dSCezary Rojewski int catpt_ipc_enter_dxstate(struct catpt_dev *cdev, enum catpt_dx_state state, 27292946c1dSCezary Rojewski struct catpt_dx_context *context); 27392946c1dSCezary Rojewski 27492946c1dSCezary Rojewski struct catpt_mixer_stream_info { 27592946c1dSCezary Rojewski u32 mixer_hw_id; 27692946c1dSCezary Rojewski u32 peak_meter_regaddr[CATPT_CHANNELS_MAX]; 27792946c1dSCezary Rojewski u32 volume_regaddr[CATPT_CHANNELS_MAX]; 27892946c1dSCezary Rojewski } __packed; 27992946c1dSCezary Rojewski 28092946c1dSCezary Rojewski int catpt_ipc_get_mixer_stream_info(struct catpt_dev *cdev, 28192946c1dSCezary Rojewski struct catpt_mixer_stream_info *info); 28292946c1dSCezary Rojewski 28392946c1dSCezary Rojewski /* STREAM messages */ 28492946c1dSCezary Rojewski 28592946c1dSCezary Rojewski enum catpt_stream_msg_type { 28692946c1dSCezary Rojewski CATPT_STRM_RESET_STREAM = 0, 28792946c1dSCezary Rojewski CATPT_STRM_PAUSE_STREAM = 1, 28892946c1dSCezary Rojewski CATPT_STRM_RESUME_STREAM = 2, 28992946c1dSCezary Rojewski CATPT_STRM_STAGE_MESSAGE = 3, 29092946c1dSCezary Rojewski CATPT_STRM_NOTIFICATION = 4, 29192946c1dSCezary Rojewski }; 29292946c1dSCezary Rojewski 29392946c1dSCezary Rojewski enum catpt_stage_action { 29492946c1dSCezary Rojewski CATPT_STG_SET_VOLUME = 1, 29592946c1dSCezary Rojewski CATPT_STG_SET_WRITE_POSITION = 2, 29692946c1dSCezary Rojewski CATPT_STG_MUTE_LOOPBACK = 3, 29792946c1dSCezary Rojewski }; 29892946c1dSCezary Rojewski 29992946c1dSCezary Rojewski union catpt_stream_msg { 30092946c1dSCezary Rojewski u32 val; 30192946c1dSCezary Rojewski struct { 30292946c1dSCezary Rojewski u32 status:5; 30392946c1dSCezary Rojewski u32 reserved:7; 30492946c1dSCezary Rojewski u32 stage_action:4; 30592946c1dSCezary Rojewski u32 stream_hw_id:4; 30692946c1dSCezary Rojewski u32 stream_msg_type:4; 30792946c1dSCezary Rojewski u32 global_msg_type:5; 30892946c1dSCezary Rojewski u32 fw_ready:1; 30992946c1dSCezary Rojewski u32 done:1; 31092946c1dSCezary Rojewski u32 busy:1; 31192946c1dSCezary Rojewski }; 31292946c1dSCezary Rojewski } __packed; 31392946c1dSCezary Rojewski 31492946c1dSCezary Rojewski #define CATPT_STREAM_MSG(msg_type) \ 31592946c1dSCezary Rojewski { \ 31692946c1dSCezary Rojewski .stream_msg_type = CATPT_STRM_##msg_type, \ 31792946c1dSCezary Rojewski .global_msg_type = CATPT_GLB_STREAM_MESSAGE } 31892946c1dSCezary Rojewski #define CATPT_STAGE_MSG(msg_type) \ 31992946c1dSCezary Rojewski { \ 32092946c1dSCezary Rojewski .stage_action = CATPT_STG_##msg_type, \ 32192946c1dSCezary Rojewski .stream_msg_type = CATPT_STRM_STAGE_MESSAGE, \ 32292946c1dSCezary Rojewski .global_msg_type = CATPT_GLB_STREAM_MESSAGE } 32392946c1dSCezary Rojewski 32492946c1dSCezary Rojewski int catpt_ipc_reset_stream(struct catpt_dev *cdev, u8 stream_hw_id); 32592946c1dSCezary Rojewski int catpt_ipc_pause_stream(struct catpt_dev *cdev, u8 stream_hw_id); 32692946c1dSCezary Rojewski int catpt_ipc_resume_stream(struct catpt_dev *cdev, u8 stream_hw_id); 32792946c1dSCezary Rojewski 32892946c1dSCezary Rojewski /* STREAM messages - STAGE subtype */ 32992946c1dSCezary Rojewski 33092946c1dSCezary Rojewski enum catpt_audio_curve_type { 33192946c1dSCezary Rojewski CATPT_AUDIO_CURVE_NONE = 0, 33292946c1dSCezary Rojewski CATPT_AUDIO_CURVE_WINDOWS_FADE = 1, 33392946c1dSCezary Rojewski }; 33492946c1dSCezary Rojewski 33592946c1dSCezary Rojewski int catpt_ipc_set_volume(struct catpt_dev *cdev, u8 stream_hw_id, 33692946c1dSCezary Rojewski u32 channel, u32 volume, 33792946c1dSCezary Rojewski u32 curve_duration, 33892946c1dSCezary Rojewski enum catpt_audio_curve_type curve_type); 33992946c1dSCezary Rojewski 34092946c1dSCezary Rojewski int catpt_ipc_set_write_pos(struct catpt_dev *cdev, u8 stream_hw_id, 34192946c1dSCezary Rojewski u32 pos, bool eob, bool ll); 34292946c1dSCezary Rojewski 34392946c1dSCezary Rojewski int catpt_ipc_mute_loopback(struct catpt_dev *cdev, u8 stream_hw_id, bool mute); 34492946c1dSCezary Rojewski 34592946c1dSCezary Rojewski /* NOTIFICATION messages */ 34692946c1dSCezary Rojewski 34792946c1dSCezary Rojewski enum catpt_notify_reason { 34892946c1dSCezary Rojewski CATPT_NOTIFY_POSITION_CHANGED = 0, 34992946c1dSCezary Rojewski CATPT_NOTIFY_GLITCH_OCCURRED = 1, 35092946c1dSCezary Rojewski }; 35192946c1dSCezary Rojewski 35292946c1dSCezary Rojewski union catpt_notify_msg { 35392946c1dSCezary Rojewski u32 val; 35492946c1dSCezary Rojewski struct { 35592946c1dSCezary Rojewski u32 mailbox_address:29; 35692946c1dSCezary Rojewski u32 fw_ready:1; 35792946c1dSCezary Rojewski u32 done:1; 35892946c1dSCezary Rojewski u32 busy:1; 35992946c1dSCezary Rojewski }; 36092946c1dSCezary Rojewski struct { 36192946c1dSCezary Rojewski u32 status:5; 36292946c1dSCezary Rojewski u32 reserved:7; 36392946c1dSCezary Rojewski u32 notify_reason:4; 36492946c1dSCezary Rojewski u32 stream_hw_id:4; 36592946c1dSCezary Rojewski u32 stream_msg_type:4; 36692946c1dSCezary Rojewski u32 global_msg_type:5; 36792946c1dSCezary Rojewski u32 hdr:3; /* fw_ready, done, busy */ 36892946c1dSCezary Rojewski }; 36992946c1dSCezary Rojewski } __packed; 37092946c1dSCezary Rojewski 37192946c1dSCezary Rojewski #define FW_INFO_SIZE_MAX 100 37292946c1dSCezary Rojewski 37392946c1dSCezary Rojewski struct catpt_fw_ready { 37492946c1dSCezary Rojewski u32 inbox_offset; 37592946c1dSCezary Rojewski u32 outbox_offset; 37692946c1dSCezary Rojewski u32 inbox_size; 37792946c1dSCezary Rojewski u32 outbox_size; 37892946c1dSCezary Rojewski u32 fw_info_size; 37992946c1dSCezary Rojewski char fw_info[FW_INFO_SIZE_MAX]; 38092946c1dSCezary Rojewski } __packed; 38192946c1dSCezary Rojewski 38292946c1dSCezary Rojewski struct catpt_notify_position { 38392946c1dSCezary Rojewski u32 stream_position; 38492946c1dSCezary Rojewski u32 fw_cycle_count; 38592946c1dSCezary Rojewski } __packed; 38692946c1dSCezary Rojewski 38792946c1dSCezary Rojewski enum catpt_glitch_type { 38892946c1dSCezary Rojewski CATPT_GLITCH_UNDERRUN = 1, 38992946c1dSCezary Rojewski CATPT_GLITCH_DECODER_ERROR = 2, 39092946c1dSCezary Rojewski CATPT_GLITCH_DOUBLED_WRITE_POS = 3, 39192946c1dSCezary Rojewski }; 39292946c1dSCezary Rojewski 39392946c1dSCezary Rojewski struct catpt_notify_glitch { 39492946c1dSCezary Rojewski u32 type; 39592946c1dSCezary Rojewski u64 presentation_pos; 39692946c1dSCezary Rojewski u32 write_pos; 39792946c1dSCezary Rojewski } __packed; 39892946c1dSCezary Rojewski 39992946c1dSCezary Rojewski #endif 400