18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 38c2ecf20Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 48c2ecf20Sopenharmony_ci * for more details. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Copyright (C) 2012-2013 Cavium Inc., All Rights Reserved. 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * MD5/SHA1/SHA256/SHA512 instruction definitions added by 98c2ecf20Sopenharmony_ci * Aaro Koskinen <aaro.koskinen@iki.fi>. 108c2ecf20Sopenharmony_ci * 118c2ecf20Sopenharmony_ci */ 128c2ecf20Sopenharmony_ci#ifndef __LINUX_OCTEON_CRYPTO_H 138c2ecf20Sopenharmony_ci#define __LINUX_OCTEON_CRYPTO_H 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#include <linux/sched.h> 168c2ecf20Sopenharmony_ci#include <asm/mipsregs.h> 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#define OCTEON_CR_OPCODE_PRIORITY 300 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ciextern unsigned long octeon_crypto_enable(struct octeon_cop2_state *state); 218c2ecf20Sopenharmony_ciextern void octeon_crypto_disable(struct octeon_cop2_state *state, 228c2ecf20Sopenharmony_ci unsigned long flags); 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci/* 258c2ecf20Sopenharmony_ci * Macros needed to implement MD5/SHA1/SHA256: 268c2ecf20Sopenharmony_ci */ 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci/* 298c2ecf20Sopenharmony_ci * The index can be 0-1 (MD5) or 0-2 (SHA1), 0-3 (SHA256). 308c2ecf20Sopenharmony_ci */ 318c2ecf20Sopenharmony_ci#define write_octeon_64bit_hash_dword(value, index) \ 328c2ecf20Sopenharmony_cido { \ 338c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 348c2ecf20Sopenharmony_ci "dmtc2 %[rt],0x0048+" STR(index) \ 358c2ecf20Sopenharmony_ci : \ 368c2ecf20Sopenharmony_ci : [rt] "d" (cpu_to_be64(value))); \ 378c2ecf20Sopenharmony_ci} while (0) 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci/* 408c2ecf20Sopenharmony_ci * The index can be 0-1 (MD5) or 0-2 (SHA1), 0-3 (SHA256). 418c2ecf20Sopenharmony_ci */ 428c2ecf20Sopenharmony_ci#define read_octeon_64bit_hash_dword(index) \ 438c2ecf20Sopenharmony_ci({ \ 448c2ecf20Sopenharmony_ci u64 __value; \ 458c2ecf20Sopenharmony_ci \ 468c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 478c2ecf20Sopenharmony_ci "dmfc2 %[rt],0x0048+" STR(index) \ 488c2ecf20Sopenharmony_ci : [rt] "=d" (__value) \ 498c2ecf20Sopenharmony_ci : ); \ 508c2ecf20Sopenharmony_ci \ 518c2ecf20Sopenharmony_ci be64_to_cpu(__value); \ 528c2ecf20Sopenharmony_ci}) 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci/* 558c2ecf20Sopenharmony_ci * The index can be 0-6. 568c2ecf20Sopenharmony_ci */ 578c2ecf20Sopenharmony_ci#define write_octeon_64bit_block_dword(value, index) \ 588c2ecf20Sopenharmony_cido { \ 598c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 608c2ecf20Sopenharmony_ci "dmtc2 %[rt],0x0040+" STR(index) \ 618c2ecf20Sopenharmony_ci : \ 628c2ecf20Sopenharmony_ci : [rt] "d" (cpu_to_be64(value))); \ 638c2ecf20Sopenharmony_ci} while (0) 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci/* 668c2ecf20Sopenharmony_ci * The value is the final block dword (64-bit). 678c2ecf20Sopenharmony_ci */ 688c2ecf20Sopenharmony_ci#define octeon_md5_start(value) \ 698c2ecf20Sopenharmony_cido { \ 708c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 718c2ecf20Sopenharmony_ci "dmtc2 %[rt],0x4047" \ 728c2ecf20Sopenharmony_ci : \ 738c2ecf20Sopenharmony_ci : [rt] "d" (cpu_to_be64(value))); \ 748c2ecf20Sopenharmony_ci} while (0) 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci/* 778c2ecf20Sopenharmony_ci * The value is the final block dword (64-bit). 788c2ecf20Sopenharmony_ci */ 798c2ecf20Sopenharmony_ci#define octeon_sha1_start(value) \ 808c2ecf20Sopenharmony_cido { \ 818c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 828c2ecf20Sopenharmony_ci "dmtc2 %[rt],0x4057" \ 838c2ecf20Sopenharmony_ci : \ 848c2ecf20Sopenharmony_ci : [rt] "d" (value)); \ 858c2ecf20Sopenharmony_ci} while (0) 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci/* 888c2ecf20Sopenharmony_ci * The value is the final block dword (64-bit). 898c2ecf20Sopenharmony_ci */ 908c2ecf20Sopenharmony_ci#define octeon_sha256_start(value) \ 918c2ecf20Sopenharmony_cido { \ 928c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 938c2ecf20Sopenharmony_ci "dmtc2 %[rt],0x404f" \ 948c2ecf20Sopenharmony_ci : \ 958c2ecf20Sopenharmony_ci : [rt] "d" (value)); \ 968c2ecf20Sopenharmony_ci} while (0) 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci/* 998c2ecf20Sopenharmony_ci * Macros needed to implement SHA512: 1008c2ecf20Sopenharmony_ci */ 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci/* 1038c2ecf20Sopenharmony_ci * The index can be 0-7. 1048c2ecf20Sopenharmony_ci */ 1058c2ecf20Sopenharmony_ci#define write_octeon_64bit_hash_sha512(value, index) \ 1068c2ecf20Sopenharmony_cido { \ 1078c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 1088c2ecf20Sopenharmony_ci "dmtc2 %[rt],0x0250+" STR(index) \ 1098c2ecf20Sopenharmony_ci : \ 1108c2ecf20Sopenharmony_ci : [rt] "d" (value)); \ 1118c2ecf20Sopenharmony_ci} while (0) 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci/* 1148c2ecf20Sopenharmony_ci * The index can be 0-7. 1158c2ecf20Sopenharmony_ci */ 1168c2ecf20Sopenharmony_ci#define read_octeon_64bit_hash_sha512(index) \ 1178c2ecf20Sopenharmony_ci({ \ 1188c2ecf20Sopenharmony_ci u64 __value; \ 1198c2ecf20Sopenharmony_ci \ 1208c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 1218c2ecf20Sopenharmony_ci "dmfc2 %[rt],0x0250+" STR(index) \ 1228c2ecf20Sopenharmony_ci : [rt] "=d" (__value) \ 1238c2ecf20Sopenharmony_ci : ); \ 1248c2ecf20Sopenharmony_ci \ 1258c2ecf20Sopenharmony_ci __value; \ 1268c2ecf20Sopenharmony_ci}) 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci/* 1298c2ecf20Sopenharmony_ci * The index can be 0-14. 1308c2ecf20Sopenharmony_ci */ 1318c2ecf20Sopenharmony_ci#define write_octeon_64bit_block_sha512(value, index) \ 1328c2ecf20Sopenharmony_cido { \ 1338c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 1348c2ecf20Sopenharmony_ci "dmtc2 %[rt],0x0240+" STR(index) \ 1358c2ecf20Sopenharmony_ci : \ 1368c2ecf20Sopenharmony_ci : [rt] "d" (value)); \ 1378c2ecf20Sopenharmony_ci} while (0) 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci/* 1408c2ecf20Sopenharmony_ci * The value is the final block word (64-bit). 1418c2ecf20Sopenharmony_ci */ 1428c2ecf20Sopenharmony_ci#define octeon_sha512_start(value) \ 1438c2ecf20Sopenharmony_cido { \ 1448c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 1458c2ecf20Sopenharmony_ci "dmtc2 %[rt],0x424f" \ 1468c2ecf20Sopenharmony_ci : \ 1478c2ecf20Sopenharmony_ci : [rt] "d" (value)); \ 1488c2ecf20Sopenharmony_ci} while (0) 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci/* 1518c2ecf20Sopenharmony_ci * The value is the final block dword (64-bit). 1528c2ecf20Sopenharmony_ci */ 1538c2ecf20Sopenharmony_ci#define octeon_sha1_start(value) \ 1548c2ecf20Sopenharmony_cido { \ 1558c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 1568c2ecf20Sopenharmony_ci "dmtc2 %[rt],0x4057" \ 1578c2ecf20Sopenharmony_ci : \ 1588c2ecf20Sopenharmony_ci : [rt] "d" (value)); \ 1598c2ecf20Sopenharmony_ci} while (0) 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci/* 1628c2ecf20Sopenharmony_ci * The value is the final block dword (64-bit). 1638c2ecf20Sopenharmony_ci */ 1648c2ecf20Sopenharmony_ci#define octeon_sha256_start(value) \ 1658c2ecf20Sopenharmony_cido { \ 1668c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 1678c2ecf20Sopenharmony_ci "dmtc2 %[rt],0x404f" \ 1688c2ecf20Sopenharmony_ci : \ 1698c2ecf20Sopenharmony_ci : [rt] "d" (value)); \ 1708c2ecf20Sopenharmony_ci} while (0) 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci/* 1738c2ecf20Sopenharmony_ci * Macros needed to implement SHA512: 1748c2ecf20Sopenharmony_ci */ 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci/* 1778c2ecf20Sopenharmony_ci * The index can be 0-7. 1788c2ecf20Sopenharmony_ci */ 1798c2ecf20Sopenharmony_ci#define write_octeon_64bit_hash_sha512(value, index) \ 1808c2ecf20Sopenharmony_cido { \ 1818c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 1828c2ecf20Sopenharmony_ci "dmtc2 %[rt],0x0250+" STR(index) \ 1838c2ecf20Sopenharmony_ci : \ 1848c2ecf20Sopenharmony_ci : [rt] "d" (value)); \ 1858c2ecf20Sopenharmony_ci} while (0) 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci/* 1888c2ecf20Sopenharmony_ci * The index can be 0-7. 1898c2ecf20Sopenharmony_ci */ 1908c2ecf20Sopenharmony_ci#define read_octeon_64bit_hash_sha512(index) \ 1918c2ecf20Sopenharmony_ci({ \ 1928c2ecf20Sopenharmony_ci u64 __value; \ 1938c2ecf20Sopenharmony_ci \ 1948c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 1958c2ecf20Sopenharmony_ci "dmfc2 %[rt],0x0250+" STR(index) \ 1968c2ecf20Sopenharmony_ci : [rt] "=d" (__value) \ 1978c2ecf20Sopenharmony_ci : ); \ 1988c2ecf20Sopenharmony_ci \ 1998c2ecf20Sopenharmony_ci __value; \ 2008c2ecf20Sopenharmony_ci}) 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci/* 2038c2ecf20Sopenharmony_ci * The index can be 0-14. 2048c2ecf20Sopenharmony_ci */ 2058c2ecf20Sopenharmony_ci#define write_octeon_64bit_block_sha512(value, index) \ 2068c2ecf20Sopenharmony_cido { \ 2078c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 2088c2ecf20Sopenharmony_ci "dmtc2 %[rt],0x0240+" STR(index) \ 2098c2ecf20Sopenharmony_ci : \ 2108c2ecf20Sopenharmony_ci : [rt] "d" (value)); \ 2118c2ecf20Sopenharmony_ci} while (0) 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci/* 2148c2ecf20Sopenharmony_ci * The value is the final block word (64-bit). 2158c2ecf20Sopenharmony_ci */ 2168c2ecf20Sopenharmony_ci#define octeon_sha512_start(value) \ 2178c2ecf20Sopenharmony_cido { \ 2188c2ecf20Sopenharmony_ci __asm__ __volatile__ ( \ 2198c2ecf20Sopenharmony_ci "dmtc2 %[rt],0x424f" \ 2208c2ecf20Sopenharmony_ci : \ 2218c2ecf20Sopenharmony_ci : [rt] "d" (value)); \ 2228c2ecf20Sopenharmony_ci} while (0) 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci#endif /* __LINUX_OCTEON_CRYPTO_H */ 225