crypto: octeon - add instruction definitions for MD5
authorAaro Koskinen <aaro.koskinen@iki.fi>
Sun, 21 Dec 2014 20:53:59 +0000 (22:53 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 23 Dec 2014 21:14:22 +0000 (08:14 +1100)
Add instruction definitions for MD5. Based on information extracted
from EdgeRouter Pro GPL source tarball.

Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
arch/mips/cavium-octeon/crypto/octeon-crypto.h

index 5ca86d4ead5268a5d58749bc5ef749fb2ce27f5e..3f65bc6ccb839dbf612f7e67b149e5dac956baf9 100644 (file)
@@ -4,14 +4,70 @@
  * for more details.
  *
  * Copyright (C) 2012-2013 Cavium Inc., All Rights Reserved.
+ *
+ * MD5 instruction definitions added by Aaro Koskinen <aaro.koskinen@iki.fi>.
+ *
  */
 #ifndef __LINUX_OCTEON_CRYPTO_H
 #define __LINUX_OCTEON_CRYPTO_H
 
 #include <linux/sched.h>
+#include <asm/mipsregs.h>
 
 extern unsigned long octeon_crypto_enable(struct octeon_cop2_state *state);
 extern void octeon_crypto_disable(struct octeon_cop2_state *state,
                                  unsigned long flags);
 
+/*
+ * Macros needed to implement MD5:
+ */
+
+/*
+ * The index can be 0-1.
+ */
+#define write_octeon_64bit_hash_dword(value, index)    \
+do {                                                   \
+       __asm__ __volatile__ (                          \
+       "dmtc2 %[rt],0x0048+" STR(index)                \
+       :                                               \
+       : [rt] "d" (value));                            \
+} while (0)
+
+/*
+ * The index can be 0-1.
+ */
+#define read_octeon_64bit_hash_dword(index)            \
+({                                                     \
+       u64 __value;                                    \
+                                                       \
+       __asm__ __volatile__ (                          \
+       "dmfc2 %[rt],0x0048+" STR(index)                \
+       : [rt] "=d" (__value)                           \
+       : );                                            \
+                                                       \
+       __value;                                        \
+})
+
+/*
+ * The index can be 0-6.
+ */
+#define write_octeon_64bit_block_dword(value, index)   \
+do {                                                   \
+       __asm__ __volatile__ (                          \
+       "dmtc2 %[rt],0x0040+" STR(index)                \
+       :                                               \
+       : [rt] "d" (value));                            \
+} while (0)
+
+/*
+ * The value is the final block dword (64-bit).
+ */
+#define octeon_md5_start(value)                                \
+do {                                                   \
+       __asm__ __volatile__ (                          \
+       "dmtc2 %[rt],0x4047"                            \
+       :                                               \
+       : [rt] "d" (value));                            \
+} while (0)
+
 #endif /* __LINUX_OCTEON_CRYPTO_H */