octeontx2-af: Allow to configure flow tag LSB byte as RSS adder
authorJerin Jacob <jerinj@marvell.com>
Wed, 25 Aug 2021 12:18:39 +0000 (17:48 +0530)
committerDavid S. Miller <davem@davemloft.net>
Wed, 25 Aug 2021 12:39:01 +0000 (13:39 +0100)
Before C0 HW revision, The RSS adder was computed based the
following static formula.

rss_adder<7:0> = flow_tag<7:0> ^ flow_tag<15:8> ^
flow_tag<23:16> ^ flow_tag<31:24>

The above scheme has the following drawbacks:
1) It is not in line with other standard NIC behavior.
2) There can be an SW use case where SW can compute the hash
upfront using Toeplitz function and predict the queue selection
to optimize some packet lookup function. The nonstandard
way of doing XOR makes the consumer to not predict the queue selection.

C0 HW revision onwards, The HW can configure the
rss_adder<7:0> as flow_tag<7:0> to align with standard NICs.

This patch adds an option to select legacy RSS adder mode
vs standard NIC behavior by setting NIX_LF_RSS_TAG_LSB_AS_ADDER flag.

Since this bit field is used as reserved in old HW revisions,
No need to have an additional HW version check.

Signed-off-by: Jerin Jacob <jerinj@marvell.com>
Signed-off-by: Sunil Goutham <sgoutham@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/octeontx2/af/mbox.h
drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c

index 5ffb6b6..8ee9504 100644 (file)
@@ -704,6 +704,8 @@ struct nix_lf_alloc_req {
        u16 sso_func;
        u64 rx_cfg;   /* See NIX_AF_LF(0..127)_RX_CFG */
        u64 way_mask;
+#define NIX_LF_RSS_TAG_LSB_AS_ADDER BIT_ULL(0)
+       u64 flags;
 };
 
 struct nix_lf_alloc_rsp {
index 54d2dfa..a07d99a 100644 (file)
@@ -671,9 +671,10 @@ static void nix_ctx_free(struct rvu *rvu, struct rvu_pfvf *pfvf)
 static int nixlf_rss_ctx_init(struct rvu *rvu, int blkaddr,
                              struct rvu_pfvf *pfvf, int nixlf,
                              int rss_sz, int rss_grps, int hwctx_size,
-                             u64 way_mask)
+                             u64 way_mask, bool tag_lsb_as_adder)
 {
        int err, grp, num_indices;
+       u64 val;
 
        /* RSS is not requested for this NIXLF */
        if (!rss_sz)
@@ -689,10 +690,13 @@ static int nixlf_rss_ctx_init(struct rvu *rvu, int blkaddr,
                    (u64)pfvf->rss_ctx->iova);
 
        /* Config full RSS table size, enable RSS and caching */
-       rvu_write64(rvu, blkaddr, NIX_AF_LFX_RSS_CFG(nixlf),
-                   BIT_ULL(36) | BIT_ULL(4) |
-                   ilog2(num_indices / MAX_RSS_INDIR_TBL_SIZE) |
-                   way_mask << 20);
+       val = BIT_ULL(36) | BIT_ULL(4) | way_mask << 20 |
+                       ilog2(num_indices / MAX_RSS_INDIR_TBL_SIZE);
+
+       if (tag_lsb_as_adder)
+               val |= BIT_ULL(5);
+
+       rvu_write64(rvu, blkaddr, NIX_AF_LFX_RSS_CFG(nixlf), val);
        /* Config RSS group offset and sizes */
        for (grp = 0; grp < rss_grps; grp++)
                rvu_write64(rvu, blkaddr, NIX_AF_LFX_RSS_GRPX(nixlf, grp),
@@ -1241,7 +1245,8 @@ int rvu_mbox_handler_nix_lf_alloc(struct rvu *rvu,
        /* Initialize receive side scaling (RSS) */
        hwctx_size = 1UL << ((ctx_cfg >> 12) & 0xF);
        err = nixlf_rss_ctx_init(rvu, blkaddr, pfvf, nixlf, req->rss_sz,
-                                req->rss_grps, hwctx_size, req->way_mask);
+                                req->rss_grps, hwctx_size, req->way_mask,
+                                !!(req->flags & NIX_LF_RSS_TAG_LSB_AS_ADDER));
        if (err)
                goto free_mem;