xref: /openbmc/linux/lib/crc7.c (revision 8276d3b4)
140b0b3f8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2ad241528SJan Nikitenko /*
3ad241528SJan Nikitenko  *      crc7.c
4ad241528SJan Nikitenko  */
5ad241528SJan Nikitenko 
6ad241528SJan Nikitenko #include <linux/types.h>
7ad241528SJan Nikitenko #include <linux/module.h>
8ad241528SJan Nikitenko #include <linux/crc7.h>
9ad241528SJan Nikitenko 
10ad241528SJan Nikitenko 
111836eea2SGeorge Spelvin /*
121836eea2SGeorge Spelvin  * Table for CRC-7 (polynomial x^7 + x^3 + 1).
131836eea2SGeorge Spelvin  * This is a big-endian CRC (msbit is highest power of x),
141836eea2SGeorge Spelvin  * aligned so the msbit of the byte is the x^6 coefficient
151836eea2SGeorge Spelvin  * and the lsbit is not used.
161836eea2SGeorge Spelvin  */
171836eea2SGeorge Spelvin const u8 crc7_be_syndrome_table[256] = {
181836eea2SGeorge Spelvin 	0x00, 0x12, 0x24, 0x36, 0x48, 0x5a, 0x6c, 0x7e,
191836eea2SGeorge Spelvin 	0x90, 0x82, 0xb4, 0xa6, 0xd8, 0xca, 0xfc, 0xee,
201836eea2SGeorge Spelvin 	0x32, 0x20, 0x16, 0x04, 0x7a, 0x68, 0x5e, 0x4c,
211836eea2SGeorge Spelvin 	0xa2, 0xb0, 0x86, 0x94, 0xea, 0xf8, 0xce, 0xdc,
221836eea2SGeorge Spelvin 	0x64, 0x76, 0x40, 0x52, 0x2c, 0x3e, 0x08, 0x1a,
231836eea2SGeorge Spelvin 	0xf4, 0xe6, 0xd0, 0xc2, 0xbc, 0xae, 0x98, 0x8a,
241836eea2SGeorge Spelvin 	0x56, 0x44, 0x72, 0x60, 0x1e, 0x0c, 0x3a, 0x28,
251836eea2SGeorge Spelvin 	0xc6, 0xd4, 0xe2, 0xf0, 0x8e, 0x9c, 0xaa, 0xb8,
261836eea2SGeorge Spelvin 	0xc8, 0xda, 0xec, 0xfe, 0x80, 0x92, 0xa4, 0xb6,
271836eea2SGeorge Spelvin 	0x58, 0x4a, 0x7c, 0x6e, 0x10, 0x02, 0x34, 0x26,
281836eea2SGeorge Spelvin 	0xfa, 0xe8, 0xde, 0xcc, 0xb2, 0xa0, 0x96, 0x84,
291836eea2SGeorge Spelvin 	0x6a, 0x78, 0x4e, 0x5c, 0x22, 0x30, 0x06, 0x14,
301836eea2SGeorge Spelvin 	0xac, 0xbe, 0x88, 0x9a, 0xe4, 0xf6, 0xc0, 0xd2,
311836eea2SGeorge Spelvin 	0x3c, 0x2e, 0x18, 0x0a, 0x74, 0x66, 0x50, 0x42,
321836eea2SGeorge Spelvin 	0x9e, 0x8c, 0xba, 0xa8, 0xd6, 0xc4, 0xf2, 0xe0,
331836eea2SGeorge Spelvin 	0x0e, 0x1c, 0x2a, 0x38, 0x46, 0x54, 0x62, 0x70,
341836eea2SGeorge Spelvin 	0x82, 0x90, 0xa6, 0xb4, 0xca, 0xd8, 0xee, 0xfc,
351836eea2SGeorge Spelvin 	0x12, 0x00, 0x36, 0x24, 0x5a, 0x48, 0x7e, 0x6c,
361836eea2SGeorge Spelvin 	0xb0, 0xa2, 0x94, 0x86, 0xf8, 0xea, 0xdc, 0xce,
371836eea2SGeorge Spelvin 	0x20, 0x32, 0x04, 0x16, 0x68, 0x7a, 0x4c, 0x5e,
381836eea2SGeorge Spelvin 	0xe6, 0xf4, 0xc2, 0xd0, 0xae, 0xbc, 0x8a, 0x98,
391836eea2SGeorge Spelvin 	0x76, 0x64, 0x52, 0x40, 0x3e, 0x2c, 0x1a, 0x08,
401836eea2SGeorge Spelvin 	0xd4, 0xc6, 0xf0, 0xe2, 0x9c, 0x8e, 0xb8, 0xaa,
411836eea2SGeorge Spelvin 	0x44, 0x56, 0x60, 0x72, 0x0c, 0x1e, 0x28, 0x3a,
421836eea2SGeorge Spelvin 	0x4a, 0x58, 0x6e, 0x7c, 0x02, 0x10, 0x26, 0x34,
431836eea2SGeorge Spelvin 	0xda, 0xc8, 0xfe, 0xec, 0x92, 0x80, 0xb6, 0xa4,
441836eea2SGeorge Spelvin 	0x78, 0x6a, 0x5c, 0x4e, 0x30, 0x22, 0x14, 0x06,
451836eea2SGeorge Spelvin 	0xe8, 0xfa, 0xcc, 0xde, 0xa0, 0xb2, 0x84, 0x96,
461836eea2SGeorge Spelvin 	0x2e, 0x3c, 0x0a, 0x18, 0x66, 0x74, 0x42, 0x50,
471836eea2SGeorge Spelvin 	0xbe, 0xac, 0x9a, 0x88, 0xf6, 0xe4, 0xd2, 0xc0,
481836eea2SGeorge Spelvin 	0x1c, 0x0e, 0x38, 0x2a, 0x54, 0x46, 0x70, 0x62,
491836eea2SGeorge Spelvin 	0x8c, 0x9e, 0xa8, 0xba, 0xc4, 0xd6, 0xe0, 0xf2
50ad241528SJan Nikitenko };
511836eea2SGeorge Spelvin EXPORT_SYMBOL(crc7_be_syndrome_table);
52ad241528SJan Nikitenko 
53ad241528SJan Nikitenko /**
54*8276d3b4SMauro Carvalho Chehab  * crc7_be - update the CRC7 for the data buffer
55ad241528SJan Nikitenko  * @crc:     previous CRC7 value
56ad241528SJan Nikitenko  * @buffer:  data pointer
57ad241528SJan Nikitenko  * @len:     number of bytes in the buffer
58ad241528SJan Nikitenko  * Context: any
59ad241528SJan Nikitenko  *
60ad241528SJan Nikitenko  * Returns the updated CRC7 value.
611836eea2SGeorge Spelvin  * The CRC7 is left-aligned in the byte (the lsbit is always 0), as that
621836eea2SGeorge Spelvin  * makes the computation easier, and all callers want it in that form.
631836eea2SGeorge Spelvin  *
64ad241528SJan Nikitenko  */
crc7_be(u8 crc,const u8 * buffer,size_t len)651836eea2SGeorge Spelvin u8 crc7_be(u8 crc, const u8 *buffer, size_t len)
66ad241528SJan Nikitenko {
67ad241528SJan Nikitenko 	while (len--)
681836eea2SGeorge Spelvin 		crc = crc7_be_byte(crc, *buffer++);
69ad241528SJan Nikitenko 	return crc;
70ad241528SJan Nikitenko }
711836eea2SGeorge Spelvin EXPORT_SYMBOL(crc7_be);
72ad241528SJan Nikitenko 
73ad241528SJan Nikitenko MODULE_DESCRIPTION("CRC7 calculations");
74ad241528SJan Nikitenko MODULE_LICENSE("GPL");
75