Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* |
| 2 | * The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards |
Jaroslav Kysela | c1017a4 | 2007-10-15 09:50:19 +0200 | [diff] [blame] | 3 | * Copyright (c) by Jaroslav Kysela <perex@perex.cz> |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 */ |
Takashi Iwai | 3d19f80 | 2005-11-17 14:48:14 +0100 | [diff] [blame] | 74 | struct dsp_hf_save_area { |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 */ |
Takashi Iwai | 3d19f80 | 2005-11-17 14:48:14 +0100 | [diff] [blame] | 99 | }; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 100 | |
| 101 | |
| 102 | /* Task link data structure */ |
Takashi Iwai | 3d19f80 | 2005-11-17 14:48:14 +0100 | [diff] [blame] | 103 | struct dsp_tree_link { |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | ) |
Takashi Iwai | 3d19f80 | 2005-11-17 14:48:14 +0100 | [diff] [blame] | 117 | }; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 118 | |
| 119 | |
Takashi Iwai | 3d19f80 | 2005-11-17 14:48:14 +0100 | [diff] [blame] | 120 | struct dsp_task_tree_data { |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | |
Takashi Iwai | 3d19f80 | 2005-11-17 14:48:14 +0100 | [diff] [blame] | 158 | }; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 159 | |
| 160 | |
Takashi Iwai | 3d19f80 | 2005-11-17 14:48:14 +0100 | [diff] [blame] | 161 | struct dsp_interval_timer_data |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | ) |
Takashi Iwai | 3d19f80 | 2005-11-17 14:48:14 +0100 | [diff] [blame] | 174 | }; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 */ |
Takashi Iwai | 3d19f80 | 2005-11-17 14:48:14 +0100 | [diff] [blame] | 179 | struct dsp_task_tree_context_block { |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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; |
Takashi Iwai | 3d19f80 | 2005-11-17 14:48:14 +0100 | [diff] [blame] | 240 | }; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 241 | |
| 242 | |
Takashi Iwai | 3d19f80 | 2005-11-17 14:48:14 +0100 | [diff] [blame] | 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 | }; |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 250 | |
| 251 | |
| 252 | #endif /* __DSP_TASK_TYPES_H__ */ |