net/bnxt: support internal exact match flows
authorKishore Padmanabha <kishore.padmanabha@broadcom.com>
Fri, 12 Jun 2020 12:50:21 +0000 (18:20 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 30 Jun 2020 12:52:30 +0000 (14:52 +0200)
Added support of internal exact match flows and the action
mark is supported for these flows.

Signed-off-by: Kishore Padmanabha <kishore.padmanabha@broadcom.com>
Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Mike Baucom <michael.baucom@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
drivers/net/bnxt/bnxt.h
drivers/net/bnxt/bnxt_rxr.c
drivers/net/bnxt/tf_ulp/bnxt_ulp.c
drivers/net/bnxt/tf_ulp/ulp_mapper.c

index 79e9b28..d455f8d 100644 (file)
@@ -562,6 +562,7 @@ struct bnxt {
 #define BNXT_FLAG_FLOW_XSTATS_EN               BIT(25)
 #define BNXT_FLAG_DFLT_MAC_SET                 BIT(26)
 #define BNXT_FLAG_TRUFLOW_EN                   BIT(27)
+#define BNXT_FLAG_GFID_ENABLE                  BIT(28)
 #define BNXT_PF(bp)            (!((bp)->flags & BNXT_FLAG_VF))
 #define BNXT_VF(bp)            ((bp)->flags & BNXT_FLAG_VF)
 #define BNXT_NPAR(bp)          ((bp)->flags & BNXT_FLAG_NPAR_PF)
@@ -577,6 +578,7 @@ struct bnxt {
 #define BNXT_FLOW_XSTATS_EN(bp)        ((bp)->flags & BNXT_FLAG_FLOW_XSTATS_EN)
 #define BNXT_HAS_DFLT_MAC_SET(bp)      ((bp)->flags & BNXT_FLAG_DFLT_MAC_SET)
 #define BNXT_TRUFLOW_EN(bp)    ((bp)->flags & BNXT_FLAG_TRUFLOW_EN)
+#define BNXT_GFID_ENABLED(bp)  ((bp)->flags & BNXT_FLAG_GFID_ENABLE)
 
        uint32_t                fw_cap;
 #define BNXT_FW_CAP_HOT_RESET          BIT(0)
index 91ff729..9a5ac39 100644 (file)
@@ -412,8 +412,13 @@ bnxt_ulp_set_mark_in_mbuf(struct bnxt *bp, struct rx_pkt_cmpl_hi *rxcmp1,
        bool gfid = false;
        uint32_t mark_id;
        uint32_t flags2;
+       uint32_t gfid_support = 0;
        int rc;
 
+
+       if (BNXT_GFID_ENABLED(bp))
+               gfid_support = 1;
+
        cfa_code = rte_le_to_cpu_16(rxcmp1->cfa_code);
        flags2 = rte_le_to_cpu_32(rxcmp1->flags2);
        meta = rte_le_to_cpu_32(rxcmp1->metadata);
@@ -427,8 +432,14 @@ bnxt_ulp_set_mark_in_mbuf(struct bnxt *bp, struct rx_pkt_cmpl_hi *rxcmp1,
 
        switch (meta_fmt) {
        case 0:
-               /* Not an LFID or GFID, a flush cmd. */
-               goto skip_mark;
+               if (gfid_support) {
+                       /* Not an LFID or GFID, a flush cmd. */
+                       goto skip_mark;
+               } else {
+                       /* LFID mode, no vlan scenario */
+                       gfid = false;
+               }
+               break;
        case 4:
        case 5:
                /*
@@ -437,13 +448,19 @@ bnxt_ulp_set_mark_in_mbuf(struct bnxt *bp, struct rx_pkt_cmpl_hi *rxcmp1,
                 * collisions with EEM.  Simply return without setting the mark
                 * in the mbuf.
                 */
-               if (BNXT_CFA_META_EM_TEST(meta))
-                       goto skip_mark;
-               /*
-                * It is a TCAM entry, so it is an LFID. The TCAM IDX and Mode
-                * can also be determined by decoding the meta_data.  We are not
-                * using these for now.
-                */
+               if (BNXT_CFA_META_EM_TEST(meta)) {
+                       /*This is EM hit {EM(1), GFID[27:16], 19'd0 or vtag } */
+                       gfid = true;
+                       meta >>= BNXT_RX_META_CFA_CODE_SHIFT;
+                       cfa_code |= meta << BNXT_CFA_CODE_META_SHIFT;
+               } else {
+                       /*
+                        * It is a TCAM entry, so it is an LFID.
+                        * The TCAM IDX and Mode can also be determined
+                        * by decoding the meta_data. We are not
+                        * using these for now.
+                        */
+               }
                break;
        case 6:
        case 7:
index 10183ac..fd3f61b 100644 (file)
@@ -308,6 +308,32 @@ ulp_dparms_init(struct bnxt *bp,
        return 0;
 }
 
+/* The function to initialize bp flags with truflow features */
+static int32_t
+ulp_dparms_dev_port_intf_update(struct bnxt *bp,
+                               struct bnxt_ulp_context *ulp_ctx)
+{
+       struct bnxt_ulp_device_params *dparms;
+       uint32_t dev_id;
+
+       if (bnxt_ulp_cntxt_dev_id_get(ulp_ctx, &dev_id)) {
+               BNXT_TF_DBG(DEBUG, "Failed to get device id\n");
+               return -EINVAL;
+       }
+
+       dparms = bnxt_ulp_device_params_get(dev_id);
+       if (!dparms) {
+               BNXT_TF_DBG(DEBUG, "Failed to get device parms\n");
+               return -EINVAL;
+       }
+
+       /* Update the bp flag with gfid flag */
+       if (dparms->global_fid_enable)
+               bp->flags |= BNXT_FLAG_GFID_ENABLE;
+
+       return 0;
+}
+
 static int32_t
 ulp_ctx_attach(struct bnxt_ulp_context *ulp_ctx,
               struct bnxt_ulp_session_state *session)
@@ -510,6 +536,17 @@ bnxt_ulp_init(struct bnxt *bp)
                        rte_free(bp->ulp_ctx);
                        return rc;
                }
+
+               /* Update bnxt driver flags */
+               rc = ulp_dparms_dev_port_intf_update(bp, bp->ulp_ctx);
+               if (rc) {
+                       BNXT_TF_DBG(ERR, "Failed to update driver flags\n");
+                       ulp_ctx_detach(bp, session);
+                       ulp_session_deinit(session);
+                       rte_free(bp->ulp_ctx);
+                       return rc;
+               }
+
                /* update the port database */
                rc = ulp_port_db_dev_port_intf_update(bp->ulp_ctx, bp);
                if (rc) {
@@ -539,6 +576,13 @@ bnxt_ulp_init(struct bnxt *bp)
                goto jump_to_error;
        }
 
+       /* Update bnxt driver flags */
+       rc = ulp_dparms_dev_port_intf_update(bp, bp->ulp_ctx);
+       if (rc) {
+               BNXT_TF_DBG(ERR, "Failed to update driver flags\n");
+               goto jump_to_error;
+       }
+
        /* update the port database */
        rc = ulp_port_db_dev_port_intf_update(bp->ulp_ctx, bp);
        if (rc) {
index 33461dc..9662fde 100644 (file)
@@ -804,7 +804,7 @@ ulp_mapper_keymask_field_process(struct bnxt_ulp_mapper_parms *parms,
                }
                break;
        case BNXT_ULP_MAPPER_OPC_SET_TO_ZERO:
-               if (!ulp_blob_pad_push(blob, bitlen)) {
+               if (ulp_blob_pad_push(blob, bitlen) < 0) {
                        BNXT_TF_DBG(ERR, "%s pad too large for blob\n", name);
                        return -EINVAL;
                }
@@ -1284,6 +1284,13 @@ ulp_mapper_em_tbl_process(struct bnxt_ulp_mapper_parms *parms,
                        return rc;
                }
        }
+#ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG
+       ulp_mapper_result_dump("EEM Result", tbl, &data);
+#endif
+
+       /* do the transpose for the internal EM keys */
+       if (tbl->resource_type == TF_MEM_INTERNAL)
+               ulp_blob_perform_byte_reverse(&key);
 
        rc = bnxt_ulp_cntxt_tbl_scope_id_get(parms->ulp_ctx,
                                             &iparms.tbl_scope_id);