xref: /linux/sound/pci/cs46xx/cs46xx_dsp_task_types.h (revision 4413e16d9d21673bb5048a2e542f1aaa00015c2e)
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__ */
253