1 /* SPDX-License-Identifier: GPL-2.0+ */ 2 /* 3 * (C) Copyright 2009 4 * Marvell Semiconductor <www.marvell.com> 5 * Written-by: Prafulla Wadaskar <prafulla@marvell.com> 6 */ 7 8 #ifndef _UBOOT_CRC_H 9 #define _UBOOT_CRC_H 10 11 #include <compiler.h> /* 'uint*' definitions */ 12 13 /** 14 * crc8() - Calculate and return CRC-8 of the data 15 * 16 * This uses an x^8 + x^2 + x + 1 polynomial. A table-based algorithm would 17 * be faster, but for only a few bytes it isn't worth the code size 18 * 19 * lib/crc8.c 20 * 21 * @crc_start: CRC8 start value 22 * @vptr: Buffer to checksum 23 * @len: Length of buffer in bytes 24 * @return CRC8 checksum 25 */ 26 unsigned int crc8(unsigned int crc_start, const unsigned char *vptr, int len); 27 28 /* lib/crc16.c - 16 bit CRC with polynomial x^16+x^12+x^5+1 (CRC-CCITT) */ 29 uint16_t crc16_ccitt(uint16_t crc_start, const unsigned char *s, int len); 30 /** 31 * crc16_ccitt_wd_buf - Perform CRC16-CCIT on an input buffer and return the 32 * 16-bit result (network byte-order) in an output buffer 33 * 34 * @in: input buffer 35 * @len: input buffer length 36 * @out: output buffer (at least 2 bytes) 37 * @chunk_sz: ignored 38 */ 39 void crc16_ccitt_wd_buf(const uint8_t *in, uint len, 40 uint8_t *out, uint chunk_sz); 41 42 /* lib/crc32.c */ 43 44 /** 45 * crc32 - Calculate the CRC32 for a block of data 46 * 47 * @crc: Input crc to chain from a previous calculution (use 0 to start a new 48 * calculation) 49 * @buf: Bytes to checksum 50 * @len: Number of bytes to checksum 51 * @return checksum value 52 */ 53 uint32_t crc32(uint32_t crc, const unsigned char *buf, uint len); 54 55 /** 56 * crc32_wd - Calculate the CRC32 for a block of data (watchdog version) 57 * 58 * This checksums the data @chunk_sz bytes at a time, calling WATCHDOG_RESET() 59 * after each chunk, to prevent the watchdog from firing. 60 * 61 * @crc: Input crc to chain from a previous calculution (use 0 to start a new 62 * calculation) 63 * @buf: Bytes to checksum 64 * @len: Number of bytes to checksum 65 * @chunk_sz: Chunk size to use between watchdog resets 66 * @return checksum 67 */ 68 uint32_t crc32_wd(uint32_t crc, const unsigned char *buf, uint len, 69 uint chunk_sz); 70 71 /** 72 * crc32_no_comp - Calculate the CRC32 for a block of data (no one's compliment) 73 * 74 * This version uses a different algorithm which doesn't use one's compliment. 75 * JFFS2 (and other things?) use this. 76 * 77 * @crc: Input crc to chain from a previous calculution (use 0 to start a new 78 * calculation) 79 * @buf: Bytes to checksum 80 * @len: Number of bytes to checksum 81 * @return checksum value 82 */ 83 uint32_t crc32_no_comp(uint32_t crc, const unsigned char *buf, uint len); 84 85 /** 86 * crc32_wd_buf - Perform CRC32 on a buffer and return result in buffer 87 * 88 * @input: Input buffer 89 * @ilen: Input buffer length 90 * @output: Place to put checksum result (4 bytes) 91 * @chunk_sz: Trigger watchdog after processing this many bytes 92 */ 93 void crc32_wd_buf(const uint8_t *input, uint ilen, uint8_t *output, 94 uint chunk_sz); 95 96 /* lib/crc32c.c */ 97 98 /** 99 * crc32c_init() - Set up a the CRC32 table 100 * 101 * This sets up 256-item table to aid in CRC32 calculation 102 * 103 * @crc32c_table: Place to put table 104 * @pol: polynomial to use 105 */ 106 void crc32c_init(uint32_t *crc32c_table, uint32_t pol); 107 108 /** 109 * crc32c_cal() - Perform CRC32 on a buffer given a table 110 * 111 * This algorithm uses the table (set up by crc32c_init() to speed up 112 * processing. 113 * 114 * @crc: Previous crc (use 0 at start) 115 * @data: Data bytes to checksum 116 * @length: Number of bytes to process 117 * @crc32c_table:: CRC table 118 * @return checksum value 119 */ 120 uint32_t crc32c_cal(uint32_t crc, const char *data, int length, 121 uint32_t *crc32c_table); 122 123 #endif /* _UBOOT_CRC_H */ 124