Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/ide-2.6
[pandora-kernel.git] / include / sound / cs46xx_dsp_task_types.h
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 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__ */