Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / sound / pci / cs46xx / cs46xx_dsp_task_types.h
diff --git a/kernel/sound/pci/cs46xx/cs46xx_dsp_task_types.h b/kernel/sound/pci/cs46xx/cs46xx_dsp_task_types.h
new file mode 100644 (file)
index 0000000..5cf920b
--- /dev/null
@@ -0,0 +1,252 @@
+/*
+ *  The driver for the Cirrus Logic's Sound Fusion CS46XX based soundcards
+ *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
+ *
+ *
+ *   This program is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *
+ *
+ * NOTE: comments are copy/paste from cwcemb80.lst 
+ * provided by Tom Woller at Cirrus (my only
+ * documentation about the SP OS running inside
+ * the DSP) 
+ */
+
+#ifndef __CS46XX_DSP_TASK_TYPES_H__
+#define __CS46XX_DSP_TASK_TYPES_H__
+
+#include "cs46xx_dsp_scb_types.h"
+
+/*********************************************************************************************
+Example hierarchy of stream control blocks in the SP
+
+hfgTree
+Ptr____Call (c)
+       \
+ -------+------         -------------      -------------      -------------      -----
+| SBlaster IF  |______\| Foreground  |___\| Middlegr'nd |___\| Background  |___\| Nul |
+|              |Goto  /| tree header |g  /| tree header |g  /| tree header |g  /| SCB |r
+ -------------- (g)     -------------      -------------      -------------      -----
+       |c                     |c                 |c                 |c
+       |                      |                  |                  |
+      \/                  -------------      -------------      -------------   
+                       | Foreground  |_\  | Middlegr'nd |_\  | Background  |_\
+                       |     tree    |g/  |    tree     |g/  |     tree    |g/
+                        -------------      -------------      -------------   
+                              |c                 |c                 |c
+                              |                  |                  | 
+                             \/                 \/                 \/ 
+
+*********************************************************************************************/
+
+#define                HFG_FIRST_EXECUTE_MODE                  0x0001
+#define                HFG_FIRST_EXECUTE_MODE_BIT              0
+#define                HFG_CONTEXT_SWITCH_MODE                 0x0002
+#define                HFG_CONTEXT_SWITCH_MODE_BIT             1
+
+#define MAX_FG_STACK_SIZE      32                      /* THESE NEED TO BE COMPUTED PROPERLY */
+#define MAX_MG_STACK_SIZE      16
+#define MAX_BG_STACK_SIZE      9
+#define MAX_HFG_STACK_SIZE     4
+
+#define SLEEP_ACTIVE_INCREMENT         0               /* Enable task tree thread to go to sleep
+                                                                                          This should only ever be used on the Background thread */
+#define STANDARD_ACTIVE_INCREMENT      1               /* Task tree thread normal operation */
+#define SUSPEND_ACTIVE_INCREMENT       2               /* Cause execution to suspend in the task tree thread
+                                               This should only ever be used on the Background thread */
+
+#define HOSTFLAGS_DISABLE_BG_SLEEP  0       /* Host-controlled flag that determines whether we go to sleep
+                                               at the end of BG */
+
+/* Minimal context save area for Hyper Forground */
+struct dsp_hf_save_area {
+       u32     r10_save;
+       u32     r54_save;
+       u32     r98_save;
+
+       ___DSP_DUAL_16BIT_ALLOC(
+           status_save,
+           ind_save
+       )
+
+       ___DSP_DUAL_16BIT_ALLOC(
+           rci1_save,
+           rci0_save
+       )
+
+       u32     r32_save;
+       u32     r76_save;
+       u32     rsd2_save;
+
+               ___DSP_DUAL_16BIT_ALLOC(
+             rsi2_save,          /* See TaskTreeParameterBlock for 
+                                    remainder of registers  */
+             rsa2Save
+       )
+       /* saved as part of HFG context  */
+};
+
+
+/* Task link data structure */
+struct dsp_tree_link {
+       ___DSP_DUAL_16BIT_ALLOC(
+       /* Pointer to sibling task control block */
+           next_scb,
+       /* Pointer to child task control block */
+           sub_ptr
+       )
+  
+       ___DSP_DUAL_16BIT_ALLOC(
+       /* Pointer to code entry point */
+           entry_point, 
+       /* Pointer to local data */
+           this_spb
+       )
+};
+
+
+struct dsp_task_tree_data {
+       ___DSP_DUAL_16BIT_ALLOC(
+       /* Initial tock count; controls task tree execution rate */
+           tock_count_limit,
+       /* Tock down counter */
+           tock_count
+       )
+
+       /* Add to ActiveCount when TockCountLimit reached: 
+          Subtract on task tree termination */
+       ___DSP_DUAL_16BIT_ALLOC(
+           active_tncrement,           
+       /* Number of pending activations for task tree */
+           active_count
+       )
+
+        ___DSP_DUAL_16BIT_ALLOC(
+       /* BitNumber to enable modification of correct bit in ActiveTaskFlags */
+           active_bit,     
+       /* Pointer to OS location for indicating current activity on task level */
+           active_task_flags_ptr
+       )
+
+       /* Data structure for controlling movement of memory blocks:- 
+          currently unused */
+       ___DSP_DUAL_16BIT_ALLOC(
+           mem_upd_ptr,
+       /* Data structure for controlling synchronous link update */
+           link_upd_ptr
+       )
+  
+       ___DSP_DUAL_16BIT_ALLOC(
+       /* Save area for remainder of full context. */
+           save_area,
+       /* Address of start of local stack for data storage */
+           data_stack_base_ptr
+       )
+
+};
+
+
+struct dsp_interval_timer_data
+{
+       /* These data items have the same relative locations to those */
+       ___DSP_DUAL_16BIT_ALLOC(
+            interval_timer_period,
+            itd_unused
+       )
+
+       /* used for this data in the SPOS control block for SPOS 1.0 */
+       ___DSP_DUAL_16BIT_ALLOC(
+            num_FG_ticks_this_interval,        
+            num_intervals
+       )
+};
+
+
+/* This structure contains extra storage for the task tree
+   Currently, this additional data is related only to a full context save */
+struct dsp_task_tree_context_block {
+       /* Up to 10 values are saved onto the stack.  8 for the task tree, 1 for
+          The access to the context switch (call or interrupt), and 1 spare that
+          users should never use.  This last may be required by the system */
+       ___DSP_DUAL_16BIT_ALLOC(
+            stack1,
+            stack0
+       )
+       ___DSP_DUAL_16BIT_ALLOC(
+            stack3,
+            stack2
+       )
+       ___DSP_DUAL_16BIT_ALLOC(
+            stack5,
+            stack4
+       )
+       ___DSP_DUAL_16BIT_ALLOC(
+            stack7,
+            stack6
+       )
+       ___DSP_DUAL_16BIT_ALLOC(
+            stack9,
+            stack8
+       )
+
+       u32       saverfe;                                      
+
+       /* Value may be overwriten by stack save algorithm.
+          Retain the size of the stack data saved here if used */
+       ___DSP_DUAL_16BIT_ALLOC(
+             reserved1,        
+            stack_size
+       )
+       u32             saverba;          /* (HFG) */
+       u32             saverdc;
+       u32             savers_config_23; /* (HFG) */
+       u32             savers_DMA23;     /* (HFG) */
+       u32             saversa0;
+       u32             saversi0;
+       u32             saversa1;
+       u32             saversi1;
+       u32             saversa3;
+       u32             saversd0;
+       u32             saversd1;
+       u32             saversd3;
+       u32             savers_config01;
+       u32             savers_DMA01;
+       u32             saveacc0hl;
+       u32             saveacc1hl;
+       u32             saveacc0xacc1x;
+       u32             saveacc2hl;
+       u32             saveacc3hl;
+       u32             saveacc2xacc3x;
+       u32             saveaux0hl;
+       u32             saveaux1hl;
+       u32             saveaux0xaux1x;
+       u32             saveaux2hl;
+       u32             saveaux3hl;
+       u32             saveaux2xaux3x;
+       u32             savershouthl;
+       u32             savershoutxmacmode;
+};
+                
+
+struct dsp_task_tree_control_block {
+       struct dsp_hf_save_area                 context;
+       struct dsp_tree_link                    links;
+       struct dsp_task_tree_data               data;
+       struct dsp_task_tree_context_block      context_blk;
+       struct dsp_interval_timer_data          int_timer;
+};
+
+
+#endif /* __DSP_TASK_TYPES_H__ */