From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek Behun Date: Sun, 3 Sep 2017 21:25:17 +0200 Subject: [U-Boot] [PATCH 1/9] lib: Add CRC32-C In-Reply-To: <30fb71b1-2e00-7169-f39d-f84bd516f7ca@denx.de> References: <20170903150031.18179-1-marek.behun@nic.cz> <20170903150031.18179-2-marek.behun@nic.cz> <30fb71b1-2e00-7169-f39d-f84bd516f7ca@denx.de> Message-ID: <20170903212517.71fd8410@nic.cz> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit To: u-boot@lists.denx.de Hi Łukasz, the Castagnoli CRC32 algorithm just uses different polynomial. Perhaps I should generalize the original CRC32. Marek On Sun, 3 Sep 2017 17:47:28 +0200 Łukasz Majewski wrote: > Hi Marek, > > > This is needed for BTRFS. > > > > Signed-off-by: Marek Behun > > > > create mode 100644 lib/crc32c.c > > Excuse me my ignorance, but in u-boot we already have: > ./lib/crc32.c > > is the crc32c algorithm a different one from venerable crc32? > > > > > > diff --git a/include/u-boot/crc.h b/include/u-boot/crc.h > > index 6764d58bab..6d08f5df98 100644 > > --- a/include/u-boot/crc.h > > +++ b/include/u-boot/crc.h > > @@ -28,4 +28,8 @@ uint32_t crc32_no_comp (uint32_t, const unsigned > > char *, uint); void crc32_wd_buf(const unsigned char *input, uint > > ilen, unsigned char *output, uint chunk_sz); > > > > +/* lib/crc32c.c */ > > +void crc32c_init(uint32_t *, uint32_t); > > +uint32_t crc32c_cal(uint32_t, const char *, int, uint32_t *); > > + > > #endif /* _UBOOT_CRC_H */ > > diff --git a/lib/Kconfig b/lib/Kconfig > > index fe337acaeb..29e55dbe1d 100644 > > --- a/lib/Kconfig > > +++ b/lib/Kconfig > > @@ -146,6 +146,9 @@ config SHA_PROG_HW_ACCEL > > config MD5 > > bool > > > > +config CRC32C > > + bool > > + > > endmenu > > > > menu "Compression Support" > > diff --git a/lib/Makefile b/lib/Makefile > > index 2eef1eb80e..a58ce0f815 100644 > > --- a/lib/Makefile > > +++ b/lib/Makefile > > @@ -67,6 +67,7 @@ obj-y += display_options.o > > CFLAGS_display_options.o := $(if > > $(BUILD_TAG),-DBUILD_TAG='"$(BUILD_TAG)"') obj-$(CONFIG_BCH) += > > bch.o obj-y += crc32.o > > +obj-$(CONFIG_CRC32C) += crc32c.o > > obj-y += ctype.o > > obj-y += div64.o > > obj-y += hang.o > > diff --git a/lib/crc32c.c b/lib/crc32c.c > > new file mode 100644 > > index 0000000000..322c08ff5d > > --- /dev/null > > +++ b/lib/crc32c.c > > @@ -0,0 +1,38 @@ > > +/* > > + * Copied from Linux kernel crypto/crc32c.c > > + * Copyright (c) 2004 Cisco Systems, Inc. > > + * Copyright (c) 2008 Herbert Xu > > + * > > + * This program is free software; you can redistribute it and/or > > modify it > > + * under the terms of the GNU General Public License as published > > by the Free > > + * Software Foundation; either version 2 of the License, or (at > > your option) > > + * any later version. > > + * SPDX-License-Identifier: GPL-2.0+ > > + */ > > + > > +#include > > +#include > > + > > +uint32_t crc32c_cal(uint32_t crc, const char *data, int length, > > + uint32_t *crc32c_table) > > +{ > > + while (length--) > > + crc = crc32c_table[(u8)(crc ^ *data++)] ^ (crc >> > > 8); + > > + return crc; > > +} > > + > > +void crc32c_init(uint32_t *crc32c_table, uint32_t pol) > > +{ > > + int i, j; > > + uint32_t v; > > + const uint32_t poly = pol; /* Bit-reflected CRC32C > > polynomial */ + > > + for (i = 0; i < 256; i++) { > > + v = i; > > + for (j = 0; j < 8; j++) > > + v = (v >> 1) ^ ((v & 1) ? poly : 0); > > + > > + crc32c_table[i] = v; > > + } > > +} > > > >