162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 362306a36Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 462306a36Sopenharmony_ci * for more details. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 2012-2013 Cavium Inc., All Rights Reserved. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * MD5/SHA1/SHA256/SHA512 instruction definitions added by 962306a36Sopenharmony_ci * Aaro Koskinen <aaro.koskinen@iki.fi>. 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci#ifndef __LINUX_OCTEON_CRYPTO_H 1362306a36Sopenharmony_ci#define __LINUX_OCTEON_CRYPTO_H 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <linux/sched.h> 1662306a36Sopenharmony_ci#include <asm/mipsregs.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define OCTEON_CR_OPCODE_PRIORITY 300 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ciextern unsigned long octeon_crypto_enable(struct octeon_cop2_state *state); 2162306a36Sopenharmony_ciextern void octeon_crypto_disable(struct octeon_cop2_state *state, 2262306a36Sopenharmony_ci unsigned long flags); 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* 2562306a36Sopenharmony_ci * Macros needed to implement MD5/SHA1/SHA256: 2662306a36Sopenharmony_ci */ 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* 2962306a36Sopenharmony_ci * The index can be 0-1 (MD5) or 0-2 (SHA1), 0-3 (SHA256). 3062306a36Sopenharmony_ci */ 3162306a36Sopenharmony_ci#define write_octeon_64bit_hash_dword(value, index) \ 3262306a36Sopenharmony_cido { \ 3362306a36Sopenharmony_ci __asm__ __volatile__ ( \ 3462306a36Sopenharmony_ci "dmtc2 %[rt],0x0048+" STR(index) \ 3562306a36Sopenharmony_ci : \ 3662306a36Sopenharmony_ci : [rt] "d" (cpu_to_be64(value))); \ 3762306a36Sopenharmony_ci} while (0) 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* 4062306a36Sopenharmony_ci * The index can be 0-1 (MD5) or 0-2 (SHA1), 0-3 (SHA256). 4162306a36Sopenharmony_ci */ 4262306a36Sopenharmony_ci#define read_octeon_64bit_hash_dword(index) \ 4362306a36Sopenharmony_ci({ \ 4462306a36Sopenharmony_ci __be64 __value; \ 4562306a36Sopenharmony_ci \ 4662306a36Sopenharmony_ci __asm__ __volatile__ ( \ 4762306a36Sopenharmony_ci "dmfc2 %[rt],0x0048+" STR(index) \ 4862306a36Sopenharmony_ci : [rt] "=d" (__value) \ 4962306a36Sopenharmony_ci : ); \ 5062306a36Sopenharmony_ci \ 5162306a36Sopenharmony_ci be64_to_cpu(__value); \ 5262306a36Sopenharmony_ci}) 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* 5562306a36Sopenharmony_ci * The index can be 0-6. 5662306a36Sopenharmony_ci */ 5762306a36Sopenharmony_ci#define write_octeon_64bit_block_dword(value, index) \ 5862306a36Sopenharmony_cido { \ 5962306a36Sopenharmony_ci __asm__ __volatile__ ( \ 6062306a36Sopenharmony_ci "dmtc2 %[rt],0x0040+" STR(index) \ 6162306a36Sopenharmony_ci : \ 6262306a36Sopenharmony_ci : [rt] "d" (cpu_to_be64(value))); \ 6362306a36Sopenharmony_ci} while (0) 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci/* 6662306a36Sopenharmony_ci * The value is the final block dword (64-bit). 6762306a36Sopenharmony_ci */ 6862306a36Sopenharmony_ci#define octeon_md5_start(value) \ 6962306a36Sopenharmony_cido { \ 7062306a36Sopenharmony_ci __asm__ __volatile__ ( \ 7162306a36Sopenharmony_ci "dmtc2 %[rt],0x4047" \ 7262306a36Sopenharmony_ci : \ 7362306a36Sopenharmony_ci : [rt] "d" (cpu_to_be64(value))); \ 7462306a36Sopenharmony_ci} while (0) 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* 7762306a36Sopenharmony_ci * The value is the final block dword (64-bit). 7862306a36Sopenharmony_ci */ 7962306a36Sopenharmony_ci#define octeon_sha1_start(value) \ 8062306a36Sopenharmony_cido { \ 8162306a36Sopenharmony_ci __asm__ __volatile__ ( \ 8262306a36Sopenharmony_ci "dmtc2 %[rt],0x4057" \ 8362306a36Sopenharmony_ci : \ 8462306a36Sopenharmony_ci : [rt] "d" (value)); \ 8562306a36Sopenharmony_ci} while (0) 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci/* 8862306a36Sopenharmony_ci * The value is the final block dword (64-bit). 8962306a36Sopenharmony_ci */ 9062306a36Sopenharmony_ci#define octeon_sha256_start(value) \ 9162306a36Sopenharmony_cido { \ 9262306a36Sopenharmony_ci __asm__ __volatile__ ( \ 9362306a36Sopenharmony_ci "dmtc2 %[rt],0x404f" \ 9462306a36Sopenharmony_ci : \ 9562306a36Sopenharmony_ci : [rt] "d" (value)); \ 9662306a36Sopenharmony_ci} while (0) 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci/* 9962306a36Sopenharmony_ci * Macros needed to implement SHA512: 10062306a36Sopenharmony_ci */ 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci/* 10362306a36Sopenharmony_ci * The index can be 0-7. 10462306a36Sopenharmony_ci */ 10562306a36Sopenharmony_ci#define write_octeon_64bit_hash_sha512(value, index) \ 10662306a36Sopenharmony_cido { \ 10762306a36Sopenharmony_ci __asm__ __volatile__ ( \ 10862306a36Sopenharmony_ci "dmtc2 %[rt],0x0250+" STR(index) \ 10962306a36Sopenharmony_ci : \ 11062306a36Sopenharmony_ci : [rt] "d" (value)); \ 11162306a36Sopenharmony_ci} while (0) 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/* 11462306a36Sopenharmony_ci * The index can be 0-7. 11562306a36Sopenharmony_ci */ 11662306a36Sopenharmony_ci#define read_octeon_64bit_hash_sha512(index) \ 11762306a36Sopenharmony_ci({ \ 11862306a36Sopenharmony_ci u64 __value; \ 11962306a36Sopenharmony_ci \ 12062306a36Sopenharmony_ci __asm__ __volatile__ ( \ 12162306a36Sopenharmony_ci "dmfc2 %[rt],0x0250+" STR(index) \ 12262306a36Sopenharmony_ci : [rt] "=d" (__value) \ 12362306a36Sopenharmony_ci : ); \ 12462306a36Sopenharmony_ci \ 12562306a36Sopenharmony_ci __value; \ 12662306a36Sopenharmony_ci}) 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci/* 12962306a36Sopenharmony_ci * The index can be 0-14. 13062306a36Sopenharmony_ci */ 13162306a36Sopenharmony_ci#define write_octeon_64bit_block_sha512(value, index) \ 13262306a36Sopenharmony_cido { \ 13362306a36Sopenharmony_ci __asm__ __volatile__ ( \ 13462306a36Sopenharmony_ci "dmtc2 %[rt],0x0240+" STR(index) \ 13562306a36Sopenharmony_ci : \ 13662306a36Sopenharmony_ci : [rt] "d" (value)); \ 13762306a36Sopenharmony_ci} while (0) 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci/* 14062306a36Sopenharmony_ci * The value is the final block word (64-bit). 14162306a36Sopenharmony_ci */ 14262306a36Sopenharmony_ci#define octeon_sha512_start(value) \ 14362306a36Sopenharmony_cido { \ 14462306a36Sopenharmony_ci __asm__ __volatile__ ( \ 14562306a36Sopenharmony_ci "dmtc2 %[rt],0x424f" \ 14662306a36Sopenharmony_ci : \ 14762306a36Sopenharmony_ci : [rt] "d" (value)); \ 14862306a36Sopenharmony_ci} while (0) 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci/* 15162306a36Sopenharmony_ci * The value is the final block dword (64-bit). 15262306a36Sopenharmony_ci */ 15362306a36Sopenharmony_ci#define octeon_sha1_start(value) \ 15462306a36Sopenharmony_cido { \ 15562306a36Sopenharmony_ci __asm__ __volatile__ ( \ 15662306a36Sopenharmony_ci "dmtc2 %[rt],0x4057" \ 15762306a36Sopenharmony_ci : \ 15862306a36Sopenharmony_ci : [rt] "d" (value)); \ 15962306a36Sopenharmony_ci} while (0) 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci/* 16262306a36Sopenharmony_ci * The value is the final block dword (64-bit). 16362306a36Sopenharmony_ci */ 16462306a36Sopenharmony_ci#define octeon_sha256_start(value) \ 16562306a36Sopenharmony_cido { \ 16662306a36Sopenharmony_ci __asm__ __volatile__ ( \ 16762306a36Sopenharmony_ci "dmtc2 %[rt],0x404f" \ 16862306a36Sopenharmony_ci : \ 16962306a36Sopenharmony_ci : [rt] "d" (value)); \ 17062306a36Sopenharmony_ci} while (0) 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci/* 17362306a36Sopenharmony_ci * Macros needed to implement SHA512: 17462306a36Sopenharmony_ci */ 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci/* 17762306a36Sopenharmony_ci * The index can be 0-7. 17862306a36Sopenharmony_ci */ 17962306a36Sopenharmony_ci#define write_octeon_64bit_hash_sha512(value, index) \ 18062306a36Sopenharmony_cido { \ 18162306a36Sopenharmony_ci __asm__ __volatile__ ( \ 18262306a36Sopenharmony_ci "dmtc2 %[rt],0x0250+" STR(index) \ 18362306a36Sopenharmony_ci : \ 18462306a36Sopenharmony_ci : [rt] "d" (value)); \ 18562306a36Sopenharmony_ci} while (0) 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci/* 18862306a36Sopenharmony_ci * The index can be 0-7. 18962306a36Sopenharmony_ci */ 19062306a36Sopenharmony_ci#define read_octeon_64bit_hash_sha512(index) \ 19162306a36Sopenharmony_ci({ \ 19262306a36Sopenharmony_ci u64 __value; \ 19362306a36Sopenharmony_ci \ 19462306a36Sopenharmony_ci __asm__ __volatile__ ( \ 19562306a36Sopenharmony_ci "dmfc2 %[rt],0x0250+" STR(index) \ 19662306a36Sopenharmony_ci : [rt] "=d" (__value) \ 19762306a36Sopenharmony_ci : ); \ 19862306a36Sopenharmony_ci \ 19962306a36Sopenharmony_ci __value; \ 20062306a36Sopenharmony_ci}) 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci/* 20362306a36Sopenharmony_ci * The index can be 0-14. 20462306a36Sopenharmony_ci */ 20562306a36Sopenharmony_ci#define write_octeon_64bit_block_sha512(value, index) \ 20662306a36Sopenharmony_cido { \ 20762306a36Sopenharmony_ci __asm__ __volatile__ ( \ 20862306a36Sopenharmony_ci "dmtc2 %[rt],0x0240+" STR(index) \ 20962306a36Sopenharmony_ci : \ 21062306a36Sopenharmony_ci : [rt] "d" (value)); \ 21162306a36Sopenharmony_ci} while (0) 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci/* 21462306a36Sopenharmony_ci * The value is the final block word (64-bit). 21562306a36Sopenharmony_ci */ 21662306a36Sopenharmony_ci#define octeon_sha512_start(value) \ 21762306a36Sopenharmony_cido { \ 21862306a36Sopenharmony_ci __asm__ __volatile__ ( \ 21962306a36Sopenharmony_ci "dmtc2 %[rt],0x424f" \ 22062306a36Sopenharmony_ci : \ 22162306a36Sopenharmony_ci : [rt] "d" (value)); \ 22262306a36Sopenharmony_ci} while (0) 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci#endif /* __LINUX_OCTEON_CRYPTO_H */ 225