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/*********************************************************************************************
18Example hierarchy of stream control blocks in the SP
19
20hfgTree
21Ptr____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 */
59struct 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 */
88struct 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
105struct 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
146struct 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 */
164struct 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
228struct 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

source code of linux/sound/pci/cs46xx/cs46xx_dsp_task_types.h