blob: 1086d2168ced4dd2a0610d52e5905d91ea5d7f73 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
Prafulla Wadaskar4d4d67d2009-08-16 05:28:19 +05302/*
3 * (C) Copyright 2009
4 * Marvell Semiconductor <www.marvell.com>
5 * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
Prafulla Wadaskar4d4d67d2009-08-16 05:28:19 +05306 */
7
8#ifndef _UBOOT_CRC_H
9#define _UBOOT_CRC_H
10
Simon Glassca9b0af2019-11-14 12:57:14 -070011/**
12 * crc8() - Calculate and return CRC-8 of the data
13 *
14 * This uses an x^8 + x^2 + x + 1 polynomial. A table-based algorithm would
15 * be faster, but for only a few bytes it isn't worth the code size
16 *
17 * lib/crc8.c
18 *
19 * @crc_start: CRC8 start value
20 * @vptr: Buffer to checksum
21 * @len: Length of buffer in bytes
22 * @return CRC8 checksum
23 */
oliver@schinagl.nl3255e9f2016-11-25 16:30:31 +010024unsigned int crc8(unsigned int crc_start, const unsigned char *vptr, int len);
25
Philipp Tomsich36b26d12018-11-25 19:22:18 +010026/* lib/crc16.c - 16 bit CRC with polynomial x^16+x^12+x^5+1 (CRC-CCITT) */
27uint16_t crc16_ccitt(uint16_t crc_start, const unsigned char *s, int len);
Philipp Tomsich6e2ac3e2018-11-25 19:22:19 +010028/**
29 * crc16_ccitt_wd_buf - Perform CRC16-CCIT on an input buffer and return the
30 * 16-bit result (network byte-order) in an output buffer
31 *
32 * @in: input buffer
33 * @len: input buffer length
34 * @out: output buffer (at least 2 bytes)
35 * @chunk_sz: ignored
36 */
37void crc16_ccitt_wd_buf(const uint8_t *in, uint len,
38 uint8_t *out, uint chunk_sz);
Philipp Tomsich36b26d12018-11-25 19:22:18 +010039
Peter Tyser685b7f52010-04-12 22:28:05 -050040/* lib/crc32.c */
Prafulla Wadaskar4d4d67d2009-08-16 05:28:19 +053041
Simon Glass0bbd76f2013-02-24 20:30:22 +000042/**
Simon Glassc2226bf2019-11-14 12:57:15 -070043 * crc32 - Calculate the CRC32 for a block of data
44 *
45 * @crc: Input crc to chain from a previous calculution (use 0 to start a new
46 * calculation)
47 * @buf: Bytes to checksum
48 * @len: Number of bytes to checksum
49 * @return checksum value
50 */
51uint32_t crc32(uint32_t crc, const unsigned char *buf, uint len);
52
53/**
54 * crc32_wd - Calculate the CRC32 for a block of data (watchdog version)
55 *
56 * This checksums the data @chunk_sz bytes at a time, calling WATCHDOG_RESET()
57 * after each chunk, to prevent the watchdog from firing.
58 *
59 * @crc: Input crc to chain from a previous calculution (use 0 to start a new
60 * calculation)
61 * @buf: Bytes to checksum
62 * @len: Number of bytes to checksum
63 * @chunk_sz: Chunk size to use between watchdog resets
64 * @return checksum
65 */
66uint32_t crc32_wd(uint32_t crc, const unsigned char *buf, uint len,
67 uint chunk_sz);
68
69/**
70 * crc32_no_comp - Calculate the CRC32 for a block of data (no one's compliment)
71 *
72 * This version uses a different algorithm which doesn't use one's compliment.
73 * JFFS2 (and other things?) use this.
74 *
75 * @crc: Input crc to chain from a previous calculution (use 0 to start a new
76 * calculation)
77 * @buf: Bytes to checksum
78 * @len: Number of bytes to checksum
79 * @return checksum value
80 */
81uint32_t crc32_no_comp(uint32_t crc, const unsigned char *buf, uint len);
82
83/**
Simon Glass0bbd76f2013-02-24 20:30:22 +000084 * crc32_wd_buf - Perform CRC32 on a buffer and return result in buffer
85 *
86 * @input: Input buffer
87 * @ilen: Input buffer length
88 * @output: Place to put checksum result (4 bytes)
89 * @chunk_sz: Trigger watchdog after processing this many bytes
90 */
Simon Glassc2226bf2019-11-14 12:57:15 -070091void crc32_wd_buf(const uint8_t *input, uint ilen, uint8_t *output,
92 uint chunk_sz);
Simon Glass0bbd76f2013-02-24 20:30:22 +000093
Marek BehĂșncdccc032017-09-03 17:00:23 +020094/* lib/crc32c.c */
Simon Glassc2226bf2019-11-14 12:57:15 -070095
96/**
97 * crc32c_init() - Set up a the CRC32 table
98 *
99 * This sets up 256-item table to aid in CRC32 calculation
100 *
101 * @crc32c_table: Place to put table
102 * @pol: polynomial to use
103 */
104void crc32c_init(uint32_t *crc32c_table, uint32_t pol);
105
106/**
107 * crc32c_cal() - Perform CRC32 on a buffer given a table
108 *
109 * This algorithm uses the table (set up by crc32c_init() to speed up
110 * processing.
111 *
112 * @crc: Previous crc (use 0 at start)
113 * @data: Data bytes to checksum
114 * @length: Number of bytes to process
115 * @crc32c_table:: CRC table
116 * @return checksum value
117 */
118uint32_t crc32c_cal(uint32_t crc, const char *data, int length,
119 uint32_t *crc32c_table);
Marek BehĂșncdccc032017-09-03 17:00:23 +0200120
Prafulla Wadaskar4d4d67d2009-08-16 05:28:19 +0530121#endif /* _UBOOT_CRC_H */