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