octeon_cop2var.h revision 1.2 1 1.2 simonb /* $NetBSD: octeon_cop2var.h,v 1.2 2020/06/18 13:52:08 simonb Exp $ */
2 1.1 hikaru
3 1.1 hikaru /*
4 1.1 hikaru * TODO:
5 1.1 hikaru *
6 1.1 hikaru * - Utilize prefetch.
7 1.1 hikaru *
8 1.1 hikaru * - Implement loop in CBC operations. Take an argument of the number of
9 1.1 hikaru * blocks. Better if prefetch is used too.
10 1.1 hikaru *
11 1.1 hikaru * - In AES and DES buffer block loop, merge encrypt / decrypt. Take a
12 1.1 hikaru * direction argument (int dir, 0 => encrypt, 1 => decrypt) then branch.
13 1.1 hikaru */
14 1.1 hikaru
15 1.2 simonb #ifndef _OCTEON_COP2VAR_H_
16 1.2 simonb #define _OCTEON_COP2VAR_H_
17 1.1 hikaru
18 1.1 hikaru #ifdef __OCTEON_USEUN__
19 1.1 hikaru #define CNASM_ULD(r, o, b) "uld %["#r"], "#o"(%["#b"]) \n\t"
20 1.1 hikaru #define CNASM_USD(r, o, b) "usd %["#r"], "#o"(%["#b"]) \n\t"
21 1.1 hikaru #define CNASM_ULW(r, o, b) "ulw %["#r"], "#o"(%["#b"]) \n\t"
22 1.1 hikaru #define CNASM_USW(r, o, b) "usw %["#r"], "#o"(%["#b"]) \n\t"
23 1.1 hikaru #else
24 1.1 hikaru #define __CNASM_ULH(i, r, o, x, b) i" %["#r"], ("#o" + "#x")(%["#b"]) \n\t"
25 1.1 hikaru #define __CNASM_ULS(p, r, o, l, h, b) __CNASM_ULH(#p"l", r, o, l, b) \
26 1.1 hikaru __CNASM_ULH(#p"r", r, o, h, b)
27 1.1 hikaru #define CNASM_ULD(r, o, b) __CNASM_ULS(ld, r, o, 0, 7, b)
28 1.1 hikaru #define CNASM_USD(r, o, b) __CNASM_ULS(sd, r, o, 0, 7, b)
29 1.1 hikaru #define CNASM_ULW(r, o, b) __CNASM_ULS(lw, r, o, 0, 3, b)
30 1.1 hikaru #define CNASM_USW(r, o, b) __CNASM_ULS(sw, r, o, 0, 3, b)
31 1.1 hikaru #endif
32 1.1 hikaru
33 1.1 hikaru #define CNASM_ALD(r, o, b) "ld %["#r"], "#o"(%["#b"]) \n\t"
34 1.1 hikaru #define CNASM_ASD(r, o, b) "sd %["#r"], "#o"(%["#b"]) \n\t"
35 1.1 hikaru
36 1.1 hikaru #undef __s
37 1.1 hikaru #define __s(s) #s /* stringify */
38 1.1 hikaru #define CNASM_MT2(r, n, o) "dmtc2 %["#r"], ("__s(n)" + "#o") \n\t"
39 1.1 hikaru #define CNASM_MF2(r, n, o) "dmfc2 %["#r"], ("__s(n)" + "#o") \n\t"
40 1.1 hikaru #define CNASM_MT2ZERO(n, o) "dmtc2 $0, ("__s(n)" + "#o") \n\t"
41 1.1 hikaru #define CNASM_MT2ZERO(n, o) "dmtc2 $0, ("__s(n)" + "#o") \n\t"
42 1.1 hikaru
43 1.1 hikaru #define CNASM_START() ".set push \n\t" \
44 1.1 hikaru ".set mips64 \n\t" \
45 1.1 hikaru ".set arch=octeon \n\t" \
46 1.1 hikaru ".set noreorder \n\t"
47 1.1 hikaru #define CNASM_END() ".set pop"
48 1.1 hikaru
49 1.1 hikaru #define __aligned_t uint64_t
50 1.1 hikaru #define __unaligned_t uint8_t
51 1.1 hikaru
52 1.1 hikaru /* -------------------------------------------------------------------------- */
53 1.1 hikaru
54 1.1 hikaru /* AES */
55 1.1 hikaru
56 1.1 hikaru #define __octeon_cop2_aes_set_key_au_vaddr64(au, AU) \
57 1.1 hikaru static inline void \
58 1.1 hikaru octeon_cop2_aes_set_key_##au##_vaddr64(uint64_t key, uint32_t klen) \
59 1.1 hikaru { \
60 1.1 hikaru uint64_t tmp0, tmp1, tmp2, tmp3; \
61 1.1 hikaru \
62 1.1 hikaru asm volatile ( \
63 1.1 hikaru CNASM_START() \
64 1.1 hikaru /* %[cnt] is either 4 (256), 3 (192), or 2 (128) */ \
65 1.1 hikaru /* Each operation set AESKEYLEN of cop2 also */ \
66 1.1 hikaru /* >= 64 */ \
67 1.1 hikaru CNASM_##AU##LD(tmp0, 0, key) \
68 1.1 hikaru " subu %[cnt], %[cnt], 1 \n" \
69 1.1 hikaru " beqz %[cnt], 1f \n" \
70 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_AES_KEY, 0) /* delay slot */ \
71 1.1 hikaru /* >= 128 */ \
72 1.1 hikaru CNASM_##AU##LD(tmp1, 8, key) \
73 1.1 hikaru " subu %[cnt], %[cnt], 1 \n" \
74 1.1 hikaru " beqz %[cnt], 1f \n" \
75 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_AES_KEY, 1) /* delay slot */ \
76 1.1 hikaru /* >= 192 */ \
77 1.1 hikaru CNASM_##AU##LD(tmp2, 16, key) \
78 1.1 hikaru " subu %[cnt], %[cnt], 1 \n" \
79 1.1 hikaru " beqz %[cnt], 1f \n" \
80 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_AES_KEY, 2) /* delay slot */ \
81 1.1 hikaru /* >= 256 */ \
82 1.1 hikaru CNASM_##AU##LD(tmp3, 24, key) \
83 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_AES_KEY, 3) \
84 1.1 hikaru /* done */ \
85 1.1 hikaru "1: \n" \
86 1.1 hikaru CNASM_END() \
87 1.1 hikaru : [tmp0] "=&r" (tmp0), \
88 1.1 hikaru [tmp1] "=&r" (tmp1), \
89 1.1 hikaru [tmp2] "=&r" (tmp2), \
90 1.1 hikaru [tmp3] "=&r" (tmp3) \
91 1.1 hikaru : [key] "d" (key), \
92 1.1 hikaru [cnt] "d" (klen >> 6)); \
93 1.1 hikaru }
94 1.1 hikaru
95 1.1 hikaru #define __octeon_cop2_aes_set_key_au_ptr(au, AU, ptr) \
96 1.1 hikaru static inline void \
97 1.1 hikaru octeon_cop2_aes_set_key_##au(ptr key, uint32_t klen) \
98 1.1 hikaru { \
99 1.1 hikaru octeon_cop2_aes_set_key_##au##_vaddr64((intptr_t)key, klen); \
100 1.1 hikaru }
101 1.1 hikaru
102 1.1 hikaru #define __octeon_cop2_aes_set_key_au(au, AU) \
103 1.1 hikaru __octeon_cop2_aes_set_key_au_vaddr64(au, AU) \
104 1.1 hikaru __octeon_cop2_aes_set_key_au_ptr(au, AU, __##au##_t *)
105 1.1 hikaru
106 1.1 hikaru #define __octeon_cop2_aes_set_key \
107 1.1 hikaru __octeon_cop2_aes_set_key_au(aligned, A) \
108 1.1 hikaru __octeon_cop2_aes_set_key_au(unaligned, U)
109 1.1 hikaru
110 1.1 hikaru __octeon_cop2_aes_set_key
111 1.1 hikaru
112 1.1 hikaru static inline void
113 1.1 hikaru octeon_cop2_aes_set_iv_unaligned_vaddr64(uint64_t iv)
114 1.1 hikaru {
115 1.1 hikaru uint64_t tmp0, tmp1;
116 1.1 hikaru
117 1.1 hikaru asm volatile (
118 1.1 hikaru CNASM_START()
119 1.1 hikaru /* Store the IV to cop2 */
120 1.1 hikaru CNASM_ULD(tmp0, 0, iv)
121 1.1 hikaru CNASM_ULD(tmp1, 8, iv)
122 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_AES_IV, 0)
123 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_AES_IV, 1)
124 1.1 hikaru CNASM_END()
125 1.1 hikaru : [tmp0] "=&r" (tmp0),
126 1.1 hikaru [tmp1] "=&r" (tmp1)
127 1.1 hikaru : [iv] "d" (iv));
128 1.1 hikaru }
129 1.1 hikaru
130 1.1 hikaru static inline void
131 1.1 hikaru octeon_cop2_aes_set_iv_unaligned(uint8_t *iv)
132 1.1 hikaru {
133 1.1 hikaru octeon_cop2_aes_set_iv_unaligned_vaddr64((intptr_t)iv);
134 1.1 hikaru }
135 1.1 hikaru
136 1.1 hikaru #define __octeon_cop2_aes_ed_16_au_vaddr64(ed, ED, au, AU) \
137 1.1 hikaru static inline void \
138 1.1 hikaru octeon_cop2_aes_##ed##_16_##au##_vaddr64(uint64_t d, uint64_t s) \
139 1.1 hikaru { \
140 1.1 hikaru uint64_t tmp0, tmp1; \
141 1.1 hikaru \
142 1.1 hikaru asm volatile ( \
143 1.1 hikaru CNASM_START() \
144 1.1 hikaru CNASM_##AU##LD(tmp0, 0, s) \
145 1.1 hikaru CNASM_##AU##LD(tmp1, 8, s) \
146 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_AES_##ED##0, 0) \
147 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_AES_##ED##1, 0) \
148 1.1 hikaru CNASM_MF2(tmp0, CVM_MF_AES_RESINP, 0) \
149 1.1 hikaru CNASM_MF2(tmp1, CVM_MF_AES_RESINP, 1) \
150 1.1 hikaru CNASM_##AU##SD(tmp0, 0, d) \
151 1.1 hikaru CNASM_##AU##SD(tmp1, 8, d) \
152 1.1 hikaru CNASM_END() \
153 1.1 hikaru : [tmp0] "=&r" (tmp0), \
154 1.1 hikaru [tmp1] "=&r" (tmp1) \
155 1.1 hikaru : [d] "d" (d), \
156 1.1 hikaru [s] "d" (s)); \
157 1.1 hikaru }
158 1.1 hikaru
159 1.1 hikaru #define __octeon_cop2_aes_ed_16_au_ptr(ed, ED, au, AU, ptr) \
160 1.1 hikaru static inline void \
161 1.1 hikaru octeon_cop2_aes_##ed##_16_##au(ptr d, ptr s) \
162 1.1 hikaru { \
163 1.1 hikaru octeon_cop2_aes_##ed##_16_##au##_vaddr64((intptr_t)d, (intptr_t)s); \
164 1.1 hikaru }
165 1.1 hikaru
166 1.1 hikaru #define __octeon_cop2_aes_ed_16_au(ed, ED, au, AU) \
167 1.1 hikaru __octeon_cop2_aes_ed_16_au_vaddr64(ed, ED, au, AU) \
168 1.1 hikaru __octeon_cop2_aes_ed_16_au_ptr(ed, ED, au, AU, __##au##_t *)
169 1.1 hikaru
170 1.1 hikaru #define __octeon_cop2_aes_ed_16(ed, ED) \
171 1.1 hikaru __octeon_cop2_aes_ed_16_au(ed, ED, aligned, A) \
172 1.1 hikaru __octeon_cop2_aes_ed_16_au(ed, ED, unaligned, U)
173 1.1 hikaru
174 1.1 hikaru #define __octeon_cop2_aes_16 \
175 1.1 hikaru __octeon_cop2_aes_ed_16(encrypt, ENC) \
176 1.1 hikaru __octeon_cop2_aes_ed_16(decrypt, DEC) \
177 1.1 hikaru __octeon_cop2_aes_ed_16(cbc_encrypt, ENC_CBC) \
178 1.1 hikaru __octeon_cop2_aes_ed_16(cbc_decrypt, DEC_CBC)
179 1.1 hikaru
180 1.1 hikaru __octeon_cop2_aes_16
181 1.1 hikaru
182 1.1 hikaru #define __octeon_cop2_aes_ed_block_au_vaddr64(ed, ED, au, AU) \
183 1.1 hikaru static inline void \
184 1.1 hikaru octeon_cop2_aes_##ed##_block_##au##_vaddr64(uint64_t d, uint64_t s, int n) \
185 1.1 hikaru { \
186 1.1 hikaru uint64_t tmp0, tmp1; \
187 1.1 hikaru uint64_t x = d + 16 * n; \
188 1.1 hikaru \
189 1.1 hikaru asm volatile ( \
190 1.1 hikaru CNASM_START() \
191 1.1 hikaru "1: \n" \
192 1.1 hikaru CNASM_##AU##LD(tmp0, 0, s) \
193 1.1 hikaru CNASM_##AU##LD(tmp1, 8, s) \
194 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_AES_##ED##0, 0) \
195 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_AES_##ED##1, 0) \
196 1.1 hikaru CNASM_MF2(tmp0, CVM_MF_AES_RESINP, 0) \
197 1.1 hikaru CNASM_MF2(tmp1, CVM_MF_AES_RESINP, 1) \
198 1.1 hikaru CNASM_##AU##SD(tmp0, 0, d) \
199 1.1 hikaru CNASM_##AU##SD(tmp1, 8, d) \
200 1.1 hikaru " daddu %[d], %[d], 16 \n" \
201 1.1 hikaru " bne %[d], %[x], 1b \n" \
202 1.1 hikaru " daddu %[s], %[s], 16 \n" /* delay slot */ \
203 1.1 hikaru CNASM_END() \
204 1.1 hikaru : [d] "=d" (d), \
205 1.1 hikaru [s] "=d" (s), \
206 1.1 hikaru [tmp0] "=&r" (tmp0), \
207 1.1 hikaru [tmp1] "=&r" (tmp1) \
208 1.1 hikaru : "0" (d), \
209 1.1 hikaru "1" (s), \
210 1.1 hikaru [x] "d" (x)); \
211 1.1 hikaru }
212 1.1 hikaru
213 1.1 hikaru #define __octeon_cop2_aes_ed_block_au_ptr(ed, ED, au, AU, ptr) \
214 1.1 hikaru static inline void \
215 1.1 hikaru octeon_cop2_aes_##ed##_block_##au(ptr d, ptr s, int n) \
216 1.1 hikaru { \
217 1.1 hikaru octeon_cop2_aes_##ed##_block_##au##_vaddr64((intptr_t)d, (intptr_t)s, n); \
218 1.1 hikaru }
219 1.1 hikaru
220 1.1 hikaru #define __octeon_cop2_aes_ed_block_au(ed, ED, au, AU) \
221 1.1 hikaru __octeon_cop2_aes_ed_block_au_vaddr64(ed, ED, au, AU) \
222 1.1 hikaru __octeon_cop2_aes_ed_block_au_ptr(ed, ED, au, AU, __##au##_t *)
223 1.1 hikaru
224 1.1 hikaru #define __octeon_cop2_aes_ed_block(ed, ED) \
225 1.1 hikaru __octeon_cop2_aes_ed_block_au(ed, ED, aligned, A) \
226 1.1 hikaru __octeon_cop2_aes_ed_block_au(ed, ED, unaligned, U)
227 1.1 hikaru
228 1.1 hikaru #define __octeon_cop2_aes_block \
229 1.1 hikaru /* __octeon_cop2_aes_ed_block(encrypt, ENC) */ \
230 1.1 hikaru /* __octeon_cop2_aes_ed_block(decrypt, DEC) */ \
231 1.1 hikaru __octeon_cop2_aes_ed_block(cbc_encrypt, ENC_CBC) \
232 1.1 hikaru __octeon_cop2_aes_ed_block(cbc_decrypt, DEC_CBC)
233 1.1 hikaru
234 1.1 hikaru __octeon_cop2_aes_block
235 1.1 hikaru
236 1.1 hikaru #define __octeon_cop2_aes_ed_64_au_vaddr64(ed, ED, au, AU) \
237 1.1 hikaru static inline void \
238 1.1 hikaru octeon_cop2_aes_##ed##_64_##au##_vaddr64(uint64_t d, uint64_t s) \
239 1.1 hikaru { \
240 1.1 hikaru uint64_t tmp0, tmp1, tmp2, tmp3; \
241 1.1 hikaru \
242 1.1 hikaru asm volatile ( \
243 1.1 hikaru CNASM_START() \
244 1.1 hikaru CNASM_##AU##LD(tmp0, 0, s) \
245 1.1 hikaru CNASM_##AU##LD(tmp1, 8, s) \
246 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_AES_##ED##0, 0) \
247 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_AES_##ED##1, 0) \
248 1.1 hikaru CNASM_##AU##LD(tmp2, 16, s) \
249 1.1 hikaru CNASM_##AU##LD(tmp3, 24, s) \
250 1.1 hikaru CNASM_MF2(tmp0, CVM_MF_AES_RESINP, 0) \
251 1.1 hikaru CNASM_MF2(tmp1, CVM_MF_AES_RESINP, 1) \
252 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_AES_##ED##0, 0) \
253 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_AES_##ED##1, 0) \
254 1.1 hikaru CNASM_##AU##SD(tmp0, 0, d) \
255 1.1 hikaru CNASM_##AU##SD(tmp1, 8, d) \
256 1.1 hikaru CNASM_MF2(tmp2, CVM_MF_AES_RESINP, 0) \
257 1.1 hikaru CNASM_MF2(tmp3, CVM_MF_AES_RESINP, 1) \
258 1.1 hikaru CNASM_##AU##SD(tmp2, 16, d) \
259 1.1 hikaru CNASM_##AU##SD(tmp3, 24, d) \
260 1.1 hikaru CNASM_##AU##LD(tmp0, 32, s) \
261 1.1 hikaru CNASM_##AU##LD(tmp1, 40, s) \
262 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_AES_##ED##0, 0) \
263 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_AES_##ED##1, 0) \
264 1.1 hikaru CNASM_##AU##LD(tmp2, 48, s) \
265 1.1 hikaru CNASM_##AU##LD(tmp3, 56, s) \
266 1.1 hikaru CNASM_MF2(tmp0, CVM_MF_AES_RESINP, 0) \
267 1.1 hikaru CNASM_MF2(tmp1, CVM_MF_AES_RESINP, 1) \
268 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_AES_##ED##0, 0) \
269 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_AES_##ED##1, 0) \
270 1.1 hikaru CNASM_##AU##SD(tmp0, 32, d) \
271 1.1 hikaru CNASM_##AU##SD(tmp1, 40, d) \
272 1.1 hikaru CNASM_MF2(tmp2, CVM_MF_AES_RESINP, 0) \
273 1.1 hikaru CNASM_MF2(tmp3, CVM_MF_AES_RESINP, 1) \
274 1.1 hikaru CNASM_##AU##SD(tmp2, 48, d) \
275 1.1 hikaru CNASM_##AU##SD(tmp3, 56, d) \
276 1.1 hikaru CNASM_END() \
277 1.1 hikaru : [tmp0] "=&r" (tmp0), \
278 1.1 hikaru [tmp1] "=&r" (tmp1), \
279 1.1 hikaru [tmp2] "=&r" (tmp2), \
280 1.1 hikaru [tmp3] "=&r" (tmp3) \
281 1.1 hikaru : [d] "d" (d), \
282 1.1 hikaru [s] "d" (s)); \
283 1.1 hikaru }
284 1.1 hikaru
285 1.1 hikaru #define __octeon_cop2_aes_ed_64_au_ptr(ed, ED, au, AU, ptr) \
286 1.1 hikaru static inline void \
287 1.1 hikaru octeon_cop2_aes_##ed##_64_##au(ptr d, ptr s) \
288 1.1 hikaru { \
289 1.1 hikaru octeon_cop2_aes_##ed##_64_##au##_vaddr64((intptr_t)d, (intptr_t)s); \
290 1.1 hikaru }
291 1.1 hikaru
292 1.1 hikaru #define __octeon_cop2_aes_ed_64_au(ed, ED, au, AU) \
293 1.1 hikaru __octeon_cop2_aes_ed_64_au_vaddr64(ed, ED, au, AU) \
294 1.1 hikaru __octeon_cop2_aes_ed_64_au_ptr(ed, ED, au, AU, __##au##_t *)
295 1.1 hikaru
296 1.1 hikaru #define __octeon_cop2_aes_ed_64(ed, ED) \
297 1.1 hikaru __octeon_cop2_aes_ed_64_au(ed, ED, aligned, A) \
298 1.1 hikaru __octeon_cop2_aes_ed_64_au(ed, ED, unaligned, U)
299 1.1 hikaru
300 1.1 hikaru #define __octeon_cop2_aes_64 \
301 1.1 hikaru /* __octeon_cop2_aes_ed_64(encrypt, ENC) */ \
302 1.1 hikaru /* __octeon_cop2_aes_ed_64(decrypt, DEC) */ \
303 1.1 hikaru __octeon_cop2_aes_ed_64(cbc_encrypt, ENC_CBC) \
304 1.1 hikaru __octeon_cop2_aes_ed_64(cbc_decrypt, DEC_CBC)
305 1.1 hikaru
306 1.1 hikaru __octeon_cop2_aes_64
307 1.1 hikaru
308 1.1 hikaru /* -------------------------------------------------------------------------- */
309 1.1 hikaru
310 1.1 hikaru /* DES */
311 1.1 hikaru
312 1.1 hikaru static inline void
313 1.1 hikaru octeon_cop2_des_set_key_unaligned_vaddr64(uint64_t k1, uint64_t k2, uint64_t k3)
314 1.1 hikaru {
315 1.1 hikaru uint64_t tmp0, tmp1, tmp2;
316 1.1 hikaru
317 1.1 hikaru asm volatile (
318 1.1 hikaru CNASM_START()
319 1.1 hikaru /* Set key */
320 1.1 hikaru CNASM_ULD(tmp0, 0, k1)
321 1.1 hikaru CNASM_ULD(tmp1, 0, k2)
322 1.1 hikaru CNASM_ULD(tmp2, 0, k3)
323 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_3DES_KEY, 0)
324 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_3DES_KEY, 1)
325 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_3DES_KEY, 2)
326 1.1 hikaru CNASM_END()
327 1.1 hikaru : [tmp0] "=&r" (tmp0),
328 1.1 hikaru [tmp1] "=&r" (tmp1),
329 1.1 hikaru [tmp2] "=&r" (tmp2)
330 1.1 hikaru : [k1] "d" (k1),
331 1.1 hikaru [k2] "d" (k2),
332 1.1 hikaru [k3] "d" (k3));
333 1.1 hikaru }
334 1.1 hikaru
335 1.1 hikaru static inline void
336 1.1 hikaru octeon_cop2_des_set_key_unaligned(uint64_t *k1, uint64_t *k2, uint64_t *k3)
337 1.1 hikaru {
338 1.1 hikaru octeon_cop2_des_set_key_unaligned_vaddr64((intptr_t)k1, (intptr_t)k2, (intptr_t)k3);
339 1.1 hikaru }
340 1.1 hikaru
341 1.1 hikaru static inline void
342 1.1 hikaru octeon_cop2_des_set_iv_unaligned_vaddr64(uint64_t iv)
343 1.1 hikaru {
344 1.1 hikaru uint64_t tmp0;
345 1.1 hikaru
346 1.1 hikaru asm volatile (
347 1.1 hikaru CNASM_START()
348 1.1 hikaru /* Load IV to a register */
349 1.1 hikaru CNASM_ULD(tmp0, 0, iv)
350 1.1 hikaru /* Store the IV to cop2 */
351 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_3DES_IV, 0)
352 1.1 hikaru CNASM_END()
353 1.1 hikaru : [tmp0] "=&r" (tmp0)
354 1.1 hikaru : [iv] "d" (iv));
355 1.1 hikaru }
356 1.1 hikaru
357 1.1 hikaru static inline void
358 1.1 hikaru octeon_cop2_des_set_iv_unaligned(uint8_t *iv)
359 1.1 hikaru {
360 1.1 hikaru octeon_cop2_des_set_iv_unaligned_vaddr64((intptr_t)iv);
361 1.1 hikaru }
362 1.1 hikaru
363 1.1 hikaru #define __octeon_cop2_des_ed_8_au_vaddr64(ed, ED, au, AU) \
364 1.1 hikaru static inline void \
365 1.1 hikaru octeon_cop2_des_##ed##_8_##au##_vaddr64(uint64_t d, uint64_t s) \
366 1.1 hikaru { \
367 1.1 hikaru uint64_t tmp0; \
368 1.1 hikaru \
369 1.1 hikaru asm volatile ( \
370 1.1 hikaru CNASM_START() \
371 1.1 hikaru CNASM_##AU##LD(tmp0, 0, s) \
372 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_3DES_##ED, 0) \
373 1.1 hikaru CNASM_MF2(tmp0, CVM_MF_3DES_RESULT, 0) \
374 1.1 hikaru CNASM_##AU##SD(tmp0, 0, s) \
375 1.1 hikaru CNASM_END() \
376 1.1 hikaru : [tmp0] "=&r" (tmp0) \
377 1.1 hikaru : [d] "d" (d), \
378 1.1 hikaru [s] "d" (s)); \
379 1.1 hikaru }
380 1.1 hikaru
381 1.1 hikaru #define __octeon_cop2_des_ed_8_au_ptr(ed, ED, au, AU, ptr) \
382 1.1 hikaru static inline void \
383 1.1 hikaru octeon_cop2_des_##ed##_8_##au(ptr d, ptr s) \
384 1.1 hikaru { \
385 1.1 hikaru octeon_cop2_des_##ed##_8_##au##_vaddr64((intptr_t)d, (intptr_t)s); \
386 1.1 hikaru }
387 1.1 hikaru
388 1.1 hikaru #define __octeon_cop2_des_ed_8_au(ed, ED, au, AU) \
389 1.1 hikaru __octeon_cop2_des_ed_8_au_vaddr64(ed, ED, au, AU) \
390 1.1 hikaru __octeon_cop2_des_ed_8_au_ptr(ed, ED, au, AU, __##au##_t *)
391 1.1 hikaru
392 1.1 hikaru #define __octeon_cop2_des_ed_8(ed, ED) \
393 1.1 hikaru __octeon_cop2_des_ed_8_au(ed, ED, aligned, A) \
394 1.1 hikaru __octeon_cop2_des_ed_8_au(ed, ED, unaligned, U)
395 1.1 hikaru
396 1.1 hikaru #define __octeon_cop2_des_8 \
397 1.1 hikaru __octeon_cop2_des_ed_8(encrypt, ENC) \
398 1.1 hikaru __octeon_cop2_des_ed_8(decrypt, DEC) \
399 1.1 hikaru __octeon_cop2_des_ed_8(cbc_encrypt, ENC_CBC) \
400 1.1 hikaru __octeon_cop2_des_ed_8(cbc_decrypt, DEC_CBC)
401 1.1 hikaru
402 1.1 hikaru __octeon_cop2_des_8
403 1.1 hikaru
404 1.1 hikaru #define __octeon_cop2_des_ed_block_au_vaddr64(ed, ED, au, AU) \
405 1.1 hikaru static inline void \
406 1.1 hikaru octeon_cop2_des_##ed##_block_##au##_vaddr64(uint64_t d, uint64_t s, int n) \
407 1.1 hikaru { \
408 1.1 hikaru uint64_t tmp0; \
409 1.1 hikaru uint64_t x = d + 8 * n; \
410 1.1 hikaru \
411 1.1 hikaru asm volatile ( \
412 1.1 hikaru CNASM_START() \
413 1.1 hikaru "1: \n" \
414 1.1 hikaru CNASM_##AU##LD(tmp0, 0, s) \
415 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_3DES_##ED, 0) \
416 1.1 hikaru CNASM_MF2(tmp0, CVM_MF_3DES_RESULT, 0) \
417 1.1 hikaru CNASM_##AU##SD(tmp0, 0, d) \
418 1.1 hikaru " daddu %[d], %[d], 8 \n" \
419 1.1 hikaru " bne %[d], %[x], 1b \n" \
420 1.1 hikaru " daddu %[s], %[s], 8 \n" \
421 1.1 hikaru CNASM_END() \
422 1.1 hikaru : [d] "=d" (d), \
423 1.1 hikaru [s] "=d" (s), \
424 1.1 hikaru [tmp0] "=&r" (tmp0) \
425 1.1 hikaru : "0" (d), \
426 1.1 hikaru "1" (s), \
427 1.1 hikaru [x] "d" (x)); \
428 1.1 hikaru }
429 1.1 hikaru
430 1.1 hikaru #define __octeon_cop2_des_ed_block_au_ptr(ed, ED, au, AU, ptr) \
431 1.1 hikaru static inline void \
432 1.1 hikaru octeon_cop2_des_##ed##_block_##au(ptr d, ptr s, int n) \
433 1.1 hikaru { \
434 1.1 hikaru octeon_cop2_des_##ed##_block_##au##_vaddr64((intptr_t)d, (intptr_t)s, n); \
435 1.1 hikaru }
436 1.1 hikaru
437 1.1 hikaru #define __octeon_cop2_des_ed_block_au(ed, ED, au, AU) \
438 1.1 hikaru __octeon_cop2_des_ed_block_au_vaddr64(ed, ED, au, AU) \
439 1.1 hikaru __octeon_cop2_des_ed_block_au_ptr(ed, ED, au, AU, __##au##_t *)
440 1.1 hikaru
441 1.1 hikaru #define __octeon_cop2_des_ed_block(ed, ED) \
442 1.1 hikaru __octeon_cop2_des_ed_block_au(ed, ED, aligned, A) \
443 1.1 hikaru __octeon_cop2_des_ed_block_au(ed, ED, unaligned, U)
444 1.1 hikaru
445 1.1 hikaru #define __octeon_cop2_des_block \
446 1.1 hikaru /* __octeon_cop2_des_ed_block(encrypt, ENC) */ \
447 1.1 hikaru /* __octeon_cop2_des_ed_block(decrypt, DEC) */ \
448 1.1 hikaru __octeon_cop2_des_ed_block(cbc_encrypt, ENC_CBC) \
449 1.1 hikaru __octeon_cop2_des_ed_block(cbc_decrypt, DEC_CBC)
450 1.1 hikaru
451 1.1 hikaru __octeon_cop2_des_block
452 1.1 hikaru
453 1.1 hikaru #define __octeon_cop2_des_ed_64_au_vaddr64(ed, ED, au, AU) \
454 1.1 hikaru static inline void \
455 1.1 hikaru octeon_cop2_des_##ed##_64_##au##_vaddr64(uint64_t d, uint64_t s) \
456 1.1 hikaru { \
457 1.1 hikaru uint64_t tmp0, tmp1, tmp2, tmp3; \
458 1.1 hikaru \
459 1.1 hikaru asm volatile ( \
460 1.1 hikaru CNASM_START() \
461 1.1 hikaru CNASM_##AU##LD(tmp0, 0, s) \
462 1.1 hikaru CNASM_##AU##LD(tmp1, 8, s) \
463 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_3DES_##ED, 0) \
464 1.1 hikaru CNASM_##AU##LD(tmp2, 16, s) \
465 1.1 hikaru CNASM_MF2(tmp0, CVM_MF_3DES_RESULT, 0) \
466 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_3DES_##ED, 0) \
467 1.1 hikaru CNASM_##AU##LD(tmp3, 24, s) \
468 1.1 hikaru CNASM_MF2(tmp1, CVM_MF_3DES_RESULT, 0) \
469 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_3DES_##ED, 0) \
470 1.1 hikaru CNASM_##AU##SD(tmp0, 0, d) \
471 1.1 hikaru CNASM_MF2(tmp2, CVM_MF_3DES_RESULT, 0) \
472 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_3DES_##ED, 0) \
473 1.1 hikaru CNASM_##AU##SD(tmp1, 8, d) \
474 1.1 hikaru CNASM_MF2(tmp3, CVM_MF_3DES_RESULT, 0) \
475 1.1 hikaru CNASM_##AU##SD(tmp2, 16, d) \
476 1.1 hikaru CNASM_##AU##SD(tmp3, 24, d) \
477 1.1 hikaru CNASM_##AU##LD(tmp0, 32, s) \
478 1.1 hikaru CNASM_##AU##LD(tmp1, 40, s) \
479 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_3DES_##ED, 0) \
480 1.1 hikaru CNASM_##AU##LD(tmp2, 48, s) \
481 1.1 hikaru CNASM_MF2(tmp0, CVM_MF_3DES_RESULT, 0) \
482 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_3DES_##ED, 0) \
483 1.1 hikaru CNASM_##AU##LD(tmp3, 56, s) \
484 1.1 hikaru CNASM_MF2(tmp1, CVM_MF_3DES_RESULT, 0) \
485 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_3DES_##ED, 0) \
486 1.1 hikaru CNASM_##AU##SD(tmp0, 32, d) \
487 1.1 hikaru CNASM_MF2(tmp2, CVM_MF_3DES_RESULT, 0) \
488 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_3DES_##ED, 0) \
489 1.1 hikaru CNASM_##AU##SD(tmp1, 40, d) \
490 1.1 hikaru CNASM_MF2(tmp3, CVM_MF_3DES_RESULT, 0) \
491 1.1 hikaru CNASM_##AU##SD(tmp2, 48, d) \
492 1.1 hikaru CNASM_##AU##SD(tmp3, 56, d) \
493 1.1 hikaru CNASM_END() \
494 1.1 hikaru : [tmp0] "=&r" (tmp0), \
495 1.1 hikaru [tmp1] "=&r" (tmp1), \
496 1.1 hikaru [tmp2] "=&r" (tmp2), \
497 1.1 hikaru [tmp3] "=&r" (tmp3) \
498 1.1 hikaru : [d] "d" (d), \
499 1.1 hikaru [s] "d" (s)); \
500 1.1 hikaru }
501 1.1 hikaru
502 1.1 hikaru #define __octeon_cop2_des_ed_64_au_ptr(ed, ED, au, AU, ptr) \
503 1.1 hikaru static inline void \
504 1.1 hikaru octeon_cop2_des_##ed##_64_##au(ptr d, ptr s) \
505 1.1 hikaru { \
506 1.1 hikaru octeon_cop2_des_##ed##_64_##au##_vaddr64((intptr_t)d, (intptr_t)s); \
507 1.1 hikaru }
508 1.1 hikaru
509 1.1 hikaru #define __octeon_cop2_des_ed_64_au(ed, ED, au, AU) \
510 1.1 hikaru __octeon_cop2_des_ed_64_au_vaddr64(ed, ED, au, AU) \
511 1.1 hikaru __octeon_cop2_des_ed_64_au_ptr(ed, ED, au, AU, __##au##_t *)
512 1.1 hikaru
513 1.1 hikaru #define __octeon_cop2_des_ed_64(ed, ED) \
514 1.1 hikaru __octeon_cop2_des_ed_64_au(ed, ED, aligned, A) \
515 1.1 hikaru __octeon_cop2_des_ed_64_au(ed, ED, unaligned, U)
516 1.1 hikaru
517 1.1 hikaru #define __octeon_cop2_des_64 \
518 1.1 hikaru /* __octeon_cop2_des_ed_64(encrypt, ENC) */ \
519 1.1 hikaru /* __octeon_cop2_des_ed_64(decrypt, DEC) */ \
520 1.1 hikaru __octeon_cop2_des_ed_64(cbc_encrypt, ENC_CBC) \
521 1.1 hikaru __octeon_cop2_des_ed_64(cbc_decrypt, DEC_CBC)
522 1.1 hikaru
523 1.1 hikaru __octeon_cop2_des_64
524 1.1 hikaru
525 1.1 hikaru /* -------------------------------------------------------------------------- */
526 1.1 hikaru
527 1.1 hikaru /* MD5 */
528 1.1 hikaru
529 1.1 hikaru static inline void
530 1.1 hikaru octeon_cop2_md5_set_iv_unaligned_vaddr64(uint64_t iv)
531 1.1 hikaru {
532 1.1 hikaru uint64_t tmp0, tmp1;
533 1.1 hikaru
534 1.1 hikaru asm volatile (
535 1.1 hikaru CNASM_START()
536 1.1 hikaru /* Load IV from context */
537 1.1 hikaru CNASM_ULD(tmp0, 0, iv)
538 1.1 hikaru CNASM_ULD(tmp1, 8, iv)
539 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_IV, 0)
540 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_IV, 1)
541 1.1 hikaru CNASM_MT2ZERO( CVM_MT_HSH_IV, 2)
542 1.1 hikaru CNASM_MT2ZERO( CVM_MT_HSH_IV, 3)
543 1.1 hikaru CNASM_END()
544 1.1 hikaru : [tmp0] "=&r" (tmp0),
545 1.1 hikaru [tmp1] "=&r" (tmp1)
546 1.1 hikaru : [iv] "d" (iv));
547 1.1 hikaru }
548 1.1 hikaru
549 1.1 hikaru static inline void
550 1.1 hikaru octeon_cop2_md5_set_iv_unaligned(uint64_t *iv)
551 1.1 hikaru {
552 1.1 hikaru octeon_cop2_md5_set_iv_unaligned_vaddr64((intptr_t)iv);
553 1.1 hikaru }
554 1.1 hikaru
555 1.1 hikaru static inline void
556 1.1 hikaru octeon_cop2_md5_get_iv_unaligned_vaddr64(uint64_t iv)
557 1.1 hikaru {
558 1.1 hikaru uint64_t tmp0, tmp1;
559 1.1 hikaru
560 1.1 hikaru asm volatile (
561 1.1 hikaru CNASM_START()
562 1.1 hikaru /* Store IV to context */
563 1.1 hikaru CNASM_MF2(tmp0, CVM_MF_HSH_IV, 0)
564 1.1 hikaru CNASM_MF2(tmp1, CVM_MF_HSH_IV, 1)
565 1.1 hikaru CNASM_USD(tmp0, 0, iv)
566 1.1 hikaru CNASM_USD(tmp1, 8, iv)
567 1.1 hikaru CNASM_END()
568 1.1 hikaru : [tmp0] "=&r" (tmp0),
569 1.1 hikaru [tmp1] "=&r" (tmp1)
570 1.1 hikaru : [iv] "d" (iv));
571 1.1 hikaru }
572 1.1 hikaru
573 1.1 hikaru static inline void
574 1.1 hikaru octeon_cop2_md5_get_iv_unaligned(uint64_t *iv)
575 1.1 hikaru {
576 1.1 hikaru octeon_cop2_md5_get_iv_unaligned_vaddr64((intptr_t)iv);
577 1.1 hikaru }
578 1.1 hikaru
579 1.1 hikaru static inline void
580 1.1 hikaru octeon_cop2_md5_update_unaligned_vaddr64(uint64_t src)
581 1.1 hikaru {
582 1.1 hikaru uint64_t tmp0, tmp1, tmp2, tmp3;
583 1.1 hikaru
584 1.1 hikaru asm volatile (
585 1.1 hikaru CNASM_START()
586 1.1 hikaru /* Update HASH */
587 1.1 hikaru CNASM_ULD(tmp0, 0, src)
588 1.1 hikaru CNASM_ULD(tmp1, 8, src)
589 1.1 hikaru CNASM_ULD(tmp2, 16, src)
590 1.1 hikaru CNASM_ULD(tmp3, 24, src)
591 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_DAT, 0)
592 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_DAT, 1)
593 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_HSH_DAT, 2)
594 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_HSH_DAT, 3)
595 1.1 hikaru CNASM_ULD(tmp0, 32, src)
596 1.1 hikaru CNASM_ULD(tmp1, 40, src)
597 1.1 hikaru CNASM_ULD(tmp2, 48, src)
598 1.1 hikaru CNASM_ULD(tmp3, 56, src)
599 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_DAT, 4)
600 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_DAT, 5)
601 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_HSH_DAT, 6)
602 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_HSH_STANDARD5, 0)
603 1.1 hikaru CNASM_END()
604 1.1 hikaru : [tmp0] "=&r" (tmp0),
605 1.1 hikaru [tmp1] "=&r" (tmp1),
606 1.1 hikaru [tmp2] "=&r" (tmp2),
607 1.1 hikaru [tmp3] "=&r" (tmp3)
608 1.1 hikaru : [src] "d" (src));
609 1.1 hikaru }
610 1.1 hikaru
611 1.1 hikaru static inline void
612 1.1 hikaru octeon_cop2_md5_update_unaligned(uint64_t *src)
613 1.1 hikaru {
614 1.1 hikaru octeon_cop2_md5_update_unaligned_vaddr64((intptr_t)src);
615 1.1 hikaru }
616 1.1 hikaru
617 1.1 hikaru /* -------------------------------------------------------------------------- */
618 1.1 hikaru
619 1.1 hikaru /* SHA1 */
620 1.1 hikaru
621 1.1 hikaru static inline void
622 1.1 hikaru octeon_cop2_sha1_set_iv_unaligned_vaddr64(uint64_t iv)
623 1.1 hikaru {
624 1.1 hikaru uint64_t tmp0, tmp1, tmp2;
625 1.1 hikaru
626 1.1 hikaru asm volatile (
627 1.1 hikaru CNASM_START()
628 1.1 hikaru /* Load IV from context */
629 1.1 hikaru CNASM_ULD(tmp0, 0, iv)
630 1.1 hikaru CNASM_ULD(tmp1, 8, iv)
631 1.1 hikaru CNASM_ULW(tmp2, 16, iv)
632 1.1 hikaru "dsll %[tmp2], %[tmp2], 32 \n\t"
633 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_IV, 0)
634 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_IV, 1)
635 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_HSH_IV, 2)
636 1.1 hikaru CNASM_MT2ZERO( CVM_MT_HSH_IV, 3)
637 1.1 hikaru CNASM_END()
638 1.1 hikaru : [tmp0] "=&r" (tmp0),
639 1.1 hikaru [tmp1] "=&r" (tmp1),
640 1.1 hikaru [tmp2] "=&r" (tmp2)
641 1.1 hikaru : [iv] "d" (iv));
642 1.1 hikaru }
643 1.1 hikaru
644 1.1 hikaru static inline void
645 1.1 hikaru octeon_cop2_sha1_set_iv_unaligned(uint8_t *iv)
646 1.1 hikaru {
647 1.1 hikaru octeon_cop2_sha1_set_iv_unaligned_vaddr64((intptr_t)iv);
648 1.1 hikaru }
649 1.1 hikaru
650 1.1 hikaru static inline void
651 1.1 hikaru octeon_cop2_sha1_get_iv_unaligned_vaddr64(uint64_t iv)
652 1.1 hikaru {
653 1.1 hikaru uint64_t tmp0, tmp1, tmp2;
654 1.1 hikaru
655 1.1 hikaru asm volatile (
656 1.1 hikaru CNASM_START()
657 1.1 hikaru /* Store IV to context */
658 1.1 hikaru CNASM_MF2(tmp0, CVM_MF_HSH_IV, 0)
659 1.1 hikaru CNASM_MF2(tmp1, CVM_MF_HSH_IV, 1)
660 1.1 hikaru CNASM_MF2(tmp2, CVM_MF_HSH_IV, 2)
661 1.1 hikaru CNASM_USD(tmp0, 0, iv)
662 1.1 hikaru CNASM_USD(tmp1, 8, iv)
663 1.1 hikaru "dsrl %[tmp2], %[tmp2], 32 \n\t"
664 1.1 hikaru CNASM_USW(tmp2, 16, iv)
665 1.1 hikaru CNASM_END()
666 1.1 hikaru : [tmp0] "=&r" (tmp0),
667 1.1 hikaru [tmp1] "=&r" (tmp1),
668 1.1 hikaru [tmp2] "=&r" (tmp2)
669 1.1 hikaru : [iv] "d" (iv));
670 1.1 hikaru }
671 1.1 hikaru
672 1.1 hikaru static inline void
673 1.1 hikaru octeon_cop2_sha1_get_iv_unaligned(uint8_t *iv)
674 1.1 hikaru {
675 1.1 hikaru octeon_cop2_sha1_get_iv_unaligned_vaddr64((intptr_t)iv);
676 1.1 hikaru }
677 1.1 hikaru
678 1.1 hikaru static inline void
679 1.1 hikaru octeon_cop2_sha1_update_unaligned_vaddr64(uint64_t src)
680 1.1 hikaru {
681 1.1 hikaru uint64_t tmp0, tmp1, tmp2, tmp3;
682 1.1 hikaru
683 1.1 hikaru asm volatile (
684 1.1 hikaru CNASM_START()
685 1.1 hikaru /* Update HASH */
686 1.1 hikaru CNASM_ULD(tmp0, 0, src)
687 1.1 hikaru CNASM_ULD(tmp1, 8, src)
688 1.1 hikaru CNASM_ULD(tmp2, 16, src)
689 1.1 hikaru CNASM_ULD(tmp3, 24, src)
690 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_DAT, 0)
691 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_DAT, 1)
692 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_HSH_DAT, 2)
693 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_HSH_DAT, 3)
694 1.1 hikaru CNASM_ULD(tmp0, 32, src)
695 1.1 hikaru CNASM_ULD(tmp1, 40, src)
696 1.1 hikaru CNASM_ULD(tmp2, 48, src)
697 1.1 hikaru CNASM_ULD(tmp3, 56, src)
698 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_DAT, 4)
699 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_DAT, 5)
700 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_HSH_DAT, 6)
701 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_HSH_STARTSHA, 0)
702 1.1 hikaru CNASM_END()
703 1.1 hikaru : [tmp0] "=&r" (tmp0),
704 1.1 hikaru [tmp1] "=&r" (tmp1),
705 1.1 hikaru [tmp2] "=&r" (tmp2),
706 1.1 hikaru [tmp3] "=&r" (tmp3)
707 1.1 hikaru : [src] "d" (src));
708 1.1 hikaru }
709 1.1 hikaru
710 1.1 hikaru static inline void
711 1.1 hikaru octeon_cop2_sha1_update_unaligned(uint8_t *src)
712 1.1 hikaru {
713 1.1 hikaru octeon_cop2_sha1_update_unaligned_vaddr64((intptr_t)src);
714 1.1 hikaru }
715 1.1 hikaru
716 1.1 hikaru /* -------------------------------------------------------------------------- */
717 1.1 hikaru
718 1.1 hikaru /* SHA256 */
719 1.1 hikaru
720 1.1 hikaru static inline void
721 1.1 hikaru octeon_cop2_sha256_set_iv_unaligned_vaddr64(uint64_t iv)
722 1.1 hikaru {
723 1.1 hikaru uint64_t tmp0, tmp1, tmp2, tmp3;
724 1.1 hikaru
725 1.1 hikaru asm volatile (
726 1.1 hikaru CNASM_START()
727 1.1 hikaru /* Load IV from context */
728 1.1 hikaru CNASM_ULD(tmp0, 0, iv)
729 1.1 hikaru CNASM_ULD(tmp1, 8, iv)
730 1.1 hikaru CNASM_ULD(tmp2, 16, iv)
731 1.1 hikaru CNASM_ULD(tmp3, 24, iv)
732 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_IV, 0)
733 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_IV, 1)
734 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_HSH_IV, 2)
735 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_HSH_IV, 3)
736 1.1 hikaru CNASM_END()
737 1.1 hikaru : [tmp0] "=&r" (tmp0),
738 1.1 hikaru [tmp1] "=&r" (tmp1),
739 1.1 hikaru [tmp2] "=&r" (tmp2),
740 1.1 hikaru [tmp3] "=&r" (tmp3)
741 1.1 hikaru : [iv] "d" (iv));
742 1.1 hikaru }
743 1.1 hikaru
744 1.1 hikaru static inline void
745 1.1 hikaru octeon_cop2_sha256_set_iv_unaligned(uint8_t *iv)
746 1.1 hikaru {
747 1.1 hikaru octeon_cop2_sha256_set_iv_unaligned_vaddr64((intptr_t)iv);
748 1.1 hikaru }
749 1.1 hikaru
750 1.1 hikaru static inline void
751 1.1 hikaru octeon_cop2_sha256_get_iv_unaligned_vaddr64(uint64_t iv)
752 1.1 hikaru {
753 1.1 hikaru uint64_t tmp0, tmp1, tmp2, tmp3;
754 1.1 hikaru
755 1.1 hikaru asm volatile (
756 1.1 hikaru CNASM_START()
757 1.1 hikaru /* Store IV to context */
758 1.1 hikaru CNASM_MF2(tmp0, CVM_MF_HSH_IV, 0)
759 1.1 hikaru CNASM_MF2(tmp1, CVM_MF_HSH_IV, 1)
760 1.1 hikaru CNASM_MF2(tmp2, CVM_MF_HSH_IV, 2)
761 1.1 hikaru CNASM_MF2(tmp3, CVM_MF_HSH_IV, 3)
762 1.1 hikaru CNASM_USD(tmp0, 0, iv)
763 1.1 hikaru CNASM_USD(tmp1, 8, iv)
764 1.1 hikaru CNASM_USD(tmp2, 16, iv)
765 1.1 hikaru CNASM_USD(tmp3, 24, iv)
766 1.1 hikaru CNASM_END()
767 1.1 hikaru : [tmp0] "=&r" (tmp0),
768 1.1 hikaru [tmp1] "=&r" (tmp1),
769 1.1 hikaru [tmp2] "=&r" (tmp2),
770 1.1 hikaru [tmp3] "=&r" (tmp3)
771 1.1 hikaru : [iv] "d" (iv));
772 1.1 hikaru }
773 1.1 hikaru
774 1.1 hikaru static inline void
775 1.1 hikaru octeon_cop2_sha256_get_iv_unaligned(uint8_t *iv)
776 1.1 hikaru {
777 1.1 hikaru octeon_cop2_sha256_get_iv_unaligned_vaddr64((intptr_t)iv);
778 1.1 hikaru }
779 1.1 hikaru
780 1.1 hikaru static inline void
781 1.1 hikaru octeon_cop2_sha256_update_unaligned_vaddr64(uint64_t src)
782 1.1 hikaru {
783 1.1 hikaru uint64_t tmp0, tmp1, tmp2, tmp3;
784 1.1 hikaru
785 1.1 hikaru asm volatile (
786 1.1 hikaru CNASM_START()
787 1.1 hikaru /* Update HASH */
788 1.1 hikaru CNASM_ULD(tmp0, 0, src)
789 1.1 hikaru CNASM_ULD(tmp1, 8, src)
790 1.1 hikaru CNASM_ULD(tmp2, 16, src)
791 1.1 hikaru CNASM_ULD(tmp3, 24, src)
792 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_DAT, 0)
793 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_DAT, 1)
794 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_HSH_DAT, 2)
795 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_HSH_DAT, 3)
796 1.1 hikaru CNASM_ULD(tmp0, 32, src)
797 1.1 hikaru CNASM_ULD(tmp1, 40, src)
798 1.1 hikaru CNASM_ULD(tmp2, 48, src)
799 1.1 hikaru CNASM_ULD(tmp3, 56, src)
800 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_DAT, 4)
801 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_DAT, 5)
802 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_HSH_DAT, 6)
803 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_HSH_STARTSHA256, 0)
804 1.1 hikaru CNASM_END()
805 1.1 hikaru : [tmp0] "=&r" (tmp0),
806 1.1 hikaru [tmp1] "=&r" (tmp1),
807 1.1 hikaru [tmp2] "=&r" (tmp2),
808 1.1 hikaru [tmp3] "=&r" (tmp3)
809 1.1 hikaru : [src] "d" (src));
810 1.1 hikaru }
811 1.1 hikaru
812 1.1 hikaru static inline void
813 1.1 hikaru octeon_cop2_sha256_update_unaligned(uint8_t *src)
814 1.1 hikaru {
815 1.1 hikaru octeon_cop2_sha256_update_unaligned_vaddr64((intptr_t)src);
816 1.1 hikaru }
817 1.1 hikaru
818 1.1 hikaru /* -------------------------------------------------------------------------- */
819 1.1 hikaru
820 1.1 hikaru /* SHA512 */
821 1.1 hikaru
822 1.1 hikaru static inline void
823 1.1 hikaru octeon_cop2_sha512_set_iv_unaligned_vaddr64(uint64_t iv)
824 1.1 hikaru {
825 1.1 hikaru uint64_t tmp0, tmp1, tmp2, tmp3;
826 1.1 hikaru
827 1.1 hikaru asm volatile (
828 1.1 hikaru CNASM_START()
829 1.1 hikaru /* Load IV from context */
830 1.1 hikaru CNASM_ULD(tmp0, 0, iv)
831 1.1 hikaru CNASM_ULD(tmp1, 8, iv)
832 1.1 hikaru CNASM_ULD(tmp2, 16, iv)
833 1.1 hikaru CNASM_ULD(tmp3, 24, iv)
834 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_IVW, 0)
835 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_IVW, 1)
836 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_HSH_IVW, 2)
837 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_HSH_IVW, 3)
838 1.1 hikaru CNASM_ULD(tmp0, 32, iv)
839 1.1 hikaru CNASM_ULD(tmp1, 40, iv)
840 1.1 hikaru CNASM_ULD(tmp2, 48, iv)
841 1.1 hikaru CNASM_ULD(tmp3, 56, iv)
842 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_IVW, 4)
843 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_IVW, 5)
844 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_HSH_IVW, 6)
845 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_HSH_IVW, 7)
846 1.1 hikaru CNASM_END()
847 1.1 hikaru : [tmp0] "=&r" (tmp0),
848 1.1 hikaru [tmp1] "=&r" (tmp1),
849 1.1 hikaru [tmp2] "=&r" (tmp2),
850 1.1 hikaru [tmp3] "=&r" (tmp3)
851 1.1 hikaru : [iv] "d" (iv));
852 1.1 hikaru }
853 1.1 hikaru
854 1.1 hikaru static inline void
855 1.1 hikaru octeon_cop2_sha512_set_iv_unaligned(uint8_t *iv)
856 1.1 hikaru {
857 1.1 hikaru octeon_cop2_sha512_set_iv_unaligned_vaddr64((intptr_t)iv);
858 1.1 hikaru }
859 1.1 hikaru
860 1.1 hikaru static inline void
861 1.1 hikaru octeon_cop2_sha512_get_iv_unaligned_vaddr64(uint64_t iv)
862 1.1 hikaru {
863 1.1 hikaru uint64_t tmp0, tmp1, tmp2, tmp3;
864 1.1 hikaru
865 1.1 hikaru asm volatile (
866 1.1 hikaru CNASM_START()
867 1.1 hikaru /* Store IV to context */
868 1.1 hikaru CNASM_MF2(tmp0, CVM_MF_HSH_IVW, 0)
869 1.1 hikaru CNASM_MF2(tmp1, CVM_MF_HSH_IVW, 1)
870 1.1 hikaru CNASM_MF2(tmp2, CVM_MF_HSH_IVW, 2)
871 1.1 hikaru CNASM_MF2(tmp3, CVM_MF_HSH_IVW, 3)
872 1.1 hikaru CNASM_USD(tmp0, 0, iv)
873 1.1 hikaru CNASM_USD(tmp1, 8, iv)
874 1.1 hikaru CNASM_USD(tmp2, 16, iv)
875 1.1 hikaru CNASM_USD(tmp3, 24, iv)
876 1.1 hikaru CNASM_MF2(tmp0, CVM_MF_HSH_IVW, 4)
877 1.1 hikaru CNASM_MF2(tmp1, CVM_MF_HSH_IVW, 5)
878 1.1 hikaru CNASM_MF2(tmp2, CVM_MF_HSH_IVW, 6)
879 1.1 hikaru CNASM_MF2(tmp3, CVM_MF_HSH_IVW, 7)
880 1.1 hikaru CNASM_USD(tmp0, 32, iv)
881 1.1 hikaru CNASM_USD(tmp1, 40, iv)
882 1.1 hikaru CNASM_USD(tmp2, 48, iv)
883 1.1 hikaru CNASM_USD(tmp3, 56, iv)
884 1.1 hikaru CNASM_END()
885 1.1 hikaru : [tmp0] "=&r" (tmp0),
886 1.1 hikaru [tmp1] "=&r" (tmp1),
887 1.1 hikaru [tmp2] "=&r" (tmp2),
888 1.1 hikaru [tmp3] "=&r" (tmp3)
889 1.1 hikaru : [iv] "d" (iv));
890 1.1 hikaru }
891 1.1 hikaru
892 1.1 hikaru static inline void
893 1.1 hikaru octeon_cop2_sha512_get_iv_unaligned(uint8_t *iv)
894 1.1 hikaru {
895 1.1 hikaru octeon_cop2_sha512_get_iv_unaligned_vaddr64((intptr_t)iv);
896 1.1 hikaru }
897 1.1 hikaru
898 1.1 hikaru static inline void
899 1.1 hikaru octeon_cop2_sha512_update_unaligned_vaddr64(uint64_t src)
900 1.1 hikaru {
901 1.1 hikaru uint64_t tmp0, tmp1, tmp2, tmp3;
902 1.1 hikaru
903 1.1 hikaru asm volatile (
904 1.1 hikaru CNASM_START()
905 1.1 hikaru /* Update HASH */
906 1.1 hikaru CNASM_ULD(tmp0, 0, src)
907 1.1 hikaru CNASM_ULD(tmp1, 8, src)
908 1.1 hikaru CNASM_ULD(tmp2, 16, src)
909 1.1 hikaru CNASM_ULD(tmp3, 24, src)
910 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_DATW, 0)
911 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_DATW, 1)
912 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_HSH_DATW, 2)
913 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_HSH_DATW, 3)
914 1.1 hikaru CNASM_ULD(tmp0, 32, src)
915 1.1 hikaru CNASM_ULD(tmp1, 40, src)
916 1.1 hikaru CNASM_ULD(tmp2, 48, src)
917 1.1 hikaru CNASM_ULD(tmp3, 56, src)
918 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_DATW, 4)
919 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_DATW, 5)
920 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_HSH_DATW, 6)
921 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_HSH_DATW, 7)
922 1.1 hikaru CNASM_ULD(tmp0, 64, src)
923 1.1 hikaru CNASM_ULD(tmp1, 72, src)
924 1.1 hikaru CNASM_ULD(tmp2, 80, src)
925 1.1 hikaru CNASM_ULD(tmp3, 88, src)
926 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_DATW, 8)
927 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_DATW, 9)
928 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_HSH_DATW, 10)
929 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_HSH_DATW, 11)
930 1.1 hikaru CNASM_ULD(tmp0, 96, src)
931 1.1 hikaru CNASM_ULD(tmp1, 104, src)
932 1.1 hikaru CNASM_ULD(tmp2, 112, src)
933 1.1 hikaru CNASM_ULD(tmp3, 120, src)
934 1.1 hikaru CNASM_MT2(tmp0, CVM_MT_HSH_DATW, 12)
935 1.1 hikaru CNASM_MT2(tmp1, CVM_MT_HSH_DATW, 13)
936 1.1 hikaru CNASM_MT2(tmp2, CVM_MT_HSH_DATW, 14)
937 1.1 hikaru CNASM_MT2(tmp3, CVM_MT_HSH_STARTSHA512, 0)
938 1.1 hikaru CNASM_END()
939 1.1 hikaru : [tmp0] "=&r" (tmp0),
940 1.1 hikaru [tmp1] "=&r" (tmp1),
941 1.1 hikaru [tmp2] "=&r" (tmp2),
942 1.1 hikaru [tmp3] "=&r" (tmp3)
943 1.1 hikaru : [src] "d" (src));
944 1.1 hikaru }
945 1.1 hikaru
946 1.1 hikaru static inline void
947 1.1 hikaru octeon_cop2_sha512_update_unaligned(uint8_t *src)
948 1.1 hikaru {
949 1.1 hikaru octeon_cop2_sha512_update_unaligned_vaddr64((intptr_t)src);
950 1.1 hikaru }
951 1.1 hikaru
952 1.1 hikaru /* -------------------------------------------------------------------------- */
953 1.1 hikaru
954 1.1 hikaru /* CRC */
955 1.1 hikaru
956 1.1 hikaru /* XXX */
957 1.1 hikaru
958 1.1 hikaru #ifdef notyet
959 1.1 hikaru static inline void
960 1.1 hikaru octeon_cop2_crc_polynomial(val)
961 1.1 hikaru {
962 1.1 hikaru __asm __volatile (
963 1.1 hikaru CNASM_START()
964 1.1 hikaru " dmtc2 %[val], 0x4200"
965 1.1 hikaru CNASM_END()
966 1.1 hikaru :
967 1.1 hikaru : [val] "d" (val))
968 1.1 hikaru }
969 1.1 hikaru
970 1.1 hikaru #define CVMX_MT_CRC_IV(val) \
971 1.1 hikaru __asm __volatile (__PUSH "dmtc2 %0,0x0201" __POP :: "d"(val))
972 1.1 hikaru #define CVMX_MT_CRC_BYTE_REFLECT(val) \
973 1.1 hikaru __asm __volatile (__PUSH "dmtc2 %0,0x0214" __POP :: "d"(val))
974 1.1 hikaru #define CVMX_MT_CRC_HALF_REFLECT(val) \
975 1.1 hikaru __asm __volatile (__PUSH "dmtc2 %0,0x0215" __POP :: "d"(val))
976 1.1 hikaru #define CVMX_MT_CRC_DWORD_REFLECT(val) \
977 1.1 hikaru __asm __volatile (__PUSH "dmtc2 %0,0x1217" __POP :: "d"(val))
978 1.1 hikaru #define CVMX_MF_CRC_IV_REFLECT(val) \
979 1.1 hikaru __asm __volatile (__PUSH "dmfc2 %0,0x0203" __POP : "=d"(val))
980 1.1 hikaru
981 1.1 hikaru static inline void
982 1.1 hikaru octeon_cop2_crc_reflect(XXX)
983 1.1 hikaru {
984 1.1 hikaru __asm __volatile (
985 1.1 hikaru CNASM_START()
986 1.1 hikaru " and %[val], %[len], 15 \n"
987 1.1 hikaru " beq %[val], %[len], 2f \n"
988 1.1 hikaru " subu %[tmp], %[len], %[val] \n"
989 1.1 hikaru " move %[len], %[val] \n"
990 1.1 hikaru " addu %[tmp], %[buf] \n"
991 1.1 hikaru
992 1.1 hikaru " .align 3 \n"
993 1.1 hikaru "1: \n"
994 1.1 hikaru CNASM_ULD(val, 0, buf)
995 1.1 hikaru " addu %[buf], 16 \n"
996 1.1 hikaru CNASM_MT2(val, CVM_MT_CRC_DWORD_REFLECT, 0)
997 1.1 hikaru CNASM_ULD(val, -8, buf)
998 1.1 hikaru " bne %[buf], %[tmp], 1b \n"
999 1.1 hikaru CNASM_MT2(val, CVM_MT_CRC_DWORD_REFLECT, 0)
1000 1.1 hikaru
1001 1.1 hikaru " .align 3 \n"
1002 1.1 hikaru "2: and %[val], %[len], 1 \n"
1003 1.1 hikaru " beq %[val], %[len], 4f \n"
1004 1.1 hikaru " subu %[tmp], %[len], %[val] \n"
1005 1.1 hikaru " move %[len], %[val] \n"
1006 1.1 hikaru " addu %[tmp], %[buf] \n"
1007 1.1 hikaru
1008 1.1 hikaru " .align 3 \n"
1009 1.1 hikaru "3: addu %[buf], 2 \n"
1010 1.1 hikaru " lhu %[val], -2(%[buf]) \n"
1011 1.1 hikaru " bne %[buf], %[tmp], 3b \n"
1012 1.1 hikaru CNASM_MT2(val, CVM_MT_CRC_HALF_REFLECT, 0)
1013 1.1 hikaru
1014 1.1 hikaru " .align 3 \n"
1015 1.1 hikaru "4: beqz %[len], 5f \n"
1016 1.1 hikaru " nop \n"
1017 1.1 hikaru " lbu %[val], 0(%[buf]) \n"
1018 1.1 hikaru CNASM_MT2(val, CVM_MT_CRC_BYTE_REFLECT, 0)
1019 1.1 hikaru
1020 1.1 hikaru " .align 3 \n"
1021 1.1 hikaru "5: \n"
1022 1.1 hikaru CNASM_END()
1023 1.1 hikaru : [len] "=d" (len),
1024 1.1 hikaru [buf] "=d" (buf),
1025 1.1 hikaru [val] "=d" (val),
1026 1.1 hikaru [tmp] "=d" (tmp)
1027 1.1 hikaru : "0" (len),
1028 1.1 hikaru "1" (buf)
1029 1.1 hikaru );
1030 1.1 hikaru #endif
1031 1.1 hikaru
1032 1.1 hikaru /* -------------------------------------------------------------------------- */
1033 1.1 hikaru
1034 1.1 hikaru /* GFM */
1035 1.1 hikaru
1036 1.1 hikaru /* XXX */
1037 1.1 hikaru
1038 1.2 simonb #endif /* _OCTEON_COP2VAR_H_ */
1039