xref: /dpdk/drivers/net/mlx5/hws/mlx5dr_crc32.c (revision 2acdf09bac28360f73f7aadab82428079d0880e2)
17f5e6de5SItamar Gozlan /* SPDX-License-Identifier: BSD-3-Clause
27f5e6de5SItamar Gozlan  * Copyright (c) 2023 NVIDIA Corporation & Affiliates
37f5e6de5SItamar Gozlan  */
47f5e6de5SItamar Gozlan 
57f5e6de5SItamar Gozlan #include "mlx5dr_internal.h"
67f5e6de5SItamar Gozlan 
77f5e6de5SItamar Gozlan uint32_t dr_ste_crc_tab32[] = {
87f5e6de5SItamar Gozlan 	0x0, 0x77073096, 0xee0e612c, 0x990951ba, 0x76dc419, 0x706af48f,
97f5e6de5SItamar Gozlan 	0xe963a535, 0x9e6495a3, 0xedb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
107f5e6de5SItamar Gozlan 	0x9b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
117f5e6de5SItamar Gozlan 	0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
127f5e6de5SItamar Gozlan 	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
137f5e6de5SItamar Gozlan 	0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
147f5e6de5SItamar Gozlan 	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
157f5e6de5SItamar Gozlan 	0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
167f5e6de5SItamar Gozlan 	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
177f5e6de5SItamar Gozlan 	0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
187f5e6de5SItamar Gozlan 	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x1db7106,
197f5e6de5SItamar Gozlan 	0x98d220bc, 0xefd5102a, 0x71b18589, 0x6b6b51f, 0x9fbfe4a5, 0xe8b8d433,
207f5e6de5SItamar Gozlan 	0x7807c9a2, 0xf00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x86d3d2d,
217f5e6de5SItamar Gozlan 	0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
227f5e6de5SItamar Gozlan 	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
237f5e6de5SItamar Gozlan 	0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
247f5e6de5SItamar Gozlan 	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
257f5e6de5SItamar Gozlan 	0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
267f5e6de5SItamar Gozlan 	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
277f5e6de5SItamar Gozlan 	0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
287f5e6de5SItamar Gozlan 	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
297f5e6de5SItamar Gozlan 	0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x3b6e20c, 0x74b1d29a,
307f5e6de5SItamar Gozlan 	0xead54739, 0x9dd277af, 0x4db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
317f5e6de5SItamar Gozlan 	0xd6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0xa00ae27, 0x7d079eb1,
327f5e6de5SItamar Gozlan 	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
337f5e6de5SItamar Gozlan 	0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
347f5e6de5SItamar Gozlan 	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
357f5e6de5SItamar Gozlan 	0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
367f5e6de5SItamar Gozlan 	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
377f5e6de5SItamar Gozlan 	0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
387f5e6de5SItamar Gozlan 	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
397f5e6de5SItamar Gozlan 	0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
407f5e6de5SItamar Gozlan 	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x26d930a, 0x9c0906a9, 0xeb0e363f,
417f5e6de5SItamar Gozlan 	0x72076785, 0x5005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0xcb61b38,
427f5e6de5SItamar Gozlan 	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0xbdbdf21, 0x86d3d2d4, 0xf1d4e242,
437f5e6de5SItamar Gozlan 	0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
447f5e6de5SItamar Gozlan 	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
457f5e6de5SItamar Gozlan 	0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
467f5e6de5SItamar Gozlan 	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
477f5e6de5SItamar Gozlan 	0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
487f5e6de5SItamar Gozlan 	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
497f5e6de5SItamar Gozlan 	0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
507f5e6de5SItamar Gozlan 	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
517f5e6de5SItamar Gozlan };
527f5e6de5SItamar Gozlan 
53*2acdf09bSHamdan Igbaria /* CRC table for the CRC-16, the polynome is 0x100b */
54*2acdf09bSHamdan Igbaria uint16_t dr_crc_inner_crc_tab16[] = {
55*2acdf09bSHamdan Igbaria 	0x0000, 0x100B, 0x2016, 0x301D, 0x402C, 0x5027, 0x603A, 0x7031,
56*2acdf09bSHamdan Igbaria 	0x8058, 0x9053, 0xA04E, 0xB045, 0xC074, 0xD07F, 0xE062, 0xF069,
57*2acdf09bSHamdan Igbaria 	0x10BB, 0x00B0, 0x30AD, 0x20A6, 0x5097, 0x409C, 0x7081, 0x608A,
58*2acdf09bSHamdan Igbaria 	0x90E3, 0x80E8, 0xB0F5, 0xA0FE, 0xD0CF, 0xC0C4, 0xF0D9, 0xE0D2,
59*2acdf09bSHamdan Igbaria 	0x2176, 0x317D, 0x0160, 0x116B, 0x615A, 0x7151, 0x414C, 0x5147,
60*2acdf09bSHamdan Igbaria 	0xA12E, 0xB125, 0x8138, 0x9133, 0xE102, 0xF109, 0xC114, 0xD11F,
61*2acdf09bSHamdan Igbaria 	0x31CD, 0x21C6, 0x11DB, 0x01D0, 0x71E1, 0x61EA, 0x51F7, 0x41FC,
62*2acdf09bSHamdan Igbaria 	0xB195, 0xA19E, 0x9183, 0x8188, 0xF1B9, 0xE1B2, 0xD1AF, 0xC1A4,
63*2acdf09bSHamdan Igbaria 	0x42EC, 0x52E7, 0x62FA, 0x72F1, 0x02C0, 0x12CB, 0x22D6, 0x32DD,
64*2acdf09bSHamdan Igbaria 	0xC2B4, 0xD2BF, 0xE2A2, 0xF2A9, 0x8298, 0x9293, 0xA28E, 0xB285,
65*2acdf09bSHamdan Igbaria 	0x5257, 0x425C, 0x7241, 0x624A, 0x127B, 0x0270, 0x326D, 0x2266,
66*2acdf09bSHamdan Igbaria 	0xD20F, 0xC204, 0xF219, 0xE212, 0x9223, 0x8228, 0xB235, 0xA23E,
67*2acdf09bSHamdan Igbaria 	0x639A, 0x7391, 0x438C, 0x5387, 0x23B6, 0x33BD, 0x03A0, 0x13AB,
68*2acdf09bSHamdan Igbaria 	0xE3C2, 0xF3C9, 0xC3D4, 0xD3DF, 0xA3EE, 0xB3E5, 0x83F8, 0x93F3,
69*2acdf09bSHamdan Igbaria 	0x7321, 0x632A, 0x5337, 0x433C, 0x330D, 0x2306, 0x131B, 0x0310,
70*2acdf09bSHamdan Igbaria 	0xF379, 0xE372, 0xD36F, 0xC364, 0xB355, 0xA35E, 0x9343, 0x8348,
71*2acdf09bSHamdan Igbaria 	0x85D8, 0x95D3, 0xA5CE, 0xB5C5, 0xC5F4, 0xD5FF, 0xE5E2, 0xF5E9,
72*2acdf09bSHamdan Igbaria 	0x0580, 0x158B, 0x2596, 0x359D, 0x45AC, 0x55A7, 0x65BA, 0x75B1,
73*2acdf09bSHamdan Igbaria 	0x9563, 0x8568, 0xB575, 0xA57E, 0xD54F, 0xC544, 0xF559, 0xE552,
74*2acdf09bSHamdan Igbaria 	0x153B, 0x0530, 0x352D, 0x2526, 0x5517, 0x451C, 0x7501, 0x650A,
75*2acdf09bSHamdan Igbaria 	0xA4AE, 0xB4A5, 0x84B8, 0x94B3, 0xE482, 0xF489, 0xC494, 0xD49F,
76*2acdf09bSHamdan Igbaria 	0x24F6, 0x34FD, 0x04E0, 0x14EB, 0x64DA, 0x74D1, 0x44CC, 0x54C7,
77*2acdf09bSHamdan Igbaria 	0xB415, 0xA41E, 0x9403, 0x8408, 0xF439, 0xE432, 0xD42F, 0xC424,
78*2acdf09bSHamdan Igbaria 	0x344D, 0x2446, 0x145B, 0x0450, 0x7461, 0x646A, 0x5477, 0x447C,
79*2acdf09bSHamdan Igbaria 	0xC734, 0xD73F, 0xE722, 0xF729, 0x8718, 0x9713, 0xA70E, 0xB705,
80*2acdf09bSHamdan Igbaria 	0x476C, 0x5767, 0x677A, 0x7771, 0x0740, 0x174B, 0x2756, 0x375D,
81*2acdf09bSHamdan Igbaria 	0xD78F, 0xC784, 0xF799, 0xE792, 0x97A3, 0x87A8, 0xB7B5, 0xA7BE,
82*2acdf09bSHamdan Igbaria 	0x57D7, 0x47DC, 0x77C1, 0x67CA, 0x17FB, 0x07F0, 0x37ED, 0x27E6,
83*2acdf09bSHamdan Igbaria 	0xE642, 0xF649, 0xC654, 0xD65F, 0xA66E, 0xB665, 0x8678, 0x9673,
84*2acdf09bSHamdan Igbaria 	0x661A, 0x7611, 0x460C, 0x5607, 0x2636, 0x363D, 0x0620, 0x162B,
85*2acdf09bSHamdan Igbaria 	0xF6F9, 0xE6F2, 0xD6EF, 0xC6E4, 0xB6D5, 0xA6DE, 0x96C3, 0x86C8,
86*2acdf09bSHamdan Igbaria 	0x76A1, 0x66AA, 0x56B7, 0x46BC, 0x368D, 0x2686, 0x169B, 0x0690
87*2acdf09bSHamdan Igbaria };
88*2acdf09bSHamdan Igbaria 
mlx5dr_crc32_calc(uint8_t * p,size_t len)897f5e6de5SItamar Gozlan uint32_t mlx5dr_crc32_calc(uint8_t *p, size_t len)
907f5e6de5SItamar Gozlan {
917f5e6de5SItamar Gozlan 	uint32_t crc = 0;
927f5e6de5SItamar Gozlan 
937f5e6de5SItamar Gozlan 	while (len--)
947f5e6de5SItamar Gozlan 		crc = (crc >> 8) ^ dr_ste_crc_tab32[(crc ^ *p++) & 255];
957f5e6de5SItamar Gozlan 
967f5e6de5SItamar Gozlan 	return rte_be_to_cpu_32(crc);
977f5e6de5SItamar Gozlan }
98*2acdf09bSHamdan Igbaria 
mlx5dr_crc16_calc(uint8_t * p,size_t len,uint16_t crc_tab16[])99*2acdf09bSHamdan Igbaria uint16_t mlx5dr_crc16_calc(uint8_t *p, size_t len, uint16_t crc_tab16[])
100*2acdf09bSHamdan Igbaria {
101*2acdf09bSHamdan Igbaria 	uint16_t crc = 0;
102*2acdf09bSHamdan Igbaria 
103*2acdf09bSHamdan Igbaria 	while (len--)
104*2acdf09bSHamdan Igbaria 		crc = (crc << 8) ^ crc_tab16[((crc >> 8) ^ *p++) & 0xff];
105*2acdf09bSHamdan Igbaria 
106*2acdf09bSHamdan Igbaria 	return crc;
107*2acdf09bSHamdan Igbaria }
108*2acdf09bSHamdan Igbaria 
mlx5dr_crc_encap_entropy_hash_calc(struct mlx5dr_context * ctx,struct mlx5dr_crc_encap_entropy_hash_fields * data,uint8_t entropy_res[],enum mlx5dr_crc_encap_entropy_hash_size res_size)109*2acdf09bSHamdan Igbaria int mlx5dr_crc_encap_entropy_hash_calc(struct mlx5dr_context *ctx,
110*2acdf09bSHamdan Igbaria 				       struct mlx5dr_crc_encap_entropy_hash_fields *data,
111*2acdf09bSHamdan Igbaria 				       uint8_t entropy_res[],
112*2acdf09bSHamdan Igbaria 				       enum mlx5dr_crc_encap_entropy_hash_size res_size)
113*2acdf09bSHamdan Igbaria {
114*2acdf09bSHamdan Igbaria 	struct mlx5dr_cmd_query_caps *caps = ctx->caps;
115*2acdf09bSHamdan Igbaria 	uint16_t max_hash, min_hash, res;
116*2acdf09bSHamdan Igbaria 
117*2acdf09bSHamdan Igbaria 	if (caps->encap_entropy_hash_type) {
118*2acdf09bSHamdan Igbaria 		DR_LOG(ERR, "calculation of encap_entropy_hash_type 0x%x not supported",
119*2acdf09bSHamdan Igbaria 		       caps->encap_entropy_hash_type);
120*2acdf09bSHamdan Igbaria 		rte_errno = ENOTSUP;
121*2acdf09bSHamdan Igbaria 		return rte_errno;
122*2acdf09bSHamdan Igbaria 	}
123*2acdf09bSHamdan Igbaria 
124*2acdf09bSHamdan Igbaria 	max_hash = caps->roce_max_src_udp_port;
125*2acdf09bSHamdan Igbaria 	min_hash = caps->roce_min_src_udp_port;
126*2acdf09bSHamdan Igbaria 
127*2acdf09bSHamdan Igbaria 	res = mlx5dr_crc16_calc((uint8_t *)data, sizeof(*data), dr_crc_inner_crc_tab16);
128*2acdf09bSHamdan Igbaria 
129*2acdf09bSHamdan Igbaria 	if (res_size == MLX5DR_CRC_ENCAP_ENTROPY_HASH_SIZE_16) {
130*2acdf09bSHamdan Igbaria 		*(uint16_t *)entropy_res = rte_cpu_to_be_16((min_hash | res) & max_hash);
131*2acdf09bSHamdan Igbaria 	} else if (res_size == MLX5DR_CRC_ENCAP_ENTROPY_HASH_SIZE_8) {
132*2acdf09bSHamdan Igbaria 		*entropy_res = (uint8_t)(res & 0xff);
133*2acdf09bSHamdan Igbaria 	} else {
134*2acdf09bSHamdan Igbaria 		rte_errno = ENOTSUP;
135*2acdf09bSHamdan Igbaria 		return rte_errno;
136*2acdf09bSHamdan Igbaria 	}
137*2acdf09bSHamdan Igbaria 
138*2acdf09bSHamdan Igbaria 	return 0;
139*2acdf09bSHamdan Igbaria }
140