File Index
Files and directories
Sign in
FILE

cs46xx_dsp_task_types.h

File preview with syntax highlighting.

linux-6.19.14/sound/pci/cs46xx/cs46xx_dsp_task_types.h C
  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__ */
~/ Read-only file preview.