xref: /openbmc/linux/arch/mips/include/asm/dsp.h (revision 2874c5fd)
12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
2384740dcSRalf Baechle /*
3384740dcSRalf Baechle  * Copyright (C) 2005 Mips Technologies
4384740dcSRalf Baechle  * Author: Chris Dearman, chris@mips.com derived from fpu.h
5384740dcSRalf Baechle  */
6384740dcSRalf Baechle #ifndef _ASM_DSP_H
7384740dcSRalf Baechle #define _ASM_DSP_H
8384740dcSRalf Baechle 
9384740dcSRalf Baechle #include <asm/cpu.h>
10384740dcSRalf Baechle #include <asm/cpu-features.h>
11384740dcSRalf Baechle #include <asm/hazards.h>
12384740dcSRalf Baechle #include <asm/mipsregs.h>
13384740dcSRalf Baechle 
14384740dcSRalf Baechle #define DSP_DEFAULT	0x00000000
156829aeaeSSteven J. Hill #define DSP_MASK	0x3f
16384740dcSRalf Baechle 
17384740dcSRalf Baechle #define __enable_dsp_hazard()						\
18384740dcSRalf Baechle do {									\
19384740dcSRalf Baechle 	asm("_ehb");							\
20384740dcSRalf Baechle } while (0)
21384740dcSRalf Baechle 
__init_dsp(void)22384740dcSRalf Baechle static inline void __init_dsp(void)
23384740dcSRalf Baechle {
24384740dcSRalf Baechle 	mthi1(0);
25384740dcSRalf Baechle 	mtlo1(0);
26384740dcSRalf Baechle 	mthi2(0);
27384740dcSRalf Baechle 	mtlo2(0);
28384740dcSRalf Baechle 	mthi3(0);
29384740dcSRalf Baechle 	mtlo3(0);
30384740dcSRalf Baechle 	wrdsp(DSP_DEFAULT, DSP_MASK);
31384740dcSRalf Baechle }
32384740dcSRalf Baechle 
init_dsp(void)33384740dcSRalf Baechle static inline void init_dsp(void)
34384740dcSRalf Baechle {
35384740dcSRalf Baechle 	if (cpu_has_dsp)
36384740dcSRalf Baechle 		__init_dsp();
37384740dcSRalf Baechle }
38384740dcSRalf Baechle 
39384740dcSRalf Baechle #define __save_dsp(tsk)							\
40384740dcSRalf Baechle do {									\
41384740dcSRalf Baechle 	tsk->thread.dsp.dspr[0] = mfhi1();				\
42384740dcSRalf Baechle 	tsk->thread.dsp.dspr[1] = mflo1();				\
43384740dcSRalf Baechle 	tsk->thread.dsp.dspr[2] = mfhi2();				\
44384740dcSRalf Baechle 	tsk->thread.dsp.dspr[3] = mflo2();				\
45384740dcSRalf Baechle 	tsk->thread.dsp.dspr[4] = mfhi3();				\
46384740dcSRalf Baechle 	tsk->thread.dsp.dspr[5] = mflo3();				\
47384740dcSRalf Baechle 	tsk->thread.dsp.dspcontrol = rddsp(DSP_MASK);			\
48384740dcSRalf Baechle } while (0)
49384740dcSRalf Baechle 
50384740dcSRalf Baechle #define save_dsp(tsk)							\
51384740dcSRalf Baechle do {									\
52384740dcSRalf Baechle 	if (cpu_has_dsp)						\
53384740dcSRalf Baechle 		__save_dsp(tsk);					\
54384740dcSRalf Baechle } while (0)
55384740dcSRalf Baechle 
56384740dcSRalf Baechle #define __restore_dsp(tsk)						\
57384740dcSRalf Baechle do {									\
58384740dcSRalf Baechle 	mthi1(tsk->thread.dsp.dspr[0]);					\
59384740dcSRalf Baechle 	mtlo1(tsk->thread.dsp.dspr[1]);					\
60384740dcSRalf Baechle 	mthi2(tsk->thread.dsp.dspr[2]);					\
61384740dcSRalf Baechle 	mtlo2(tsk->thread.dsp.dspr[3]);					\
62384740dcSRalf Baechle 	mthi3(tsk->thread.dsp.dspr[4]);					\
63384740dcSRalf Baechle 	mtlo3(tsk->thread.dsp.dspr[5]);					\
64384740dcSRalf Baechle 	wrdsp(tsk->thread.dsp.dspcontrol, DSP_MASK);			\
65384740dcSRalf Baechle } while (0)
66384740dcSRalf Baechle 
67384740dcSRalf Baechle #define restore_dsp(tsk)						\
68384740dcSRalf Baechle do {									\
69384740dcSRalf Baechle 	if (cpu_has_dsp)						\
70384740dcSRalf Baechle 		__restore_dsp(tsk);					\
71384740dcSRalf Baechle } while (0)
72384740dcSRalf Baechle 
73384740dcSRalf Baechle #define __get_dsp_regs(tsk)						\
74384740dcSRalf Baechle ({									\
75384740dcSRalf Baechle 	if (tsk == current)						\
76384740dcSRalf Baechle 		__save_dsp(current);					\
77384740dcSRalf Baechle 									\
78384740dcSRalf Baechle 	tsk->thread.dsp.dspr;						\
79384740dcSRalf Baechle })
80384740dcSRalf Baechle 
81384740dcSRalf Baechle #endif /* _ASM_DSP_H */
82