@@ -427,9 +427,28 @@ void rvu_npc_install_bcast_match_entry(struct rvu *rvu, u16 pcifunc,
427
427
index = npc_get_nixlf_mcam_index (mcam , pcifunc ,
428
428
nixlf , NIXLF_BCAST_ENTRY );
429
429
430
- /* Check for L2B bit and LMAC channel */
431
- entry .kw [0 ] = BIT_ULL (25 ) | chan ;
432
- entry .kw_mask [0 ] = BIT_ULL (25 ) | 0xFFFULL ;
430
+ /* Check for L2B bit and LMAC channel
431
+ * NOTE: Since MKEX default profile(a reduced version intended to
432
+ * accommodate more capability but igoring few bits) a stap-gap
433
+ * approach.
434
+ * Since we care for L2B which by HRM NPC_PARSE_KEX_S at BIT_POS[25], So
435
+ * moved to BIT_POS[13], ignoring ERRCODE, ERRLEV as we'll loose out
436
+ * on capability features needed for CoS (/from ODP PoV) e.g: VLAN,
437
+ * DSCP.
438
+ *
439
+ * Reduced layout of MKEX default profile -
440
+ * Includes following are (i.e.CHAN, L2/3{B/M}, LA, LB, LC, LD):
441
+ *
442
+ * BIT_POS[31:28] : LD
443
+ * BIT_POS[27:24] : LC
444
+ * BIT_POS[23:20] : LB
445
+ * BIT_POS[19:16] : LA
446
+ * BIT_POS[15:12] : L3B, L3M, L2B, L2M
447
+ * BIT_POS[11:00] : CHAN
448
+ *
449
+ */
450
+ entry .kw [0 ] = BIT_ULL (13 ) | chan ;
451
+ entry .kw_mask [0 ] = ~entry .kw [0 ] & (BIT_ULL (13 ) | 0xFFFULL );
433
452
434
453
* (u64 * )& action = 0x00 ;
435
454
#ifdef MCAST_MCE
@@ -538,14 +557,18 @@ void rvu_npc_disable_mcam_entries(struct rvu *rvu, u16 pcifunc, int nixlf)
538
557
}
539
558
}
540
559
541
- #define LDATA_EXTRACT_CONFIG (intf , lid , ltype , ld , cfg ) \
560
+ #define SET_KEX_LD (intf , lid , ltype , ld , cfg ) \
542
561
rvu_write64(rvu, blkaddr, \
543
562
NPC_AF_INTFX_LIDX_LTX_LDX_CFG(intf, lid, ltype, ld), cfg)
544
563
545
- #define LDATA_FLAGS_CONFIG (intf , ld , flags , cfg ) \
564
+ #define SET_KEX_LDFLAGS (intf , ld , flags , cfg ) \
546
565
rvu_write64(rvu, blkaddr, \
547
566
NPC_AF_INTFX_LDATAX_FLAGSX_CFG(intf, ld, flags), cfg)
548
567
568
+ #define KEX_LD_CFG (bytesm1 , hdr_ofs , ena , flags_ena , key_ofs ) \
569
+ (((bytesm1) << 16) | ((hdr_ofs) << 8) | ((ena) << 7) | \
570
+ ((flags_ena) << 6) | ((key_ofs) & 0x3F))
571
+
549
572
static void npc_config_ldata_extract (struct rvu * rvu , int blkaddr )
550
573
{
551
574
struct npc_mcam * mcam = & rvu -> hw -> mcam ;
@@ -561,28 +584,66 @@ static void npc_config_ldata_extract(struct rvu *rvu, int blkaddr)
561
584
*/
562
585
for (lid = 0 ; lid < lid_count ; lid ++ ) {
563
586
for (ltype = 0 ; ltype < 16 ; ltype ++ ) {
564
- LDATA_EXTRACT_CONFIG (NIX_INTF_RX , lid , ltype , 0 , 0ULL );
565
- LDATA_EXTRACT_CONFIG (NIX_INTF_RX , lid , ltype , 1 , 0ULL );
566
- LDATA_EXTRACT_CONFIG (NIX_INTF_TX , lid , ltype , 0 , 0ULL );
567
- LDATA_EXTRACT_CONFIG (NIX_INTF_TX , lid , ltype , 1 , 0ULL );
568
-
569
- LDATA_FLAGS_CONFIG (NIX_INTF_RX , 0 , ltype , 0ULL );
570
- LDATA_FLAGS_CONFIG (NIX_INTF_RX , 1 , ltype , 0ULL );
571
- LDATA_FLAGS_CONFIG (NIX_INTF_TX , 0 , ltype , 0ULL );
572
- LDATA_FLAGS_CONFIG (NIX_INTF_TX , 1 , ltype , 0ULL );
587
+ SET_KEX_LD (NIX_INTF_RX , lid , ltype , 0 , 0ULL );
588
+ SET_KEX_LD (NIX_INTF_RX , lid , ltype , 1 , 0ULL );
589
+ SET_KEX_LD (NIX_INTF_TX , lid , ltype , 0 , 0ULL );
590
+ SET_KEX_LD (NIX_INTF_TX , lid , ltype , 1 , 0ULL );
591
+
592
+ SET_KEX_LDFLAGS (NIX_INTF_RX , 0 , ltype , 0ULL );
593
+ SET_KEX_LDFLAGS (NIX_INTF_RX , 1 , ltype , 0ULL );
594
+ SET_KEX_LDFLAGS (NIX_INTF_TX , 0 , ltype , 0ULL );
595
+ SET_KEX_LDFLAGS (NIX_INTF_TX , 1 , ltype , 0ULL );
573
596
}
574
597
}
575
598
576
- /* If we plan to extract Outer IPv4 tuple for TCP/UDP pkts
577
- * then 112bit key is not sufficient
578
- */
579
599
if (mcam -> keysize != NPC_MCAM_KEY_X2 )
580
600
return ;
581
601
582
- /* Start placing extracted data/flags from 64bit onwards, for now */
583
- /* Extract DMAC from the packet */
584
- cfg = (0x05 << 16 ) | BIT_ULL (7 ) | NPC_PARSE_RESULT_DMAC_OFFSET ;
585
- LDATA_EXTRACT_CONFIG (NIX_INTF_RX , NPC_LID_LA , NPC_LT_LA_ETHER , 0 , cfg );
602
+ /* Default MCAM KEX profile */
603
+ /* Layer A: Ethernet: */
604
+
605
+ /* DMAC: 6 bytes, KW1[47:0] */
606
+ cfg = KEX_LD_CFG (0x05 , 0x0 , 0x1 , 0x0 , NPC_PARSE_RESULT_DMAC_OFFSET );
607
+ SET_KEX_LD (NIX_INTF_RX , NPC_LID_LA , NPC_LT_LA_ETHER , 0 , cfg );
608
+
609
+ /* Ethertype: 2 bytes, KW0[47:32] */
610
+ cfg = KEX_LD_CFG (0x01 , 0xc , 0x1 , 0x0 , 0x4 );
611
+ SET_KEX_LD (NIX_INTF_RX , NPC_LID_LA , NPC_LT_LA_ETHER , 1 , cfg );
612
+
613
+ /* Layer B: Single VLAN (CTAG) */
614
+ /* CTAG VLAN[2..3] + Ethertype, 4 bytes, KW0[63:32] */
615
+ cfg = KEX_LD_CFG (0x03 , 0x0 , 0x1 , 0x0 , 0x4 );
616
+ SET_KEX_LD (NIX_INTF_RX , NPC_LID_LB , NPC_LT_LB_CTAG , 0 , cfg );
617
+
618
+ /* Layer B: Stacked VLAN (STAG|QinQ) */
619
+ /* CTAG VLAN[2..3] + Ethertype, 4 bytes, KW0[63:32] */
620
+ cfg = KEX_LD_CFG (0x03 , 0x4 , 0x1 , 0x0 , 0x4 );
621
+ SET_KEX_LD (NIX_INTF_RX , NPC_LID_LB , NPC_LT_LB_STAG , 0 , cfg );
622
+ SET_KEX_LD (NIX_INTF_RX , NPC_LID_LB , NPC_LT_LB_QINQ , 0 , cfg );
623
+
624
+ /* Layer C: IPv4 */
625
+ /* SIP+DIP: 8 bytes, KW2[63:0] */
626
+ cfg = KEX_LD_CFG (0x07 , 0xc , 0x1 , 0x0 , 0x10 );
627
+ SET_KEX_LD (NIX_INTF_RX , NPC_LID_LC , NPC_LT_LC_IP , 0 , cfg );
628
+ /* TOS: 1 byte, KW1[63:56] */
629
+ cfg = KEX_LD_CFG (0x0 , 0x1 , 0x1 , 0x0 , 0xf );
630
+ SET_KEX_LD (NIX_INTF_RX , NPC_LID_LC , NPC_LT_LC_IP , 1 , cfg );
631
+
632
+ /* Layer D:UDP */
633
+ /* SPORT: 2 bytes, KW3[15:0] */
634
+ cfg = KEX_LD_CFG (0x1 , 0x0 , 0x1 , 0x0 , 0x18 );
635
+ SET_KEX_LD (NIX_INTF_RX , NPC_LID_LD , NPC_LT_LD_UDP , 0 , cfg );
636
+ /* DPORT: 2 bytes, KW3[31:16] */
637
+ cfg = KEX_LD_CFG (0x1 , 0x2 , 0x1 , 0x0 , 0x1a );
638
+ SET_KEX_LD (NIX_INTF_RX , NPC_LID_LD , NPC_LT_LD_UDP , 1 , cfg );
639
+
640
+ /* Layer D:TCP */
641
+ /* SPORT: 2 bytes, KW3[15:0] */
642
+ cfg = KEX_LD_CFG (0x1 , 0x0 , 0x1 , 0x0 , 0x18 );
643
+ SET_KEX_LD (NIX_INTF_RX , NPC_LID_LD , NPC_LT_LD_TCP , 0 , cfg );
644
+ /* DPORT: 2 bytes, KW3[31:16] */
645
+ cfg = KEX_LD_CFG (0x1 , 0x2 , 0x1 , 0x0 , 0x1a );
646
+ SET_KEX_LD (NIX_INTF_RX , NPC_LID_LD , NPC_LT_LD_TCP , 1 , cfg );
586
647
}
587
648
588
649
static void npc_config_kpuaction (struct rvu * rvu , int blkaddr ,
@@ -898,13 +959,12 @@ int rvu_npc_init(struct rvu *rvu)
898
959
BIT_ULL (6 ) | BIT_ULL (2 ));
899
960
900
961
/* Set RX and TX side MCAM search key size.
901
- * Also enable parse key extract nibbles suchthat except
902
- * layer E to H, rest of the key is included for MCAM search.
962
+ * LA..LD (ltype only) + Channel
903
963
*/
904
964
rvu_write64 (rvu , blkaddr , NPC_AF_INTFX_KEX_CFG (NIX_INTF_RX ),
905
- ((keyz & 0x3 ) << 32 ) | (( 1ULL << 20 ) - 1 ) );
965
+ ((keyz & 0x3 ) << 32 ) | 0x49247 );
906
966
rvu_write64 (rvu , blkaddr , NPC_AF_INTFX_KEX_CFG (NIX_INTF_TX ),
907
- ((keyz & 0x3 ) << 32 ) | ((1ULL << 20 ) - 1 ));
967
+ ((keyz & 0x3 ) << 32 ) | ((1ULL << 19 ) - 1 ));
908
968
909
969
err = npc_mcam_rsrcs_init (rvu , blkaddr );
910
970
if (err )
@@ -1876,3 +1936,48 @@ int rvu_mbox_handler_npc_mcam_alloc_and_write_entry(struct rvu *rvu,
1876
1936
1877
1937
return 0 ;
1878
1938
}
1939
+
1940
+ #define GET_KEX_CFG (intf ) \
1941
+ rvu_read64(rvu, BLKADDR_NPC, NPC_AF_INTFX_KEX_CFG(intf))
1942
+
1943
+ #define GET_KEX_FLAGS (ld ) \
1944
+ rvu_read64(rvu, BLKADDR_NPC, NPC_AF_KEX_LDATAX_FLAGS_CFG(ld))
1945
+
1946
+ #define GET_KEX_LD (intf , lid , lt , ld ) \
1947
+ rvu_read64(rvu, BLKADDR_NPC, \
1948
+ NPC_AF_INTFX_LIDX_LTX_LDX_CFG(intf, lid, lt, ld))
1949
+
1950
+ #define GET_KEX_LDFLAGS (intf , ld , fl ) \
1951
+ rvu_read64(rvu, BLKADDR_NPC, \
1952
+ NPC_AF_INTFX_LDATAX_FLAGSX_CFG(intf, ld, fl))
1953
+
1954
+ int rvu_mbox_handler_npc_get_kex_cfg (struct rvu * rvu , struct msg_req * req ,
1955
+ struct npc_get_kex_cfg_rsp * rsp )
1956
+ {
1957
+ int lid , lt , ld , fl ;
1958
+
1959
+ rsp -> rx_keyx_cfg = GET_KEX_CFG (NIX_INTF_RX );
1960
+ rsp -> tx_keyx_cfg = GET_KEX_CFG (NIX_INTF_TX );
1961
+ for (lid = 0 ; lid < NPC_MAX_LID ; lid ++ ) {
1962
+ for (lt = 0 ; lt < NPC_MAX_LT ; lt ++ ) {
1963
+ for (ld = 0 ; ld < NPC_MAX_LD ; ld ++ ) {
1964
+ rsp -> intf_lid_lt_ld [NIX_INTF_RX ][lid ][lt ][ld ] =
1965
+ GET_KEX_LD (NIX_INTF_RX , lid , lt , ld );
1966
+ rsp -> intf_lid_lt_ld [NIX_INTF_TX ][lid ][lt ][ld ] =
1967
+ GET_KEX_LD (NIX_INTF_TX , lid , lt , ld );
1968
+ }
1969
+ }
1970
+ }
1971
+ for (ld = 0 ; ld < NPC_MAX_LD ; ld ++ )
1972
+ rsp -> kex_ld_flags [ld ] = GET_KEX_FLAGS (ld );
1973
+
1974
+ for (ld = 0 ; ld < NPC_MAX_LD ; ld ++ ) {
1975
+ for (fl = 0 ; fl < NPC_MAX_LFL ; fl ++ ) {
1976
+ rsp -> intf_ld_flags [NIX_INTF_RX ][ld ][fl ] =
1977
+ GET_KEX_LDFLAGS (NIX_INTF_RX , ld , fl );
1978
+ rsp -> intf_ld_flags [NIX_INTF_TX ][ld ][fl ] =
1979
+ GET_KEX_LDFLAGS (NIX_INTF_TX , ld , fl );
1980
+ }
1981
+ }
1982
+ return 0 ;
1983
+ }
0 commit comments