xref: /dpdk/lib/hash/rte_hash_crc.c (revision 97433132c2edda70ff69843b8f9273853cac984c)
18f9c9288SStephen Hemminger /* SPDX-License-Identifier: BSD-3-Clause
28f9c9288SStephen Hemminger  * Copyright(c) 2010-2014 Intel Corporation
38f9c9288SStephen Hemminger  */
48f9c9288SStephen Hemminger 
58f9c9288SStephen Hemminger #include <rte_cpuflags.h>
68f9c9288SStephen Hemminger #include <rte_log.h>
78f9c9288SStephen Hemminger 
88f9c9288SStephen Hemminger #include "rte_hash_crc.h"
98f9c9288SStephen Hemminger 
108f9c9288SStephen Hemminger RTE_LOG_REGISTER_SUFFIX(hash_crc_logtype, crc, INFO);
118f9c9288SStephen Hemminger #define RTE_LOGTYPE_HASH_CRC hash_crc_logtype
12*97433132SDavid Marchand #define HASH_CRC_LOG(level, ...) \
13*97433132SDavid Marchand 	RTE_LOG_LINE(level, HASH_CRC, "" __VA_ARGS__)
148f9c9288SStephen Hemminger 
158f9c9288SStephen Hemminger uint8_t rte_hash_crc32_alg = CRC32_SW;
168f9c9288SStephen Hemminger 
178f9c9288SStephen Hemminger /**
188f9c9288SStephen Hemminger  * Allow or disallow use of SSE4.2/ARMv8 intrinsics for CRC32 hash
198f9c9288SStephen Hemminger  * calculation.
208f9c9288SStephen Hemminger  *
218f9c9288SStephen Hemminger  * @param alg
228f9c9288SStephen Hemminger  *   An OR of following flags:
238f9c9288SStephen Hemminger  *   - (CRC32_SW) Don't use SSE4.2/ARMv8 intrinsics (default non-[x86/ARMv8])
248f9c9288SStephen Hemminger  *   - (CRC32_SSE42) Use SSE4.2 intrinsics if available
258f9c9288SStephen Hemminger  *   - (CRC32_SSE42_x64) Use 64-bit SSE4.2 intrinsic if available (default x86)
268f9c9288SStephen Hemminger  *   - (CRC32_ARM64) Use ARMv8 CRC intrinsic if available (default ARMv8)
278f9c9288SStephen Hemminger  *
288f9c9288SStephen Hemminger  */
298f9c9288SStephen Hemminger void
rte_hash_crc_set_alg(uint8_t alg)308f9c9288SStephen Hemminger rte_hash_crc_set_alg(uint8_t alg)
318f9c9288SStephen Hemminger {
328f9c9288SStephen Hemminger 	rte_hash_crc32_alg = CRC32_SW;
338f9c9288SStephen Hemminger 
348f9c9288SStephen Hemminger 	if (alg == CRC32_SW)
358f9c9288SStephen Hemminger 		return;
368f9c9288SStephen Hemminger 
378f9c9288SStephen Hemminger #if defined RTE_ARCH_X86
388f9c9288SStephen Hemminger 	if (!(alg & CRC32_SSE42_x64))
39ae67895bSDavid Marchand 		HASH_CRC_LOG(WARNING,
40ae67895bSDavid Marchand 			"Unsupported CRC32 algorithm requested using CRC32_x64/CRC32_SSE42");
418f9c9288SStephen Hemminger 	if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_EM64T) || alg == CRC32_SSE42)
428f9c9288SStephen Hemminger 		rte_hash_crc32_alg = CRC32_SSE42;
438f9c9288SStephen Hemminger 	else
448f9c9288SStephen Hemminger 		rte_hash_crc32_alg = CRC32_SSE42_x64;
458f9c9288SStephen Hemminger #endif
468f9c9288SStephen Hemminger 
478f9c9288SStephen Hemminger #if defined RTE_ARCH_ARM64
488f9c9288SStephen Hemminger 	if (!(alg & CRC32_ARM64))
49ae67895bSDavid Marchand 		HASH_CRC_LOG(WARNING,
50ae67895bSDavid Marchand 			"Unsupported CRC32 algorithm requested using CRC32_ARM64");
518f9c9288SStephen Hemminger 	if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_CRC32))
528f9c9288SStephen Hemminger 		rte_hash_crc32_alg = CRC32_ARM64;
538f9c9288SStephen Hemminger #endif
548f9c9288SStephen Hemminger 
558f9c9288SStephen Hemminger 	if (rte_hash_crc32_alg == CRC32_SW)
56ae67895bSDavid Marchand 		HASH_CRC_LOG(WARNING,
57ae67895bSDavid Marchand 			"Unsupported CRC32 algorithm requested using CRC32_SW");
588f9c9288SStephen Hemminger }
598f9c9288SStephen Hemminger 
608f9c9288SStephen Hemminger /* Setting the best available algorithm */
RTE_INIT(rte_hash_crc_init_alg)618f9c9288SStephen Hemminger RTE_INIT(rte_hash_crc_init_alg)
628f9c9288SStephen Hemminger {
638f9c9288SStephen Hemminger #if defined(RTE_ARCH_X86)
648f9c9288SStephen Hemminger 	rte_hash_crc_set_alg(CRC32_SSE42_x64);
658f9c9288SStephen Hemminger #elif defined(RTE_ARCH_ARM64) && defined(__ARM_FEATURE_CRC32)
668f9c9288SStephen Hemminger 	rte_hash_crc_set_alg(CRC32_ARM64);
678f9c9288SStephen Hemminger #else
688f9c9288SStephen Hemminger 	rte_hash_crc_set_alg(CRC32_SW);
698f9c9288SStephen Hemminger #endif
708f9c9288SStephen Hemminger }
71