1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
4 * Copyright (c) by Jaroslav Kysela <perex@perex.cz>
5 *
6 * NOTE: comments are copy/paste from cwcemb80.lst
7 * provided by Tom Woller at Cirrus (my only
8 * documentation about the SP OS running inside
9 * the DSP)
10 */
11
12#ifndef __CS46XX_DSP_SCB_TYPES_H__
13#define __CS46XX_DSP_SCB_TYPES_H__
14
15#include <asm/byteorder.h>
16
17#ifndef ___DSP_DUAL_16BIT_ALLOC
18#if defined(__LITTLE_ENDIAN)
19#define ___DSP_DUAL_16BIT_ALLOC(a,b) u16 a; u16 b;
20#elif defined(__BIG_ENDIAN)
21#define ___DSP_DUAL_16BIT_ALLOC(a,b) u16 b; u16 a;
22#else
23#error Not __LITTLE_ENDIAN and not __BIG_ENDIAN, then what ???
24#endif
25#endif
26
27/* This structs are used internally by the SP */
28
29struct dsp_basic_dma_req {
30 /* DMA Requestor Word 0 (DCW) fields:
31
32 31 [30-28]27 [26:24] 23 22 21 20 [19:18] [17:16] 15 14 13 12 11 10 9 8 7 6 [5:0]
33 _______________________________________________________________________________________
34 |S| SBT |D| DBT |wb|wb| | | LS | SS |Opt|Do|SSG|DSG| | | | | | | Dword |
35 |H|_____ |H|_________|S_|D |__|__|______|_______|___|ne|__ |__ |__|__|_|_|_|_|_Count -1|
36 */
37 u32 dcw; /* DMA Control Word */
38 u32 dmw; /* DMA Mode Word */
39 u32 saw; /* Source Address Word */
40 u32 daw; /* Destination Address Word */
41};
42
43struct dsp_scatter_gather_ext {
44 u32 npaw; /* Next-Page Address Word */
45
46 /* DMA Requestor Word 5 (NPCW) fields:
47
48 31-30 29 28 [27:16] [15:12] [11:3] [2:0]
49 _________________________________________________________________________________________
50 |SV |LE|SE| Sample-end byte offset | | Page-map entry offset for next | |
51 |page|__|__| ___________________________|_________|__page, if !sample-end___________|____|
52 */
53 u32 npcw; /* Next-Page Control Word */
54 u32 lbaw; /* Loop-Begin Address Word */
55 u32 nplbaw; /* Next-Page after Loop-Begin Address Word */
56 u32 sgaw; /* Scatter/Gather Address Word */
57};
58
59struct dsp_volume_control {
60 ___DSP_DUAL_16BIT_ALLOC(
61 rightTarg, /* Target volume for left & right channels */
62 leftTarg
63 )
64 ___DSP_DUAL_16BIT_ALLOC(
65 rightVol, /* Current left & right channel volumes */
66 leftVol
67 )
68};
69
70/* Generic stream control block (SCB) structure definition */
71struct dsp_generic_scb {
72 /* For streaming I/O, the DSP should never alter any words in the DMA
73 requestor or the scatter/gather extension. Only ad hoc DMA request
74 streams are free to alter the requestor (currently only occur in the
75 DOS-based MIDI controller and in debugger-inserted code).
76
77 If an SCB does not have any associated DMA requestor, these 9 ints
78 may be freed for use by other tasks, but the pointer to the SCB must
79 still be such that the insOrd:nextSCB appear at offset 9 from the
80 SCB pointer.
81
82 Basic (non scatter/gather) DMA requestor (4 ints)
83 */
84
85 /* Initialized by the host, only modified by DMA
86 R/O for the DSP task */
87 struct dsp_basic_dma_req basic_req; /* Optional */
88
89 /* Scatter/gather DMA requestor extension (5 ints)
90 Initialized by the host, only modified by DMA
91 DSP task never needs to even read these.
92 */
93 struct dsp_scatter_gather_ext sg_ext; /* Optional */
94
95 /* Sublist pointer & next stream control block (SCB) link.
96 Initialized & modified by the host R/O for the DSP task
97 */
98 ___DSP_DUAL_16BIT_ALLOC(
99 next_scb, /* REQUIRED */
100 sub_list_ptr /* REQUIRED */
101 )
102
103 /* Pointer to this tasks parameter block & stream function pointer
104 Initialized by the host R/O for the DSP task */
105 ___DSP_DUAL_16BIT_ALLOC(
106 entry_point, /* REQUIRED */
107 this_spb /* REQUIRED */
108 )
109
110 /* rsConfig register for stream buffer (rsDMA reg.
111 is loaded from basicReq.daw for incoming streams, or
112 basicReq.saw, for outgoing streams)
113
114 31 30 29 [28:24] [23:16] 15 14 13 12 11 10 9 8 7 6 5 4 [3:0]
115 ______________________________________________________________________________
116 |DMA |D|maxDMAsize| streamNum|dir|p| | | | | | |ds |shr 1|rev Cy | mod |
117 |prio |_|__________|__________|___|_|__|__|__|__|_|_|___|_____|_______|_______|
118 31 30 29 [28:24] [23:16] 15 14 13 12 11 10 9 8 7 6 5 4 [3:0]
119
120
121 Initialized by the host R/O for the DSP task
122 */
123 u32 strm_rs_config; /* REQUIRED */
124 //
125 /* On mixer input streams: indicates mixer input stream configuration
126 On Tees, this is copied from the stream being snooped
127
128 Stream sample pointer & MAC-unit mode for this stream
129
130 Initialized by the host Updated by the DSP task
131 */
132 u32 strm_buf_ptr; /* REQUIRED */
133
134 /* On mixer input streams: points to next mixer input and is updated by the
135 mixer subroutine in the "parent" DSP task
136 (least-significant 16 bits are preserved, unused)
137
138 On Tees, the pointer is copied from the stream being snooped on
139 initialization, and, subsequently, it is copied into the
140 stream being snooped.
141
142 On wavetable/3D voices: the strmBufPtr will use all 32 bits to allow for
143 fractional phase accumulation
144
145 Fractional increment per output sample in the input sample buffer
146
147 (Not used on mixer input streams & redefined on Tees)
148 On wavetable/3D voices: this 32-bit word specifies the integer.fractional
149 increment per output sample.
150 */
151 u32 strmPhiIncr;
152
153
154 /* Standard stereo volume control
155 Initialized by the host (host updates target volumes)
156
157 Current volumes update by the DSP task
158 On mixer input streams: required & updated by the mixer subroutine in the
159 "parent" DSP task
160
161 On Tees, both current & target volumes are copied up on initialization,
162 and, subsequently, the target volume is copied up while the current
163 volume is copied down.
164
165 These two 32-bit words are redefined for wavetable & 3-D voices.
166 */
167 struct dsp_volume_control vol_ctrl_t; /* Optional */
168};
169
170
171struct dsp_spos_control_block {
172 /* WARNING: Certain items in this structure are modified by the host
173 Any dword that can be modified by the host, must not be
174 modified by the SP as the host can only do atomic dword
175 writes, and to do otherwise, even a read modify write,
176 may lead to corrupted data on the SP.
177
178 This rule does not apply to one off boot time initialisation prior to starting the SP
179 */
180
181
182 ___DSP_DUAL_16BIT_ALLOC(
183 /* First element on the Hyper forground task tree */
184 hfg_tree_root_ptr, /* HOST */
185 /* First 3 dwords are written by the host and read-only on the DSP */
186 hfg_stack_base /* HOST */
187 )
188
189 ___DSP_DUAL_16BIT_ALLOC(
190 /* Point to this data structure to enable easy access */
191 spos_cb_ptr, /* SP */
192 prev_task_tree_ptr /* SP && HOST */
193 )
194
195 ___DSP_DUAL_16BIT_ALLOC(
196 /* Currently Unused */
197 xxinterval_timer_period,
198 /* Enable extension of SPOS data structure */
199 HFGSPB_ptr
200 )
201
202
203 ___DSP_DUAL_16BIT_ALLOC(
204 xxnum_HFG_ticks_thisInterval,
205 /* Modified by the DSP */
206 xxnum_tntervals
207 )
208
209
210 /* Set by DSP upon encountering a trap (breakpoint) or a spurious
211 interrupt. The host must clear this dword after reading it
212 upon receiving spInt1. */
213 ___DSP_DUAL_16BIT_ALLOC(
214 spurious_int_flag, /* (Host & SP) Nature of the spurious interrupt */
215 trap_flag /* (Host & SP) Nature of detected Trap */
216 )
217
218 ___DSP_DUAL_16BIT_ALLOC(
219 unused2,
220 invalid_IP_flag /* (Host & SP ) Indicate detection of invalid instruction pointer */
221 )
222
223 ___DSP_DUAL_16BIT_ALLOC(
224 /* pointer to forground task tree header for use in next task search */
225 fg_task_tree_hdr_ptr, /* HOST */
226 /* Data structure for controlling synchronous link update */
227 hfg_sync_update_ptr /* HOST */
228 )
229
230 ___DSP_DUAL_16BIT_ALLOC(
231 begin_foreground_FCNT, /* SP */
232 /* Place holder for holding sleep timing */
233 last_FCNT_before_sleep /* SP */
234 )
235
236 ___DSP_DUAL_16BIT_ALLOC(
237 unused7, /* SP */
238 next_task_treePtr /* SP */
239 )
240
241 u32 unused5;
242
243 ___DSP_DUAL_16BIT_ALLOC(
244 active_flags, /* SP */
245 /* State flags, used to assist control of execution of Hyper Forground */
246 HFG_flags /* SP */
247 )
248
249 ___DSP_DUAL_16BIT_ALLOC(
250 unused9,
251 unused8
252 )
253
254 /* Space for saving enough context so that we can set up enough
255 to save some more context.
256 */
257 u32 rFE_save_for_invalid_IP;
258 u32 r32_save_for_spurious_int;
259 u32 r32_save_for_trap;
260 u32 r32_save_for_HFG;
261};
262
263/* SPB for MIX_TO_OSTREAM algorithm family */
264struct dsp_mix2_ostream_spb
265{
266 /* 16b.16b integer.frac approximation to the
267 number of 3 sample triplets to output each
268 frame. (approximation must be floor, to
269 insure that the fractional error is always
270 positive)
271 */
272 u32 outTripletsPerFrame;
273
274 /* 16b.16b integer.frac accumulated number of
275 output triplets since the start of group
276 */
277 u32 accumOutTriplets;
278};
279
280/* SCB for Timing master algorithm */
281struct dsp_timing_master_scb {
282 /* First 12 dwords from generic_scb_t */
283 struct dsp_basic_dma_req basic_req; /* Optional */
284 struct dsp_scatter_gather_ext sg_ext; /* Optional */
285 ___DSP_DUAL_16BIT_ALLOC(
286 next_scb, /* REQUIRED */
287 sub_list_ptr /* REQUIRED */
288 )
289
290 ___DSP_DUAL_16BIT_ALLOC(
291 entry_point, /* REQUIRED */
292 this_spb /* REQUIRED */
293 )
294
295 ___DSP_DUAL_16BIT_ALLOC(
296 /* Initial values are 0000:xxxx */
297 reserved,
298 extra_sample_accum
299 )
300
301
302 /* Initial values are xxxx:0000
303 hi: Current CODEC output FIFO pointer
304 (0 to 0x0f)
305 lo: Flag indicating that the CODEC
306 FIFO is sync'd (host clears to
307 resynchronize the FIFO pointer
308 upon start/restart)
309 */
310 ___DSP_DUAL_16BIT_ALLOC(
311 codec_FIFO_syncd,
312 codec_FIFO_ptr
313 )
314
315 /* Init. 8000:0005 for 44.1k
316 8000:0001 for 48k
317 hi: Fractional sample accumulator 0.16b
318 lo: Number of frames remaining to be
319 processed in the current group of
320 frames
321 */
322 ___DSP_DUAL_16BIT_ALLOC(
323 frac_samp_accum_qm1,
324 TM_frms_left_in_group
325 )
326
327 /* Init. 0001:0005 for 44.1k
328 0000:0001 for 48k
329 hi: Fractional sample correction factor 0.16b
330 to be added every frameGroupLength frames
331 to correct for truncation error in
332 nsamp_per_frm_q15
333 lo: Number of frames in the group
334 */
335 ___DSP_DUAL_16BIT_ALLOC(
336 frac_samp_correction_qm1,
337 TM_frm_group_length
338 )
339
340 /* Init. 44.1k*65536/8k = 0x00058333 for 44.1k
341 48k*65536/8k = 0x00060000 for 48k
342 16b.16b integer.frac approximation to the
343 number of samples to output each frame.
344 (approximation must be floor, to insure */
345 u32 nsamp_per_frm_q15;
346};
347
348/* SCB for CODEC output algorithm */
349struct dsp_codec_output_scb {
350 /* First 13 dwords from generic_scb_t */
351 struct dsp_basic_dma_req basic_req; /* Optional */
352 struct dsp_scatter_gather_ext sg_ext; /* Optional */
353 ___DSP_DUAL_16BIT_ALLOC(
354 next_scb, /* REQUIRED */
355 sub_list_ptr /* REQUIRED */
356 )
357
358 ___DSP_DUAL_16BIT_ALLOC(
359 entry_point, /* REQUIRED */
360 this_spb /* REQUIRED */
361 )
362
363 u32 strm_rs_config; /* REQUIRED */
364
365 u32 strm_buf_ptr; /* REQUIRED */
366
367 /* NOTE: The CODEC output task reads samples from the first task on its
368 sublist at the stream buffer pointer (init. to lag DMA destination
369 address word). After the required number of samples is transferred,
370 the CODEC output task advances sub_list_ptr->strm_buf_ptr past the samples
371 consumed.
372 */
373
374 /* Init. 0000:0010 for SDout
375 0060:0010 for SDout2
376 0080:0010 for SDout3
377 hi: Base IO address of FIFO to which
378 the left-channel samples are to
379 be written.
380 lo: Displacement for the base IO
381 address for left-channel to obtain
382 the base IO address for the FIFO
383 to which the right-channel samples
384 are to be written.
385 */
386 ___DSP_DUAL_16BIT_ALLOC(
387 left_chan_base_IO_addr,
388 right_chan_IO_disp
389 )
390
391
392 /* Init: 0x0080:0004 for non-AC-97
393 Init: 0x0080:0000 for AC-97
394 hi: Exponential volume change rate
395 for input stream
396 lo: Positive shift count to shift the
397 16-bit input sample to obtain the
398 32-bit output word
399 */
400 ___DSP_DUAL_16BIT_ALLOC(
401 CO_scale_shift_count,
402 CO_exp_vol_change_rate
403 )
404
405 /* Pointer to SCB at end of input chain */
406 ___DSP_DUAL_16BIT_ALLOC(
407 reserved,
408 last_sub_ptr
409 )
410};
411
412/* SCB for CODEC input algorithm */
413struct dsp_codec_input_scb {
414 /* First 13 dwords from generic_scb_t */
415 struct dsp_basic_dma_req basic_req; /* Optional */
416 struct dsp_scatter_gather_ext sg_ext; /* Optional */
417 ___DSP_DUAL_16BIT_ALLOC(
418 next_scb, /* REQUIRED */
419 sub_list_ptr /* REQUIRED */
420 )
421
422 ___DSP_DUAL_16BIT_ALLOC(
423 entry_point, /* REQUIRED */
424 this_spb /* REQUIRED */
425 )
426
427 u32 strm_rs_config; /* REQUIRED */
428 u32 strm_buf_ptr; /* REQUIRED */
429
430 /* NOTE: The CODEC input task reads samples from the hardware FIFO
431 sublist at the DMA source address word (sub_list_ptr->basic_req.saw).
432 After the required number of samples is transferred, the CODEC
433 output task advances sub_list_ptr->basic_req.saw past the samples
434 consumed. SPuD must initialize the sub_list_ptr->basic_req.saw
435 to point half-way around from the initial sub_list_ptr->strm_nuf_ptr
436 to allow for lag/lead.
437 */
438
439 /* Init. 0000:0010 for SDout
440 0060:0010 for SDout2
441 0080:0010 for SDout3
442 hi: Base IO address of FIFO to which
443 the left-channel samples are to
444 be written.
445 lo: Displacement for the base IO
446 address for left-channel to obtain
447 the base IO address for the FIFO
448 to which the right-channel samples
449 are to be written.
450 */
451 ___DSP_DUAL_16BIT_ALLOC(
452 rightChanINdisp,
453 left_chan_base_IN_addr
454 )
455 /* Init. ?:fffc
456 lo: Negative shift count to shift the
457 32-bit input dword to obtain the
458 16-bit sample msb-aligned (count
459 is negative to shift left)
460 */
461 ___DSP_DUAL_16BIT_ALLOC(
462 scaleShiftCount,
463 reserver1
464 )
465
466 u32 reserved2;
467};
468
469
470struct dsp_pcm_serial_input_scb {
471 /* First 13 dwords from generic_scb_t */
472 struct dsp_basic_dma_req basic_req; /* Optional */
473 struct dsp_scatter_gather_ext sg_ext; /* Optional */
474 ___DSP_DUAL_16BIT_ALLOC(
475 next_scb, /* REQUIRED */
476 sub_list_ptr /* REQUIRED */
477 )
478
479 ___DSP_DUAL_16BIT_ALLOC(
480 entry_point, /* REQUIRED */
481 this_spb /* REQUIRED */
482 )
483
484 u32 strm_buf_ptr; /* REQUIRED */
485 u32 strm_rs_config; /* REQUIRED */
486
487 /* Init. Ptr to CODEC input SCB
488 hi: Pointer to the SCB containing the
489 input buffer to which CODEC input
490 samples are written
491 lo: Flag indicating the link to the CODEC
492 input task is to be initialized
493 */
494 ___DSP_DUAL_16BIT_ALLOC(
495 init_codec_input_link,
496 codec_input_buf_scb
497 )
498
499 /* Initialized by the host (host updates target volumes) */
500 struct dsp_volume_control psi_vol_ctrl;
501
502};
503
504struct dsp_src_task_scb {
505 ___DSP_DUAL_16BIT_ALLOC(
506 frames_left_in_gof,
507 gofs_left_in_sec
508 )
509
510 ___DSP_DUAL_16BIT_ALLOC(
511 const2_thirds,
512 num_extra_tnput_samples
513 )
514
515 ___DSP_DUAL_16BIT_ALLOC(
516 cor_per_gof,
517 correction_per_sec
518 )
519
520 ___DSP_DUAL_16BIT_ALLOC(
521 output_buf_producer_ptr,
522 junk_DMA_MID
523 )
524
525 ___DSP_DUAL_16BIT_ALLOC(
526 gof_length,
527 gofs_per_sec
528 )
529
530 u32 input_buf_strm_config;
531
532 ___DSP_DUAL_16BIT_ALLOC(
533 reserved_for_SRC_use,
534 input_buf_consumer_ptr
535 )
536
537 u32 accum_phi;
538
539 ___DSP_DUAL_16BIT_ALLOC(
540 exp_src_vol_change_rate,
541 input_buf_producer_ptr
542 )
543
544 ___DSP_DUAL_16BIT_ALLOC(
545 src_next_scb,
546 src_sub_list_ptr
547 )
548
549 ___DSP_DUAL_16BIT_ALLOC(
550 src_entry_point,
551 src_this_sbp
552 )
553
554 u32 src_strm_rs_config;
555 u32 src_strm_buf_ptr;
556
557 u32 phiIncr6int_26frac;
558
559 struct dsp_volume_control src_vol_ctrl;
560};
561
562struct dsp_decimate_by_pow2_scb {
563 /* decimationFactor = 2, 4, or 8 (larger factors waste too much memory
564 when compared to cascading decimators)
565 */
566 ___DSP_DUAL_16BIT_ALLOC(
567 dec2_coef_base_ptr,
568 dec2_coef_increment
569 )
570
571 /* coefIncrement = 128 / decimationFactor (for our ROM filter)
572 coefBasePtr = 0x8000 (for our ROM filter)
573 */
574 ___DSP_DUAL_16BIT_ALLOC(
575 dec2_in_samples_per_out_triplet,
576 dec2_extra_in_samples
577 )
578 /* extraInSamples: # of accumulated, unused input samples (init. to 0)
579 inSamplesPerOutTriplet = 3 * decimationFactor
580 */
581
582 ___DSP_DUAL_16BIT_ALLOC(
583 dec2_const2_thirds,
584 dec2_half_num_taps_mp5
585 )
586 /* halfNumTapsM5: (1/2 number of taps in decimation filter) minus 5
587 const2thirds: constant 2/3 in 16Q0 format (sign.15)
588 */
589
590 ___DSP_DUAL_16BIT_ALLOC(
591 dec2_output_buf_producer_ptr,
592 dec2_junkdma_mid
593 )
594
595 u32 dec2_reserved2;
596
597 u32 dec2_input_nuf_strm_config;
598 /* inputBufStrmConfig: rsConfig for the input buffer to the decimator
599 (buffer size = decimationFactor * 32 dwords)
600 */
601
602 ___DSP_DUAL_16BIT_ALLOC(
603 dec2_phi_incr,
604 dec2_input_buf_consumer_ptr
605 )
606 /* inputBufConsumerPtr: Input buffer read pointer (into SRC filter)
607 phiIncr = decimationFactor * 4
608 */
609
610 u32 dec2_reserved3;
611
612 ___DSP_DUAL_16BIT_ALLOC(
613 dec2_exp_vol_change_rate,
614 dec2_input_buf_producer_ptr
615 )
616 /* inputBufProducerPtr: Input buffer write pointer
617 expVolChangeRate: Exponential volume change rate for possible
618 future mixer on input streams
619 */
620
621 ___DSP_DUAL_16BIT_ALLOC(
622 dec2_next_scb,
623 dec2_sub_list_ptr
624 )
625
626 ___DSP_DUAL_16BIT_ALLOC(
627 dec2_entry_point,
628 dec2_this_spb
629 )
630
631 u32 dec2_strm_rs_config;
632 u32 dec2_strm_buf_ptr;
633
634 u32 dec2_reserved4;
635
636 struct dsp_volume_control dec2_vol_ctrl; /* Not used! */
637};
638
639struct dsp_vari_decimate_scb {
640 ___DSP_DUAL_16BIT_ALLOC(
641 vdec_frames_left_in_gof,
642 vdec_gofs_left_in_sec
643 )
644
645 ___DSP_DUAL_16BIT_ALLOC(
646 vdec_const2_thirds,
647 vdec_extra_in_samples
648 )
649 /* extraInSamples: # of accumulated, unused input samples (init. to 0)
650 const2thirds: constant 2/3 in 16Q0 format (sign.15) */
651
652 ___DSP_DUAL_16BIT_ALLOC(
653 vdec_cor_per_gof,
654 vdec_correction_per_sec
655 )
656
657 ___DSP_DUAL_16BIT_ALLOC(
658 vdec_output_buf_producer_ptr,
659 vdec_input_buf_consumer_ptr
660 )
661 /* inputBufConsumerPtr: Input buffer read pointer (into SRC filter) */
662 ___DSP_DUAL_16BIT_ALLOC(
663 vdec_gof_length,
664 vdec_gofs_per_sec
665 )
666
667 u32 vdec_input_buf_strm_config;
668 /* inputBufStrmConfig: rsConfig for the input buffer to the decimator
669 (buffer size = 64 dwords) */
670 u32 vdec_coef_increment;
671 /* coefIncrement = - 128.0 / decimationFactor (as a 32Q15 number) */
672
673 u32 vdec_accumphi;
674 /* accumPhi: accumulated fractional phase increment (6.26) */
675
676 ___DSP_DUAL_16BIT_ALLOC(
677 vdec_exp_vol_change_rate,
678 vdec_input_buf_producer_ptr
679 )
680 /* inputBufProducerPtr: Input buffer write pointer
681 expVolChangeRate: Exponential volume change rate for possible
682 future mixer on input streams */
683
684 ___DSP_DUAL_16BIT_ALLOC(
685 vdec_next_scb,
686 vdec_sub_list_ptr
687 )
688
689 ___DSP_DUAL_16BIT_ALLOC(
690 vdec_entry_point,
691 vdec_this_spb
692 )
693
694 u32 vdec_strm_rs_config;
695 u32 vdec_strm_buf_ptr;
696
697 u32 vdec_phi_incr_6int_26frac;
698
699 struct dsp_volume_control vdec_vol_ctrl;
700};
701
702
703/* SCB for MIX_TO_OSTREAM algorithm family */
704struct dsp_mix2_ostream_scb {
705 /* First 13 dwords from generic_scb_t */
706 struct dsp_basic_dma_req basic_req; /* Optional */
707 struct dsp_scatter_gather_ext sg_ext; /* Optional */
708 ___DSP_DUAL_16BIT_ALLOC(
709 next_scb, /* REQUIRED */
710 sub_list_ptr /* REQUIRED */
711 )
712
713 ___DSP_DUAL_16BIT_ALLOC(
714 entry_point, /* REQUIRED */
715 this_spb /* REQUIRED */
716 )
717
718 u32 strm_rs_config; /* REQUIRED */
719 u32 strm_buf_ptr; /* REQUIRED */
720
721
722 /* hi: Number of mixed-down input triplets
723 computed since start of group
724 lo: Number of frames remaining to be
725 processed in the current group of
726 frames
727 */
728 ___DSP_DUAL_16BIT_ALLOC(
729 frames_left_in_group,
730 accum_input_triplets
731 )
732
733 /* hi: Exponential volume change rate
734 for mixer on input streams
735 lo: Number of frames in the group
736 */
737 ___DSP_DUAL_16BIT_ALLOC(
738 frame_group_length,
739 exp_vol_change_rate
740 )
741
742 ___DSP_DUAL_16BIT_ALLOC(
743 const_FFFF,
744 const_zero
745 )
746};
747
748
749/* SCB for S16_MIX algorithm */
750struct dsp_mix_only_scb {
751 /* First 13 dwords from generic_scb_t */
752 struct dsp_basic_dma_req basic_req; /* Optional */
753 struct dsp_scatter_gather_ext sg_ext; /* Optional */
754 ___DSP_DUAL_16BIT_ALLOC(
755 next_scb, /* REQUIRED */
756 sub_list_ptr /* REQUIRED */
757 )
758
759 ___DSP_DUAL_16BIT_ALLOC(
760 entry_point, /* REQUIRED */
761 this_spb /* REQUIRED */
762 )
763
764 u32 strm_rs_config; /* REQUIRED */
765 u32 strm_buf_ptr; /* REQUIRED */
766
767 u32 reserved;
768 struct dsp_volume_control vol_ctrl;
769};
770
771/* SCB for the async. CODEC input algorithm */
772struct dsp_async_codec_input_scb {
773 u32 io_free2;
774
775 u32 io_current_total;
776 u32 io_previous_total;
777
778 u16 io_count;
779 u16 io_count_limit;
780
781 u16 o_fifo_base_addr;
782 u16 ost_mo_format;
783 /* 1 = stereo; 0 = mono
784 xxx for ASER 1 (not allowed); 118 for ASER2 */
785
786 u32 ostrm_rs_config;
787 u32 ostrm_buf_ptr;
788
789 ___DSP_DUAL_16BIT_ALLOC(
790 io_sclks_per_lr_clk,
791 io_io_enable
792 )
793
794 u32 io_free4;
795
796 ___DSP_DUAL_16BIT_ALLOC(
797 io_next_scb,
798 io_sub_list_ptr
799 )
800
801 ___DSP_DUAL_16BIT_ALLOC(
802 io_entry_point,
803 io_this_spb
804 )
805
806 u32 istrm_rs_config;
807 u32 istrm_buf_ptr;
808
809 /* Init. 0000:8042: for ASER1
810 0000:8044: for ASER2 */
811 ___DSP_DUAL_16BIT_ALLOC(
812 io_stat_reg_addr,
813 iofifo_pointer
814 )
815
816 /* Init 1 stero:100 ASER1
817 Init 0 mono:110 ASER2
818 */
819 ___DSP_DUAL_16BIT_ALLOC(
820 ififo_base_addr,
821 ist_mo_format
822 )
823
824 u32 i_free;
825};
826
827
828/* SCB for the SP/DIF CODEC input and output */
829struct dsp_spdifiscb {
830 ___DSP_DUAL_16BIT_ALLOC(
831 status_ptr,
832 status_start_ptr
833 )
834
835 u32 current_total;
836 u32 previous_total;
837
838 ___DSP_DUAL_16BIT_ALLOC(
839 count,
840 count_limit
841 )
842
843 u32 status_data;
844
845 ___DSP_DUAL_16BIT_ALLOC(
846 status,
847 free4
848 )
849
850 u32 free3;
851
852 ___DSP_DUAL_16BIT_ALLOC(
853 free2,
854 bit_count
855 )
856
857 u32 temp_status;
858
859 ___DSP_DUAL_16BIT_ALLOC(
860 next_SCB,
861 sub_list_ptr
862 )
863
864 ___DSP_DUAL_16BIT_ALLOC(
865 entry_point,
866 this_spb
867 )
868
869 u32 strm_rs_config;
870 u32 strm_buf_ptr;
871
872 ___DSP_DUAL_16BIT_ALLOC(
873 stat_reg_addr,
874 fifo_pointer
875 )
876
877 ___DSP_DUAL_16BIT_ALLOC(
878 fifo_base_addr,
879 st_mo_format
880 )
881
882 u32 free1;
883};
884
885
886/* SCB for the SP/DIF CODEC input and output */
887struct dsp_spdifoscb {
888
889 u32 free2;
890
891 u32 free3[4];
892
893 /* Need to be here for compatibility with AsynchFGTxCode */
894 u32 strm_rs_config;
895
896 u32 strm_buf_ptr;
897
898 ___DSP_DUAL_16BIT_ALLOC(
899 status,
900 free5
901 )
902
903 u32 free4;
904
905 ___DSP_DUAL_16BIT_ALLOC(
906 next_scb,
907 sub_list_ptr
908 )
909
910 ___DSP_DUAL_16BIT_ALLOC(
911 entry_point,
912 this_spb
913 )
914
915 u32 free6[2];
916
917 ___DSP_DUAL_16BIT_ALLOC(
918 stat_reg_addr,
919 fifo_pointer
920 )
921
922 ___DSP_DUAL_16BIT_ALLOC(
923 fifo_base_addr,
924 st_mo_format
925 )
926
927 u32 free1;
928};
929
930
931struct dsp_asynch_fg_rx_scb {
932 ___DSP_DUAL_16BIT_ALLOC(
933 bot_buf_mask,
934 buf_Mask
935 )
936
937 ___DSP_DUAL_16BIT_ALLOC(
938 max,
939 min
940 )
941
942 ___DSP_DUAL_16BIT_ALLOC(
943 old_producer_pointer,
944 hfg_scb_ptr
945 )
946
947 ___DSP_DUAL_16BIT_ALLOC(
948 delta,
949 adjust_count
950 )
951
952 u32 unused2[5];
953
954 ___DSP_DUAL_16BIT_ALLOC(
955 sibling_ptr,
956 child_ptr
957 )
958
959 ___DSP_DUAL_16BIT_ALLOC(
960 code_ptr,
961 this_ptr
962 )
963
964 u32 strm_rs_config;
965
966 u32 strm_buf_ptr;
967
968 u32 unused_phi_incr;
969
970 ___DSP_DUAL_16BIT_ALLOC(
971 right_targ,
972 left_targ
973 )
974
975 ___DSP_DUAL_16BIT_ALLOC(
976 right_vol,
977 left_vol
978 )
979};
980
981
982struct dsp_asynch_fg_tx_scb {
983 ___DSP_DUAL_16BIT_ALLOC(
984 not_buf_mask,
985 buf_mask
986 )
987
988 ___DSP_DUAL_16BIT_ALLOC(
989 max,
990 min
991 )
992
993 ___DSP_DUAL_16BIT_ALLOC(
994 unused1,
995 hfg_scb_ptr
996 )
997
998 ___DSP_DUAL_16BIT_ALLOC(
999 delta,
1000 adjust_count
1001 )
1002
1003 u32 accum_phi;
1004
1005 ___DSP_DUAL_16BIT_ALLOC(
1006 unused2,
1007 const_one_third
1008 )
1009
1010 u32 unused3[3];
1011
1012 ___DSP_DUAL_16BIT_ALLOC(
1013 sibling_ptr,
1014 child_ptr
1015 )
1016
1017 ___DSP_DUAL_16BIT_ALLOC(
1018 codePtr,
1019 this_ptr
1020 )
1021
1022 u32 strm_rs_config;
1023
1024 u32 strm_buf_ptr;
1025
1026 u32 phi_incr;
1027
1028 ___DSP_DUAL_16BIT_ALLOC(
1029 unused_right_targ,
1030 unused_left_targ
1031 )
1032
1033 ___DSP_DUAL_16BIT_ALLOC(
1034 unused_right_vol,
1035 unused_left_vol
1036 )
1037};
1038
1039
1040struct dsp_output_snoop_scb {
1041 /* First 13 dwords from generic_scb_t */
1042 struct dsp_basic_dma_req basic_req; /* Optional */
1043 struct dsp_scatter_gather_ext sg_ext; /* Optional */
1044 ___DSP_DUAL_16BIT_ALLOC(
1045 next_scb, /* REQUIRED */
1046 sub_list_ptr /* REQUIRED */
1047 )
1048
1049 ___DSP_DUAL_16BIT_ALLOC(
1050 entry_point, /* REQUIRED */
1051 this_spb /* REQUIRED */
1052 )
1053
1054 u32 strm_rs_config; /* REQUIRED */
1055 u32 strm_buf_ptr; /* REQUIRED */
1056
1057 ___DSP_DUAL_16BIT_ALLOC(
1058 init_snoop_input_link,
1059 snoop_child_input_scb
1060 )
1061
1062 u32 snoop_input_buf_ptr;
1063
1064 ___DSP_DUAL_16BIT_ALLOC(
1065 reserved,
1066 input_scb
1067 )
1068};
1069
1070struct dsp_spio_write_scb {
1071 ___DSP_DUAL_16BIT_ALLOC(
1072 address1,
1073 address2
1074 )
1075
1076 u32 data1;
1077
1078 u32 data2;
1079
1080 ___DSP_DUAL_16BIT_ALLOC(
1081 address3,
1082 address4
1083 )
1084
1085 u32 data3;
1086
1087 u32 data4;
1088
1089 ___DSP_DUAL_16BIT_ALLOC(
1090 unused1,
1091 data_ptr
1092 )
1093
1094 u32 unused2[2];
1095
1096 ___DSP_DUAL_16BIT_ALLOC(
1097 sibling_ptr,
1098 child_ptr
1099 )
1100
1101 ___DSP_DUAL_16BIT_ALLOC(
1102 entry_point,
1103 this_ptr
1104 )
1105
1106 u32 unused3[5];
1107};
1108
1109struct dsp_magic_snoop_task {
1110 u32 i0;
1111 u32 i1;
1112
1113 u32 strm_buf_ptr1;
1114
1115 u16 i2;
1116 u16 snoop_scb;
1117
1118 u32 i3;
1119 u32 i4;
1120 u32 i5;
1121 u32 i6;
1122
1123 u32 i7;
1124
1125 ___DSP_DUAL_16BIT_ALLOC(
1126 next_scb,
1127 sub_list_ptr
1128 )
1129
1130 ___DSP_DUAL_16BIT_ALLOC(
1131 entry_point,
1132 this_ptr
1133 )
1134
1135 u32 strm_buf_config;
1136 u32 strm_buf_ptr2;
1137
1138 u32 i8;
1139
1140 struct dsp_volume_control vdec_vol_ctrl;
1141};
1142
1143
1144struct dsp_filter_scb {
1145 ___DSP_DUAL_16BIT_ALLOC(
1146 a0_right, /* 0x00 */
1147 a0_left
1148 )
1149 ___DSP_DUAL_16BIT_ALLOC(
1150 a1_right, /* 0x01 */
1151 a1_left
1152 )
1153 ___DSP_DUAL_16BIT_ALLOC(
1154 a2_right, /* 0x02 */
1155 a2_left
1156 )
1157 ___DSP_DUAL_16BIT_ALLOC(
1158 output_buf_ptr, /* 0x03 */
1159 init
1160 )
1161
1162 ___DSP_DUAL_16BIT_ALLOC(
1163 filter_unused3, /* 0x04 */
1164 filter_unused2
1165 )
1166
1167 u32 prev_sample_output1; /* 0x05 */
1168 u32 prev_sample_output2; /* 0x06 */
1169 u32 prev_sample_input1; /* 0x07 */
1170 u32 prev_sample_input2; /* 0x08 */
1171
1172 ___DSP_DUAL_16BIT_ALLOC(
1173 next_scb_ptr, /* 0x09 */
1174 sub_list_ptr
1175 )
1176
1177 ___DSP_DUAL_16BIT_ALLOC(
1178 entry_point, /* 0x0A */
1179 spb_ptr
1180 )
1181
1182 u32 strm_rs_config; /* 0x0B */
1183 u32 strm_buf_ptr; /* 0x0C */
1184
1185 ___DSP_DUAL_16BIT_ALLOC(
1186 b0_right, /* 0x0D */
1187 b0_left
1188 )
1189 ___DSP_DUAL_16BIT_ALLOC(
1190 b1_right, /* 0x0E */
1191 b1_left
1192 )
1193 ___DSP_DUAL_16BIT_ALLOC(
1194 b2_right, /* 0x0F */
1195 b2_left
1196 )
1197};
1198#endif /* __DSP_SCB_TYPES_H__ */
1199

source code of linux/sound/pci/cs46xx/cs46xx_dsp_scb_types.h