1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun #ifndef __SST_MFLD_DSP_H__ 3*4882a593Smuzhiyun #define __SST_MFLD_DSP_H__ 4*4882a593Smuzhiyun /* 5*4882a593Smuzhiyun * sst_mfld_dsp.h - Intel SST Driver for audio engine 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright (C) 2008-14 Intel Corporation 8*4882a593Smuzhiyun * Authors: Vinod Koul <vinod.koul@linux.intel.com> 9*4882a593Smuzhiyun * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 12*4882a593Smuzhiyun */ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define SST_MAX_BIN_BYTES 1024 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define MAX_DBG_RW_BYTES 80 17*4882a593Smuzhiyun #define MAX_NUM_SCATTER_BUFFERS 8 18*4882a593Smuzhiyun #define MAX_LOOP_BACK_DWORDS 8 19*4882a593Smuzhiyun /* IPC base address and mailbox, timestamp offsets */ 20*4882a593Smuzhiyun #define SST_MAILBOX_SIZE 0x0400 21*4882a593Smuzhiyun #define SST_MAILBOX_SEND 0x0000 22*4882a593Smuzhiyun #define SST_TIME_STAMP 0x1800 23*4882a593Smuzhiyun #define SST_TIME_STAMP_MRFLD 0x800 24*4882a593Smuzhiyun #define SST_RESERVED_OFFSET 0x1A00 25*4882a593Smuzhiyun #define SST_SCU_LPE_MAILBOX 0x1000 26*4882a593Smuzhiyun #define SST_LPE_SCU_MAILBOX 0x1400 27*4882a593Smuzhiyun #define SST_SCU_LPE_LOG_BUF (SST_SCU_LPE_MAILBOX+16) 28*4882a593Smuzhiyun #define PROCESS_MSG 0x80 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* Message ID's for IPC messages */ 31*4882a593Smuzhiyun /* Bits B7: SST or IA/SC ; B6-B4: Msg Category; B3-B0: Msg Type */ 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* I2L Firmware/Codec Download msgs */ 34*4882a593Smuzhiyun #define IPC_IA_PREP_LIB_DNLD 0x01 35*4882a593Smuzhiyun #define IPC_IA_LIB_DNLD_CMPLT 0x02 36*4882a593Smuzhiyun #define IPC_IA_GET_FW_VERSION 0x04 37*4882a593Smuzhiyun #define IPC_IA_GET_FW_BUILD_INF 0x05 38*4882a593Smuzhiyun #define IPC_IA_GET_FW_INFO 0x06 39*4882a593Smuzhiyun #define IPC_IA_GET_FW_CTXT 0x07 40*4882a593Smuzhiyun #define IPC_IA_SET_FW_CTXT 0x08 41*4882a593Smuzhiyun #define IPC_IA_PREPARE_SHUTDOWN 0x31 42*4882a593Smuzhiyun /* I2L Codec Config/control msgs */ 43*4882a593Smuzhiyun #define IPC_PREP_D3 0x10 44*4882a593Smuzhiyun #define IPC_IA_SET_CODEC_PARAMS 0x10 45*4882a593Smuzhiyun #define IPC_IA_GET_CODEC_PARAMS 0x11 46*4882a593Smuzhiyun #define IPC_IA_SET_PPP_PARAMS 0x12 47*4882a593Smuzhiyun #define IPC_IA_GET_PPP_PARAMS 0x13 48*4882a593Smuzhiyun #define IPC_SST_PERIOD_ELAPSED_MRFLD 0xA 49*4882a593Smuzhiyun #define IPC_IA_ALG_PARAMS 0x1A 50*4882a593Smuzhiyun #define IPC_IA_TUNING_PARAMS 0x1B 51*4882a593Smuzhiyun #define IPC_IA_SET_RUNTIME_PARAMS 0x1C 52*4882a593Smuzhiyun #define IPC_IA_SET_PARAMS 0x1 53*4882a593Smuzhiyun #define IPC_IA_GET_PARAMS 0x2 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define IPC_EFFECTS_CREATE 0xE 56*4882a593Smuzhiyun #define IPC_EFFECTS_DESTROY 0xF 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* I2L Stream config/control msgs */ 59*4882a593Smuzhiyun #define IPC_IA_ALLOC_STREAM_MRFLD 0x2 60*4882a593Smuzhiyun #define IPC_IA_ALLOC_STREAM 0x20 /* Allocate a stream ID */ 61*4882a593Smuzhiyun #define IPC_IA_FREE_STREAM_MRFLD 0x03 62*4882a593Smuzhiyun #define IPC_IA_FREE_STREAM 0x21 /* Free the stream ID */ 63*4882a593Smuzhiyun #define IPC_IA_SET_STREAM_PARAMS 0x22 64*4882a593Smuzhiyun #define IPC_IA_SET_STREAM_PARAMS_MRFLD 0x12 65*4882a593Smuzhiyun #define IPC_IA_GET_STREAM_PARAMS 0x23 66*4882a593Smuzhiyun #define IPC_IA_PAUSE_STREAM 0x24 67*4882a593Smuzhiyun #define IPC_IA_PAUSE_STREAM_MRFLD 0x4 68*4882a593Smuzhiyun #define IPC_IA_RESUME_STREAM 0x25 69*4882a593Smuzhiyun #define IPC_IA_RESUME_STREAM_MRFLD 0x5 70*4882a593Smuzhiyun #define IPC_IA_DROP_STREAM 0x26 71*4882a593Smuzhiyun #define IPC_IA_DROP_STREAM_MRFLD 0x07 72*4882a593Smuzhiyun #define IPC_IA_DRAIN_STREAM 0x27 /* Short msg with str_id */ 73*4882a593Smuzhiyun #define IPC_IA_DRAIN_STREAM_MRFLD 0x8 74*4882a593Smuzhiyun #define IPC_IA_CONTROL_ROUTING 0x29 75*4882a593Smuzhiyun #define IPC_IA_VTSV_UPDATE_MODULES 0x20 76*4882a593Smuzhiyun #define IPC_IA_VTSV_DETECTED 0x21 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #define IPC_IA_START_STREAM_MRFLD 0X06 79*4882a593Smuzhiyun #define IPC_IA_START_STREAM 0x30 /* Short msg with str_id */ 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #define IPC_IA_SET_GAIN_MRFLD 0x21 82*4882a593Smuzhiyun /* Debug msgs */ 83*4882a593Smuzhiyun #define IPC_IA_DBG_MEM_READ 0x40 84*4882a593Smuzhiyun #define IPC_IA_DBG_MEM_WRITE 0x41 85*4882a593Smuzhiyun #define IPC_IA_DBG_LOOP_BACK 0x42 86*4882a593Smuzhiyun #define IPC_IA_DBG_LOG_ENABLE 0x45 87*4882a593Smuzhiyun #define IPC_IA_DBG_SET_PROBE_PARAMS 0x47 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* L2I Firmware/Codec Download msgs */ 90*4882a593Smuzhiyun #define IPC_IA_FW_INIT_CMPLT 0x81 91*4882a593Smuzhiyun #define IPC_IA_FW_INIT_CMPLT_MRFLD 0x01 92*4882a593Smuzhiyun #define IPC_IA_FW_ASYNC_ERR_MRFLD 0x11 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /* L2I Codec Config/control msgs */ 95*4882a593Smuzhiyun #define IPC_SST_FRAGMENT_ELPASED 0x90 /* Request IA more data */ 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun #define IPC_SST_BUF_UNDER_RUN 0x92 /* PB Under run and stopped */ 98*4882a593Smuzhiyun #define IPC_SST_BUF_OVER_RUN 0x93 /* CAP Under run and stopped */ 99*4882a593Smuzhiyun #define IPC_SST_DRAIN_END 0x94 /* PB Drain complete and stopped */ 100*4882a593Smuzhiyun #define IPC_SST_CHNGE_SSP_PARAMS 0x95 /* PB SSP parameters changed */ 101*4882a593Smuzhiyun #define IPC_SST_STREAM_PROCESS_FATAL_ERR 0x96/* error in processing a stream */ 102*4882a593Smuzhiyun #define IPC_SST_PERIOD_ELAPSED 0x97 /* period elapsed */ 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun #define IPC_SST_ERROR_EVENT 0x99 /* Buffer over run occurred */ 105*4882a593Smuzhiyun /* L2S messages */ 106*4882a593Smuzhiyun #define IPC_SC_DDR_LINK_UP 0xC0 107*4882a593Smuzhiyun #define IPC_SC_DDR_LINK_DOWN 0xC1 108*4882a593Smuzhiyun #define IPC_SC_SET_LPECLK_REQ 0xC2 109*4882a593Smuzhiyun #define IPC_SC_SSP_BIT_BANG 0xC3 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun /* L2I Error reporting msgs */ 112*4882a593Smuzhiyun #define IPC_IA_MEM_ALLOC_FAIL 0xE0 113*4882a593Smuzhiyun #define IPC_IA_PROC_ERR 0xE1 /* error in processing a 114*4882a593Smuzhiyun stream can be used by playback and 115*4882a593Smuzhiyun capture modules */ 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /* L2I Debug msgs */ 118*4882a593Smuzhiyun #define IPC_IA_PRINT_STRING 0xF0 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* Buffer under-run */ 121*4882a593Smuzhiyun #define IPC_IA_BUF_UNDER_RUN_MRFLD 0x0B 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun /* Mrfld specific defines: 124*4882a593Smuzhiyun * For asynchronous messages(INIT_CMPLT, PERIOD_ELAPSED, ASYNC_ERROR) 125*4882a593Smuzhiyun * received from FW, the format is: 126*4882a593Smuzhiyun * - IPC High: pvt_id is set to zero. Always short message. 127*4882a593Smuzhiyun * - msg_id is in lower 16-bits of IPC low payload. 128*4882a593Smuzhiyun * - pipe_id is in higher 16-bits of IPC low payload for period_elapsed. 129*4882a593Smuzhiyun * - error id is in higher 16-bits of IPC low payload for async errors. 130*4882a593Smuzhiyun */ 131*4882a593Smuzhiyun #define SST_ASYNC_DRV_ID 0 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun /* Command Response or Acknowledge message to any IPC message will have 134*4882a593Smuzhiyun * same message ID and stream ID information which is sent. 135*4882a593Smuzhiyun * There is no specific Ack message ID. The data field is used as response 136*4882a593Smuzhiyun * meaning. 137*4882a593Smuzhiyun */ 138*4882a593Smuzhiyun enum ackData { 139*4882a593Smuzhiyun IPC_ACK_SUCCESS = 0, 140*4882a593Smuzhiyun IPC_ACK_FAILURE, 141*4882a593Smuzhiyun }; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun enum ipc_ia_msg_id { 144*4882a593Smuzhiyun IPC_CMD = 1, /*!< Task Control message ID */ 145*4882a593Smuzhiyun IPC_SET_PARAMS = 2,/*!< Task Set param message ID */ 146*4882a593Smuzhiyun IPC_GET_PARAMS = 3, /*!< Task Get param message ID */ 147*4882a593Smuzhiyun IPC_INVALID = 0xFF, /*!<Task Get param message ID */ 148*4882a593Smuzhiyun }; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun enum sst_codec_types { 151*4882a593Smuzhiyun /* AUDIO/MUSIC CODEC Type Definitions */ 152*4882a593Smuzhiyun SST_CODEC_TYPE_UNKNOWN = 0, 153*4882a593Smuzhiyun SST_CODEC_TYPE_PCM, /* Pass through Audio codec */ 154*4882a593Smuzhiyun SST_CODEC_TYPE_MP3, 155*4882a593Smuzhiyun SST_CODEC_TYPE_MP24, 156*4882a593Smuzhiyun SST_CODEC_TYPE_AAC, 157*4882a593Smuzhiyun SST_CODEC_TYPE_AACP, 158*4882a593Smuzhiyun SST_CODEC_TYPE_eAACP, 159*4882a593Smuzhiyun }; 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun enum stream_type { 162*4882a593Smuzhiyun SST_STREAM_TYPE_NONE = 0, 163*4882a593Smuzhiyun SST_STREAM_TYPE_MUSIC = 1, 164*4882a593Smuzhiyun }; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun enum sst_error_codes { 167*4882a593Smuzhiyun /* Error code,response to msgId: Description */ 168*4882a593Smuzhiyun /* Common error codes */ 169*4882a593Smuzhiyun SST_SUCCESS = 0, /* Success */ 170*4882a593Smuzhiyun SST_ERR_INVALID_STREAM_ID = 1, 171*4882a593Smuzhiyun SST_ERR_INVALID_MSG_ID = 2, 172*4882a593Smuzhiyun SST_ERR_INVALID_STREAM_OP = 3, 173*4882a593Smuzhiyun SST_ERR_INVALID_PARAMS = 4, 174*4882a593Smuzhiyun SST_ERR_INVALID_CODEC = 5, 175*4882a593Smuzhiyun SST_ERR_INVALID_MEDIA_TYPE = 6, 176*4882a593Smuzhiyun SST_ERR_STREAM_ERR = 7, 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun SST_ERR_STREAM_IN_USE = 15, 179*4882a593Smuzhiyun }; 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun struct ipc_dsp_hdr { 182*4882a593Smuzhiyun u16 mod_index_id:8; /*!< DSP Command ID specific to tasks */ 183*4882a593Smuzhiyun u16 pipe_id:8; /*!< instance of the module in the pipeline */ 184*4882a593Smuzhiyun u16 mod_id; /*!< Pipe_id */ 185*4882a593Smuzhiyun u16 cmd_id; /*!< Module ID = lpe_algo_types_t */ 186*4882a593Smuzhiyun u16 length; /*!< Length of the payload only */ 187*4882a593Smuzhiyun } __packed; 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun union ipc_header_high { 190*4882a593Smuzhiyun struct { 191*4882a593Smuzhiyun u32 msg_id:8; /* Message ID - Max 256 Message Types */ 192*4882a593Smuzhiyun u32 task_id:4; /* Task ID associated with this comand */ 193*4882a593Smuzhiyun u32 drv_id:4; /* Identifier for the driver to track*/ 194*4882a593Smuzhiyun u32 rsvd1:8; /* Reserved */ 195*4882a593Smuzhiyun u32 result:4; /* Reserved */ 196*4882a593Smuzhiyun u32 res_rqd:1; /* Response rqd */ 197*4882a593Smuzhiyun u32 large:1; /* Large Message if large = 1 */ 198*4882a593Smuzhiyun u32 done:1; /* bit 30 - Done bit */ 199*4882a593Smuzhiyun u32 busy:1; /* bit 31 - busy bit*/ 200*4882a593Smuzhiyun } part; 201*4882a593Smuzhiyun u32 full; 202*4882a593Smuzhiyun } __packed; 203*4882a593Smuzhiyun /* IPC header */ 204*4882a593Smuzhiyun union ipc_header_mrfld { 205*4882a593Smuzhiyun struct { 206*4882a593Smuzhiyun u32 header_low_payload; 207*4882a593Smuzhiyun union ipc_header_high header_high; 208*4882a593Smuzhiyun } p; 209*4882a593Smuzhiyun u64 full; 210*4882a593Smuzhiyun } __packed; 211*4882a593Smuzhiyun /* CAUTION NOTE: All IPC message body must be multiple of 32 bits.*/ 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun /* IPC Header */ 214*4882a593Smuzhiyun union ipc_header { 215*4882a593Smuzhiyun struct { 216*4882a593Smuzhiyun u32 msg_id:8; /* Message ID - Max 256 Message Types */ 217*4882a593Smuzhiyun u32 str_id:5; 218*4882a593Smuzhiyun u32 large:1; /* Large Message if large = 1 */ 219*4882a593Smuzhiyun u32 reserved:2; /* Reserved for future use */ 220*4882a593Smuzhiyun u32 data:14; /* Ack/Info for msg, size of msg in Mailbox */ 221*4882a593Smuzhiyun u32 done:1; /* bit 30 */ 222*4882a593Smuzhiyun u32 busy:1; /* bit 31 */ 223*4882a593Smuzhiyun } part; 224*4882a593Smuzhiyun u32 full; 225*4882a593Smuzhiyun } __packed; 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun /* Firmware build info */ 228*4882a593Smuzhiyun struct sst_fw_build_info { 229*4882a593Smuzhiyun unsigned char date[16]; /* Firmware build date */ 230*4882a593Smuzhiyun unsigned char time[16]; /* Firmware build time */ 231*4882a593Smuzhiyun } __packed; 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun /* Firmware Version info */ 234*4882a593Smuzhiyun struct snd_sst_fw_version { 235*4882a593Smuzhiyun u8 build; /* build number*/ 236*4882a593Smuzhiyun u8 minor; /* minor number*/ 237*4882a593Smuzhiyun u8 major; /* major number*/ 238*4882a593Smuzhiyun u8 type; /* build type */ 239*4882a593Smuzhiyun }; 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun struct ipc_header_fw_init { 242*4882a593Smuzhiyun struct snd_sst_fw_version fw_version;/* Firmware version details */ 243*4882a593Smuzhiyun struct sst_fw_build_info build_info; 244*4882a593Smuzhiyun u16 result; /* Fw init result */ 245*4882a593Smuzhiyun u8 module_id; /* Module ID in case of error */ 246*4882a593Smuzhiyun u8 debug_info; /* Debug info from Module ID in case of fail */ 247*4882a593Smuzhiyun } __packed; 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun struct snd_sst_tstamp { 250*4882a593Smuzhiyun u64 ring_buffer_counter; /* PB/CP: Bytes copied from/to DDR. */ 251*4882a593Smuzhiyun u64 hardware_counter; /* PB/CP: Bytes DMAed to/from SSP. */ 252*4882a593Smuzhiyun u64 frames_decoded; 253*4882a593Smuzhiyun u64 bytes_decoded; 254*4882a593Smuzhiyun u64 bytes_copied; 255*4882a593Smuzhiyun u32 sampling_frequency; 256*4882a593Smuzhiyun u32 channel_peak[8]; 257*4882a593Smuzhiyun } __packed; 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun /* Stream type params struture for Alloc stream */ 260*4882a593Smuzhiyun struct snd_sst_str_type { 261*4882a593Smuzhiyun u8 codec_type; /* Codec type */ 262*4882a593Smuzhiyun u8 str_type; /* 1 = voice 2 = music */ 263*4882a593Smuzhiyun u8 operation; /* Playback or Capture */ 264*4882a593Smuzhiyun u8 protected_str; /* 0=Non DRM, 1=DRM */ 265*4882a593Smuzhiyun u8 time_slots; 266*4882a593Smuzhiyun u8 reserved; /* Reserved */ 267*4882a593Smuzhiyun u16 result; /* Result used for acknowledgment */ 268*4882a593Smuzhiyun } __packed; 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun /* Library info structure */ 271*4882a593Smuzhiyun struct module_info { 272*4882a593Smuzhiyun u32 lib_version; 273*4882a593Smuzhiyun u32 lib_type;/*TBD- KLOCKWORK u8 lib_type;*/ 274*4882a593Smuzhiyun u32 media_type; 275*4882a593Smuzhiyun u8 lib_name[12]; 276*4882a593Smuzhiyun u32 lib_caps; 277*4882a593Smuzhiyun unsigned char b_date[16]; /* Lib build date */ 278*4882a593Smuzhiyun unsigned char b_time[16]; /* Lib build time */ 279*4882a593Smuzhiyun } __packed; 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun /* Library slot info */ 282*4882a593Smuzhiyun struct lib_slot_info { 283*4882a593Smuzhiyun u8 slot_num; /* 1 or 2 */ 284*4882a593Smuzhiyun u8 reserved1; 285*4882a593Smuzhiyun u16 reserved2; 286*4882a593Smuzhiyun u32 iram_size; /* slot size in IRAM */ 287*4882a593Smuzhiyun u32 dram_size; /* slot size in DRAM */ 288*4882a593Smuzhiyun u32 iram_offset; /* starting offset of slot in IRAM */ 289*4882a593Smuzhiyun u32 dram_offset; /* starting offset of slot in DRAM */ 290*4882a593Smuzhiyun } __packed; 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun struct snd_ppp_mixer_params { 293*4882a593Smuzhiyun __u32 type; /*Type of the parameter */ 294*4882a593Smuzhiyun __u32 size; 295*4882a593Smuzhiyun __u32 input_stream_bitmap; /*Input stream Bit Map*/ 296*4882a593Smuzhiyun } __packed; 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun struct snd_sst_lib_download { 299*4882a593Smuzhiyun struct module_info lib_info; /* library info type, capabilities etc */ 300*4882a593Smuzhiyun struct lib_slot_info slot_info; /* slot info to be downloaded */ 301*4882a593Smuzhiyun u32 mod_entry_pt; 302*4882a593Smuzhiyun }; 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun struct snd_sst_lib_download_info { 305*4882a593Smuzhiyun struct snd_sst_lib_download dload_lib; 306*4882a593Smuzhiyun u16 result; /* Result used for acknowledgment */ 307*4882a593Smuzhiyun u8 pvt_id; /* Private ID */ 308*4882a593Smuzhiyun u8 reserved; /* for alignment */ 309*4882a593Smuzhiyun }; 310*4882a593Smuzhiyun struct snd_pcm_params { 311*4882a593Smuzhiyun u8 num_chan; /* 1=Mono, 2=Stereo */ 312*4882a593Smuzhiyun u8 pcm_wd_sz; /* 16/24 - bit*/ 313*4882a593Smuzhiyun u8 use_offload_path; /* 0-PCM using period elpased & ALSA interfaces 314*4882a593Smuzhiyun 1-PCM stream via compressed interface */ 315*4882a593Smuzhiyun u8 reserved2; 316*4882a593Smuzhiyun u32 sfreq; /* Sampling rate in Hz */ 317*4882a593Smuzhiyun u8 channel_map[8]; 318*4882a593Smuzhiyun } __packed; 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun /* MP3 Music Parameters Message */ 321*4882a593Smuzhiyun struct snd_mp3_params { 322*4882a593Smuzhiyun u8 num_chan; /* 1=Mono, 2=Stereo */ 323*4882a593Smuzhiyun u8 pcm_wd_sz; /* 16/24 - bit*/ 324*4882a593Smuzhiyun u8 crc_check; /* crc_check - disable (0) or enable (1) */ 325*4882a593Smuzhiyun u8 reserved1; /* unused*/ 326*4882a593Smuzhiyun u16 reserved2; /* Unused */ 327*4882a593Smuzhiyun } __packed; 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun #define AAC_BIT_STREAM_ADTS 0 330*4882a593Smuzhiyun #define AAC_BIT_STREAM_ADIF 1 331*4882a593Smuzhiyun #define AAC_BIT_STREAM_RAW 2 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun /* AAC Music Parameters Message */ 334*4882a593Smuzhiyun struct snd_aac_params { 335*4882a593Smuzhiyun u8 num_chan; /* 1=Mono, 2=Stereo*/ 336*4882a593Smuzhiyun u8 pcm_wd_sz; /* 16/24 - bit*/ 337*4882a593Smuzhiyun u8 bdownsample; /*SBR downsampling 0 - disable 1 -enabled AAC+ only */ 338*4882a593Smuzhiyun u8 bs_format; /* input bit stream format adts=0, adif=1, raw=2 */ 339*4882a593Smuzhiyun u16 reser2; 340*4882a593Smuzhiyun u32 externalsr; /*sampling rate of basic AAC raw bit stream*/ 341*4882a593Smuzhiyun u8 sbr_signalling;/*disable/enable/set automode the SBR tool.AAC+*/ 342*4882a593Smuzhiyun u8 reser1; 343*4882a593Smuzhiyun u16 reser3; 344*4882a593Smuzhiyun } __packed; 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun /* WMA Music Parameters Message */ 347*4882a593Smuzhiyun struct snd_wma_params { 348*4882a593Smuzhiyun u8 num_chan; /* 1=Mono, 2=Stereo */ 349*4882a593Smuzhiyun u8 pcm_wd_sz; /* 16/24 - bit*/ 350*4882a593Smuzhiyun u16 reserved1; 351*4882a593Smuzhiyun u32 brate; /* Use the hard coded value. */ 352*4882a593Smuzhiyun u32 sfreq; /* Sampling freq eg. 8000, 441000, 48000 */ 353*4882a593Smuzhiyun u32 channel_mask; /* Channel Mask */ 354*4882a593Smuzhiyun u16 format_tag; /* Format Tag */ 355*4882a593Smuzhiyun u16 block_align; /* packet size */ 356*4882a593Smuzhiyun u16 wma_encode_opt;/* Encoder option */ 357*4882a593Smuzhiyun u8 op_align; /* op align 0- 16 bit, 1- MSB, 2 LSB */ 358*4882a593Smuzhiyun u8 reserved; /* reserved */ 359*4882a593Smuzhiyun } __packed; 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun /* Codec params struture */ 362*4882a593Smuzhiyun union snd_sst_codec_params { 363*4882a593Smuzhiyun struct snd_pcm_params pcm_params; 364*4882a593Smuzhiyun struct snd_mp3_params mp3_params; 365*4882a593Smuzhiyun struct snd_aac_params aac_params; 366*4882a593Smuzhiyun struct snd_wma_params wma_params; 367*4882a593Smuzhiyun } __packed; 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun /* Address and size info of a frame buffer */ 370*4882a593Smuzhiyun struct sst_address_info { 371*4882a593Smuzhiyun u32 addr; /* Address at IA */ 372*4882a593Smuzhiyun u32 size; /* Size of the buffer */ 373*4882a593Smuzhiyun }; 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun struct snd_sst_alloc_params_ext { 376*4882a593Smuzhiyun __u16 sg_count; 377*4882a593Smuzhiyun __u16 reserved; 378*4882a593Smuzhiyun __u32 frag_size; /*Number of samples after which period elapsed 379*4882a593Smuzhiyun message is sent valid only if path = 0*/ 380*4882a593Smuzhiyun struct sst_address_info ring_buf_info[8]; 381*4882a593Smuzhiyun }; 382*4882a593Smuzhiyun 383*4882a593Smuzhiyun struct snd_sst_stream_params { 384*4882a593Smuzhiyun union snd_sst_codec_params uc; 385*4882a593Smuzhiyun } __packed; 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun struct snd_sst_params { 388*4882a593Smuzhiyun u32 result; 389*4882a593Smuzhiyun u32 stream_id; 390*4882a593Smuzhiyun u8 codec; 391*4882a593Smuzhiyun u8 ops; 392*4882a593Smuzhiyun u8 stream_type; 393*4882a593Smuzhiyun u8 device_type; 394*4882a593Smuzhiyun u8 task; 395*4882a593Smuzhiyun struct snd_sst_stream_params sparams; 396*4882a593Smuzhiyun struct snd_sst_alloc_params_ext aparams; 397*4882a593Smuzhiyun }; 398*4882a593Smuzhiyun 399*4882a593Smuzhiyun struct snd_sst_alloc_mrfld { 400*4882a593Smuzhiyun u16 codec_type; 401*4882a593Smuzhiyun u8 operation; 402*4882a593Smuzhiyun u8 sg_count; 403*4882a593Smuzhiyun struct sst_address_info ring_buf_info[8]; 404*4882a593Smuzhiyun u32 frag_size; 405*4882a593Smuzhiyun u32 ts; 406*4882a593Smuzhiyun struct snd_sst_stream_params codec_params; 407*4882a593Smuzhiyun } __packed; 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun /* Alloc stream params structure */ 410*4882a593Smuzhiyun struct snd_sst_alloc_params { 411*4882a593Smuzhiyun struct snd_sst_str_type str_type; 412*4882a593Smuzhiyun struct snd_sst_stream_params stream_params; 413*4882a593Smuzhiyun struct snd_sst_alloc_params_ext alloc_params; 414*4882a593Smuzhiyun } __packed; 415*4882a593Smuzhiyun 416*4882a593Smuzhiyun /* Alloc stream response message */ 417*4882a593Smuzhiyun struct snd_sst_alloc_response { 418*4882a593Smuzhiyun struct snd_sst_str_type str_type; /* Stream type for allocation */ 419*4882a593Smuzhiyun struct snd_sst_lib_download lib_dnld; /* Valid only for codec dnld */ 420*4882a593Smuzhiyun }; 421*4882a593Smuzhiyun 422*4882a593Smuzhiyun /* Drop response */ 423*4882a593Smuzhiyun struct snd_sst_drop_response { 424*4882a593Smuzhiyun u32 result; 425*4882a593Smuzhiyun u32 bytes; 426*4882a593Smuzhiyun }; 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun struct snd_sst_async_msg { 429*4882a593Smuzhiyun u32 msg_id; /* Async msg id */ 430*4882a593Smuzhiyun u32 payload[0]; 431*4882a593Smuzhiyun }; 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun struct snd_sst_async_err_msg { 434*4882a593Smuzhiyun u32 fw_resp; /* Firmware Result */ 435*4882a593Smuzhiyun u32 lib_resp; /*Library result */ 436*4882a593Smuzhiyun } __packed; 437*4882a593Smuzhiyun 438*4882a593Smuzhiyun struct snd_sst_vol { 439*4882a593Smuzhiyun u32 stream_id; 440*4882a593Smuzhiyun s32 volume; 441*4882a593Smuzhiyun u32 ramp_duration; 442*4882a593Smuzhiyun u32 ramp_type; /* Ramp type, default=0 */ 443*4882a593Smuzhiyun }; 444*4882a593Smuzhiyun 445*4882a593Smuzhiyun /* Gain library parameters for mrfld 446*4882a593Smuzhiyun * based on DSP command spec v0.82 447*4882a593Smuzhiyun */ 448*4882a593Smuzhiyun struct snd_sst_gain_v2 { 449*4882a593Smuzhiyun u16 gain_cell_num; /* num of gain cells to modify*/ 450*4882a593Smuzhiyun u8 cell_nbr_idx; /* instance index*/ 451*4882a593Smuzhiyun u8 cell_path_idx; /* pipe-id */ 452*4882a593Smuzhiyun u16 module_id; /*module id */ 453*4882a593Smuzhiyun u16 left_cell_gain; /* left gain value in dB*/ 454*4882a593Smuzhiyun u16 right_cell_gain; /* right gain value in dB*/ 455*4882a593Smuzhiyun u16 gain_time_const; /* gain time constant*/ 456*4882a593Smuzhiyun } __packed; 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun struct snd_sst_mute { 459*4882a593Smuzhiyun u32 stream_id; 460*4882a593Smuzhiyun u32 mute; 461*4882a593Smuzhiyun }; 462*4882a593Smuzhiyun 463*4882a593Smuzhiyun struct snd_sst_runtime_params { 464*4882a593Smuzhiyun u8 type; 465*4882a593Smuzhiyun u8 str_id; 466*4882a593Smuzhiyun u8 size; 467*4882a593Smuzhiyun u8 rsvd; 468*4882a593Smuzhiyun void *addr; 469*4882a593Smuzhiyun } __packed; 470*4882a593Smuzhiyun 471*4882a593Smuzhiyun enum stream_param_type { 472*4882a593Smuzhiyun SST_SET_TIME_SLOT = 0, 473*4882a593Smuzhiyun SST_SET_CHANNEL_INFO = 1, 474*4882a593Smuzhiyun OTHERS = 2, /*reserved for future params*/ 475*4882a593Smuzhiyun }; 476*4882a593Smuzhiyun 477*4882a593Smuzhiyun /* CSV Voice call routing structure */ 478*4882a593Smuzhiyun struct snd_sst_control_routing { 479*4882a593Smuzhiyun u8 control; /* 0=start, 1=Stop */ 480*4882a593Smuzhiyun u8 reserved[3]; /* Reserved- for 32 bit alignment */ 481*4882a593Smuzhiyun }; 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun struct ipc_post { 484*4882a593Smuzhiyun struct list_head node; 485*4882a593Smuzhiyun union ipc_header header; /* driver specific */ 486*4882a593Smuzhiyun bool is_large; 487*4882a593Smuzhiyun bool is_process_reply; 488*4882a593Smuzhiyun union ipc_header_mrfld mrfld_header; 489*4882a593Smuzhiyun char *mailbox_data; 490*4882a593Smuzhiyun }; 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun struct snd_sst_ctxt_params { 493*4882a593Smuzhiyun u32 address; /* Physical Address in DDR where the context is stored */ 494*4882a593Smuzhiyun u32 size; /* size of the context */ 495*4882a593Smuzhiyun }; 496*4882a593Smuzhiyun 497*4882a593Smuzhiyun struct snd_sst_lpe_log_params { 498*4882a593Smuzhiyun u8 dbg_type; 499*4882a593Smuzhiyun u8 module_id; 500*4882a593Smuzhiyun u8 log_level; 501*4882a593Smuzhiyun u8 reserved; 502*4882a593Smuzhiyun } __packed; 503*4882a593Smuzhiyun 504*4882a593Smuzhiyun enum snd_sst_bytes_type { 505*4882a593Smuzhiyun SND_SST_BYTES_SET = 0x1, 506*4882a593Smuzhiyun SND_SST_BYTES_GET = 0x2, 507*4882a593Smuzhiyun }; 508*4882a593Smuzhiyun 509*4882a593Smuzhiyun struct snd_sst_bytes_v2 { 510*4882a593Smuzhiyun u8 type; 511*4882a593Smuzhiyun u8 ipc_msg; 512*4882a593Smuzhiyun u8 block; 513*4882a593Smuzhiyun u8 task_id; 514*4882a593Smuzhiyun u8 pipe_id; 515*4882a593Smuzhiyun u8 rsvd; 516*4882a593Smuzhiyun u16 len; 517*4882a593Smuzhiyun char bytes[0]; 518*4882a593Smuzhiyun }; 519*4882a593Smuzhiyun 520*4882a593Smuzhiyun #define MAX_VTSV_FILES 2 521*4882a593Smuzhiyun struct snd_sst_vtsv_info { 522*4882a593Smuzhiyun struct sst_address_info vfiles[MAX_VTSV_FILES]; 523*4882a593Smuzhiyun } __packed; 524*4882a593Smuzhiyun 525*4882a593Smuzhiyun #endif /* __SST_MFLD_DSP_H__ */ 526