diff options
author | David S. Miller <davem@davemloft.net> | 2012-08-23 05:47:36 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-08-23 05:47:36 +0200 |
commit | 442a7c40b1dac78588abfe8ed4c97e4bb8b36e73 (patch) | |
tree | 011ab920ea2f5868c01efa91531959d2b26e6368 /arch/sparc/crypto/crc32c_asm.S | |
parent | sparc64: Add AES driver making use of the new aes opcodes. (diff) | |
download | linux-442a7c40b1dac78588abfe8ed4c97e4bb8b36e73.tar.xz linux-442a7c40b1dac78588abfe8ed4c97e4bb8b36e73.zip |
sparc64: Add CRC32C driver making use of the new crc32c opcode.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc/crypto/crc32c_asm.S')
-rw-r--r-- | arch/sparc/crypto/crc32c_asm.S | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/arch/sparc/crypto/crc32c_asm.S b/arch/sparc/crypto/crc32c_asm.S new file mode 100644 index 000000000000..cb479ec72433 --- /dev/null +++ b/arch/sparc/crypto/crc32c_asm.S @@ -0,0 +1,29 @@ +#include <linux/linkage.h> +#include <asm/visasm.h> +#include <asm/asi.h> + +#define F3F(x,y,z) (((x)<<30)|((y)<<19)|((z)<<5)) + +#define FPD_ENCODE(x) (((x) >> 5) | ((x) & ~(0x20))) + +#define RS1(x) (FPD_ENCODE(x) << 14) +#define RS2(x) (FPD_ENCODE(x) << 0) +#define RD(x) (FPD_ENCODE(x) << 25) + +#define CRC32C(a,b,c) \ + .word (F3F(2,0x36,0x147)|RS1(a)|RS2(b)|RD(c)); + +ENTRY(crc32c_sparc64) + /* %o0=crc32p, %o1=data_ptr, %o2=len */ + VISEntryHalf + lda [%o0] ASI_PL, %f1 +1: ldd [%o1], %f2 + CRC32C(0,2,0) + subcc %o2, 8, %o2 + bne,pt %icc, 1b + add %o1, 0x8, %o1 + sta %f1, [%o0] ASI_PL + VISExitHalf +2: retl + nop +ENDPROC(crc32c_sparc64) |