~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/soc/intel/atom/sst/sst.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0-only */
  2 /*
  3  *  sst.h - Intel SST Driver for audio engine
  4  *
  5  *  Copyright (C) 2008-14 Intel Corporation
  6  *  Authors:    Vinod Koul <vinod.koul@intel.com>
  7  *              Harsha Priya <priya.harsha@intel.com>
  8  *              Dharageswari R <dharageswari.r@intel.com>
  9  *              KP Jeeja <jeeja.kp@intel.com>
 10  *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 11  *
 12  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 13  *
 14  *  Common private declarations for SST
 15  */
 16 #ifndef __SST_H__
 17 #define __SST_H__
 18 
 19 #include <linux/firmware.h>
 20 
 21 /* driver names */
 22 #define SST_DRV_NAME "intel_sst_driver"
 23 
 24 #define SST_SUSPEND_DELAY 2000
 25 #define FW_CONTEXT_MEM (64*1024)
 26 #define SST_ICCM_BOUNDARY 4
 27 #define SST_CONFIG_SSP_SIGN 0x7ffe8001
 28 
 29 #define MRFLD_FW_VIRTUAL_BASE 0xC0000000
 30 #define MRFLD_FW_DDR_BASE_OFFSET 0x0
 31 #define MRFLD_FW_FEATURE_BASE_OFFSET 0x4
 32 #define MRFLD_FW_BSS_RESET_BIT 0
 33 
 34 /* SST Shim register map */
 35 #define SST_CSR                 0x00
 36 #define SST_ISRX                0x18
 37 #define SST_IMRX                0x28
 38 #define SST_IPCX                0x38 /* IPC IA -> SST */
 39 #define SST_IPCD                0x40 /* IPC SST -> IA */
 40 
 41 extern const struct dev_pm_ops intel_sst_pm;
 42 enum sst_states {
 43         SST_FW_LOADING = 1,
 44         SST_FW_RUNNING,
 45         SST_RESET,
 46         SST_SHUTDOWN,
 47 };
 48 
 49 enum sst_algo_ops {
 50         SST_SET_ALGO = 0,
 51         SST_GET_ALGO = 1,
 52 };
 53 
 54 #define SST_BLOCK_TIMEOUT       1000
 55 
 56 #define FW_SIGNATURE_SIZE       4
 57 #define FW_NAME_SIZE            32
 58 
 59 /* stream states */
 60 enum sst_stream_states {
 61         STREAM_UN_INIT  = 0,    /* Freed/Not used stream */
 62         STREAM_RUNNING  = 1,    /* Running */
 63         STREAM_PAUSED   = 2,    /* Paused stream */
 64         STREAM_INIT     = 3,    /* stream init, waiting for data */
 65 };
 66 
 67 enum sst_ram_type {
 68         SST_IRAM        = 1,
 69         SST_DRAM        = 2,
 70         SST_DDR = 5,
 71         SST_CUSTOM_INFO = 7,    /* consists of FW binary information */
 72 };
 73 
 74 /* SST shim registers to structure mapping */
 75 union interrupt_reg {
 76         struct {
 77                 u64 done_interrupt:1;
 78                 u64 busy_interrupt:1;
 79                 u64 rsvd:62;
 80         } part;
 81         u64 full;
 82 };
 83 
 84 union sst_pisr_reg {
 85         struct {
 86                 u32 pssp0:1;
 87                 u32 pssp1:1;
 88                 u32 rsvd0:3;
 89                 u32 dmac:1;
 90                 u32 rsvd1:26;
 91         } part;
 92         u32 full;
 93 };
 94 
 95 union sst_pimr_reg {
 96         struct {
 97                 u32 ssp0:1;
 98                 u32 ssp1:1;
 99                 u32 rsvd0:3;
100                 u32 dmac:1;
101                 u32 rsvd1:10;
102                 u32 ssp0_sc:1;
103                 u32 ssp1_sc:1;
104                 u32 rsvd2:3;
105                 u32 dmac_sc:1;
106                 u32 rsvd3:10;
107         } part;
108         u32 full;
109 };
110 
111 union config_status_reg_mrfld {
112         struct {
113                 u64 lpe_reset:1;
114                 u64 lpe_reset_vector:1;
115                 u64 runstall:1;
116                 u64 pwaitmode:1;
117                 u64 clk_sel:3;
118                 u64 rsvd2:1;
119                 u64 sst_clk:3;
120                 u64 xt_snoop:1;
121                 u64 rsvd3:4;
122                 u64 clk_sel1:6;
123                 u64 clk_enable:3;
124                 u64 rsvd4:6;
125                 u64 slim0baseclk:1;
126                 u64 rsvd:32;
127         } part;
128         u64 full;
129 };
130 
131 union interrupt_reg_mrfld {
132         struct {
133                 u64 done_interrupt:1;
134                 u64 busy_interrupt:1;
135                 u64 rsvd:62;
136         } part;
137         u64 full;
138 };
139 
140 union sst_imr_reg_mrfld {
141         struct {
142                 u64 done_interrupt:1;
143                 u64 busy_interrupt:1;
144                 u64 rsvd:62;
145         } part;
146         u64 full;
147 };
148 
149 /**
150  * struct sst_block - This structure is used to block a user/fw data call to another
151  * fw/user call
152  *
153  * @condition: condition for blocking check
154  * @ret_code: ret code when block is released
155  * @data: data ptr
156  * @size: size of data
157  * @on: block condition
158  * @msg_id: msg_id = msgid in mfld/ctp, mrfld = NULL
159  * @drv_id: str_id in mfld/ctp, = drv_id in mrfld
160  * @node: list head node
161  */
162 struct sst_block {
163         bool    condition;
164         int     ret_code;
165         void    *data;
166         u32     size;
167         bool    on;
168         u32     msg_id;
169         u32     drv_id;
170         struct list_head node;
171 };
172 
173 /**
174  * struct stream_info - structure that holds the stream information
175  *
176  * @status : stream current state
177  * @prev : stream prev state
178  * @resume_status : stream current state to restore on resume
179  * @resume_prev : stream prev state to restore on resume
180  * @lock : stream mutex for protecting state
181  * @alloc_param : parameters used for stream (re-)allocation
182  * @pcm_substream : PCM substream
183  * @period_elapsed : PCM period elapsed callback
184  * @sfreq : stream sampling freq
185  * @cumm_bytes : cummulative bytes decoded
186  */
187 struct stream_info {
188         unsigned int            status;
189         unsigned int            prev;
190         unsigned int            resume_status;
191         unsigned int            resume_prev;
192         struct mutex            lock;
193         struct snd_sst_alloc_mrfld alloc_param;
194 
195         void                    *pcm_substream;
196         void (*period_elapsed)(void *pcm_substream);
197 
198         unsigned int            sfreq;
199         u32                     cumm_bytes;
200 
201         void                    *compr_cb_param;
202         void (*compr_cb)(void *compr_cb_param);
203 
204         void                    *drain_cb_param;
205         void (*drain_notify)(void *drain_cb_param);
206 
207         unsigned int            num_ch;
208         unsigned int            pipe_id;
209         unsigned int            task_id;
210 };
211 
212 #define SST_FW_SIGN "$SST"
213 #define SST_FW_LIB_SIGN "$LIB"
214 
215 /**
216  * struct sst_fw_header - FW file headers
217  *
218  * @signature : FW signature
219  * @file_size: size of fw image
220  * @modules : # of modules
221  * @file_format : version of header format
222  * @reserved : reserved fields
223  */
224 struct sst_fw_header {
225         unsigned char signature[FW_SIGNATURE_SIZE];
226         u32 file_size;
227         u32 modules;
228         u32 file_format;
229         u32 reserved[4];
230 };
231 
232 /**
233  * struct fw_module_header - module header in FW
234  *
235  * @signature: module signature
236  * @mod_size: size of module
237  * @blocks: block count
238  * @type: block type
239  * @entry_point: module netry point
240  */
241 struct fw_module_header {
242         unsigned char signature[FW_SIGNATURE_SIZE];
243         u32 mod_size;
244         u32 blocks;
245         u32 type;
246         u32 entry_point;
247 };
248 
249 /**
250  * struct fw_block_info - block header for FW
251  *
252  * @type: block ram type I/D
253  * @size: size of block
254  * @ram_offset: offset in ram
255  */
256 struct fw_block_info {
257         enum sst_ram_type       type;
258         u32                     size;
259         u32                     ram_offset;
260         u32                     rsvd;
261 };
262 
263 struct sst_runtime_param {
264         struct snd_sst_runtime_params param;
265 };
266 
267 struct sst_sg_list {
268         struct scatterlist *src;
269         struct scatterlist *dst;
270         int list_len;
271         unsigned int sg_idx;
272 };
273 
274 struct sst_memcpy_list {
275         struct list_head memcpylist;
276         void *dstn;
277         const void *src;
278         u32 size;
279         bool is_io;
280 };
281 
282 /*Firmware Module Information*/
283 enum sst_lib_dwnld_status {
284         SST_LIB_NOT_FOUND = 0,
285         SST_LIB_FOUND,
286         SST_LIB_DOWNLOADED,
287 };
288 
289 struct sst_module_info {
290         const char *name; /*Library name*/
291         u32     id; /*Module ID*/
292         u32     entry_pt; /*Module entry point*/
293         u8      status; /*module status*/
294         u8      rsvd1;
295         u16     rsvd2;
296 };
297 
298 /*
299  * Structure for managing the Library Region(1.5MB)
300  * in DDR in Merrifield
301  */
302 struct sst_mem_mgr {
303         phys_addr_t current_base;
304         int avail;
305         unsigned int count;
306 };
307 
308 struct sst_ipc_reg {
309         int ipcx;
310         int ipcd;
311 };
312 
313 struct sst_fw_save {
314         void *iram;     /* allocated via kvmalloc() */
315         void *dram;     /* allocated via kvmalloc() */
316         void *sram;     /* allocated via kvmalloc() */
317         void *ddr;      /* allocated via kvmalloc() */
318 };
319 
320 /**
321  * struct intel_sst_drv - driver ops
322  *
323  * @sst_state : current sst device state
324  * @dev_id : device identifier, pci_id for pci devices and acpi_id for acpi
325  *           devices
326  * @shim : SST shim pointer
327  * @mailbox : SST mailbox pointer
328  * @iram : SST IRAM pointer
329  * @dram : SST DRAM pointer
330  * @pdata : SST info passed as a part of pci platform data
331  * @shim_phy_add : SST shim phy addr
332  * @ipc_dispatch_list : ipc messages dispatched
333  * @rx_list : to copy the process_reply/process_msg from DSP
334  * @ipc_post_msg_wq : wq to post IPC messages context
335  * @mad_ops : MAD driver operations registered
336  * @mad_wq : MAD driver wq
337  * @post_msg_wq : wq to post IPC messages
338  * @streams : sst stream contexts
339  * @list_lock : sst driver list lock (deprecated)
340  * @ipc_spin_lock : spin lock to handle audio shim access and ipc queue
341  * @block_lock : spin lock to add block to block_list and assign pvt_id
342  * @rx_msg_lock : spin lock to handle the rx messages from the DSP
343  * @scard_ops : sst card ops
344  * @pci : sst pci device struture
345  * @dev : pointer to current device struct
346  * @sst_lock : sst device lock
347  * @pvt_id : sst private id
348  * @stream_cnt : total sst active stream count
349  * @pb_streams : total active pb streams
350  * @cp_streams : total active cp streams
351  * @audio_start : audio status
352  * @qos         : PM Qos struct
353  * firmware_name : Firmware / Library name
354  */
355 struct intel_sst_drv {
356         int                     sst_state;
357         int                     irq_num;
358         unsigned short          dev_id;
359         void __iomem            *ddr;
360         void __iomem            *shim;
361         void __iomem            *mailbox;
362         void __iomem            *iram;
363         void __iomem            *dram;
364         unsigned int            mailbox_add;
365         unsigned int            iram_base;
366         unsigned int            dram_base;
367         unsigned int            shim_phy_add;
368         unsigned int            iram_end;
369         unsigned int            dram_end;
370         unsigned int            ddr_end;
371         unsigned int            ddr_base;
372         unsigned int            mailbox_recv_offset;
373         struct list_head        block_list;
374         struct list_head        ipc_dispatch_list;
375         struct sst_platform_info *pdata;
376         struct list_head        rx_list;
377         struct work_struct      ipc_post_msg_wq;
378         wait_queue_head_t       wait_queue;
379         struct workqueue_struct *post_msg_wq;
380         unsigned int            tstamp;
381         /* str_id 0 is not used */
382         struct stream_info      streams[MAX_NUM_STREAMS+1];
383         spinlock_t              ipc_spin_lock;
384         spinlock_t              block_lock;
385         spinlock_t              rx_msg_lock;
386         struct pci_dev          *pci;
387         struct device           *dev;
388         volatile long unsigned          pvt_id;
389         struct mutex            sst_lock;
390         unsigned int            stream_cnt;
391         unsigned int            csr_value;
392         void                    *fw_in_mem;
393         struct sst_sg_list      fw_sg_list, library_list;
394         struct intel_sst_ops    *ops;
395         struct sst_info         info;
396         struct pm_qos_request   *qos;
397         unsigned int            use_dma;
398         unsigned int            use_lli;
399         atomic_t                fw_clear_context;
400         bool                    lib_dwnld_reqd;
401         struct list_head        memcpy_list;
402         struct sst_ipc_reg      ipc_reg;
403         struct sst_mem_mgr      lib_mem_mgr;
404         /*
405          * Holder for firmware name. Due to async call it needs to be
406          * persistent till worker thread gets called
407          */
408         char firmware_name[FW_NAME_SIZE];
409 
410         struct snd_sst_fw_version fw_version;
411         struct sst_fw_save      *fw_save;
412 };
413 
414 /* misc definitions */
415 #define FW_DWNL_ID 0x01
416 
417 struct intel_sst_ops {
418         irqreturn_t (*interrupt)(int, void *);
419         irqreturn_t (*irq_thread)(int, void *);
420         void (*clear_interrupt)(struct intel_sst_drv *ctx);
421         int (*start)(struct intel_sst_drv *ctx);
422         int (*reset)(struct intel_sst_drv *ctx);
423         void (*process_reply)(struct intel_sst_drv *ctx, struct ipc_post *msg);
424         int (*post_message)(struct intel_sst_drv *ctx,
425                         struct ipc_post *msg, bool sync);
426         void (*process_message)(struct ipc_post *msg);
427         void (*set_bypass)(bool set);
428         int (*save_dsp_context)(struct intel_sst_drv *sst);
429         void (*restore_dsp_context)(void);
430         int (*alloc_stream)(struct intel_sst_drv *ctx, void *params);
431         void (*post_download)(struct intel_sst_drv *sst);
432 };
433 
434 int sst_realloc_stream(struct intel_sst_drv *sst_drv_ctx, int str_id);
435 int sst_pause_stream(struct intel_sst_drv *sst_drv_ctx, int str_id);
436 int sst_resume_stream(struct intel_sst_drv *sst_drv_ctx, int str_id);
437 int sst_drop_stream(struct intel_sst_drv *sst_drv_ctx, int str_id);
438 int sst_free_stream(struct intel_sst_drv *sst_drv_ctx, int str_id);
439 int sst_start_stream(struct intel_sst_drv *sst_drv_ctx, int str_id);
440 int sst_send_byte_stream_mrfld(struct intel_sst_drv *sst_drv_ctx,
441                         struct snd_sst_bytes_v2 *bytes);
442 int sst_set_stream_param(int str_id, struct snd_sst_params *str_param);
443 int sst_set_metadata(int str_id, char *params);
444 int sst_get_stream(struct intel_sst_drv *ctx,
445                 struct snd_sst_params *str_param);
446 int sst_get_stream_allocated(struct intel_sst_drv *ctx,
447                 struct snd_sst_params *str_param,
448                 struct snd_sst_lib_download **lib_dnld);
449 int sst_drain_stream(struct intel_sst_drv *sst_drv_ctx,
450                 int str_id, bool partial_drain);
451 int sst_post_message_mrfld(struct intel_sst_drv *sst_drv_ctx,
452                 struct ipc_post *ipc_msg, bool sync);
453 void sst_process_reply_mrfld(struct intel_sst_drv *sst_drv_ctx, struct ipc_post *msg);
454 int sst_start_mrfld(struct intel_sst_drv *sst_drv_ctx);
455 int intel_sst_reset_dsp_mrfld(struct intel_sst_drv *sst_drv_ctx);
456 void intel_sst_clear_intr_mrfld(struct intel_sst_drv *sst_drv_ctx);
457 
458 int sst_load_fw(struct intel_sst_drv *sst_drv_ctx);
459 int sst_load_library(struct snd_sst_lib_download *lib, u8 ops);
460 void sst_post_download_mrfld(struct intel_sst_drv *ctx);
461 int sst_get_block_stream(struct intel_sst_drv *sst_drv_ctx);
462 void sst_memcpy_free_resources(struct intel_sst_drv *sst_drv_ctx);
463 
464 int sst_wait_interruptible(struct intel_sst_drv *sst_drv_ctx,
465                                 struct sst_block *block);
466 int sst_wait_timeout(struct intel_sst_drv *sst_drv_ctx,
467                         struct sst_block *block);
468 int sst_create_ipc_msg(struct ipc_post **arg, bool large);
469 int free_stream_context(struct intel_sst_drv *ctx, unsigned int str_id);
470 void sst_clean_stream(struct stream_info *stream);
471 int intel_sst_register_compress(struct intel_sst_drv *sst);
472 int intel_sst_remove_compress(struct intel_sst_drv *sst);
473 void sst_cdev_fragment_elapsed(struct intel_sst_drv *ctx, int str_id);
474 int sst_send_sync_msg(int ipc, int str_id);
475 int sst_get_num_channel(struct snd_sst_params *str_param);
476 int sst_get_sfreq(struct snd_sst_params *str_param);
477 int sst_alloc_stream_mrfld(struct intel_sst_drv *sst_drv_ctx, void *params);
478 void sst_restore_fw_context(void);
479 struct sst_block *sst_create_block(struct intel_sst_drv *ctx,
480                                 u32 msg_id, u32 drv_id);
481 int sst_create_block_and_ipc_msg(struct ipc_post **arg, bool large,
482                 struct intel_sst_drv *sst_drv_ctx, struct sst_block **block,
483                 u32 msg_id, u32 drv_id);
484 int sst_free_block(struct intel_sst_drv *ctx, struct sst_block *freed);
485 int sst_wake_up_block(struct intel_sst_drv *ctx, int result,
486                 u32 drv_id, u32 ipc, void *data, u32 size);
487 int sst_request_firmware_async(struct intel_sst_drv *ctx);
488 int sst_driver_ops(struct intel_sst_drv *sst);
489 struct sst_platform_info *sst_get_acpi_driver_data(const char *hid);
490 void sst_firmware_load_cb(const struct firmware *fw, void *context);
491 int sst_prepare_and_post_msg(struct intel_sst_drv *sst,
492                 int task_id, int ipc_msg, int cmd_id, int pipe_id,
493                 size_t mbox_data_len, const void *mbox_data, void **data,
494                 bool large, bool fill_dsp, bool sync, bool response);
495 
496 void sst_process_pending_msg(struct work_struct *work);
497 int sst_assign_pvt_id(struct intel_sst_drv *drv);
498 int sst_validate_strid(struct intel_sst_drv *sst_drv_ctx, int str_id);
499 struct stream_info *get_stream_info(struct intel_sst_drv *sst_drv_ctx,
500                 int str_id);
501 int get_stream_id_mrfld(struct intel_sst_drv *sst_drv_ctx,
502                 u32 pipe_id);
503 u32 relocate_imr_addr_mrfld(u32 base_addr);
504 void sst_add_to_dispatch_list_and_post(struct intel_sst_drv *sst,
505                                         struct ipc_post *msg);
506 int sst_pm_runtime_put(struct intel_sst_drv *sst_drv);
507 int sst_shim_write(void __iomem *addr, int offset, int value);
508 u32 sst_shim_read(void __iomem *addr, int offset);
509 u64 sst_reg_read64(void __iomem *addr, int offset);
510 int sst_shim_write64(void __iomem *addr, int offset, u64 value);
511 u64 sst_shim_read64(void __iomem *addr, int offset);
512 void sst_set_fw_state_locked(
513                 struct intel_sst_drv *sst_drv_ctx, int sst_state);
514 void sst_fill_header_mrfld(union ipc_header_mrfld *header,
515                                 int msg, int task_id, int large, int drv_id);
516 void sst_fill_header_dsp(struct ipc_dsp_hdr *dsp, int msg,
517                                         int pipe_id, int len);
518 
519 int sst_register(struct device *);
520 int sst_unregister(struct device *);
521 
522 int sst_alloc_drv_context(struct intel_sst_drv **ctx,
523                 struct device *dev, unsigned short dev_id);
524 int sst_context_init(struct intel_sst_drv *ctx);
525 void sst_context_cleanup(struct intel_sst_drv *ctx);
526 void sst_configure_runtime_pm(struct intel_sst_drv *ctx);
527 void memcpy32_toio(void __iomem *dst, const void *src, int count);
528 void memcpy32_fromio(void *dst, const void __iomem *src, int count);
529 
530 #endif
531 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php