xref: /spdk/lib/util/crc64.c (revision 95d6c9fac17572b107042103439aafd696d60b0e)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2023 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "crc_internal.h"
7 #include "spdk/crc64.h"
8 
9 #ifdef SPDK_CONFIG_ISAL
10 #include "isa-l/include/crc64.h"
11 
12 uint64_t
13 spdk_crc64_nvme(const void *buf, size_t len, uint64_t crc)
14 {
15 	return crc64_rocksoft_refl(crc, (const uint8_t *)buf, len);
16 }
17 
18 #else
19 
20 static const uint64_t crc64_rocksoft_refl_table[256] = {
21 	0x0000000000000000ULL, 0x7f6ef0c830358979ULL,
22 	0xfedde190606b12f2ULL, 0x81b31158505e9b8bULL,
23 	0xc962e5739841b68fULL, 0xb60c15bba8743ff6ULL,
24 	0x37bf04e3f82aa47dULL, 0x48d1f42bc81f2d04ULL,
25 	0xa61cecb46814fe75ULL, 0xd9721c7c5821770cULL,
26 	0x58c10d24087fec87ULL, 0x27affdec384a65feULL,
27 	0x6f7e09c7f05548faULL, 0x1010f90fc060c183ULL,
28 	0x91a3e857903e5a08ULL, 0xeecd189fa00bd371ULL,
29 	0x78e0ff3b88be6f81ULL, 0x078e0ff3b88be6f8ULL,
30 	0x863d1eabe8d57d73ULL, 0xf953ee63d8e0f40aULL,
31 	0xb1821a4810ffd90eULL, 0xceecea8020ca5077ULL,
32 	0x4f5ffbd87094cbfcULL, 0x30310b1040a14285ULL,
33 	0xdefc138fe0aa91f4ULL, 0xa192e347d09f188dULL,
34 	0x2021f21f80c18306ULL, 0x5f4f02d7b0f40a7fULL,
35 	0x179ef6fc78eb277bULL, 0x68f0063448deae02ULL,
36 	0xe943176c18803589ULL, 0x962de7a428b5bcf0ULL,
37 	0xf1c1fe77117cdf02ULL, 0x8eaf0ebf2149567bULL,
38 	0x0f1c1fe77117cdf0ULL, 0x7072ef2f41224489ULL,
39 	0x38a31b04893d698dULL, 0x47cdebccb908e0f4ULL,
40 	0xc67efa94e9567b7fULL, 0xb9100a5cd963f206ULL,
41 	0x57dd12c379682177ULL, 0x28b3e20b495da80eULL,
42 	0xa900f35319033385ULL, 0xd66e039b2936bafcULL,
43 	0x9ebff7b0e12997f8ULL, 0xe1d10778d11c1e81ULL,
44 	0x606216208142850aULL, 0x1f0ce6e8b1770c73ULL,
45 	0x8921014c99c2b083ULL, 0xf64ff184a9f739faULL,
46 	0x77fce0dcf9a9a271ULL, 0x08921014c99c2b08ULL,
47 	0x4043e43f0183060cULL, 0x3f2d14f731b68f75ULL,
48 	0xbe9e05af61e814feULL, 0xc1f0f56751dd9d87ULL,
49 	0x2f3dedf8f1d64ef6ULL, 0x50531d30c1e3c78fULL,
50 	0xd1e00c6891bd5c04ULL, 0xae8efca0a188d57dULL,
51 	0xe65f088b6997f879ULL, 0x9931f84359a27100ULL,
52 	0x1882e91b09fcea8bULL, 0x67ec19d339c963f2ULL,
53 	0xd75adabd7a6e2d6fULL, 0xa8342a754a5ba416ULL,
54 	0x29873b2d1a053f9dULL, 0x56e9cbe52a30b6e4ULL,
55 	0x1e383fcee22f9be0ULL, 0x6156cf06d21a1299ULL,
56 	0xe0e5de5e82448912ULL, 0x9f8b2e96b271006bULL,
57 	0x71463609127ad31aULL, 0x0e28c6c1224f5a63ULL,
58 	0x8f9bd7997211c1e8ULL, 0xf0f5275142244891ULL,
59 	0xb824d37a8a3b6595ULL, 0xc74a23b2ba0eececULL,
60 	0x46f932eaea507767ULL, 0x3997c222da65fe1eULL,
61 	0xafba2586f2d042eeULL, 0xd0d4d54ec2e5cb97ULL,
62 	0x5167c41692bb501cULL, 0x2e0934dea28ed965ULL,
63 	0x66d8c0f56a91f461ULL, 0x19b6303d5aa47d18ULL,
64 	0x980521650afae693ULL, 0xe76bd1ad3acf6feaULL,
65 	0x09a6c9329ac4bc9bULL, 0x76c839faaaf135e2ULL,
66 	0xf77b28a2faafae69ULL, 0x8815d86aca9a2710ULL,
67 	0xc0c42c4102850a14ULL, 0xbfaadc8932b0836dULL,
68 	0x3e19cdd162ee18e6ULL, 0x41773d1952db919fULL,
69 	0x269b24ca6b12f26dULL, 0x59f5d4025b277b14ULL,
70 	0xd846c55a0b79e09fULL, 0xa72835923b4c69e6ULL,
71 	0xeff9c1b9f35344e2ULL, 0x90973171c366cd9bULL,
72 	0x1124202993385610ULL, 0x6e4ad0e1a30ddf69ULL,
73 	0x8087c87e03060c18ULL, 0xffe938b633338561ULL,
74 	0x7e5a29ee636d1eeaULL, 0x0134d92653589793ULL,
75 	0x49e52d0d9b47ba97ULL, 0x368bddc5ab7233eeULL,
76 	0xb738cc9dfb2ca865ULL, 0xc8563c55cb19211cULL,
77 	0x5e7bdbf1e3ac9decULL, 0x21152b39d3991495ULL,
78 	0xa0a63a6183c78f1eULL, 0xdfc8caa9b3f20667ULL,
79 	0x97193e827bed2b63ULL, 0xe877ce4a4bd8a21aULL,
80 	0x69c4df121b863991ULL, 0x16aa2fda2bb3b0e8ULL,
81 	0xf86737458bb86399ULL, 0x8709c78dbb8deae0ULL,
82 	0x06bad6d5ebd3716bULL, 0x79d4261ddbe6f812ULL,
83 	0x3105d23613f9d516ULL, 0x4e6b22fe23cc5c6fULL,
84 	0xcfd833a67392c7e4ULL, 0xb0b6c36e43a74e9dULL,
85 	0x9a6c9329ac4bc9b5ULL, 0xe50263e19c7e40ccULL,
86 	0x64b172b9cc20db47ULL, 0x1bdf8271fc15523eULL,
87 	0x530e765a340a7f3aULL, 0x2c608692043ff643ULL,
88 	0xadd397ca54616dc8ULL, 0xd2bd67026454e4b1ULL,
89 	0x3c707f9dc45f37c0ULL, 0x431e8f55f46abeb9ULL,
90 	0xc2ad9e0da4342532ULL, 0xbdc36ec59401ac4bULL,
91 	0xf5129aee5c1e814fULL, 0x8a7c6a266c2b0836ULL,
92 	0x0bcf7b7e3c7593bdULL, 0x74a18bb60c401ac4ULL,
93 	0xe28c6c1224f5a634ULL, 0x9de29cda14c02f4dULL,
94 	0x1c518d82449eb4c6ULL, 0x633f7d4a74ab3dbfULL,
95 	0x2bee8961bcb410bbULL, 0x548079a98c8199c2ULL,
96 	0xd53368f1dcdf0249ULL, 0xaa5d9839ecea8b30ULL,
97 	0x449080a64ce15841ULL, 0x3bfe706e7cd4d138ULL,
98 	0xba4d61362c8a4ab3ULL, 0xc52391fe1cbfc3caULL,
99 	0x8df265d5d4a0eeceULL, 0xf29c951de49567b7ULL,
100 	0x732f8445b4cbfc3cULL, 0x0c41748d84fe7545ULL,
101 	0x6bad6d5ebd3716b7ULL, 0x14c39d968d029fceULL,
102 	0x95708ccedd5c0445ULL, 0xea1e7c06ed698d3cULL,
103 	0xa2cf882d2576a038ULL, 0xdda178e515432941ULL,
104 	0x5c1269bd451db2caULL, 0x237c997575283bb3ULL,
105 	0xcdb181ead523e8c2ULL, 0xb2df7122e51661bbULL,
106 	0x336c607ab548fa30ULL, 0x4c0290b2857d7349ULL,
107 	0x04d364994d625e4dULL, 0x7bbd94517d57d734ULL,
108 	0xfa0e85092d094cbfULL, 0x856075c11d3cc5c6ULL,
109 	0x134d926535897936ULL, 0x6c2362ad05bcf04fULL,
110 	0xed9073f555e26bc4ULL, 0x92fe833d65d7e2bdULL,
111 	0xda2f7716adc8cfb9ULL, 0xa54187de9dfd46c0ULL,
112 	0x24f29686cda3dd4bULL, 0x5b9c664efd965432ULL,
113 	0xb5517ed15d9d8743ULL, 0xca3f8e196da80e3aULL,
114 	0x4b8c9f413df695b1ULL, 0x34e26f890dc31cc8ULL,
115 	0x7c339ba2c5dc31ccULL, 0x035d6b6af5e9b8b5ULL,
116 	0x82ee7a32a5b7233eULL, 0xfd808afa9582aa47ULL,
117 	0x4d364994d625e4daULL, 0x3258b95ce6106da3ULL,
118 	0xb3eba804b64ef628ULL, 0xcc8558cc867b7f51ULL,
119 	0x8454ace74e645255ULL, 0xfb3a5c2f7e51db2cULL,
120 	0x7a894d772e0f40a7ULL, 0x05e7bdbf1e3ac9deULL,
121 	0xeb2aa520be311aafULL, 0x944455e88e0493d6ULL,
122 	0x15f744b0de5a085dULL, 0x6a99b478ee6f8124ULL,
123 	0x224840532670ac20ULL, 0x5d26b09b16452559ULL,
124 	0xdc95a1c3461bbed2ULL, 0xa3fb510b762e37abULL,
125 	0x35d6b6af5e9b8b5bULL, 0x4ab846676eae0222ULL,
126 	0xcb0b573f3ef099a9ULL, 0xb465a7f70ec510d0ULL,
127 	0xfcb453dcc6da3dd4ULL, 0x83daa314f6efb4adULL,
128 	0x0269b24ca6b12f26ULL, 0x7d0742849684a65fULL,
129 	0x93ca5a1b368f752eULL, 0xeca4aad306bafc57ULL,
130 	0x6d17bb8b56e467dcULL, 0x12794b4366d1eea5ULL,
131 	0x5aa8bf68aecec3a1ULL, 0x25c64fa09efb4ad8ULL,
132 	0xa4755ef8cea5d153ULL, 0xdb1bae30fe90582aULL,
133 	0xbcf7b7e3c7593bd8ULL, 0xc399472bf76cb2a1ULL,
134 	0x422a5673a732292aULL, 0x3d44a6bb9707a053ULL,
135 	0x759552905f188d57ULL, 0x0afba2586f2d042eULL,
136 	0x8b48b3003f739fa5ULL, 0xf42643c80f4616dcULL,
137 	0x1aeb5b57af4dc5adULL, 0x6585ab9f9f784cd4ULL,
138 	0xe436bac7cf26d75fULL, 0x9b584a0fff135e26ULL,
139 	0xd389be24370c7322ULL, 0xace74eec0739fa5bULL,
140 	0x2d545fb4576761d0ULL, 0x523aaf7c6752e8a9ULL,
141 	0xc41748d84fe75459ULL, 0xbb79b8107fd2dd20ULL,
142 	0x3acaa9482f8c46abULL, 0x45a459801fb9cfd2ULL,
143 	0x0d75adabd7a6e2d6ULL, 0x721b5d63e7936bafULL,
144 	0xf3a84c3bb7cdf024ULL, 0x8cc6bcf387f8795dULL,
145 	0x620ba46c27f3aa2cULL, 0x1d6554a417c62355ULL,
146 	0x9cd645fc4798b8deULL, 0xe3b8b53477ad31a7ULL,
147 	0xab69411fbfb21ca3ULL, 0xd407b1d78f8795daULL,
148 	0x55b4a08fdfd90e51ULL, 0x2ada5047efec8728ULL
149 };
150 
151 static inline uint64_t
152 crc64_rocksoft_refl_base(uint64_t seed, const uint8_t *buf, uint64_t len)
153 {
154 	uint64_t i, crc = ~seed;
155 
156 	for (i = 0; i < len; i++) {
157 		uint8_t byte = buf[i];
158 		crc = crc64_rocksoft_refl_table[(uint8_t) crc ^ byte] ^ (crc >> 8);
159 	}
160 
161 	return ~crc;
162 }
163 
164 uint64_t
165 spdk_crc64_nvme(const void *buf, size_t len, uint64_t crc)
166 {
167 	return crc64_rocksoft_refl_base(crc, (const uint8_t *)buf, len);
168 }
169 #endif
170