Skip to content

Commit 631e70b

Browse files
Santosh Shukladavem330
authored andcommitted
octeontx2-af: Add MKEX default profile
Added basic default MKEX profile. This profile tells hardware what data to extract from packet and where to place it (bit offset) in final KEY generated for the parsed packet. Based on the bit placement of the packet data, MCAM entries have to programmed for matching. Also added a msg to retrieve this MKEX profile from PF/VF which inturn can process it to determine how MCAM entry has to be populated. Signed-off-by: Santosh Shukla <[email protected]> Signed-off-by: Yuri Tolstov <[email protected]> Signed-off-by: Sunil Goutham <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 63be91c commit 631e70b

File tree

3 files changed

+151
-25
lines changed

3 files changed

+151
-25
lines changed

drivers/net/ethernet/marvell/octeontx2/af/mbox.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ M(NPC_MCAM_COUNTER_STATS, 0x600a, npc_mcam_counter_stats, \
176176
M(NPC_MCAM_ALLOC_AND_WRITE_ENTRY, 0x600b, npc_mcam_alloc_and_write_entry, \
177177
npc_mcam_alloc_and_write_entry_req, \
178178
npc_mcam_alloc_and_write_entry_rsp) \
179+
M(NPC_GET_KEX_CFG, 0x600c, npc_get_kex_cfg, \
180+
msg_req, npc_get_kex_cfg_rsp) \
179181
/* NIX mbox IDs (range 0x8000 - 0xFFFF) */ \
180182
M(NIX_LF_ALLOC, 0x8000, nix_lf_alloc, \
181183
nix_lf_alloc_req, nix_lf_alloc_rsp) \
@@ -699,4 +701,21 @@ struct npc_mcam_alloc_and_write_entry_rsp {
699701
u16 cntr;
700702
};
701703

704+
struct npc_get_kex_cfg_rsp {
705+
struct mbox_msghdr hdr;
706+
u64 rx_keyx_cfg; /* NPC_AF_INTF(0)_KEX_CFG */
707+
u64 tx_keyx_cfg; /* NPC_AF_INTF(1)_KEX_CFG */
708+
#define NPC_MAX_INTF 2
709+
#define NPC_MAX_LID 8
710+
#define NPC_MAX_LT 16
711+
#define NPC_MAX_LD 2
712+
#define NPC_MAX_LFL 16
713+
/* NPC_AF_KEX_LDATA(0..1)_FLAGS_CFG */
714+
u64 kex_ld_flags[NPC_MAX_LD];
715+
/* NPC_AF_INTF(0..1)_LID(0..7)_LT(0..15)_LD(0..1)_CFG */
716+
u64 intf_lid_lt_ld[NPC_MAX_INTF][NPC_MAX_LID][NPC_MAX_LT][NPC_MAX_LD];
717+
/* NPC_AF_INTF(0..1)_LDATA(0..1)_FLAGS(0..15)_CFG */
718+
u64 intf_ld_flags[NPC_MAX_INTF][NPC_MAX_LD][NPC_MAX_LFL];
719+
};
720+
702721
#endif /* MBOX_H */

drivers/net/ethernet/marvell/octeontx2/af/rvu.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,4 +415,6 @@ int rvu_mbox_handler_npc_mcam_counter_stats(struct rvu *rvu,
415415
int rvu_mbox_handler_npc_mcam_alloc_and_write_entry(struct rvu *rvu,
416416
struct npc_mcam_alloc_and_write_entry_req *req,
417417
struct npc_mcam_alloc_and_write_entry_rsp *rsp);
418+
int rvu_mbox_handler_npc_get_kex_cfg(struct rvu *rvu, struct msg_req *req,
419+
struct npc_get_kex_cfg_rsp *rsp);
418420
#endif /* RVU_H */

drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c

Lines changed: 130 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -427,9 +427,28 @@ void rvu_npc_install_bcast_match_entry(struct rvu *rvu, u16 pcifunc,
427427
index = npc_get_nixlf_mcam_index(mcam, pcifunc,
428428
nixlf, NIXLF_BCAST_ENTRY);
429429

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);
433452

434453
*(u64 *)&action = 0x00;
435454
#ifdef MCAST_MCE
@@ -538,14 +557,18 @@ void rvu_npc_disable_mcam_entries(struct rvu *rvu, u16 pcifunc, int nixlf)
538557
}
539558
}
540559

541-
#define LDATA_EXTRACT_CONFIG(intf, lid, ltype, ld, cfg) \
560+
#define SET_KEX_LD(intf, lid, ltype, ld, cfg) \
542561
rvu_write64(rvu, blkaddr, \
543562
NPC_AF_INTFX_LIDX_LTX_LDX_CFG(intf, lid, ltype, ld), cfg)
544563

545-
#define LDATA_FLAGS_CONFIG(intf, ld, flags, cfg) \
564+
#define SET_KEX_LDFLAGS(intf, ld, flags, cfg) \
546565
rvu_write64(rvu, blkaddr, \
547566
NPC_AF_INTFX_LDATAX_FLAGSX_CFG(intf, ld, flags), cfg)
548567

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+
549572
static void npc_config_ldata_extract(struct rvu *rvu, int blkaddr)
550573
{
551574
struct npc_mcam *mcam = &rvu->hw->mcam;
@@ -561,28 +584,66 @@ static void npc_config_ldata_extract(struct rvu *rvu, int blkaddr)
561584
*/
562585
for (lid = 0; lid < lid_count; lid++) {
563586
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);
573596
}
574597
}
575598

576-
/* If we plan to extract Outer IPv4 tuple for TCP/UDP pkts
577-
* then 112bit key is not sufficient
578-
*/
579599
if (mcam->keysize != NPC_MCAM_KEY_X2)
580600
return;
581601

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);
586647
}
587648

588649
static void npc_config_kpuaction(struct rvu *rvu, int blkaddr,
@@ -898,13 +959,12 @@ int rvu_npc_init(struct rvu *rvu)
898959
BIT_ULL(6) | BIT_ULL(2));
899960

900961
/* 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
903963
*/
904964
rvu_write64(rvu, blkaddr, NPC_AF_INTFX_KEX_CFG(NIX_INTF_RX),
905-
((keyz & 0x3) << 32) | ((1ULL << 20) - 1));
965+
((keyz & 0x3) << 32) | 0x49247);
906966
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));
908968

909969
err = npc_mcam_rsrcs_init(rvu, blkaddr);
910970
if (err)
@@ -1876,3 +1936,48 @@ int rvu_mbox_handler_npc_mcam_alloc_and_write_entry(struct rvu *rvu,
18761936

18771937
return 0;
18781938
}
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

Comments
 (0)