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