1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#ifndef __SST_H__
25#define __SST_H__
26
27#include <linux/firmware.h>
28
29
30#define SST_DRV_NAME "intel_sst_driver"
31#define SST_MRFLD_PCI_ID 0x119A
32#define SST_BYT_ACPI_ID 0x80860F28
33#define SST_CHV_ACPI_ID 0x808622A8
34
35#define SST_SUSPEND_DELAY 2000
36#define FW_CONTEXT_MEM (64*1024)
37#define SST_ICCM_BOUNDARY 4
38#define SST_CONFIG_SSP_SIGN 0x7ffe8001
39
40#define MRFLD_FW_VIRTUAL_BASE 0xC0000000
41#define MRFLD_FW_DDR_BASE_OFFSET 0x0
42#define MRFLD_FW_FEATURE_BASE_OFFSET 0x4
43#define MRFLD_FW_BSS_RESET_BIT 0
44
45extern const struct dev_pm_ops intel_sst_pm;
46enum sst_states {
47 SST_FW_LOADING = 1,
48 SST_FW_RUNNING,
49 SST_RESET,
50 SST_SHUTDOWN,
51};
52
53enum sst_algo_ops {
54 SST_SET_ALGO = 0,
55 SST_GET_ALGO = 1,
56};
57
58#define SST_BLOCK_TIMEOUT 1000
59
60#define FW_SIGNATURE_SIZE 4
61#define FW_NAME_SIZE 32
62
63
64enum sst_stream_states {
65 STREAM_UN_INIT = 0,
66 STREAM_RUNNING = 1,
67 STREAM_PAUSED = 2,
68 STREAM_DECODE = 3,
69 STREAM_INIT = 4,
70 STREAM_RESET = 5,
71};
72
73enum sst_ram_type {
74 SST_IRAM = 1,
75 SST_DRAM = 2,
76 SST_DDR = 5,
77 SST_CUSTOM_INFO = 7,
78};
79
80
81union interrupt_reg {
82 struct {
83 u64 done_interrupt:1;
84 u64 busy_interrupt:1;
85 u64 rsvd:62;
86 } part;
87 u64 full;
88};
89
90union sst_pisr_reg {
91 struct {
92 u32 pssp0:1;
93 u32 pssp1:1;
94 u32 rsvd0:3;
95 u32 dmac:1;
96 u32 rsvd1:26;
97 } part;
98 u32 full;
99};
100
101union sst_pimr_reg {
102 struct {
103 u32 ssp0:1;
104 u32 ssp1:1;
105 u32 rsvd0:3;
106 u32 dmac:1;
107 u32 rsvd1:10;
108 u32 ssp0_sc:1;
109 u32 ssp1_sc:1;
110 u32 rsvd2:3;
111 u32 dmac_sc:1;
112 u32 rsvd3:10;
113 } part;
114 u32 full;
115};
116
117union config_status_reg_mrfld {
118 struct {
119 u64 lpe_reset:1;
120 u64 lpe_reset_vector:1;
121 u64 runstall:1;
122 u64 pwaitmode:1;
123 u64 clk_sel:3;
124 u64 rsvd2:1;
125 u64 sst_clk:3;
126 u64 xt_snoop:1;
127 u64 rsvd3:4;
128 u64 clk_sel1:6;
129 u64 clk_enable:3;
130 u64 rsvd4:6;
131 u64 slim0baseclk:1;
132 u64 rsvd:32;
133 } part;
134 u64 full;
135};
136
137union interrupt_reg_mrfld {
138 struct {
139 u64 done_interrupt:1;
140 u64 busy_interrupt:1;
141 u64 rsvd:62;
142 } part;
143 u64 full;
144};
145
146union sst_imr_reg_mrfld {
147 struct {
148 u64 done_interrupt:1;
149 u64 busy_interrupt:1;
150 u64 rsvd:62;
151 } part;
152 u64 full;
153};
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168struct sst_block {
169 bool condition;
170 int ret_code;
171 void *data;
172 u32 size;
173 bool on;
174 u32 msg_id;
175 u32 drv_id;
176 struct list_head node;
177};
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195struct stream_info {
196 unsigned int status;
197 unsigned int prev;
198 unsigned int ops;
199 struct mutex lock;
200
201 void *pcm_substream;
202 void (*period_elapsed)(void *pcm_substream);
203
204 unsigned int sfreq;
205 u32 cumm_bytes;
206
207 void *compr_cb_param;
208 void (*compr_cb)(void *compr_cb_param);
209
210 void *drain_cb_param;
211 void (*drain_notify)(void *drain_cb_param);
212
213 unsigned int num_ch;
214 unsigned int pipe_id;
215 unsigned int str_id;
216 unsigned int task_id;
217};
218
219#define SST_FW_SIGN "$SST"
220#define SST_FW_LIB_SIGN "$LIB"
221
222
223
224
225
226
227
228
229
230
231struct sst_fw_header {
232 unsigned char signature[FW_SIGNATURE_SIZE];
233 u32 file_size;
234 u32 modules;
235 u32 file_format;
236 u32 reserved[4];
237};
238
239
240
241
242
243
244
245
246
247
248struct fw_module_header {
249 unsigned char signature[FW_SIGNATURE_SIZE];
250 u32 mod_size;
251 u32 blocks;
252 u32 type;
253 u32 entry_point;
254};
255
256
257
258
259
260
261
262
263struct fw_block_info {
264 enum sst_ram_type type;
265 u32 size;
266 u32 ram_offset;
267 u32 rsvd;
268};
269
270struct sst_runtime_param {
271 struct snd_sst_runtime_params param;
272};
273
274struct sst_sg_list {
275 struct scatterlist *src;
276 struct scatterlist *dst;
277 int list_len;
278 unsigned int sg_idx;
279};
280
281struct sst_memcpy_list {
282 struct list_head memcpylist;
283 void *dstn;
284 const void *src;
285 u32 size;
286 bool is_io;
287};
288
289
290enum sst_lib_dwnld_status {
291 SST_LIB_NOT_FOUND = 0,
292 SST_LIB_FOUND,
293 SST_LIB_DOWNLOADED,
294};
295
296struct sst_module_info {
297 const char *name;
298 u32 id;
299 u32 entry_pt;
300 u8 status;
301 u8 rsvd1;
302 u16 rsvd2;
303};
304
305
306
307
308
309struct sst_mem_mgr {
310 phys_addr_t current_base;
311 int avail;
312 unsigned int count;
313};
314
315struct sst_ipc_reg {
316 int ipcx;
317 int ipcd;
318};
319
320struct sst_shim_regs64 {
321 u64 csr;
322 u64 pisr;
323 u64 pimr;
324 u64 isrx;
325 u64 isrd;
326 u64 imrx;
327 u64 imrd;
328 u64 ipcx;
329 u64 ipcd;
330 u64 isrsc;
331 u64 isrlpesc;
332 u64 imrsc;
333 u64 imrlpesc;
334 u64 ipcsc;
335 u64 ipclpesc;
336 u64 clkctl;
337 u64 csr2;
338};
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376struct intel_sst_drv {
377 int sst_state;
378 int irq_num;
379 unsigned int dev_id;
380 void __iomem *ddr;
381 void __iomem *shim;
382 void __iomem *mailbox;
383 void __iomem *iram;
384 void __iomem *dram;
385 unsigned int mailbox_add;
386 unsigned int iram_base;
387 unsigned int dram_base;
388 unsigned int shim_phy_add;
389 unsigned int iram_end;
390 unsigned int dram_end;
391 unsigned int ddr_end;
392 unsigned int ddr_base;
393 unsigned int mailbox_recv_offset;
394 struct sst_shim_regs64 *shim_regs64;
395 struct list_head block_list;
396 struct list_head ipc_dispatch_list;
397 struct sst_platform_info *pdata;
398 struct list_head rx_list;
399 struct work_struct ipc_post_msg_wq;
400 wait_queue_head_t wait_queue;
401 struct workqueue_struct *post_msg_wq;
402 unsigned int tstamp;
403
404 struct stream_info streams[MAX_NUM_STREAMS+1];
405 spinlock_t ipc_spin_lock;
406 spinlock_t block_lock;
407 spinlock_t rx_msg_lock;
408 struct pci_dev *pci;
409 struct device *dev;
410 volatile long unsigned pvt_id;
411 struct mutex sst_lock;
412 unsigned int stream_cnt;
413 unsigned int csr_value;
414 void *fw_in_mem;
415 struct sst_sg_list fw_sg_list, library_list;
416 struct intel_sst_ops *ops;
417 struct sst_info info;
418 struct pm_qos_request *qos;
419 unsigned int use_dma;
420 unsigned int use_lli;
421 atomic_t fw_clear_context;
422 bool lib_dwnld_reqd;
423 struct list_head memcpy_list;
424 struct sst_ipc_reg ipc_reg;
425 struct sst_mem_mgr lib_mem_mgr;
426
427
428
429
430 char firmware_name[FW_NAME_SIZE];
431};
432
433
434#define FW_DWNL_ID 0x01
435
436struct intel_sst_ops {
437 irqreturn_t (*interrupt)(int, void *);
438 irqreturn_t (*irq_thread)(int, void *);
439 void (*clear_interrupt)(struct intel_sst_drv *ctx);
440 int (*start)(struct intel_sst_drv *ctx);
441 int (*reset)(struct intel_sst_drv *ctx);
442 void (*process_reply)(struct intel_sst_drv *ctx, struct ipc_post *msg);
443 int (*post_message)(struct intel_sst_drv *ctx,
444 struct ipc_post *msg, bool sync);
445 void (*process_message)(struct ipc_post *msg);
446 void (*set_bypass)(bool set);
447 int (*save_dsp_context)(struct intel_sst_drv *sst);
448 void (*restore_dsp_context)(void);
449 int (*alloc_stream)(struct intel_sst_drv *ctx, void *params);
450 void (*post_download)(struct intel_sst_drv *sst);
451};
452
453int sst_pause_stream(struct intel_sst_drv *sst_drv_ctx, int id);
454int sst_resume_stream(struct intel_sst_drv *sst_drv_ctx, int id);
455int sst_drop_stream(struct intel_sst_drv *sst_drv_ctx, int id);
456int sst_free_stream(struct intel_sst_drv *sst_drv_ctx, int id);
457int sst_start_stream(struct intel_sst_drv *sst_drv_ctx, int str_id);
458int sst_send_byte_stream_mrfld(struct intel_sst_drv *ctx,
459 struct snd_sst_bytes_v2 *sbytes);
460int sst_set_stream_param(int str_id, struct snd_sst_params *str_param);
461int sst_set_metadata(int str_id, char *params);
462int sst_get_stream(struct intel_sst_drv *sst_drv_ctx,
463 struct snd_sst_params *str_param);
464int sst_get_stream_allocated(struct intel_sst_drv *ctx,
465 struct snd_sst_params *str_param,
466 struct snd_sst_lib_download **lib_dnld);
467int sst_drain_stream(struct intel_sst_drv *sst_drv_ctx,
468 int str_id, bool partial_drain);
469int sst_post_message_mrfld(struct intel_sst_drv *ctx,
470 struct ipc_post *msg, bool sync);
471void sst_process_reply_mrfld(struct intel_sst_drv *ctx, struct ipc_post *msg);
472int sst_start_mrfld(struct intel_sst_drv *ctx);
473int intel_sst_reset_dsp_mrfld(struct intel_sst_drv *ctx);
474void intel_sst_clear_intr_mrfld(struct intel_sst_drv *ctx);
475
476int sst_load_fw(struct intel_sst_drv *ctx);
477int sst_load_library(struct snd_sst_lib_download *lib, u8 ops);
478void sst_post_download_mrfld(struct intel_sst_drv *ctx);
479int sst_get_block_stream(struct intel_sst_drv *sst_drv_ctx);
480void sst_memcpy_free_resources(struct intel_sst_drv *ctx);
481
482int sst_wait_interruptible(struct intel_sst_drv *sst_drv_ctx,
483 struct sst_block *block);
484int sst_wait_timeout(struct intel_sst_drv *sst_drv_ctx,
485 struct sst_block *block);
486int sst_create_ipc_msg(struct ipc_post **arg, bool large);
487int free_stream_context(struct intel_sst_drv *ctx, unsigned int str_id);
488void sst_clean_stream(struct stream_info *stream);
489int intel_sst_register_compress(struct intel_sst_drv *sst);
490int intel_sst_remove_compress(struct intel_sst_drv *sst);
491void sst_cdev_fragment_elapsed(struct intel_sst_drv *ctx, int str_id);
492int sst_send_sync_msg(int ipc, int str_id);
493int sst_get_num_channel(struct snd_sst_params *str_param);
494int sst_get_sfreq(struct snd_sst_params *str_param);
495int sst_alloc_stream_mrfld(struct intel_sst_drv *sst_drv_ctx, void *params);
496void sst_restore_fw_context(void);
497struct sst_block *sst_create_block(struct intel_sst_drv *ctx,
498 u32 msg_id, u32 drv_id);
499int sst_create_block_and_ipc_msg(struct ipc_post **arg, bool large,
500 struct intel_sst_drv *sst_drv_ctx, struct sst_block **block,
501 u32 msg_id, u32 drv_id);
502int sst_free_block(struct intel_sst_drv *ctx, struct sst_block *freed);
503int sst_wake_up_block(struct intel_sst_drv *ctx, int result,
504 u32 drv_id, u32 ipc, void *data, u32 size);
505int sst_request_firmware_async(struct intel_sst_drv *ctx);
506int sst_driver_ops(struct intel_sst_drv *sst);
507struct sst_platform_info *sst_get_acpi_driver_data(const char *hid);
508void sst_firmware_load_cb(const struct firmware *fw, void *context);
509int sst_prepare_and_post_msg(struct intel_sst_drv *sst,
510 int task_id, int ipc_msg, int cmd_id, int pipe_id,
511 size_t mbox_data_len, const void *mbox_data, void **data,
512 bool large, bool fill_dsp, bool sync, bool response);
513
514void sst_process_pending_msg(struct work_struct *work);
515int sst_assign_pvt_id(struct intel_sst_drv *sst_drv_ctx);
516void sst_init_stream(struct stream_info *stream,
517 int codec, int sst_id, int ops, u8 slot);
518int sst_validate_strid(struct intel_sst_drv *sst_drv_ctx, int str_id);
519struct stream_info *get_stream_info(struct intel_sst_drv *sst_drv_ctx,
520 int str_id);
521int get_stream_id_mrfld(struct intel_sst_drv *sst_drv_ctx,
522 u32 pipe_id);
523u32 relocate_imr_addr_mrfld(u32 base_addr);
524void sst_add_to_dispatch_list_and_post(struct intel_sst_drv *sst,
525 struct ipc_post *msg);
526int sst_pm_runtime_put(struct intel_sst_drv *sst_drv);
527int sst_shim_write(void __iomem *addr, int offset, int value);
528u32 sst_shim_read(void __iomem *addr, int offset);
529u64 sst_reg_read64(void __iomem *addr, int offset);
530int sst_shim_write64(void __iomem *addr, int offset, u64 value);
531u64 sst_shim_read64(void __iomem *addr, int offset);
532void sst_set_fw_state_locked(
533 struct intel_sst_drv *sst_drv_ctx, int sst_state);
534void sst_fill_header_mrfld(union ipc_header_mrfld *header,
535 int msg, int task_id, int large, int drv_id);
536void sst_fill_header_dsp(struct ipc_dsp_hdr *dsp, int msg,
537 int pipe_id, int len);
538
539int sst_register(struct device *);
540int sst_unregister(struct device *);
541
542int sst_alloc_drv_context(struct intel_sst_drv **ctx,
543 struct device *dev, unsigned int dev_id);
544int sst_context_init(struct intel_sst_drv *ctx);
545void sst_context_cleanup(struct intel_sst_drv *ctx);
546void sst_configure_runtime_pm(struct intel_sst_drv *ctx);
547#endif
548