1f399d4a2SKyungmin Park /*
2f399d4a2SKyungmin Park * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com>
3f399d4a2SKyungmin Park * Nicer crc32 functions/docs submitted by linux@horizon.com. Thanks!
4f399d4a2SKyungmin Park * Code was from the public domain, copyright abandoned. Code was
5f399d4a2SKyungmin Park * subsequently included in the kernel, thus was re-licensed under the
6f399d4a2SKyungmin Park * GNU GPL v2.
7f399d4a2SKyungmin Park *
8f399d4a2SKyungmin Park * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com>
9f399d4a2SKyungmin Park * Same crc32 function was used in 5 other places in the kernel.
10f399d4a2SKyungmin Park * I made one version, and deleted the others.
11f399d4a2SKyungmin Park * There are various incantations of crc32(). Some use a seed of 0 or ~0.
12f399d4a2SKyungmin Park * Some xor at the end with ~0. The generic crc32() function takes
13f399d4a2SKyungmin Park * seed as an argument, and doesn't xor at the end. Then individual
14f399d4a2SKyungmin Park * users can do whatever they need.
15f399d4a2SKyungmin Park * drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0.
16f399d4a2SKyungmin Park * fs/jffs2 uses seed 0, doesn't xor with ~0.
17f399d4a2SKyungmin Park * fs/partitions/efi.c uses seed ~0, xor's with ~0.
18f399d4a2SKyungmin Park *
19f399d4a2SKyungmin Park * This source code is licensed under the GNU General Public License,
20f399d4a2SKyungmin Park * Version 2. See the file COPYING for more details.
21f399d4a2SKyungmin Park */
22f399d4a2SKyungmin Park
23*ff94bc40SHeiko Schocher #ifndef __UBOOT__
24f399d4a2SKyungmin Park #include <linux/crc32.h>
25f399d4a2SKyungmin Park #include <linux/kernel.h>
26f399d4a2SKyungmin Park #include <linux/module.h>
27f399d4a2SKyungmin Park #include <linux/compiler.h>
28f399d4a2SKyungmin Park #endif
29f399d4a2SKyungmin Park #include <linux/types.h>
30f399d4a2SKyungmin Park
31f399d4a2SKyungmin Park #include <asm/byteorder.h>
32f399d4a2SKyungmin Park
33*ff94bc40SHeiko Schocher #ifndef __UBOOT__
34f399d4a2SKyungmin Park #include <linux/slab.h>
35f399d4a2SKyungmin Park #include <linux/init.h>
36f399d4a2SKyungmin Park #include <asm/atomic.h>
37f399d4a2SKyungmin Park #endif
38f399d4a2SKyungmin Park #include "crc32defs.h"
39f399d4a2SKyungmin Park #define CRC_LE_BITS 8
40f399d4a2SKyungmin Park
41f399d4a2SKyungmin Park #if CRC_LE_BITS == 8
42eef1cf2dSKim Phillips #define tole(x) cpu_to_le32(x)
43eef1cf2dSKim Phillips #define tobe(x) cpu_to_be32(x)
44f399d4a2SKyungmin Park #else
45f399d4a2SKyungmin Park #define tole(x) (x)
46f399d4a2SKyungmin Park #define tobe(x) (x)
47f399d4a2SKyungmin Park #endif
48f399d4a2SKyungmin Park #include "crc32table.h"
49*ff94bc40SHeiko Schocher #ifndef __UBOOT__
50f399d4a2SKyungmin Park MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
51f399d4a2SKyungmin Park MODULE_DESCRIPTION("Ethernet CRC32 calculations");
52f399d4a2SKyungmin Park MODULE_LICENSE("GPL");
53f399d4a2SKyungmin Park #endif
54f399d4a2SKyungmin Park /**
55f399d4a2SKyungmin Park * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32
56f399d4a2SKyungmin Park * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
57f399d4a2SKyungmin Park * other uses, or the previous crc32 value if computing incrementally.
58f399d4a2SKyungmin Park * @p: pointer to buffer over which CRC is run
59f399d4a2SKyungmin Park * @len: length of buffer @p
60f399d4a2SKyungmin Park */
61f399d4a2SKyungmin Park u32 crc32_le(u32 crc, unsigned char const *p, size_t len);
62f399d4a2SKyungmin Park
63f399d4a2SKyungmin Park #if CRC_LE_BITS == 1
64f399d4a2SKyungmin Park /*
65f399d4a2SKyungmin Park * In fact, the table-based code will work in this case, but it can be
66f399d4a2SKyungmin Park * simplified by inlining the table in ?: form.
67f399d4a2SKyungmin Park */
68f399d4a2SKyungmin Park
crc32_le(u32 crc,unsigned char const * p,size_t len)69f399d4a2SKyungmin Park u32 crc32_le(u32 crc, unsigned char const *p, size_t len)
70f399d4a2SKyungmin Park {
71f399d4a2SKyungmin Park int i;
72f399d4a2SKyungmin Park while (len--) {
73f399d4a2SKyungmin Park crc ^= *p++;
74f399d4a2SKyungmin Park for (i = 0; i < 8; i++)
75f399d4a2SKyungmin Park crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0);
76f399d4a2SKyungmin Park }
77f399d4a2SKyungmin Park return crc;
78f399d4a2SKyungmin Park }
79f399d4a2SKyungmin Park #else /* Table-based approach */
80f399d4a2SKyungmin Park
crc32_le(u32 crc,unsigned char const * p,size_t len)81f399d4a2SKyungmin Park u32 crc32_le(u32 crc, unsigned char const *p, size_t len)
82f399d4a2SKyungmin Park {
83f399d4a2SKyungmin Park # if CRC_LE_BITS == 8
84f399d4a2SKyungmin Park const u32 *b =(u32 *)p;
85f399d4a2SKyungmin Park const u32 *tab = crc32table_le;
86f399d4a2SKyungmin Park
87f399d4a2SKyungmin Park # ifdef __LITTLE_ENDIAN
88f399d4a2SKyungmin Park # define DO_CRC(x) crc = tab[ (crc ^ (x)) & 255 ] ^ (crc>>8)
89f399d4a2SKyungmin Park # else
90f399d4a2SKyungmin Park # define DO_CRC(x) crc = tab[ ((crc >> 24) ^ (x)) & 255] ^ (crc<<8)
91f399d4a2SKyungmin Park # endif
92455ae7e8SWolfgang Denk /* printf("Crc32_le crc=%x\n",crc); */
93f399d4a2SKyungmin Park crc = __cpu_to_le32(crc);
94f399d4a2SKyungmin Park /* Align it */
95f399d4a2SKyungmin Park if((((long)b)&3 && len)){
96f399d4a2SKyungmin Park do {
97f399d4a2SKyungmin Park u8 *p = (u8 *)b;
98f399d4a2SKyungmin Park DO_CRC(*p++);
99f399d4a2SKyungmin Park b = (void *)p;
100f399d4a2SKyungmin Park } while ((--len) && ((long)b)&3 );
101f399d4a2SKyungmin Park }
102f399d4a2SKyungmin Park if((len >= 4)){
103f399d4a2SKyungmin Park /* load data 32 bits wide, xor data 32 bits wide. */
104f399d4a2SKyungmin Park size_t save_len = len & 3;
105f399d4a2SKyungmin Park len = len >> 2;
106f399d4a2SKyungmin Park --b; /* use pre increment below(*++b) for speed */
107f399d4a2SKyungmin Park do {
108f399d4a2SKyungmin Park crc ^= *++b;
109f399d4a2SKyungmin Park DO_CRC(0);
110f399d4a2SKyungmin Park DO_CRC(0);
111f399d4a2SKyungmin Park DO_CRC(0);
112f399d4a2SKyungmin Park DO_CRC(0);
113f399d4a2SKyungmin Park } while (--len);
114f399d4a2SKyungmin Park b++; /* point to next byte(s) */
115f399d4a2SKyungmin Park len = save_len;
116f399d4a2SKyungmin Park }
117f399d4a2SKyungmin Park /* And the last few bytes */
118f399d4a2SKyungmin Park if(len){
119f399d4a2SKyungmin Park do {
120f399d4a2SKyungmin Park u8 *p = (u8 *)b;
121f399d4a2SKyungmin Park DO_CRC(*p++);
122f399d4a2SKyungmin Park b = (void *)p;
123f399d4a2SKyungmin Park } while (--len);
124f399d4a2SKyungmin Park }
125f399d4a2SKyungmin Park
126f399d4a2SKyungmin Park return __le32_to_cpu(crc);
127f399d4a2SKyungmin Park #undef ENDIAN_SHIFT
128f399d4a2SKyungmin Park #undef DO_CRC
129f399d4a2SKyungmin Park
130f399d4a2SKyungmin Park # elif CRC_LE_BITS == 4
131f399d4a2SKyungmin Park while (len--) {
132f399d4a2SKyungmin Park crc ^= *p++;
133f399d4a2SKyungmin Park crc = (crc >> 4) ^ crc32table_le[crc & 15];
134f399d4a2SKyungmin Park crc = (crc >> 4) ^ crc32table_le[crc & 15];
135f399d4a2SKyungmin Park }
136f399d4a2SKyungmin Park return crc;
137f399d4a2SKyungmin Park # elif CRC_LE_BITS == 2
138f399d4a2SKyungmin Park while (len--) {
139f399d4a2SKyungmin Park crc ^= *p++;
140f399d4a2SKyungmin Park crc = (crc >> 2) ^ crc32table_le[crc & 3];
141f399d4a2SKyungmin Park crc = (crc >> 2) ^ crc32table_le[crc & 3];
142f399d4a2SKyungmin Park crc = (crc >> 2) ^ crc32table_le[crc & 3];
143f399d4a2SKyungmin Park crc = (crc >> 2) ^ crc32table_le[crc & 3];
144f399d4a2SKyungmin Park }
145f399d4a2SKyungmin Park return crc;
146f399d4a2SKyungmin Park # endif
147f399d4a2SKyungmin Park }
148f399d4a2SKyungmin Park #endif
149*ff94bc40SHeiko Schocher #ifndef __UBOOT__
150f399d4a2SKyungmin Park /**
151f399d4a2SKyungmin Park * crc32_be() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32
152f399d4a2SKyungmin Park * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
153f399d4a2SKyungmin Park * other uses, or the previous crc32 value if computing incrementally.
154f399d4a2SKyungmin Park * @p: pointer to buffer over which CRC is run
155f399d4a2SKyungmin Park * @len: length of buffer @p
156f399d4a2SKyungmin Park */
157f399d4a2SKyungmin Park u32 __attribute_pure__ crc32_be(u32 crc, unsigned char const *p, size_t len);
158f399d4a2SKyungmin Park
159f399d4a2SKyungmin Park #if CRC_BE_BITS == 1
160f399d4a2SKyungmin Park /*
161f399d4a2SKyungmin Park * In fact, the table-based code will work in this case, but it can be
162f399d4a2SKyungmin Park * simplified by inlining the table in ?: form.
163f399d4a2SKyungmin Park */
164f399d4a2SKyungmin Park
crc32_be(u32 crc,unsigned char const * p,size_t len)165f399d4a2SKyungmin Park u32 __attribute_pure__ crc32_be(u32 crc, unsigned char const *p, size_t len)
166f399d4a2SKyungmin Park {
167f399d4a2SKyungmin Park int i;
168f399d4a2SKyungmin Park while (len--) {
169f399d4a2SKyungmin Park crc ^= *p++ << 24;
170f399d4a2SKyungmin Park for (i = 0; i < 8; i++)
171f399d4a2SKyungmin Park crc =
172f399d4a2SKyungmin Park (crc << 1) ^ ((crc & 0x80000000) ? CRCPOLY_BE :
173f399d4a2SKyungmin Park 0);
174f399d4a2SKyungmin Park }
175f399d4a2SKyungmin Park return crc;
176f399d4a2SKyungmin Park }
177f399d4a2SKyungmin Park
178f399d4a2SKyungmin Park #else /* Table-based approach */
crc32_be(u32 crc,unsigned char const * p,size_t len)179f399d4a2SKyungmin Park u32 __attribute_pure__ crc32_be(u32 crc, unsigned char const *p, size_t len)
180f399d4a2SKyungmin Park {
181f399d4a2SKyungmin Park # if CRC_BE_BITS == 8
182f399d4a2SKyungmin Park const u32 *b =(u32 *)p;
183f399d4a2SKyungmin Park const u32 *tab = crc32table_be;
184f399d4a2SKyungmin Park
185f399d4a2SKyungmin Park # ifdef __LITTLE_ENDIAN
186f399d4a2SKyungmin Park # define DO_CRC(x) crc = tab[ (crc ^ (x)) & 255 ] ^ (crc>>8)
187f399d4a2SKyungmin Park # else
188f399d4a2SKyungmin Park # define DO_CRC(x) crc = tab[ ((crc >> 24) ^ (x)) & 255] ^ (crc<<8)
189f399d4a2SKyungmin Park # endif
190f399d4a2SKyungmin Park
191f399d4a2SKyungmin Park crc = __cpu_to_be32(crc);
192f399d4a2SKyungmin Park /* Align it */
193f399d4a2SKyungmin Park if(unlikely(((long)b)&3 && len)){
194f399d4a2SKyungmin Park do {
195f399d4a2SKyungmin Park u8 *p = (u8 *)b;
196f399d4a2SKyungmin Park DO_CRC(*p++);
197f399d4a2SKyungmin Park b = (u32 *)p;
198f399d4a2SKyungmin Park } while ((--len) && ((long)b)&3 );
199f399d4a2SKyungmin Park }
200f399d4a2SKyungmin Park if(likely(len >= 4)){
201f399d4a2SKyungmin Park /* load data 32 bits wide, xor data 32 bits wide. */
202f399d4a2SKyungmin Park size_t save_len = len & 3;
203f399d4a2SKyungmin Park len = len >> 2;
204f399d4a2SKyungmin Park --b; /* use pre increment below(*++b) for speed */
205f399d4a2SKyungmin Park do {
206f399d4a2SKyungmin Park crc ^= *++b;
207f399d4a2SKyungmin Park DO_CRC(0);
208f399d4a2SKyungmin Park DO_CRC(0);
209f399d4a2SKyungmin Park DO_CRC(0);
210f399d4a2SKyungmin Park DO_CRC(0);
211f399d4a2SKyungmin Park } while (--len);
212f399d4a2SKyungmin Park b++; /* point to next byte(s) */
213f399d4a2SKyungmin Park len = save_len;
214f399d4a2SKyungmin Park }
215f399d4a2SKyungmin Park /* And the last few bytes */
216f399d4a2SKyungmin Park if(len){
217f399d4a2SKyungmin Park do {
218f399d4a2SKyungmin Park u8 *p = (u8 *)b;
219f399d4a2SKyungmin Park DO_CRC(*p++);
220f399d4a2SKyungmin Park b = (void *)p;
221f399d4a2SKyungmin Park } while (--len);
222f399d4a2SKyungmin Park }
223f399d4a2SKyungmin Park return __be32_to_cpu(crc);
224f399d4a2SKyungmin Park #undef ENDIAN_SHIFT
225f399d4a2SKyungmin Park #undef DO_CRC
226f399d4a2SKyungmin Park
227f399d4a2SKyungmin Park # elif CRC_BE_BITS == 4
228f399d4a2SKyungmin Park while (len--) {
229f399d4a2SKyungmin Park crc ^= *p++ << 24;
230f399d4a2SKyungmin Park crc = (crc << 4) ^ crc32table_be[crc >> 28];
231f399d4a2SKyungmin Park crc = (crc << 4) ^ crc32table_be[crc >> 28];
232f399d4a2SKyungmin Park }
233f399d4a2SKyungmin Park return crc;
234f399d4a2SKyungmin Park # elif CRC_BE_BITS == 2
235f399d4a2SKyungmin Park while (len--) {
236f399d4a2SKyungmin Park crc ^= *p++ << 24;
237f399d4a2SKyungmin Park crc = (crc << 2) ^ crc32table_be[crc >> 30];
238f399d4a2SKyungmin Park crc = (crc << 2) ^ crc32table_be[crc >> 30];
239f399d4a2SKyungmin Park crc = (crc << 2) ^ crc32table_be[crc >> 30];
240f399d4a2SKyungmin Park crc = (crc << 2) ^ crc32table_be[crc >> 30];
241f399d4a2SKyungmin Park }
242f399d4a2SKyungmin Park return crc;
243f399d4a2SKyungmin Park # endif
244f399d4a2SKyungmin Park }
245f399d4a2SKyungmin Park #endif
246f399d4a2SKyungmin Park
247f399d4a2SKyungmin Park EXPORT_SYMBOL(crc32_le);
248f399d4a2SKyungmin Park EXPORT_SYMBOL(crc32_be);
249f399d4a2SKyungmin Park #endif
250f399d4a2SKyungmin Park /*
251f399d4a2SKyungmin Park * A brief CRC tutorial.
252f399d4a2SKyungmin Park *
253f399d4a2SKyungmin Park * A CRC is a long-division remainder. You add the CRC to the message,
254f399d4a2SKyungmin Park * and the whole thing (message+CRC) is a multiple of the given
255f399d4a2SKyungmin Park * CRC polynomial. To check the CRC, you can either check that the
256f399d4a2SKyungmin Park * CRC matches the recomputed value, *or* you can check that the
257f399d4a2SKyungmin Park * remainder computed on the message+CRC is 0. This latter approach
258f399d4a2SKyungmin Park * is used by a lot of hardware implementations, and is why so many
259f399d4a2SKyungmin Park * protocols put the end-of-frame flag after the CRC.
260f399d4a2SKyungmin Park *
261f399d4a2SKyungmin Park * It's actually the same long division you learned in school, except that
262f399d4a2SKyungmin Park * - We're working in binary, so the digits are only 0 and 1, and
263f399d4a2SKyungmin Park * - When dividing polynomials, there are no carries. Rather than add and
264f399d4a2SKyungmin Park * subtract, we just xor. Thus, we tend to get a bit sloppy about
265f399d4a2SKyungmin Park * the difference between adding and subtracting.
266f399d4a2SKyungmin Park *
267f399d4a2SKyungmin Park * A 32-bit CRC polynomial is actually 33 bits long. But since it's
268f399d4a2SKyungmin Park * 33 bits long, bit 32 is always going to be set, so usually the CRC
269f399d4a2SKyungmin Park * is written in hex with the most significant bit omitted. (If you're
270f399d4a2SKyungmin Park * familiar with the IEEE 754 floating-point format, it's the same idea.)
271f399d4a2SKyungmin Park *
272f399d4a2SKyungmin Park * Note that a CRC is computed over a string of *bits*, so you have
273f399d4a2SKyungmin Park * to decide on the endianness of the bits within each byte. To get
274f399d4a2SKyungmin Park * the best error-detecting properties, this should correspond to the
275f399d4a2SKyungmin Park * order they're actually sent. For example, standard RS-232 serial is
276f399d4a2SKyungmin Park * little-endian; the most significant bit (sometimes used for parity)
277f399d4a2SKyungmin Park * is sent last. And when appending a CRC word to a message, you should
278f399d4a2SKyungmin Park * do it in the right order, matching the endianness.
279f399d4a2SKyungmin Park *
280f399d4a2SKyungmin Park * Just like with ordinary division, the remainder is always smaller than
281f399d4a2SKyungmin Park * the divisor (the CRC polynomial) you're dividing by. Each step of the
282f399d4a2SKyungmin Park * division, you take one more digit (bit) of the dividend and append it
283f399d4a2SKyungmin Park * to the current remainder. Then you figure out the appropriate multiple
284f399d4a2SKyungmin Park * of the divisor to subtract to being the remainder back into range.
285f399d4a2SKyungmin Park * In binary, it's easy - it has to be either 0 or 1, and to make the
286f399d4a2SKyungmin Park * XOR cancel, it's just a copy of bit 32 of the remainder.
287f399d4a2SKyungmin Park *
288f399d4a2SKyungmin Park * When computing a CRC, we don't care about the quotient, so we can
289f399d4a2SKyungmin Park * throw the quotient bit away, but subtract the appropriate multiple of
290f399d4a2SKyungmin Park * the polynomial from the remainder and we're back to where we started,
291f399d4a2SKyungmin Park * ready to process the next bit.
292f399d4a2SKyungmin Park *
293f399d4a2SKyungmin Park * A big-endian CRC written this way would be coded like:
294f399d4a2SKyungmin Park * for (i = 0; i < input_bits; i++) {
295f399d4a2SKyungmin Park * multiple = remainder & 0x80000000 ? CRCPOLY : 0;
296f399d4a2SKyungmin Park * remainder = (remainder << 1 | next_input_bit()) ^ multiple;
297f399d4a2SKyungmin Park * }
298f399d4a2SKyungmin Park * Notice how, to get at bit 32 of the shifted remainder, we look
299f399d4a2SKyungmin Park * at bit 31 of the remainder *before* shifting it.
300f399d4a2SKyungmin Park *
301f399d4a2SKyungmin Park * But also notice how the next_input_bit() bits we're shifting into
302f399d4a2SKyungmin Park * the remainder don't actually affect any decision-making until
303f399d4a2SKyungmin Park * 32 bits later. Thus, the first 32 cycles of this are pretty boring.
304f399d4a2SKyungmin Park * Also, to add the CRC to a message, we need a 32-bit-long hole for it at
305f399d4a2SKyungmin Park * the end, so we have to add 32 extra cycles shifting in zeros at the
306f399d4a2SKyungmin Park * end of every message,
307f399d4a2SKyungmin Park *
308f399d4a2SKyungmin Park * So the standard trick is to rearrage merging in the next_input_bit()
309f399d4a2SKyungmin Park * until the moment it's needed. Then the first 32 cycles can be precomputed,
310f399d4a2SKyungmin Park * and merging in the final 32 zero bits to make room for the CRC can be
311f399d4a2SKyungmin Park * skipped entirely.
312f399d4a2SKyungmin Park * This changes the code to:
313f399d4a2SKyungmin Park * for (i = 0; i < input_bits; i++) {
314f399d4a2SKyungmin Park * remainder ^= next_input_bit() << 31;
315f399d4a2SKyungmin Park * multiple = (remainder & 0x80000000) ? CRCPOLY : 0;
316f399d4a2SKyungmin Park * remainder = (remainder << 1) ^ multiple;
317f399d4a2SKyungmin Park * }
318f399d4a2SKyungmin Park * With this optimization, the little-endian code is simpler:
319f399d4a2SKyungmin Park * for (i = 0; i < input_bits; i++) {
320f399d4a2SKyungmin Park * remainder ^= next_input_bit();
321f399d4a2SKyungmin Park * multiple = (remainder & 1) ? CRCPOLY : 0;
322f399d4a2SKyungmin Park * remainder = (remainder >> 1) ^ multiple;
323f399d4a2SKyungmin Park * }
324f399d4a2SKyungmin Park *
325f399d4a2SKyungmin Park * Note that the other details of endianness have been hidden in CRCPOLY
326f399d4a2SKyungmin Park * (which must be bit-reversed) and next_input_bit().
327f399d4a2SKyungmin Park *
328f399d4a2SKyungmin Park * However, as long as next_input_bit is returning the bits in a sensible
329f399d4a2SKyungmin Park * order, we can actually do the merging 8 or more bits at a time rather
330f399d4a2SKyungmin Park * than one bit at a time:
331f399d4a2SKyungmin Park * for (i = 0; i < input_bytes; i++) {
332f399d4a2SKyungmin Park * remainder ^= next_input_byte() << 24;
333f399d4a2SKyungmin Park * for (j = 0; j < 8; j++) {
334f399d4a2SKyungmin Park * multiple = (remainder & 0x80000000) ? CRCPOLY : 0;
335f399d4a2SKyungmin Park * remainder = (remainder << 1) ^ multiple;
336f399d4a2SKyungmin Park * }
337f399d4a2SKyungmin Park * }
338f399d4a2SKyungmin Park * Or in little-endian:
339f399d4a2SKyungmin Park * for (i = 0; i < input_bytes; i++) {
340f399d4a2SKyungmin Park * remainder ^= next_input_byte();
341f399d4a2SKyungmin Park * for (j = 0; j < 8; j++) {
342f399d4a2SKyungmin Park * multiple = (remainder & 1) ? CRCPOLY : 0;
343f399d4a2SKyungmin Park * remainder = (remainder << 1) ^ multiple;
344f399d4a2SKyungmin Park * }
345f399d4a2SKyungmin Park * }
346f399d4a2SKyungmin Park * If the input is a multiple of 32 bits, you can even XOR in a 32-bit
347f399d4a2SKyungmin Park * word at a time and increase the inner loop count to 32.
348f399d4a2SKyungmin Park *
349f399d4a2SKyungmin Park * You can also mix and match the two loop styles, for example doing the
350f399d4a2SKyungmin Park * bulk of a message byte-at-a-time and adding bit-at-a-time processing
351f399d4a2SKyungmin Park * for any fractional bytes at the end.
352f399d4a2SKyungmin Park *
353f399d4a2SKyungmin Park * The only remaining optimization is to the byte-at-a-time table method.
354f399d4a2SKyungmin Park * Here, rather than just shifting one bit of the remainder to decide
355f399d4a2SKyungmin Park * in the correct multiple to subtract, we can shift a byte at a time.
356f399d4a2SKyungmin Park * This produces a 40-bit (rather than a 33-bit) intermediate remainder,
357f399d4a2SKyungmin Park * but again the multiple of the polynomial to subtract depends only on
358f399d4a2SKyungmin Park * the high bits, the high 8 bits in this case.
359f399d4a2SKyungmin Park *
360f399d4a2SKyungmin Park * The multile we need in that case is the low 32 bits of a 40-bit
361f399d4a2SKyungmin Park * value whose high 8 bits are given, and which is a multiple of the
362f399d4a2SKyungmin Park * generator polynomial. This is simply the CRC-32 of the given
363f399d4a2SKyungmin Park * one-byte message.
364f399d4a2SKyungmin Park *
365f399d4a2SKyungmin Park * Two more details: normally, appending zero bits to a message which
366f399d4a2SKyungmin Park * is already a multiple of a polynomial produces a larger multiple of that
367f399d4a2SKyungmin Park * polynomial. To enable a CRC to detect this condition, it's common to
368f399d4a2SKyungmin Park * invert the CRC before appending it. This makes the remainder of the
369f399d4a2SKyungmin Park * message+crc come out not as zero, but some fixed non-zero value.
370f399d4a2SKyungmin Park *
371f399d4a2SKyungmin Park * The same problem applies to zero bits prepended to the message, and
372f399d4a2SKyungmin Park * a similar solution is used. Instead of starting with a remainder of
373f399d4a2SKyungmin Park * 0, an initial remainder of all ones is used. As long as you start
374f399d4a2SKyungmin Park * the same way on decoding, it doesn't make a difference.
375f399d4a2SKyungmin Park */
376f399d4a2SKyungmin Park
377f399d4a2SKyungmin Park #ifdef UNITTEST
378f399d4a2SKyungmin Park
379f399d4a2SKyungmin Park #include <stdlib.h>
380f399d4a2SKyungmin Park #include <stdio.h>
381f399d4a2SKyungmin Park
382*ff94bc40SHeiko Schocher #ifndef __UBOOT__
383f399d4a2SKyungmin Park static void
buf_dump(char const * prefix,unsigned char const * buf,size_t len)384f399d4a2SKyungmin Park buf_dump(char const *prefix, unsigned char const *buf, size_t len)
385f399d4a2SKyungmin Park {
386f399d4a2SKyungmin Park fputs(prefix, stdout);
387f399d4a2SKyungmin Park while (len--)
388f399d4a2SKyungmin Park printf(" %02x", *buf++);
389f399d4a2SKyungmin Park putchar('\n');
390f399d4a2SKyungmin Park
391f399d4a2SKyungmin Park }
392f399d4a2SKyungmin Park #endif
393f399d4a2SKyungmin Park
bytereverse(unsigned char * buf,size_t len)394f399d4a2SKyungmin Park static void bytereverse(unsigned char *buf, size_t len)
395f399d4a2SKyungmin Park {
396f399d4a2SKyungmin Park while (len--) {
397f399d4a2SKyungmin Park unsigned char x = bitrev8(*buf);
398f399d4a2SKyungmin Park *buf++ = x;
399f399d4a2SKyungmin Park }
400f399d4a2SKyungmin Park }
401f399d4a2SKyungmin Park
random_garbage(unsigned char * buf,size_t len)402f399d4a2SKyungmin Park static void random_garbage(unsigned char *buf, size_t len)
403f399d4a2SKyungmin Park {
404f399d4a2SKyungmin Park while (len--)
405f399d4a2SKyungmin Park *buf++ = (unsigned char) random();
406f399d4a2SKyungmin Park }
407f399d4a2SKyungmin Park
408*ff94bc40SHeiko Schocher #ifndef __UBOOT__
store_le(u32 x,unsigned char * buf)409f399d4a2SKyungmin Park static void store_le(u32 x, unsigned char *buf)
410f399d4a2SKyungmin Park {
411f399d4a2SKyungmin Park buf[0] = (unsigned char) x;
412f399d4a2SKyungmin Park buf[1] = (unsigned char) (x >> 8);
413f399d4a2SKyungmin Park buf[2] = (unsigned char) (x >> 16);
414f399d4a2SKyungmin Park buf[3] = (unsigned char) (x >> 24);
415f399d4a2SKyungmin Park }
416f399d4a2SKyungmin Park #endif
417f399d4a2SKyungmin Park
store_be(u32 x,unsigned char * buf)418f399d4a2SKyungmin Park static void store_be(u32 x, unsigned char *buf)
419f399d4a2SKyungmin Park {
420f399d4a2SKyungmin Park buf[0] = (unsigned char) (x >> 24);
421f399d4a2SKyungmin Park buf[1] = (unsigned char) (x >> 16);
422f399d4a2SKyungmin Park buf[2] = (unsigned char) (x >> 8);
423f399d4a2SKyungmin Park buf[3] = (unsigned char) x;
424f399d4a2SKyungmin Park }
425f399d4a2SKyungmin Park
426f399d4a2SKyungmin Park /*
427f399d4a2SKyungmin Park * This checks that CRC(buf + CRC(buf)) = 0, and that
428f399d4a2SKyungmin Park * CRC commutes with bit-reversal. This has the side effect
429f399d4a2SKyungmin Park * of bytewise bit-reversing the input buffer, and returns
430f399d4a2SKyungmin Park * the CRC of the reversed buffer.
431f399d4a2SKyungmin Park */
test_step(u32 init,unsigned char * buf,size_t len)432f399d4a2SKyungmin Park static u32 test_step(u32 init, unsigned char *buf, size_t len)
433f399d4a2SKyungmin Park {
434f399d4a2SKyungmin Park u32 crc1, crc2;
435f399d4a2SKyungmin Park size_t i;
436f399d4a2SKyungmin Park
437f399d4a2SKyungmin Park crc1 = crc32_be(init, buf, len);
438f399d4a2SKyungmin Park store_be(crc1, buf + len);
439f399d4a2SKyungmin Park crc2 = crc32_be(init, buf, len + 4);
440f399d4a2SKyungmin Park if (crc2)
441f399d4a2SKyungmin Park printf("\nCRC cancellation fail: 0x%08x should be 0\n",
442f399d4a2SKyungmin Park crc2);
443f399d4a2SKyungmin Park
444f399d4a2SKyungmin Park for (i = 0; i <= len + 4; i++) {
445f399d4a2SKyungmin Park crc2 = crc32_be(init, buf, i);
446f399d4a2SKyungmin Park crc2 = crc32_be(crc2, buf + i, len + 4 - i);
447f399d4a2SKyungmin Park if (crc2)
448f399d4a2SKyungmin Park printf("\nCRC split fail: 0x%08x\n", crc2);
449f399d4a2SKyungmin Park }
450f399d4a2SKyungmin Park
451f399d4a2SKyungmin Park /* Now swap it around for the other test */
452f399d4a2SKyungmin Park
453f399d4a2SKyungmin Park bytereverse(buf, len + 4);
454f399d4a2SKyungmin Park init = bitrev32(init);
455f399d4a2SKyungmin Park crc2 = bitrev32(crc1);
456f399d4a2SKyungmin Park if (crc1 != bitrev32(crc2))
457f399d4a2SKyungmin Park printf("\nBit reversal fail: 0x%08x -> 0x%08x -> 0x%08x\n",
458f399d4a2SKyungmin Park crc1, crc2, bitrev32(crc2));
459f399d4a2SKyungmin Park crc1 = crc32_le(init, buf, len);
460f399d4a2SKyungmin Park if (crc1 != crc2)
461f399d4a2SKyungmin Park printf("\nCRC endianness fail: 0x%08x != 0x%08x\n", crc1,
462f399d4a2SKyungmin Park crc2);
463f399d4a2SKyungmin Park crc2 = crc32_le(init, buf, len + 4);
464f399d4a2SKyungmin Park if (crc2)
465f399d4a2SKyungmin Park printf("\nCRC cancellation fail: 0x%08x should be 0\n",
466f399d4a2SKyungmin Park crc2);
467f399d4a2SKyungmin Park
468f399d4a2SKyungmin Park for (i = 0; i <= len + 4; i++) {
469f399d4a2SKyungmin Park crc2 = crc32_le(init, buf, i);
470f399d4a2SKyungmin Park crc2 = crc32_le(crc2, buf + i, len + 4 - i);
471f399d4a2SKyungmin Park if (crc2)
472f399d4a2SKyungmin Park printf("\nCRC split fail: 0x%08x\n", crc2);
473f399d4a2SKyungmin Park }
474f399d4a2SKyungmin Park
475f399d4a2SKyungmin Park return crc1;
476f399d4a2SKyungmin Park }
477f399d4a2SKyungmin Park
478f399d4a2SKyungmin Park #define SIZE 64
479f399d4a2SKyungmin Park #define INIT1 0
480f399d4a2SKyungmin Park #define INIT2 0
481f399d4a2SKyungmin Park
main(void)482f399d4a2SKyungmin Park int main(void)
483f399d4a2SKyungmin Park {
484f399d4a2SKyungmin Park unsigned char buf1[SIZE + 4];
485f399d4a2SKyungmin Park unsigned char buf2[SIZE + 4];
486f399d4a2SKyungmin Park unsigned char buf3[SIZE + 4];
487f399d4a2SKyungmin Park int i, j;
488f399d4a2SKyungmin Park u32 crc1, crc2, crc3;
489f399d4a2SKyungmin Park
490f399d4a2SKyungmin Park for (i = 0; i <= SIZE; i++) {
491f399d4a2SKyungmin Park printf("\rTesting length %d...", i);
492f399d4a2SKyungmin Park fflush(stdout);
493f399d4a2SKyungmin Park random_garbage(buf1, i);
494f399d4a2SKyungmin Park random_garbage(buf2, i);
495f399d4a2SKyungmin Park for (j = 0; j < i; j++)
496f399d4a2SKyungmin Park buf3[j] = buf1[j] ^ buf2[j];
497f399d4a2SKyungmin Park
498f399d4a2SKyungmin Park crc1 = test_step(INIT1, buf1, i);
499f399d4a2SKyungmin Park crc2 = test_step(INIT2, buf2, i);
500f399d4a2SKyungmin Park /* Now check that CRC(buf1 ^ buf2) = CRC(buf1) ^ CRC(buf2) */
501f399d4a2SKyungmin Park crc3 = test_step(INIT1 ^ INIT2, buf3, i);
502f399d4a2SKyungmin Park if (crc3 != (crc1 ^ crc2))
503f399d4a2SKyungmin Park printf("CRC XOR fail: 0x%08x != 0x%08x ^ 0x%08x\n",
504f399d4a2SKyungmin Park crc3, crc1, crc2);
505f399d4a2SKyungmin Park }
506f399d4a2SKyungmin Park printf("\nAll test complete. No failures expected.\n");
507f399d4a2SKyungmin Park return 0;
508f399d4a2SKyungmin Park }
509f399d4a2SKyungmin Park
510f399d4a2SKyungmin Park #endif /* UNITTEST */
511