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_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 overwritten 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