xref: /dpdk/drivers/net/bnxt/tf_core/tf_hash.c (revision e6e8f03e5459f25153f1e4cd3e9ac30d3e473a61)
1ac21f333SMike Baucom /* SPDX-License-Identifier: BSD-3-Clause
2*e6e8f03eSRandy Schacher  * Copyright(c) 2019-2023 Broadcom
3ac21f333SMike Baucom  * All rights reserved.
4ac21f333SMike Baucom  */
5ac21f333SMike Baucom 
6ac21f333SMike Baucom #include "tf_hash.h"
7ac21f333SMike Baucom 
8ac21f333SMike Baucom /* CRC polynomial 0xedb88320 */
9ac21f333SMike Baucom static const uint32_t tf_hash_crc32tbl[] = {
10ac21f333SMike Baucom 	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
11ac21f333SMike Baucom 	0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
12ac21f333SMike Baucom 	0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
13ac21f333SMike Baucom 	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
14ac21f333SMike Baucom 	0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
15ac21f333SMike Baucom 	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
16ac21f333SMike Baucom 	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
17ac21f333SMike Baucom 	0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
18ac21f333SMike Baucom 	0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
19ac21f333SMike Baucom 	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
20ac21f333SMike Baucom 	0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
21ac21f333SMike Baucom 	0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
22ac21f333SMike Baucom 	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
23ac21f333SMike Baucom 	0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
24ac21f333SMike Baucom 	0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
25ac21f333SMike Baucom 	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
26ac21f333SMike Baucom 	0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
27ac21f333SMike Baucom 	0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
28ac21f333SMike Baucom 	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
29ac21f333SMike Baucom 	0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
30ac21f333SMike Baucom 	0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
31ac21f333SMike Baucom 	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
32ac21f333SMike Baucom 	0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
33ac21f333SMike Baucom 	0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
34ac21f333SMike Baucom 	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
35ac21f333SMike Baucom 	0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
36ac21f333SMike Baucom 	0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
37ac21f333SMike Baucom 	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
38ac21f333SMike Baucom 	0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
39ac21f333SMike Baucom 	0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
40ac21f333SMike Baucom 	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
41ac21f333SMike Baucom 	0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
42ac21f333SMike Baucom 	0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
43ac21f333SMike Baucom 	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
44ac21f333SMike Baucom 	0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
45ac21f333SMike Baucom 	0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
46ac21f333SMike Baucom 	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
47ac21f333SMike Baucom 	0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
48ac21f333SMike Baucom 	0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
49ac21f333SMike Baucom 	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
50ac21f333SMike Baucom 	0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
51ac21f333SMike Baucom 	0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
52ac21f333SMike Baucom 	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
53ac21f333SMike Baucom 	0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
54ac21f333SMike Baucom 	0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
55ac21f333SMike Baucom 	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
56ac21f333SMike Baucom 	0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
57ac21f333SMike Baucom 	0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
58ac21f333SMike Baucom 	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
59ac21f333SMike Baucom 	0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
60ac21f333SMike Baucom 	0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
61ac21f333SMike Baucom 	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
62ac21f333SMike Baucom 	0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
63ac21f333SMike Baucom 	0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
64ac21f333SMike Baucom 	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
65ac21f333SMike Baucom 	0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
66ac21f333SMike Baucom 	0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
67ac21f333SMike Baucom 	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
68ac21f333SMike Baucom 	0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
69ac21f333SMike Baucom 	0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
70ac21f333SMike Baucom 	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
71ac21f333SMike Baucom 	0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
72ac21f333SMike Baucom 	0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
73ac21f333SMike Baucom 	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
74ac21f333SMike Baucom };
75ac21f333SMike Baucom 
76ac21f333SMike Baucom /**
77ac21f333SMike Baucom  * Calculate a crc32 on the buffer with an initial value and len
78ac21f333SMike Baucom  *
79ac21f333SMike Baucom  * Returns the crc32
80ac21f333SMike Baucom  */
81ac21f333SMike Baucom uint32_t
tf_hash_calc_crc32i(uint32_t init,uint8_t * buf,uint32_t len)82ac21f333SMike Baucom tf_hash_calc_crc32i(uint32_t init, uint8_t *buf, uint32_t len)
83ac21f333SMike Baucom {
84ac21f333SMike Baucom 	uint32_t crc = init;
85ac21f333SMike Baucom 
86ac21f333SMike Baucom 	while (len--)
87ac21f333SMike Baucom 		crc = tf_hash_crc32tbl[(crc ^ buf[len]) & 0xff] ^
88ac21f333SMike Baucom 			(crc >> 8);
89ac21f333SMike Baucom 
90ac21f333SMike Baucom 	return crc;
91ac21f333SMike Baucom }
92ac21f333SMike Baucom 
93ac21f333SMike Baucom /**
94ac21f333SMike Baucom  * Calculate a crc32 on the buffer with a default initial value
95ac21f333SMike Baucom  *
96ac21f333SMike Baucom  * Returns the crc32
97ac21f333SMike Baucom  */
98ac21f333SMike Baucom uint32_t
tf_hash_calc_crc32(uint8_t * buf,uint32_t len)99ac21f333SMike Baucom tf_hash_calc_crc32(uint8_t *buf, uint32_t len)
100ac21f333SMike Baucom {
101ac21f333SMike Baucom 	uint32_t crc = ~0U;
102ac21f333SMike Baucom 
103ac21f333SMike Baucom 	crc = tf_hash_calc_crc32i(crc, buf, len);
104ac21f333SMike Baucom 
105ac21f333SMike Baucom 	return ~crc;
106ac21f333SMike Baucom }
107