Provide devarg option to configure RXC time granularity
for reassembly handling.

It will be set as rxc_step=<val> for nix device.
e.g.: 0002:02:00.0,rxc_step=10000

Signed-off-by: Rahul Bhansali <[email protected]>
---
 doc/guides/nics/cnxk.rst               | 14 ++++++++++++++
 drivers/net/cnxk/cn20k_ethdev.c        |  1 +
 drivers/net/cnxk/cnxk_ethdev_devargs.c | 26 +++++++++++++++++++++++++-
 3 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/doc/guides/nics/cnxk.rst b/doc/guides/nics/cnxk.rst
index 9e758a1b5e..c43c70b275 100644
--- a/doc/guides/nics/cnxk.rst
+++ b/doc/guides/nics/cnxk.rst
@@ -494,6 +494,20 @@ Runtime Config Options
 
       -a 0002:02:00.0,disable_xqe_drop=1
 
+- ``Configure RXC time step`` (default ``1000``)
+
+   RXC time step/granularity for reassembly can be specified by
+   ``rxc_step`` ``devargs`` parameter.
+
+   For example::
+
+      -a 0002:02:00.0,rxc_step=10000
+
+   With the above configuration, reassembly time step will be set to 10000
+   microseconds. Default RXC time step will be set to 1000 microseconds
+   when reassembly is configured.
+   It will be used for OCTEON CN20K SoC family.
+
 .. note::
 
    Above devarg parameters are configurable per device, user needs to pass the
diff --git a/drivers/net/cnxk/cn20k_ethdev.c b/drivers/net/cnxk/cn20k_ethdev.c
index 4a3d163c75..f08079f612 100644
--- a/drivers/net/cnxk/cn20k_ethdev.c
+++ b/drivers/net/cnxk/cn20k_ethdev.c
@@ -705,6 +705,7 @@ cn20k_nix_reassembly_conf_set(struct rte_eth_dev *eth_dev,
                }
        }
 
+       rxc_time_cfg.step = dev->nix.rxc_step;
        rc = roc_nix_reassembly_configure(&rxc_time_cfg, conf->timeout_ms);
        if (rc) {
                plt_err("Nix reassembly_configure failed rc=%d", rc);
diff --git a/drivers/net/cnxk/cnxk_ethdev_devargs.c 
b/drivers/net/cnxk/cnxk_ethdev_devargs.c
index 68e6b1d190..da8fc83f9d 100644
--- a/drivers/net/cnxk/cnxk_ethdev_devargs.c
+++ b/drivers/net/cnxk/cnxk_ethdev_devargs.c
@@ -64,6 +64,25 @@ parse_ipsec_in_spi_range(const char *key, const char *value, 
void *extra_args)
        return 0;
 }
 
+static int
+parse_rxc_step(const char *key, const char *value, void *extra_args)
+{
+       RTE_SET_USED(key);
+       uint32_t val;
+
+       errno = 0;
+       val = strtoul(value, NULL, 0);
+       if (errno)
+               return -EINVAL;
+
+       if (val > ROC_NIX_INL_REAS_STEP_MAX)
+               return -EINVAL;
+
+       *(uint32_t *)extra_args = val;
+
+       return 0;
+}
+
 static int
 parse_ipsec_out_max_sa(const char *key, const char *value, void *extra_args)
 {
@@ -283,6 +302,7 @@ parse_val_u16(const char *key, const char *value, void 
*extra_args)
 #define CNXK_CUSTOM_INB_SA       "custom_inb_sa"
 #define CNXK_FORCE_TAIL_DROP     "force_tail_drop"
 #define CNXK_DIS_XQE_DROP        "disable_xqe_drop"
+#define CNXK_RXC_STEP            "rxc_step"
 
 int
 cnxk_ethdev_parse_devargs(struct rte_devargs *devargs, struct cnxk_eth_dev 
*dev)
@@ -314,6 +334,7 @@ cnxk_ethdev_parse_devargs(struct rte_devargs *devargs, 
struct cnxk_eth_dev *dev)
        uint16_t lock_rx_ctx = 0;
        uint16_t rx_inj_ena = 0;
        uint16_t no_inl_dev = 0;
+       uint32_t rxc_step = 0;
 
        memset(&sdp_chan, 0, sizeof(sdp_chan));
        memset(&pre_l2_info, 0, sizeof(struct flow_pre_l2_size_info));
@@ -370,6 +391,7 @@ cnxk_ethdev_parse_devargs(struct rte_devargs *devargs, 
struct cnxk_eth_dev *dev)
        rte_kvargs_process(kvlist, CNXK_CUSTOM_INB_SA, &parse_flag, 
&custom_inb_sa);
        rte_kvargs_process(kvlist, CNXK_FORCE_TAIL_DROP, &parse_flag, 
&force_tail_drop);
        rte_kvargs_process(kvlist, CNXK_DIS_XQE_DROP, &parse_flag, 
&dis_xqe_drop);
+       rte_kvargs_process(kvlist, CNXK_RXC_STEP, &parse_rxc_step, &rxc_step);
        rte_kvargs_free(kvlist);
 
 null_devargs:
@@ -413,6 +435,7 @@ cnxk_ethdev_parse_devargs(struct rte_devargs *devargs, 
struct cnxk_eth_dev *dev)
                dev->nix.rx_inj_ena = rx_inj_ena;
        dev->nix.force_tail_drop = force_tail_drop;
        dev->nix.dis_xqe_drop = !!dis_xqe_drop;
+       dev->nix.rxc_step = rxc_step;
        return 0;
 exit:
        return -EINVAL;
@@ -439,4 +462,5 @@ RTE_PMD_REGISTER_PARAM_STRING(net_cnxk,
                              CNXK_NIX_RX_INJ_ENABLE "=1"
                              CNXK_CUSTOM_META_AURA_DIS "=1"
                              CNXK_FORCE_TAIL_DROP "=1"
-                             CNXK_DIS_XQE_DROP "=1");
+                             CNXK_DIS_XQE_DROP "=1"
+                             CNXK_RXC_STEP "=<0-1048575>");
-- 
2.34.1

Reply via email to