root/sound/pci/cs46xx/cs46xx_dsp_task_types.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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__ */

/* [<][>][^][v][top][bottom][index][help] */