All of lore.kernel.org
 help / color / mirror / Atom feed
* [Accel-config] Re: [PATCH v2 1/4] accel-config/test: Add a software CRC64 algorithm
@ 2022-04-29 22:07 Dave Jiang
  0 siblings, 0 replies; only message in thread
From: Dave Jiang @ 2022-04-29 22:07 UTC (permalink / raw)
  To: accel-config

[-- Attachment #1: Type: text/plain, Size: 7618 bytes --]

On 4/28/2022 8:13 PM, Li Zhang wrote:
> Create a new folder for placing all software algorithms, such as
> CRC64, Compress, Decompress, Zcompress, Zdecompress, etc. Add
> CRC64 algorithm and modify Makefile.

Still see lots of IAX and iaa in this patch. Was that missed?


> Signed-off-by: Li Zhang <li4.zhang(a)intel.com>
> Reviewed-by: Dave Jiang <dave.jiang(a)intel.com>

Please remove my review tag until I've explicitly given that. Thanks.


> ---
>   test/Makefile.am            |   2 +-
>   test/algorithms/iaa_crc64.c | 152 ++++++++++++++++++++++++++++++++++++
>   test/algorithms/iaa_crc64.h |  18 +++++
>   3 files changed, 171 insertions(+), 1 deletion(-)
>   create mode 100644 test/algorithms/iaa_crc64.c
>   create mode 100644 test/algorithms/iaa_crc64.h
>
> diff --git a/test/Makefile.am b/test/Makefile.am
> index b02436c..07f8d24 100644
> --- a/test/Makefile.am
> +++ b/test/Makefile.am
> @@ -38,5 +38,5 @@ libaccfg_LDADD = $(LIBACCFG_LIB) $(UUID_LIBS)
>   dsa_test_SOURCES = dsa_test.c dsa.c dsa_prep.c accel_test.c
>   dsa_test_LDADD = $(LIBACCFG_LIB) $(UUID_LIBS)
>   
> -iaa_test_SOURCES = iaa_test.c iaa.c iaa_prep.c accel_test.c
> +iaa_test_SOURCES = iaa_test.c iaa.c iaa_prep.c accel_test.c algorithms/iaa_crc64.c algorithms/iaa_crc64.h
>   iaa_test_LDADD = $(LIBACCFG_LIB) $(UUID_LIBS)
> diff --git a/test/algorithms/iaa_crc64.c b/test/algorithms/iaa_crc64.c
> new file mode 100644
> index 0000000..f4c0bec
> --- /dev/null
> +++ b/test/algorithms/iaa_crc64.c
> @@ -0,0 +1,152 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* Copyright(c) 2019 Intel Corporation. All rights reserved. */
> +#include <stdio.h>
> +#include <stdint.h>
> +#include "iaa_crc64.h"
> +
> +static const uint8_t bitrev8[0x100] = {
> +0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
> +0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
> +0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
> +0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
> +0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
> +0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
> +0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
> +0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
> +0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
> +0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
> +0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
> +0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
> +0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
> +0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
> +0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
> +0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF,
> +};
> +
> +static uint64_t bit_byte_swap64(uint64_t x)
> +{
> +	uint64_t y;
> +
> +	y  = bitrev8[x >> 56];
> +	y |= ((uint64_t)bitrev8[(x >> 48) & 0xff]) <<  8;
> +	y |= ((uint64_t)bitrev8[(x >> 40) & 0xff]) << 16;
> +	y |= ((uint64_t)bitrev8[(x >> 32) & 0xff]) << 24;
> +	y |= ((uint64_t)bitrev8[(x >> 24) & 0xff]) << 32;
> +	y |= ((uint64_t)bitrev8[(x >> 16) & 0xff]) << 40;
> +	y |= ((uint64_t)bitrev8[(x >>  8) & 0xff]) << 48;
> +	y |= ((uint64_t)bitrev8[(x >>  0) & 0xff]) << 56;
> +	return y;
> +}
> +
> +static void crc64_init_tbl(uint64_t *tbl, uint64_t poly, uint8_t msb)
> +{
> +	uint64_t crc, i;
> +	uint32_t j;
> +
> +	tbl[0] = 0;
> +
> +	if (msb) {
> +		poly = bit_byte_swap64(poly);
> +		for (i = 1; i < 256; i++) {
> +			crc = i;
> +			for (j = 0; j < 8; j++)
> +				if (crc & 0x0000000000000001ULL)
> +					crc = (crc >> 1) ^ poly;
> +				else
> +					crc = (crc >> 1);
> +			tbl[i] = crc;
> +		}
> +	} else {
> +		for (i = 1; i < 256; i++) {
> +			crc = i << 56;
> +			for (j = 0; j < 8; j++)
> +				if (crc & 0x8000000000000000ULL)
> +					crc = (crc << 1) ^ poly;
> +				else
> +					crc = (crc << 1);
> +			tbl[i] = crc;
> +		}
> +	}
> +}
> +
> +static uint64_t crc64_init_crc(uint64_t poly, uint8_t msb, uint8_t invcrc)
> +{
> +	if (!invcrc)
> +		return 0;
> +	poly |= (poly << 1);
> +	poly |= (poly << 2);
> +	poly |= (poly << 4);
> +	poly |= (poly << 8);
> +	poly |= (poly << 16);
> +	poly |= (poly << 32);
> +	if (!msb)
> +		return poly;
> +	return bit_byte_swap64(poly);
> +}
> +
> +static uint64_t crc64_update(uint8_t data, uint64_t *tbl, uint64_t crc, uint8_t msb)
> +{
> +	if (msb)
> +		return tbl[data ^ (crc & 0xff)] ^ (crc >> 8);
> +	else
> +		return tbl[data ^ (crc >> 56)] ^ (crc << 8);
> +}
> +
> +static uint64_t crc64_finalize(uint64_t crc, uint64_t poly, uint8_t msb, uint8_t invcrc)
> +{
> +	if (!invcrc)
> +		return crc;
> +	poly |= (poly << 1);
> +	poly |= (poly << 2);
> +	poly |= (poly << 4);
> +	poly |= (poly << 8);
> +	poly |= (poly << 16);
> +	poly |= (poly << 32);
> +	if (!msb)
> +		return crc ^ poly;
> +	return crc ^ bit_byte_swap64(poly);
> +}
> +
> +/* convert 8 bytes array to uint64_t, if not aligned, fill up with 0*/
> +static uint64_t read_qword(uint8_t *in, uint32_t len)
> +{
> +	uint32_t i;
> +	uint64_t qword = 0;
> +
> +	for (i = 0; i < len; i++)
> +		qword |= ((((uint64_t)in[i]) & 0xFF) << (8 * i));
> +
> +	return qword;
> +}
> +
> +uint64_t iax_calculate_crc64(uint64_t poly, uint8_t *buf, uint32_t len,
> +			     uint8_t msb, uint8_t invcrc)
> +{
> +	uint64_t data;
> +	uint32_t data_size, i = 0, j = 0;
> +	uint64_t tbl[256], crc;
> +	uint8_t *ptr;
> +	uint32_t aligned_len = len & 0xfffffff8;
> +	uint32_t remain_len = len - aligned_len;
> +
> +	crc64_init_tbl(tbl, poly, msb);
> +	crc = crc64_init_crc(poly, msb, invcrc);
> +
> +	for (i = 0; i < aligned_len; i += sizeof(uint64_t)) {
> +		ptr = &buf[i];
> +		data = read_qword(ptr, sizeof(uint64_t));
> +		data_size = sizeof(uint64_t) * 8;
> +		for (j = 0; j < data_size; j += 8)
> +			crc = crc64_update((uint8_t)(data >> j), tbl, crc, msb);
> +	}
> +
> +	if (remain_len)	{
> +		ptr = &buf[i];
> +		data = read_qword(ptr, remain_len);
> +		data_size = remain_len * 8;
> +		for (j = 0; j < data_size; j += 8)
> +			crc = crc64_update((uint8_t)(data >> j), tbl, crc, msb);
> +	}
> +	crc = crc64_finalize(crc, poly, msb, invcrc);
> +	return crc;
> +}
> diff --git a/test/algorithms/iaa_crc64.h b/test/algorithms/iaa_crc64.h
> new file mode 100644
> index 0000000..d0bc5f9
> --- /dev/null
> +++ b/test/algorithms/iaa_crc64.h
> @@ -0,0 +1,18 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/* Copyright(c) 2019 Intel Corporation. All rights reserved. */
> +#ifndef _USR_CRC64_H_
> +#define _USR_CRC64_H_
> +
> +#include <stdint.h>
> +#include <stdbool.h>
> +
> +#define IAX_CRC64_EXTRA_FLAGS_BIT_ORDER 0x8000
> +#define IAX_CRC64_EXTRA_FLAGS_INVERT_CRC 0x4000
> +
> +/* crc64-ecma-182 */
> +#define IAX_CRC64_POLYNOMIAL 0x42F0E1EBA9EA3693
> +
> +uint64_t iax_calculate_crc64(uint64_t poly, uint8_t *buf, uint32_t len,
> +			     uint8_t msb, uint8_t invcrc);
> +
> +#endif

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-04-29 22:07 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-29 22:07 [Accel-config] Re: [PATCH v2 1/4] accel-config/test: Add a software CRC64 algorithm Dave Jiang

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.