higig.c (38267B)
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 * Utility routines for managing Higig headers 8 */ 9 10 #include <shared/bsl.h> 11 12 #include <assert.h> 13 #include <sal/core/libc.h> 14 #include <shared/bsl.h> 15 16 #include <soc/drv.h> 17 #include <soc/types.h> 18 #include <soc/higig.h> 19 #include <soc/enet.h> 20 #include <soc/cm.h> 21 #include <soc/debug.h> 22 23 #if defined(BCM_XGS_SUPPORT) || defined(BCM_PETRA_SUPPORT) || defined(BCM_DNX_SUPPORT) 24 25 static char *soc_higig_field_names[] = { 26 SOC_HIGIG_FIELD_NAMES_INIT 27 }; 28 29 soc_higig_field_t 30 soc_higig_name_to_field(int unit, char *name) 31 { 32 soc_higig_field_t f; 33 34 assert(COUNTOF(soc_higig_field_names) - 1 == HG_COUNT); 35 36 COMPILER_REFERENCE(unit); 37 38 for (f = 0; soc_higig_field_names[f] != NULL; f++) { 39 if (sal_strcmp(name, soc_higig_field_names[f]) == 0) { 40 return f; 41 } 42 } 43 44 return HG_invalid; 45 } 46 47 char * 48 soc_higig_field_to_name(int unit, soc_higig_field_t field) 49 { 50 COMPILER_REFERENCE(unit); 51 52 assert(COUNTOF(soc_higig_field_names) == HG_COUNT); 53 54 if (field < 0 || field >= HG_COUNT) { 55 return "??"; 56 } else { 57 return soc_higig_field_names[field]; 58 } 59 } 60 61 #ifdef BCM_HIGIG2_SUPPORT 62 void 63 soc_higig2_field_set(int unit, soc_higig2_hdr_t *hg2, 64 soc_higig_field_t field, uint32 val) 65 { 66 COMPILER_REFERENCE(unit); 67 68 switch (field) { 69 /* FRC fields are the same for all HG2 overlays */ 70 case HG_start: 71 hg2->ppd_overlay1.start = val; 72 break; 73 case HG_hgi: 74 /* Silently accept */ 75 break; 76 case HG_mcst: 77 hg2->ppd_overlay1.mcst = val; 78 break; 79 case HG_cos: 80 case HG_tc: 81 hg2->ppd_overlay1.tc = val; 82 break; 83 case HG_dst_mod: 84 hg2->ppd_overlay1.dst_mod = val; 85 break; 86 case HG_dst_port: 87 hg2->ppd_overlay1.dst_port = val; 88 break; 89 case HG_l2mc_ptr: 90 case HG_mgid: 91 hg2->ppd_overlay1.dst_mod = val >> 8; 92 hg2->ppd_overlay1.dst_port = val & 0xff; 93 break; 94 case HG_src_mod: 95 hg2->ppd_overlay1.src_mod = val; 96 break; 97 case HG_src_port: 98 case HG_tgid: 99 hg2->ppd_overlay1.src_port = val; 100 break; 101 case HG_lbid: 102 hg2->ppd_overlay1.lbid = val; 103 break; 104 case HG_cng: 105 case HG_dp: 106 hg2->ppd_overlay1.dp = val; 107 break; 108 case HG_ehv: 109 hg2->ppd_overlay1.ehv = val; 110 break; 111 case HG_hdr_format: 112 case HG_ppd_type: 113 hg2->ppd_overlay1.ppd_type = val; 114 break; 115 116 /* All other elements may depend upon the PPD_TYPE, so set it first */ 117 /* PPD_TYPE = 0 */ 118 case HG_dst_t: 119 hg2->ppd_overlay1.dst_t = val; 120 break; 121 case HG_ingress_tagged: 122 hg2->ppd_overlay1.ingress_tagged = val; 123 break; 124 case HG_mirror_only: 125 hg2->ppd_overlay1.mirror_only = val; 126 break; 127 case HG_mirror_done: 128 hg2->ppd_overlay1.mirror_done = val; 129 break; 130 case HG_mirror: 131 switch (hg2->ppd_overlay1.ppd_type) { 132 case 0: 133 hg2->ppd_overlay1.mirror = val; 134 break; 135 case 2: 136 hg2->ppd_overlay3.mirror = val; 137 break; 138 default: 139 break; 140 } 141 break; 142 case HG_label_overlay_type: 143 hg2->ppd_overlay1.label_overlay_type = val; 144 break; 145 case HG_l3: 146 hg2->ppd_overlay1.l3 = val; 147 break; 148 case HG_label_present: 149 hg2->ppd_overlay1.label_present = val; 150 break; 151 case HG_vc_label: 152 hg2->ppd_overlay1.vc_label_19_16 = (val >> 16) & 0xF; 153 hg2->ppd_overlay1.vc_label_15_8 = (val >> 8) & 0xFF; 154 hg2->ppd_overlay1.vc_label_7_0 = (val >> 0) & 0xFF; 155 break; 156 case HG_replication_id: 157 switch (hg2->ppd_overlay1.ppd_type) { 158 case 0: 159 hg2->ppd_overlay1.vc_label_19_16 = (val >> 16) & 0x3; 160 hg2->ppd_overlay1.vc_label_15_8 = (val >> 8) & 0xFF; 161 hg2->ppd_overlay1.vc_label_7_0 = (val >> 0) & 0xFF; 162 break; 163 case 2: 164 hg2->ppd_overlay3.opcode = (val >> 16) & 0x3; 165 hg2->ppd_overlay3.dst_vp_high = (val >> 8) & 0xFF; 166 hg2->ppd_overlay3.dst_vp_low = (val >> 0) & 0xFF; 167 break; 168 default: 169 break; 170 } 171 break; 172 case HG_vlan_tag: /* Same posistion in PPD 0 & 1 */ 173 hg2->ppd_overlay1.vlan_pri = (val >> 13) & 7; 174 hg2->ppd_overlay1.vlan_cfi = (val >> 12) & 1; 175 hg2->ppd_overlay1.vlan_id_hi = (val >> 8) & 0xf; 176 hg2->ppd_overlay1.vlan_id_lo = val & 0xff; 177 break; 178 case HG_vlan_pri: /* Same posistion in PPD 0 & 1 */ 179 hg2->ppd_overlay1.vlan_pri = val; 180 break; 181 case HG_vlan_cfi: /* Same posistion in PPD 0 & 1 */ 182 hg2->ppd_overlay1.vlan_cfi = val; 183 break; 184 case HG_vlan_id: /* Same posistion in PPD 0 & 1 */ 185 hg2->ppd_overlay1.vlan_id_hi = val >> 8; 186 hg2->ppd_overlay1.vlan_id_lo = val & 0xff; 187 break; 188 case HG_pfm: /* Same posistion in PPD 0 & 1 */ 189 hg2->ppd_overlay1.pfm = val; 190 break; 191 case HG_src_t: /* Same posistion in PPD 0 & 1 */ 192 hg2->ppd_overlay1.src_t = val; 193 break; 194 case HG_preserve_dscp: 195 switch (hg2->ppd_overlay1.ppd_type) { 196 case 0: 197 hg2->ppd_overlay1.preserve_dscp = val; 198 break; 199 case 2: 200 hg2->ppd_overlay3.preserve_dscp = val; 201 break; 202 case 3: 203 hg2->ppd_overlay4.preserve_dscp = val; 204 break; 205 default: 206 break; 207 } 208 break; 209 case HG_preserve_dot1p: 210 switch (hg2->ppd_overlay1.ppd_type) { 211 case 0: 212 hg2->ppd_overlay1.preserve_dot1p = val; 213 break; 214 case 2: 215 hg2->ppd_overlay3.preserve_dot1p = val; 216 break; 217 case 3: 218 hg2->ppd_overlay4.preserve_dot1p = val; 219 break; 220 default: 221 break; 222 } 223 break; 224 case HG_opcode: /* Same posistion in all PPDs */ 225 hg2->ppd_overlay1.opcode = val; 226 break; 227 case HG_hdr_ext_len: /* Same posistion in PPD 0 & 1 */ 228 hg2->ppd_overlay1.hdr_ext_len = val; 229 break; 230 231 /* PPD_TYPE = 1 */ 232 case HG_ctag: /* Same posistion in PPD 1 & 3 (offload) */ 233 hg2->ppd_overlay2.ctag_hi = val >> 8; 234 hg2->ppd_overlay2.ctag_lo = val & 0xff; 235 break; 236 237 /* PPD_TYPE = 2 */ 238 case HG_multipoint: 239 hg2->ppd_overlay3.multipoint = val; 240 break; 241 case HG_fwd_type: 242 hg2->ppd_overlay3.fwd_type = val; 243 break; 244 case HG_vni: 245 hg2->ppd_overlay3.vni_high = (val >> 10) & 0xF; 246 hg2->ppd_overlay3.vni_mid = (val >> 8) & 0x3; 247 hg2->ppd_overlay3.vni_low = val & 0xff; 248 break; 249 case HG_dst_vp: 250 hg2->ppd_overlay3.dst_vp_high = (val >> 8) & 0xFF; 251 hg2->ppd_overlay3.dst_vp_low = (val >> 0) & 0xFF; 252 break; 253 case HG_src_vp: /* Same posistion in PPD 2 & 3 */ 254 hg2->ppd_overlay3.src_vp_high = (val >> 8) & 0xFF; 255 hg2->ppd_overlay3.src_vp_low = (val >> 0) & 0xFF; 256 break; 257 case HG_donot_modify: 258 switch (hg2->ppd_overlay1.ppd_type) { 259 case 0: 260 hg2->ppd_overlay1.donot_modify = val; 261 break; 262 case 2: 263 hg2->ppd_overlay3.donot_modify = val; 264 break; 265 default: 266 break; 267 } 268 break; 269 case HG_donot_learn: 270 switch (hg2->ppd_overlay1.ppd_type) { 271 case 0: 272 hg2->ppd_overlay1.donot_learn = val; 273 break; 274 case 2: 275 case 3: /* Same posistion in PPD 2 & 3 */ 276 hg2->ppd_overlay3.donot_learn = val; 277 break; 278 default: 279 break; 280 } 281 break; 282 case HG_lag_failover: 283 switch (hg2->ppd_overlay1.ppd_type) { 284 case 0: 285 hg2->ppd_overlay1.lag_failover = val; 286 break; 287 case 2: 288 hg2->ppd_overlay3.lag_failover = val; 289 break; 290 default: 291 break; 292 } 293 break; 294 case HG_protection_status: 295 hg2->ppd_overlay3.protection_status = val; 296 break; 297 case HG_dst_type: 298 hg2->ppd_overlay3.dest_type = val; 299 break; 300 case HG_src_type: 301 switch (hg2->ppd_overlay1.ppd_type) { 302 case 2: 303 hg2->ppd_overlay3.source_type = val; 304 break; 305 case 3: 306 hg2->ppd_overlay4.source_type = val; 307 default: 308 break; 309 } 310 break; 311 312 /* PPD_TYPE = 3 */ 313 case HG_data_container_type: 314 hg2->ppd_overlay4.data_container_type = val; 315 break; 316 case HG_data_container: 317 hg2->ppd_overlay4.data_container.abstract.bytes[0] = 318 (val >> 24) & 0xFF; 319 hg2->ppd_overlay4.data_container.abstract.bytes[1] = 320 (val >> 16) & 0xFF; 321 hg2->ppd_overlay4.data_container.abstract.bytes[2] = 322 (val >> 8) & 0xFF; 323 hg2->ppd_overlay4.data_container.abstract.bytes[3] = 324 val & 0xFF; 325 break; 326 327 /* PPD_TYPE = 3, offload container */ 328 case HG_deferred_drop: 329 hg2->ppd_overlay4.data_container.offload_engine.deferred_drop = val; 330 break; 331 case HG_vxlt_done: 332 hg2->ppd_overlay4.data_container.offload_engine.vxlt_done = val; 333 break; 334 case HG_deferred_change_pkt_pri: 335 hg2->ppd_overlay4.data_container.offload_engine.deferred_change_pkt_pri = val; 336 break; 337 case HG_new_pkt_pri: 338 hg2->ppd_overlay4.data_container.offload_engine.new_pkt_pri = val; 339 break; 340 case HG_deferred_change_dscp: 341 hg2->ppd_overlay4.data_container.offload_engine.deferred_change_dscp = val; 342 break; 343 case HG_new_dscp: 344 hg2->ppd_overlay4.data_container.offload_engine.new_dscp = val; 345 break; 346 347 default: 348 LOG_WARN(BSL_LS_SOC_COMMON, 349 (BSL_META_U(unit, 350 "hg_set: unit %d: Unknown higig2 field=%d val=0x%x\n"), 351 unit, field, val)); 352 break; 353 } 354 } 355 356 uint32 357 soc_higig2_field_get(int unit, soc_higig2_hdr_t *hg2, 358 soc_higig_field_t field) 359 { 360 COMPILER_REFERENCE(unit); 361 362 switch (field) { 363 case HG_start: 364 return hg2->ppd_overlay1.start; 365 case HG_hgi: 366 return 2; 367 case HG_mcst: 368 return hg2->ppd_overlay1.mcst; 369 case HG_cos: 370 case HG_tc: 371 return hg2->ppd_overlay1.tc; 372 case HG_dst_mod: 373 return hg2->ppd_overlay1.dst_mod; 374 case HG_dst_port: 375 return hg2->ppd_overlay1.dst_port; 376 case HG_l2mc_ptr: 377 case HG_mgid: 378 return ((hg2->ppd_overlay1.dst_mod << 8) | 379 (hg2->ppd_overlay1.dst_port)); 380 case HG_src_mod: 381 return hg2->ppd_overlay1.src_mod; 382 case HG_tgid: 383 case HG_src_port: 384 return hg2->ppd_overlay1.src_port; 385 case HG_lbid: 386 return hg2->ppd_overlay1.lbid; 387 case HG_cng: 388 case HG_dp: 389 return hg2->ppd_overlay1.dp; 390 case HG_ehv: 391 return hg2->ppd_overlay1.ehv; 392 case HG_hdr_format: 393 case HG_ppd_type: 394 return hg2->ppd_overlay1.ppd_type; 395 396 /* PPD_TYPE = 0 */ 397 case HG_dst_t: 398 return hg2->ppd_overlay1.dst_t; 399 case HG_ingress_tagged: 400 return hg2->ppd_overlay1.ingress_tagged; 401 case HG_mirror_only: 402 return hg2->ppd_overlay1.mirror_only; 403 case HG_mirror_done: 404 return hg2->ppd_overlay1.mirror_done; 405 case HG_mirror: 406 switch (hg2->ppd_overlay1.ppd_type) { 407 case 0: 408 return hg2->ppd_overlay1.mirror; 409 case 2: 410 return hg2->ppd_overlay3.mirror; 411 default: 412 return 0; 413 } 414 case HG_label_overlay_type: 415 return hg2->ppd_overlay1.label_overlay_type; 416 case HG_l3: 417 return hg2->ppd_overlay1.l3; 418 case HG_label_present: 419 return hg2->ppd_overlay1.label_present; 420 case HG_vc_label: 421 return ((hg2->ppd_overlay1.vc_label_19_16 << 16) | 422 (hg2->ppd_overlay1.vc_label_15_8 << 8) | 423 (hg2->ppd_overlay1.vc_label_7_0)); 424 case HG_replication_id: 425 switch (hg2->ppd_overlay1.ppd_type) { 426 case 0: 427 return (((hg2->ppd_overlay1.vc_label_19_16 & 0x3) << 16) | 428 (hg2->ppd_overlay1.vc_label_15_8 << 8) | 429 (hg2->ppd_overlay1.vc_label_7_0)); 430 case 2: 431 return (((hg2->ppd_overlay3.opcode & 0x3) << 16) | 432 (hg2->ppd_overlay3.dst_vp_high << 8) | 433 (hg2->ppd_overlay3.dst_vp_low)); 434 default: 435 return 0; 436 } 437 case HG_vlan_tag: 438 return ((hg2->ppd_overlay1.vlan_pri << 13) | 439 (hg2->ppd_overlay1.vlan_cfi << 12) | 440 (hg2->ppd_overlay1.vlan_id_hi << 8) | 441 (hg2->ppd_overlay1.vlan_id_lo)); 442 case HG_vlan_pri: 443 return hg2->ppd_overlay1.vlan_pri; 444 case HG_vlan_cfi: 445 return hg2->ppd_overlay1.vlan_cfi; 446 case HG_vlan_id: 447 return ((hg2->ppd_overlay1.vlan_id_hi << 8) | 448 (hg2->ppd_overlay1.vlan_id_lo)); 449 case HG_pfm: 450 return hg2->ppd_overlay1.pfm; 451 case HG_src_t: 452 return hg2->ppd_overlay1.src_t; 453 case HG_preserve_dscp: 454 switch (hg2->ppd_overlay1.ppd_type) { 455 case 0: 456 return hg2->ppd_overlay1.preserve_dscp; 457 case 2: 458 return hg2->ppd_overlay3.preserve_dscp; 459 case 3: 460 return hg2->ppd_overlay4.preserve_dscp; 461 default: 462 return 0; 463 } 464 case HG_preserve_dot1p: 465 switch (hg2->ppd_overlay1.ppd_type) { 466 case 0: 467 return hg2->ppd_overlay1.preserve_dot1p; 468 case 2: 469 return hg2->ppd_overlay3.preserve_dot1p; 470 case 3: 471 return hg2->ppd_overlay4.preserve_dot1p; 472 default: 473 return 0; 474 } 475 case HG_opcode: 476 return hg2->ppd_overlay1.opcode; 477 case HG_hdr_ext_len: 478 return hg2->ppd_overlay1.hdr_ext_len; 479 480 /* PPD_TYPE = 1 */ 481 case HG_ctag: 482 return ((hg2->ppd_overlay2.ctag_hi << 8) | 483 (hg2->ppd_overlay2.ctag_lo)); 484 485 /* PPD_TYPE = 2 */ 486 case HG_multipoint: 487 return hg2->ppd_overlay3.multipoint; 488 case HG_fwd_type: 489 return hg2->ppd_overlay3.fwd_type; 490 case HG_vni: 491 return ((hg2->ppd_overlay3.vni_high << 10) | 492 (hg2->ppd_overlay3.vni_mid << 8) | 493 (hg2->ppd_overlay3.vni_low)); 494 case HG_dst_vp: 495 return ((hg2->ppd_overlay3.dst_vp_high << 8) | 496 (hg2->ppd_overlay3.dst_vp_low)); 497 case HG_src_vp: 498 return ((hg2->ppd_overlay3.src_vp_high << 8) | 499 (hg2->ppd_overlay3.src_vp_low)); 500 case HG_donot_modify: 501 switch (hg2->ppd_overlay1.ppd_type) { 502 case 0: 503 return hg2->ppd_overlay1.donot_modify; 504 case 2: 505 return hg2->ppd_overlay3.donot_modify; 506 default: 507 return 0; 508 } 509 case HG_donot_learn: 510 switch (hg2->ppd_overlay1.ppd_type) { 511 case 0: 512 return hg2->ppd_overlay1.donot_learn; 513 case 2: 514 case 3: /* Same posistion in PPD 2 & 3 */ 515 return hg2->ppd_overlay3.donot_learn; 516 default: 517 return 0; 518 } 519 case HG_lag_failover: 520 switch (hg2->ppd_overlay1.ppd_type) { 521 case 0: 522 return hg2->ppd_overlay1.lag_failover; 523 case 2: 524 return hg2->ppd_overlay3.lag_failover; 525 default: 526 return 0; 527 } 528 case HG_protection_status: 529 return hg2->ppd_overlay3.protection_status; 530 case HG_dst_type: 531 return hg2->ppd_overlay3.dest_type; 532 case HG_src_type: 533 switch (hg2->ppd_overlay1.ppd_type) { 534 case 2: 535 return hg2->ppd_overlay3.source_type; 536 case 3: 537 return hg2->ppd_overlay4.source_type; 538 default: 539 return 0; 540 } 541 542 /* PPD_TYPE = 3 */ 543 case HG_data_container_type: 544 return hg2->ppd_overlay4.data_container_type; 545 case HG_data_container: 546 return ((hg2->ppd_overlay4.data_container.abstract.bytes[0] << 24) | 547 (hg2->ppd_overlay4.data_container.abstract.bytes[1] << 16) | 548 (hg2->ppd_overlay4.data_container.abstract.bytes[2] << 8) | 549 (hg2->ppd_overlay4.data_container.abstract.bytes[3])); 550 551 /* PPD_TYPE = 3, offload container */ 552 case HG_deferred_drop: 553 return hg2->ppd_overlay4.data_container.offload_engine.deferred_drop; 554 case HG_vxlt_done: 555 return hg2->ppd_overlay4.data_container.offload_engine.vxlt_done; 556 case HG_deferred_change_pkt_pri: 557 return hg2->ppd_overlay4.data_container.offload_engine.deferred_change_pkt_pri; 558 case HG_new_pkt_pri: 559 return hg2->ppd_overlay4.data_container.offload_engine.new_pkt_pri; 560 case HG_deferred_change_dscp: 561 return hg2->ppd_overlay4.data_container.offload_engine.deferred_change_dscp; 562 case HG_new_dscp: 563 return hg2->ppd_overlay4.data_container.offload_engine.new_dscp; 564 default: 565 LOG_WARN(BSL_LS_SOC_COMMON, 566 (BSL_META_U(unit, 567 "hg_get: unit %d: Unknown higig2 field=%d\n"), 568 unit, field)); 569 return 0; 570 } 571 } 572 573 void 574 soc_higig2_dump(int unit, char *pfx, soc_higig2_hdr_t *hg2) 575 { 576 LOG_CLI((BSL_META_U(unit, 577 "%s0x%02x%02x%02x%02x " 578 "<START=0x%x MCST=0x%x TC=%d DST_MOD=%d DST_PORT=%d\n"), 579 pfx, 580 hg2->overlay0.bytes[0], 581 hg2->overlay0.bytes[1], 582 hg2->overlay0.bytes[2], 583 hg2->overlay0.bytes[3], 584 soc_higig2_field_get(unit, hg2, HG_start), 585 soc_higig2_field_get(unit, hg2, HG_mcst), 586 soc_higig2_field_get(unit, hg2, HG_tc), 587 soc_higig2_field_get(unit, hg2, HG_dst_mod), 588 soc_higig2_field_get(unit, hg2, HG_dst_port))); 589 LOG_CLI((BSL_META_U(unit, 590 "%s OVERLAY: MGID=%d>\n"), 591 pfx, 592 soc_higig2_field_get(unit, hg2, HG_mgid))); 593 LOG_CLI((BSL_META_U(unit, 594 "%s0x%02x%02x%02x%02x " 595 "<SRC_MOD=%d SRC_PORT=%d LBID=%d DP=%d EHV=%d PPD_TYPE=%d>\n"), 596 pfx, 597 hg2->overlay0.bytes[4], 598 hg2->overlay0.bytes[5], 599 hg2->overlay0.bytes[6], 600 hg2->overlay0.bytes[7], 601 soc_higig2_field_get(unit, hg2, HG_src_mod), 602 soc_higig2_field_get(unit, hg2, HG_src_port), 603 soc_higig2_field_get(unit, hg2, HG_lbid), 604 soc_higig2_field_get(unit, hg2, HG_dp), 605 soc_higig2_field_get(unit, hg2, HG_ehv), 606 soc_higig2_field_get(unit, hg2, HG_ppd_type))); 607 if (soc_higig2_field_get(unit, hg2, HG_ppd_type) == 0) { 608 LOG_CLI((BSL_META_U(unit, 609 "%s0x%02x%02x%02x%02x " 610 "<DST_T=%d DONOT_MODIFY=%d DONOT_LEARN=%d\n"), 611 pfx, 612 hg2->overlay0.bytes[8], 613 hg2->overlay0.bytes[9], 614 hg2->overlay0.bytes[10], 615 hg2->overlay0.bytes[11], 616 soc_higig2_field_get(unit, hg2, HG_dst_t), 617 soc_higig2_field_get(unit, hg2, HG_donot_modify), 618 soc_higig2_field_get(unit, hg2, HG_donot_learn))); 619 LOG_CLI((BSL_META_U(unit, 620 "%s LEG_FAILOVER=%d IT=%d MO=%d MD=%d M=%d " 621 "L3=%d\n"), 622 pfx, 623 soc_higig2_field_get(unit, hg2, HG_lag_failover), 624 soc_higig2_field_get(unit, hg2, HG_ingress_tagged), 625 soc_higig2_field_get(unit, hg2, HG_mirror_only), 626 soc_higig2_field_get(unit, hg2, HG_mirror_done), 627 soc_higig2_field_get(unit, hg2, HG_mirror), 628 soc_higig2_field_get(unit, hg2, HG_l3))); 629 LOG_CLI((BSL_META_U(unit, 630 "%s LP=%d LABEL_TYPE=%d VC_LABEL=0x%05x\n"), 631 pfx, 632 soc_higig2_field_get(unit, hg2, HG_label_present), 633 soc_higig2_field_get(unit, hg2, HG_label_overlay_type), 634 soc_higig2_field_get(unit, hg2, HG_vc_label))); 635 LOG_CLI((BSL_META_U(unit, 636 "%s REPLICATION_ID=0x%x>\n"), 637 pfx, 638 soc_higig2_field_get(unit, hg2, HG_replication_id))); 639 LOG_CLI((BSL_META_U(unit, 640 "%s0x%02x%02x%02x%02x " 641 "<VLAN_PRI=%d VLAN_CFI=%d VLAN_ID=%d\n"), 642 pfx, 643 hg2->overlay0.bytes[12], 644 hg2->overlay0.bytes[13], 645 hg2->overlay0.bytes[14], 646 hg2->overlay0.bytes[15], 647 soc_higig2_field_get(unit, hg2, HG_vlan_pri), 648 soc_higig2_field_get(unit, hg2, HG_vlan_cfi), 649 soc_higig2_field_get(unit, hg2, HG_vlan_id))); 650 LOG_CLI((BSL_META_U(unit, 651 "%s PFM=%d SRC_T=%d PRESERVE_DSCP=%d\n"), 652 pfx, 653 soc_higig2_field_get(unit, hg2, HG_pfm), 654 soc_higig2_field_get(unit, hg2, HG_src_t), 655 soc_higig2_field_get(unit, hg2, HG_preserve_dscp))); 656 LOG_CLI((BSL_META_U(unit, 657 "%s PRESERVE_DOT1P=%d OPCODE=%d HXL=%d>\n"), 658 pfx, 659 soc_higig2_field_get(unit, hg2, HG_preserve_dot1p), 660 soc_higig2_field_get(unit, hg2, HG_opcode), 661 soc_higig2_field_get(unit, hg2, HG_hdr_ext_len))); 662 } else if (soc_higig2_field_get(unit, hg2, HG_ppd_type) == 1) { 663 LOG_CLI((BSL_META_U(unit, 664 "%s0x%02x%02x%02x%02x " 665 "<CTAG=0x%x>\n"), 666 pfx, 667 hg2->overlay0.bytes[8], 668 hg2->overlay0.bytes[9], 669 hg2->overlay0.bytes[10], 670 hg2->overlay0.bytes[11], 671 soc_higig2_field_get(unit, hg2, HG_ctag))); 672 LOG_CLI((BSL_META_U(unit, 673 "%s0x%02x%02x%02x%02x " 674 "<VLAN_PRI=%d VLAN_CFI=%d VLAN_ID=%d\n"), 675 pfx, 676 hg2->overlay0.bytes[12], 677 hg2->overlay0.bytes[13], 678 hg2->overlay0.bytes[14], 679 hg2->overlay0.bytes[15], 680 soc_higig2_field_get(unit, hg2, HG_vlan_pri), 681 soc_higig2_field_get(unit, hg2, HG_vlan_cfi), 682 soc_higig2_field_get(unit, hg2, HG_vlan_id))); 683 LOG_CLI((BSL_META_U(unit, 684 "%s PFM=%d SRC_T=%d OPCODE=%d HXL=%d>\n"), 685 pfx, 686 soc_higig2_field_get(unit, hg2, HG_pfm), 687 soc_higig2_field_get(unit, hg2, HG_src_t), 688 soc_higig2_field_get(unit, hg2, HG_opcode), 689 soc_higig2_field_get(unit, hg2, HG_hdr_ext_len))); 690 } else if (soc_higig2_field_get(unit, hg2, HG_ppd_type) == 2) { 691 LOG_CLI((BSL_META_U(unit, 692 "%s0x%02x%02x%02x%02x " 693 "<MULTIPOINT=%d FWD_TYPE=0x%x VNI=0x%x DST_VP=0x%x>\n"), 694 pfx, 695 hg2->overlay0.bytes[8], 696 hg2->overlay0.bytes[9], 697 hg2->overlay0.bytes[10], 698 hg2->overlay0.bytes[11], 699 soc_higig2_field_get(unit, hg2, HG_multipoint), 700 soc_higig2_field_get(unit, hg2, HG_fwd_type), 701 soc_higig2_field_get(unit, hg2, HG_vni), 702 soc_higig2_field_get(unit, hg2, HG_dst_vp))); 703 LOG_CLI((BSL_META_U(unit, 704 "%s0x%02x%02x%02x%02x " 705 "<SRC_VP=0x%x MIRROR=%d DONOT_MODIFY=%d DONOT_LEARN=%d\n"), 706 pfx, 707 hg2->overlay0.bytes[12], 708 hg2->overlay0.bytes[13], 709 hg2->overlay0.bytes[14], 710 hg2->overlay0.bytes[15], 711 soc_higig2_field_get(unit, hg2, HG_src_vp), 712 soc_higig2_field_get(unit, hg2, HG_mirror), 713 soc_higig2_field_get(unit, hg2, HG_donot_modify), 714 soc_higig2_field_get(unit, hg2, HG_donot_learn))); 715 LOG_CLI((BSL_META_U(unit, 716 "%s LAG_FAILOVER=%d OPCODE=%d PRESERVE_DSCP=%d\n"), 717 pfx, 718 soc_higig2_field_get(unit, hg2, HG_lag_failover), 719 soc_higig2_field_get(unit, hg2, HG_opcode), 720 soc_higig2_field_get(unit, hg2, HG_preserve_dscp))); 721 LOG_CLI((BSL_META_U(unit, 722 "%s REPLICATION_ID=0x%x PROTECTION_STATUS=%d\n"), 723 pfx, 724 soc_higig2_field_get(unit, hg2, HG_replication_id), 725 soc_higig2_field_get(unit, hg2, HG_protection_status))); 726 LOG_CLI((BSL_META_U(unit, 727 "%s PRESERVE_DOT1P=%d DST_TYPE=%d SRC_TYPE=%d>\n"), 728 pfx, 729 soc_higig2_field_get(unit, hg2, HG_preserve_dot1p), 730 soc_higig2_field_get(unit, hg2, HG_dst_type), 731 soc_higig2_field_get(unit, hg2, HG_src_type))); 732 } else if (soc_higig2_field_get(unit, hg2, HG_ppd_type) == 3) { 733 if (soc_higig2_field_get(unit, hg2, HG_data_container_type) == 1) { 734 LOG_CLI((BSL_META_U(unit, 735 "%s0x%02x%02x%02x%02x " 736 "<CTAG=0x%x DEFERRED_DROP=%d VXLT_DONE=%d\n"), 737 pfx, 738 hg2->overlay0.bytes[8], 739 hg2->overlay0.bytes[9], 740 hg2->overlay0.bytes[10], 741 hg2->overlay0.bytes[11], 742 soc_higig2_field_get(unit, hg2, HG_ctag), 743 soc_higig2_field_get(unit, hg2, HG_deferred_drop), 744 soc_higig2_field_get(unit, hg2, HG_vxlt_done))); 745 LOG_CLI((BSL_META_U(unit, 746 "%s DEFERRED_CHANGE_PKT_PRI=%d, NEW_PKT_PRI=%d\n"), 747 pfx, 748 soc_higig2_field_get(unit, hg2, HG_deferred_change_pkt_pri), 749 soc_higig2_field_get(unit, hg2, HG_new_pkt_pri))); 750 LOG_CLI((BSL_META_U(unit, 751 "%s DEFERRED_CHANGE_DSCP=%d, NEW_DSCP=%d>\n"), 752 pfx, 753 soc_higig2_field_get(unit, hg2, HG_deferred_change_dscp), 754 soc_higig2_field_get(unit, hg2, HG_new_dscp))); 755 } else { 756 LOG_CLI((BSL_META_U(unit, 757 "%s0x%02x%02x%02x%02x " 758 "<DATA_CONTAINER=0x%08x>\n"), 759 pfx, 760 hg2->overlay0.bytes[8], 761 hg2->overlay0.bytes[9], 762 hg2->overlay0.bytes[10], 763 hg2->overlay0.bytes[11], 764 soc_higig2_field_get(unit, hg2, 765 HG_data_container))); 766 } 767 LOG_CLI((BSL_META_U(unit, 768 "%s0x%02x%02x%02x%02x " 769 "<SOURCE_TYPE=%d SOURCE_VP=0x%x PRESERVE_DSCP=%d\n"), 770 pfx, 771 hg2->overlay0.bytes[12], 772 hg2->overlay0.bytes[13], 773 hg2->overlay0.bytes[14], 774 hg2->overlay0.bytes[15], 775 soc_higig2_field_get(unit, hg2, HG_src_type), 776 soc_higig2_field_get(unit, hg2, HG_src_vp), 777 soc_higig2_field_get(unit, hg2, HG_preserve_dscp))); 778 LOG_CLI((BSL_META_U(unit, 779 "%s PRESERVE_DOT1P=%d DONOT_LEARN=%d\n"), 780 pfx, 781 soc_higig2_field_get(unit, hg2, HG_preserve_dot1p), 782 soc_higig2_field_get(unit, hg2, HG_donot_learn))); 783 LOG_CLI((BSL_META_U(unit, 784 "%s OPCODE=%d CONTAINER_TYPE=%d>\n"), 785 pfx, 786 soc_higig2_field_get(unit, hg2, HG_opcode), 787 soc_higig2_field_get(unit, hg2, HG_data_container_type))); 788 } 789 } 790 #endif /* BCM_HIGIG2_SUPPORT */ 791 792 793 /* 794 * HG_start should always be set first before settings any other fields. 795 */ 796 void 797 soc_higig_field_set(int unit, soc_higig_hdr_t *hg, 798 soc_higig_field_t field, uint32 val) 799 { 800 COMPILER_REFERENCE(unit); 801 802 #ifdef BCM_HIGIG2_SUPPORT 803 if ((hg->overlay1.start == SOC_HIGIG2_START) || 804 (SOC_IS_RAPTOR(unit)) || (SOC_IS_RAVEN(unit))) { 805 soc_higig2_field_set(unit, (soc_higig2_hdr_t *)hg, field, val); 806 return; 807 } 808 #endif /* BCM_HIGIG2_SUPPORT */ 809 810 switch (field) { 811 case HG_start: hg->overlay1.start = val; break; 812 case HG_hgi: hg->overlay1.hgi = val & SOC_HIGIG_HGI_MASK; break; 813 case HG_vlan_tag: hg->overlay1.vlan_pri = (val >> 13) & 7; 814 hg->overlay1.vlan_cfi = (val >> 12) & 1; 815 hg->overlay1.vlan_id_hi = (val >> 8) & 0xf; 816 hg->overlay1.vlan_id_lo = val & 0xff; break; 817 case HG_vlan_pri: hg->overlay1.vlan_pri = val; break; 818 case HG_vlan_cfi: hg->overlay1.vlan_cfi = val; break; 819 case HG_vlan_id: hg->overlay1.vlan_id_hi = val >> 8; 820 hg->overlay1.vlan_id_lo = val & 0xff; break; 821 case HG_src_mod: hg->overlay1.src_mod = val & 0x1f; 822 hg->hgp_overlay1.src_mod_5 = (val >> 5) & 1; 823 hg->hgp_overlay1.src_mod_6 = (val >> 6) & 1;break; 824 case HG_opcode: hg->overlay1.opcode = val; break; 825 case HG_pfm: hg->overlay1.pfm = val; break; 826 case HG_src_port: hg->overlay1.src_port = val; break; 827 case HG_dst_port: hg->overlay1.dst_port = val; break; 828 case HG_cos: hg->overlay1.cos = val; break; 829 case HG_hdr_format: hg->overlay1.hdr_format = val; break; 830 case HG_cng: hg->overlay1.cng = val & 1; 831 hg->hgp_overlay1.cng_hi = (val >> 1) & 1;break; 832 case HG_dst_mod: hg->overlay1.dst_mod = val & 0x1f; 833 hg->hgp_overlay1.dst_mod_5 = (val >> 5) & 1; 834 hg->hgp_overlay1.dst_mod_6 = (val >> 6) & 1;break; 835 case HG_dst_t: hg->overlay1.dst_t = val; break; 836 case HG_dst_tgid: hg->overlay1.dst_tgid = val; break; 837 case HG_donot_modify: hg->hgp_overlay2.donot_modify = val; break; 838 case HG_donot_learn: hg->hgp_overlay2.donot_learn = val; break; 839 case HG_lag_failover: hg->hgp_overlay2.lag_failover = val; break; 840 case HG_ingress_tagged: hg->overlay1.ingress_tagged = val; break; 841 case HG_mirror_only: hg->overlay1.mirror_only = val; break; 842 case HG_mirror_done: hg->overlay1.mirror_done = val; break; 843 case HG_mirror: hg->overlay1.mirror = val; break; 844 case HG_tgid: hg->overlay2.tgid = val; break; 845 case HG_l2mc_ptr: hg->hgp_overlay2.dst_mod_6 = (val >> 12) & 1; 846 hg->hgp_overlay2.dst_t = (val >> 11) & 1; 847 hg->hgp_overlay2.dst_mod_5 = (val >> 10) & 1; 848 hg->overlay2.l2mc_ptr_hi = (val >> 5) & 0x1f; 849 hg->overlay2.l2mc_ptr_lo = val & 0x1f; break; 850 case HG_ctag: hg->overlay2.ctag_hi = val >> 8; 851 hg->overlay2.ctag_lo = val & 0xff; break; 852 case HG_hdr_ext_len: hg->hgp_overlay1.hdr_ext_len = val; break; 853 case HG_l3: hg->hgp_overlay1.l3 = val; break; 854 case HG_label_present: hg->hgp_overlay1.label_present = val; break; 855 case HG_vc_label: hg->hgp_overlay1.vc_label_19_16 856 = (val >> 16) & 0xF; 857 hg->hgp_overlay1.vc_label_15_8 858 = (val >> 8) & 0xFF; 859 hg->hgp_overlay1.vc_label_7_0 860 = (val >> 0) & 0xFF; 861 break; 862 default: 863 LOG_WARN(BSL_LS_SOC_COMMON, 864 (BSL_META_U(unit, 865 "hg_set: unit %d: Unknown higig field=%d val=0x%x\n"), 866 unit, field, val)); 867 break; 868 } 869 } 870 871 uint32 872 soc_higig_field_get(int unit, soc_higig_hdr_t *hg, 873 soc_higig_field_t field) 874 { 875 COMPILER_REFERENCE(unit); 876 877 #ifdef BCM_HIGIG2_SUPPORT 878 if ((hg->overlay1.start == SOC_HIGIG2_START) || 879 (SOC_IS_RAPTOR(unit)) || (SOC_IS_RAVEN(unit))) { 880 return soc_higig2_field_get(unit, (soc_higig2_hdr_t *)hg, field); 881 } 882 #endif /* BCM_HIGIG2_SUPPORT */ 883 884 switch (field) { 885 case HG_start: return hg->overlay1.start; 886 case HG_hgi: return hg->overlay1.hgi & SOC_HIGIG_HGI_MASK; 887 case HG_vlan_tag: return (hg->overlay1.vlan_pri << 13 | 888 hg->overlay1.vlan_cfi << 12 | 889 hg->overlay1.vlan_id_hi << 8 | 890 hg->overlay1.vlan_id_lo); 891 case HG_vlan_pri: return hg->overlay1.vlan_pri; 892 case HG_vlan_cfi: return hg->overlay1.vlan_cfi; 893 case HG_vlan_id: return (hg->overlay1.vlan_id_hi << 8 | 894 hg->overlay1.vlan_id_lo); 895 case HG_src_mod: return (hg->overlay1.src_mod | 896 (hg->hgp_overlay1.src_mod_5 << 5) | 897 (hg->hgp_overlay1.src_mod_6 << 6)); 898 case HG_opcode: return hg->overlay1.opcode; 899 case HG_pfm: return hg->overlay1.pfm; 900 case HG_src_port: return hg->overlay1.src_port; 901 case HG_dst_port: return hg->overlay1.dst_port; 902 case HG_cos: return hg->overlay1.cos; 903 case HG_hdr_format: return hg->overlay1.hdr_format; 904 case HG_cng: return hg->overlay1.cng | 905 (hg->hgp_overlay1.cng_hi << 1); 906 case HG_dst_mod: return (hg->overlay1.dst_mod | 907 (hg->hgp_overlay1.dst_mod_5 << 5) | 908 (hg->hgp_overlay1.dst_mod_6 << 6)); 909 case HG_dst_t: return hg->overlay1.dst_t; 910 case HG_dst_tgid: return hg->overlay1.dst_tgid; 911 case HG_donot_modify: return hg->hgp_overlay2.donot_modify; 912 case HG_donot_learn: return hg->hgp_overlay2.donot_learn; 913 case HG_lag_failover: return hg->hgp_overlay2.lag_failover; 914 case HG_ingress_tagged: return hg->overlay1.ingress_tagged; 915 case HG_mirror_only: return hg->overlay1.mirror_only; 916 case HG_mirror_done: return hg->overlay1.mirror_done; 917 case HG_mirror: return hg->overlay1.mirror; 918 case HG_tgid: return hg->overlay2.tgid; 919 case HG_l2mc_ptr: return (hg->hgp_overlay2.dst_mod_6 << 12 | 920 hg->hgp_overlay2.dst_t << 11 | 921 hg->hgp_overlay2.dst_mod_5 << 10 | 922 hg->overlay2.l2mc_ptr_hi << 5 | 923 hg->overlay2.l2mc_ptr_lo); 924 case HG_ctag: return (hg->overlay2.ctag_hi << 8 | 925 hg->overlay2.ctag_lo); 926 case HG_hdr_ext_len: return hg->hgp_overlay1.hdr_ext_len; 927 case HG_l3: return hg->hgp_overlay1.l3; 928 case HG_label_present: return hg->hgp_overlay1.label_present; 929 case HG_vc_label: return ((hg->hgp_overlay1.vc_label_19_16 << 16) | 930 (hg->hgp_overlay1.vc_label_15_8 << 8) | 931 (hg->hgp_overlay1.vc_label_7_0)); 932 default: 933 LOG_WARN(BSL_LS_SOC_COMMON, 934 (BSL_META_U(unit, 935 "hg_get: unit %d: Unknown higig field=%d\n"), 936 unit, field)); 937 return 0; 938 } 939 } 940 941 void 942 soc_higig_dump(int unit, char *pfx, soc_higig_hdr_t *hg) 943 { 944 LOG_CLI((BSL_META_U(unit, 945 "%s0x%02x%02x%02x%02x " 946 "<START=0x%x HXL=%d " 947 "VLAN_PRI=%d VLAN_CFI=%d VLAN_ID=%d>\n"), 948 pfx, 949 hg->overlay0.bytes[0], 950 hg->overlay0.bytes[1], 951 hg->overlay0.bytes[2], 952 hg->overlay0.bytes[3], 953 soc_higig_field_get(unit, hg, HG_start), 954 soc_higig_field_get(unit, hg, HG_hdr_ext_len), 955 soc_higig_field_get(unit, hg, HG_vlan_pri), 956 soc_higig_field_get(unit, hg, HG_vlan_cfi), 957 soc_higig_field_get(unit, hg, HG_vlan_id))); 958 LOG_CLI((BSL_META_U(unit, 959 "%s0x%02x%02x%02x%02x " 960 "<SRC_MOD=%d OPCODE=%d PFM=%d SRC_PORT=%d\n"), 961 pfx, 962 hg->overlay0.bytes[4], 963 hg->overlay0.bytes[5], 964 hg->overlay0.bytes[6], 965 hg->overlay0.bytes[7], 966 soc_higig_field_get(unit, hg, HG_src_mod), 967 soc_higig_field_get(unit, hg, HG_opcode), 968 soc_higig_field_get(unit, hg, HG_pfm), 969 soc_higig_field_get(unit, hg, HG_src_port))); 970 LOG_CLI((BSL_META_U(unit, 971 "%s DST_PORT=%d COS=%d HDR_FMT=%d " 972 "CNG=%d DST_MOD=%d\n"), 973 pfx, 974 soc_higig_field_get(unit, hg, HG_dst_port), 975 soc_higig_field_get(unit, hg, HG_cos), 976 soc_higig_field_get(unit, hg, HG_hdr_format), 977 soc_higig_field_get(unit, hg, HG_cng), 978 soc_higig_field_get(unit, hg, HG_dst_mod))); 979 LOG_CLI((BSL_META_U(unit, 980 "%s OVERLAY: TGID=%d L2MC_PTR=0x%x>\n"), 981 pfx, 982 soc_higig_field_get(unit, hg, HG_tgid), 983 soc_higig_field_get(unit, hg, HG_l2mc_ptr))); 984 LOG_CLI((BSL_META_U(unit, 985 "%s0x%02x%02x%02x%02x " 986 "<DST_T=%d DST_TGID=%d IT=%d MO=%d MD=%d M=%d L3=%d\n"), 987 pfx, 988 hg->overlay0.bytes[8], 989 hg->overlay0.bytes[9], 990 hg->overlay0.bytes[10], 991 hg->overlay0.bytes[11], 992 soc_higig_field_get(unit, hg, HG_dst_t), 993 soc_higig_field_get(unit, hg, HG_dst_tgid), 994 soc_higig_field_get(unit, hg, HG_ingress_tagged), 995 soc_higig_field_get(unit, hg, HG_mirror_only), 996 soc_higig_field_get(unit, hg, HG_mirror_done), 997 soc_higig_field_get(unit, hg, HG_mirror), 998 soc_higig_field_get(unit, hg, HG_l3))); 999 LOG_CLI((BSL_META_U(unit, 1000 "%s LP=%d VC_LABEL=0x%05x\n"), 1001 pfx, 1002 soc_higig_field_get(unit, hg, HG_label_present), 1003 soc_higig_field_get(unit, hg, HG_vc_label))); 1004 LOG_CLI((BSL_META_U(unit, 1005 "%s OVERLAY: CTAG=0x%x>\n"), 1006 pfx, 1007 soc_higig_field_get(unit, hg, HG_ctag))); 1008 } 1009 1010 1011 #endif /* BCM_XGS_SUPPORT */