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