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 void crc8_wd_buf(const unsigned char *input, unsigned int len, 29 unsigned char output[1], unsigned int chunk_sz); 30 31 /* lib/crc16.c - 16 bit CRC with polynomial x^16 + x^15 + x^2 + 1 */ 32 uint16_t crc16(uint16_t crc, const unsigned char *buffer, size_t len); 33 34 /* lib/crc16-ccitt.c - 16 bit CRC with polynomial x^16+x^12+x^5+1 (CRC-CCITT) */ 35 uint16_t crc16_ccitt(uint16_t crc_start, const unsigned char *s, int len); 36 /** 37 * crc16_ccitt_wd_buf - Perform CRC16-CCIT on an input buffer and return the 38 * 16-bit result (network byte-order) in an output buffer 39 * 40 * @in: input buffer 41 * @len: input buffer length 42 * @out: output buffer (at least 2 bytes) 43 * @chunk_sz: ignored 44 */ 45 void crc16_ccitt_wd_buf(const uint8_t *in, uint len, 46 uint8_t *out, uint chunk_sz); 47 48 /* lib/crc32.c */ 49 50 /** 51 * crc32 - Calculate the CRC32 for a block of data 52 * 53 * @crc: Input crc to chain from a previous calculution (use 0 to start a new 54 * calculation) 55 * @buf: Bytes to checksum 56 * @len: Number of bytes to checksum 57 * Return: checksum value 58 */ 59 uint32_t crc32(uint32_t crc, const unsigned char *buf, uint len); 60 61 /** 62 * crc32_wd - Calculate the CRC32 for a block of data (watchdog version) 63 * 64 * This checksums the data @chunk_sz bytes at a time, calling WATCHDOG_RESET() 65 * after each chunk, to prevent the watchdog from firing. 66 * 67 * @crc: Input crc to chain from a previous calculution (use 0 to start a new 68 * calculation) 69 * @buf: Bytes to checksum 70 * @len: Number of bytes to checksum 71 * @chunk_sz: Chunk size to use between watchdog resets 72 * Return: checksum 73 */ 74 uint32_t crc32_wd(uint32_t crc, const unsigned char *buf, uint len, 75 uint chunk_sz); 76 77 /** 78 * crc32_no_comp - Calculate the CRC32 for a block of data (no one's compliment) 79 * 80 * This version uses a different algorithm which doesn't use one's compliment. 81 * JFFS2 (and other things?) use this. 82 * 83 * @crc: Input crc to chain from a previous calculution (use 0 to start a new 84 * calculation) 85 * @buf: Bytes to checksum 86 * @len: Number of bytes to checksum 87 * Return: checksum value 88 */ 89 uint32_t crc32_no_comp(uint32_t crc, const unsigned char *buf, uint len); 90 91 /** 92 * crc32_wd_buf - Perform CRC32 on a buffer and return result in buffer 93 * 94 * @input: Input buffer 95 * @ilen: Input buffer length 96 * @output: Place to put checksum result (4 bytes) 97 * @chunk_sz: Trigger watchdog after processing this many bytes 98 */ 99 void crc32_wd_buf(const uint8_t *input, uint ilen, uint8_t *output, 100 uint chunk_sz); 101 102 /* lib/crc32c.c */ 103 104 /** 105 * crc32c_init() - Set up a the CRC32 table 106 * 107 * This sets up 256-item table to aid in CRC32 calculation 108 * 109 * @crc32c_table: Place to put table 110 * @pol: polynomial to use 111 */ 112 void crc32c_init(uint32_t *crc32c_table, uint32_t pol); 113 114 /** 115 * crc32c_cal() - Perform CRC32 on a buffer given a table 116 * 117 * This algorithm uses the table (set up by crc32c_init() to speed up 118 * processing. 119 * 120 * @crc: Previous crc (use 0 at start) 121 * @data: Data bytes to checksum 122 * @length: Number of bytes to process 123 * @crc32c_table:: CRC table 124 * Return: checksum value 125 */ 126 uint32_t crc32c_cal(uint32_t crc, const char *data, int length, 127 uint32_t *crc32c_table); 128 129 #endif /* _UBOOT_CRC_H */ 130