Currently, testpmd support in ULP is enabled only during compilation
time. This patch adds support for testpmd during runtime using
devarg "testpmd".

Signed-off-by: Venkat Duvvuru <venkatkumar.duvv...@broadcom.com>
Reviewed-by: Kishore Padmanabha <kishore.padmana...@broadcom.com>
---
 drivers/net/bnxt/bnxt.h                 |  3 ++
 drivers/net/bnxt/bnxt_ethdev.c          | 56 +++++++++++++++++++++++++
 drivers/net/bnxt/tf_ulp/bnxt_ulp.c      |  5 +++
 drivers/net/bnxt/tf_ulp/ulp_def_rules.c |  4 +-
 4 files changed, 67 insertions(+), 1 deletion(-)

diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index 494a1eff37..c9adc66fda 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -722,6 +722,9 @@ struct bnxt {
        ((bp)->flags2 & BNXT_FLAGS2_PTP_TIMESYNC_ENABLED)
 #define        BNXT_ACCUM_STATS_EN(bp)                 \
        ((bp)->flags2 & BNXT_FLAGS2_ACCUM_STATS_EN)
+#define        BNXT_FLAGS2_TESTPMD_EN                  BIT(3)
+#define        BNXT_TESTPMD_EN(bp)                     \
+       ((bp)->flags2 & BNXT_FLAGS2_TESTPMD_EN)
 
        uint16_t                chip_num;
 #define CHIP_NUM_58818         0xd818
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index de34a2f0bb..20c5b12b53 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -98,6 +98,7 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
 #define BNXT_DEVARG_REP_FC_R2F  "rep-fc-r2f"
 #define BNXT_DEVARG_REP_FC_F2R  "rep-fc-f2r"
 #define BNXT_DEVARG_APP_ID     "app-id"
+#define        BNXT_DEVARG_TESTPMD     "testpmd"
 
 static const char *const bnxt_dev_args[] = {
        BNXT_DEVARG_REPRESENTOR,
@@ -111,9 +112,17 @@ static const char *const bnxt_dev_args[] = {
        BNXT_DEVARG_REP_FC_R2F,
        BNXT_DEVARG_REP_FC_F2R,
        BNXT_DEVARG_APP_ID,
+       BNXT_DEVARG_TESTPMD,
        NULL
 };
 
+/*
+ * testpmd == false to disable
+ * testpmd == true to enable
+ */
+#define        BNXT_DEVARG_TESTPMD_INVALID(truflow)            ((testpmd) > 1)
+
+
 /*
  * accum-stats == false to disable flow counter accumulation
  * accum-stats == true to enable flow counter accumulation
@@ -5853,6 +5862,44 @@ bnxt_parse_devarg_rep_fc_f2r(__rte_unused const char 
*key,
        return 0;
 }
 
+static int
+bnxt_parse_devarg_testpmd(__rte_unused const char *key,
+                         const char *value, void *opaque_arg)
+{
+       struct bnxt *bp = opaque_arg;
+       unsigned long testpmd;
+       char *end = NULL;
+
+       if (!value || !opaque_arg) {
+               PMD_DRV_LOG(ERR,
+                           "Invalid parameter passed to testpmd devargs.\n");
+               return -EINVAL;
+       }
+
+       testpmd = strtoul(value, &end, 10);
+       if (end == NULL || *end != '\0' ||
+           (testpmd == ULONG_MAX && errno == ERANGE)) {
+               PMD_DRV_LOG(ERR,
+                           "Invalid parameter passed to testpmd devargs.\n");
+               return -EINVAL;
+       }
+
+       if (BNXT_DEVARG_TESTPMD_INVALID(testpmd)) {
+               PMD_DRV_LOG(ERR,
+                           "Invalid value passed to testpmd devargs.\n");
+               return -EINVAL;
+       }
+
+       if (testpmd) {
+               bp->flags2 |= BNXT_FLAGS2_TESTPMD_EN;
+               PMD_DRV_LOG(INFO, "Host-based testpmd feature enabled.\n");
+       } else {
+               bp->flags2 &= ~BNXT_FLAGS2_TESTPMD_EN;
+               PMD_DRV_LOG(INFO, "Host-based testpmd feature disabled.\n");
+       }
+
+       return 0;
+}
 static int
 bnxt_parse_dev_args(struct bnxt *bp, struct rte_devargs *devargs)
 {
@@ -5890,6 +5937,15 @@ bnxt_parse_dev_args(struct bnxt *bp, struct rte_devargs 
*devargs)
        if (ret)
                goto err;
 
+       /*
+        * Handler for "testpmd" devarg.
+        * Invoked as for ex: "-a 0000:00:0d.0,testpmd=1"
+        */
+       ret = rte_kvargs_process(kvlist, BNXT_DEVARG_TESTPMD,
+                                bnxt_parse_devarg_testpmd, bp);
+       if (ret)
+               goto err;
+
 err:
        /*
         * Handler for "app-id" devarg.
diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c 
b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
index 3b86410fb1..2ad662fb17 100644
--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
@@ -844,6 +844,11 @@ ulp_ctx_init(struct bnxt *bp,
                goto error_deinit;
        }
 
+       if (BNXT_TESTPMD_EN(bp)) {
+               ulp_data->ulp_flags &= ~BNXT_ULP_VF_REP_ENABLED;
+               BNXT_TF_DBG(ERR, "Enabled Testpmd forward mode\n");
+       }
+
        /*
         * Shared session must be created before first regular session but after
         * the ulp_ctx is valid.
diff --git a/drivers/net/bnxt/tf_ulp/ulp_def_rules.c 
b/drivers/net/bnxt/tf_ulp/ulp_def_rules.c
index d8336d164e..827fe30acd 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_def_rules.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_def_rules.c
@@ -526,8 +526,10 @@ bnxt_ulp_create_df_rules(struct bnxt *bp)
        rc = ulp_default_flow_db_cfa_action_get(bp->ulp_ctx,
                                                info->def_port_flow_id,
                                                &bp->tx_cfa_action);
-       if (rc)
+
+       if (rc || BNXT_TESTPMD_EN(bp))
                bp->tx_cfa_action = 0;
+
        info->valid = true;
        return 0;
 }
-- 
2.17.1

Reply via email to