File Index
Files and directories
Sign in
FILE

cs46xx_dsp_scb_types.h

File preview with syntax highlighting.

linux-6.19.14/sound/pci/cs46xx/cs46xx_dsp_scb_types.h C
   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__ */
~/ Read-only file preview.