treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 156
[sfrench/cifs-2.6.git] / sound / pci / cs46xx / cs46xx_dsp_task_types.h
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__ */