diff options
author | David S. Miller <davem@davemloft.net> | 2012-08-22 23:47:36 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-08-22 23:47:36 -0400 |
commit | 442a7c40b1dac78588abfe8ed4c97e4bb8b36e73 (patch) | |
tree | 011ab920ea2f5868c01efa91531959d2b26e6368 /arch/sparc/crypto/crc32c_asm.S | |
parent | 9bf4852d3d195f771503d5be547ac940b0b3472a (diff) |
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 @@ | |||
1 | #include <linux/linkage.h> | ||
2 | #include <asm/visasm.h> | ||
3 | #include <asm/asi.h> | ||
4 | |||
5 | #define F3F(x,y,z) (((x)<<30)|((y)<<19)|((z)<<5)) | ||
6 | |||
7 | #define FPD_ENCODE(x) (((x) >> 5) | ((x) & ~(0x20))) | ||
8 | |||
9 | #define RS1(x) (FPD_ENCODE(x) << 14) | ||
10 | #define RS2(x) (FPD_ENCODE(x) << 0) | ||
11 | #define RD(x) (FPD_ENCODE(x) << 25) | ||
12 | |||
13 | #define CRC32C(a,b,c) \ | ||
14 | .word (F3F(2,0x36,0x147)|RS1(a)|RS2(b)|RD(c)); | ||
15 | |||
16 | ENTRY(crc32c_sparc64) | ||
17 | /* %o0=crc32p, %o1=data_ptr, %o2=len */ | ||
18 | VISEntryHalf | ||
19 | lda [%o0] ASI_PL, %f1 | ||
20 | 1: ldd [%o1], %f2 | ||
21 | CRC32C(0,2,0) | ||
22 | subcc %o2, 8, %o2 | ||
23 | bne,pt %icc, 1b | ||
24 | add %o1, 0x8, %o1 | ||
25 | sta %f1, [%o0] ASI_PL | ||
26 | VISExitHalf | ||
27 | 2: retl | ||
28 | nop | ||
29 | ENDPROC(crc32c_sparc64) | ||