1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (C) 2014 Imagination Technologies Ltd.
7  *
8  */
9 
10 #ifndef __ASM_ASM_EVA_H
11 #define __ASM_ASM_EVA_H
12 
13 #ifndef __ASSEMBLY__
14 
15 /* Kernel variants */
16 
17 #define kernel_cache(op, base)		"cache " op ", " base "\n"
18 #define kernel_pref(hint, base)		"pref " hint ", " base "\n"
19 #define kernel_ll(reg, addr)		"ll " reg ", " addr "\n"
20 #define kernel_sc(reg, addr)		"sc " reg ", " addr "\n"
21 #define kernel_lw(reg, addr)		"lw " reg ", " addr "\n"
22 #define kernel_lwl(reg, addr)		"lwl " reg ", " addr "\n"
23 #define kernel_lwr(reg, addr)		"lwr " reg ", " addr "\n"
24 #define kernel_lh(reg, addr)		"lh " reg ", " addr "\n"
25 #define kernel_lb(reg, addr)		"lb " reg ", " addr "\n"
26 #define kernel_lbu(reg, addr)		"lbu " reg ", " addr "\n"
27 #define kernel_sw(reg, addr)		"sw " reg ", " addr "\n"
28 #define kernel_swl(reg, addr)		"swl " reg ", " addr "\n"
29 #define kernel_swr(reg, addr)		"swr " reg ", " addr "\n"
30 #define kernel_sh(reg, addr)		"sh " reg ", " addr "\n"
31 #define kernel_sb(reg, addr)		"sb " reg ", " addr "\n"
32 
33 #ifdef CONFIG_32BIT
34 /*
35  * No 'sd' or 'ld' instructions in 32-bit but the code will
36  * do the correct thing
37  */
38 #define kernel_sd(reg, addr)		user_sw(reg, addr)
39 #define kernel_ld(reg, addr)		user_lw(reg, addr)
40 #else
41 #define kernel_sd(reg, addr)		"sd " reg", " addr "\n"
42 #define kernel_ld(reg, addr)		"ld " reg", " addr "\n"
43 #endif /* CONFIG_32BIT */
44 
45 #ifdef CONFIG_EVA
46 
47 #define __BUILD_EVA_INSN(insn, reg, addr)				\
48 				"	.set	push\n"			\
49 				"	.set	mips0\n"		\
50 				"	.set	eva\n"			\
51 				"	"insn" "reg", "addr "\n"	\
52 				"	.set	pop\n"
53 
54 #define user_cache(op, base)		__BUILD_EVA_INSN("cachee", op, base)
55 #define user_pref(hint, base)		__BUILD_EVA_INSN("prefe", hint, base)
56 #define user_ll(reg, addr)		__BUILD_EVA_INSN("lle", reg, addr)
57 #define user_sc(reg, addr)		__BUILD_EVA_INSN("sce", reg, addr)
58 #define user_lw(reg, addr)		__BUILD_EVA_INSN("lwe", reg, addr)
59 #define user_lwl(reg, addr)		__BUILD_EVA_INSN("lwle", reg, addr)
60 #define user_lwr(reg, addr)		__BUILD_EVA_INSN("lwre", reg, addr)
61 #define user_lh(reg, addr)		__BUILD_EVA_INSN("lhe", reg, addr)
62 #define user_lb(reg, addr)		__BUILD_EVA_INSN("lbe", reg, addr)
63 #define user_lbu(reg, addr)		__BUILD_EVA_INSN("lbue", reg, addr)
64 /* No 64-bit EVA instruction for loading double words */
65 #define user_ld(reg, addr)		user_lw(reg, addr)
66 #define user_sw(reg, addr)		__BUILD_EVA_INSN("swe", reg, addr)
67 #define user_swl(reg, addr)		__BUILD_EVA_INSN("swle", reg, addr)
68 #define user_swr(reg, addr)		__BUILD_EVA_INSN("swre", reg, addr)
69 #define user_sh(reg, addr)		__BUILD_EVA_INSN("she", reg, addr)
70 #define user_sb(reg, addr)		__BUILD_EVA_INSN("sbe", reg, addr)
71 /* No 64-bit EVA instruction for storing double words */
72 #define user_sd(reg, addr)		user_sw(reg, addr)
73 
74 #else
75 
76 #define user_cache(op, base)		kernel_cache(op, base)
77 #define user_pref(hint, base)		kernel_pref(hint, base)
78 #define user_ll(reg, addr)		kernel_ll(reg, addr)
79 #define user_sc(reg, addr)		kernel_sc(reg, addr)
80 #define user_lw(reg, addr)		kernel_lw(reg, addr)
81 #define user_lwl(reg, addr)		kernel_lwl(reg, addr)
82 #define user_lwr(reg, addr)		kernel_lwr(reg, addr)
83 #define user_lh(reg, addr)		kernel_lh(reg, addr)
84 #define user_lb(reg, addr)		kernel_lb(reg, addr)
85 #define user_lbu(reg, addr)		kernel_lbu(reg, addr)
86 #define user_sw(reg, addr)		kernel_sw(reg, addr)
87 #define user_swl(reg, addr)		kernel_swl(reg, addr)
88 #define user_swr(reg, addr)		kernel_swr(reg, addr)
89 #define user_sh(reg, addr)		kernel_sh(reg, addr)
90 #define user_sb(reg, addr)		kernel_sb(reg, addr)
91 
92 #ifdef CONFIG_32BIT
93 #define user_sd(reg, addr)		kernel_sw(reg, addr)
94 #define user_ld(reg, addr)		kernel_lw(reg, addr)
95 #else
96 #define user_sd(reg, addr)		kernel_sd(reg, addr)
97 #define user_ld(reg, addr)		kernel_ld(reg, addr)
98 #endif /* CONFIG_32BIT */
99 
100 #endif /* CONFIG_EVA */
101 
102 #else /* __ASSEMBLY__ */
103 
104 #define kernel_cache(op, base)		cache op, base
105 #define kernel_pref(hint, base)		pref hint, base
106 #define kernel_ll(reg, addr)		ll reg, addr
107 #define kernel_sc(reg, addr)		sc reg, addr
108 #define kernel_lw(reg, addr)		lw reg, addr
109 #define kernel_lwl(reg, addr)		lwl reg, addr
110 #define kernel_lwr(reg, addr)		lwr reg, addr
111 #define kernel_lh(reg, addr)		lh reg, addr
112 #define kernel_lb(reg, addr)		lb reg, addr
113 #define kernel_lbu(reg, addr)		lbu reg, addr
114 #define kernel_sw(reg, addr)		sw reg, addr
115 #define kernel_swl(reg, addr)		swl reg, addr
116 #define kernel_swr(reg, addr)		swr reg, addr
117 #define kernel_sh(reg, addr)		sh reg, addr
118 #define kernel_sb(reg, addr)		sb reg, addr
119 
120 #ifdef CONFIG_32BIT
121 /*
122  * No 'sd' or 'ld' instructions in 32-bit but the code will
123  * do the correct thing
124  */
125 #define kernel_sd(reg, addr)		user_sw(reg, addr)
126 #define kernel_ld(reg, addr)		user_lw(reg, addr)
127 #else
128 #define kernel_sd(reg, addr)		sd reg, addr
129 #define kernel_ld(reg, addr)		ld reg, addr
130 #endif /* CONFIG_32BIT */
131 
132 #ifdef CONFIG_EVA
133 
134 #define __BUILD_EVA_INSN(insn, reg, addr)			\
135 				.set	push;			\
136 				.set	mips0;			\
137 				.set	eva;			\
138 				insn reg, addr;			\
139 				.set	pop;
140 
141 #define user_cache(op, base)		__BUILD_EVA_INSN(cachee, op, base)
142 #define user_pref(hint, base)		__BUILD_EVA_INSN(prefe, hint, base)
143 #define user_ll(reg, addr)		__BUILD_EVA_INSN(lle, reg, addr)
144 #define user_sc(reg, addr)		__BUILD_EVA_INSN(sce, reg, addr)
145 #define user_lw(reg, addr)		__BUILD_EVA_INSN(lwe, reg, addr)
146 #define user_lwl(reg, addr)		__BUILD_EVA_INSN(lwle, reg, addr)
147 #define user_lwr(reg, addr)		__BUILD_EVA_INSN(lwre, reg, addr)
148 #define user_lh(reg, addr)		__BUILD_EVA_INSN(lhe, reg, addr)
149 #define user_lb(reg, addr)		__BUILD_EVA_INSN(lbe, reg, addr)
150 #define user_lbu(reg, addr)		__BUILD_EVA_INSN(lbue, reg, addr)
151 /* No 64-bit EVA instruction for loading double words */
152 #define user_ld(reg, addr)		user_lw(reg, addr)
153 #define user_sw(reg, addr)		__BUILD_EVA_INSN(swe, reg, addr)
154 #define user_swl(reg, addr)		__BUILD_EVA_INSN(swle, reg, addr)
155 #define user_swr(reg, addr)		__BUILD_EVA_INSN(swre, reg, addr)
156 #define user_sh(reg, addr)		__BUILD_EVA_INSN(she, reg, addr)
157 #define user_sb(reg, addr)		__BUILD_EVA_INSN(sbe, reg, addr)
158 /* No 64-bit EVA instruction for loading double words */
159 #define user_sd(reg, addr)		user_sw(reg, addr)
160 #else
161 
162 #define user_cache(op, base)		kernel_cache(op, base)
163 #define user_pref(hint, base)		kernel_pref(hint, base)
164 #define user_ll(reg, addr)		kernel_ll(reg, addr)
165 #define user_sc(reg, addr)		kernel_sc(reg, addr)
166 #define user_lw(reg, addr)		kernel_lw(reg, addr)
167 #define user_lwl(reg, addr)		kernel_lwl(reg, addr)
168 #define user_lwr(reg, addr)		kernel_lwr(reg, addr)
169 #define user_lh(reg, addr)		kernel_lh(reg, addr)
170 #define user_lb(reg, addr)		kernel_lb(reg, addr)
171 #define user_lbu(reg, addr)		kernel_lbu(reg, addr)
172 #define user_sw(reg, addr)		kernel_sw(reg, addr)
173 #define user_swl(reg, addr)		kernel_swl(reg, addr)
174 #define user_swr(reg, addr)		kernel_swr(reg, addr)
175 #define user_sh(reg, addr)		kernel_sh(reg, addr)
176 #define user_sb(reg, addr)		kernel_sb(reg, addr)
177 
178 #ifdef CONFIG_32BIT
179 #define user_sd(reg, addr)		kernel_sw(reg, addr)
180 #define user_ld(reg, addr)		kernel_lw(reg, addr)
181 #else
182 #define user_sd(reg, addr)		kernel_sd(reg, addr)
183 #define user_ld(reg, addr)		kernel_ld(reg, addr)
184 #endif /* CONFIG_32BIT */
185 
186 #endif /* CONFIG_EVA */
187 
188 #endif /* __ASSEMBLY__ */
189 
190 #endif /* __ASM_ASM_EVA_H */
191