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 
29 struct 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 
43 struct 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 
59 struct 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 */
71 struct 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 
171 struct 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 */
264 struct 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 */
281 struct 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 */
349 struct 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 */
413 struct 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 
470 struct 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 
504 struct 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 
562 struct 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 
639 struct 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 */
704 struct 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 */
750 struct 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 */
772 struct 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 */
829 struct 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  */
887 struct 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 
931 struct 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 
982 struct 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 
1040 struct 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 
1070 struct 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 
1109 struct 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 
1144 struct 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