hash.c (79325B)
1 /* 2 * * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 6 * 7 * File: hash.c 8 * Purpose: Trident3 hash table calculation routines 9 * Requires: 10 */ 11 12 #include <shared/bsl.h> 13 14 #include <soc/drv.h> 15 #include <soc/mem.h> 16 #include <soc/debug.h> 17 #include <soc/hash.h> 18 #include <soc/trident3.h> 19 20 #if defined(BCM_HELIX5_SUPPORT) 21 22 #include <soc/helix5.h> 23 24 int 25 soc_hx5_shared_hash_mem_bucket_read(int unit, int ent, int key_type, int *width, 26 soc_mem_t base_mem, soc_mem_t *mem, 27 void *bkt_entry, void *entry) 28 { 29 30 soc_mem_info_t meminfo; 31 soc_field_info_t fieldinfo; 32 /* Exclude HIT bit */ 33 int entry_bits = 0; 34 35 switch (base_mem) { 36 case L3_ENTRY_SINGLEm: 37 case L3_ENTRY_ONLY_SINGLEm: 38 case L3_ENTRY_DOUBLEm: 39 case L3_ENTRY_QUADm: 40 switch (key_type) { 41 case TD3_L3_HASH_KEY_TYPE_V4UC: 42 case TD3_L3_HASH_KEY_TYPE_TRILL: 43 case TD3_L3_HASH_KEY_TYPE_FCOE_DOMAIN: 44 case TD3_L3_HASH_KEY_TYPE_FCOE_HOST: 45 case TD3_L3_HASH_KEY_TYPE_FCOE_SOURCE_MAP: 46 *width = 1; 47 *mem = L3_ENTRY_SINGLEm; 48 break; 49 case TD3_L3_HASH_KEY_TYPE_V4MC: 50 case TD3_L3_HASH_KEY_TYPE_L2_IPV4_MULTICAST: 51 case TD3_L3_HASH_KEY_TYPE_L2VP_IPV4_MULTICAST: 52 case TD3_L3_HASH_KEY_TYPE_DST_NAT: 53 case TD3_L3_HASH_KEY_TYPE_DST_NAPT: 54 case TD3_L3_HASH_KEY_TYPE_V6UC: 55 *width = 2; 56 *mem = L3_ENTRY_DOUBLEm; 57 break; 58 case TD3_L3_HASH_KEY_TYPE_V6MC: 59 case TD3_L3_HASH_KEY_TYPE_L2_IPV6_MULTICAST: 60 case TD3_L3_HASH_KEY_TYPE_L2VP_IPV6_MULTICAST: 61 default: 62 *width = 4; 63 *mem = L3_ENTRY_QUADm; 64 } 65 entry_bits = (soc_mem_entry_bits(unit, L3_ENTRY_SINGLEm) - 1) * (*width); 66 meminfo.bytes = SOC_MEM_WORDS(unit, L3_ENTRY_QUADm) * 4; 67 break; 68 69 case EXACT_MATCH_2m: 70 case EXACT_MATCH_4m: 71 switch (key_type) { 72 case TD3_FPEM_HASH_KEY_TYPE_128B: 73 case TD3_FPEM_HASH_KEY_TYPE_160B: 74 *width = 2; 75 *mem = EXACT_MATCH_2m; 76 break; 77 case TD3_FPEM_HASH_KEY_TYPE_320B: 78 default: 79 *width = 4; 80 *mem = EXACT_MATCH_4m; 81 } 82 entry_bits = (soc_mem_entry_bits(unit, EXACT_MATCH_2m) - 1) * ((*width)/2); 83 meminfo.bytes = SOC_MEM_WORDS(unit, EXACT_MATCH_4m) * 4; 84 break; 85 86 case VLAN_XLATE_1_SINGLEm: 87 case VLAN_XLATE_1_DOUBLEm: 88 case VLAN_XLATE_2_SINGLEm: 89 case VLAN_XLATE_2_DOUBLEm: 90 switch (key_type) { 91 case TD3_VLXLT_HASH_KEY_TYPE_L2GRE_DIP: 92 case TD3_VLXLT_HASH_KEY_TYPE_VXLAN_DIP: 93 *width = 1; 94 *mem = VLAN_XLATE_1_SINGLEm; 95 break; 96 case TD3_VLXLT_HASH_KEY_TYPE_IVID: 97 case TD3_VLXLT_HASH_KEY_TYPE_IVID_VSAN: 98 case TD3_VLXLT_HASH_KEY_TYPE_OVID: 99 case TD3_VLXLT_HASH_KEY_TYPE_OVID_VSAN: 100 case TD3_VLXLT_HASH_KEY_TYPE_IVID_OVID: 101 case TD3_VLXLT_HASH_KEY_TYPE_IVID_OVID_VSAN: 102 case TD3_VLXLT_HASH_KEY_TYPE_OTAG: 103 case TD3_VLXLT_HASH_KEY_TYPE_ITAG: 104 case TD3_VLXLT_HASH_KEY_TYPE_VIF_OTAG: 105 case TD3_VLXLT_HASH_KEY_TYPE_VIF_ITAG: 106 case TD3_VLXLT_HASH_KEY_TYPE_VIF_VLAN: 107 case TD3_VLXLT_HASH_KEY_TYPE_VIF_CVLAN: 108 case TD3_VLXLT_HASH_KEY_TYPE_VIF: 109 case TD3_VLXLT_HASH_KEY_TYPE_HPAE: 110 case TD3_VLXLT_HASH_KEY_TYPE_VLAN_MAC: 111 case TD3_VLXLT_HASH_KEY_TYPE_VLAN_MAC_PORT: 112 case TD3_VLXLT_HASH_KEY_TYPE_PRI_CFI: 113 default: 114 *width = 2; 115 *mem = VLAN_XLATE_1_DOUBLEm; 116 } 117 entry_bits = (soc_mem_entry_bits(unit, VLAN_XLATE_1_SINGLEm) - 1) 118 * (*width); 119 meminfo.bytes = SOC_MEM_WORDS(unit, VLAN_XLATE_1_DOUBLEm) * 4 * 2; 120 121 break; 122 123 case EGR_VLAN_XLATE_1_SINGLEm: 124 case EGR_VLAN_XLATE_1_DOUBLEm: 125 case EGR_VLAN_XLATE_2_SINGLEm: 126 case EGR_VLAN_XLATE_2_DOUBLEm: 127 switch (key_type) { 128 case TD3_EVLXLT_HASH_KEY_TYPE_L2GRE_VFI: 129 case TD3_EVLXLT_HASH_KEY_TYPE_L2GRE_VFI_DVP: 130 case TD3_EVLXLT_HASH_KEY_TYPE_VXLAN_VFI: 131 case TD3_EVLXLT_HASH_KEY_TYPE_VXLAN_VFI_DVP: 132 *width = 1; 133 *mem = EGR_VLAN_XLATE_1_SINGLEm; 134 break; 135 case TD3_EVLXLT_HASH_KEY_TYPE_VLAN_XLATE: 136 case TD3_EVLXLT_HASH_KEY_TYPE_VLAN_XLATE_DVP: 137 case TD3_EVLXLT_HASH_KEY_TYPE_FCOE_XLATE: 138 case TD3_EVLXLT_HASH_KEY_TYPE_ISID_XLATE: 139 case TD3_EVLXLT_HASH_KEY_TYPE_ISID_DVP_XLATE: 140 case TD3_EVLXLT_HASH_KEY_TYPE_FCOE_XLATE_DVP: 141 case TD3_ELVXLT_HASH_KEY_TYPE_VFI_DVP_GROUP: 142 case TD3_ELVXLT_HASH_KEY_TYPE_VRF_MAPPING: 143 case TD3_ELVXLT_HASH_KEY_TYPE_VLAN_XLATE_VFI: 144 default: 145 *width = 2; 146 *mem = EGR_VLAN_XLATE_1_DOUBLEm; 147 } 148 entry_bits = (soc_mem_entry_bits(unit, EGR_VLAN_XLATE_1_SINGLEm) - 1) 149 * (*width); 150 meminfo.bytes = SOC_MEM_WORDS(unit, EGR_VLAN_XLATE_1_DOUBLEm) * 4 * 2; 151 break; 152 153 case MPLS_ENTRY_SINGLEm: 154 case MPLS_ENTRYm: 155 switch (key_type) { 156 case TD3_MPLS_HASH_KEY_TYPE_MPLS: 157 case TD3_MPLS_HASH_KEY_TYPE_MIM_NVP: 158 case TD3_MPLS_HASH_KEY_TYPE_MIM_ISID: 159 case TD3_MPLS_HASH_KEY_TYPE_MIM_ISID_SVP: 160 case TD3_MPLS_HASH_KEY_TYPE_L2GRE_VPNID_SIP: 161 case TD3_MPLS_HASH_KEY_TYPE_TRILL: 162 case TD3_MPLS_HASH_KEY_TYPE_L2GRE_SIP: 163 case TD3_MPLS_HASH_KEY_TYPE_L2GRE_VPNID: 164 case TD3_MPLS_HASH_KEY_TYPE_VXLAN_SIP: 165 case TD3_MPLS_HASH_KEY_TYPE_VXLAN_VPNID: 166 case TD3_MPLS_HASH_KEY_TYPE_VXLAN_VPNID_SIP: 167 default: 168 *width = 2; 169 *mem = MPLS_ENTRYm; 170 } 171 entry_bits = (soc_mem_entry_bits(unit, MPLS_ENTRY_SINGLEm) - 1) 172 * (*width); 173 meminfo.bytes = SOC_MEM_WORDS(unit, MPLS_ENTRYm) * 4 * 2; 174 break; 175 default: 176 return SOC_E_PARAM; 177 } 178 179 meminfo.flags = 0; 180 fieldinfo.flags = SOCF_LE; 181 fieldinfo.bp = entry_bits * (ent / *width); 182 fieldinfo.len = entry_bits; 183 184 (void)soc_meminfo_fieldinfo_field_get(bkt_entry, &meminfo, 185 &fieldinfo, entry); 186 return SOC_E_NONE; 187 188 } 189 190 191 int 192 soc_hx5_hash_mem_status_get(int unit, soc_mem_t mem, void* entry, uint32 *v) { 193 int i; 194 v[0] = v[1] = v[2] = v[3] = 0; 195 196 switch (mem) { 197 case L3_ENTRY_QUADm: 198 case EXACT_MATCH_4m: 199 soc_mem_field_get(unit, mem, entry, BASE_VALID_3f, &v[3]); 200 soc_mem_field_get(unit, mem, entry, BASE_VALID_2f, &v[2]); 201 /* pass through */ 202 case L3_ENTRY_DOUBLEm: 203 case EXACT_MATCH_2m: 204 case MPLS_ENTRYm: 205 case VLAN_XLATE_1_DOUBLEm: 206 case VLAN_XLATE_2_DOUBLEm: 207 case EGR_VLAN_XLATE_1_DOUBLEm: 208 case EGR_VLAN_XLATE_2_DOUBLEm: 209 soc_mem_field_get(unit, mem, entry, BASE_VALID_1f, &v[1]); 210 soc_mem_field_get(unit, mem, entry, BASE_VALID_0f, &v[0]); 211 break; 212 case L3_ENTRY_SINGLEm: 213 case L3_ENTRY_ONLY_SINGLEm: 214 case MPLS_ENTRY_SINGLEm: 215 case VLAN_XLATE_1_SINGLEm: 216 case VLAN_XLATE_2_SINGLEm: 217 case EGR_VLAN_XLATE_1_SINGLEm: 218 case EGR_VLAN_XLATE_2_SINGLEm: 219 soc_mem_field_get(unit, mem, entry, BASE_VALIDf, &v[0]); 220 break; 221 default: 222 v[0] = v[1] = v[2] = v[3] = 1; 223 break; 224 225 } 226 /* Use v[i] for constructing a valid bitmap */ 227 for (i = 0; i < 4; i++) { 228 v[i] = (v[i] > 0); 229 } 230 return SOC_E_NONE; 231 } 232 233 /* Get number of banks for the hash table according to the config 234 */ 235 int 236 soc_helix5_hash_bank_count_get(int unit, soc_mem_t mem, int *num_banks) 237 { 238 int count; 239 240 switch (mem) { 241 case L2Xm: 242 /* 243 * 8k single wide entries in each of 2 dedicated L2 bank 244 * 16k single wide entries in each shared bank (6 shared banks max) 245 */ 246 count = soc_mem_index_count(unit, mem); 247 *num_banks = 2 + (count - 2 * 8 * 1024) / (16 * 1024); 248 break; 249 case L3_ENTRY_ONLY_SINGLEm: 250 case L3_ENTRY_ONLY_DOUBLEm: 251 case L3_ENTRY_ONLY_QUADm: 252 case L3_ENTRY_SINGLEm: 253 case L3_ENTRY_DOUBLEm: 254 case L3_ENTRY_QUADm: 255 /* 256 * 8k single wide entries in each of 2 dedicated L3 bank 257 * 16k entries in each shared bank (6 shared banks max) 258 */ 259 count = soc_mem_index_count(unit, L3_ENTRY_ONLY_SINGLEm); 260 *num_banks = 2 + (count - 2 * 8 * 1024) / (16 * 1024); 261 break; 262 263 case EXACT_MATCH_2m: 264 case EXACT_MATCH_2_ENTRY_ONLYm: 265 case EXACT_MATCH_4m: 266 case EXACT_MATCH_4_ENTRY_ONLYm: 267 /* 268 * 8k double wide entries in each shared bank 269 */ 270 count = soc_mem_index_count(unit, EXACT_MATCH_2m); 271 *num_banks = count / (8 * 1024); 272 break; 273 274 /* EUAT 275 * 4k single wide entries in each shared bank 276 */ 277 case EGR_VLAN_XLATE_1_SINGLEm: 278 case EGR_VLAN_XLATE_1_DOUBLEm: 279 count = soc_mem_index_count(unit, EGR_VLAN_XLATE_1_SINGLEm); 280 *num_banks = count / (4 * 1024); 281 break; 282 283 case EGR_VLAN_XLATE_2_SINGLEm: 284 case EGR_VLAN_XLATE_2_DOUBLEm: 285 count = soc_mem_index_count(unit, EGR_VLAN_XLATE_2_SINGLEm); 286 *num_banks = count / (4 * 1024); 287 break; 288 289 case ING_VP_VLAN_MEMBERSHIPm: 290 case EGR_VP_VLAN_MEMBERSHIPm: 291 *num_banks = 2; 292 break; 293 294 /* IUAT 295 * 4k single wide entries in each shared bank 296 */ 297 case MPLS_ENTRY_SINGLEm: 298 case MPLS_ENTRYm: 299 count = soc_mem_index_count(unit, MPLS_ENTRY_SINGLEm); 300 *num_banks = count / (4 * 1024); 301 break; 302 303 case VLAN_XLATE_1_SINGLEm: 304 case VLAN_XLATE_1_DOUBLEm: 305 count = soc_mem_index_count(unit, VLAN_XLATE_1_SINGLEm); 306 *num_banks = count / (4 * 1024); 307 break; 308 309 case VLAN_XLATE_2_SINGLEm: 310 case VLAN_XLATE_2_DOUBLEm: 311 count = soc_mem_index_count(unit, VLAN_XLATE_2_SINGLEm); 312 *num_banks = count / (4 * 1024); 313 break; 314 315 default: 316 return SOC_E_INTERNAL; 317 } 318 319 return SOC_E_NONE; 320 } 321 322 /* Map logical bank to physical bank for a memory 323 * mem - memory 324 * log_bank - logical bank number 325 * phy_bank_id - physical bank number 326 */ 327 int 328 soc_hx5_log_to_phy_bank_map(int unit, soc_mem_t mem, int log_bank, 329 int *phy_bank_id) 330 { 331 uint32 hash_control_entry[4]; 332 int done = 0; 333 static const soc_field_t logical_to_physical_fields[] = { 334 LOGICAL_BANK_0_PHYSICAL_BANK_LOCATIONf, 335 LOGICAL_BANK_1_PHYSICAL_BANK_LOCATIONf, 336 LOGICAL_BANK_2_PHYSICAL_BANK_LOCATIONf, 337 LOGICAL_BANK_3_PHYSICAL_BANK_LOCATIONf, 338 LOGICAL_BANK_4_PHYSICAL_BANK_LOCATIONf, 339 LOGICAL_BANK_5_PHYSICAL_BANK_LOCATIONf, 340 LOGICAL_BANK_6_PHYSICAL_BANK_LOCATIONf, 341 LOGICAL_BANK_7_PHYSICAL_BANK_LOCATIONf 342 }; 343 int logical_to_physical_fields_num = sizeof(logical_to_physical_fields)/ 344 sizeof(soc_field_t); 345 346 if(log_bank < 0 || log_bank >= logical_to_physical_fields_num) { 347 return SOC_E_PARAM; 348 } 349 350 sal_memset(hash_control_entry, 0, sizeof(hash_control_entry)); 351 352 switch(mem) { 353 case L2Xm: 354 /* Dedicated Banks */ 355 if (log_bank < 2) { 356 *phy_bank_id = log_bank; 357 done = 1; 358 } else { /* Shared Banks */ 359 mem = L2_ENTRY_HASH_CONTROLm; 360 } 361 break; 362 case L3_ENTRY_SINGLEm: 363 case L3_ENTRY_ONLY_SINGLEm: 364 case L3_ENTRY_DOUBLEm: 365 case L3_ENTRY_ONLY_DOUBLEm: 366 case L3_ENTRY_QUADm: 367 case L3_ENTRY_ONLY_QUADm: 368 /* Dedicated Banks */ 369 if (log_bank < 2) { 370 *phy_bank_id = log_bank + 8; 371 done = 1; 372 } else { /* Shared Banks */ 373 mem = L3_ENTRY_HASH_CONTROLm; 374 } 375 break; 376 case EXACT_MATCH_2m: 377 case EXACT_MATCH_2_PIPE0m: 378 case EXACT_MATCH_4m: 379 case EXACT_MATCH_4_PIPE0m: 380 if (log_bank < 0 || log_bank > 5) { 381 return SOC_E_PARAM; 382 } else { 383 mem = EXACT_MATCH_HASH_CONTROLm; 384 } 385 break; 386 case MPLS_ENTRY_SINGLEm: 387 case MPLS_ENTRYm: 388 if (log_bank < 0 || log_bank > 7) { 389 return SOC_E_PARAM; 390 } else { 391 mem = MPLS_ENTRY_HASH_CONTROLm; 392 } 393 break; 394 case VLAN_XLATE_1_SINGLEm: 395 case VLAN_XLATE_1_DOUBLEm: 396 if (log_bank < 0 || log_bank > 7) { 397 return SOC_E_PARAM; 398 } else { 399 mem = VLAN_XLATE_1_HASH_CONTROLm; 400 } 401 break; 402 case VLAN_XLATE_2_SINGLEm: 403 case VLAN_XLATE_2_DOUBLEm: 404 if (log_bank < 0 || log_bank > 7) { 405 return SOC_E_PARAM; 406 } else { 407 mem = VLAN_XLATE_2_HASH_CONTROLm; 408 } 409 break; 410 case EGR_VLAN_XLATE_1_SINGLEm: 411 case EGR_VLAN_XLATE_1_DOUBLEm: 412 if (log_bank < 0 || log_bank > 3) { 413 return SOC_E_PARAM; 414 } else { 415 mem = EGR_VLAN_XLATE_1_HASH_CONTROLm; 416 } 417 break; 418 case EGR_VLAN_XLATE_2_SINGLEm: 419 case EGR_VLAN_XLATE_2_DOUBLEm: 420 if (log_bank < 0 || log_bank > 3) { 421 return SOC_E_PARAM; 422 } else { 423 mem = EGR_VLAN_XLATE_2_HASH_CONTROLm; 424 } 425 break; 426 default: 427 *phy_bank_id = log_bank; 428 done = 1; 429 } 430 /* Shared Banks */ 431 if (done == 0) { 432 SOC_IF_ERROR_RETURN(soc_mem_read(unit, mem, MEM_BLOCK_ALL, 0, 433 hash_control_entry)); 434 *phy_bank_id = soc_mem_field32_get(unit, mem, hash_control_entry, 435 logical_to_physical_fields[log_bank]); 436 } 437 return SOC_E_NONE; 438 } 439 440 /* Map physical to logical bank for a memory 441 * mem - memory 442 * phy_bank - physical bank number 443 * log_bank - logical bank number 444 */ 445 int 446 soc_hx5_phy_to_log_bank_map(int unit, soc_mem_t mem, int phy_bank, 447 int *log_bank) 448 { 449 uint32 hash_control_entry[4]; 450 int i, done = 0; 451 int bank_min, bank_max; 452 static const soc_field_t logical_to_physical_fields[] = { 453 LOGICAL_BANK_0_PHYSICAL_BANK_LOCATIONf, 454 LOGICAL_BANK_1_PHYSICAL_BANK_LOCATIONf, 455 LOGICAL_BANK_2_PHYSICAL_BANK_LOCATIONf, 456 LOGICAL_BANK_3_PHYSICAL_BANK_LOCATIONf, 457 LOGICAL_BANK_4_PHYSICAL_BANK_LOCATIONf, 458 LOGICAL_BANK_5_PHYSICAL_BANK_LOCATIONf, 459 LOGICAL_BANK_6_PHYSICAL_BANK_LOCATIONf, 460 LOGICAL_BANK_7_PHYSICAL_BANK_LOCATIONf 461 }; 462 463 sal_memset(hash_control_entry, 0, sizeof(hash_control_entry)); 464 465 switch(mem) { 466 case L2Xm: 467 bank_min = 2; 468 bank_max = 7; 469 /* Dedicated Banks */ 470 if (phy_bank < 2) { 471 *log_bank = phy_bank; 472 done = 1; 473 } else { /* Shared Banks */ 474 mem = L2_ENTRY_HASH_CONTROLm; 475 } 476 break; 477 case L3_ENTRY_SINGLEm: 478 case L3_ENTRY_ONLY_SINGLEm: 479 case L3_ENTRY_DOUBLEm: 480 case L3_ENTRY_ONLY_DOUBLEm: 481 case L3_ENTRY_QUADm: 482 case L3_ENTRY_ONLY_QUADm: 483 bank_min = 2; 484 bank_max = 9; 485 /* Dedicated Banks */ 486 if (phy_bank > 7) { 487 *log_bank = phy_bank - 8; 488 done = 1; 489 } else { /* Shared Banks */ 490 mem = L3_ENTRY_HASH_CONTROLm; 491 } 492 break; 493 case EXACT_MATCH_2m: 494 case EXACT_MATCH_2_PIPE0m: 495 case EXACT_MATCH_4m: 496 case EXACT_MATCH_4_PIPE0m: 497 bank_min = 0; 498 bank_max = 5; 499 mem = EXACT_MATCH_HASH_CONTROLm; 500 break; 501 case MPLS_ENTRY_SINGLEm: 502 case MPLS_ENTRYm: 503 bank_min = 0; 504 bank_max = 7; 505 mem = MPLS_ENTRY_HASH_CONTROLm; 506 break; 507 case VLAN_XLATE_1_SINGLEm: 508 case VLAN_XLATE_1_DOUBLEm: 509 bank_min = 0; 510 bank_max = 7; 511 mem = VLAN_XLATE_1_HASH_CONTROLm; 512 break; 513 case VLAN_XLATE_2_SINGLEm: 514 case VLAN_XLATE_2_DOUBLEm: 515 bank_min = 0; 516 bank_max = 7; 517 mem = VLAN_XLATE_2_HASH_CONTROLm; 518 break; 519 case EGR_VLAN_XLATE_1_SINGLEm: 520 case EGR_VLAN_XLATE_1_DOUBLEm: 521 bank_min = 0; 522 bank_max = 7; 523 mem = EGR_VLAN_XLATE_1_HASH_CONTROLm; 524 break; 525 case EGR_VLAN_XLATE_2_SINGLEm: 526 case EGR_VLAN_XLATE_2_DOUBLEm: 527 bank_min = 0; 528 bank_max = 7; 529 mem = EGR_VLAN_XLATE_2_HASH_CONTROLm; 530 break; 531 default: 532 *log_bank = phy_bank; 533 done = 1; 534 } 535 536 /* Shared Banks */ 537 if (done == 0) { 538 /* Sanity */ 539 if (phy_bank < bank_min || phy_bank > bank_max) { 540 return SOC_E_PARAM; 541 } 542 543 SOC_IF_ERROR_RETURN(soc_mem_read(unit, mem, MEM_BLOCK_ALL, 0, 544 hash_control_entry)); 545 for (i = bank_min; i <= bank_max; i++) { 546 if(soc_mem_field32_get(unit, mem, hash_control_entry, 547 logical_to_physical_fields[i]) == phy_bank) { 548 *log_bank = i; 549 done = 1; 550 break; 551 } 552 } 553 } 554 return (done ? SOC_E_NONE : SOC_E_PARAM); 555 } 556 557 /* Get bank bitmap for the hash table 558 * Required only for shared hash tables 559 */ 560 int 561 soc_hx5_hash_bank_phy_bitmap_get(int unit, soc_mem_t mem, uint32 *bitmap) 562 { 563 uint32 hash_control_entry[4]; 564 switch(mem) { 565 case L2Xm: 566 mem = L2_ENTRY_HASH_CONTROLm; 567 break; 568 case L3_ENTRY_SINGLEm: 569 case L3_ENTRY_ONLY_SINGLEm: 570 case L3_ENTRY_DOUBLEm: 571 case L3_ENTRY_ONLY_DOUBLEm: 572 case L3_ENTRY_QUADm: 573 case L3_ENTRY_ONLY_QUADm: 574 mem = L3_ENTRY_HASH_CONTROLm; 575 break; 576 case EXACT_MATCH_2m: 577 case EXACT_MATCH_2_PIPE0m: 578 case EXACT_MATCH_4m: 579 case EXACT_MATCH_4_PIPE0m: 580 mem = EXACT_MATCH_HASH_CONTROLm; 581 break; 582 case MPLS_ENTRY_SINGLEm: 583 case MPLS_ENTRYm: 584 mem = MPLS_ENTRY_HASH_CONTROLm; 585 break; 586 case VLAN_XLATE_1_SINGLEm: 587 case VLAN_XLATE_1_DOUBLEm: 588 mem = VLAN_XLATE_1_HASH_CONTROLm; 589 break; 590 case VLAN_XLATE_2_SINGLEm: 591 case VLAN_XLATE_2_DOUBLEm: 592 mem = VLAN_XLATE_2_HASH_CONTROLm; 593 break; 594 case EGR_VLAN_XLATE_1_SINGLEm: 595 case EGR_VLAN_XLATE_1_DOUBLEm: 596 mem = EGR_VLAN_XLATE_1_HASH_CONTROLm; 597 break; 598 case EGR_VLAN_XLATE_2_SINGLEm: 599 case EGR_VLAN_XLATE_2_DOUBLEm: 600 mem = EGR_VLAN_XLATE_2_HASH_CONTROLm; 601 break; 602 default: 603 return SOC_E_PARAM; 604 } 605 606 SOC_IF_ERROR_RETURN(soc_mem_read(unit, mem, MEM_BLOCK_ALL, 0, 607 hash_control_entry)); 608 *bitmap = soc_mem_field32_get(unit, mem, hash_control_entry, 609 HASH_TABLE_BANK_CONFIGf); 610 611 return SOC_E_NONE; 612 } 613 614 /* Map bank sequence number to physical bank number */ 615 int 616 soc_hx5_hash_bank_number_get(int unit, soc_mem_t mem, int seq_num, 617 int *bank_num) { 618 int count; 619 620 SOC_IF_ERROR_RETURN(soc_helix5_hash_bank_count_get(unit, mem, &count)); 621 if (seq_num < 0 || seq_num >= count) { 622 return SOC_E_INTERNAL; 623 } 624 SOC_IF_ERROR_RETURN(soc_hx5_log_to_phy_bank_map(unit, mem, seq_num, 625 bank_num)); 626 627 return SOC_E_NONE; 628 } 629 630 int 631 soc_hx5_hash_seq_number_get(int unit, soc_mem_t mem, int bank_num, int *seq_num) 632 { 633 int count; 634 635 SOC_IF_ERROR_RETURN(soc_hx5_phy_to_log_bank_map(unit, mem, bank_num, 636 seq_num)); 637 638 SOC_IF_ERROR_RETURN(soc_helix5_hash_bank_count_get(unit, mem, &count)); 639 if (*seq_num < 0 || *seq_num >= count) { 640 return SOC_E_INTERNAL; 641 } 642 643 return SOC_E_NONE; 644 } 645 646 647 int 648 soc_hx5_hash_bank_info_get(int unit, soc_mem_t mem, int bank, 649 int *entries_per_bank, int *entries_per_row, 650 int *entries_per_bucket, int *bank_base, 651 int *bucket_offset) 652 { 653 int bank_size, row_size, bucket_size, base, offset; 654 int seq_num = 0; 655 /* int uat_8k_banks = 0, uat_16k_banks = 0; */ 656 657 /* Get logical bank number from input physical bank number */ 658 SOC_IF_ERROR_RETURN(soc_hx5_phy_to_log_bank_map(unit, mem, bank, &seq_num)); 659 bank = seq_num; 660 661 switch(mem) { 662 case L2Xm: 663 /* 664 * 4 entries per bucket (1 bucket per row) 665 * bank 0 - 1 -> dedicated banks - 8k entries each 666 * bank 2 - 7 -> shared banks - 16k entries each 667 */ 668 row_size = 4; 669 bucket_size = 4; 670 offset = 0; 671 if (bank < 0 || bank > 7) { 672 return SOC_E_INTERNAL; 673 } else if (bank < 2) { /* Dedicated bank */ 674 bank_size = 8192; 675 base = bank * bank_size; 676 } else { /* Shared bank */ 677 bank_size = 16384; 678 base = 16384 + (bank - 2) * bank_size; 679 } 680 break; 681 case L3_ENTRY_ONLY_SINGLEm: 682 #ifdef BCM_HELIX5_SUPPORT 683 case L3_ENTRY_SINGLEm: 684 case L3_ENTRY_DOUBLEm: 685 case L3_ENTRY_QUADm: 686 #endif /* BCM_HELIX5_SUPPORT */ 687 /* 688 * 4 entries per bucket (1 bucket per row) 689 * bank 0 - 1 -> dedicated banks - 8k entries each 690 * bank 2 - 7 -> shared banks - 16k entries each 691 */ 692 row_size = 4; 693 bucket_size = 4; 694 offset = 0; 695 if (bank < 0 || bank > 7) { 696 return SOC_E_INTERNAL; 697 } else if (bank < 2) { /* Dedicated bank */ 698 if (mem == L3_ENTRY_QUADm) { 699 bank_size = 8192/4; 700 base = bank * bank_size; 701 row_size = 4; 702 } else if (mem == L3_ENTRY_DOUBLEm) { 703 bank_size = 8192/2; 704 base = bank * bank_size; 705 row_size = 4; 706 } else { 707 bank_size = 8192; 708 base = bank * bank_size; 709 } 710 } else { /* Shared bank */ 711 bank_size = 16384; 712 if (mem == L3_ENTRY_QUADm) { 713 bank_size = bank_size/4; 714 base = 16384/4; 715 row_size = 1; 716 } else if (mem == L3_ENTRY_DOUBLEm) { 717 bank_size = bank_size/2; 718 base = 16384/2; 719 row_size = 2; 720 } else { 721 base = 16384; 722 } 723 base += ((bank-2)*bank_size); 724 } 725 break; 726 case EXACT_MATCH_2m: 727 case EXACT_MATCH_2_PIPE0m: 728 /* 2 entries per bucket 729 * bank 0 - 5 -> shared banks - 8k entries each 730 */ 731 row_size = 2; 732 bucket_size = 2; 733 offset = 0; 734 bank_size = 8192; 735 base = bank * bank_size; 736 break; 737 case EXACT_MATCH_4m: 738 case EXACT_MATCH_4_PIPE0m: 739 /* 1 entries per bucket 740 * bank 0 - 5 -> shared banks - 4k entries each 741 */ 742 row_size = 1; 743 bucket_size = 1; 744 offset = 0; 745 bank_size = 4096; 746 base = bank * bank_size; 747 break; 748 case EGR_VLAN_XLATE_1_DOUBLEm: 749 case EGR_VLAN_XLATE_2_DOUBLEm: 750 case EGR_VLAN_XLATE_1_SINGLEm: 751 case EGR_VLAN_XLATE_2_SINGLEm: 752 /* 2 entries per bucket 753 * bank 0 - 3 -> shared banks - 4k entries each 754 */ 755 row_size = ((mem == EGR_VLAN_XLATE_1_DOUBLEm) || 756 (mem == EGR_VLAN_XLATE_2_DOUBLEm)) ? 2 : 4; 757 offset = 0; 758 bucket_size = 4; 759 bank_size = 4096; 760 base = bank * bank_size; 761 if ((mem == EGR_VLAN_XLATE_1_DOUBLEm) || 762 (mem == EGR_VLAN_XLATE_2_DOUBLEm)) { 763 base /= 2; 764 } 765 break; 766 case MPLS_ENTRY_SINGLEm: 767 case MPLS_ENTRYm: 768 case VLAN_XLATE_1_SINGLEm: 769 case VLAN_XLATE_1_DOUBLEm: 770 case VLAN_XLATE_2_SINGLEm: 771 case VLAN_XLATE_2_DOUBLEm: 772 773 row_size = ((mem == VLAN_XLATE_1_DOUBLEm) || 774 (mem == VLAN_XLATE_2_DOUBLEm) || 775 (mem == MPLS_ENTRYm)) ? 2 : 4; 776 777 bucket_size = 4; 778 offset = 0; 779 bank_size = 4096; 780 base = bank * bank_size; 781 782 if ((mem == MPLS_ENTRYm) || 783 (mem == VLAN_XLATE_1_DOUBLEm) || 784 (mem == VLAN_XLATE_2_DOUBLEm)) { 785 base /= 2; 786 } 787 788 break; 789 790 case ING_VP_VLAN_MEMBERSHIPm: 791 case EGR_VP_VLAN_MEMBERSHIPm: 792 /* 793 * First half of entries in each row are for bank 0 794 * Second half of entries are for bank 1 795 */ 796 bank_size = soc_mem_index_count(unit, mem) / 2; 797 row_size = 4; 798 bucket_size = 4; 799 base = 0; 800 offset = bank * bucket_size; 801 break; 802 default: 803 return SOC_E_INTERNAL; 804 } 805 806 if (entries_per_bank != NULL) { 807 *entries_per_bank = bank_size; 808 } 809 if (entries_per_row != NULL) { 810 *entries_per_row = row_size; 811 } 812 if (entries_per_bucket != NULL) { 813 *entries_per_bucket = bucket_size; 814 } 815 if (bank_base != NULL) { 816 *bank_base = base; 817 } 818 if (bucket_offset != NULL) { 819 *bucket_offset = offset; 820 } 821 return SOC_E_NONE; 822 } 823 824 STATIC int 825 _soc_hx5_hash_entry_to_key(int unit, int bank, void *entry, uint8 *key, 826 soc_mem_t mem, soc_field_t *field_list, soc_mem_t mem_view) 827 { 828 soc_field_t field; 829 int index, key_index, val_index, fval_index; 830 int right_shift_count, left_shift_count; 831 uint32 val[SOC_MAX_MEM_WORDS], fval[SOC_MAX_MEM_WORDS]; 832 int bits, val_bits, fval_bits, nbits; 833 int8 field_length[16]; 834 835 #ifdef SOC_ROBUST_HASH 836 soc_robust_hash_config_t *rbh_cfg = NULL; 837 #endif /* SOC_ROBUST_HASH */ 838 839 val_bits = 0; 840 for (index = 0; field_list[index] != INVALIDf; index++) { 841 field = field_list[index]; 842 field_length[index] = soc_mem_field_length(unit, mem, field); 843 val_bits += field_length[index]; 844 } 845 846 switch (mem) { 847 case L2Xm: 848 val_bits = SOC_TD3_L2_MAX_KEY_WIDTH; 849 break; 850 case L3_ENTRY_ONLY_SINGLEm: 851 case L3_ENTRY_SINGLEm: 852 case L3_ENTRY_DOUBLEm: 853 case L3_ENTRY_QUADm: 854 val_bits = SOC_TD3_L3_MAX_KEY_WIDTH; 855 break; 856 case EXACT_MATCH_2m: 857 val_bits = SOC_TD3_EXACT_MATCH_MAX_KEY_WIDTH; 858 break; 859 case MPLS_ENTRY_SINGLEm: 860 case MPLS_ENTRYm: 861 val_bits = SOC_TD3_MPLS_MAX_KEY_WIDTH; 862 break; 863 case VLAN_XLATE_1_SINGLEm: 864 case VLAN_XLATE_1_DOUBLEm: 865 case VLAN_XLATE_2_SINGLEm: 866 case VLAN_XLATE_2_DOUBLEm: 867 val_bits = SOC_TD3_VLAN_XLATE_MAX_KEY_WIDTH; 868 break; 869 case EGR_VLAN_XLATE_1_SINGLEm: 870 case EGR_VLAN_XLATE_1_DOUBLEm: 871 case EGR_VLAN_XLATE_2_SINGLEm: 872 case EGR_VLAN_XLATE_2_DOUBLEm: 873 val_bits = SOC_TD3_EGR_VLAN_XLATE_MAX_KEY_WIDTH; 874 break; 875 case ING_VP_VLAN_MEMBERSHIPm: 876 val_bits = SOC_TD3_ING_VP_VLAN_MEMBERSHIP_MAX_KEY_WIDTH; 877 break; 878 case EGR_VP_VLAN_MEMBERSHIPm: 879 val_bits = SOC_TD3_EGR_VP_VLAN_MEMBERSHIP_MAX_KEY_WIDTH; 880 break; 881 default: 882 break; 883 } 884 885 nbits = val_bits; 886 887 #ifdef SOC_ROBUST_HASH 888 if (soc_feature(unit, soc_feature_robust_hash)) { 889 switch (mem) { 890 case L2Xm: 891 rbh_cfg = &(ROBUSTHASH(unit)->l2); 892 break; 893 case L3_ENTRY_ONLY_SINGLEm: 894 case L3_ENTRY_SINGLEm: 895 case L3_ENTRY_DOUBLEm: 896 case L3_ENTRY_QUADm: 897 rbh_cfg = &(ROBUSTHASH(unit)->l3); 898 break; 899 case EXACT_MATCH_2m: 900 rbh_cfg = &(ROBUSTHASH(unit)->exact_match); 901 break; 902 case VLAN_XLATE_1_SINGLEm: 903 case VLAN_XLATE_1_DOUBLEm: 904 rbh_cfg = &(ROBUSTHASH(unit)->ing_xlate_1); 905 break; 906 case VLAN_XLATE_2_SINGLEm: 907 case VLAN_XLATE_2_DOUBLEm: 908 rbh_cfg = &(ROBUSTHASH(unit)->ing_xlate_2); 909 break; 910 case MPLS_ENTRY_SINGLEm: 911 case MPLS_ENTRYm: 912 rbh_cfg = &(ROBUSTHASH(unit)->mpls_entry); 913 break; 914 case EGR_VLAN_XLATE_1_SINGLEm: 915 case EGR_VLAN_XLATE_1_DOUBLEm: 916 rbh_cfg = &(ROBUSTHASH(unit)->egr_xlate_1); 917 break; 918 case EGR_VLAN_XLATE_2_SINGLEm: 919 case EGR_VLAN_XLATE_2_DOUBLEm: 920 rbh_cfg = &(ROBUSTHASH(unit)->egr_xlate_2); 921 break; 922 case ING_VP_VLAN_MEMBERSHIPm: 923 rbh_cfg = &(ROBUSTHASH(unit)->ing_vp_vlan_member); 924 break; 925 case EGR_VP_VLAN_MEMBERSHIPm: 926 rbh_cfg = &(ROBUSTHASH(unit)->egr_vp_vlan_member); 927 break; 928 default: 929 break; 930 } 931 } 932 933 #endif /* SOC_ROBUST_HASH */ 934 bits = val_bits; 935 val_bits = 0; 936 937 sal_memset(val, 0, sizeof(val)); 938 for (index = 0; field_list[index] != INVALIDf; index++) { 939 field = field_list[index]; 940 soc_mem_field_get(unit, mem, entry, field, fval); 941 fval_bits = field_length[index]; 942 943 val_index = val_bits >> 5; 944 fval_index = 0; 945 left_shift_count = val_bits & 0x1f; 946 right_shift_count = 32 - left_shift_count; 947 val_bits += fval_bits; 948 949 if (left_shift_count) { 950 for (; fval_bits > 0; fval_bits -= 32) { 951 val[val_index++] |= fval[fval_index] << left_shift_count; 952 val[val_index] |= fval[fval_index++] >> right_shift_count; 953 } 954 } else { 955 for (; fval_bits > 0; fval_bits -= 32) { 956 val[val_index++] = fval[fval_index++]; 957 } 958 } 959 } 960 961 key_index = 0; 962 for (val_index = 0; val_bits > 0; val_index++) { 963 for (right_shift_count = 0; right_shift_count < 32; 964 right_shift_count += 8) { 965 if (val_bits <= 0) { 966 break; 967 } 968 key[key_index++] = (val[val_index] >> right_shift_count) & 0xff; 969 val_bits -= 8; 970 } 971 } 972 973 if ((bits + 7) / 8 > key_index) { 974 sal_memset(&key[key_index], 0, (bits + 7) / 8 - key_index); 975 } 976 977 bits = (((nbits - 1) / 32) + 1) * 32; 978 979 #ifdef SOC_ROBUST_HASH 980 if (soc_feature(unit, soc_feature_robust_hash)) { 981 if (rbh_cfg) { 982 if (rbh_cfg->enable) { 983 (void) soc_robust_hash_get(unit, rbh_cfg, bank, key, nbits); 984 } 985 986 bits += ROBUST_HASH_KEY_SPACE_WIDTH; 987 } 988 } 989 990 #endif /* SOC_ROBUST_HASH */ 991 992 return bits; 993 } 994 995 int 996 soc_hx5_hash_offset_get(int unit, soc_mem_t mem, int bank, int *hash_offset, 997 int *use_lsb) 998 { 999 uint32 hash_control_entry[4]; 1000 int is_shared = 1; 1001 soc_mem_t shared_mem = INVALIDm; 1002 soc_field_t field; 1003 static const soc_field_t uft_fields[] = { 1004 HASH_OFFSET_DEDICATED_BANK_0f, HASH_OFFSET_DEDICATED_BANK_1f, 1005 B0_HASH_OFFSETf, B1_HASH_OFFSETf, B2_HASH_OFFSETf, B3_HASH_OFFSETf, 1006 B4_HASH_OFFSETf, B5_HASH_OFFSETf 1007 1008 }; 1009 static const soc_field_t uat_fields[] = { 1010 B0_HASH_OFFSETf, B1_HASH_OFFSETf, B2_HASH_OFFSETf, B3_HASH_OFFSETf, 1011 B4_HASH_OFFSETf, B5_HASH_OFFSETf, B6_HASH_OFFSETf, B7_HASH_OFFSETf, 1012 }; 1013 1014 sal_memset(hash_control_entry, 0, sizeof(hash_control_entry)); 1015 1016 switch(mem) { 1017 case L2Xm: 1018 /* Sanity Check */ 1019 if (bank < 0 || bank > 7) { 1020 return SOC_E_PARAM; 1021 } 1022 mem = L2_ENTRY_HASH_CONTROLm; 1023 shared_mem = UFT_SHARED_BANKS_CONTROLm; 1024 is_shared = bank > 1; 1025 field = uft_fields[bank]; 1026 break; 1027 case L3_ENTRY_ONLY_SINGLEm: 1028 #ifdef BCM_HELIX5_SUPPORT 1029 case L3_ENTRY_SINGLEm: 1030 case L3_ENTRY_DOUBLEm: 1031 case L3_ENTRY_QUADm: 1032 #endif /* BCM_HELIX5_SUPPORT */ 1033 if (bank < 2 || bank > 9) { 1034 return SOC_E_PARAM; 1035 } 1036 /* Dedicated banks */ 1037 if (bank >= 8 && bank <= 9) { 1038 bank = bank - 8; 1039 is_shared = 0; 1040 } 1041 mem = L3_ENTRY_HASH_CONTROLm; 1042 shared_mem = UFT_SHARED_BANKS_CONTROLm; 1043 field = uft_fields[bank]; 1044 break; 1045 case EXACT_MATCH_2m: 1046 case EXACT_MATCH_4m: 1047 if (bank < 2 || bank > 7) { 1048 return SOC_E_PARAM; 1049 } 1050 mem = EXACT_MATCH_HASH_CONTROLm; 1051 shared_mem = UFT_SHARED_BANKS_CONTROLm; 1052 field = uft_fields[bank]; 1053 break; 1054 case EGR_VLAN_XLATE_1_SINGLEm: 1055 case EGR_VLAN_XLATE_1_DOUBLEm: 1056 if (bank < 0 || bank > 3) { 1057 return SOC_E_PARAM; 1058 } 1059 mem = EGR_VLAN_XLATE_1_HASH_CONTROLm; 1060 shared_mem = EP_UAT_SHARED_BANKS_CONTROLm; 1061 field = uat_fields[bank]; 1062 break; 1063 case EGR_VLAN_XLATE_2_SINGLEm: 1064 case EGR_VLAN_XLATE_2_DOUBLEm: 1065 if (bank < 0 || bank > 3) { 1066 return SOC_E_PARAM; 1067 } 1068 mem = EGR_VLAN_XLATE_2_HASH_CONTROLm; 1069 shared_mem = EP_UAT_SHARED_BANKS_CONTROLm; 1070 field = uat_fields[bank]; 1071 break; 1072 case MPLS_ENTRY_SINGLEm: 1073 case MPLS_ENTRYm: 1074 if (bank < 0 || bank > 7) { 1075 return SOC_E_PARAM; 1076 } 1077 mem = MPLS_ENTRY_HASH_CONTROLm; 1078 shared_mem = IP_UAT_SHARED_BANKS_CONTROLm; 1079 field = uat_fields[bank]; 1080 break; 1081 case VLAN_XLATE_1_SINGLEm: 1082 case VLAN_XLATE_1_DOUBLEm: 1083 if (bank < 0 || bank > 7) { 1084 return SOC_E_PARAM; 1085 } 1086 mem = VLAN_XLATE_1_HASH_CONTROLm; 1087 shared_mem = IP_UAT_SHARED_BANKS_CONTROLm; 1088 field = uat_fields[bank]; 1089 break; 1090 case VLAN_XLATE_2_SINGLEm: 1091 case VLAN_XLATE_2_DOUBLEm: 1092 if (bank < 0 || bank > 7) { 1093 return SOC_E_PARAM; 1094 } 1095 mem = VLAN_XLATE_2_HASH_CONTROLm; 1096 shared_mem = IP_UAT_SHARED_BANKS_CONTROLm; 1097 field = uat_fields[bank]; 1098 break; 1099 case ING_VP_VLAN_MEMBERSHIPm: 1100 if (bank < 0 || bank > 2) { 1101 return SOC_E_PARAM; 1102 } 1103 mem = ING_VP_VLAN_MEMBERSHIP_HASH_CONTROLm; 1104 field = uft_fields[bank]; 1105 is_shared = 0; 1106 break; 1107 case EGR_VP_VLAN_MEMBERSHIPm: 1108 if (bank < 0 || bank > 2) { 1109 return SOC_E_PARAM; 1110 } 1111 mem = EGR_VP_VLAN_MEMBERSHIP_HASH_CONTROLm; 1112 field = uft_fields[bank]; 1113 is_shared = 0; 1114 break; 1115 default: 1116 return SOC_E_INTERNAL; 1117 } 1118 1119 SOC_IF_ERROR_RETURN(soc_mem_read(unit, mem, MEM_BLOCK_ALL, 0, 1120 hash_control_entry)); 1121 *use_lsb = soc_mem_field32_get(unit, mem, hash_control_entry, 1122 HASH_TABLE_TEST_MODEf); 1123 1124 /* Shared Banks */ 1125 if (is_shared > 0) { 1126 sal_memset(hash_control_entry, 0, sizeof(hash_control_entry)); 1127 SOC_IF_ERROR_RETURN(soc_mem_read(unit, shared_mem, MEM_BLOCK_ALL, 0, 1128 hash_control_entry)); 1129 *hash_offset = soc_mem_field32_get(unit, shared_mem, 1130 hash_control_entry, field); 1131 } else { 1132 *hash_offset = soc_mem_field32_get(unit, mem, hash_control_entry, field); 1133 } 1134 1135 return SOC_E_NONE; 1136 1137 } 1138 1139 int 1140 soc_hx5_hash_offset_set(int unit, soc_mem_t mem, int bank, int hash_offset, 1141 int use_lsb) 1142 { 1143 uint32 hash_control_entry[4]; 1144 int is_shared = 1; 1145 soc_mem_t shared_mem = INVALIDm; 1146 soc_field_t field; 1147 static const soc_field_t uft_fields[] = { 1148 HASH_OFFSET_DEDICATED_BANK_0f, HASH_OFFSET_DEDICATED_BANK_1f, 1149 B0_HASH_OFFSETf, B1_HASH_OFFSETf, B2_HASH_OFFSETf, B3_HASH_OFFSETf, 1150 B4_HASH_OFFSETf, B5_HASH_OFFSETf 1151 1152 }; 1153 static const soc_field_t uat_fields[] = { 1154 B0_HASH_OFFSETf, B1_HASH_OFFSETf, B2_HASH_OFFSETf, B3_HASH_OFFSETf 1155 }; 1156 1157 sal_memset(hash_control_entry, 0, sizeof(hash_control_entry)); 1158 1159 switch(mem) { 1160 case L2Xm: 1161 /* Sanity Check */ 1162 if (bank < 0 || bank > 7) { 1163 return SOC_E_PARAM; 1164 } 1165 mem = L2_ENTRY_HASH_CONTROLm; 1166 shared_mem = UFT_SHARED_BANKS_CONTROLm; 1167 is_shared = bank > 1; 1168 field = uft_fields[bank]; 1169 break; 1170 case L3_ENTRY_ONLY_SINGLEm: 1171 if (bank < 2 || bank > 9) { 1172 return SOC_E_PARAM; 1173 } 1174 /* Dedicated banks */ 1175 if (bank >= 8 && bank <= 9) { 1176 is_shared = 0; 1177 } 1178 mem = L3_ENTRY_HASH_CONTROLm; 1179 shared_mem = UFT_SHARED_BANKS_CONTROLm; 1180 field = uft_fields[(bank > 7)? (bank - 8) : bank]; 1181 break; 1182 case EXACT_MATCH_2m: 1183 case EXACT_MATCH_4m: 1184 if (bank < 2 || bank > 7) { 1185 return SOC_E_PARAM; 1186 } 1187 mem = EXACT_MATCH_HASH_CONTROLm; 1188 shared_mem = UFT_SHARED_BANKS_CONTROLm; 1189 field = uft_fields[bank]; 1190 break; 1191 case EGR_VLAN_XLATE_1_SINGLEm: 1192 if (bank < 0 || bank > 3) { 1193 return SOC_E_PARAM; 1194 } 1195 mem = EGR_VLAN_XLATE_1_HASH_CONTROLm; 1196 shared_mem = EP_UAT_SHARED_BANKS_CONTROLm; 1197 field = uat_fields[bank]; 1198 break; 1199 case EGR_VLAN_XLATE_2_SINGLEm: 1200 if (bank < 0 || bank > 3) { 1201 return SOC_E_PARAM; 1202 } 1203 mem = EGR_VLAN_XLATE_2_HASH_CONTROLm; 1204 shared_mem = EP_UAT_SHARED_BANKS_CONTROLm; 1205 field = uat_fields[bank]; 1206 break; 1207 case MPLS_ENTRY_SINGLEm: 1208 case MPLS_ENTRYm: 1209 if (bank < 0 || bank > 3) { 1210 return SOC_E_PARAM; 1211 } 1212 mem = MPLS_ENTRY_HASH_CONTROLm; 1213 shared_mem = IP_UAT_SHARED_BANKS_CONTROLm; 1214 field = uat_fields[bank]; 1215 break; 1216 case VLAN_XLATE_1_SINGLEm: 1217 if (bank < 0 || bank > 3) { 1218 return SOC_E_PARAM; 1219 } 1220 mem = VLAN_XLATE_1_HASH_CONTROLm; 1221 shared_mem = IP_UAT_SHARED_BANKS_CONTROLm; 1222 field = uat_fields[bank]; 1223 break; 1224 case VLAN_XLATE_2_SINGLEm: 1225 if (bank < 0 || bank > 3) { 1226 return SOC_E_PARAM; 1227 } 1228 mem = VLAN_XLATE_2_HASH_CONTROLm; 1229 shared_mem = IP_UAT_SHARED_BANKS_CONTROLm; 1230 field = uat_fields[bank]; 1231 break; 1232 case ING_VP_VLAN_MEMBERSHIPm: 1233 if (bank < 0 || bank > 2) { 1234 return SOC_E_PARAM; 1235 } 1236 mem = ING_VP_VLAN_MEMBERSHIP_HASH_CONTROLm; 1237 field = uft_fields[bank]; 1238 is_shared = 0; 1239 break; 1240 case EGR_VP_VLAN_MEMBERSHIPm: 1241 if (bank < 0 || bank > 2) { 1242 return SOC_E_PARAM; 1243 } 1244 mem = EGR_VP_VLAN_MEMBERSHIP_HASH_CONTROLm; 1245 field = uft_fields[bank]; 1246 is_shared = 0; 1247 break; 1248 default: 1249 return SOC_E_INTERNAL; 1250 } 1251 1252 SOC_IF_ERROR_RETURN(soc_mem_read(unit, mem, MEM_BLOCK_ALL, 0, 1253 hash_control_entry)); 1254 soc_mem_field32_set(unit, mem, hash_control_entry, HASH_TABLE_TEST_MODEf, 1255 use_lsb); 1256 if (is_shared == 0) { 1257 soc_mem_field32_set(unit, mem, hash_control_entry, field, hash_offset); 1258 } 1259 SOC_IF_ERROR_RETURN(soc_mem_write(unit, mem, MEM_BLOCK_ALL, 0, 1260 hash_control_entry)); 1261 1262 if (is_shared > 0) { 1263 sal_memset(hash_control_entry, 0, sizeof(hash_control_entry)); 1264 SOC_IF_ERROR_RETURN(soc_mem_read(unit, shared_mem, MEM_BLOCK_ALL, 0, 1265 hash_control_entry)); 1266 soc_mem_field32_set(unit, shared_mem, hash_control_entry, field, 1267 hash_offset); 1268 SOC_IF_ERROR_RETURN(soc_mem_write(unit, shared_mem, MEM_BLOCK_ALL, 0, 1269 hash_control_entry)); 1270 } 1271 return SOC_E_NONE; 1272 } 1273 1274 STATIC int 1275 _soc_hx5_shared_hash(int unit, int hash_offset, uint32 key_nbits, uint8 *keyA, 1276 uint8 *keyB, uint32 result_mask, uint16 lsb, int use_lsb) 1277 { 1278 uint32 crc_hi, crc_lo; 1279 uint64 hash_vector, mask; 1280 1281 if (use_lsb) { 1282 /* Debug Mode 1283 * Hash Vector [63:48] -> Zero 1284 * Hash Vector [47:32] -> Hash LSB 1285 */ 1286 crc_hi = lsb; 1287 } else { 1288 crc_hi = soc_crc32b(keyB, key_nbits); 1289 } 1290 1291 crc_lo = soc_crc32b(keyA, key_nbits); 1292 1293 COMPILER_64_SET(hash_vector, crc_hi, crc_lo); 1294 COMPILER_64_SET(mask, 0, result_mask); 1295 COMPILER_64_SHR(hash_vector, hash_offset); 1296 COMPILER_64_AND(hash_vector, mask); 1297 return (int)COMPILER_64_LO(hash_vector); 1298 } 1299 1300 int 1301 soc_hx5_hash_index_get(int unit, int mem, int bank, int bucket) 1302 { 1303 int rv; 1304 int index; 1305 int entries_per_row, bank_base, bucket_offset, entries_per_bucket; 1306 1307 switch(mem) { 1308 case L2Xm: 1309 rv = soc_hx5_hash_bank_info_get(unit, mem, bank, NULL, &entries_per_row, 1310 NULL, &bank_base, &bucket_offset); 1311 if (SOC_SUCCESS(rv)) { 1312 return bank_base + bucket * entries_per_row + bucket_offset; 1313 } 1314 break; 1315 case L3_ENTRY_ONLY_SINGLEm: 1316 case L3_ENTRY_SINGLEm: 1317 case L3_ENTRY_DOUBLEm: 1318 case L3_ENTRY_QUADm: 1319 rv = soc_hx5_hash_bank_info_get(unit, mem, bank, NULL, 1320 &entries_per_row, NULL, &bank_base, 1321 &bucket_offset); 1322 if (SOC_SUCCESS(rv)) { 1323 index = bank_base + bucket * entries_per_row + bucket_offset; 1324 return index; 1325 } 1326 break; 1327 case EXACT_MATCH_2m: 1328 case EXACT_MATCH_2_PIPE0m: 1329 case EXACT_MATCH_4m: 1330 case EXACT_MATCH_4_PIPE0m: 1331 case VLAN_XLATE_1_SINGLEm: 1332 case VLAN_XLATE_1_DOUBLEm: 1333 case EGR_VLAN_XLATE_1_SINGLEm: 1334 case EGR_VLAN_XLATE_1_DOUBLEm: 1335 case EGR_VLAN_XLATE_2_SINGLEm: 1336 case EGR_VLAN_XLATE_2_DOUBLEm: 1337 case MPLS_ENTRY_SINGLEm: 1338 case MPLS_ENTRYm: 1339 rv = soc_hx5_hash_bank_info_get(unit, mem, bank, NULL, 1340 &entries_per_row, &entries_per_bucket, 1341 &bank_base, &bucket_offset); 1342 if (SOC_SUCCESS(rv)) { 1343 index = bank_base + bucket * entries_per_bucket + bucket_offset; 1344 return index; 1345 } 1346 break; 1347 case ING_VP_VLAN_MEMBERSHIPm: 1348 case EGR_VP_VLAN_MEMBERSHIPm: 1349 rv = soc_hx5_hash_bank_info_get(unit, mem, bank, NULL, 1350 &entries_per_row, NULL, &bank_base, 1351 &bucket_offset); 1352 if (SOC_SUCCESS(rv)) { 1353 index = bank_base + bucket * entries_per_row + bucket_offset; 1354 return index; 1355 } 1356 break; 1357 default: 1358 break; 1359 } 1360 1361 return 0; 1362 1363 } 1364 1365 uint32 1366 soc_hx5_l2x_hash(int unit, int bank, int hash_offset, int use_lsb, 1367 int key_nbits, void *base_entry, uint8 *key1, uint8 *key2) 1368 { 1369 uint32 lsb_val; 1370 uint32 hash_mask; 1371 uint32 hash_bits; 1372 1373 if (bank < 2) { 1374 hash_mask = 0x07FF; /* 2k buckets per dedicated L2 bank */ 1375 hash_bits = 11; 1376 } else { 1377 hash_mask = 0x0FFF; /* 4k buckets per shared bank */ 1378 hash_bits = 12; 1379 } 1380 1381 if (use_lsb && (hash_offset + hash_bits > 32)) { 1382 switch (soc_mem_field32_get(unit, L2Xm, base_entry, KEY_TYPEf)) { 1383 case TD3_L2_HASH_KEY_TYPE_BRIDGE: 1384 case TD3_L2_HASH_KEY_TYPE_VFI: 1385 case TD3_L2_HASH_KEY_TYPE_TRILL_NONUC_ACCESS: 1386 lsb_val = soc_mem_field32_get(unit, L2Xm, base_entry, 1387 L2__HASH_LSBf); 1388 break; 1389 case TD3_L2_HASH_KEY_TYPE_SINGLE_CROSS_CONNECT: 1390 case TD3_L2_HASH_KEY_TYPE_DOUBLE_CROSS_CONNECT: 1391 lsb_val = soc_mem_field32_get(unit, L2Xm, base_entry, 1392 VLAN__HASH_LSBf); 1393 break; 1394 case TD3_L2_HASH_KEY_TYPE_VIF: 1395 lsb_val = soc_mem_field32_get(unit, L2Xm, base_entry, 1396 VIF__HASH_LSBf); 1397 break; 1398 case TD3_L2_HASH_KEY_TYPE_TRILL_NONUC_NETWORK_LONG: 1399 lsb_val = soc_mem_field32_get(unit, L2Xm, base_entry, 1400 TRILL_NONUC_NETWORK_LONG__HASH_LSBf); 1401 break; 1402 case TD3_L2_HASH_KEY_TYPE_TRILL_NONUC_NETWORK_SHORT: 1403 lsb_val = soc_mem_field32_get 1404 (unit, L2Xm, base_entry, TRILL_NONUC_NETWORK_SHORT__HASH_LSBf); 1405 break; 1406 case TD3_L2_HASH_KEY_TYPE_BFD: 1407 lsb_val = soc_mem_field32_get(unit, L2Xm, base_entry, 1408 BFD__HASH_LSBf); 1409 break; 1410 case TD3_L2_HASH_KEY_TYPE_PE_VID: 1411 lsb_val = soc_mem_field32_get(unit, L2Xm, base_entry, 1412 PE_VID__HASH_LSBf); 1413 break; 1414 case TD3_L2_HASH_KEY_TYPE_FCOE_ZONE: 1415 lsb_val = soc_mem_field32_get(unit, L2Xm, base_entry, 1416 FCOE_ZONE__HASH_LSBf); 1417 break; 1418 default: 1419 lsb_val = 0; 1420 break; 1421 } 1422 } else { 1423 lsb_val = 0; 1424 } 1425 1426 return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2, 1427 hash_mask, lsb_val, use_lsb); 1428 } 1429 1430 int 1431 soc_hx5_l2x_base_entry_to_key(int unit, int bank, uint32 *entry, uint8 *key) 1432 { 1433 soc_field_t field_list[2]; 1434 soc_mem_t flex_mem_view = 0; 1435 1436 field_list[1] = INVALIDf; 1437 1438 switch (soc_mem_field32_get(unit, L2Xm, entry, KEY_TYPEf)) { 1439 case TD3_L2_HASH_KEY_TYPE_BRIDGE: 1440 case TD3_L2_HASH_KEY_TYPE_VFI: 1441 case TD3_L2_HASH_KEY_TYPE_TRILL_NONUC_ACCESS: 1442 field_list[0] = L2__KEYf; 1443 break; 1444 case TD3_L2_HASH_KEY_TYPE_SINGLE_CROSS_CONNECT: 1445 case TD3_L2_HASH_KEY_TYPE_DOUBLE_CROSS_CONNECT: 1446 field_list[0] = VLAN__KEYf; 1447 break; 1448 case TD3_L2_HASH_KEY_TYPE_VIF: 1449 field_list[0] = VIF__KEYf; 1450 break; 1451 case TD3_L2_HASH_KEY_TYPE_TRILL_NONUC_NETWORK_LONG: 1452 field_list[0] = TRILL_NONUC_NETWORK_LONG__KEYf; 1453 break; 1454 case TD3_L2_HASH_KEY_TYPE_TRILL_NONUC_NETWORK_SHORT: 1455 field_list[0] = TRILL_NONUC_NETWORK_SHORT__KEYf; 1456 break; 1457 case TD3_L2_HASH_KEY_TYPE_BFD: 1458 field_list[0] = BFD__KEYf; 1459 break; 1460 case TD3_L2_HASH_KEY_TYPE_PE_VID: 1461 field_list[0] = PE_VID__KEYf; 1462 break; 1463 case TD3_L2_HASH_KEY_TYPE_FCOE_ZONE: 1464 field_list[0] = FCOE_ZONE__KEYf; 1465 break; 1466 default: 1467 return 0; 1468 } 1469 1470 return _soc_hx5_hash_entry_to_key(unit, bank, entry, key, 1471 L2Xm, field_list, flex_mem_view); 1472 } 1473 1474 uint32 1475 soc_hx5_l2x_entry_hash(int unit, int bank, int hash_offset, int use_lsb, 1476 uint32 *entry) { 1477 int key_nbits; 1478 uint8 key1[SOC_MAX_MEM_WORDS * 4] = {0}; 1479 uint8 key2[SOC_MAX_MEM_WORDS * 4] = {0}; 1480 1481 /* Robust Hashed Key using Remap and Action Tables A */ 1482 key_nbits = soc_hx5_l2x_base_entry_to_key(unit, 0, entry, key1); 1483 /* Robust Hashed Key using Remap and Action Tables B */ 1484 key_nbits = soc_hx5_l2x_base_entry_to_key(unit, 1, entry, key2); 1485 1486 return soc_hx5_l2x_hash(unit, bank, hash_offset, use_lsb, key_nbits, entry, 1487 key1, key2); 1488 } 1489 1490 uint32 1491 soc_hx5_l2x_bank_entry_hash(int unit, int bank, uint32 *entry) { 1492 int rv, hash_offset, use_lsb; 1493 1494 rv = soc_hx5_hash_offset_get(unit, L2Xm, bank, &hash_offset, &use_lsb); 1495 if (SOC_FAILURE(rv)) { 1496 return 0; 1497 } 1498 return soc_hx5_l2x_entry_hash(unit, bank, hash_offset, use_lsb, entry); 1499 } 1500 1501 uint32 1502 soc_hx5_l3x_hash(int unit, int bank, int hash_offset, int use_lsb, 1503 int key_nbits, void *base_entry, uint8 *key1, uint8 *key2) 1504 { 1505 uint32 lsb_val; 1506 uint32 hash_mask; 1507 uint32 hash_bits; 1508 1509 if (bank > 7) { 1510 hash_mask = 0x7FF; /* 2k buckets per dedicated banks */ 1511 hash_bits = 11; 1512 } else { 1513 hash_mask = 0x0FFF; /* 4k buckets per shared bank */ 1514 hash_bits = 12; 1515 } 1516 1517 if (use_lsb && (hash_offset + hash_bits > 32)) { 1518 switch (soc_mem_field32_get(unit, L3_ENTRY_ONLY_SINGLEm, base_entry, 1519 KEY_TYPEf)) { 1520 case TD3_L3_HASH_KEY_TYPE_V4UC: 1521 case TD3_L3_HASH_KEY_TYPE_V4MC: 1522 case TD3_L3_HASH_KEY_TYPE_V6UC: 1523 case TD3_L3_HASH_KEY_TYPE_V6MC: 1524 lsb_val = soc_mem_field32_get(unit, L3_ENTRY_SINGLEm, 1525 base_entry, IPV4UC__HASH_LSBf); 1526 break; 1527 case TD3_L3_HASH_KEY_TYPE_TRILL: 1528 lsb_val = soc_mem_field32_get(unit, L3_ENTRY_SINGLEm, 1529 base_entry, TRILL__HASH_LSBf); 1530 break; 1531 case TD3_L3_HASH_KEY_TYPE_DST_NAT: 1532 case TD3_L3_HASH_KEY_TYPE_DST_NAPT: 1533 lsb_val = soc_mem_field32_get(unit, L3_ENTRY_DOUBLEm, 1534 base_entry, NAT__HASH_LSBf); 1535 break; 1536 case TD3_L3_HASH_KEY_TYPE_FCOE_DOMAIN: 1537 case TD3_L3_HASH_KEY_TYPE_FCOE_HOST: 1538 case TD3_L3_HASH_KEY_TYPE_FCOE_SOURCE_MAP: 1539 lsb_val = soc_mem_field32_get(unit, L3_ENTRY_SINGLEm, base_entry, 1540 FCOE__HASH_LSBf); 1541 break; 1542 default: 1543 lsb_val = 0; 1544 break; 1545 } 1546 } else { 1547 lsb_val = 0; 1548 } 1549 1550 return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2, 1551 hash_mask, lsb_val, use_lsb); 1552 } 1553 1554 int 1555 soc_hx5_l3x_base_entry_to_key(int unit, int bank, uint32 *entry, uint8 *key) 1556 { 1557 soc_mem_t mem; 1558 soc_field_t field_list[5]; 1559 soc_mem_t flex_mem_view = 0; 1560 1561 switch (soc_mem_field32_get(unit, L3_ENTRY_ONLY_SINGLEm, entry, KEY_TYPEf)) { 1562 case TD3_L3_HASH_KEY_TYPE_V4UC: 1563 mem = L3_ENTRY_SINGLEm; 1564 field_list[0] = IPV4UC__KEYf; 1565 field_list[1] = INVALIDf; 1566 break; 1567 case TD3_L3_HASH_KEY_TYPE_V6UC: 1568 mem = L3_ENTRY_DOUBLEm; 1569 field_list[0] = IPV6UC__KEY_0f; 1570 field_list[1] = IPV6UC__KEY_1f; 1571 field_list[2] = INVALIDf; 1572 break; 1573 case TD3_L3_HASH_KEY_TYPE_V4MC: 1574 case TD3_L3_HASH_KEY_TYPE_L2_IPV4_MULTICAST: 1575 case TD3_L3_HASH_KEY_TYPE_L2VP_IPV4_MULTICAST: 1576 mem = L3_ENTRY_DOUBLEm; 1577 field_list[0] = IPV4MC__KEYf; 1578 field_list[1] = INVALIDf; 1579 break; 1580 case TD3_L3_HASH_KEY_TYPE_V6MC: 1581 case TD3_L3_HASH_KEY_TYPE_L2_IPV6_MULTICAST: 1582 case TD3_L3_HASH_KEY_TYPE_L2VP_IPV6_MULTICAST: 1583 mem = L3_ENTRY_QUADm; 1584 field_list[0] = IPV6MC__KEY_0f; 1585 field_list[1] = IPV6MC__KEY_1f; 1586 field_list[2] = IPV6MC__KEY_2f; 1587 field_list[3] = INVALIDf; 1588 break; 1589 case TD3_L3_HASH_KEY_TYPE_TRILL: 1590 mem = L3_ENTRY_SINGLEm; 1591 field_list[0] = TRILL__KEYf; 1592 field_list[1] = INVALIDf; 1593 break; 1594 case TD3_L3_HASH_KEY_TYPE_FCOE_DOMAIN: 1595 case TD3_L3_HASH_KEY_TYPE_FCOE_HOST: 1596 case TD3_L3_HASH_KEY_TYPE_FCOE_SOURCE_MAP: 1597 mem = L3_ENTRY_SINGLEm; 1598 field_list[0] = FCOE__KEYf; 1599 field_list[1] = INVALIDf; 1600 break; 1601 case TD3_L3_HASH_KEY_TYPE_DST_NAT: 1602 case TD3_L3_HASH_KEY_TYPE_DST_NAPT: 1603 mem = L3_ENTRY_DOUBLEm; 1604 field_list[0] = NAT__KEY_0f; 1605 field_list[1] = INVALIDf; 1606 break; 1607 1608 default: 1609 mem = L3_ENTRY_DOUBLEm; 1610 SOC_IF_ERROR_RETURN(soc_flex_hash_mem_view_get(unit, 1611 mem, entry, &flex_mem_view, field_list)); 1612 break; 1613 } 1614 return _soc_hx5_hash_entry_to_key(unit, bank, entry, key, 1615 mem, field_list, flex_mem_view); 1616 } 1617 1618 uint32 1619 soc_hx5_l3x_entry_hash(int unit, int bank, int hash_offset, int use_lsb, 1620 uint32 *entry) 1621 { 1622 int key_nbits; 1623 uint8 key1[SOC_MAX_MEM_WORDS * 4] = {0}; 1624 uint8 key2[SOC_MAX_MEM_WORDS * 4] = {0}; 1625 1626 /* Robust Hashed Key using Remap and Action Tables A */ 1627 key_nbits = soc_hx5_l3x_base_entry_to_key(unit, 0, entry, key1); 1628 /* Robust Hashed Key using Remap and Action Tables B */ 1629 key_nbits = soc_hx5_l3x_base_entry_to_key(unit, 1, entry, key2); 1630 1631 return soc_hx5_l3x_hash(unit, bank, hash_offset, use_lsb, key_nbits, 1632 entry, key1, key2); 1633 } 1634 1635 uint32 1636 soc_hx5_l3x_bank_entry_hash(int unit, int bank, uint32 *entry) 1637 { 1638 int rv, hash_offset, use_lsb; 1639 1640 rv = soc_hx5_hash_offset_get(unit, L3_ENTRY_ONLY_SINGLEm, bank, &hash_offset, 1641 &use_lsb); 1642 if (SOC_FAILURE(rv)) { 1643 return 0; 1644 } 1645 1646 return soc_hx5_l3x_entry_hash(unit, bank, hash_offset, use_lsb, entry); 1647 } 1648 1649 uint32 1650 soc_hx5_exact_match_hash(int unit, int bank, int hash_offset, int use_lsb, 1651 int key_nbits, void *base_entry, uint8 *key1, 1652 uint8 *key2) 1653 { 1654 uint32 lsb_val; 1655 uint32 hash_mask; 1656 uint32 hash_bits; 1657 1658 hash_mask = 0x7FF; /* 2k buckets per shared bank */ 1659 hash_bits = 11; 1660 1661 if (use_lsb && (hash_offset + hash_bits > 32)) { 1662 switch (soc_mem_field32_get(unit, EXACT_MATCH_2m, base_entry, 1663 KEY_TYPEf)) { 1664 case TD3_FPEM_HASH_KEY_TYPE_128B: 1665 lsb_val = soc_mem_field32_get(unit, EXACT_MATCH_2m, base_entry, 1666 MODE128__HASH_LSBf); 1667 break; 1668 case TD3_FPEM_HASH_KEY_TYPE_160B: 1669 lsb_val = soc_mem_field32_get(unit, EXACT_MATCH_2m, base_entry, 1670 MODE160__HASH_LSBf); 1671 break; 1672 case TD3_FPEM_HASH_KEY_TYPE_320B: 1673 lsb_val = soc_mem_field32_get(unit, EXACT_MATCH_4m, base_entry, 1674 MODE320__HASH_LSBf); 1675 break; 1676 default: 1677 lsb_val = 0; 1678 break; 1679 } 1680 } else { 1681 lsb_val = 0; 1682 } 1683 1684 return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2, 1685 hash_mask, lsb_val, use_lsb); 1686 } 1687 1688 int 1689 soc_hx5_exact_match_base_entry_to_key(int unit, int bank, uint32 *entry, 1690 uint8 *key) { 1691 soc_mem_t mem; 1692 soc_field_t field_list[5]; 1693 soc_mem_t flex_mem_view = 0; 1694 1695 switch (soc_mem_field32_get(unit, EXACT_MATCH_2m, entry, KEY_TYPEf)) { 1696 case TD3_FPEM_HASH_KEY_TYPE_128B: 1697 mem = EXACT_MATCH_2m; 1698 field_list[0] = MODE128__KEY_0f; 1699 field_list[1] = MODE128__KEY_1f; 1700 field_list[2] = INVALIDf; 1701 break; 1702 case TD3_FPEM_HASH_KEY_TYPE_160B: 1703 mem = EXACT_MATCH_2m; 1704 field_list[0] = MODE160__KEY_0f; 1705 field_list[1] = MODE160__KEY_1f; 1706 field_list[2] = INVALIDf; 1707 break; 1708 case TD3_FPEM_HASH_KEY_TYPE_320B: 1709 mem = EXACT_MATCH_4m; 1710 field_list[0] = MODE320__KEY_0f; 1711 field_list[1] = MODE320__KEY_1f; 1712 field_list[2] = MODE320__KEY_2f; 1713 field_list[3] = MODE320__KEY_3f; 1714 field_list[4] = INVALIDf; 1715 break; 1716 default: 1717 mem = EXACT_MATCH_4m; 1718 SOC_IF_ERROR_RETURN(soc_flex_hash_mem_view_get(unit, 1719 mem, entry, &flex_mem_view, field_list)); 1720 break; 1721 } 1722 return _soc_hx5_hash_entry_to_key(unit, bank, entry, key, 1723 mem, field_list, flex_mem_view); 1724 } 1725 1726 uint32 1727 soc_hx5_exact_match_entry_hash(int unit, int bank, int hash_offset, 1728 int use_lsb, uint32 *entry) 1729 { 1730 int key_nbits; 1731 uint8 key1[SOC_MAX_MEM_WORDS * 4]; 1732 uint8 key2[SOC_MAX_MEM_WORDS * 4]; 1733 1734 /* Robust Hashed Key using Remap and Action Tables A */ 1735 key_nbits = soc_hx5_exact_match_base_entry_to_key(unit, 0, entry, key1); 1736 /* Robust Hashed Key using Remap and Action Tables B */ 1737 key_nbits = soc_hx5_exact_match_base_entry_to_key(unit, 1, entry, key2); 1738 1739 return soc_hx5_exact_match_hash(unit, bank, hash_offset, use_lsb, 1740 key_nbits, entry, key1, key2); 1741 } 1742 1743 uint32 1744 soc_hx5_exact_match_bank_entry_hash(int unit, int bank, uint32 *entry) 1745 { 1746 int rv, hash_offset, use_lsb; 1747 1748 rv = soc_hx5_hash_offset_get(unit, EXACT_MATCH_2m, bank, &hash_offset, 1749 &use_lsb); 1750 if (SOC_FAILURE(rv)) { 1751 return 0; 1752 } 1753 1754 return soc_hx5_exact_match_entry_hash(unit, bank, hash_offset, use_lsb, 1755 entry); 1756 } 1757 1758 uint32 1759 soc_hx5_mpls_hash(int unit, soc_mem_t mem, int bank, int hash_offset, int use_lsb, 1760 int key_nbits, void *base_entry, uint8 *key1, uint8 *key2) 1761 { 1762 uint32 lsb_val; 1763 uint32 hash_mask; 1764 uint32 hash_bits; 1765 1766 hash_mask = 0x7FF; /* 2k buckets per shared bank of size 4k */ 1767 hash_bits = 11; 1768 1769 if (use_lsb && (hash_offset + hash_bits > 32)) { 1770 switch (soc_mem_field32_get(unit, mem, base_entry, 1771 KEY_TYPEf)) { 1772 case TD3_MPLS_HASH_KEY_TYPE_MPLS: 1773 lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry, 1774 MPLS__HASH_LSBf); 1775 break; 1776 case TD3_MPLS_HASH_KEY_TYPE_MIM_NVP: 1777 lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry, 1778 MIM_NVP__HASH_LSBf); 1779 break; 1780 case TD3_MPLS_HASH_KEY_TYPE_MIM_ISID: 1781 case TD3_MPLS_HASH_KEY_TYPE_MIM_ISID_SVP: 1782 lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry, 1783 MIM_ISID__HASH_LSBf); 1784 break; 1785 case TD3_MPLS_HASH_KEY_TYPE_TRILL: 1786 lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry, 1787 TRILL__HASH_LSBf); 1788 break; 1789 case TD3_MPLS_HASH_KEY_TYPE_L2GRE_SIP: 1790 lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry, 1791 L2GRE_SIP__HASH_LSBf); 1792 break; 1793 case TD3_MPLS_HASH_KEY_TYPE_L2GRE_VPNID_SIP: 1794 case TD3_MPLS_HASH_KEY_TYPE_L2GRE_VPNID: 1795 lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry, 1796 L2GRE_VPNID__HASH_LSBf); 1797 break; 1798 case TD3_MPLS_HASH_KEY_TYPE_VXLAN_SIP: 1799 lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry, 1800 VXLAN_SIP__HASH_LSBf); 1801 break; 1802 case TD3_MPLS_HASH_KEY_TYPE_VXLAN_VPNID: 1803 case TD3_MPLS_HASH_KEY_TYPE_VXLAN_VPNID_SIP: 1804 lsb_val = soc_mem_field32_get(unit, MPLS_ENTRYm, base_entry, 1805 VXLAN_VN_ID__HASH_LSBf); 1806 break; 1807 1808 default: 1809 lsb_val = 0; 1810 break; 1811 } 1812 } else { 1813 lsb_val = 0; 1814 } 1815 1816 return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2, 1817 hash_mask, lsb_val, use_lsb); 1818 } 1819 1820 int 1821 soc_hx5_mpls_base_entry_to_key(int unit, soc_mem_t mem, int bank, void *entry, uint8 *key) { 1822 1823 soc_field_t field_list[5]; 1824 soc_mem_t flex_mem_view = 0; 1825 1826 field_list[1] = INVALIDf; 1827 switch (soc_mem_field32_get(unit, mem, entry, KEY_TYPEf)) { 1828 case TD3_MPLS_HASH_KEY_TYPE_MPLS: 1829 field_list[0] = MPLS__KEYf; 1830 break; 1831 case TD3_MPLS_HASH_KEY_TYPE_MIM_NVP: 1832 field_list[0] = MIM_NVP__KEYf; 1833 break; 1834 case TD3_MPLS_HASH_KEY_TYPE_MIM_ISID: 1835 case TD3_MPLS_HASH_KEY_TYPE_MIM_ISID_SVP: 1836 field_list[0] = MIM_ISID__KEYf; 1837 break; 1838 case TD3_MPLS_HASH_KEY_TYPE_TRILL: 1839 field_list[0] = TRILL__KEYf; 1840 break; 1841 case TD3_MPLS_HASH_KEY_TYPE_L2GRE_SIP: 1842 field_list[0] = L2GRE_SIP__KEYf; 1843 break; 1844 case TD3_MPLS_HASH_KEY_TYPE_L2GRE_VPNID_SIP: 1845 case TD3_MPLS_HASH_KEY_TYPE_L2GRE_VPNID: 1846 field_list[0] = L2GRE_VPNID__KEYf; 1847 break; 1848 case TD3_MPLS_HASH_KEY_TYPE_VXLAN_SIP: 1849 if (soc_feature(unit, soc_feature_vxlan_decoupled_mode) && 1850 (mem == MPLS_ENTRY_SINGLEm)) { 1851 field_list[0] = KEY_TYPEf; 1852 field_list[1] = VXLAN_FLEX_IPV4_SIP__SIPf; 1853 field_list[2] = INVALIDf; 1854 } 1855 else { 1856 field_list[0] = VXLAN_SIP__KEYf; 1857 } 1858 break; 1859 case TD3_MPLS_HASH_KEY_TYPE_VXLAN_VPNID: 1860 case TD3_MPLS_HASH_KEY_TYPE_VXLAN_VPNID_SIP: 1861 field_list[0] = VXLAN_VN_ID__KEYf; 1862 break; 1863 default: 1864 SOC_IF_ERROR_RETURN(soc_flex_hash_mem_view_get(unit, 1865 mem, entry, &flex_mem_view, field_list)); 1866 } 1867 return _soc_hx5_hash_entry_to_key(unit, bank, entry, key, 1868 mem, field_list, flex_mem_view); 1869 } 1870 1871 uint32 1872 soc_hx5_mpls_entry_hash(int unit, soc_mem_t mem, int bank, 1873 int hash_offset, int use_lsb, uint32 *entry) 1874 { 1875 int key_nbits; 1876 uint8 key1[SOC_MAX_MEM_WORDS * 4] = {0}; 1877 uint8 key2[SOC_MAX_MEM_WORDS * 4] = {0}; 1878 1879 /* Robust Hashed Key using Remap and Action Tables A */ 1880 key_nbits = soc_hx5_mpls_base_entry_to_key(unit, mem, 0, entry, key1); 1881 /* Robust Hashed Key using Remap and Action Tables B */ 1882 key_nbits = soc_hx5_mpls_base_entry_to_key(unit, mem, 1, entry, key2); 1883 1884 return soc_hx5_mpls_hash(unit, mem, bank, hash_offset, use_lsb, 1885 key_nbits, entry, key1, key2); 1886 } 1887 1888 uint32 1889 soc_hx5_mpls_bank_entry_hash(int unit, soc_mem_t mem, 1890 int bank, uint32 *entry) 1891 { 1892 int rv, hash_offset, use_lsb; 1893 1894 rv = soc_hx5_hash_offset_get(unit, mem, bank, &hash_offset, 1895 &use_lsb); 1896 if (SOC_FAILURE(rv)) { 1897 return 0; 1898 } 1899 1900 return soc_hx5_mpls_entry_hash(unit, mem, bank, hash_offset, use_lsb, entry); 1901 } 1902 1903 uint32 1904 soc_hx5_vlan_xlate_hash(int unit, soc_mem_t mem, int bank, int hash_offset, 1905 int use_lsb, int key_nbits, void *base_entry, 1906 uint8 *key1, uint8 *key2) 1907 { 1908 uint32 lsb_val; 1909 uint32 hash_mask; 1910 uint32 hash_bits; 1911 1912 hash_mask = 0x7FF; /* 2k buckets per shared bank of size 4k */ 1913 hash_bits = 11; 1914 1915 if (use_lsb && (hash_offset + hash_bits > 32)) { 1916 switch (soc_mem_field32_get(unit, mem, base_entry, 1917 KEY_TYPEf)) { 1918 case TD3_VLXLT_HASH_KEY_TYPE_IVID_OVID: 1919 case TD3_VLXLT_HASH_KEY_TYPE_OTAG: 1920 case TD3_VLXLT_HASH_KEY_TYPE_ITAG: 1921 case TD3_VLXLT_HASH_KEY_TYPE_OVID: 1922 case TD3_VLXLT_HASH_KEY_TYPE_IVID: 1923 case TD3_VLXLT_HASH_KEY_TYPE_PRI_CFI: 1924 case TD3_VLXLT_HASH_KEY_TYPE_IVID_OVID_VSAN: 1925 case TD3_VLXLT_HASH_KEY_TYPE_IVID_VSAN: 1926 case TD3_VLXLT_HASH_KEY_TYPE_OVID_VSAN: 1927 lsb_val = soc_mem_field32_get(unit, mem, base_entry, 1928 XLATE__HASH_LSBf); 1929 break; 1930 case TD3_VLXLT_HASH_KEY_TYPE_VLAN_MAC: 1931 lsb_val = soc_mem_field32_get(unit, mem, base_entry, 1932 MAC__HASH_LSBf); 1933 break; 1934 case TD3_VLXLT_HASH_KEY_TYPE_HPAE: 1935 lsb_val = soc_mem_field32_get(unit, mem, base_entry, 1936 MAC_IP_BIND__HASH_LSBf); 1937 break; 1938 case TD3_VLXLT_HASH_KEY_TYPE_VIF: 1939 case TD3_VLXLT_HASH_KEY_TYPE_VIF_VLAN: 1940 case TD3_VLXLT_HASH_KEY_TYPE_VIF_CVLAN: 1941 case TD3_VLXLT_HASH_KEY_TYPE_VIF_OTAG: 1942 case TD3_VLXLT_HASH_KEY_TYPE_VIF_ITAG: 1943 lsb_val = soc_mem_field32_get(unit, mem, base_entry, 1944 VIF__HASH_LSBf); 1945 break; 1946 case TD3_VLXLT_HASH_KEY_TYPE_VLAN_MAC_PORT: 1947 lsb_val = soc_mem_field32_get(unit, mem, base_entry, 1948 MAC_PORT__HASH_LSBf); 1949 break; 1950 case TD3_VLXLT_HASH_KEY_TYPE_L2GRE_DIP: 1951 lsb_val = soc_mem_field32_get(unit, mem, base_entry, 1952 L2GRE_DIP__HASH_LSBf); 1953 break; 1954 case TD3_VLXLT_HASH_KEY_TYPE_VXLAN_DIP: 1955 lsb_val = soc_mem_field32_get(unit, mem, base_entry, 1956 VXLAN_DIP__HASH_LSBf); 1957 break; 1958 default: 1959 lsb_val = 0; 1960 break; 1961 } 1962 } else { 1963 lsb_val = 0; 1964 } 1965 1966 return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2, 1967 hash_mask, lsb_val, use_lsb); 1968 } 1969 1970 int 1971 soc_hx5_vlan_xlate_base_entry_to_key(int unit, soc_mem_t mem, int bank, 1972 void *entry, uint8 *key) 1973 { 1974 soc_field_t field_list[5]; 1975 soc_mem_t flex_mem_view = 0; 1976 1977 field_list[1] = INVALIDf; 1978 switch (soc_mem_field32_get(unit, mem, entry, KEY_TYPEf)) { 1979 case TD3_VLXLT_HASH_KEY_TYPE_IVID_OVID: 1980 case TD3_VLXLT_HASH_KEY_TYPE_OTAG: 1981 case TD3_VLXLT_HASH_KEY_TYPE_ITAG: 1982 case TD3_VLXLT_HASH_KEY_TYPE_OVID: 1983 case TD3_VLXLT_HASH_KEY_TYPE_IVID: 1984 case TD3_VLXLT_HASH_KEY_TYPE_PRI_CFI: 1985 case TD3_VLXLT_HASH_KEY_TYPE_IVID_OVID_VSAN: 1986 case TD3_VLXLT_HASH_KEY_TYPE_OVID_VSAN: 1987 case TD3_VLXLT_HASH_KEY_TYPE_IVID_VSAN: 1988 field_list[0] = XLATE__KEY_0f; 1989 break; 1990 case TD3_VLXLT_HASH_KEY_TYPE_VLAN_MAC: 1991 field_list[0] = MAC__KEY_0f; 1992 break; 1993 case TD3_VLXLT_HASH_KEY_TYPE_HPAE: 1994 field_list[0] = MAC_IP_BIND__KEY_0f; 1995 break; 1996 case TD3_VLXLT_HASH_KEY_TYPE_VIF: 1997 case TD3_VLXLT_HASH_KEY_TYPE_VIF_VLAN: 1998 case TD3_VLXLT_HASH_KEY_TYPE_VIF_CVLAN: 1999 case TD3_VLXLT_HASH_KEY_TYPE_VIF_OTAG: 2000 case TD3_VLXLT_HASH_KEY_TYPE_VIF_ITAG: 2001 field_list[0] = VIF__KEY_0f; 2002 break; 2003 case TD3_VLXLT_HASH_KEY_TYPE_VLAN_MAC_PORT: 2004 field_list[0] = MAC_PORT__KEY_0f; 2005 break; 2006 case TD3_VLXLT_HASH_KEY_TYPE_L2GRE_DIP: 2007 field_list[0] = L2GRE_DIP__KEY_0f; 2008 break; 2009 case TD3_VLXLT_HASH_KEY_TYPE_VXLAN_DIP: 2010 field_list[0] = VXLAN_DIP__KEY_0f; 2011 break; 2012 case TD3_VLXLT_HASH_KEY_TYPE_VXLAN_FLEX_VNID: 2013 field_list[0] = KEY_TYPEf; 2014 field_list[1] = VXLAN_FLEX__VNIDf; 2015 field_list[2] = INVALIDf; 2016 break; 2017 case TD3_VLXLT_HASH_KEY_TYPE_VXLAN_FLEX_SIP_VNID: 2018 field_list[0] = KEY_TYPEf; 2019 field_list[1] = VXLAN_FLEX__VNIDf; 2020 field_list[2] = VXLAN_FLEX__SIPf; 2021 field_list[3] = INVALIDf; 2022 break; 2023 default: 2024 SOC_IF_ERROR_RETURN(soc_flex_hash_mem_view_get(unit, 2025 mem, entry, &flex_mem_view, field_list)); 2026 break; 2027 } 2028 return _soc_hx5_hash_entry_to_key(unit, bank, entry, key, 2029 mem, field_list, flex_mem_view); 2030 } 2031 2032 uint32 2033 soc_hx5_vlan_xlate_entry_hash(int unit, soc_mem_t mem, int bank, int hash_offset, 2034 int use_lsb, uint32 *entry) 2035 { 2036 int key_nbits; 2037 uint8 key1[SOC_MAX_MEM_WORDS * 4] = {0}; 2038 uint8 key2[SOC_MAX_MEM_WORDS * 4] = {0}; 2039 2040 /* Robust Hashed Key using Remap and Action Tables A */ 2041 key_nbits = soc_hx5_vlan_xlate_base_entry_to_key(unit, mem, 0, entry, key1); 2042 /* Robust Hashed Key using Remap and Action Tables B */ 2043 key_nbits = soc_hx5_vlan_xlate_base_entry_to_key(unit, mem, 1, entry, key2); 2044 2045 return soc_hx5_vlan_xlate_hash(unit, mem, bank, hash_offset, use_lsb, 2046 key_nbits, entry, key1, key2); 2047 } 2048 2049 uint32 2050 soc_hx5_vlan_xlate_bank_entry_hash(int unit, soc_mem_t mem, int bank, 2051 uint32 *entry) 2052 { 2053 int rv, hash_offset, use_lsb; 2054 2055 rv = soc_hx5_hash_offset_get(unit, mem, bank, &hash_offset, 2056 &use_lsb); 2057 if (SOC_FAILURE(rv)) { 2058 return 0; 2059 } 2060 2061 return soc_hx5_vlan_xlate_entry_hash(unit, mem, bank, hash_offset, 2062 use_lsb, entry); 2063 } 2064 2065 uint32 2066 soc_hx5_egr_vlan_xlate_hash(int unit, soc_mem_t mem, int bank, int hash_offset, 2067 int use_lsb, int key_nbits, void *base_entry, 2068 uint8 *key1, uint8 *key2) 2069 { 2070 uint32 lsb_val; 2071 uint32 hash_mask; 2072 uint32 hash_bits; 2073 2074 hash_mask = 0x7FF; /* 2k buckets per shared bank of size 4k */ 2075 hash_bits = 11; 2076 2077 if (use_lsb && (hash_offset + hash_bits > 32)) { 2078 switch (soc_mem_field32_get(unit, mem, base_entry, 2079 KEY_TYPEf)) { 2080 case TD3_EVLXLT_HASH_KEY_TYPE_VLAN_XLATE: 2081 case TD3_EVLXLT_HASH_KEY_TYPE_VLAN_XLATE_DVP: 2082 case TD3_EVLXLT_HASH_KEY_TYPE_FCOE_XLATE: 2083 case TD3_EVLXLT_HASH_KEY_TYPE_FCOE_XLATE_DVP: 2084 lsb_val = soc_mem_field32_get(unit, mem, base_entry, 2085 XLATE__HASH_LSBf); 2086 break; 2087 case TD3_EVLXLT_HASH_KEY_TYPE_ISID_XLATE: 2088 case TD3_EVLXLT_HASH_KEY_TYPE_ISID_DVP_XLATE: 2089 lsb_val = soc_mem_field32_get(unit, mem, base_entry, 2090 MIM_ISID__HASH_LSBf); 2091 break; 2092 case TD3_EVLXLT_HASH_KEY_TYPE_L2GRE_VFI: 2093 case TD3_EVLXLT_HASH_KEY_TYPE_L2GRE_VFI_DVP: 2094 lsb_val = soc_mem_field32_get(unit, mem, base_entry, 2095 L2GRE_VFI__HASH_LSBf); 2096 break; 2097 case TD3_EVLXLT_HASH_KEY_TYPE_VXLAN_VFI: 2098 case TD3_EVLXLT_HASH_KEY_TYPE_VXLAN_VFI_DVP: 2099 lsb_val = soc_mem_field32_get(unit, mem, base_entry, 2100 VXLAN_VFI__HASH_LSBf); 2101 break; 2102 default: 2103 lsb_val = 0; 2104 break; 2105 } 2106 } else { 2107 lsb_val = 0; 2108 } 2109 2110 return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2, 2111 hash_mask, lsb_val, use_lsb); 2112 } 2113 2114 int 2115 soc_hx5_egr_vlan_xlate_base_entry_to_key(int unit, soc_mem_t mem, int bank, 2116 void *entry, uint8 *key) 2117 { 2118 soc_field_t field_list[2]; 2119 soc_mem_t flex_mem_view = 0; 2120 2121 field_list[1] = INVALIDf; 2122 switch (soc_mem_field32_get(unit, mem, entry, KEY_TYPEf)) { 2123 case TD3_EVLXLT_HASH_KEY_TYPE_VLAN_XLATE: 2124 case TD3_EVLXLT_HASH_KEY_TYPE_FCOE_XLATE: 2125 case TD3_EVLXLT_HASH_KEY_TYPE_VLAN_XLATE_DVP: 2126 case TD3_EVLXLT_HASH_KEY_TYPE_FCOE_XLATE_DVP: 2127 field_list[0] = XLATE__KEY_0f; 2128 break; 2129 case TD3_EVLXLT_HASH_KEY_TYPE_ISID_XLATE: 2130 case TD3_EVLXLT_HASH_KEY_TYPE_ISID_DVP_XLATE: 2131 field_list[0] = MIM_ISID__KEY_0f; 2132 break; 2133 case TD3_EVLXLT_HASH_KEY_TYPE_L2GRE_VFI: 2134 case TD3_EVLXLT_HASH_KEY_TYPE_L2GRE_VFI_DVP: 2135 field_list[0] = L2GRE_VFI__KEY_0f; 2136 break; 2137 case TD3_EVLXLT_HASH_KEY_TYPE_VXLAN_VFI: 2138 case TD3_EVLXLT_HASH_KEY_TYPE_VXLAN_VFI_DVP: 2139 if (soc_feature(unit, soc_feature_vxlan_decoupled_mode) && 2140 (mem == EGR_VLAN_XLATE_1_SINGLEm)) { 2141 field_list[0] = VXLAN_VFI_FLEX__KEY_0f; 2142 } else { 2143 field_list[0] = VXLAN_VFI__KEY_0f; 2144 } 2145 break; 2146 case TD3_ELVXLT_HASH_KEY_TYPE_VLAN_XLATE_VFI: 2147 field_list[0] = VLAN_XLATE_VFI__KEY_0f; 2148 break; 2149 case TD3_ELVXLT_HASH_KEY_TYPE_VFI_DVP_GROUP: 2150 field_list[0] = VFI_DVP_GROUP__KEY_0f; 2151 break; 2152 case TD3_ELVXLT_HASH_KEY_TYPE_VRF_MAPPING: 2153 field_list[0] = VRF_MAPPING__KEY_0f; 2154 break; 2155 default: 2156 SOC_IF_ERROR_RETURN(soc_flex_hash_mem_view_get(unit, 2157 mem, entry, &flex_mem_view, field_list)); 2158 break; 2159 } 2160 return _soc_hx5_hash_entry_to_key(unit, bank, entry, 2161 key, mem, field_list, flex_mem_view); 2162 2163 } 2164 2165 uint32 2166 soc_hx5_egr_vlan_xlate_entry_hash(int unit, soc_mem_t mem, int bank, 2167 int hash_offset, int use_lsb, uint32 *entry) 2168 { 2169 int key_nbits; 2170 uint8 key1[SOC_MAX_MEM_WORDS * 4] = {0}; 2171 uint8 key2[SOC_MAX_MEM_WORDS * 4] = {0}; 2172 2173 /* Robust Hashed Key using Remap and Action Tables A */ 2174 key_nbits = soc_hx5_egr_vlan_xlate_base_entry_to_key(unit, mem, 0, 2175 entry, key1); 2176 /* Robust Hashed Key using Remap and Action Tables B */ 2177 key_nbits = soc_hx5_egr_vlan_xlate_base_entry_to_key(unit, mem, 1, 2178 entry, key2); 2179 2180 return soc_hx5_egr_vlan_xlate_hash(unit, mem, bank, hash_offset, use_lsb, 2181 key_nbits, entry, key1, key2); 2182 } 2183 2184 uint32 2185 soc_hx5_egr_vlan_xlate_bank_entry_hash(int unit, soc_mem_t mem, int bank, 2186 uint32 *entry) 2187 { 2188 int rv, hash_offset, use_lsb; 2189 2190 rv = soc_hx5_hash_offset_get(unit, mem, bank, &hash_offset, 2191 &use_lsb); 2192 if (SOC_FAILURE(rv)) { 2193 return 0; 2194 } 2195 2196 return soc_hx5_egr_vlan_xlate_entry_hash(unit, mem, bank, hash_offset, 2197 use_lsb, entry); 2198 } 2199 2200 uint32 2201 soc_hx5_ing_vp_vlan_member_hash(int unit, int bank, int hash_offset, 2202 int use_lsb, int key_nbits, void *base_entry, 2203 uint8 *key1, uint8 *key2) 2204 { 2205 uint32 lsb_val; 2206 uint32 hash_mask; 2207 uint32 hash_bits; 2208 2209 hash_mask = 0x7FF; /* 2k buckets per dedicated bank of size 8k */ 2210 hash_bits = 11; 2211 2212 if (use_lsb && (hash_offset + hash_bits > 32)) { 2213 lsb_val = soc_mem_field32_get(unit, ING_VP_VLAN_MEMBERSHIPm, 2214 base_entry, HASH_LSBf); 2215 } else { 2216 lsb_val = 0; 2217 } 2218 2219 return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2, 2220 hash_mask, lsb_val, use_lsb); 2221 } 2222 2223 int 2224 soc_hx5_ing_vp_vlan_member_base_entry_to_key(int unit, int bank, void *entry, uint8 *key) 2225 { 2226 static soc_field_t field_list[] = { 2227 KEYf, 2228 INVALIDf 2229 }; 2230 2231 return _soc_hx5_hash_entry_to_key(unit, bank, entry, key, 2232 ING_VP_VLAN_MEMBERSHIPm, field_list, 0); 2233 } 2234 2235 uint32 2236 soc_hx5_ing_vp_vlan_member_entry_hash(int unit, int bank, int hash_offset, 2237 int use_lsb, uint32 *entry) 2238 { 2239 int key_nbits; 2240 uint8 key1[SOC_MAX_MEM_WORDS * 4] = {0}; 2241 uint8 key2[SOC_MAX_MEM_WORDS * 4] = {0}; 2242 2243 /* Robust Hashed Key using Remap and Action Tables A */ 2244 key_nbits = soc_hx5_ing_vp_vlan_member_base_entry_to_key(unit, 0, 2245 entry, key1); 2246 /* Robust Hashed Key using Remap and Action Tables B */ 2247 key_nbits = soc_hx5_ing_vp_vlan_member_base_entry_to_key(unit, 1, 2248 entry, key2); 2249 2250 return soc_hx5_ing_vp_vlan_member_hash(unit, bank, hash_offset, use_lsb, 2251 key_nbits, entry, key1, key2); 2252 } 2253 2254 uint32 2255 soc_hx5_ing_vp_vlan_member_bank_entry_hash(int unit, int bank, uint32 *entry) 2256 { 2257 int rv, hash_offset, use_lsb; 2258 2259 rv = soc_hx5_hash_offset_get(unit, ING_VP_VLAN_MEMBERSHIPm, bank, 2260 &hash_offset, &use_lsb); 2261 if (SOC_FAILURE(rv)) { 2262 return 0; 2263 } 2264 2265 return soc_hx5_ing_vp_vlan_member_entry_hash(unit, bank, hash_offset, 2266 use_lsb, entry); 2267 } 2268 2269 uint32 2270 soc_hx5_egr_vp_vlan_member_hash(int unit, int bank, int hash_offset, 2271 int use_lsb, int key_nbits, void *base_entry, 2272 uint8 *key1, uint8 *key2) 2273 { 2274 uint32 lsb_val; 2275 uint32 hash_mask; 2276 uint32 hash_bits; 2277 2278 hash_mask = 0x7FF; /* 2k buckets per dedicated bank of size 8k */ 2279 hash_bits = 11; 2280 2281 if (use_lsb && (hash_offset + hash_bits > 32)) { 2282 lsb_val = soc_mem_field32_get(unit, EGR_VP_VLAN_MEMBERSHIPm, 2283 base_entry, HASH_LSBf); 2284 } else { 2285 lsb_val = 0; 2286 } 2287 2288 return _soc_hx5_shared_hash(unit, hash_offset, key_nbits, key1, key2, 2289 hash_mask, lsb_val, use_lsb); 2290 } 2291 2292 int 2293 soc_hx5_egr_vp_vlan_member_base_entry_to_key(int unit, int bank, void *entry, uint8 *key) 2294 { 2295 static soc_field_t field_list[] = { 2296 KEYf, 2297 INVALIDf 2298 }; 2299 2300 return _soc_hx5_hash_entry_to_key(unit, bank, entry, key, 2301 EGR_VP_VLAN_MEMBERSHIPm, field_list, 0); 2302 } 2303 2304 uint32 2305 soc_hx5_egr_vp_vlan_member_entry_hash(int unit, int bank, int hash_offset, 2306 int use_lsb, uint32 *entry) 2307 { 2308 int key_nbits; 2309 uint8 key1[SOC_MAX_MEM_WORDS * 4] = {0}; 2310 uint8 key2[SOC_MAX_MEM_WORDS * 4] = {0}; 2311 2312 /* Robust Hashed Key using Remap and Action Tables A */ 2313 key_nbits = soc_hx5_egr_vp_vlan_member_base_entry_to_key(unit, 0, 2314 entry, key1); 2315 /* Robust Hashed Key using Remap and Action Tables B */ 2316 key_nbits = soc_hx5_egr_vp_vlan_member_base_entry_to_key(unit, 1, 2317 entry, key2); 2318 2319 return soc_hx5_egr_vp_vlan_member_hash(unit, bank, hash_offset, use_lsb, 2320 key_nbits, entry, key1, key2); 2321 } 2322 2323 uint32 2324 soc_hx5_egr_vp_vlan_member_bank_entry_hash(int unit, int bank, uint32 *entry) 2325 { 2326 int rv, hash_offset, use_lsb; 2327 2328 rv = soc_hx5_hash_offset_get(unit, EGR_VP_VLAN_MEMBERSHIPm, bank, 2329 &hash_offset, &use_lsb); 2330 if (SOC_FAILURE(rv)) { 2331 return 0; 2332 } 2333 2334 return soc_hx5_egr_vp_vlan_member_entry_hash(unit, bank, hash_offset, 2335 use_lsb, entry); 2336 } 2337 2338 int 2339 soc_hx5_hash_bucket_get(int unit, int mem, int bank, uint32 *entry, 2340 uint32 *bucket) 2341 { 2342 switch (mem) { 2343 case L2Xm: 2344 *bucket = soc_hx5_l2x_bank_entry_hash(unit, bank, entry); 2345 break; 2346 case L3_ENTRY_ONLY_SINGLEm: 2347 case L3_ENTRY_SINGLEm: 2348 *bucket = soc_hx5_l3x_bank_entry_hash(unit, bank, entry); 2349 break; 2350 case L3_ENTRY_DOUBLEm: 2351 *bucket = soc_hx5_l3x_bank_entry_hash(unit, bank, entry); 2352 *bucket &= (bank > 7) ? 0x3FF : 0x7FF; 2353 break; 2354 case L3_ENTRY_QUADm: 2355 *bucket = soc_hx5_l3x_bank_entry_hash(unit, bank, entry); 2356 *bucket &= (bank > 7) ? 0x1FF : 0x3FF; 2357 break; 2358 case EXACT_MATCH_2m: 2359 /* 8K entries => 2K buckets => 0x800 buckets */ 2360 *bucket = soc_hx5_exact_match_bank_entry_hash(unit, bank, entry); 2361 break; 2362 case EXACT_MATCH_4m: 2363 /* 4K entries => 1K buckets => 0x400 buckets */ 2364 *bucket = soc_hx5_exact_match_bank_entry_hash(unit, bank, entry) & 0x3FF; 2365 break; 2366 case MPLS_ENTRY_SINGLEm: 2367 case MPLS_ENTRYm: 2368 *bucket = soc_hx5_mpls_bank_entry_hash(unit, mem, bank, entry); 2369 *bucket &= ((mem == MPLS_ENTRYm) ? 0x1FF : 0x3FF); 2370 break; 2371 case VLAN_XLATE_1_SINGLEm: 2372 case VLAN_XLATE_2_SINGLEm: 2373 case VLAN_XLATE_1_DOUBLEm: 2374 case VLAN_XLATE_2_DOUBLEm: 2375 *bucket = soc_hx5_vlan_xlate_bank_entry_hash(unit, mem, bank, entry); 2376 *bucket &= (((mem == VLAN_XLATE_1_DOUBLEm) || 2377 (mem == VLAN_XLATE_2_DOUBLEm)) ? 2378 0x1FF : 0x3FF); 2379 break; 2380 2381 case EGR_VLAN_XLATE_1_SINGLEm: 2382 case EGR_VLAN_XLATE_2_SINGLEm: 2383 case EGR_VLAN_XLATE_1_DOUBLEm: 2384 case EGR_VLAN_XLATE_2_DOUBLEm: 2385 *bucket = soc_hx5_egr_vlan_xlate_bank_entry_hash(unit, mem, bank, entry); 2386 *bucket &= (((mem == EGR_VLAN_XLATE_1_DOUBLEm) || 2387 (mem == EGR_VLAN_XLATE_2_DOUBLEm)) ? 2388 0x1FF : 0x3FF); 2389 break; 2390 2391 case ING_VP_VLAN_MEMBERSHIPm: 2392 *bucket = soc_hx5_ing_vp_vlan_member_bank_entry_hash(unit, 2393 bank, entry); 2394 break; 2395 case EGR_VP_VLAN_MEMBERSHIPm: 2396 *bucket = soc_hx5_egr_vp_vlan_member_bank_entry_hash(unit, 2397 bank, entry); 2398 break; 2399 default: 2400 return SOC_E_PARAM; 2401 } 2402 return SOC_E_NONE; 2403 } 2404 #endif /* BCM_HELIX5_SUPPORT */