xref: /dpdk/lib/net/rte_net_crc.c (revision 0f1dc8cb671203d52488fd66936f2fe6dcca03cc)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright(c) 2017-2020 Intel Corporation
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #include <stddef.h>
699a2dd95SBruce Richardson #include <stdint.h>
799a2dd95SBruce Richardson 
899a2dd95SBruce Richardson #include <rte_cpuflags.h>
999a2dd95SBruce Richardson #include <rte_common.h>
1099a2dd95SBruce Richardson #include <rte_net_crc.h>
1199a2dd95SBruce Richardson #include <rte_log.h>
1299a2dd95SBruce Richardson #include <rte_vect.h>
1399a2dd95SBruce Richardson 
1499a2dd95SBruce Richardson #include "net_crc.h"
1599a2dd95SBruce Richardson 
1699a2dd95SBruce Richardson /** CRC polynomials */
1799a2dd95SBruce Richardson #define CRC32_ETH_POLYNOMIAL 0x04c11db7UL
1899a2dd95SBruce Richardson #define CRC16_CCITT_POLYNOMIAL 0x1021U
1999a2dd95SBruce Richardson 
2099a2dd95SBruce Richardson #define CRC_LUT_SIZE 256
2199a2dd95SBruce Richardson 
2299a2dd95SBruce Richardson /* crc tables */
2399a2dd95SBruce Richardson static uint32_t crc32_eth_lut[CRC_LUT_SIZE];
2499a2dd95SBruce Richardson static uint32_t crc16_ccitt_lut[CRC_LUT_SIZE];
2599a2dd95SBruce Richardson 
2699a2dd95SBruce Richardson static uint32_t
2799a2dd95SBruce Richardson rte_crc16_ccitt_default_handler(const uint8_t *data, uint32_t data_len);
2899a2dd95SBruce Richardson 
2999a2dd95SBruce Richardson static uint32_t
3099a2dd95SBruce Richardson rte_crc32_eth_default_handler(const uint8_t *data, uint32_t data_len);
3199a2dd95SBruce Richardson 
3299a2dd95SBruce Richardson static uint32_t
3399a2dd95SBruce Richardson rte_crc16_ccitt_handler(const uint8_t *data, uint32_t data_len);
3499a2dd95SBruce Richardson 
3599a2dd95SBruce Richardson static uint32_t
3699a2dd95SBruce Richardson rte_crc32_eth_handler(const uint8_t *data, uint32_t data_len);
3799a2dd95SBruce Richardson 
3899a2dd95SBruce Richardson typedef uint32_t
3999a2dd95SBruce Richardson (*rte_net_crc_handler)(const uint8_t *data, uint32_t data_len);
4099a2dd95SBruce Richardson 
4199a2dd95SBruce Richardson static rte_net_crc_handler handlers_default[] = {
4299a2dd95SBruce Richardson 	[RTE_NET_CRC16_CCITT] = rte_crc16_ccitt_default_handler,
4399a2dd95SBruce Richardson 	[RTE_NET_CRC32_ETH] = rte_crc32_eth_default_handler,
4499a2dd95SBruce Richardson };
4599a2dd95SBruce Richardson 
4699a2dd95SBruce Richardson static const rte_net_crc_handler *handlers = handlers_default;
4799a2dd95SBruce Richardson 
4899a2dd95SBruce Richardson static const rte_net_crc_handler handlers_scalar[] = {
4999a2dd95SBruce Richardson 	[RTE_NET_CRC16_CCITT] = rte_crc16_ccitt_handler,
5099a2dd95SBruce Richardson 	[RTE_NET_CRC32_ETH] = rte_crc32_eth_handler,
5199a2dd95SBruce Richardson };
5299a2dd95SBruce Richardson #ifdef CC_X86_64_AVX512_VPCLMULQDQ_SUPPORT
5399a2dd95SBruce Richardson static const rte_net_crc_handler handlers_avx512[] = {
5499a2dd95SBruce Richardson 	[RTE_NET_CRC16_CCITT] = rte_crc16_ccitt_avx512_handler,
5599a2dd95SBruce Richardson 	[RTE_NET_CRC32_ETH] = rte_crc32_eth_avx512_handler,
5699a2dd95SBruce Richardson };
5799a2dd95SBruce Richardson #endif
5899a2dd95SBruce Richardson #ifdef CC_X86_64_SSE42_PCLMULQDQ_SUPPORT
5999a2dd95SBruce Richardson static const rte_net_crc_handler handlers_sse42[] = {
6099a2dd95SBruce Richardson 	[RTE_NET_CRC16_CCITT] = rte_crc16_ccitt_sse42_handler,
6199a2dd95SBruce Richardson 	[RTE_NET_CRC32_ETH] = rte_crc32_eth_sse42_handler,
6299a2dd95SBruce Richardson };
6399a2dd95SBruce Richardson #endif
6499a2dd95SBruce Richardson #ifdef CC_ARM64_NEON_PMULL_SUPPORT
6599a2dd95SBruce Richardson static const rte_net_crc_handler handlers_neon[] = {
6699a2dd95SBruce Richardson 	[RTE_NET_CRC16_CCITT] = rte_crc16_ccitt_neon_handler,
6799a2dd95SBruce Richardson 	[RTE_NET_CRC32_ETH] = rte_crc32_eth_neon_handler,
6899a2dd95SBruce Richardson };
6999a2dd95SBruce Richardson #endif
7099a2dd95SBruce Richardson 
7199a2dd95SBruce Richardson static uint16_t max_simd_bitwidth;
7299a2dd95SBruce Richardson 
73eeded204SDavid Marchand RTE_LOG_REGISTER_DEFAULT(libnet_logtype, INFO);
7497433132SDavid Marchand #define RTE_LOGTYPE_NET libnet_logtype
7597433132SDavid Marchand 
76*0f1dc8cbSTyler Retzlaff #define NET_LOG(level, ...) \
77*0f1dc8cbSTyler Retzlaff 	RTE_LOG_LINE_PREFIX(level, NET, "%s(): ", __func__, __VA_ARGS__)
7899a2dd95SBruce Richardson 
7999a2dd95SBruce Richardson /* Scalar handling */
8099a2dd95SBruce Richardson 
8199a2dd95SBruce Richardson /**
8299a2dd95SBruce Richardson  * Reflect the bits about the middle
8399a2dd95SBruce Richardson  *
8499a2dd95SBruce Richardson  * @param val
8599a2dd95SBruce Richardson  *   value to be reflected
8699a2dd95SBruce Richardson  *
8799a2dd95SBruce Richardson  * @return
8899a2dd95SBruce Richardson  *   reflected value
8999a2dd95SBruce Richardson  */
9099a2dd95SBruce Richardson static uint32_t
reflect_32bits(uint32_t val)9199a2dd95SBruce Richardson reflect_32bits(uint32_t val)
9299a2dd95SBruce Richardson {
9399a2dd95SBruce Richardson 	uint32_t i, res = 0;
9499a2dd95SBruce Richardson 
9599a2dd95SBruce Richardson 	for (i = 0; i < 32; i++)
9699a2dd95SBruce Richardson 		if ((val & (1U << i)) != 0)
9799a2dd95SBruce Richardson 			res |= (uint32_t)(1U << (31 - i));
9899a2dd95SBruce Richardson 
9999a2dd95SBruce Richardson 	return res;
10099a2dd95SBruce Richardson }
10199a2dd95SBruce Richardson 
10299a2dd95SBruce Richardson static void
crc32_eth_init_lut(uint32_t poly,uint32_t * lut)10399a2dd95SBruce Richardson crc32_eth_init_lut(uint32_t poly,
10499a2dd95SBruce Richardson 	uint32_t *lut)
10599a2dd95SBruce Richardson {
10699a2dd95SBruce Richardson 	uint32_t i, j;
10799a2dd95SBruce Richardson 
10899a2dd95SBruce Richardson 	for (i = 0; i < CRC_LUT_SIZE; i++) {
10999a2dd95SBruce Richardson 		uint32_t crc = reflect_32bits(i);
11099a2dd95SBruce Richardson 
11199a2dd95SBruce Richardson 		for (j = 0; j < 8; j++) {
11299a2dd95SBruce Richardson 			if (crc & 0x80000000L)
11399a2dd95SBruce Richardson 				crc = (crc << 1) ^ poly;
11499a2dd95SBruce Richardson 			else
11599a2dd95SBruce Richardson 				crc <<= 1;
11699a2dd95SBruce Richardson 		}
11799a2dd95SBruce Richardson 		lut[i] = reflect_32bits(crc);
11899a2dd95SBruce Richardson 	}
11999a2dd95SBruce Richardson }
12099a2dd95SBruce Richardson 
12199a2dd95SBruce Richardson static __rte_always_inline uint32_t
crc32_eth_calc_lut(const uint8_t * data,uint32_t data_len,uint32_t crc,const uint32_t * lut)12299a2dd95SBruce Richardson crc32_eth_calc_lut(const uint8_t *data,
12399a2dd95SBruce Richardson 	uint32_t data_len,
12499a2dd95SBruce Richardson 	uint32_t crc,
12599a2dd95SBruce Richardson 	const uint32_t *lut)
12699a2dd95SBruce Richardson {
12799a2dd95SBruce Richardson 	while (data_len--)
12899a2dd95SBruce Richardson 		crc = lut[(crc ^ *data++) & 0xffL] ^ (crc >> 8);
12999a2dd95SBruce Richardson 
13099a2dd95SBruce Richardson 	return crc;
13199a2dd95SBruce Richardson }
13299a2dd95SBruce Richardson 
13399a2dd95SBruce Richardson static void
rte_net_crc_scalar_init(void)13499a2dd95SBruce Richardson rte_net_crc_scalar_init(void)
13599a2dd95SBruce Richardson {
13699a2dd95SBruce Richardson 	/* 32-bit crc init */
13799a2dd95SBruce Richardson 	crc32_eth_init_lut(CRC32_ETH_POLYNOMIAL, crc32_eth_lut);
13899a2dd95SBruce Richardson 
13999a2dd95SBruce Richardson 	/* 16-bit CRC init */
14099a2dd95SBruce Richardson 	crc32_eth_init_lut(CRC16_CCITT_POLYNOMIAL << 16, crc16_ccitt_lut);
14199a2dd95SBruce Richardson }
14299a2dd95SBruce Richardson 
14399a2dd95SBruce Richardson static inline uint32_t
rte_crc16_ccitt_handler(const uint8_t * data,uint32_t data_len)14499a2dd95SBruce Richardson rte_crc16_ccitt_handler(const uint8_t *data, uint32_t data_len)
14599a2dd95SBruce Richardson {
14699a2dd95SBruce Richardson 	/* return 16-bit CRC value */
14799a2dd95SBruce Richardson 	return (uint16_t)~crc32_eth_calc_lut(data,
14899a2dd95SBruce Richardson 		data_len,
14999a2dd95SBruce Richardson 		0xffff,
15099a2dd95SBruce Richardson 		crc16_ccitt_lut);
15199a2dd95SBruce Richardson }
15299a2dd95SBruce Richardson 
15399a2dd95SBruce Richardson static inline uint32_t
rte_crc32_eth_handler(const uint8_t * data,uint32_t data_len)15499a2dd95SBruce Richardson rte_crc32_eth_handler(const uint8_t *data, uint32_t data_len)
15599a2dd95SBruce Richardson {
15699a2dd95SBruce Richardson 	/* return 32-bit CRC value */
15799a2dd95SBruce Richardson 	return ~crc32_eth_calc_lut(data,
15899a2dd95SBruce Richardson 		data_len,
15999a2dd95SBruce Richardson 		0xffffffffUL,
16099a2dd95SBruce Richardson 		crc32_eth_lut);
16199a2dd95SBruce Richardson }
16299a2dd95SBruce Richardson 
16399a2dd95SBruce Richardson /* AVX512/VPCLMULQDQ handling */
16499a2dd95SBruce Richardson 
16599a2dd95SBruce Richardson #define AVX512_VPCLMULQDQ_CPU_SUPPORTED ( \
16699a2dd95SBruce Richardson 	rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) && \
16799a2dd95SBruce Richardson 	rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512BW) && \
16899a2dd95SBruce Richardson 	rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512DQ) && \
16999a2dd95SBruce Richardson 	rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512VL) && \
17099a2dd95SBruce Richardson 	rte_cpu_get_flag_enabled(RTE_CPUFLAG_PCLMULQDQ) && \
17199a2dd95SBruce Richardson 	rte_cpu_get_flag_enabled(RTE_CPUFLAG_VPCLMULQDQ) \
17299a2dd95SBruce Richardson )
17399a2dd95SBruce Richardson 
17499a2dd95SBruce Richardson static const rte_net_crc_handler *
avx512_vpclmulqdq_get_handlers(void)17599a2dd95SBruce Richardson avx512_vpclmulqdq_get_handlers(void)
17699a2dd95SBruce Richardson {
17799a2dd95SBruce Richardson #ifdef CC_X86_64_AVX512_VPCLMULQDQ_SUPPORT
17899a2dd95SBruce Richardson 	if (AVX512_VPCLMULQDQ_CPU_SUPPORTED &&
17999a2dd95SBruce Richardson 			max_simd_bitwidth >= RTE_VECT_SIMD_512)
18099a2dd95SBruce Richardson 		return handlers_avx512;
18199a2dd95SBruce Richardson #endif
182ae282b06SDavid Marchand 	NET_LOG(INFO, "Requirements not met, can't use AVX512");
18399a2dd95SBruce Richardson 	return NULL;
18499a2dd95SBruce Richardson }
18599a2dd95SBruce Richardson 
18699a2dd95SBruce Richardson static void
avx512_vpclmulqdq_init(void)18799a2dd95SBruce Richardson avx512_vpclmulqdq_init(void)
18899a2dd95SBruce Richardson {
18999a2dd95SBruce Richardson #ifdef CC_X86_64_AVX512_VPCLMULQDQ_SUPPORT
19099a2dd95SBruce Richardson 	if (AVX512_VPCLMULQDQ_CPU_SUPPORTED)
19199a2dd95SBruce Richardson 		rte_net_crc_avx512_init();
19299a2dd95SBruce Richardson #endif
19399a2dd95SBruce Richardson }
19499a2dd95SBruce Richardson 
19599a2dd95SBruce Richardson /* SSE4.2/PCLMULQDQ handling */
19699a2dd95SBruce Richardson 
19799a2dd95SBruce Richardson #define SSE42_PCLMULQDQ_CPU_SUPPORTED \
19899a2dd95SBruce Richardson 	rte_cpu_get_flag_enabled(RTE_CPUFLAG_PCLMULQDQ)
19999a2dd95SBruce Richardson 
20099a2dd95SBruce Richardson static const rte_net_crc_handler *
sse42_pclmulqdq_get_handlers(void)20199a2dd95SBruce Richardson sse42_pclmulqdq_get_handlers(void)
20299a2dd95SBruce Richardson {
20399a2dd95SBruce Richardson #ifdef CC_X86_64_SSE42_PCLMULQDQ_SUPPORT
20499a2dd95SBruce Richardson 	if (SSE42_PCLMULQDQ_CPU_SUPPORTED &&
20599a2dd95SBruce Richardson 			max_simd_bitwidth >= RTE_VECT_SIMD_128)
20699a2dd95SBruce Richardson 		return handlers_sse42;
20799a2dd95SBruce Richardson #endif
208ae282b06SDavid Marchand 	NET_LOG(INFO, "Requirements not met, can't use SSE");
20999a2dd95SBruce Richardson 	return NULL;
21099a2dd95SBruce Richardson }
21199a2dd95SBruce Richardson 
21299a2dd95SBruce Richardson static void
sse42_pclmulqdq_init(void)21399a2dd95SBruce Richardson sse42_pclmulqdq_init(void)
21499a2dd95SBruce Richardson {
21599a2dd95SBruce Richardson #ifdef CC_X86_64_SSE42_PCLMULQDQ_SUPPORT
21699a2dd95SBruce Richardson 	if (SSE42_PCLMULQDQ_CPU_SUPPORTED)
21799a2dd95SBruce Richardson 		rte_net_crc_sse42_init();
21899a2dd95SBruce Richardson #endif
21999a2dd95SBruce Richardson }
22099a2dd95SBruce Richardson 
22199a2dd95SBruce Richardson /* NEON/PMULL handling */
22299a2dd95SBruce Richardson 
22399a2dd95SBruce Richardson #define NEON_PMULL_CPU_SUPPORTED \
22499a2dd95SBruce Richardson 	rte_cpu_get_flag_enabled(RTE_CPUFLAG_PMULL)
22599a2dd95SBruce Richardson 
22699a2dd95SBruce Richardson static const rte_net_crc_handler *
neon_pmull_get_handlers(void)22799a2dd95SBruce Richardson neon_pmull_get_handlers(void)
22899a2dd95SBruce Richardson {
22999a2dd95SBruce Richardson #ifdef CC_ARM64_NEON_PMULL_SUPPORT
23099a2dd95SBruce Richardson 	if (NEON_PMULL_CPU_SUPPORTED &&
23199a2dd95SBruce Richardson 			max_simd_bitwidth >= RTE_VECT_SIMD_128)
23299a2dd95SBruce Richardson 		return handlers_neon;
23399a2dd95SBruce Richardson #endif
234ae282b06SDavid Marchand 	NET_LOG(INFO, "Requirements not met, can't use NEON");
23599a2dd95SBruce Richardson 	return NULL;
23699a2dd95SBruce Richardson }
23799a2dd95SBruce Richardson 
23899a2dd95SBruce Richardson static void
neon_pmull_init(void)23999a2dd95SBruce Richardson neon_pmull_init(void)
24099a2dd95SBruce Richardson {
24199a2dd95SBruce Richardson #ifdef CC_ARM64_NEON_PMULL_SUPPORT
24299a2dd95SBruce Richardson 	if (NEON_PMULL_CPU_SUPPORTED)
24399a2dd95SBruce Richardson 		rte_net_crc_neon_init();
24499a2dd95SBruce Richardson #endif
24599a2dd95SBruce Richardson }
24699a2dd95SBruce Richardson 
24799a2dd95SBruce Richardson /* Default handling */
24899a2dd95SBruce Richardson 
24999a2dd95SBruce Richardson static uint32_t
rte_crc16_ccitt_default_handler(const uint8_t * data,uint32_t data_len)25099a2dd95SBruce Richardson rte_crc16_ccitt_default_handler(const uint8_t *data, uint32_t data_len)
25199a2dd95SBruce Richardson {
25299a2dd95SBruce Richardson 	handlers = NULL;
25399a2dd95SBruce Richardson 	if (max_simd_bitwidth == 0)
25499a2dd95SBruce Richardson 		max_simd_bitwidth = rte_vect_get_max_simd_bitwidth();
25599a2dd95SBruce Richardson 
25699a2dd95SBruce Richardson 	handlers = avx512_vpclmulqdq_get_handlers();
25799a2dd95SBruce Richardson 	if (handlers != NULL)
25899a2dd95SBruce Richardson 		return handlers[RTE_NET_CRC16_CCITT](data, data_len);
25999a2dd95SBruce Richardson 	handlers = sse42_pclmulqdq_get_handlers();
26099a2dd95SBruce Richardson 	if (handlers != NULL)
26199a2dd95SBruce Richardson 		return handlers[RTE_NET_CRC16_CCITT](data, data_len);
26299a2dd95SBruce Richardson 	handlers = neon_pmull_get_handlers();
26399a2dd95SBruce Richardson 	if (handlers != NULL)
26499a2dd95SBruce Richardson 		return handlers[RTE_NET_CRC16_CCITT](data, data_len);
26599a2dd95SBruce Richardson 	handlers = handlers_scalar;
26699a2dd95SBruce Richardson 	return handlers[RTE_NET_CRC16_CCITT](data, data_len);
26799a2dd95SBruce Richardson }
26899a2dd95SBruce Richardson 
26999a2dd95SBruce Richardson static uint32_t
rte_crc32_eth_default_handler(const uint8_t * data,uint32_t data_len)27099a2dd95SBruce Richardson rte_crc32_eth_default_handler(const uint8_t *data, uint32_t data_len)
27199a2dd95SBruce Richardson {
27299a2dd95SBruce Richardson 	handlers = NULL;
27399a2dd95SBruce Richardson 	if (max_simd_bitwidth == 0)
27499a2dd95SBruce Richardson 		max_simd_bitwidth = rte_vect_get_max_simd_bitwidth();
27599a2dd95SBruce Richardson 
27699a2dd95SBruce Richardson 	handlers = avx512_vpclmulqdq_get_handlers();
27799a2dd95SBruce Richardson 	if (handlers != NULL)
27899a2dd95SBruce Richardson 		return handlers[RTE_NET_CRC32_ETH](data, data_len);
27999a2dd95SBruce Richardson 	handlers = sse42_pclmulqdq_get_handlers();
28099a2dd95SBruce Richardson 	if (handlers != NULL)
28199a2dd95SBruce Richardson 		return handlers[RTE_NET_CRC32_ETH](data, data_len);
28299a2dd95SBruce Richardson 	handlers = neon_pmull_get_handlers();
28399a2dd95SBruce Richardson 	if (handlers != NULL)
28499a2dd95SBruce Richardson 		return handlers[RTE_NET_CRC32_ETH](data, data_len);
28599a2dd95SBruce Richardson 	handlers = handlers_scalar;
28699a2dd95SBruce Richardson 	return handlers[RTE_NET_CRC32_ETH](data, data_len);
28799a2dd95SBruce Richardson }
28899a2dd95SBruce Richardson 
28999a2dd95SBruce Richardson /* Public API */
29099a2dd95SBruce Richardson 
29199a2dd95SBruce Richardson void
rte_net_crc_set_alg(enum rte_net_crc_alg alg)29299a2dd95SBruce Richardson rte_net_crc_set_alg(enum rte_net_crc_alg alg)
29399a2dd95SBruce Richardson {
29499a2dd95SBruce Richardson 	handlers = NULL;
29599a2dd95SBruce Richardson 	if (max_simd_bitwidth == 0)
29699a2dd95SBruce Richardson 		max_simd_bitwidth = rte_vect_get_max_simd_bitwidth();
29799a2dd95SBruce Richardson 
29899a2dd95SBruce Richardson 	switch (alg) {
29999a2dd95SBruce Richardson 	case RTE_NET_CRC_AVX512:
30099a2dd95SBruce Richardson 		handlers = avx512_vpclmulqdq_get_handlers();
30199a2dd95SBruce Richardson 		if (handlers != NULL)
30299a2dd95SBruce Richardson 			break;
30399a2dd95SBruce Richardson 		/* fall-through */
30499a2dd95SBruce Richardson 	case RTE_NET_CRC_SSE42:
30599a2dd95SBruce Richardson 		handlers = sse42_pclmulqdq_get_handlers();
30699a2dd95SBruce Richardson 		break; /* for x86, always break here */
30799a2dd95SBruce Richardson 	case RTE_NET_CRC_NEON:
30899a2dd95SBruce Richardson 		handlers = neon_pmull_get_handlers();
30999a2dd95SBruce Richardson 		/* fall-through */
31099a2dd95SBruce Richardson 	case RTE_NET_CRC_SCALAR:
31199a2dd95SBruce Richardson 		/* fall-through */
31299a2dd95SBruce Richardson 	default:
31399a2dd95SBruce Richardson 		break;
31499a2dd95SBruce Richardson 	}
31599a2dd95SBruce Richardson 
31699a2dd95SBruce Richardson 	if (handlers == NULL)
31799a2dd95SBruce Richardson 		handlers = handlers_scalar;
31899a2dd95SBruce Richardson }
31999a2dd95SBruce Richardson 
32099a2dd95SBruce Richardson uint32_t
rte_net_crc_calc(const void * data,uint32_t data_len,enum rte_net_crc_type type)32199a2dd95SBruce Richardson rte_net_crc_calc(const void *data,
32299a2dd95SBruce Richardson 	uint32_t data_len,
32399a2dd95SBruce Richardson 	enum rte_net_crc_type type)
32499a2dd95SBruce Richardson {
32599a2dd95SBruce Richardson 	uint32_t ret;
32699a2dd95SBruce Richardson 	rte_net_crc_handler f_handle;
32799a2dd95SBruce Richardson 
32899a2dd95SBruce Richardson 	f_handle = handlers[type];
32999a2dd95SBruce Richardson 	ret = f_handle(data, data_len);
33099a2dd95SBruce Richardson 
33199a2dd95SBruce Richardson 	return ret;
33299a2dd95SBruce Richardson }
33399a2dd95SBruce Richardson 
33499a2dd95SBruce Richardson /* Call initialisation helpers for all crc algorithm handlers */
RTE_INIT(rte_net_crc_init)33599a2dd95SBruce Richardson RTE_INIT(rte_net_crc_init)
33699a2dd95SBruce Richardson {
33799a2dd95SBruce Richardson 	rte_net_crc_scalar_init();
33899a2dd95SBruce Richardson 	sse42_pclmulqdq_init();
33999a2dd95SBruce Richardson 	avx512_vpclmulqdq_init();
34099a2dd95SBruce Richardson 	neon_pmull_init();
34199a2dd95SBruce Richardson }
342