18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * sst.h - Intel SST Driver for audio engine 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2008-14 Intel Corporation 68c2ecf20Sopenharmony_ci * Authors: Vinod Koul <vinod.koul@intel.com> 78c2ecf20Sopenharmony_ci * Harsha Priya <priya.harsha@intel.com> 88c2ecf20Sopenharmony_ci * Dharageswari R <dharageswari.r@intel.com> 98c2ecf20Sopenharmony_ci * KP Jeeja <jeeja.kp@intel.com> 108c2ecf20Sopenharmony_ci * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 118c2ecf20Sopenharmony_ci * 128c2ecf20Sopenharmony_ci * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 138c2ecf20Sopenharmony_ci * 148c2ecf20Sopenharmony_ci * Common private declarations for SST 158c2ecf20Sopenharmony_ci */ 168c2ecf20Sopenharmony_ci#ifndef __SST_H__ 178c2ecf20Sopenharmony_ci#define __SST_H__ 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include <linux/firmware.h> 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci/* driver names */ 228c2ecf20Sopenharmony_ci#define SST_DRV_NAME "intel_sst_driver" 238c2ecf20Sopenharmony_ci#define SST_MRFLD_PCI_ID 0x119A 248c2ecf20Sopenharmony_ci#define SST_BYT_ACPI_ID 0x80860F28 258c2ecf20Sopenharmony_ci#define SST_CHV_ACPI_ID 0x808622A8 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#define SST_SUSPEND_DELAY 2000 288c2ecf20Sopenharmony_ci#define FW_CONTEXT_MEM (64*1024) 298c2ecf20Sopenharmony_ci#define SST_ICCM_BOUNDARY 4 308c2ecf20Sopenharmony_ci#define SST_CONFIG_SSP_SIGN 0x7ffe8001 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci#define MRFLD_FW_VIRTUAL_BASE 0xC0000000 338c2ecf20Sopenharmony_ci#define MRFLD_FW_DDR_BASE_OFFSET 0x0 348c2ecf20Sopenharmony_ci#define MRFLD_FW_FEATURE_BASE_OFFSET 0x4 358c2ecf20Sopenharmony_ci#define MRFLD_FW_BSS_RESET_BIT 0 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci/* SST Shim register map */ 388c2ecf20Sopenharmony_ci#define SST_CSR 0x00 398c2ecf20Sopenharmony_ci#define SST_ISRX 0x18 408c2ecf20Sopenharmony_ci#define SST_IMRX 0x28 418c2ecf20Sopenharmony_ci#define SST_IPCX 0x38 /* IPC IA -> SST */ 428c2ecf20Sopenharmony_ci#define SST_IPCD 0x40 /* IPC SST -> IA */ 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ciextern const struct dev_pm_ops intel_sst_pm; 458c2ecf20Sopenharmony_cienum sst_states { 468c2ecf20Sopenharmony_ci SST_FW_LOADING = 1, 478c2ecf20Sopenharmony_ci SST_FW_RUNNING, 488c2ecf20Sopenharmony_ci SST_RESET, 498c2ecf20Sopenharmony_ci SST_SHUTDOWN, 508c2ecf20Sopenharmony_ci}; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cienum sst_algo_ops { 538c2ecf20Sopenharmony_ci SST_SET_ALGO = 0, 548c2ecf20Sopenharmony_ci SST_GET_ALGO = 1, 558c2ecf20Sopenharmony_ci}; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci#define SST_BLOCK_TIMEOUT 1000 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci#define FW_SIGNATURE_SIZE 4 608c2ecf20Sopenharmony_ci#define FW_NAME_SIZE 32 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci/* stream states */ 638c2ecf20Sopenharmony_cienum sst_stream_states { 648c2ecf20Sopenharmony_ci STREAM_UN_INIT = 0, /* Freed/Not used stream */ 658c2ecf20Sopenharmony_ci STREAM_RUNNING = 1, /* Running */ 668c2ecf20Sopenharmony_ci STREAM_PAUSED = 2, /* Paused stream */ 678c2ecf20Sopenharmony_ci STREAM_INIT = 3, /* stream init, waiting for data */ 688c2ecf20Sopenharmony_ci}; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_cienum sst_ram_type { 718c2ecf20Sopenharmony_ci SST_IRAM = 1, 728c2ecf20Sopenharmony_ci SST_DRAM = 2, 738c2ecf20Sopenharmony_ci SST_DDR = 5, 748c2ecf20Sopenharmony_ci SST_CUSTOM_INFO = 7, /* consists of FW binary information */ 758c2ecf20Sopenharmony_ci}; 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci/* SST shim registers to structure mapping */ 788c2ecf20Sopenharmony_ciunion interrupt_reg { 798c2ecf20Sopenharmony_ci struct { 808c2ecf20Sopenharmony_ci u64 done_interrupt:1; 818c2ecf20Sopenharmony_ci u64 busy_interrupt:1; 828c2ecf20Sopenharmony_ci u64 rsvd:62; 838c2ecf20Sopenharmony_ci } part; 848c2ecf20Sopenharmony_ci u64 full; 858c2ecf20Sopenharmony_ci}; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ciunion sst_pisr_reg { 888c2ecf20Sopenharmony_ci struct { 898c2ecf20Sopenharmony_ci u32 pssp0:1; 908c2ecf20Sopenharmony_ci u32 pssp1:1; 918c2ecf20Sopenharmony_ci u32 rsvd0:3; 928c2ecf20Sopenharmony_ci u32 dmac:1; 938c2ecf20Sopenharmony_ci u32 rsvd1:26; 948c2ecf20Sopenharmony_ci } part; 958c2ecf20Sopenharmony_ci u32 full; 968c2ecf20Sopenharmony_ci}; 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ciunion sst_pimr_reg { 998c2ecf20Sopenharmony_ci struct { 1008c2ecf20Sopenharmony_ci u32 ssp0:1; 1018c2ecf20Sopenharmony_ci u32 ssp1:1; 1028c2ecf20Sopenharmony_ci u32 rsvd0:3; 1038c2ecf20Sopenharmony_ci u32 dmac:1; 1048c2ecf20Sopenharmony_ci u32 rsvd1:10; 1058c2ecf20Sopenharmony_ci u32 ssp0_sc:1; 1068c2ecf20Sopenharmony_ci u32 ssp1_sc:1; 1078c2ecf20Sopenharmony_ci u32 rsvd2:3; 1088c2ecf20Sopenharmony_ci u32 dmac_sc:1; 1098c2ecf20Sopenharmony_ci u32 rsvd3:10; 1108c2ecf20Sopenharmony_ci } part; 1118c2ecf20Sopenharmony_ci u32 full; 1128c2ecf20Sopenharmony_ci}; 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ciunion config_status_reg_mrfld { 1158c2ecf20Sopenharmony_ci struct { 1168c2ecf20Sopenharmony_ci u64 lpe_reset:1; 1178c2ecf20Sopenharmony_ci u64 lpe_reset_vector:1; 1188c2ecf20Sopenharmony_ci u64 runstall:1; 1198c2ecf20Sopenharmony_ci u64 pwaitmode:1; 1208c2ecf20Sopenharmony_ci u64 clk_sel:3; 1218c2ecf20Sopenharmony_ci u64 rsvd2:1; 1228c2ecf20Sopenharmony_ci u64 sst_clk:3; 1238c2ecf20Sopenharmony_ci u64 xt_snoop:1; 1248c2ecf20Sopenharmony_ci u64 rsvd3:4; 1258c2ecf20Sopenharmony_ci u64 clk_sel1:6; 1268c2ecf20Sopenharmony_ci u64 clk_enable:3; 1278c2ecf20Sopenharmony_ci u64 rsvd4:6; 1288c2ecf20Sopenharmony_ci u64 slim0baseclk:1; 1298c2ecf20Sopenharmony_ci u64 rsvd:32; 1308c2ecf20Sopenharmony_ci } part; 1318c2ecf20Sopenharmony_ci u64 full; 1328c2ecf20Sopenharmony_ci}; 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ciunion interrupt_reg_mrfld { 1358c2ecf20Sopenharmony_ci struct { 1368c2ecf20Sopenharmony_ci u64 done_interrupt:1; 1378c2ecf20Sopenharmony_ci u64 busy_interrupt:1; 1388c2ecf20Sopenharmony_ci u64 rsvd:62; 1398c2ecf20Sopenharmony_ci } part; 1408c2ecf20Sopenharmony_ci u64 full; 1418c2ecf20Sopenharmony_ci}; 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ciunion sst_imr_reg_mrfld { 1448c2ecf20Sopenharmony_ci struct { 1458c2ecf20Sopenharmony_ci u64 done_interrupt:1; 1468c2ecf20Sopenharmony_ci u64 busy_interrupt:1; 1478c2ecf20Sopenharmony_ci u64 rsvd:62; 1488c2ecf20Sopenharmony_ci } part; 1498c2ecf20Sopenharmony_ci u64 full; 1508c2ecf20Sopenharmony_ci}; 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci/** 1538c2ecf20Sopenharmony_ci * struct sst_block - This structure is used to block a user/fw data call to another 1548c2ecf20Sopenharmony_ci * fw/user call 1558c2ecf20Sopenharmony_ci * 1568c2ecf20Sopenharmony_ci * @condition: condition for blocking check 1578c2ecf20Sopenharmony_ci * @ret_code: ret code when block is released 1588c2ecf20Sopenharmony_ci * @data: data ptr 1598c2ecf20Sopenharmony_ci * @size: size of data 1608c2ecf20Sopenharmony_ci * @on: block condition 1618c2ecf20Sopenharmony_ci * @msg_id: msg_id = msgid in mfld/ctp, mrfld = NULL 1628c2ecf20Sopenharmony_ci * @drv_id: str_id in mfld/ctp, = drv_id in mrfld 1638c2ecf20Sopenharmony_ci * @node: list head node 1648c2ecf20Sopenharmony_ci */ 1658c2ecf20Sopenharmony_cistruct sst_block { 1668c2ecf20Sopenharmony_ci bool condition; 1678c2ecf20Sopenharmony_ci int ret_code; 1688c2ecf20Sopenharmony_ci void *data; 1698c2ecf20Sopenharmony_ci u32 size; 1708c2ecf20Sopenharmony_ci bool on; 1718c2ecf20Sopenharmony_ci u32 msg_id; 1728c2ecf20Sopenharmony_ci u32 drv_id; 1738c2ecf20Sopenharmony_ci struct list_head node; 1748c2ecf20Sopenharmony_ci}; 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci/** 1778c2ecf20Sopenharmony_ci * struct stream_info - structure that holds the stream information 1788c2ecf20Sopenharmony_ci * 1798c2ecf20Sopenharmony_ci * @status : stream current state 1808c2ecf20Sopenharmony_ci * @prev : stream prev state 1818c2ecf20Sopenharmony_ci * @resume_status : stream current state to restore on resume 1828c2ecf20Sopenharmony_ci * @resume_prev : stream prev state to restore on resume 1838c2ecf20Sopenharmony_ci * @lock : stream mutex for protecting state 1848c2ecf20Sopenharmony_ci * @alloc_param : parameters used for stream (re-)allocation 1858c2ecf20Sopenharmony_ci * @pcm_substream : PCM substream 1868c2ecf20Sopenharmony_ci * @period_elapsed : PCM period elapsed callback 1878c2ecf20Sopenharmony_ci * @sfreq : stream sampling freq 1888c2ecf20Sopenharmony_ci * @cumm_bytes : cummulative bytes decoded 1898c2ecf20Sopenharmony_ci */ 1908c2ecf20Sopenharmony_cistruct stream_info { 1918c2ecf20Sopenharmony_ci unsigned int status; 1928c2ecf20Sopenharmony_ci unsigned int prev; 1938c2ecf20Sopenharmony_ci unsigned int resume_status; 1948c2ecf20Sopenharmony_ci unsigned int resume_prev; 1958c2ecf20Sopenharmony_ci struct mutex lock; 1968c2ecf20Sopenharmony_ci struct snd_sst_alloc_mrfld alloc_param; 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ci void *pcm_substream; 1998c2ecf20Sopenharmony_ci void (*period_elapsed)(void *pcm_substream); 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ci unsigned int sfreq; 2028c2ecf20Sopenharmony_ci u32 cumm_bytes; 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci void *compr_cb_param; 2058c2ecf20Sopenharmony_ci void (*compr_cb)(void *compr_cb_param); 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci void *drain_cb_param; 2088c2ecf20Sopenharmony_ci void (*drain_notify)(void *drain_cb_param); 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci unsigned int num_ch; 2118c2ecf20Sopenharmony_ci unsigned int pipe_id; 2128c2ecf20Sopenharmony_ci unsigned int task_id; 2138c2ecf20Sopenharmony_ci}; 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci#define SST_FW_SIGN "$SST" 2168c2ecf20Sopenharmony_ci#define SST_FW_LIB_SIGN "$LIB" 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci/** 2198c2ecf20Sopenharmony_ci * struct sst_fw_header - FW file headers 2208c2ecf20Sopenharmony_ci * 2218c2ecf20Sopenharmony_ci * @signature : FW signature 2228c2ecf20Sopenharmony_ci * @file_size: size of fw image 2238c2ecf20Sopenharmony_ci * @modules : # of modules 2248c2ecf20Sopenharmony_ci * @file_format : version of header format 2258c2ecf20Sopenharmony_ci * @reserved : reserved fields 2268c2ecf20Sopenharmony_ci */ 2278c2ecf20Sopenharmony_cistruct sst_fw_header { 2288c2ecf20Sopenharmony_ci unsigned char signature[FW_SIGNATURE_SIZE]; 2298c2ecf20Sopenharmony_ci u32 file_size; 2308c2ecf20Sopenharmony_ci u32 modules; 2318c2ecf20Sopenharmony_ci u32 file_format; 2328c2ecf20Sopenharmony_ci u32 reserved[4]; 2338c2ecf20Sopenharmony_ci}; 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci/** 2368c2ecf20Sopenharmony_ci * struct fw_module_header - module header in FW 2378c2ecf20Sopenharmony_ci * 2388c2ecf20Sopenharmony_ci * @signature: module signature 2398c2ecf20Sopenharmony_ci * @mod_size: size of module 2408c2ecf20Sopenharmony_ci * @blocks: block count 2418c2ecf20Sopenharmony_ci * @type: block type 2428c2ecf20Sopenharmony_ci * @entry_point: module netry point 2438c2ecf20Sopenharmony_ci */ 2448c2ecf20Sopenharmony_cistruct fw_module_header { 2458c2ecf20Sopenharmony_ci unsigned char signature[FW_SIGNATURE_SIZE]; 2468c2ecf20Sopenharmony_ci u32 mod_size; 2478c2ecf20Sopenharmony_ci u32 blocks; 2488c2ecf20Sopenharmony_ci u32 type; 2498c2ecf20Sopenharmony_ci u32 entry_point; 2508c2ecf20Sopenharmony_ci}; 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci/** 2538c2ecf20Sopenharmony_ci * struct fw_block_info - block header for FW 2548c2ecf20Sopenharmony_ci * 2558c2ecf20Sopenharmony_ci * @type: block ram type I/D 2568c2ecf20Sopenharmony_ci * @size: size of block 2578c2ecf20Sopenharmony_ci * @ram_offset: offset in ram 2588c2ecf20Sopenharmony_ci */ 2598c2ecf20Sopenharmony_cistruct fw_block_info { 2608c2ecf20Sopenharmony_ci enum sst_ram_type type; 2618c2ecf20Sopenharmony_ci u32 size; 2628c2ecf20Sopenharmony_ci u32 ram_offset; 2638c2ecf20Sopenharmony_ci u32 rsvd; 2648c2ecf20Sopenharmony_ci}; 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_cistruct sst_runtime_param { 2678c2ecf20Sopenharmony_ci struct snd_sst_runtime_params param; 2688c2ecf20Sopenharmony_ci}; 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_cistruct sst_sg_list { 2718c2ecf20Sopenharmony_ci struct scatterlist *src; 2728c2ecf20Sopenharmony_ci struct scatterlist *dst; 2738c2ecf20Sopenharmony_ci int list_len; 2748c2ecf20Sopenharmony_ci unsigned int sg_idx; 2758c2ecf20Sopenharmony_ci}; 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_cistruct sst_memcpy_list { 2788c2ecf20Sopenharmony_ci struct list_head memcpylist; 2798c2ecf20Sopenharmony_ci void *dstn; 2808c2ecf20Sopenharmony_ci const void *src; 2818c2ecf20Sopenharmony_ci u32 size; 2828c2ecf20Sopenharmony_ci bool is_io; 2838c2ecf20Sopenharmony_ci}; 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_ci/*Firmware Module Information*/ 2868c2ecf20Sopenharmony_cienum sst_lib_dwnld_status { 2878c2ecf20Sopenharmony_ci SST_LIB_NOT_FOUND = 0, 2888c2ecf20Sopenharmony_ci SST_LIB_FOUND, 2898c2ecf20Sopenharmony_ci SST_LIB_DOWNLOADED, 2908c2ecf20Sopenharmony_ci}; 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_cistruct sst_module_info { 2938c2ecf20Sopenharmony_ci const char *name; /*Library name*/ 2948c2ecf20Sopenharmony_ci u32 id; /*Module ID*/ 2958c2ecf20Sopenharmony_ci u32 entry_pt; /*Module entry point*/ 2968c2ecf20Sopenharmony_ci u8 status; /*module status*/ 2978c2ecf20Sopenharmony_ci u8 rsvd1; 2988c2ecf20Sopenharmony_ci u16 rsvd2; 2998c2ecf20Sopenharmony_ci}; 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_ci/* 3028c2ecf20Sopenharmony_ci * Structure for managing the Library Region(1.5MB) 3038c2ecf20Sopenharmony_ci * in DDR in Merrifield 3048c2ecf20Sopenharmony_ci */ 3058c2ecf20Sopenharmony_cistruct sst_mem_mgr { 3068c2ecf20Sopenharmony_ci phys_addr_t current_base; 3078c2ecf20Sopenharmony_ci int avail; 3088c2ecf20Sopenharmony_ci unsigned int count; 3098c2ecf20Sopenharmony_ci}; 3108c2ecf20Sopenharmony_ci 3118c2ecf20Sopenharmony_cistruct sst_ipc_reg { 3128c2ecf20Sopenharmony_ci int ipcx; 3138c2ecf20Sopenharmony_ci int ipcd; 3148c2ecf20Sopenharmony_ci}; 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_cistruct sst_fw_save { 3178c2ecf20Sopenharmony_ci void *iram; /* allocated via kvmalloc() */ 3188c2ecf20Sopenharmony_ci void *dram; /* allocated via kvmalloc() */ 3198c2ecf20Sopenharmony_ci void *sram; /* allocated via kvmalloc() */ 3208c2ecf20Sopenharmony_ci void *ddr; /* allocated via kvmalloc() */ 3218c2ecf20Sopenharmony_ci}; 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci/** 3248c2ecf20Sopenharmony_ci * struct intel_sst_drv - driver ops 3258c2ecf20Sopenharmony_ci * 3268c2ecf20Sopenharmony_ci * @sst_state : current sst device state 3278c2ecf20Sopenharmony_ci * @dev_id : device identifier, pci_id for pci devices and acpi_id for acpi 3288c2ecf20Sopenharmony_ci * devices 3298c2ecf20Sopenharmony_ci * @shim : SST shim pointer 3308c2ecf20Sopenharmony_ci * @mailbox : SST mailbox pointer 3318c2ecf20Sopenharmony_ci * @iram : SST IRAM pointer 3328c2ecf20Sopenharmony_ci * @dram : SST DRAM pointer 3338c2ecf20Sopenharmony_ci * @pdata : SST info passed as a part of pci platform data 3348c2ecf20Sopenharmony_ci * @shim_phy_add : SST shim phy addr 3358c2ecf20Sopenharmony_ci * @ipc_dispatch_list : ipc messages dispatched 3368c2ecf20Sopenharmony_ci * @rx_list : to copy the process_reply/process_msg from DSP 3378c2ecf20Sopenharmony_ci * @ipc_post_msg_wq : wq to post IPC messages context 3388c2ecf20Sopenharmony_ci * @mad_ops : MAD driver operations registered 3398c2ecf20Sopenharmony_ci * @mad_wq : MAD driver wq 3408c2ecf20Sopenharmony_ci * @post_msg_wq : wq to post IPC messages 3418c2ecf20Sopenharmony_ci * @streams : sst stream contexts 3428c2ecf20Sopenharmony_ci * @list_lock : sst driver list lock (deprecated) 3438c2ecf20Sopenharmony_ci * @ipc_spin_lock : spin lock to handle audio shim access and ipc queue 3448c2ecf20Sopenharmony_ci * @block_lock : spin lock to add block to block_list and assign pvt_id 3458c2ecf20Sopenharmony_ci * @rx_msg_lock : spin lock to handle the rx messages from the DSP 3468c2ecf20Sopenharmony_ci * @scard_ops : sst card ops 3478c2ecf20Sopenharmony_ci * @pci : sst pci device struture 3488c2ecf20Sopenharmony_ci * @dev : pointer to current device struct 3498c2ecf20Sopenharmony_ci * @sst_lock : sst device lock 3508c2ecf20Sopenharmony_ci * @pvt_id : sst private id 3518c2ecf20Sopenharmony_ci * @stream_cnt : total sst active stream count 3528c2ecf20Sopenharmony_ci * @pb_streams : total active pb streams 3538c2ecf20Sopenharmony_ci * @cp_streams : total active cp streams 3548c2ecf20Sopenharmony_ci * @audio_start : audio status 3558c2ecf20Sopenharmony_ci * @qos : PM Qos struct 3568c2ecf20Sopenharmony_ci * firmware_name : Firmware / Library name 3578c2ecf20Sopenharmony_ci */ 3588c2ecf20Sopenharmony_cistruct intel_sst_drv { 3598c2ecf20Sopenharmony_ci int sst_state; 3608c2ecf20Sopenharmony_ci int irq_num; 3618c2ecf20Sopenharmony_ci unsigned int dev_id; 3628c2ecf20Sopenharmony_ci void __iomem *ddr; 3638c2ecf20Sopenharmony_ci void __iomem *shim; 3648c2ecf20Sopenharmony_ci void __iomem *mailbox; 3658c2ecf20Sopenharmony_ci void __iomem *iram; 3668c2ecf20Sopenharmony_ci void __iomem *dram; 3678c2ecf20Sopenharmony_ci unsigned int mailbox_add; 3688c2ecf20Sopenharmony_ci unsigned int iram_base; 3698c2ecf20Sopenharmony_ci unsigned int dram_base; 3708c2ecf20Sopenharmony_ci unsigned int shim_phy_add; 3718c2ecf20Sopenharmony_ci unsigned int iram_end; 3728c2ecf20Sopenharmony_ci unsigned int dram_end; 3738c2ecf20Sopenharmony_ci unsigned int ddr_end; 3748c2ecf20Sopenharmony_ci unsigned int ddr_base; 3758c2ecf20Sopenharmony_ci unsigned int mailbox_recv_offset; 3768c2ecf20Sopenharmony_ci struct list_head block_list; 3778c2ecf20Sopenharmony_ci struct list_head ipc_dispatch_list; 3788c2ecf20Sopenharmony_ci struct sst_platform_info *pdata; 3798c2ecf20Sopenharmony_ci struct list_head rx_list; 3808c2ecf20Sopenharmony_ci struct work_struct ipc_post_msg_wq; 3818c2ecf20Sopenharmony_ci wait_queue_head_t wait_queue; 3828c2ecf20Sopenharmony_ci struct workqueue_struct *post_msg_wq; 3838c2ecf20Sopenharmony_ci unsigned int tstamp; 3848c2ecf20Sopenharmony_ci /* str_id 0 is not used */ 3858c2ecf20Sopenharmony_ci struct stream_info streams[MAX_NUM_STREAMS+1]; 3868c2ecf20Sopenharmony_ci spinlock_t ipc_spin_lock; 3878c2ecf20Sopenharmony_ci spinlock_t block_lock; 3888c2ecf20Sopenharmony_ci spinlock_t rx_msg_lock; 3898c2ecf20Sopenharmony_ci struct pci_dev *pci; 3908c2ecf20Sopenharmony_ci struct device *dev; 3918c2ecf20Sopenharmony_ci volatile long unsigned pvt_id; 3928c2ecf20Sopenharmony_ci struct mutex sst_lock; 3938c2ecf20Sopenharmony_ci unsigned int stream_cnt; 3948c2ecf20Sopenharmony_ci unsigned int csr_value; 3958c2ecf20Sopenharmony_ci void *fw_in_mem; 3968c2ecf20Sopenharmony_ci struct sst_sg_list fw_sg_list, library_list; 3978c2ecf20Sopenharmony_ci struct intel_sst_ops *ops; 3988c2ecf20Sopenharmony_ci struct sst_info info; 3998c2ecf20Sopenharmony_ci struct pm_qos_request *qos; 4008c2ecf20Sopenharmony_ci unsigned int use_dma; 4018c2ecf20Sopenharmony_ci unsigned int use_lli; 4028c2ecf20Sopenharmony_ci atomic_t fw_clear_context; 4038c2ecf20Sopenharmony_ci bool lib_dwnld_reqd; 4048c2ecf20Sopenharmony_ci struct list_head memcpy_list; 4058c2ecf20Sopenharmony_ci struct sst_ipc_reg ipc_reg; 4068c2ecf20Sopenharmony_ci struct sst_mem_mgr lib_mem_mgr; 4078c2ecf20Sopenharmony_ci /* 4088c2ecf20Sopenharmony_ci * Holder for firmware name. Due to async call it needs to be 4098c2ecf20Sopenharmony_ci * persistent till worker thread gets called 4108c2ecf20Sopenharmony_ci */ 4118c2ecf20Sopenharmony_ci char firmware_name[FW_NAME_SIZE]; 4128c2ecf20Sopenharmony_ci 4138c2ecf20Sopenharmony_ci struct snd_sst_fw_version fw_version; 4148c2ecf20Sopenharmony_ci struct sst_fw_save *fw_save; 4158c2ecf20Sopenharmony_ci}; 4168c2ecf20Sopenharmony_ci 4178c2ecf20Sopenharmony_ci/* misc definitions */ 4188c2ecf20Sopenharmony_ci#define FW_DWNL_ID 0x01 4198c2ecf20Sopenharmony_ci 4208c2ecf20Sopenharmony_cistruct intel_sst_ops { 4218c2ecf20Sopenharmony_ci irqreturn_t (*interrupt)(int, void *); 4228c2ecf20Sopenharmony_ci irqreturn_t (*irq_thread)(int, void *); 4238c2ecf20Sopenharmony_ci void (*clear_interrupt)(struct intel_sst_drv *ctx); 4248c2ecf20Sopenharmony_ci int (*start)(struct intel_sst_drv *ctx); 4258c2ecf20Sopenharmony_ci int (*reset)(struct intel_sst_drv *ctx); 4268c2ecf20Sopenharmony_ci void (*process_reply)(struct intel_sst_drv *ctx, struct ipc_post *msg); 4278c2ecf20Sopenharmony_ci int (*post_message)(struct intel_sst_drv *ctx, 4288c2ecf20Sopenharmony_ci struct ipc_post *msg, bool sync); 4298c2ecf20Sopenharmony_ci void (*process_message)(struct ipc_post *msg); 4308c2ecf20Sopenharmony_ci void (*set_bypass)(bool set); 4318c2ecf20Sopenharmony_ci int (*save_dsp_context)(struct intel_sst_drv *sst); 4328c2ecf20Sopenharmony_ci void (*restore_dsp_context)(void); 4338c2ecf20Sopenharmony_ci int (*alloc_stream)(struct intel_sst_drv *ctx, void *params); 4348c2ecf20Sopenharmony_ci void (*post_download)(struct intel_sst_drv *sst); 4358c2ecf20Sopenharmony_ci}; 4368c2ecf20Sopenharmony_ci 4378c2ecf20Sopenharmony_ciint sst_realloc_stream(struct intel_sst_drv *sst_drv_ctx, int str_id); 4388c2ecf20Sopenharmony_ciint sst_pause_stream(struct intel_sst_drv *sst_drv_ctx, int str_id); 4398c2ecf20Sopenharmony_ciint sst_resume_stream(struct intel_sst_drv *sst_drv_ctx, int str_id); 4408c2ecf20Sopenharmony_ciint sst_drop_stream(struct intel_sst_drv *sst_drv_ctx, int str_id); 4418c2ecf20Sopenharmony_ciint sst_free_stream(struct intel_sst_drv *sst_drv_ctx, int str_id); 4428c2ecf20Sopenharmony_ciint sst_start_stream(struct intel_sst_drv *sst_drv_ctx, int str_id); 4438c2ecf20Sopenharmony_ciint sst_send_byte_stream_mrfld(struct intel_sst_drv *sst_drv_ctx, 4448c2ecf20Sopenharmony_ci struct snd_sst_bytes_v2 *bytes); 4458c2ecf20Sopenharmony_ciint sst_set_stream_param(int str_id, struct snd_sst_params *str_param); 4468c2ecf20Sopenharmony_ciint sst_set_metadata(int str_id, char *params); 4478c2ecf20Sopenharmony_ciint sst_get_stream(struct intel_sst_drv *ctx, 4488c2ecf20Sopenharmony_ci struct snd_sst_params *str_param); 4498c2ecf20Sopenharmony_ciint sst_get_stream_allocated(struct intel_sst_drv *ctx, 4508c2ecf20Sopenharmony_ci struct snd_sst_params *str_param, 4518c2ecf20Sopenharmony_ci struct snd_sst_lib_download **lib_dnld); 4528c2ecf20Sopenharmony_ciint sst_drain_stream(struct intel_sst_drv *sst_drv_ctx, 4538c2ecf20Sopenharmony_ci int str_id, bool partial_drain); 4548c2ecf20Sopenharmony_ciint sst_post_message_mrfld(struct intel_sst_drv *sst_drv_ctx, 4558c2ecf20Sopenharmony_ci struct ipc_post *ipc_msg, bool sync); 4568c2ecf20Sopenharmony_civoid sst_process_reply_mrfld(struct intel_sst_drv *sst_drv_ctx, struct ipc_post *msg); 4578c2ecf20Sopenharmony_ciint sst_start_mrfld(struct intel_sst_drv *sst_drv_ctx); 4588c2ecf20Sopenharmony_ciint intel_sst_reset_dsp_mrfld(struct intel_sst_drv *sst_drv_ctx); 4598c2ecf20Sopenharmony_civoid intel_sst_clear_intr_mrfld(struct intel_sst_drv *sst_drv_ctx); 4608c2ecf20Sopenharmony_ci 4618c2ecf20Sopenharmony_ciint sst_load_fw(struct intel_sst_drv *sst_drv_ctx); 4628c2ecf20Sopenharmony_ciint sst_load_library(struct snd_sst_lib_download *lib, u8 ops); 4638c2ecf20Sopenharmony_civoid sst_post_download_mrfld(struct intel_sst_drv *ctx); 4648c2ecf20Sopenharmony_ciint sst_get_block_stream(struct intel_sst_drv *sst_drv_ctx); 4658c2ecf20Sopenharmony_civoid sst_memcpy_free_resources(struct intel_sst_drv *sst_drv_ctx); 4668c2ecf20Sopenharmony_ci 4678c2ecf20Sopenharmony_ciint sst_wait_interruptible(struct intel_sst_drv *sst_drv_ctx, 4688c2ecf20Sopenharmony_ci struct sst_block *block); 4698c2ecf20Sopenharmony_ciint sst_wait_timeout(struct intel_sst_drv *sst_drv_ctx, 4708c2ecf20Sopenharmony_ci struct sst_block *block); 4718c2ecf20Sopenharmony_ciint sst_create_ipc_msg(struct ipc_post **arg, bool large); 4728c2ecf20Sopenharmony_ciint free_stream_context(struct intel_sst_drv *ctx, unsigned int str_id); 4738c2ecf20Sopenharmony_civoid sst_clean_stream(struct stream_info *stream); 4748c2ecf20Sopenharmony_ciint intel_sst_register_compress(struct intel_sst_drv *sst); 4758c2ecf20Sopenharmony_ciint intel_sst_remove_compress(struct intel_sst_drv *sst); 4768c2ecf20Sopenharmony_civoid sst_cdev_fragment_elapsed(struct intel_sst_drv *ctx, int str_id); 4778c2ecf20Sopenharmony_ciint sst_send_sync_msg(int ipc, int str_id); 4788c2ecf20Sopenharmony_ciint sst_get_num_channel(struct snd_sst_params *str_param); 4798c2ecf20Sopenharmony_ciint sst_get_sfreq(struct snd_sst_params *str_param); 4808c2ecf20Sopenharmony_ciint sst_alloc_stream_mrfld(struct intel_sst_drv *sst_drv_ctx, void *params); 4818c2ecf20Sopenharmony_civoid sst_restore_fw_context(void); 4828c2ecf20Sopenharmony_cistruct sst_block *sst_create_block(struct intel_sst_drv *ctx, 4838c2ecf20Sopenharmony_ci u32 msg_id, u32 drv_id); 4848c2ecf20Sopenharmony_ciint sst_create_block_and_ipc_msg(struct ipc_post **arg, bool large, 4858c2ecf20Sopenharmony_ci struct intel_sst_drv *sst_drv_ctx, struct sst_block **block, 4868c2ecf20Sopenharmony_ci u32 msg_id, u32 drv_id); 4878c2ecf20Sopenharmony_ciint sst_free_block(struct intel_sst_drv *ctx, struct sst_block *freed); 4888c2ecf20Sopenharmony_ciint sst_wake_up_block(struct intel_sst_drv *ctx, int result, 4898c2ecf20Sopenharmony_ci u32 drv_id, u32 ipc, void *data, u32 size); 4908c2ecf20Sopenharmony_ciint sst_request_firmware_async(struct intel_sst_drv *ctx); 4918c2ecf20Sopenharmony_ciint sst_driver_ops(struct intel_sst_drv *sst); 4928c2ecf20Sopenharmony_cistruct sst_platform_info *sst_get_acpi_driver_data(const char *hid); 4938c2ecf20Sopenharmony_civoid sst_firmware_load_cb(const struct firmware *fw, void *context); 4948c2ecf20Sopenharmony_ciint sst_prepare_and_post_msg(struct intel_sst_drv *sst, 4958c2ecf20Sopenharmony_ci int task_id, int ipc_msg, int cmd_id, int pipe_id, 4968c2ecf20Sopenharmony_ci size_t mbox_data_len, const void *mbox_data, void **data, 4978c2ecf20Sopenharmony_ci bool large, bool fill_dsp, bool sync, bool response); 4988c2ecf20Sopenharmony_ci 4998c2ecf20Sopenharmony_civoid sst_process_pending_msg(struct work_struct *work); 5008c2ecf20Sopenharmony_ciint sst_assign_pvt_id(struct intel_sst_drv *drv); 5018c2ecf20Sopenharmony_ciint sst_validate_strid(struct intel_sst_drv *sst_drv_ctx, int str_id); 5028c2ecf20Sopenharmony_cistruct stream_info *get_stream_info(struct intel_sst_drv *sst_drv_ctx, 5038c2ecf20Sopenharmony_ci int str_id); 5048c2ecf20Sopenharmony_ciint get_stream_id_mrfld(struct intel_sst_drv *sst_drv_ctx, 5058c2ecf20Sopenharmony_ci u32 pipe_id); 5068c2ecf20Sopenharmony_ciu32 relocate_imr_addr_mrfld(u32 base_addr); 5078c2ecf20Sopenharmony_civoid sst_add_to_dispatch_list_and_post(struct intel_sst_drv *sst, 5088c2ecf20Sopenharmony_ci struct ipc_post *msg); 5098c2ecf20Sopenharmony_ciint sst_pm_runtime_put(struct intel_sst_drv *sst_drv); 5108c2ecf20Sopenharmony_ciint sst_shim_write(void __iomem *addr, int offset, int value); 5118c2ecf20Sopenharmony_ciu32 sst_shim_read(void __iomem *addr, int offset); 5128c2ecf20Sopenharmony_ciu64 sst_reg_read64(void __iomem *addr, int offset); 5138c2ecf20Sopenharmony_ciint sst_shim_write64(void __iomem *addr, int offset, u64 value); 5148c2ecf20Sopenharmony_ciu64 sst_shim_read64(void __iomem *addr, int offset); 5158c2ecf20Sopenharmony_civoid sst_set_fw_state_locked( 5168c2ecf20Sopenharmony_ci struct intel_sst_drv *sst_drv_ctx, int sst_state); 5178c2ecf20Sopenharmony_civoid sst_fill_header_mrfld(union ipc_header_mrfld *header, 5188c2ecf20Sopenharmony_ci int msg, int task_id, int large, int drv_id); 5198c2ecf20Sopenharmony_civoid sst_fill_header_dsp(struct ipc_dsp_hdr *dsp, int msg, 5208c2ecf20Sopenharmony_ci int pipe_id, int len); 5218c2ecf20Sopenharmony_ci 5228c2ecf20Sopenharmony_ciint sst_register(struct device *); 5238c2ecf20Sopenharmony_ciint sst_unregister(struct device *); 5248c2ecf20Sopenharmony_ci 5258c2ecf20Sopenharmony_ciint sst_alloc_drv_context(struct intel_sst_drv **ctx, 5268c2ecf20Sopenharmony_ci struct device *dev, unsigned int dev_id); 5278c2ecf20Sopenharmony_ciint sst_context_init(struct intel_sst_drv *ctx); 5288c2ecf20Sopenharmony_civoid sst_context_cleanup(struct intel_sst_drv *ctx); 5298c2ecf20Sopenharmony_civoid sst_configure_runtime_pm(struct intel_sst_drv *ctx); 5308c2ecf20Sopenharmony_civoid memcpy32_toio(void __iomem *dst, const void *src, int count); 5318c2ecf20Sopenharmony_civoid memcpy32_fromio(void *dst, const void __iomem *src, int count); 5328c2ecf20Sopenharmony_ci 5338c2ecf20Sopenharmony_ci#endif 534