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