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 Hemmingerrte_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 HemmingerRTE_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