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