Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * Copyright (C) 2005 Mips Technologies
0004  * Author: Chris Dearman, chris@mips.com derived from fpu.h
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 /* _ASM_DSP_H */