0001
0002
0003
0004
0005
0006 #ifndef _ASM_DSP_H
0007 #define _ASM_DSP_H
0008
0009 #include <asm/cpu.h>
0010 #include <asm/cpu-features.h>
0011 #include <asm/hazards.h>
0012 #include <asm/mipsregs.h>
0013
0014 #define DSP_DEFAULT 0x00000000
0015 #define DSP_MASK 0x3f
0016
0017 #define __enable_dsp_hazard() \
0018 do { \
0019 asm("_ehb"); \
0020 } while (0)
0021
0022 static inline void __init_dsp(void)
0023 {
0024 mthi1(0);
0025 mtlo1(0);
0026 mthi2(0);
0027 mtlo2(0);
0028 mthi3(0);
0029 mtlo3(0);
0030 wrdsp(DSP_DEFAULT, DSP_MASK);
0031 }
0032
0033 static inline void init_dsp(void)
0034 {
0035 if (cpu_has_dsp)
0036 __init_dsp();
0037 }
0038
0039 #define __save_dsp(tsk) \
0040 do { \
0041 tsk->thread.dsp.dspr[0] = mfhi1(); \
0042 tsk->thread.dsp.dspr[1] = mflo1(); \
0043 tsk->thread.dsp.dspr[2] = mfhi2(); \
0044 tsk->thread.dsp.dspr[3] = mflo2(); \
0045 tsk->thread.dsp.dspr[4] = mfhi3(); \
0046 tsk->thread.dsp.dspr[5] = mflo3(); \
0047 tsk->thread.dsp.dspcontrol = rddsp(DSP_MASK); \
0048 } while (0)
0049
0050 #define save_dsp(tsk) \
0051 do { \
0052 if (cpu_has_dsp) \
0053 __save_dsp(tsk); \
0054 } while (0)
0055
0056 #define __restore_dsp(tsk) \
0057 do { \
0058 mthi1(tsk->thread.dsp.dspr[0]); \
0059 mtlo1(tsk->thread.dsp.dspr[1]); \
0060 mthi2(tsk->thread.dsp.dspr[2]); \
0061 mtlo2(tsk->thread.dsp.dspr[3]); \
0062 mthi3(tsk->thread.dsp.dspr[4]); \
0063 mtlo3(tsk->thread.dsp.dspr[5]); \
0064 wrdsp(tsk->thread.dsp.dspcontrol, DSP_MASK); \
0065 } while (0)
0066
0067 #define restore_dsp(tsk) \
0068 do { \
0069 if (cpu_has_dsp) \
0070 __restore_dsp(tsk); \
0071 } while (0)
0072
0073 #define __get_dsp_regs(tsk) \
0074 ({ \
0075 if (tsk == current) \
0076 __save_dsp(current); \
0077 \
0078 tsk->thread.dsp.dspr; \
0079 })
0080
0081 #endif