linux/sound/pci/cs46xx/cs46xx_dsp_scb_types.h
<<
>>
Prefs
   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