Home | History | Annotate | Download | only in sound
      1 /*
      2  *  The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
      3  *  Copyright (c) by Jaroslav Kysela <perex (at) 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_TASK_TYPES_H__
     28 #define __CS46XX_DSP_TASK_TYPES_H__
     29 
     30 #include "cs46xx_dsp_scb_types.h"
     31 
     32 /*********************************************************************************************
     33 Example hierarchy of stream control blocks in the SP
     34 
     35 hfgTree
     36 Ptr____Call (c)
     37        \
     38  -------+------         -------------      -------------      -------------      -----
     39 | SBlaster IF  |______\| Foreground  |___\| Middlegr'nd |___\| Background  |___\| Nul |
     40 |              |Goto  /| tree header |g  /| tree header |g  /| tree header |g  /| SCB |r
     41  -------------- (g)     -------------      -------------      -------------      -----
     42        |c                     |c                 |c                 |c
     43        |                      |                  |                  |
     44       \/                  -------------      -------------      -------------
     45                        | Foreground  |_\  | Middlegr'nd |_\  | Background  |_\
     46                        |     tree    |g/  |    tree     |g/  |     tree    |g/
     47                         -------------      -------------      -------------
     48                               |c                 |c                 |c
     49                               |                  |                  |
     50                              \/                 \/                 \/
     51 
     52 *********************************************************************************************/
     53 
     54 #define		HFG_FIRST_EXECUTE_MODE			0x0001
     55 #define		HFG_FIRST_EXECUTE_MODE_BIT		0
     56 #define		HFG_CONTEXT_SWITCH_MODE			0x0002
     57 #define		HFG_CONTEXT_SWITCH_MODE_BIT		1
     58 
     59 #define MAX_FG_STACK_SIZE 	32			/* THESE NEED TO BE COMPUTED PROPERLY */
     60 #define MAX_MG_STACK_SIZE 	16
     61 #define MAX_BG_STACK_SIZE 	9
     62 #define MAX_HFG_STACK_SIZE	4
     63 
     64 #define SLEEP_ACTIVE_INCREMENT		0		/* Enable task tree thread to go to sleep
     65 											   This should only ever be used on the Background thread */
     66 #define STANDARD_ACTIVE_INCREMENT	1		/* Task tree thread normal operation */
     67 #define SUSPEND_ACTIVE_INCREMENT	2		/* Cause execution to suspend in the task tree thread
     68                                                This should only ever be used on the Background thread */
     69 
     70 #define HOSTFLAGS_DISABLE_BG_SLEEP  0       /* Host-controlled flag that determines whether we go to sleep
     71                                                at the end of BG */
     72 
     73 /* Minimal context save area for Hyper Forground */
     74 struct dsp_hf_save_area {
     75 	u32	r10_save;
     76 	u32	r54_save;
     77 	u32	r98_save;
     78 
     79 	___DSP_DUAL_16BIT_ALLOC(
     80 	    status_save,
     81 	    ind_save
     82 	)
     83 
     84 	___DSP_DUAL_16BIT_ALLOC(
     85 	    rci1_save,
     86 	    rci0_save
     87 	)
     88 
     89 	u32	r32_save;
     90 	u32	r76_save;
     91 	u32	rsd2_save;
     92 
     93        	___DSP_DUAL_16BIT_ALLOC(
     94 	      rsi2_save,	  /* See TaskTreeParameterBlock for
     95 				     remainder of registers  */
     96 	      rsa2Save
     97 	)
     98 	/* saved as part of HFG context  */
     99 };
    100 
    101 
    102 /* Task link data structure */
    103 struct dsp_tree_link {
    104 	___DSP_DUAL_16BIT_ALLOC(
    105 	/* Pointer to sibling task control block */
    106 	    next_scb,
    107 	/* Pointer to child task control block */
    108 	    sub_ptr
    109 	)
    110 
    111 	___DSP_DUAL_16BIT_ALLOC(
    112 	/* Pointer to code entry point */
    113 	    entry_point,
    114 	/* Pointer to local data */
    115 	    this_spb
    116 	)
    117 };
    118 
    119 
    120 struct dsp_task_tree_data {
    121 	___DSP_DUAL_16BIT_ALLOC(
    122 	/* Initial tock count; controls task tree execution rate */
    123 	    tock_count_limit,
    124 	/* Tock down counter */
    125 	    tock_count
    126 	)
    127 
    128 	/* Add to ActiveCount when TockCountLimit reached:
    129 	   Subtract on task tree termination */
    130 	___DSP_DUAL_16BIT_ALLOC(
    131 	    active_tncrement,
    132 	/* Number of pending activations for task tree */
    133 	    active_count
    134 	)
    135 
    136         ___DSP_DUAL_16BIT_ALLOC(
    137 	/* BitNumber to enable modification of correct bit in ActiveTaskFlags */
    138 	    active_bit,
    139 	/* Pointer to OS location for indicating current activity on task level */
    140 	    active_task_flags_ptr
    141 	)
    142 
    143 	/* Data structure for controlling movement of memory blocks:-
    144 	   currently unused */
    145 	___DSP_DUAL_16BIT_ALLOC(
    146 	    mem_upd_ptr,
    147 	/* Data structure for controlling synchronous link update */
    148 	    link_upd_ptr
    149 	)
    150 
    151 	___DSP_DUAL_16BIT_ALLOC(
    152 	/* Save area for remainder of full context. */
    153 	    save_area,
    154 	/* Address of start of local stack for data storage */
    155 	    data_stack_base_ptr
    156 	)
    157 
    158 };
    159 
    160 
    161 struct dsp_interval_timer_data
    162 {
    163 	/* These data items have the same relative locations to those */
    164 	___DSP_DUAL_16BIT_ALLOC(
    165 	     interval_timer_period,
    166 	     itd_unused
    167 	)
    168 
    169 	/* used for this data in the SPOS control block for SPOS 1.0 */
    170 	___DSP_DUAL_16BIT_ALLOC(
    171 	     num_FG_ticks_this_interval,
    172 	     num_intervals
    173 	)
    174 };
    175 
    176 
    177 /* This structure contains extra storage for the task tree
    178    Currently, this additional data is related only to a full context save */
    179 struct dsp_task_tree_context_block {
    180 	/* Up to 10 values are saved onto the stack.  8 for the task tree, 1 for
    181 	   The access to the context switch (call or interrupt), and 1 spare that
    182 	   users should never use.  This last may be required by the system */
    183 	___DSP_DUAL_16BIT_ALLOC(
    184 	     stack1,
    185 	     stack0
    186 	)
    187 	___DSP_DUAL_16BIT_ALLOC(
    188 	     stack3,
    189 	     stack2
    190 	)
    191 	___DSP_DUAL_16BIT_ALLOC(
    192 	     stack5,
    193 	     stack4
    194 	)
    195 	___DSP_DUAL_16BIT_ALLOC(
    196 	     stack7,
    197 	     stack6
    198 	)
    199 	___DSP_DUAL_16BIT_ALLOC(
    200 	     stack9,
    201 	     stack8
    202 	)
    203 
    204 	u32	  saverfe;
    205 
    206 	/* Value may be overwriten by stack save algorithm.
    207 	   Retain the size of the stack data saved here if used */
    208 	___DSP_DUAL_16BIT_ALLOC(
    209              reserved1,
    210   	     stack_size
    211 	)
    212 	u32		saverba;	  /* (HFG) */
    213 	u32		saverdc;
    214 	u32		savers_config_23; /* (HFG) */
    215 	u32		savers_DMA23;	  /* (HFG) */
    216 	u32		saversa0;
    217 	u32		saversi0;
    218 	u32		saversa1;
    219 	u32		saversi1;
    220 	u32		saversa3;
    221 	u32		saversd0;
    222 	u32		saversd1;
    223 	u32		saversd3;
    224 	u32		savers_config01;
    225 	u32		savers_DMA01;
    226 	u32		saveacc0hl;
    227 	u32		saveacc1hl;
    228 	u32		saveacc0xacc1x;
    229 	u32		saveacc2hl;
    230 	u32		saveacc3hl;
    231 	u32		saveacc2xacc3x;
    232 	u32		saveaux0hl;
    233 	u32		saveaux1hl;
    234 	u32		saveaux0xaux1x;
    235 	u32		saveaux2hl;
    236 	u32		saveaux3hl;
    237 	u32		saveaux2xaux3x;
    238 	u32		savershouthl;
    239 	u32		savershoutxmacmode;
    240 };
    241 
    242 
    243 struct dsp_task_tree_control_block {
    244 	struct dsp_hf_save_area			context;
    245 	struct dsp_tree_link			links;
    246 	struct dsp_task_tree_data		data;
    247 	struct dsp_task_tree_context_block	context_blk;
    248 	struct dsp_interval_timer_data		int_timer;
    249 };
    250 
    251 
    252 #endif /* __DSP_TASK_TYPES_H__ */
    253