162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * sst.h - Intel SST Driver for audio engine 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2008-14 Intel Corporation 662306a36Sopenharmony_ci * Authors: Vinod Koul <vinod.koul@intel.com> 762306a36Sopenharmony_ci * Harsha Priya <priya.harsha@intel.com> 862306a36Sopenharmony_ci * Dharageswari R <dharageswari.r@intel.com> 962306a36Sopenharmony_ci * KP Jeeja <jeeja.kp@intel.com> 1062306a36Sopenharmony_ci * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * Common private declarations for SST 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_ci#ifndef __SST_H__ 1762306a36Sopenharmony_ci#define __SST_H__ 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#include <linux/firmware.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci/* driver names */ 2262306a36Sopenharmony_ci#define SST_DRV_NAME "intel_sst_driver" 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define SST_SUSPEND_DELAY 2000 2562306a36Sopenharmony_ci#define FW_CONTEXT_MEM (64*1024) 2662306a36Sopenharmony_ci#define SST_ICCM_BOUNDARY 4 2762306a36Sopenharmony_ci#define SST_CONFIG_SSP_SIGN 0x7ffe8001 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define MRFLD_FW_VIRTUAL_BASE 0xC0000000 3062306a36Sopenharmony_ci#define MRFLD_FW_DDR_BASE_OFFSET 0x0 3162306a36Sopenharmony_ci#define MRFLD_FW_FEATURE_BASE_OFFSET 0x4 3262306a36Sopenharmony_ci#define MRFLD_FW_BSS_RESET_BIT 0 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci/* SST Shim register map */ 3562306a36Sopenharmony_ci#define SST_CSR 0x00 3662306a36Sopenharmony_ci#define SST_ISRX 0x18 3762306a36Sopenharmony_ci#define SST_IMRX 0x28 3862306a36Sopenharmony_ci#define SST_IPCX 0x38 /* IPC IA -> SST */ 3962306a36Sopenharmony_ci#define SST_IPCD 0x40 /* IPC SST -> IA */ 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ciextern const struct dev_pm_ops intel_sst_pm; 4262306a36Sopenharmony_cienum sst_states { 4362306a36Sopenharmony_ci SST_FW_LOADING = 1, 4462306a36Sopenharmony_ci SST_FW_RUNNING, 4562306a36Sopenharmony_ci SST_RESET, 4662306a36Sopenharmony_ci SST_SHUTDOWN, 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cienum sst_algo_ops { 5062306a36Sopenharmony_ci SST_SET_ALGO = 0, 5162306a36Sopenharmony_ci SST_GET_ALGO = 1, 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#define SST_BLOCK_TIMEOUT 1000 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci#define FW_SIGNATURE_SIZE 4 5762306a36Sopenharmony_ci#define FW_NAME_SIZE 32 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/* stream states */ 6062306a36Sopenharmony_cienum sst_stream_states { 6162306a36Sopenharmony_ci STREAM_UN_INIT = 0, /* Freed/Not used stream */ 6262306a36Sopenharmony_ci STREAM_RUNNING = 1, /* Running */ 6362306a36Sopenharmony_ci STREAM_PAUSED = 2, /* Paused stream */ 6462306a36Sopenharmony_ci STREAM_INIT = 3, /* stream init, waiting for data */ 6562306a36Sopenharmony_ci}; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cienum sst_ram_type { 6862306a36Sopenharmony_ci SST_IRAM = 1, 6962306a36Sopenharmony_ci SST_DRAM = 2, 7062306a36Sopenharmony_ci SST_DDR = 5, 7162306a36Sopenharmony_ci SST_CUSTOM_INFO = 7, /* consists of FW binary information */ 7262306a36Sopenharmony_ci}; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci/* SST shim registers to structure mapping */ 7562306a36Sopenharmony_ciunion interrupt_reg { 7662306a36Sopenharmony_ci struct { 7762306a36Sopenharmony_ci u64 done_interrupt:1; 7862306a36Sopenharmony_ci u64 busy_interrupt:1; 7962306a36Sopenharmony_ci u64 rsvd:62; 8062306a36Sopenharmony_ci } part; 8162306a36Sopenharmony_ci u64 full; 8262306a36Sopenharmony_ci}; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ciunion sst_pisr_reg { 8562306a36Sopenharmony_ci struct { 8662306a36Sopenharmony_ci u32 pssp0:1; 8762306a36Sopenharmony_ci u32 pssp1:1; 8862306a36Sopenharmony_ci u32 rsvd0:3; 8962306a36Sopenharmony_ci u32 dmac:1; 9062306a36Sopenharmony_ci u32 rsvd1:26; 9162306a36Sopenharmony_ci } part; 9262306a36Sopenharmony_ci u32 full; 9362306a36Sopenharmony_ci}; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ciunion sst_pimr_reg { 9662306a36Sopenharmony_ci struct { 9762306a36Sopenharmony_ci u32 ssp0:1; 9862306a36Sopenharmony_ci u32 ssp1:1; 9962306a36Sopenharmony_ci u32 rsvd0:3; 10062306a36Sopenharmony_ci u32 dmac:1; 10162306a36Sopenharmony_ci u32 rsvd1:10; 10262306a36Sopenharmony_ci u32 ssp0_sc:1; 10362306a36Sopenharmony_ci u32 ssp1_sc:1; 10462306a36Sopenharmony_ci u32 rsvd2:3; 10562306a36Sopenharmony_ci u32 dmac_sc:1; 10662306a36Sopenharmony_ci u32 rsvd3:10; 10762306a36Sopenharmony_ci } part; 10862306a36Sopenharmony_ci u32 full; 10962306a36Sopenharmony_ci}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ciunion config_status_reg_mrfld { 11262306a36Sopenharmony_ci struct { 11362306a36Sopenharmony_ci u64 lpe_reset:1; 11462306a36Sopenharmony_ci u64 lpe_reset_vector:1; 11562306a36Sopenharmony_ci u64 runstall:1; 11662306a36Sopenharmony_ci u64 pwaitmode:1; 11762306a36Sopenharmony_ci u64 clk_sel:3; 11862306a36Sopenharmony_ci u64 rsvd2:1; 11962306a36Sopenharmony_ci u64 sst_clk:3; 12062306a36Sopenharmony_ci u64 xt_snoop:1; 12162306a36Sopenharmony_ci u64 rsvd3:4; 12262306a36Sopenharmony_ci u64 clk_sel1:6; 12362306a36Sopenharmony_ci u64 clk_enable:3; 12462306a36Sopenharmony_ci u64 rsvd4:6; 12562306a36Sopenharmony_ci u64 slim0baseclk:1; 12662306a36Sopenharmony_ci u64 rsvd:32; 12762306a36Sopenharmony_ci } part; 12862306a36Sopenharmony_ci u64 full; 12962306a36Sopenharmony_ci}; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ciunion interrupt_reg_mrfld { 13262306a36Sopenharmony_ci struct { 13362306a36Sopenharmony_ci u64 done_interrupt:1; 13462306a36Sopenharmony_ci u64 busy_interrupt:1; 13562306a36Sopenharmony_ci u64 rsvd:62; 13662306a36Sopenharmony_ci } part; 13762306a36Sopenharmony_ci u64 full; 13862306a36Sopenharmony_ci}; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ciunion sst_imr_reg_mrfld { 14162306a36Sopenharmony_ci struct { 14262306a36Sopenharmony_ci u64 done_interrupt:1; 14362306a36Sopenharmony_ci u64 busy_interrupt:1; 14462306a36Sopenharmony_ci u64 rsvd:62; 14562306a36Sopenharmony_ci } part; 14662306a36Sopenharmony_ci u64 full; 14762306a36Sopenharmony_ci}; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci/** 15062306a36Sopenharmony_ci * struct sst_block - This structure is used to block a user/fw data call to another 15162306a36Sopenharmony_ci * fw/user call 15262306a36Sopenharmony_ci * 15362306a36Sopenharmony_ci * @condition: condition for blocking check 15462306a36Sopenharmony_ci * @ret_code: ret code when block is released 15562306a36Sopenharmony_ci * @data: data ptr 15662306a36Sopenharmony_ci * @size: size of data 15762306a36Sopenharmony_ci * @on: block condition 15862306a36Sopenharmony_ci * @msg_id: msg_id = msgid in mfld/ctp, mrfld = NULL 15962306a36Sopenharmony_ci * @drv_id: str_id in mfld/ctp, = drv_id in mrfld 16062306a36Sopenharmony_ci * @node: list head node 16162306a36Sopenharmony_ci */ 16262306a36Sopenharmony_cistruct sst_block { 16362306a36Sopenharmony_ci bool condition; 16462306a36Sopenharmony_ci int ret_code; 16562306a36Sopenharmony_ci void *data; 16662306a36Sopenharmony_ci u32 size; 16762306a36Sopenharmony_ci bool on; 16862306a36Sopenharmony_ci u32 msg_id; 16962306a36Sopenharmony_ci u32 drv_id; 17062306a36Sopenharmony_ci struct list_head node; 17162306a36Sopenharmony_ci}; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci/** 17462306a36Sopenharmony_ci * struct stream_info - structure that holds the stream information 17562306a36Sopenharmony_ci * 17662306a36Sopenharmony_ci * @status : stream current state 17762306a36Sopenharmony_ci * @prev : stream prev state 17862306a36Sopenharmony_ci * @resume_status : stream current state to restore on resume 17962306a36Sopenharmony_ci * @resume_prev : stream prev state to restore on resume 18062306a36Sopenharmony_ci * @lock : stream mutex for protecting state 18162306a36Sopenharmony_ci * @alloc_param : parameters used for stream (re-)allocation 18262306a36Sopenharmony_ci * @pcm_substream : PCM substream 18362306a36Sopenharmony_ci * @period_elapsed : PCM period elapsed callback 18462306a36Sopenharmony_ci * @sfreq : stream sampling freq 18562306a36Sopenharmony_ci * @cumm_bytes : cummulative bytes decoded 18662306a36Sopenharmony_ci */ 18762306a36Sopenharmony_cistruct stream_info { 18862306a36Sopenharmony_ci unsigned int status; 18962306a36Sopenharmony_ci unsigned int prev; 19062306a36Sopenharmony_ci unsigned int resume_status; 19162306a36Sopenharmony_ci unsigned int resume_prev; 19262306a36Sopenharmony_ci struct mutex lock; 19362306a36Sopenharmony_ci struct snd_sst_alloc_mrfld alloc_param; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci void *pcm_substream; 19662306a36Sopenharmony_ci void (*period_elapsed)(void *pcm_substream); 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci unsigned int sfreq; 19962306a36Sopenharmony_ci u32 cumm_bytes; 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci void *compr_cb_param; 20262306a36Sopenharmony_ci void (*compr_cb)(void *compr_cb_param); 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci void *drain_cb_param; 20562306a36Sopenharmony_ci void (*drain_notify)(void *drain_cb_param); 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci unsigned int num_ch; 20862306a36Sopenharmony_ci unsigned int pipe_id; 20962306a36Sopenharmony_ci unsigned int task_id; 21062306a36Sopenharmony_ci}; 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci#define SST_FW_SIGN "$SST" 21362306a36Sopenharmony_ci#define SST_FW_LIB_SIGN "$LIB" 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci/** 21662306a36Sopenharmony_ci * struct sst_fw_header - FW file headers 21762306a36Sopenharmony_ci * 21862306a36Sopenharmony_ci * @signature : FW signature 21962306a36Sopenharmony_ci * @file_size: size of fw image 22062306a36Sopenharmony_ci * @modules : # of modules 22162306a36Sopenharmony_ci * @file_format : version of header format 22262306a36Sopenharmony_ci * @reserved : reserved fields 22362306a36Sopenharmony_ci */ 22462306a36Sopenharmony_cistruct sst_fw_header { 22562306a36Sopenharmony_ci unsigned char signature[FW_SIGNATURE_SIZE]; 22662306a36Sopenharmony_ci u32 file_size; 22762306a36Sopenharmony_ci u32 modules; 22862306a36Sopenharmony_ci u32 file_format; 22962306a36Sopenharmony_ci u32 reserved[4]; 23062306a36Sopenharmony_ci}; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci/** 23362306a36Sopenharmony_ci * struct fw_module_header - module header in FW 23462306a36Sopenharmony_ci * 23562306a36Sopenharmony_ci * @signature: module signature 23662306a36Sopenharmony_ci * @mod_size: size of module 23762306a36Sopenharmony_ci * @blocks: block count 23862306a36Sopenharmony_ci * @type: block type 23962306a36Sopenharmony_ci * @entry_point: module netry point 24062306a36Sopenharmony_ci */ 24162306a36Sopenharmony_cistruct fw_module_header { 24262306a36Sopenharmony_ci unsigned char signature[FW_SIGNATURE_SIZE]; 24362306a36Sopenharmony_ci u32 mod_size; 24462306a36Sopenharmony_ci u32 blocks; 24562306a36Sopenharmony_ci u32 type; 24662306a36Sopenharmony_ci u32 entry_point; 24762306a36Sopenharmony_ci}; 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci/** 25062306a36Sopenharmony_ci * struct fw_block_info - block header for FW 25162306a36Sopenharmony_ci * 25262306a36Sopenharmony_ci * @type: block ram type I/D 25362306a36Sopenharmony_ci * @size: size of block 25462306a36Sopenharmony_ci * @ram_offset: offset in ram 25562306a36Sopenharmony_ci */ 25662306a36Sopenharmony_cistruct fw_block_info { 25762306a36Sopenharmony_ci enum sst_ram_type type; 25862306a36Sopenharmony_ci u32 size; 25962306a36Sopenharmony_ci u32 ram_offset; 26062306a36Sopenharmony_ci u32 rsvd; 26162306a36Sopenharmony_ci}; 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_cistruct sst_runtime_param { 26462306a36Sopenharmony_ci struct snd_sst_runtime_params param; 26562306a36Sopenharmony_ci}; 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cistruct sst_sg_list { 26862306a36Sopenharmony_ci struct scatterlist *src; 26962306a36Sopenharmony_ci struct scatterlist *dst; 27062306a36Sopenharmony_ci int list_len; 27162306a36Sopenharmony_ci unsigned int sg_idx; 27262306a36Sopenharmony_ci}; 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistruct sst_memcpy_list { 27562306a36Sopenharmony_ci struct list_head memcpylist; 27662306a36Sopenharmony_ci void *dstn; 27762306a36Sopenharmony_ci const void *src; 27862306a36Sopenharmony_ci u32 size; 27962306a36Sopenharmony_ci bool is_io; 28062306a36Sopenharmony_ci}; 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci/*Firmware Module Information*/ 28362306a36Sopenharmony_cienum sst_lib_dwnld_status { 28462306a36Sopenharmony_ci SST_LIB_NOT_FOUND = 0, 28562306a36Sopenharmony_ci SST_LIB_FOUND, 28662306a36Sopenharmony_ci SST_LIB_DOWNLOADED, 28762306a36Sopenharmony_ci}; 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_cistruct sst_module_info { 29062306a36Sopenharmony_ci const char *name; /*Library name*/ 29162306a36Sopenharmony_ci u32 id; /*Module ID*/ 29262306a36Sopenharmony_ci u32 entry_pt; /*Module entry point*/ 29362306a36Sopenharmony_ci u8 status; /*module status*/ 29462306a36Sopenharmony_ci u8 rsvd1; 29562306a36Sopenharmony_ci u16 rsvd2; 29662306a36Sopenharmony_ci}; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci/* 29962306a36Sopenharmony_ci * Structure for managing the Library Region(1.5MB) 30062306a36Sopenharmony_ci * in DDR in Merrifield 30162306a36Sopenharmony_ci */ 30262306a36Sopenharmony_cistruct sst_mem_mgr { 30362306a36Sopenharmony_ci phys_addr_t current_base; 30462306a36Sopenharmony_ci int avail; 30562306a36Sopenharmony_ci unsigned int count; 30662306a36Sopenharmony_ci}; 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_cistruct sst_ipc_reg { 30962306a36Sopenharmony_ci int ipcx; 31062306a36Sopenharmony_ci int ipcd; 31162306a36Sopenharmony_ci}; 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_cistruct sst_fw_save { 31462306a36Sopenharmony_ci void *iram; /* allocated via kvmalloc() */ 31562306a36Sopenharmony_ci void *dram; /* allocated via kvmalloc() */ 31662306a36Sopenharmony_ci void *sram; /* allocated via kvmalloc() */ 31762306a36Sopenharmony_ci void *ddr; /* allocated via kvmalloc() */ 31862306a36Sopenharmony_ci}; 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci/** 32162306a36Sopenharmony_ci * struct intel_sst_drv - driver ops 32262306a36Sopenharmony_ci * 32362306a36Sopenharmony_ci * @sst_state : current sst device state 32462306a36Sopenharmony_ci * @dev_id : device identifier, pci_id for pci devices and acpi_id for acpi 32562306a36Sopenharmony_ci * devices 32662306a36Sopenharmony_ci * @shim : SST shim pointer 32762306a36Sopenharmony_ci * @mailbox : SST mailbox pointer 32862306a36Sopenharmony_ci * @iram : SST IRAM pointer 32962306a36Sopenharmony_ci * @dram : SST DRAM pointer 33062306a36Sopenharmony_ci * @pdata : SST info passed as a part of pci platform data 33162306a36Sopenharmony_ci * @shim_phy_add : SST shim phy addr 33262306a36Sopenharmony_ci * @ipc_dispatch_list : ipc messages dispatched 33362306a36Sopenharmony_ci * @rx_list : to copy the process_reply/process_msg from DSP 33462306a36Sopenharmony_ci * @ipc_post_msg_wq : wq to post IPC messages context 33562306a36Sopenharmony_ci * @mad_ops : MAD driver operations registered 33662306a36Sopenharmony_ci * @mad_wq : MAD driver wq 33762306a36Sopenharmony_ci * @post_msg_wq : wq to post IPC messages 33862306a36Sopenharmony_ci * @streams : sst stream contexts 33962306a36Sopenharmony_ci * @list_lock : sst driver list lock (deprecated) 34062306a36Sopenharmony_ci * @ipc_spin_lock : spin lock to handle audio shim access and ipc queue 34162306a36Sopenharmony_ci * @block_lock : spin lock to add block to block_list and assign pvt_id 34262306a36Sopenharmony_ci * @rx_msg_lock : spin lock to handle the rx messages from the DSP 34362306a36Sopenharmony_ci * @scard_ops : sst card ops 34462306a36Sopenharmony_ci * @pci : sst pci device struture 34562306a36Sopenharmony_ci * @dev : pointer to current device struct 34662306a36Sopenharmony_ci * @sst_lock : sst device lock 34762306a36Sopenharmony_ci * @pvt_id : sst private id 34862306a36Sopenharmony_ci * @stream_cnt : total sst active stream count 34962306a36Sopenharmony_ci * @pb_streams : total active pb streams 35062306a36Sopenharmony_ci * @cp_streams : total active cp streams 35162306a36Sopenharmony_ci * @audio_start : audio status 35262306a36Sopenharmony_ci * @qos : PM Qos struct 35362306a36Sopenharmony_ci * firmware_name : Firmware / Library name 35462306a36Sopenharmony_ci */ 35562306a36Sopenharmony_cistruct intel_sst_drv { 35662306a36Sopenharmony_ci int sst_state; 35762306a36Sopenharmony_ci int irq_num; 35862306a36Sopenharmony_ci unsigned short dev_id; 35962306a36Sopenharmony_ci void __iomem *ddr; 36062306a36Sopenharmony_ci void __iomem *shim; 36162306a36Sopenharmony_ci void __iomem *mailbox; 36262306a36Sopenharmony_ci void __iomem *iram; 36362306a36Sopenharmony_ci void __iomem *dram; 36462306a36Sopenharmony_ci unsigned int mailbox_add; 36562306a36Sopenharmony_ci unsigned int iram_base; 36662306a36Sopenharmony_ci unsigned int dram_base; 36762306a36Sopenharmony_ci unsigned int shim_phy_add; 36862306a36Sopenharmony_ci unsigned int iram_end; 36962306a36Sopenharmony_ci unsigned int dram_end; 37062306a36Sopenharmony_ci unsigned int ddr_end; 37162306a36Sopenharmony_ci unsigned int ddr_base; 37262306a36Sopenharmony_ci unsigned int mailbox_recv_offset; 37362306a36Sopenharmony_ci struct list_head block_list; 37462306a36Sopenharmony_ci struct list_head ipc_dispatch_list; 37562306a36Sopenharmony_ci struct sst_platform_info *pdata; 37662306a36Sopenharmony_ci struct list_head rx_list; 37762306a36Sopenharmony_ci struct work_struct ipc_post_msg_wq; 37862306a36Sopenharmony_ci wait_queue_head_t wait_queue; 37962306a36Sopenharmony_ci struct workqueue_struct *post_msg_wq; 38062306a36Sopenharmony_ci unsigned int tstamp; 38162306a36Sopenharmony_ci /* str_id 0 is not used */ 38262306a36Sopenharmony_ci struct stream_info streams[MAX_NUM_STREAMS+1]; 38362306a36Sopenharmony_ci spinlock_t ipc_spin_lock; 38462306a36Sopenharmony_ci spinlock_t block_lock; 38562306a36Sopenharmony_ci spinlock_t rx_msg_lock; 38662306a36Sopenharmony_ci struct pci_dev *pci; 38762306a36Sopenharmony_ci struct device *dev; 38862306a36Sopenharmony_ci volatile long unsigned pvt_id; 38962306a36Sopenharmony_ci struct mutex sst_lock; 39062306a36Sopenharmony_ci unsigned int stream_cnt; 39162306a36Sopenharmony_ci unsigned int csr_value; 39262306a36Sopenharmony_ci void *fw_in_mem; 39362306a36Sopenharmony_ci struct sst_sg_list fw_sg_list, library_list; 39462306a36Sopenharmony_ci struct intel_sst_ops *ops; 39562306a36Sopenharmony_ci struct sst_info info; 39662306a36Sopenharmony_ci struct pm_qos_request *qos; 39762306a36Sopenharmony_ci unsigned int use_dma; 39862306a36Sopenharmony_ci unsigned int use_lli; 39962306a36Sopenharmony_ci atomic_t fw_clear_context; 40062306a36Sopenharmony_ci bool lib_dwnld_reqd; 40162306a36Sopenharmony_ci struct list_head memcpy_list; 40262306a36Sopenharmony_ci struct sst_ipc_reg ipc_reg; 40362306a36Sopenharmony_ci struct sst_mem_mgr lib_mem_mgr; 40462306a36Sopenharmony_ci /* 40562306a36Sopenharmony_ci * Holder for firmware name. Due to async call it needs to be 40662306a36Sopenharmony_ci * persistent till worker thread gets called 40762306a36Sopenharmony_ci */ 40862306a36Sopenharmony_ci char firmware_name[FW_NAME_SIZE]; 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci struct snd_sst_fw_version fw_version; 41162306a36Sopenharmony_ci struct sst_fw_save *fw_save; 41262306a36Sopenharmony_ci}; 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci/* misc definitions */ 41562306a36Sopenharmony_ci#define FW_DWNL_ID 0x01 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_cistruct intel_sst_ops { 41862306a36Sopenharmony_ci irqreturn_t (*interrupt)(int, void *); 41962306a36Sopenharmony_ci irqreturn_t (*irq_thread)(int, void *); 42062306a36Sopenharmony_ci void (*clear_interrupt)(struct intel_sst_drv *ctx); 42162306a36Sopenharmony_ci int (*start)(struct intel_sst_drv *ctx); 42262306a36Sopenharmony_ci int (*reset)(struct intel_sst_drv *ctx); 42362306a36Sopenharmony_ci void (*process_reply)(struct intel_sst_drv *ctx, struct ipc_post *msg); 42462306a36Sopenharmony_ci int (*post_message)(struct intel_sst_drv *ctx, 42562306a36Sopenharmony_ci struct ipc_post *msg, bool sync); 42662306a36Sopenharmony_ci void (*process_message)(struct ipc_post *msg); 42762306a36Sopenharmony_ci void (*set_bypass)(bool set); 42862306a36Sopenharmony_ci int (*save_dsp_context)(struct intel_sst_drv *sst); 42962306a36Sopenharmony_ci void (*restore_dsp_context)(void); 43062306a36Sopenharmony_ci int (*alloc_stream)(struct intel_sst_drv *ctx, void *params); 43162306a36Sopenharmony_ci void (*post_download)(struct intel_sst_drv *sst); 43262306a36Sopenharmony_ci}; 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ciint sst_realloc_stream(struct intel_sst_drv *sst_drv_ctx, int str_id); 43562306a36Sopenharmony_ciint sst_pause_stream(struct intel_sst_drv *sst_drv_ctx, int str_id); 43662306a36Sopenharmony_ciint sst_resume_stream(struct intel_sst_drv *sst_drv_ctx, int str_id); 43762306a36Sopenharmony_ciint sst_drop_stream(struct intel_sst_drv *sst_drv_ctx, int str_id); 43862306a36Sopenharmony_ciint sst_free_stream(struct intel_sst_drv *sst_drv_ctx, int str_id); 43962306a36Sopenharmony_ciint sst_start_stream(struct intel_sst_drv *sst_drv_ctx, int str_id); 44062306a36Sopenharmony_ciint sst_send_byte_stream_mrfld(struct intel_sst_drv *sst_drv_ctx, 44162306a36Sopenharmony_ci struct snd_sst_bytes_v2 *bytes); 44262306a36Sopenharmony_ciint sst_set_stream_param(int str_id, struct snd_sst_params *str_param); 44362306a36Sopenharmony_ciint sst_set_metadata(int str_id, char *params); 44462306a36Sopenharmony_ciint sst_get_stream(struct intel_sst_drv *ctx, 44562306a36Sopenharmony_ci struct snd_sst_params *str_param); 44662306a36Sopenharmony_ciint sst_get_stream_allocated(struct intel_sst_drv *ctx, 44762306a36Sopenharmony_ci struct snd_sst_params *str_param, 44862306a36Sopenharmony_ci struct snd_sst_lib_download **lib_dnld); 44962306a36Sopenharmony_ciint sst_drain_stream(struct intel_sst_drv *sst_drv_ctx, 45062306a36Sopenharmony_ci int str_id, bool partial_drain); 45162306a36Sopenharmony_ciint sst_post_message_mrfld(struct intel_sst_drv *sst_drv_ctx, 45262306a36Sopenharmony_ci struct ipc_post *ipc_msg, bool sync); 45362306a36Sopenharmony_civoid sst_process_reply_mrfld(struct intel_sst_drv *sst_drv_ctx, struct ipc_post *msg); 45462306a36Sopenharmony_ciint sst_start_mrfld(struct intel_sst_drv *sst_drv_ctx); 45562306a36Sopenharmony_ciint intel_sst_reset_dsp_mrfld(struct intel_sst_drv *sst_drv_ctx); 45662306a36Sopenharmony_civoid intel_sst_clear_intr_mrfld(struct intel_sst_drv *sst_drv_ctx); 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ciint sst_load_fw(struct intel_sst_drv *sst_drv_ctx); 45962306a36Sopenharmony_ciint sst_load_library(struct snd_sst_lib_download *lib, u8 ops); 46062306a36Sopenharmony_civoid sst_post_download_mrfld(struct intel_sst_drv *ctx); 46162306a36Sopenharmony_ciint sst_get_block_stream(struct intel_sst_drv *sst_drv_ctx); 46262306a36Sopenharmony_civoid sst_memcpy_free_resources(struct intel_sst_drv *sst_drv_ctx); 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ciint sst_wait_interruptible(struct intel_sst_drv *sst_drv_ctx, 46562306a36Sopenharmony_ci struct sst_block *block); 46662306a36Sopenharmony_ciint sst_wait_timeout(struct intel_sst_drv *sst_drv_ctx, 46762306a36Sopenharmony_ci struct sst_block *block); 46862306a36Sopenharmony_ciint sst_create_ipc_msg(struct ipc_post **arg, bool large); 46962306a36Sopenharmony_ciint free_stream_context(struct intel_sst_drv *ctx, unsigned int str_id); 47062306a36Sopenharmony_civoid sst_clean_stream(struct stream_info *stream); 47162306a36Sopenharmony_ciint intel_sst_register_compress(struct intel_sst_drv *sst); 47262306a36Sopenharmony_ciint intel_sst_remove_compress(struct intel_sst_drv *sst); 47362306a36Sopenharmony_civoid sst_cdev_fragment_elapsed(struct intel_sst_drv *ctx, int str_id); 47462306a36Sopenharmony_ciint sst_send_sync_msg(int ipc, int str_id); 47562306a36Sopenharmony_ciint sst_get_num_channel(struct snd_sst_params *str_param); 47662306a36Sopenharmony_ciint sst_get_sfreq(struct snd_sst_params *str_param); 47762306a36Sopenharmony_ciint sst_alloc_stream_mrfld(struct intel_sst_drv *sst_drv_ctx, void *params); 47862306a36Sopenharmony_civoid sst_restore_fw_context(void); 47962306a36Sopenharmony_cistruct sst_block *sst_create_block(struct intel_sst_drv *ctx, 48062306a36Sopenharmony_ci u32 msg_id, u32 drv_id); 48162306a36Sopenharmony_ciint sst_create_block_and_ipc_msg(struct ipc_post **arg, bool large, 48262306a36Sopenharmony_ci struct intel_sst_drv *sst_drv_ctx, struct sst_block **block, 48362306a36Sopenharmony_ci u32 msg_id, u32 drv_id); 48462306a36Sopenharmony_ciint sst_free_block(struct intel_sst_drv *ctx, struct sst_block *freed); 48562306a36Sopenharmony_ciint sst_wake_up_block(struct intel_sst_drv *ctx, int result, 48662306a36Sopenharmony_ci u32 drv_id, u32 ipc, void *data, u32 size); 48762306a36Sopenharmony_ciint sst_request_firmware_async(struct intel_sst_drv *ctx); 48862306a36Sopenharmony_ciint sst_driver_ops(struct intel_sst_drv *sst); 48962306a36Sopenharmony_cistruct sst_platform_info *sst_get_acpi_driver_data(const char *hid); 49062306a36Sopenharmony_civoid sst_firmware_load_cb(const struct firmware *fw, void *context); 49162306a36Sopenharmony_ciint sst_prepare_and_post_msg(struct intel_sst_drv *sst, 49262306a36Sopenharmony_ci int task_id, int ipc_msg, int cmd_id, int pipe_id, 49362306a36Sopenharmony_ci size_t mbox_data_len, const void *mbox_data, void **data, 49462306a36Sopenharmony_ci bool large, bool fill_dsp, bool sync, bool response); 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_civoid sst_process_pending_msg(struct work_struct *work); 49762306a36Sopenharmony_ciint sst_assign_pvt_id(struct intel_sst_drv *drv); 49862306a36Sopenharmony_ciint sst_validate_strid(struct intel_sst_drv *sst_drv_ctx, int str_id); 49962306a36Sopenharmony_cistruct stream_info *get_stream_info(struct intel_sst_drv *sst_drv_ctx, 50062306a36Sopenharmony_ci int str_id); 50162306a36Sopenharmony_ciint get_stream_id_mrfld(struct intel_sst_drv *sst_drv_ctx, 50262306a36Sopenharmony_ci u32 pipe_id); 50362306a36Sopenharmony_ciu32 relocate_imr_addr_mrfld(u32 base_addr); 50462306a36Sopenharmony_civoid sst_add_to_dispatch_list_and_post(struct intel_sst_drv *sst, 50562306a36Sopenharmony_ci struct ipc_post *msg); 50662306a36Sopenharmony_ciint sst_pm_runtime_put(struct intel_sst_drv *sst_drv); 50762306a36Sopenharmony_ciint sst_shim_write(void __iomem *addr, int offset, int value); 50862306a36Sopenharmony_ciu32 sst_shim_read(void __iomem *addr, int offset); 50962306a36Sopenharmony_ciu64 sst_reg_read64(void __iomem *addr, int offset); 51062306a36Sopenharmony_ciint sst_shim_write64(void __iomem *addr, int offset, u64 value); 51162306a36Sopenharmony_ciu64 sst_shim_read64(void __iomem *addr, int offset); 51262306a36Sopenharmony_civoid sst_set_fw_state_locked( 51362306a36Sopenharmony_ci struct intel_sst_drv *sst_drv_ctx, int sst_state); 51462306a36Sopenharmony_civoid sst_fill_header_mrfld(union ipc_header_mrfld *header, 51562306a36Sopenharmony_ci int msg, int task_id, int large, int drv_id); 51662306a36Sopenharmony_civoid sst_fill_header_dsp(struct ipc_dsp_hdr *dsp, int msg, 51762306a36Sopenharmony_ci int pipe_id, int len); 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ciint sst_register(struct device *); 52062306a36Sopenharmony_ciint sst_unregister(struct device *); 52162306a36Sopenharmony_ci 52262306a36Sopenharmony_ciint sst_alloc_drv_context(struct intel_sst_drv **ctx, 52362306a36Sopenharmony_ci struct device *dev, unsigned short dev_id); 52462306a36Sopenharmony_ciint sst_context_init(struct intel_sst_drv *ctx); 52562306a36Sopenharmony_civoid sst_context_cleanup(struct intel_sst_drv *ctx); 52662306a36Sopenharmony_civoid sst_configure_runtime_pm(struct intel_sst_drv *ctx); 52762306a36Sopenharmony_civoid memcpy32_toio(void __iomem *dst, const void *src, int count); 52862306a36Sopenharmony_civoid memcpy32_fromio(void *dst, const void __iomem *src, int count); 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_ci#endif 531