forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
The NVM Express specification extended data integrity fields to 64 bits using the Rocksoft parameters. Add the poly to the crc64 table generation, and provide a generic library routine implementing the algorithm. The Rocksoft 64-bit CRC model parameters are as follows: Poly: 0xAD93D23594C93659 Initial value: 0xFFFFFFFFFFFFFFFF Reflected Input: True Reflected Output: True Xor Final: 0xFFFFFFFFFFFFFFFF Since this model used reflected bits, the implementation generates the reflected table so the result is ordered consistently. Cc: Christoph Hellwig <[email protected]> Cc: Hannes Reinecke <[email protected]> Cc: Martin K. Petersen <[email protected]> Signed-off-by: Keith Busch <[email protected]> Reviewed-by: Martin K. Petersen <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
- Loading branch information
1 parent
7ee8809
commit cbc0a40
Showing
3 changed files
with
70 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -22,6 +22,13 @@ | |
* x^24 + x^23 + x^22 + x^21 + x^19 + x^17 + x^13 + x^12 + x^10 + x^9 + | ||
* x^7 + x^4 + x + 1 | ||
* | ||
* crc64rocksoft[256] table is from the Rocksoft specification polynomial | ||
* defined as, | ||
* | ||
* x^64 + x^63 + x^61 + x^59 + x^58 + x^56 + x^55 + x^52 + x^49 + x^48 + x^47 + | ||
* x^46 + x^44 + x^41 + x^37 + x^36 + x^34 + x^32 + x^31 + x^28 + x^26 + x^23 + | ||
* x^22 + x^19 + x^16 + x^13 + x^12 + x^10 + x^9 + x^6 + x^4 + x^3 + 1 | ||
* | ||
* Copyright 2018 SUSE Linux. | ||
* Author: Coly Li <[email protected]> | ||
*/ | ||
|
@@ -55,3 +62,24 @@ u64 __pure crc64_be(u64 crc, const void *p, size_t len) | |
return crc; | ||
} | ||
EXPORT_SYMBOL_GPL(crc64_be); | ||
|
||
/** | ||
* crc64_rocksoft_generic - Calculate bitwise Rocksoft CRC64 | ||
* @crc: seed value for computation. 0 for a new CRC calculation, or the | ||
* previous crc64 value if computing incrementally. | ||
* @p: pointer to buffer over which CRC64 is run | ||
* @len: length of buffer @p | ||
*/ | ||
u64 __pure crc64_rocksoft_generic(u64 crc, const void *p, size_t len) | ||
{ | ||
const unsigned char *_p = p; | ||
size_t i; | ||
|
||
crc = ~crc; | ||
|
||
for (i = 0; i < len; i++) | ||
crc = (crc >> 8) ^ crc64rocksofttable[(crc & 0xff) ^ *_p++]; | ||
|
||
return ~crc; | ||
} | ||
EXPORT_SYMBOL_GPL(crc64_rocksoft_generic); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters