1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * See lib/crc64.c for the related specification and polynomial arithmetic.
4  */
5 #ifndef _LINUX_CRC64_H
6 #define _LINUX_CRC64_H
7 
8 #include <linux/types.h>
9 
10 u64 crc64_be_arch(u64 crc, const u8 *p, size_t len);
11 u64 crc64_be_generic(u64 crc, const u8 *p, size_t len);
12 u64 crc64_nvme_arch(u64 crc, const u8 *p, size_t len);
13 u64 crc64_nvme_generic(u64 crc, const u8 *p, size_t len);
14 
15 /**
16  * crc64_be - Calculate bitwise big-endian ECMA-182 CRC64
17  * @crc: seed value for computation. 0 or (u64)~0 for a new CRC calculation,
18  *       or the previous crc64 value if computing incrementally.
19  * @p: pointer to buffer over which CRC64 is run
20  * @len: length of buffer @p
21  */
crc64_be(u64 crc,const void * p,size_t len)22 static inline u64 crc64_be(u64 crc, const void *p, size_t len)
23 {
24 	if (IS_ENABLED(CONFIG_CRC64_ARCH))
25 		return crc64_be_arch(crc, p, len);
26 	return crc64_be_generic(crc, p, len);
27 }
28 
29 /**
30  * crc64_nvme - Calculate CRC64-NVME
31  * @crc: seed value for computation. 0 for a new CRC calculation, or the
32  *	 previous crc64 value if computing incrementally.
33  * @p: pointer to buffer over which CRC64 is run
34  * @len: length of buffer @p
35  *
36  * This computes the CRC64 defined in the NVME NVM Command Set Specification,
37  * *including the bitwise inversion at the beginning and end*.
38  */
crc64_nvme(u64 crc,const void * p,size_t len)39 static inline u64 crc64_nvme(u64 crc, const void *p, size_t len)
40 {
41 	if (IS_ENABLED(CONFIG_CRC64_ARCH))
42 		return ~crc64_nvme_arch(~crc, p, len);
43 	return ~crc64_nvme_generic(~crc, p, len);
44 }
45 
46 #endif /* _LINUX_CRC64_H */
47