DPDK  23.07.0
rte_hash_crc.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4 
5 #ifndef _RTE_HASH_CRC_H_
6 #define _RTE_HASH_CRC_H_
7 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 #include <stdint.h>
19 
20 #include <rte_branch_prediction.h>
21 #include <rte_common.h>
22 #include <rte_config.h>
23 #include <rte_cpuflags.h>
24 #include <rte_log.h>
25 
26 #include "rte_crc_sw.h"
27 
28 #define CRC32_SW (1U << 0)
29 #define CRC32_SSE42 (1U << 1)
30 #define CRC32_x64 (1U << 2)
31 #define CRC32_SSE42_x64 (CRC32_x64|CRC32_SSE42)
32 #define CRC32_ARM64 (1U << 3)
33 
34 static uint8_t crc32_alg = CRC32_SW;
35 
36 #if defined(RTE_ARCH_ARM64) && defined(__ARM_FEATURE_CRC32)
37 #include "rte_crc_arm64.h"
38 #elif defined(RTE_ARCH_X86)
39 #include "rte_crc_x86.h"
40 #else
41 #include "rte_crc_generic.h"
42 #endif
43 
55 static inline void
57 {
58  crc32_alg = CRC32_SW;
59 
60  if (alg == CRC32_SW)
61  return;
62 
63 #if defined RTE_ARCH_X86
64  if (!(alg & CRC32_SSE42_x64))
65  RTE_LOG(WARNING, HASH,
66  "Unsupported CRC32 algorithm requested using CRC32_x64/CRC32_SSE42\n");
67  if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_EM64T) || alg == CRC32_SSE42)
68  crc32_alg = CRC32_SSE42;
69  else
70  crc32_alg = CRC32_SSE42_x64;
71 #endif
72 
73 #if defined RTE_ARCH_ARM64
74  if (!(alg & CRC32_ARM64))
75  RTE_LOG(WARNING, HASH,
76  "Unsupported CRC32 algorithm requested using CRC32_ARM64\n");
77  if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_CRC32))
78  crc32_alg = CRC32_ARM64;
79 #endif
80 
81  if (crc32_alg == CRC32_SW)
82  RTE_LOG(WARNING, HASH,
83  "Unsupported CRC32 algorithm requested using CRC32_SW\n");
84 }
85 
86 /* Setting the best available algorithm */
87 RTE_INIT(rte_hash_crc_init_alg)
88 {
89 #if defined(RTE_ARCH_X86)
90  rte_hash_crc_set_alg(CRC32_SSE42_x64);
91 #elif defined(RTE_ARCH_ARM64) && defined(__ARM_FEATURE_CRC32)
92  rte_hash_crc_set_alg(CRC32_ARM64);
93 #else
94  rte_hash_crc_set_alg(CRC32_SW);
95 #endif
96 }
97 
98 #ifdef __DOXYGEN__
99 
110 static inline uint32_t
111 rte_hash_crc_1byte(uint8_t data, uint32_t init_val);
112 
123 static inline uint32_t
124 rte_hash_crc_2byte(uint16_t data, uint32_t init_val);
125 
136 static inline uint32_t
137 rte_hash_crc_4byte(uint32_t data, uint32_t init_val);
138 
149 static inline uint32_t
150 rte_hash_crc_8byte(uint64_t data, uint32_t init_val);
151 
152 #endif /* __DOXYGEN__ */
153 
166 static inline uint32_t
167 rte_hash_crc(const void *data, uint32_t data_len, uint32_t init_val)
168 {
169  unsigned i;
170  uintptr_t pd = (uintptr_t) data;
171 
172  for (i = 0; i < data_len / 8; i++) {
173  init_val = rte_hash_crc_8byte(*(const uint64_t *)pd, init_val);
174  pd += 8;
175  }
176 
177  if (data_len & 0x4) {
178  init_val = rte_hash_crc_4byte(*(const uint32_t *)pd, init_val);
179  pd += 4;
180  }
181 
182  if (data_len & 0x2) {
183  init_val = rte_hash_crc_2byte(*(const uint16_t *)pd, init_val);
184  pd += 2;
185  }
186 
187  if (data_len & 0x1)
188  init_val = rte_hash_crc_1byte(*(const uint8_t *)pd, init_val);
189 
190  return init_val;
191 }
192 
193 #ifdef __cplusplus
194 }
195 #endif
196 
197 #endif /* _RTE_HASH_CRC_H_ */
static uint32_t rte_hash_crc_2byte(uint16_t data, uint32_t init_val)
#define RTE_LOG(l, t,...)
Definition: rte_log.h:335
static uint32_t rte_hash_crc_8byte(uint64_t data, uint32_t init_val)
static uint32_t rte_hash_crc(const void *data, uint32_t data_len, uint32_t init_val)
Definition: rte_hash_crc.h:167
#define RTE_INIT(func)
Definition: rte_common.h:194
static uint32_t rte_hash_crc_1byte(uint8_t data, uint32_t init_val)
static void rte_hash_crc_set_alg(uint8_t alg)
Definition: rte_hash_crc.h:56
__extension__ int rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)
static uint32_t rte_hash_crc_4byte(uint32_t data, uint32_t init_val)