[PATCH] net/mlx5: fix memleak for resource object

2024-06-23 Thread Mahmoud Maatuq
Coverity issue: 426424
Fixes: e78e5408da89 ("net/mlx5: remove cache term from the list utility")
Cc: ma...@nvidia.com

Signed-off-by: Mahmoud Maatuq 
---
 drivers/net/mlx5/mlx5_flow_dv.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index d46beffd4c..1010b8e423 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -12010,9 +12010,12 @@ flow_matcher_create_cb(void *tool_ctx, void *cb_ctx)
items = *((const struct rte_flow_item **)(ctx->data2));
resource->matcher_object = mlx5dr_bwc_matcher_create
(resource->group->tbl, resource->priority, 
items);
-   if (!(resource->matcher_object))
+   if (!(resource->matcher_object)) {
+   mlx5_free(resource);
return NULL;
+   }
 #else
+   mlx5_free(resource);
return NULL;
 #endif
}
-- 
2.43.0



RE: [PATCH v2 0/1] net/mlx5: fix incorrect rx/tx descriptor limitations in rte_eth_dev_info

2024-06-23 Thread Slava Ovsiienko
Hi, Igor

Thank you for the v2. The patch looks good to me,  please see my further 
comments below.

> > 1. The absolute max descriptor number supported by ConnectX hardware is
> 32768.
> > 2. The actual max descriptor number supported by the port (and its related
> representors)
> > reported in log_max_wq_sz in HCA.caps.  This value should be queried and
> save in mlx5_devx_cmd_query_hca_attr() routine.
> > 3. mlx5_rx_queue_pre_setup() should check requested descriptor number
> > and reject if it exceeds log_max_wq_sz
> 
> Thank you for the guidelines! I've also added the same check to
> mlx5_tx_queue_pre_setup(), I'm assuming log_max_wq_sz can be used for
> both RX and TX.
> 
> Is an `int` appropriate for `log_max_wq_sz`? Seems like a `uint8_t` is 
> sufficient,
> but I've left it an `int` for consistency with the other `log_max_*` values.

Right, uint8_t looks to be enough. No objection to optimize others to uint8_t.

> Also, I've noticed a similar issue with MTU, it is also reported as 65535 in
> `rte_eth_dev_info.max_mtu`. I'd like to send a separate patch to fix that too.
> What's the procedure for reading max supported MTU?

MTU is not reported directly by HCA. It is per port settings and can be read 
from
PMTU - Port MTU Register.  ACCESS_REGISTER command should be used.
Please, see:
 
https://network.nvidia.com/files/doc-2020/ethernet-adapters-programming-manual.pdf

And thorough  testing of accessing this register is needed - over physical port,
over the representors, over the VFs and SFs. Rollback to 0x should be 
implemented,
if register can't be accessed.

Also, this reported max MTU might be not supported for SFs/VFs, where MTU is 
defined
by hypervisor settings.

> 
> > 4. Please, format your patch according to the "fix" template.
> 
> I've reworded the commit message a little bit. But I don't see these issues on
> Bugzilla, I've stumbled upon them independently. If you'd like the bug 
> reports to
> be created, let me know.

I meant this: https://doc.dpdk.org/guides/contributing/patches.html
Please see chapter "8.7. Commit Messages: Body" about "Fixes" and "Cc: 
sta...@dpdk.org".

Also, please run checking script: /devtools/check-git-log.sh' -1 to verify 
commit message compliance.

With best regards,
Slava



[PATCH] meson: use built-in 'modules' helper for python dependencies

2024-06-23 Thread luca . boccassi
From: Luca Boccassi 

We now require Meson 0.53 or later, so we can use this feature introduced
in 0.51. This also fixes a build failure on SUSE Leap 15.6.

Cc: sta...@dpdk.org

Signed-off-by: Luca Boccassi 
---
 buildtools/meson.build | 19 +--
 1 file changed, 5 insertions(+), 14 deletions(-)

diff --git a/buildtools/meson.build b/buildtools/meson.build
index 72447b60a0..3adf34e1a8 100644
--- a/buildtools/meson.build
+++ b/buildtools/meson.build
@@ -5,7 +5,11 @@ pkgconf = find_program('pkg-config', 'pkgconf', required: 
false)
 check_symbols = find_program('check-symbols.sh')
 ldflags_ibverbs_static = find_program('options-ibverbs-static.sh')
 
-python3 = import('python').find_installation(required: false)
+python3_required_modules = []
+if host_machine.system() != 'windows'
+python3_required_modules = ['elftools']
+endif
+python3 = import('python').find_installation('python3', required: false, 
modules: python3_required_modules)
 if python3.found()
 py3 = [python3]
 else
@@ -45,16 +49,3 @@ else
 pmdinfogen += 'elf'
 endif
 
-# TODO: starting from Meson 0.51.0 use
-# python3 = import('python').find_installation('python',
-#modules : python3_required_modules)
-python3_required_modules = []
-if host_machine.system() != 'windows'
-python3_required_modules = ['elftools']
-endif
-foreach module : python3_required_modules
-script = 'import importlib.util; import sys; 
exit(importlib.util.find_spec("@0@") is None)'
-if run_command(py3, '-c', script.format(module), check: 
false).returncode() != 0
-error('missing python module: @0@'.format(module))
-endif
-endforeach
-- 
2.43.0



Re: [PATCH] meson: use built-in 'modules' helper for python dependencies

2024-06-23 Thread Dmitry Kozlyuk
2024-06-23 13:30 (UTC+0100), luca.bocca...@gmail.com:
> From: Luca Boccassi 
> 
> We now require Meson 0.53 or later, so we can use this feature introduced
> in 0.51. This also fixes a build failure on SUSE Leap 15.6.
> 
> Cc: sta...@dpdk.org
> 
> Signed-off-by: Luca Boccassi 

Acked-by: Dmitry Kozlyuk 


[PATCH] app/graph: fix destination buffer too small

2024-06-23 Thread Mahmoud Maatuq
as sizeof(config.rx.mempool_name) is < sizeof(res->mempool), it's safer
to copy min size of them to avoide out of bound memory write.

Coverity issue: 415430
Fixes: 3850cb06ab9c ("app/graph: add ethdev commands")
Cc: sk...@marvell.com

Signed-off-by: Mahmoud Maatuq 
---
 app/graph/ethdev.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/app/graph/ethdev.c b/app/graph/ethdev.c
index cfc1b18569..4b6009ee12 100644
--- a/app/graph/ethdev.c
+++ b/app/graph/ethdev.c
@@ -671,7 +671,8 @@ cmd_ethdev_parsed(void *parsed_result, __rte_unused struct 
cmdline *cl, void *da
memset(&config, 0, sizeof(struct ethdev_config));
config.rx.n_queues = res->nb_rxq;
config.rx.queue_size = ETHDEV_RX_DESC_DEFAULT;
-   memcpy(config.rx.mempool_name, res->mempool, strlen(res->mempool));
+   memcpy(config.rx.mempool_name, res->mempool,
+   RTE_MIN(sizeof(config.rx.mempool_name), strlen(res->mempool)));
 
config.tx.n_queues = res->nb_txq;
config.tx.queue_size = ETHDEV_TX_DESC_DEFAULT;
-- 
2.43.0



[PATCH 00/17] NFP bugfix

2024-06-23 Thread Chaoyong He
This patch series consist a branch of bugfix patches from NFP PMD,
in order to speed up the review process and avoid send them out one
by one.

Chaoyong He (4):
  net/nfp: fix coredump caused by firmware abnormal cleanup
  net/nfp: forbid offload flow rules with empty action list
  net/nfp: remove redundancy function call
  net/nfp: fix null pointer dereferences

Long Wu (6):
  net/nfp: fix flow rule match data problem
  net/nfp: fix flow rule action data problem
  net/nfp: enlarge the flow rules limitation
  net/nfp: enlarge flow hash table size
  net/nfp: fix flow position index problem
  net/nfp: fix port action core dump

Peng Zhang (3):
  doc: update the metadata description section
  net/nfp: remove the unneeded logic
  net/nfp: adapts the reverse sequence card

Zerun Fu (4):
  net/nfp: refactor speed configuration logic
  net/nfp: refactor device speed update logic
  net/nfp: fix link status display problem
  net/nfp: fix getting firmware version

 doc/guides/nics/nfp.rst   |   4 -
 drivers/net/nfp/flower/nfp_flower_flow.c  |   9 +-
 .../net/nfp/flower/nfp_flower_representor.c   |   2 +-
 drivers/net/nfp/nfdk/nfp_nfdk_dp.c|   6 -
 drivers/net/nfp/nfp_ethdev.c  | 109 +-
 drivers/net/nfp/nfp_ethdev_vf.c   |   2 -
 drivers/net/nfp/nfp_net_cmsg.h|   6 +-
 drivers/net/nfp/nfp_net_common.c  |  61 ++
 drivers/net/nfp/nfp_net_common.h  |  28 -
 drivers/net/nfp/nfp_net_flow.c|  95 +--
 10 files changed, 239 insertions(+), 83 deletions(-)

-- 
2.39.1



[PATCH 01/17] net/nfp: refactor speed configuration logic

2024-06-23 Thread Chaoyong He
From: Zerun Fu 

The speed configuration logic will execute every time the
device start, even if the speed is not changed. Refactor
this part of logic to make sure it only executes when the
speed is really need to be changed.

Signed-off-by: Zerun Fu 
Reviewed-by: Chaoyong He 
Reviewed-by: Long Wu 
Reviewed-by: Peng Zhang 
---
 drivers/net/nfp/nfp_ethdev.c | 100 +--
 1 file changed, 73 insertions(+), 27 deletions(-)

diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index b04bc955b5..f4fd013a51 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -220,12 +220,68 @@ nfp_net_nfp4000_speed_configure_check(uint16_t port_id,
return 0;
 }
 
+static int
+nfp_net_speed_autoneg_set(struct nfp_net_hw_priv *hw_priv,
+   struct nfp_eth_table_port *eth_port)
+{
+   int ret;
+   struct nfp_nsp *nsp;
+
+   nsp = nfp_eth_config_start(hw_priv->pf_dev->cpp, eth_port->index);
+   if (nsp == NULL) {
+   PMD_DRV_LOG(ERR, "Could not get NSP.");
+   return -EIO;
+   }
+
+   ret = nfp_eth_set_aneg(nsp, NFP_ANEG_AUTO);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set ANEG enable.");
+   nfp_eth_config_cleanup_end(nsp);
+   return ret;
+   }
+
+   return nfp_eth_config_commit_end(nsp);
+}
+
+static int
+nfp_net_speed_fixed_set(struct nfp_net_hw_priv *hw_priv,
+   struct nfp_eth_table_port *eth_port,
+   uint32_t configure_speed)
+{
+   int ret;
+   struct nfp_nsp *nsp;
+
+   nsp = nfp_eth_config_start(hw_priv->pf_dev->cpp, eth_port->index);
+   if (nsp == NULL) {
+   PMD_DRV_LOG(ERR, "Could not get NSP.");
+   return -EIO;
+   }
+
+   ret = nfp_eth_set_aneg(nsp, NFP_ANEG_DISABLED);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set ANEG disable.");
+   goto config_cleanup;
+   }
+
+   ret = nfp_eth_set_speed(nsp, configure_speed);
+   if (ret != 0) {
+   PMD_DRV_LOG(ERR, "Failed to set speed.");
+   goto config_cleanup;
+   }
+
+   return nfp_eth_config_commit_end(nsp);
+
+config_cleanup:
+   nfp_eth_config_cleanup_end(nsp);
+
+   return ret;
+}
+
 static int
 nfp_net_speed_configure(struct rte_eth_dev *dev)
 {
int ret;
uint32_t speed_capa;
-   struct nfp_nsp *nsp;
uint32_t link_speeds;
uint32_t configure_speed;
struct nfp_eth_table_port *eth_port;
@@ -260,40 +316,30 @@ nfp_net_speed_configure(struct rte_eth_dev *dev)
}
}
 
-   nsp = nfp_eth_config_start(hw_priv->pf_dev->cpp, eth_port->index);
-   if (nsp == NULL) {
-   PMD_DRV_LOG(ERR, "Couldn't get NSP.");
-   return -EIO;
-   }
+   if (configure_speed == RTE_ETH_LINK_SPEED_AUTONEG) {
+   if (!eth_port->supp_aneg)
+   return 0;
 
-   if (link_speeds == RTE_ETH_LINK_SPEED_AUTONEG) {
-   if (eth_port->supp_aneg) {
-   ret = nfp_eth_set_aneg(nsp, NFP_ANEG_AUTO);
-   if (ret != 0) {
-   PMD_DRV_LOG(ERR, "Failed to set ANEG enable.");
-   goto config_cleanup;
-   }
-   }
-   } else {
-   ret = nfp_eth_set_aneg(nsp, NFP_ANEG_DISABLED);
+   if (eth_port->aneg == NFP_ANEG_AUTO)
+   return 0;
+
+   ret = nfp_net_speed_autoneg_set(hw_priv, eth_port);
if (ret != 0) {
-   PMD_DRV_LOG(ERR, "Failed to set ANEG disable.");
-   goto config_cleanup;
+   PMD_DRV_LOG(ERR, "Failed to set speed autoneg.");
+   return ret;
}
+   } else {
+   if (eth_port->aneg == NFP_ANEG_DISABLED && configure_speed == 
eth_port->speed)
+   return 0;
 
-   ret = nfp_eth_set_speed(nsp, configure_speed);
+   ret = nfp_net_speed_fixed_set(hw_priv, eth_port, 
configure_speed);
if (ret != 0) {
-   PMD_DRV_LOG(ERR, "Failed to set speed.");
-   goto config_cleanup;
+   PMD_DRV_LOG(ERR, "Failed to set speed fixed.");
+   return ret;
}
}
 
-   return nfp_eth_config_commit_end(nsp);
-
-config_cleanup:
-   nfp_eth_config_cleanup_end(nsp);
-
-   return ret;
+   return 0;
 }
 
 static int
-- 
2.39.1



[PATCH 02/17] net/nfp: refactor device speed update logic

2024-06-23 Thread Chaoyong He
From: Zerun Fu 

The previous logic will call 'nfp_eth_read_ports()' every time when the
link status changed, but some of which are not necessary.

Refactor this part of logic and only call 'nfp_eth_read_ports()' when
the speed is really updated or the device is under auto-negotiation mode.

Signed-off-by: Zerun Fu 
Reviewed-by: Chaoyong He 
Reviewed-by: Long Wu 
Reviewed-by: Peng Zhang 
---
 drivers/net/nfp/nfp_ethdev.c |  3 +++
 drivers/net/nfp/nfp_net_common.c | 18 --
 drivers/net/nfp/nfp_net_common.h |  3 +++
 3 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index f4fd013a51..9870b2dd33 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -339,6 +339,8 @@ nfp_net_speed_configure(struct rte_eth_dev *dev)
}
}
 
+   hw_priv->pf_dev->speed_updated = true;
+
return 0;
 }
 
@@ -2250,6 +2252,7 @@ nfp_pf_init(struct rte_pci_device *pci_dev)
pf_dev->nfp_eth_table = nfp_eth_table;
pf_dev->sync = sync;
pf_dev->total_phyports = nfp_net_get_port_num(pf_dev, nfp_eth_table);
+   pf_dev->speed_updated = false;
 
ret = nfp_net_speed_cap_get(pf_dev);
if (ret != 0) {
diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c
index 5616160686..fed8daa188 100644
--- a/drivers/net/nfp/nfp_net_common.c
+++ b/drivers/net/nfp/nfp_net_common.c
@@ -738,22 +738,28 @@ nfp_net_speed_aneg_update(struct rte_eth_dev *dev,
 {
uint32_t i;
uint32_t speed;
+   enum nfp_eth_aneg aneg;
+   struct nfp_pf_dev *pf_dev;
struct nfp_eth_table *nfp_eth_table;
struct nfp_eth_table_port *eth_port;
 
+   pf_dev = hw_priv->pf_dev;
+   aneg = pf_dev->nfp_eth_table->ports[hw->idx].aneg;
+
/* Compare whether the current status has changed. */
-   if (dev->data->dev_link.link_status != link->link_status) {
-   nfp_eth_table = nfp_eth_read_ports(hw_priv->pf_dev->cpp);
+   if (pf_dev->speed_updated || aneg == NFP_ANEG_AUTO) {
+   nfp_eth_table = nfp_eth_read_ports(pf_dev->cpp);
if (nfp_eth_table == NULL) {
PMD_DRV_LOG(DEBUG, "Error reading NFP ethernet table.");
return -EIO;
+   } else {
+   pf_dev->nfp_eth_table->ports[hw->idx] = 
nfp_eth_table->ports[hw->idx];
+   free(nfp_eth_table);
+   pf_dev->speed_updated = false;
}
-
-   hw_priv->pf_dev->nfp_eth_table->ports[hw->idx] = 
nfp_eth_table->ports[hw->idx];
-   free(nfp_eth_table);
}
 
-   nfp_eth_table = hw_priv->pf_dev->nfp_eth_table;
+   nfp_eth_table = pf_dev->nfp_eth_table;
eth_port = &nfp_eth_table->ports[hw->idx];
speed = eth_port->speed;
 
diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h
index b43f815951..8e3e219261 100644
--- a/drivers/net/nfp/nfp_net_common.h
+++ b/drivers/net/nfp/nfp_net_common.h
@@ -160,6 +160,9 @@ struct nfp_pf_dev {
uint8_t vf_base_id;
/** Number of queues per VF */
uint32_t queue_per_vf;
+
+   /** Record the speed uptade */
+   bool speed_updated;
 };
 
 #define NFP_NET_FLOW_LIMIT1024
-- 
2.39.1



[PATCH 03/17] net/nfp: fix link status display problem

2024-06-23 Thread Chaoyong He
From: Zerun Fu 

In the previous logic, the link status will shown as down wrongly
whenever the call to 'nfp_eth_read_ports()' fail.

Fix this by removing the exit logic when call to 'nfp_eth_read_ports()'
fail and just giving a warning.

Fixes: 8412feed3f26 ("net/nfp: modify link update function")
Cc: sta...@dpdk.org

Signed-off-by: Zerun Fu 
Reviewed-by: Chaoyong He 
Reviewed-by: Long Wu 
Reviewed-by: Peng Zhang 
---
 drivers/net/nfp/nfp_net_common.c | 13 +++--
 1 file changed, 3 insertions(+), 10 deletions(-)

diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c
index fed8daa188..a6573ed45c 100644
--- a/drivers/net/nfp/nfp_net_common.c
+++ b/drivers/net/nfp/nfp_net_common.c
@@ -730,7 +730,7 @@ nfp_net_allmulticast_disable(struct rte_eth_dev *dev)
return nfp_net_set_allmulticast_mode(dev, false);
 }
 
-static int
+static void
 nfp_net_speed_aneg_update(struct rte_eth_dev *dev,
struct nfp_net_hw *hw,
struct nfp_net_hw_priv *hw_priv,
@@ -750,8 +750,7 @@ nfp_net_speed_aneg_update(struct rte_eth_dev *dev,
if (pf_dev->speed_updated || aneg == NFP_ANEG_AUTO) {
nfp_eth_table = nfp_eth_read_ports(pf_dev->cpp);
if (nfp_eth_table == NULL) {
-   PMD_DRV_LOG(DEBUG, "Error reading NFP ethernet table.");
-   return -EIO;
+   PMD_DRV_LOG(WARNING, "Failed to update port speed.");
} else {
pf_dev->nfp_eth_table->ports[hw->idx] = 
nfp_eth_table->ports[hw->idx];
free(nfp_eth_table);
@@ -773,8 +772,6 @@ nfp_net_speed_aneg_update(struct rte_eth_dev *dev,
if (dev->data->dev_conf.link_speeds == RTE_ETH_LINK_SPEED_AUTONEG &&
eth_port->supp_aneg)
link->link_autoneg = RTE_ETH_LINK_AUTONEG;
-
-   return 0;
 }
 
 int
@@ -790,11 +787,7 @@ nfp_net_link_update_common(struct rte_eth_dev *dev,
hw_priv = dev->process_private;
if (link->link_status == RTE_ETH_LINK_UP) {
if (hw_priv->pf_dev != NULL) {
-   ret = nfp_net_speed_aneg_update(dev, hw, hw_priv, link);
-   if (ret != 0) {
-   PMD_DRV_LOG(DEBUG, "Failed to update speed and 
aneg.");
-   return ret;
-   }
+   nfp_net_speed_aneg_update(dev, hw, hw_priv, link);
} else {
/*
 * Shift and mask nn_link_status so that it is 
effectively the value
-- 
2.39.1



[PATCH 04/17] net/nfp: fix coredump caused by firmware abnormal cleanup

2024-06-23 Thread Chaoyong He
The logic of 'nfp_fw_setup()' consider both single-pf and multi-pf
firmware, but the abnormal firmware cleanup logic only consider multi-pf
firmware and try to write the heart beat value, which will cause
coredump when using the single-pf firmware.

Fixes: 8ba461d1eecc ("net/nfp: introduce keepalive mechanism for multiple PF")
Cc: peng.zh...@corigine.com
Cc: sta...@dpdk.org

Signed-off-by: Chaoyong He 
Reviewed-by: Long Wu 
Reviewed-by: Peng Zhang 
---
 drivers/net/nfp/nfp_ethdev.c | 8 +---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index 9870b2dd33..9196d5d0a4 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -2335,9 +2335,11 @@ nfp_pf_init(struct rte_pci_device *pci_dev)
free(sym_tbl);
 fw_cleanup:
nfp_fw_unload(cpp);
-   nfp_net_keepalive_stop(&pf_dev->multi_pf);
-   nfp_net_keepalive_clear(pf_dev->multi_pf.beat_addr, 
pf_dev->multi_pf.function_id);
-   nfp_net_keepalive_uninit(&pf_dev->multi_pf);
+   if (pf_dev->multi_pf.enabled) {
+   nfp_net_keepalive_stop(&pf_dev->multi_pf);
+   nfp_net_keepalive_clear(pf_dev->multi_pf.beat_addr, 
pf_dev->multi_pf.function_id);
+   nfp_net_keepalive_uninit(&pf_dev->multi_pf);
+   }
 eth_table_cleanup:
free(nfp_eth_table);
 hwinfo_cleanup:
-- 
2.39.1



[PATCH 05/17] net/nfp: forbid offload flow rules with empty action list

2024-06-23 Thread Chaoyong He
The original logic allow offload flow rules with empty action list, but
the matched packets will be drop by the flower firmware.

Fix this by forbidding offload this type flow rules.

Fixes: 4d946034bf9c ("net/nfp: support basic flow actions")
Cc: sta...@dpdk.org

Signed-off-by: Chaoyong He 
Reviewed-by: Long Wu 
Reviewed-by: Peng Zhang 
---
 drivers/net/nfp/flower/nfp_flower_flow.c | 5 +
 1 file changed, 5 insertions(+)

diff --git a/drivers/net/nfp/flower/nfp_flower_flow.c 
b/drivers/net/nfp/flower/nfp_flower_flow.c
index 9f410515e6..d127171fdb 100644
--- a/drivers/net/nfp/flower/nfp_flower_flow.c
+++ b/drivers/net/nfp/flower/nfp_flower_flow.c
@@ -4757,6 +4757,11 @@ nfp_flow_compile_action(struct nfp_flower_representor 
*representor,
total_actions++;
}
 
+   if (total_actions == 0 || param.position == param.action_data) {
+   PMD_DRV_LOG(ERR, "The action list is empty");
+   return -ENOTSUP;
+   }
+
nfp_flow_meta = nfp_flow->payload.meta;
if (flag.drop_flag)
nfp_flow_meta->shortcut = rte_cpu_to_be_32(NFP_FL_SC_ACT_DROP);
-- 
2.39.1



[PATCH 06/17] net/nfp: remove redundancy function call

2024-06-23 Thread Chaoyong He
Remove the redundancy call of 'rte_eth_copy_pci_info()' as the API
'rte_eth_dev_pci_allocate()' already done that.

Fixes: e1124c4f8a45 ("net/nfp: add flower representor framework")
Cc: sta...@dpdk.org

Signed-off-by: Chaoyong He 
Reviewed-by: Long Wu 
Reviewed-by: Peng Zhang 
---
 drivers/net/nfp/nfp_ethdev_vf.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/net/nfp/nfp_ethdev_vf.c b/drivers/net/nfp/nfp_ethdev_vf.c
index a5c600c87b..cdf5da3af7 100644
--- a/drivers/net/nfp/nfp_ethdev_vf.c
+++ b/drivers/net/nfp/nfp_ethdev_vf.c
@@ -303,8 +303,6 @@ nfp_netvf_init(struct rte_eth_dev *eth_dev)
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return 0;
 
-   rte_eth_copy_pci_info(eth_dev, pci_dev);
-
net_hw->eth_xstats_base = rte_malloc("rte_eth_xstat",
sizeof(struct rte_eth_xstat) * 
nfp_net_xstats_size(eth_dev), 0);
if (net_hw->eth_xstats_base == NULL) {
-- 
2.39.1



[PATCH 07/17] net/nfp: fix flow rule match data problem

2024-06-23 Thread Chaoyong He
From: Long Wu 

The port and port mask field of 'struct nfp_net_cmsg_match_v4'
are in the wrong position, and this will cause firmware not
work as expected.

Fixes: 42eabda06b0f ("net/nfp: support IPv4 flow item")
Cc: chaoyong...@corigine.com
Cc: sta...@dpdk.org

Signed-off-by: Long Wu 
Reviewed-by: Chaoyong He 
Reviewed-by: Peng Zhang 
---
 drivers/net/nfp/nfp_net_cmsg.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/nfp/nfp_net_cmsg.h b/drivers/net/nfp/nfp_net_cmsg.h
index 4fab462cb9..b3d9bc33cf 100644
--- a/drivers/net/nfp/nfp_net_cmsg.h
+++ b/drivers/net/nfp/nfp_net_cmsg.h
@@ -52,10 +52,10 @@ struct nfp_net_cmsg_match_v4 {
uint32_t src_ipv4_mask;
uint32_t dst_ipv4;
uint32_t dst_ipv4_mask;
-   uint16_t src_port;
uint16_t src_port_mask;
-   uint16_t dst_port;
+   uint16_t src_port;
uint16_t dst_port_mask;
+   uint16_t dst_port;
 };
 
 /**
-- 
2.39.1



[PATCH 08/17] net/nfp: fix flow rule action data problem

2024-06-23 Thread Chaoyong He
From: Long Wu 

The data type of 'mark_id' field in 'struct nfp_net_cmsg_action'
should be 'uint32_t' rather than 'uint16_t'.

Fixes: 0b9079d24808 ("net/nfp: support flow API for CoreNIC firmware")
Cc: chaoyong...@corigine.com
Cc: sta...@dpdk.org

Signed-off-by: Long Wu 
Reviewed-by: Chaoyong He 
Reviewed-by: Peng Zhang 
---
 drivers/net/nfp/nfp_net_cmsg.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/nfp/nfp_net_cmsg.h b/drivers/net/nfp/nfp_net_cmsg.h
index b3d9bc33cf..ccb607f443 100644
--- a/drivers/net/nfp/nfp_net_cmsg.h
+++ b/drivers/net/nfp/nfp_net_cmsg.h
@@ -144,7 +144,7 @@ struct nfp_net_cmsg_action {
uint16_t action;
uint8_t queue;
uint8_t spare;
-   uint16_t mark_id;
+   uint32_t mark_id;
 };
 
 enum nfp_net_cfg_mbox_cmd {
-- 
2.39.1



[PATCH 09/17] net/nfp: enlarge the flow rules limitation

2024-06-23 Thread Chaoyong He
From: Long Wu 

The firmware rules limitation is enlarged to
2056(8 Eth + 1024 IPv4 + 1024 IPv6 rules).
So enlarge the flow rules limitation and add
more precise checks to flow count.

Signed-off-by: Long Wu 
Reviewed-by: Chaoyong He 
Reviewed-by: Peng Zhang 
---
 drivers/net/nfp/nfp_net_common.h | 16 +-
 drivers/net/nfp/nfp_net_flow.c   | 87 +---
 2 files changed, 94 insertions(+), 9 deletions(-)

diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h
index 8e3e219261..6db849eb07 100644
--- a/drivers/net/nfp/nfp_net_common.h
+++ b/drivers/net/nfp/nfp_net_common.h
@@ -165,12 +165,24 @@ struct nfp_pf_dev {
bool speed_updated;
 };
 
-#define NFP_NET_FLOW_LIMIT1024
+#define NFP_NET_ETH_FLOW_LIMIT8
+#define NFP_NET_IPV4_FLOW_LIMIT   1024
+#define NFP_NET_IPV6_FLOW_LIMIT   1024
+
+#define NFP_NET_FLOW_LIMIT((NFP_NET_ETH_FLOW_LIMIT) +   \
+   (NFP_NET_IPV4_FLOW_LIMIT) + \
+   (NFP_NET_IPV6_FLOW_LIMIT))
+
+struct nfp_net_flow_count {
+   uint16_t eth_count;
+   uint16_t ipv4_count;
+   uint16_t ipv6_count;
+};
 
 struct nfp_net_priv {
uint32_t hash_seed; /**< Hash seed for hash tables in this structure. */
struct rte_hash *flow_table; /**< Hash table to store flow rules. */
-   uint16_t flow_count; /**< Flow count in hash table */
+   struct nfp_net_flow_count flow_count; /**< Flow count in hash table */
bool flow_position[NFP_NET_FLOW_LIMIT]; /**< Flow position array */
 };
 
diff --git a/drivers/net/nfp/nfp_net_flow.c b/drivers/net/nfp/nfp_net_flow.c
index b0d1a57d99..74dd67abd4 100644
--- a/drivers/net/nfp/nfp_net_flow.c
+++ b/drivers/net/nfp/nfp_net_flow.c
@@ -178,7 +178,8 @@ nfp_net_flow_free(struct nfp_net_priv *priv,
 
 static int
 nfp_net_flow_calculate_items(const struct rte_flow_item items[],
-   uint32_t *match_len)
+   uint32_t *match_len,
+   uint32_t *item_type)
 {
int ret = -EINVAL;
const struct rte_flow_item *item;
@@ -188,15 +189,18 @@ nfp_net_flow_calculate_items(const struct rte_flow_item 
items[],
case RTE_FLOW_ITEM_TYPE_ETH:
PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_ETH detected");
*match_len = sizeof(struct nfp_net_cmsg_match_eth);
+   *item_type = RTE_FLOW_ITEM_TYPE_ETH;
ret = 0;
break;
case RTE_FLOW_ITEM_TYPE_IPV4:
PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_IPV4 detected");
*match_len = sizeof(struct nfp_net_cmsg_match_v4);
+   *item_type = RTE_FLOW_ITEM_TYPE_IPV4;
return 0;
case RTE_FLOW_ITEM_TYPE_IPV6:
PMD_DRV_LOG(DEBUG, "RTE_FLOW_ITEM_TYPE_IPV6 detected");
*match_len = sizeof(struct nfp_net_cmsg_match_v6);
+   *item_type = RTE_FLOW_ITEM_TYPE_IPV6;
return 0;
default:
PMD_DRV_LOG(ERR, "Can't calculate match length");
@@ -643,6 +647,66 @@ nfp_net_flow_process_priority(struct rte_flow *nfp_flow,
}
 }
 
+static int
+nfp_net_flow_check_count(struct nfp_net_flow_count *flow_count,
+   uint32_t item_type)
+{
+   int ret = 0;
+
+   switch (item_type) {
+   case RTE_FLOW_ITEM_TYPE_ETH:
+   if (flow_count->eth_count >= NFP_NET_ETH_FLOW_LIMIT)
+   ret = -ENOSPC;
+   break;
+   case RTE_FLOW_ITEM_TYPE_IPV4:
+   if (flow_count->ipv4_count >= NFP_NET_IPV4_FLOW_LIMIT)
+   ret = -ENOSPC;
+   break;
+   case RTE_FLOW_ITEM_TYPE_IPV6:
+   if (flow_count->ipv6_count >= NFP_NET_IPV6_FLOW_LIMIT)
+   ret = -ENOSPC;
+   break;
+   default:
+   ret = -ENOTSUP;
+   break;
+   }
+
+   return ret;
+}
+
+static int
+nfp_net_flow_calculate_count(struct rte_flow *nfp_flow,
+   struct nfp_net_flow_count *flow_count,
+   bool delete_flag)
+{
+   uint16_t *count;
+
+   switch (nfp_flow->payload.cmsg_type) {
+   case NFP_NET_CFG_MBOX_CMD_FS_ADD_V4:
+   case NFP_NET_CFG_MBOX_CMD_FS_DEL_V4:
+   count = &flow_count->ipv4_count;
+   break;
+   case NFP_NET_CFG_MBOX_CMD_FS_ADD_V6:
+   case NFP_NET_CFG_MBOX_CMD_FS_DEL_V6:
+   count = &flow_count->ipv6_count;
+   break;
+   case NFP_NET_CFG_MBOX_CMD_FS_ADD_ETHTYPE:
+   case NFP_NET_CFG_MBOX_CMD_FS_DEL_ETHTYPE:
+   count = &flow_count->eth_count;
+   break;
+   default:
+   PMD_DRV_LOG(ERR, "Flow count calculate failed.");
+   return -EINVAL;
+   }
+
+   if (delete_flag)
+   (*count)--;
+   else
+   

[PATCH 10/17] net/nfp: enlarge flow hash table size

2024-06-23 Thread Chaoyong He
From: Long Wu 

The flow rules limitation is 2056 and driver needs
to store it in hash table. Considering hash conflicts,
driver use a new macro to enlarge hash table size.

Signed-off-by: Long Wu 
Reviewed-by: Chaoyong He 
Reviewed-by: Peng Zhang 
---
 drivers/net/nfp/nfp_net_common.h | 3 +++
 drivers/net/nfp/nfp_net_flow.c   | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h
index 6db849eb07..6c739891be 100644
--- a/drivers/net/nfp/nfp_net_common.h
+++ b/drivers/net/nfp/nfp_net_common.h
@@ -179,6 +179,9 @@ struct nfp_net_flow_count {
uint16_t ipv6_count;
 };
 
+#define NFP_NET_HASH_REDUNDANCE (1.2)
+#define NFP_NET_FLOW_HASH_TBALE_SIZE ((NFP_NET_FLOW_LIMIT) * 
(NFP_NET_HASH_REDUNDANCE))
+
 struct nfp_net_priv {
uint32_t hash_seed; /**< Hash seed for hash tables in this structure. */
struct rte_hash *flow_table; /**< Hash table to store flow rules. */
diff --git a/drivers/net/nfp/nfp_net_flow.c b/drivers/net/nfp/nfp_net_flow.c
index 74dd67abd4..2dab317a5f 100644
--- a/drivers/net/nfp/nfp_net_flow.c
+++ b/drivers/net/nfp/nfp_net_flow.c
@@ -1063,7 +1063,7 @@ nfp_net_flow_priv_init(struct nfp_pf_dev *pf_dev,
 
struct rte_hash_parameters flow_hash_params = {
.name   = flow_name,
-   .entries= NFP_NET_FLOW_LIMIT,
+   .entries= NFP_NET_FLOW_HASH_TBALE_SIZE,
.hash_func  = rte_jhash,
.socket_id  = rte_socket_id(),
.key_len= sizeof(uint32_t),
-- 
2.39.1



[PATCH 11/17] net/nfp: fix flow position index problem

2024-06-23 Thread Chaoyong He
From: Long Wu 

The flow position acquire and free interfaces use different index,
and this will cause the flow free logic failed.

Fix this problem by using the same flow position index.

Fixes: 0b9079d24808 ("net/nfp: support flow API for CoreNIC firmware")
Cc: chaoyong...@corigine.com
Cc: sta...@dpdk.org

Signed-off-by: Long Wu 
Reviewed-by: Chaoyong He 
Reviewed-by: Peng Zhang 
---
 drivers/net/nfp/nfp_net_flow.c | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/net/nfp/nfp_net_flow.c b/drivers/net/nfp/nfp_net_flow.c
index 2dab317a5f..2c7801ed41 100644
--- a/drivers/net/nfp/nfp_net_flow.c
+++ b/drivers/net/nfp/nfp_net_flow.c
@@ -123,7 +123,11 @@ static void
 nfp_net_flow_position_free(struct nfp_net_priv *priv,
struct rte_flow *nfp_flow)
 {
-   priv->flow_position[nfp_flow->position] = false;
+   uint32_t index;
+
+   index = NFP_NET_FLOW_LIMIT - 1 - nfp_flow->position;
+
+   priv->flow_position[index] = false;
 }
 
 static struct rte_flow *
-- 
2.39.1



[PATCH 12/17] net/nfp: fix getting firmware version

2024-06-23 Thread Chaoyong He
From: Zerun Fu 

The original logic try to get the NSP resource every time the application
call 'rte_eth_dev_fw_version_get()' interface, there are chances the NSP
resource busy and fail to get it. And because the local string variables
not initialized, there will be out of range problem when it fail to get
the NSP resource.

Fix this by initializing the local string variables and storing the
firmware version string once we get it.

Fixes: 128c8ad951bf ("net/nfp: support getting firmware version")
Cc: sta...@dpdk.org

Signed-off-by: Zerun Fu 
Reviewed-by: Chaoyong He 
Reviewed-by: Long Wu 
Reviewed-by: Peng Zhang 
---
 drivers/net/nfp/nfp_net_common.c | 26 ++
 drivers/net/nfp/nfp_net_common.h |  6 ++
 2 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c
index a6573ed45c..84893e2d73 100644
--- a/drivers/net/nfp/nfp_net_common.c
+++ b/drivers/net/nfp/nfp_net_common.c
@@ -193,9 +193,6 @@ nfp_net_notify_port_speed(struct nfp_net_hw *hw,
nfp_net_link_speed_rte2nfp(link->link_speed));
 }
 
-/* The length of firmware version string */
-#define FW_VER_LEN32
-
 /**
  * Reconfigure the firmware of VF configure
  *
@@ -2274,11 +2271,11 @@ nfp_net_firmware_version_get(struct rte_eth_dev *dev,
size_t fw_size)
 {
struct nfp_net_hw *hw;
-   char mip_name[FW_VER_LEN];
-   char app_name[FW_VER_LEN];
-   char nsp_version[FW_VER_LEN];
-   char vnic_version[FW_VER_LEN];
struct nfp_net_hw_priv *hw_priv;
+   char app_name[FW_VER_LEN] = {0};
+   char mip_name[FW_VER_LEN] = {0};
+   char nsp_version[FW_VER_LEN] = {0};
+   char vnic_version[FW_VER_LEN] = {0};
 
if (fw_size < FW_VER_LEN)
return FW_VER_LEN;
@@ -2286,6 +2283,11 @@ nfp_net_firmware_version_get(struct rte_eth_dev *dev,
hw = nfp_net_get_hw(dev);
hw_priv = dev->process_private;
 
+   if (hw->fw_version[0] != 0) {
+   snprintf(fw_version, FW_VER_LEN, "%s", hw->fw_version);
+   return 0;
+   }
+
if (!rte_eth_dev_is_repr(dev)) {
snprintf(vnic_version, FW_VER_LEN, "%d.%d.%d.%d",
hw->ver.extend, hw->ver.class,
@@ -2298,8 +2300,16 @@ nfp_net_firmware_version_get(struct rte_eth_dev *dev,
nfp_net_get_mip_name(hw_priv, mip_name);
nfp_net_get_app_name(hw_priv, app_name);
 
-   snprintf(fw_version, FW_VER_LEN, "%s %s %s %s",
+   if (nsp_version[0] == 0 || mip_name[0] == 0) {
+   snprintf(fw_version, FW_VER_LEN, "%s %s %s %s",
vnic_version, nsp_version, mip_name, app_name);
+   return 0;
+   }
+
+   snprintf(hw->fw_version, FW_VER_LEN, "%s %s %s %s",
+   vnic_version, nsp_version, mip_name, app_name);
+
+   snprintf(fw_version, FW_VER_LEN, "%s", hw->fw_version);
 
return 0;
 }
diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h
index 6c739891be..3c4d305b01 100644
--- a/drivers/net/nfp/nfp_net_common.h
+++ b/drivers/net/nfp/nfp_net_common.h
@@ -50,6 +50,9 @@
RTE_ETH_RSS_NONFRAG_IPV6_UDP  | \
RTE_ETH_RSS_NONFRAG_IPV6_SCTP)
 
+/* The length of firmware version string */
+#define FW_VER_LEN32
+
 /*
  * Each PF has corresponding word to beat:
  * Offset | Usage
@@ -255,6 +258,9 @@ struct nfp_net_hw {
 
/** Used for rte_flow of CoreNIC firmware */
struct nfp_net_priv *priv;
+
+   /** Used for firmware version */
+   char fw_version[FW_VER_LEN];
 };
 
 static inline uint32_t
-- 
2.39.1



[PATCH 13/17] doc: update the metadata description section

2024-06-23 Thread Chaoyong He
From: Peng Zhang 

The description about the metadata of Tx direction
when using the firmware with NFDk is not correct.
Because of the exist of 8-bits metadata length, the
32-bits field type header contains only 6 4-bits
datatype specifiers rather than 8.

Fixes: c4b058784e75 ("net/nfp: modify parse metadata logic")
Cc: sta...@dpdk.org

Signed-off-by: Peng Zhang 
Reviewed-by: Chaoyong He 
Reviewed-by: Long Wu 
---
 doc/guides/nics/nfp.rst | 4 
 1 file changed, 4 deletions(-)

diff --git a/doc/guides/nics/nfp.rst b/doc/guides/nics/nfp.rst
index ed9548de0b..d2c7afc8cb 100644
--- a/doc/guides/nics/nfp.rst
+++ b/doc/guides/nics/nfp.rst
@@ -329,10 +329,6 @@ be wrote N times in the heads. It is the same with NFD3.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Data for field 5   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-   |Data for field 6   |
-   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-   |Data for field 7   |
-   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Packet Data  |
|  ...  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-- 
2.39.1



[PATCH 14/17] net/nfp: remove the unneeded logic

2024-06-23 Thread Chaoyong He
From: Peng Zhang 

The logic in NFDk datapatch can make sure there only one layer VLAN,
so remove the unneeded logic here and make it clean and easy to
understand.

Fixes: 7c82b8626af8 ("net/nfp: support VLAN insert with NFDk")
Cc: sta...@dpdk.org

Signed-off-by: Peng Zhang 
Reviewed-by: Chaoyong He 
Reviewed-by: Long Wu 
---
 drivers/net/nfp/nfdk/nfp_nfdk_dp.c | 6 --
 1 file changed, 6 deletions(-)

diff --git a/drivers/net/nfp/nfdk/nfp_nfdk_dp.c 
b/drivers/net/nfp/nfdk/nfp_nfdk_dp.c
index e6847ccb33..2cea5688b3 100644
--- a/drivers/net/nfp/nfdk/nfp_nfdk_dp.c
+++ b/drivers/net/nfp/nfdk/nfp_nfdk_dp.c
@@ -141,7 +141,6 @@ nfp_net_nfdk_set_meta_data(struct rte_mbuf *pkt,
uint32_t meta_type;
struct nfp_net_hw *hw;
uint32_t header_offset;
-   uint8_t vlan_layer = 0;
uint8_t ipsec_layer = 0;
struct nfp_net_meta_raw meta_data;
 
@@ -184,12 +183,7 @@ nfp_net_nfdk_set_meta_data(struct rte_mbuf *pkt,
meta += NFP_NET_META_FIELD_SIZE) {
switch (meta_type & NFP_NET_META_FIELD_MASK) {
case NFP_NET_META_VLAN:
-   if (vlan_layer > 0) {
-   PMD_DRV_LOG(ERR, "At most 1 layers of vlan is 
supported");
-   return -EINVAL;
-   }
nfp_net_meta_set_vlan(&meta_data, pkt, layer);
-   vlan_layer++;
break;
case NFP_NET_META_IPSEC:
if (ipsec_layer > 2) {
-- 
2.39.1



[PATCH 15/17] net/nfp: adapts the reverse sequence card

2024-06-23 Thread Chaoyong He
From: Peng Zhang 

The NFP chip-wide port index is 'eth_port->index'.
In the normal card, it uses 'eth_port->eth_index', but because
'eth_port->eth_index' and 'eth_port->index' have the same value,
it doesn't have any problem.
But in the reverse sequence card, the value is different,
so it will lead the 'nfp_eth_config_start()' failed.

In this commit, fix this bug by using 'eth_port->index'.

Fixes: e1124c4f8a45 ("net/nfp: add flower representor framework")
Cc: chaoyong...@corigine.com
Cc: sta...@dpdk.org

Signed-off-by: Peng Zhang 
Reviewed-by: Chaoyong He 
---
 drivers/net/nfp/flower/nfp_flower_representor.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/nfp/flower/nfp_flower_representor.c 
b/drivers/net/nfp/flower/nfp_flower_representor.c
index 086dbc58e3..b1589cf78c 100644
--- a/drivers/net/nfp/flower/nfp_flower_representor.c
+++ b/drivers/net/nfp/flower/nfp_flower_representor.c
@@ -845,7 +845,7 @@ nfp_flower_repr_alloc(struct nfp_app_fw_flower 
*app_fw_flower,
eth_port = &nfp_eth_table->ports[id];
flower_repr.repr_type = NFP_REPR_TYPE_PHYS_PORT;
flower_repr.port_id = 
nfp_flower_get_phys_port_id(eth_port->index);
-   flower_repr.nfp_idx = eth_port->eth_index;
+   flower_repr.nfp_idx = eth_port->index;
flower_repr.vf_id = i + 1;
 
/* Copy the real mac of the interface to the representor struct 
*/
-- 
2.39.1



[PATCH 16/17] net/nfp: fix null pointer dereferences

2024-06-23 Thread Chaoyong He
CI found null pointer dereferences problem.

Coverity issue: 426271
Fixes: 153ef2e49ed7 ("net/nfp: add process private structure")
Cc: sta...@dpdk.org

Signed-off-by: Chaoyong He 
Reviewed-by: Long Wu 
Reviewed-by: Peng Zhang 
---
 drivers/net/nfp/nfp_net_common.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c
index 84893e2d73..aed40daa67 100644
--- a/drivers/net/nfp/nfp_net_common.c
+++ b/drivers/net/nfp/nfp_net_common.c
@@ -1265,6 +1265,8 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
 
hw = nfp_net_get_hw(dev);
hw_priv = dev->process_private;
+   if (hw_priv == NULL)
+   return -EINVAL;
 
nfp_net_rx_desc_limits(hw_priv, &min_rx_desc, &max_rx_desc);
nfp_net_tx_desc_limits(hw, hw_priv, &min_tx_desc, &max_tx_desc);
@@ -1367,7 +1369,7 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
}
 
/* Only PF supports getting speed capability. */
-   if (hw_priv != NULL && hw_priv->pf_dev != NULL)
+   if (hw_priv->pf_dev != NULL)
dev_info->speed_capa = hw_priv->pf_dev->speed_capa;
 
return 0;
-- 
2.39.1



[PATCH 17/17] net/nfp: fix port action core dump

2024-06-23 Thread Chaoyong He
From: Long Wu 

The app will be destroyed if add a port flow action which its
destination port id is invalid.

Add a check to avoid the problem.

Cc: chaoyong...@corigine.com
Cc: sta...@dpdk.org

Signed-off-by: Long Wu 
---
 drivers/net/nfp/flower/nfp_flower_flow.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/nfp/flower/nfp_flower_flow.c 
b/drivers/net/nfp/flower/nfp_flower_flow.c
index d127171fdb..24e7047407 100644
--- a/drivers/net/nfp/flower/nfp_flower_flow.c
+++ b/drivers/net/nfp/flower/nfp_flower_flow.c
@@ -931,7 +931,7 @@ nfp_flow_item_check_port(struct nfp_item_calculate_param 
*param)
const struct rte_flow_item_port_id *port_id;
 
port_id = param->item->spec;
-   if (port_id == NULL || port_id->id >= RTE_MAX_ETHPORTS)
+   if (port_id == NULL || rte_eth_dev_is_valid_port(port_id->id) == 0)
return -ERANGE;
 
return 0;
@@ -1256,7 +1256,7 @@ nfp_flow_action_check_port(struct 
nfp_action_calculate_param *param)
port_id = action_port_id->id;
}
 
-   if (port_id >= RTE_MAX_ETHPORTS)
+   if (rte_eth_dev_is_valid_port(port_id) == 0)
return -ERANGE;
 
return 0;
-- 
2.39.1



[PATCH] app/testpmd: fix help string of BPF load command

2024-06-23 Thread Chaoyong He
Based on the logic of 'bpf_parse_flags()' and the 'bpf-load' section of
'testpmd_funcs.rst' document, the 'B' flag in the help string of
bpf-load command should be '-'.

Fixes: e977e4199a8d ("app/testpmd: add commands to load/unload BPF filters")
Cc: konstantin.anan...@intel.com
Cc: sta...@dpdk.org

Signed-off-by: Chaoyong He 
Reviewed-by: Long Wu 
Reviewed-by: Peng Zhang 
---
 app/test-pmd/bpf_cmd.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/test-pmd/bpf_cmd.c b/app/test-pmd/bpf_cmd.c
index 46f6b7d6d2..24d34f983e 100644
--- a/app/test-pmd/bpf_cmd.c
+++ b/app/test-pmd/bpf_cmd.c
@@ -139,7 +139,7 @@ static cmdline_parse_token_string_t cmd_load_bpf_prm =
 cmdline_parse_inst_t cmd_operate_bpf_ld_parse = {
.f = cmd_operate_bpf_ld_parsed,
.data = NULL,
-   .help_str = "bpf-load rx|tx",
+   .help_str = "bpf-load rx|tx",
.tokens = {
(void *)&cmd_load_bpf_start,
(void *)&cmd_load_bpf_dir,
-- 
2.39.1



[PATCH 0/2] add function to set dedicated queue size

2024-06-23 Thread Chaoyong He
This patch series mainly add a function to bonding PMD to set
dedicated queue size, also add a command to testpmd application
to invoke this function.

At the same time, standard the log message of bonding PMD.

Long Wu (2):
  net/bonding: standard the log message
  net/bonding: add command to set dedicated queue size

 .../link_bonding_poll_mode_drv_lib.rst|   8 ++
 doc/guides/rel_notes/release_24_07.rst|   4 +
 drivers/net/bonding/bonding_testpmd.c | 126 ++
 drivers/net/bonding/eth_bond_8023ad_private.h |   3 +
 drivers/net/bonding/rte_eth_bond_8023ad.c |  39 ++
 drivers/net/bonding/rte_eth_bond_8023ad.h |  23 
 drivers/net/bonding/rte_eth_bond_pmd.c|   6 +-
 drivers/net/bonding/version.map   |   1 +
 8 files changed, 185 insertions(+), 25 deletions(-)

-- 
2.39.1



[PATCH 1/2] net/bonding: standard the log message

2024-06-23 Thread Chaoyong He
From: Long Wu 

According to the check rules in the patch check script,
drivers and libraries must use the logging framework.

So standard the log message of bonding driver by using
the logging framework.

Signed-off-by: Long Wu 
Reviewed-by: Peng Zhang 
Reviewed-by: Chaoyong He 
---
 drivers/net/bonding/bonding_testpmd.c | 42 ---
 1 file changed, 19 insertions(+), 23 deletions(-)

diff --git a/drivers/net/bonding/bonding_testpmd.c 
b/drivers/net/bonding/bonding_testpmd.c
index 8fcd6cadd0..45b636fea7 100644
--- a/drivers/net/bonding/bonding_testpmd.c
+++ b/drivers/net/bonding/bonding_testpmd.c
@@ -34,15 +34,14 @@ static void cmd_set_bonding_mode_parsed(void *parsed_result,
 * of device changed.
 */
if (port->port_status != RTE_PORT_STOPPED) {
-   fprintf(stderr,
-   "\t Error: Can't set bonding mode when port %d is not 
stopped\n",
+   TESTPMD_LOG(ERR, "\t Error: Can't set bonding mode when port %d 
is not stopped\n",
port_id);
return;
}
 
/* Set the bonding mode for the relevant port. */
if (rte_eth_bond_mode_set(port_id, res->value) != 0)
-   fprintf(stderr, "\t Failed to set bonding mode for port = 
%d.\n",
+   TESTPMD_LOG(ERR, "\t Failed to set bonding mode for port = 
%d.\n",
port_id);
 }
 
@@ -98,23 +97,23 @@ static void 
cmd_set_bonding_lacp_dedicated_queues_parsed(void *parsed_result,
 
/** Check if the port is not started **/
if (port->port_status != RTE_PORT_STOPPED) {
-   fprintf(stderr, "Please stop port %d first\n", port_id);
+   TESTPMD_LOG(ERR, "Please stop port %d first\n", port_id);
return;
}
 
if (!strcmp(res->mode, "enable")) {
if (rte_eth_bond_8023ad_dedicated_queues_enable(port_id) == 0)
-   printf("Dedicate queues for LACP control packets"
+   TESTPMD_LOG(INFO, "Dedicate queues for LACP control 
packets"
" enabled\n");
else
-   printf("Enabling dedicate queues for LACP control "
+   TESTPMD_LOG(ERR, "Enabling dedicate queues for LACP 
control "
"packets on port %d failed\n", port_id);
} else if (!strcmp(res->mode, "disable")) {
if (rte_eth_bond_8023ad_dedicated_queues_disable(port_id) == 0)
-   printf("Dedicated queues for LACP control packets "
+   TESTPMD_LOG(INFO, "Dedicated queues for LACP control 
packets "
"disabled\n");
else
-   printf("Disabling dedicated queues for LACP control "
+   TESTPMD_LOG(ERR, "Disabling dedicated queues for LACP 
control "
"traffic on port %d failed\n", port_id);
}
 }
@@ -178,14 +177,13 @@ static void 
cmd_set_bonding_balance_xmit_policy_parsed(void *parsed_result,
} else if (!strcmp(res->policy, "l34")) {
policy = BALANCE_XMIT_POLICY_LAYER34;
} else {
-   fprintf(stderr, "\t Invalid xmit policy selection");
+   TESTPMD_LOG(ERR, "\t Invalid xmit policy selection");
return;
}
 
/* Set the bonding mode for the relevant port. */
if (rte_eth_bond_xmit_policy_set(port_id, policy) != 0) {
-   fprintf(stderr,
-   "\t Failed to set bonding balance xmit policy for port 
= %d.\n",
+   TESTPMD_LOG(ERR, "\t Failed to set bonding balance xmit policy 
for port = %d.\n",
port_id);
}
 }
@@ -239,7 +237,7 @@ static void cmd_show_bonding_config_parsed(void 
*parsed_result,
 
bonding_mode = rte_eth_bond_mode_get(port_id);
if (bonding_mode < 0) {
-   fprintf(stderr, "\tFailed to get bonding mode for port = %d\n",
+   TESTPMD_LOG(ERR, "\tFailed to get bonding mode for port = %d\n",
port_id);
return;
}
@@ -292,7 +290,7 @@ static void cmd_set_bonding_primary_parsed(void 
*parsed_result,
 
/* Set the primary member for a bonding device. */
if (rte_eth_bond_primary_set(main_port_id, member_port_id) != 0) {
-   fprintf(stderr, "\t Failed to set primary member for port = 
%d.\n",
+   TESTPMD_LOG(ERR, "\t Failed to set primary member for port = 
%d.\n",
main_port_id);
return;
}
@@ -348,8 +346,7 @@ static void cmd_add_bonding_member_parsed(void 
*parsed_result,
 
/* add the member for a bonding device. */
if (rte_eth_bond_member_add(main_port_id, member_port_id) != 0) {
-   fprintf(stderr,
-   "\t Failed to add member %d to main 

[PATCH 2/2] net/bonding: add command to set dedicated queue size

2024-06-23 Thread Chaoyong He
From: Long Wu 

The testpmd application can not modify the value of
dedicated hardware Rx/Tx queue size, and hardcoded
them as (128/512). This will cause the bonding port
start fail if some NIC requires more Rx/Tx descriptors
than the hardcoded number.

Therefore, add a command into testpmd application to
support the modification of the size of the dedicated
hardware Rx/Tx queue. Also export an external interface
to also let other applications can change it.

Signed-off-by: Long Wu 
Reviewed-by: Peng Zhang 
Reviewed-by: Chaoyong He 
---
 .../link_bonding_poll_mode_drv_lib.rst|  8 ++
 doc/guides/rel_notes/release_24_07.rst|  4 +
 drivers/net/bonding/bonding_testpmd.c | 84 +++
 drivers/net/bonding/eth_bond_8023ad_private.h |  3 +
 drivers/net/bonding/rte_eth_bond_8023ad.c | 39 +
 drivers/net/bonding/rte_eth_bond_8023ad.h | 23 +
 drivers/net/bonding/rte_eth_bond_pmd.c|  6 +-
 drivers/net/bonding/version.map   |  1 +
 8 files changed, 166 insertions(+), 2 deletions(-)

diff --git a/doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst 
b/doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst
index 60717a3587..6498cf7d3d 100644
--- a/doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst
+++ b/doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst
@@ -637,3 +637,11 @@ in balance mode with a transmission policy of layer 2+3::
 Members (3): [1 3 4]
 Active Members (3): [1 3 4]
 Primary: [3]
+
+set bonding lacp dedicated_queue size
+~
+
+Set hardware dedicated queue size for LACP control traffic in
+mode 4 (link-aggregation-802.3ad)::
+
+   testpmd> set bonding lacp dedicated_queues  (rxq|txq) queue_size 

diff --git a/doc/guides/rel_notes/release_24_07.rst 
b/doc/guides/rel_notes/release_24_07.rst
index e68a53d757..a17b5c4302 100644
--- a/doc/guides/rel_notes/release_24_07.rst
+++ b/doc/guides/rel_notes/release_24_07.rst
@@ -89,6 +89,10 @@ New Features
 
   * Added SSE/NEON vector datapath.
 
+* **Updated bonding driver.**
+
+  * Added new function ``rte_eth_bond_8023ad_dedicated_queue_size_set``
+to set hardware dedicated Rx/Tx queue size in mode-4.
 
 Removed Items
 -
diff --git a/drivers/net/bonding/bonding_testpmd.c 
b/drivers/net/bonding/bonding_testpmd.c
index 45b636fea7..540f0d64aa 100644
--- a/drivers/net/bonding/bonding_testpmd.c
+++ b/drivers/net/bonding/bonding_testpmd.c
@@ -154,6 +154,85 @@ static cmdline_parse_inst_t cmd_set_lacp_dedicated_queues 
= {
}
 };
 
+/* *** SET BONDING SLOW_QUEUE HW QUEUE SIZE *** */
+struct cmd_set_bonding_hw_dedicated_queue_size_result {
+   cmdline_fixed_string_t set;
+   cmdline_fixed_string_t bonding;
+   cmdline_fixed_string_t lacp;
+   cmdline_fixed_string_t dedicated_queues;
+   portid_t port_id;
+   cmdline_fixed_string_t queue_type;
+   cmdline_fixed_string_t queue_size;
+   uint16_t size;
+};
+
+static void cmd_set_bonding_hw_dedicated_queue_size_parsed(void *parsed_result,
+   __rte_unused struct cmdline *cl, __rte_unused void *data)
+{
+   int ret;
+   struct rte_port *port;
+   struct cmd_set_bonding_hw_dedicated_queue_size_result *res = 
parsed_result;
+
+   port = &ports[res->port_id];
+
+   /** Check if the port is not started **/
+   if (port->port_status != RTE_PORT_STOPPED) {
+   TESTPMD_LOG(ERR, "Please stop port %u first\n", res->port_id);
+   return;
+   }
+
+   ret = rte_eth_bond_8023ad_dedicated_queue_size_set(res->port_id,
+   res->size, res->queue_type);
+   if (ret != 0)
+   TESTPMD_LOG(ERR, "Failed to set port %u hardware dedicated %s "
+   "ring size %u\n",
+   res->port_id, res->queue_type, res->size);
+}
+
+static cmdline_parse_token_string_t cmd_setbonding_hw_dedicated_queue_size_set 
=
+   TOKEN_STRING_INITIALIZER(struct 
cmd_set_bonding_hw_dedicated_queue_size_result,
+   set, "set");
+static cmdline_parse_token_string_t 
cmd_setbonding_hw_dedicated_queue_size_bonding =
+   TOKEN_STRING_INITIALIZER(struct 
cmd_set_bonding_hw_dedicated_queue_size_result,
+   bonding, "bonding");
+static cmdline_parse_token_string_t 
cmd_setbonding_hw_dedicated_queue_size_lacp =
+   TOKEN_STRING_INITIALIZER(struct 
cmd_set_bonding_hw_dedicated_queue_size_result,
+   lacp, "lacp");
+static cmdline_parse_token_string_t 
cmd_setbonding_hw_dedicated_queue_size_dedicated =
+   TOKEN_STRING_INITIALIZER(struct 
cmd_set_bonding_hw_dedicated_queue_size_result,
+   dedicated_queues, "dedicated_queues");
+static cmdline_parse_token_num_t cmd_setbonding_hw_dedicated_queue_port_id =
+   TOKEN_NUM_INITIALIZER(struct 
cmd_set_bonding_hw_dedicated_queue_size_result,
+   port_id, RTE_UINT16);
+static cmdline_parse_token_string_t 
cmd_setbonding_h

[PATCH] net/mlx5: fix HWS GRE OPTION item validation

2024-06-23 Thread Gregory Etelson
1. GRE_OPTION flow item validation required both item spec and mask.

HWS pattern template provides item mask only.

The patch removes spec requirement in HWS GRE_OPTION item validation.

2. In non-HWS setup, GRE_OPTION flow item validation for the checksum and
sequence item parameters require group value.
HWS pattern template does not have a group.

The patch removes group validations for GRE_OPTION item.

Fixes: 113feae56db6 ("net/mlx5: validate HWS template items")
Signed-off-by: Gregory Etelson 
Acked-by: Dariusz Sosnowski 
---
 drivers/net/mlx5/mlx5_flow.c | 29 -
 1 file changed, 16 insertions(+), 13 deletions(-)

diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c
index 7bcbbc74b5..5e4e45eb3e 100644
--- a/drivers/net/mlx5/mlx5_flow.c
+++ b/drivers/net/mlx5/mlx5_flow.c
@@ -3388,7 +3388,7 @@ mlx5_flow_validate_item_gre_option(struct rte_eth_dev 
*dev,
return rte_flow_error_set(error, ENOTSUP,
  RTE_FLOW_ERROR_TYPE_ITEM, item,
  "GRE option following a wrong item");
-   if (!spec || !mask)
+   if ((!spec && !mlx5_hws_active(dev)) || !mask)
return rte_flow_error_set(error, EINVAL,
  RTE_FLOW_ERROR_TYPE_ITEM, item,
  "At least one field 
gre_option(checksum/key/sequence) must be specified");
@@ -3414,18 +3414,21 @@ mlx5_flow_validate_item_gre_option(struct rte_eth_dev 
*dev,
  RTE_FLOW_ERROR_TYPE_ITEM,
  item,
  "Sequence bit must be on");
-   if (mask->checksum_rsvd.checksum || mask->sequence.sequence) {
-   if (priv->sh->steering_format_version ==
-   MLX5_STEERING_LOGIC_FORMAT_CONNECTX_5 ||
-   ((attr->group || (attr->transfer && priv->fdb_def_rule)) &&
-!priv->sh->misc5_cap) ||
-   (!(priv->sh->tunnel_header_0_1 &&
-  priv->sh->tunnel_header_2_3) &&
-   !attr->group && (!attr->transfer || !priv->fdb_def_rule)))
-   return rte_flow_error_set(error, EINVAL,
- RTE_FLOW_ERROR_TYPE_ITEM,
- item,
- "Checksum/Sequence not 
supported");
+   if (!mlx5_hws_active(dev)) {
+   if (mask->checksum_rsvd.checksum || mask->sequence.sequence) {
+   if (priv->sh->steering_format_version ==
+   MLX5_STEERING_LOGIC_FORMAT_CONNECTX_5 ||
+   ((attr->group ||
+ (attr->transfer && priv->fdb_def_rule)) &&
+!priv->sh->misc5_cap) ||
+   (!(priv->sh->tunnel_header_0_1 &&
+  priv->sh->tunnel_header_2_3) &&
+!attr->group &&
+(!attr->transfer || !priv->fdb_def_rule)))
+   return rte_flow_error_set
+   (error, EINVAL, 
RTE_FLOW_ERROR_TYPE_ITEM,
+item, "Checksum/Sequence not 
supported");
+   }
}
ret = mlx5_flow_item_acceptable
(dev, item, (const uint8_t *)mask,
-- 
2.43.0



[PATCH v2 00/12] fixes and improvements to CNXK crypto PMD

2024-06-23 Thread Aakash Sasidharan
v2:
Fix compilation errors observed with arm gcc-13.

This series adds improvements to CNXK crypto PMD and fixes aes-gcm zero
length input failure.

Aakash Sasidharan (1):
  crypto/cnxk: fix aes-gcm zero len input cases

Anoob Joseph (11):
  common/cnxk: add comments to denote skipped entries
  crypto/cnxk: update version map file with PMD APIs
  common/cnxk: make inline dev PF func get as idev API
  crypto/cnxk: add flow control in Rx inject path
  crypto/cnxk: use SSO PF func of inline device in inst
  crypto/cnxk: use NEON for Rx inject inst preparation
  crypto/cnxk: remove init of CPT result field in packet
  crypto/cnxk: add dual submission in Rx inject
  crypto/cnxk: update sess pointer for next iteration
  crypto/cnxk: make pack IV variable as const
  crypto/cnxk: enable dual submission to CPT

 drivers/common/cnxk/roc_ae.c  |   6 +-
 drivers/common/cnxk/roc_ae_fpm_tables.c   |   6 +-
 drivers/common/cnxk/roc_cpt.c |  17 +-
 drivers/common/cnxk/roc_cpt.h |  51 +++--
 drivers/common/cnxk/roc_idev.c|   6 +
 drivers/common/cnxk/roc_idev.h|   2 +
 drivers/common/cnxk/roc_nix_inl.h |   1 -
 drivers/common/cnxk/roc_nix_inl_dev.c |   6 -
 drivers/common/cnxk/version.map   |   2 +-
 drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 234 +-
 drivers/crypto/cnxk/cn10k_cryptodev_ops.h |  60 +-
 drivers/crypto/cnxk/cnxk_cryptodev.h  |   2 +-
 drivers/crypto/cnxk/cnxk_cryptodev_ops.c  |  40 ++--
 drivers/crypto/cnxk/cnxk_cryptodev_ops.h  |   2 +
 drivers/crypto/cnxk/cnxk_se.h |  55 ++---
 drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h |   2 +
 drivers/crypto/cnxk/version.map   |   8 +
 drivers/event/cnxk/cnxk_eventdev_adptr.c  |   4 +-
 drivers/net/cnxk/cn10k_ethdev_sec.c   |   2 +-
 drivers/net/cnxk/cnxk_ethdev_telemetry.c  |   3 +-
 20 files changed, 275 insertions(+), 234 deletions(-)

-- 
2.25.1



[PATCH v2 01/12] common/cnxk: add comments to denote skipped entries

2024-06-23 Thread Aakash Sasidharan
From: Anoob Joseph 

Add comments to denote unused table entries.

Signed-off-by: Anoob Joseph 
---
 drivers/common/cnxk/roc_ae.c| 6 +++---
 drivers/common/cnxk/roc_ae_fpm_tables.c | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/common/cnxk/roc_ae.c b/drivers/common/cnxk/roc_ae.c
index e6a013d7c4..7ef0efe2b3 100644
--- a/drivers/common/cnxk/roc_ae.c
+++ b/drivers/common/cnxk/roc_ae.c
@@ -151,9 +151,9 @@ const struct roc_ae_ec_group ae_ec_grp[ROC_AE_EC_ID_PMAX] = 
{
 0x3F, 0x00},
.length = 66},
},
-   {},
-   {},
-   {},
+   { /* ROC_AE_EC_ID_P160 */ },
+   { /* ROC_AE_EC_ID_P320 */ },
+   { /* ROC_AE_EC_ID_P512 */ },
{
.prime = {.data = {0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
diff --git a/drivers/common/cnxk/roc_ae_fpm_tables.c 
b/drivers/common/cnxk/roc_ae_fpm_tables.c
index ead3128e7f..942657b56a 100644
--- a/drivers/common/cnxk/roc_ae_fpm_tables.c
+++ b/drivers/common/cnxk/roc_ae_fpm_tables.c
@@ -1261,9 +1261,9 @@ const struct ae_fpm_entry 
ae_fpm_tbl_scalar[ROC_AE_EC_ID_PMAX] = {
.data = ae_fpm_tbl_p521,
.len = sizeof(ae_fpm_tbl_p521)
},
-   {},
-   {},
-   {},
+   { /* ROC_AE_EC_ID_P160 */ },
+   { /* ROC_AE_EC_ID_P320 */ },
+   { /* ROC_AE_EC_ID_P512 */ },
{
.data = ae_fpm_tbl_p256_sm2,
.len = sizeof(ae_fpm_tbl_p256_sm2)
-- 
2.25.1



[PATCH v2 02/12] crypto/cnxk: update version map file with PMD APIs

2024-06-23 Thread Aakash Sasidharan
From: Anoob Joseph 

Update version map with details of PMD APIs added.

Signed-off-by: Anoob Joseph 
---
 drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h | 2 ++
 drivers/crypto/cnxk/version.map   | 8 
 2 files changed, 10 insertions(+)

diff --git a/drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h 
b/drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h
index 8b0a5ba0f2..eab1243065 100644
--- a/drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h
+++ b/drivers/crypto/cnxk/rte_pmd_cnxk_crypto.h
@@ -23,6 +23,7 @@
  * @return
  *   Pointer to queue pair structure that would be the input to submit APIs.
  */
+__rte_experimental
 void *rte_pmd_cnxk_crypto_qptr_get(uint8_t dev_id, uint16_t qp_id);
 
 /**
@@ -41,6 +42,7 @@ void *rte_pmd_cnxk_crypto_qptr_get(uint8_t dev_id, uint16_t 
qp_id);
  * @param nb_inst
  *   Number of instructions.
  */
+__rte_experimental
 void rte_pmd_cnxk_crypto_submit(void *qptr, void *inst, uint16_t nb_inst);
 
 #endif /* _PMD_CNXK_CRYPTO_H_ */
diff --git a/drivers/crypto/cnxk/version.map b/drivers/crypto/cnxk/version.map
index 5789a6bfc9..7a77607774 100644
--- a/drivers/crypto/cnxk/version.map
+++ b/drivers/crypto/cnxk/version.map
@@ -1,3 +1,11 @@
+EXPERIMENTAL {
+   global:
+
+   # added in 24.03
+   rte_pmd_cnxk_crypto_submit;
+   rte_pmd_cnxk_crypto_qptr_get;
+};
+
 INTERNAL {
global:
 
-- 
2.25.1



[PATCH v2 03/12] common/cnxk: make inline dev PF func get as idev API

2024-06-23 Thread Aakash Sasidharan
From: Anoob Joseph 

Inline PF FUNC would be required to set SSO_PF_FUNC in the instruction
for cryptodev Rx inject. Move the API to idev to allow usage of the
same.

Signed-off-by: Anoob Joseph 
---
 drivers/common/cnxk/roc_idev.c   | 6 ++
 drivers/common/cnxk/roc_idev.h   | 2 ++
 drivers/common/cnxk/roc_nix_inl.h| 1 -
 drivers/common/cnxk/roc_nix_inl_dev.c| 6 --
 drivers/common/cnxk/version.map  | 2 +-
 drivers/net/cnxk/cn10k_ethdev_sec.c  | 2 +-
 drivers/net/cnxk/cnxk_ethdev_telemetry.c | 3 +--
 7 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/drivers/common/cnxk/roc_idev.c b/drivers/common/cnxk/roc_idev.c
index d0307c666c..0778d51d1e 100644
--- a/drivers/common/cnxk/roc_idev.c
+++ b/drivers/common/cnxk/roc_idev.c
@@ -374,3 +374,9 @@ roc_idev_nix_rx_chan_set(uint16_t port, uint16_t chan)
if (idev != NULL && port < PLT_MAX_ETHPORTS)
__atomic_store_n(&idev->inl_rx_inj_cfg.chan[port], chan, 
__ATOMIC_RELEASE);
 }
+
+uint16_t
+roc_idev_nix_inl_dev_pffunc_get(void)
+{
+   return nix_inl_dev_pffunc_get();
+}
diff --git a/drivers/common/cnxk/roc_idev.h b/drivers/common/cnxk/roc_idev.h
index 00664eaed6..fc0f7db54e 100644
--- a/drivers/common/cnxk/roc_idev.h
+++ b/drivers/common/cnxk/roc_idev.h
@@ -27,4 +27,6 @@ uint8_t __roc_api roc_idev_nix_rx_inject_get(uint16_t port);
 void __roc_api roc_idev_nix_rx_inject_set(uint16_t port, uint8_t enable);
 uint16_t *__roc_api roc_idev_nix_rx_chan_base_get(void);
 void __roc_api roc_idev_nix_rx_chan_set(uint16_t port, uint16_t chan);
+
+uint16_t __roc_api roc_idev_nix_inl_dev_pffunc_get(void);
 #endif /* _ROC_IDEV_H_ */
diff --git a/drivers/common/cnxk/roc_nix_inl.h 
b/drivers/common/cnxk/roc_nix_inl.h
index ab0965e512..1a4bf8808c 100644
--- a/drivers/common/cnxk/roc_nix_inl.h
+++ b/drivers/common/cnxk/roc_nix_inl.h
@@ -112,7 +112,6 @@ void __roc_api roc_nix_inl_dev_lock(void);
 void __roc_api roc_nix_inl_dev_unlock(void);
 int __roc_api roc_nix_inl_dev_xaq_realloc(uint64_t aura_handle);
 int __roc_api roc_nix_inl_dev_stats_get(struct roc_nix_stats *stats);
-uint16_t __roc_api roc_nix_inl_dev_pffunc_get(void);
 int __roc_api roc_nix_inl_dev_cpt_setup(bool use_inl_dev_sso);
 int __roc_api roc_nix_inl_dev_cpt_release(void);
 bool __roc_api roc_nix_inl_dev_is_multi_channel(void);
diff --git a/drivers/common/cnxk/roc_nix_inl_dev.c 
b/drivers/common/cnxk/roc_nix_inl_dev.c
index 60e6a43033..e2bbe3a67b 100644
--- a/drivers/common/cnxk/roc_nix_inl_dev.c
+++ b/drivers/common/cnxk/roc_nix_inl_dev.c
@@ -34,12 +34,6 @@ nix_inl_dev_pffunc_get(void)
return 0;
 }
 
-uint16_t
-roc_nix_inl_dev_pffunc_get(void)
-{
-   return nix_inl_dev_pffunc_get();
-}
-
 static void
 nix_inl_selftest_work_cb(uint64_t *gw, void *args, uint32_t soft_exp_event)
 {
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index eac2ea9ff8..f98738d07e 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -112,6 +112,7 @@ INTERNAL {
roc_idev_npa_nix_get;
roc_idev_num_lmtlines_get;
roc_idev_nix_inl_meta_aura_get;
+   roc_idev_nix_inl_dev_pffunc_get;
roc_idev_nix_list_get;
roc_idev_nix_rx_chan_base_get;
roc_idev_nix_rx_chan_set;
@@ -244,7 +245,6 @@ INTERNAL {
roc_nix_inl_dev_is_probed;
roc_nix_inl_dev_stats_get;
roc_nix_inl_dev_lock;
-   roc_nix_inl_dev_pffunc_get;
roc_nix_inl_dev_rq;
roc_nix_inl_dev_rq_get;
roc_nix_inl_dev_rq_put;
diff --git a/drivers/net/cnxk/cn10k_ethdev_sec.c 
b/drivers/net/cnxk/cn10k_ethdev_sec.c
index b8b0da5ea9..5e509e97d4 100644
--- a/drivers/net/cnxk/cn10k_ethdev_sec.c
+++ b/drivers/net/cnxk/cn10k_ethdev_sec.c
@@ -1360,7 +1360,7 @@ cn10k_eth_sec_rx_inject_config(void *device, uint16_t 
port_id, bool enable)
inj_cfg->io_addr = inl_lf->io_addr;
inj_cfg->lmt_base = nix->lmt_base;
channel = roc_nix_get_base_chan(nix);
-   pf_func = roc_nix_inl_dev_pffunc_get();
+   pf_func = roc_idev_nix_inl_dev_pffunc_get();
inj_cfg->cmd_w0 = pf_func << 48 | inj_match_id << 32 | channel << 4;
 
return 0;
diff --git a/drivers/net/cnxk/cnxk_ethdev_telemetry.c 
b/drivers/net/cnxk/cnxk_ethdev_telemetry.c
index 3027ca4735..a1958185f2 100644
--- a/drivers/net/cnxk/cnxk_ethdev_telemetry.c
+++ b/drivers/net/cnxk/cnxk_ethdev_telemetry.c
@@ -65,8 +65,7 @@ ethdev_tel_handle_info(const char *cmd __rte_unused,
info = ð_info.info;
dev = cnxk_eth_pmd_priv(eth_dev);
if (dev) {
-   info->inl_dev_pf_func =
-   roc_nix_inl_dev_pffunc_get();
+   info->inl_dev_pf_func = 
roc_idev_nix_inl_dev_pffunc_get();
info->pf_func = roc_nix_get_pf_func(&dev->nix);
info->max_mac_entries = dev->max_mac_entries;
   

[PATCH v2 04/12] crypto/cnxk: add flow control in Rx inject path

2024-06-23 Thread Aakash Sasidharan
From: Anoob Joseph 

Add flow control in Rx inject path to avoid over submission to CPT.

Signed-off-by: Anoob Joseph 
---
 drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 16 +++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/crypto/cnxk/cn10k_cryptodev_ops.c 
b/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
index 720b756001..9f1c074925 100644
--- a/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
+++ b/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
@@ -1400,8 +1400,10 @@ cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct 
rte_mbuf **pkts,
struct rte_cryptodev *cdev = dev;
union cpt_res_s *hw_res = NULL;
struct cpt_inst_s *inst;
+   union cpt_fc_write_s fc;
struct cnxk_cpt_vf *vf;
struct rte_mbuf *m;
+   uint64_t *fc_addr;
uint64_t dptr;
int i;
 
@@ -1413,13 +1415,24 @@ cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct 
rte_mbuf **pkts,
 
lmt_base = vf->rx_inj_lmtline.lmt_base;
io_addr = vf->rx_inj_lmtline.io_addr;
+   fc_addr = vf->rx_inj_lmtline.fc_addr;
 
ROC_LMT_BASE_ID_GET(lmt_base, lmt_id);
pf_func = vf->rx_inj_pf_func;
 
+   const uint32_t fc_thresh = vf->rx_inj_lmtline.fc_thresh;
+
 again:
+   fc.u64[0] =
+   rte_atomic_load_explicit((RTE_ATOMIC(uint64_t) *)fc_addr, 
rte_memory_order_relaxed);
inst = (struct cpt_inst_s *)lmt_base;
-   for (i = 0; i < RTE_MIN(CN10K_PKTS_PER_LOOP, nb_pkts); i++) {
+
+   i = 0;
+
+   if (unlikely(fc.s.qsize > fc_thresh))
+   goto exit;
+
+   for (; i < RTE_MIN(CN10K_PKTS_PER_LOOP, nb_pkts); i++) {
 
m = pkts[i];
sec_sess = (struct cn10k_sec_session *)sess[i];
@@ -1487,6 +1500,7 @@ cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct 
rte_mbuf **pkts,
goto again;
}
 
+exit:
return count + i;
 }
 
-- 
2.25.1



[PATCH v2 05/12] crypto/cnxk: use SSO PF func of inline device in inst

2024-06-23 Thread Aakash Sasidharan
From: Anoob Joseph 

RVU PF FUNC of the CPT LF need not be set as the hardware would
determine that. Instead SSO PF FUNC need to be set as inline device so
that critical errors would reach inline device.

Signed-off-by: Anoob Joseph 
---
 drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 2 +-
 drivers/crypto/cnxk/cnxk_cryptodev.h  | 2 +-
 drivers/crypto/cnxk/cnxk_cryptodev_ops.c  | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/crypto/cnxk/cn10k_cryptodev_ops.c 
b/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
index 9f1c074925..f2980399c5 100644
--- a/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
+++ b/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
@@ -1418,7 +1418,7 @@ cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct 
rte_mbuf **pkts,
fc_addr = vf->rx_inj_lmtline.fc_addr;
 
ROC_LMT_BASE_ID_GET(lmt_base, lmt_id);
-   pf_func = vf->rx_inj_pf_func;
+   pf_func = vf->rx_inj_sso_pf_func;
 
const uint32_t fc_thresh = vf->rx_inj_lmtline.fc_thresh;
 
diff --git a/drivers/crypto/cnxk/cnxk_cryptodev.h 
b/drivers/crypto/cnxk/cnxk_cryptodev.h
index fffc4a47b4..4000e84a7e 100644
--- a/drivers/crypto/cnxk/cnxk_cryptodev.h
+++ b/drivers/crypto/cnxk/cnxk_cryptodev.h
@@ -22,7 +22,7 @@
  */
 struct cnxk_cpt_vf {
struct roc_cpt_lmtline rx_inj_lmtline;
-   uint16_t rx_inj_pf_func;
+   uint16_t rx_inj_sso_pf_func;
uint16_t *rx_chan_base;
struct roc_cpt cpt;
struct rte_cryptodev_capabilities crypto_caps[CNXK_CPT_MAX_CAPS];
diff --git a/drivers/crypto/cnxk/cnxk_cryptodev_ops.c 
b/drivers/crypto/cnxk/cnxk_cryptodev_ops.c
index d7f5780637..51369309c5 100644
--- a/drivers/crypto/cnxk/cnxk_cryptodev_ops.c
+++ b/drivers/crypto/cnxk/cnxk_cryptodev_ops.c
@@ -483,7 +483,7 @@ cnxk_cpt_queue_pair_setup(struct rte_cryptodev *dev, 
uint16_t qp_id,
goto exit;
}
 
-   vf->rx_inj_pf_func = qp->lf.pf_func;
+   vf->rx_inj_sso_pf_func = roc_idev_nix_inl_dev_pffunc_get();
 
/* Block the queue for other submissions */
qp->pend_q.pq_mask = 0;
-- 
2.25.1



[PATCH v2 06/12] crypto/cnxk: use NEON for Rx inject inst preparation

2024-06-23 Thread Aakash Sasidharan
From: Anoob Joseph 

Use NEON instructions for Rx inject instruction preparation.

Signed-off-by: Anoob Joseph 
Signed-off-by: Aakash Sasidharan 
---
 drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 62 +--
 1 file changed, 46 insertions(+), 16 deletions(-)

diff --git a/drivers/crypto/cnxk/cn10k_cryptodev_ops.c 
b/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
index f2980399c5..446a3c3fd8 100644
--- a/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
+++ b/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
@@ -7,6 +7,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 
@@ -1390,15 +1391,17 @@ cn10k_cpt_dequeue_burst(void *qptr, struct 
rte_crypto_op **ops, uint16_t nb_ops)
return i;
 }
 
+#if defined(RTE_ARCH_ARM64)
 uint16_t __rte_hot
 cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct rte_mbuf **pkts,
  struct rte_security_session **sess, uint16_t 
nb_pkts)
 {
-   uint16_t l2_len, pf_func, lmt_id, count = 0;
-   uint64_t lmt_base, lmt_arg, io_addr;
+   uint64_t lmt_base, lmt_arg, io_addr, u64_0, u64_1, l2_len, pf_func;
+   uint64x2_t inst_01, inst_23, inst_45, inst_67;
struct cn10k_sec_session *sec_sess;
struct rte_cryptodev *cdev = dev;
union cpt_res_s *hw_res = NULL;
+   uint16_t lmt_id, count = 0;
struct cpt_inst_s *inst;
union cpt_fc_write_s fc;
struct cnxk_cpt_vf *vf;
@@ -1456,26 +1459,41 @@ cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct 
rte_mbuf **pkts,
hw_res = RTE_PTR_ALIGN_CEIL(hw_res, 16);
 
/* Prepare CPT instruction */
-   inst->w0.u64 = 0;
-   inst->w2.u64 = 0;
-   inst->w2.s.rvu_pf_func = pf_func;
-   inst->w3.u64 = (((uint64_t)m + sizeof(struct rte_mbuf)) >> 3) 
<< 3 | 1;
 
-   inst->w4.u64 = sec_sess->inst.w4 | (rte_pktmbuf_pkt_len(m));
+   /* Word 0 and 1 */
+   inst_01 = vdupq_n_u64(0);
+   u64_0 = pf_func << 48 | *(vf->rx_chan_base + m->port) << 4 | 
(l2_len - 2) << 24 |
+   l2_len << 16;
+   inst_01 = vsetq_lane_u64(u64_0, inst_01, 0);
+   inst_01 = vsetq_lane_u64((uint64_t)hw_res, inst_01, 1);
+   vst1q_u64(&inst->w0.u64, inst_01);
+
+   /* Word 2 and 3 */
+   inst_23 = vdupq_n_u64(0);
+   u64_1 = (((uint64_t)m + sizeof(struct rte_mbuf)) >> 3) << 3 | 1;
+   inst_23 = vsetq_lane_u64(u64_1, inst_23, 1);
+   vst1q_u64(&inst->w2.u64, inst_23);
+
+   /* Word 4 and 5 */
+   inst_45 = vdupq_n_u64(0);
+   u64_0 = sec_sess->inst.w4 | (rte_pktmbuf_pkt_len(m));
+   inst_45 = vsetq_lane_u64(u64_0, inst_45, 0);
dptr = (uint64_t)rte_pktmbuf_iova(m);
-   inst->dptr = dptr;
-   inst->rptr = dptr;
-
-   inst->w0.hw_s.chan = *(vf->rx_chan_base + m->port);
-   inst->w0.hw_s.l2_len = l2_len;
-   inst->w0.hw_s.et_offset = l2_len - 2;
+   u64_1 = dptr;
+   inst_45 = vsetq_lane_u64(u64_1, inst_45, 1);
+   vst1q_u64(&inst->w4.u64, inst_45);
+
+   /* Word 6 and 7 */
+   inst_67 = vdupq_n_u64(0);
+   u64_0 = dptr;
+   u64_1 = sec_sess->inst.w7;
+   inst_67 = vsetq_lane_u64(u64_0, inst_67, 0);
+   inst_67 = vsetq_lane_u64(u64_1, inst_67, 1);
+   vst1q_u64(&inst->w6.u64, inst_67);
 
-   inst->res_addr = (uint64_t)hw_res;
rte_atomic_store_explicit((unsigned long __rte_atomic 
*)&hw_res->u64[0], res.u64[0],
  rte_memory_order_relaxed);
 
-   inst->w7.u64 = sec_sess->inst.w7;
-
inst += 2;
}
 
@@ -1503,6 +1521,18 @@ cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct 
rte_mbuf **pkts,
 exit:
return count + i;
 }
+#else
+uint16_t __rte_hot
+cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct rte_mbuf **pkts,
+ struct rte_security_session **sess, uint16_t 
nb_pkts)
+{
+   RTE_SET_USED(dev);
+   RTE_SET_USED(pkts);
+   RTE_SET_USED(sess);
+   RTE_SET_USED(nb_pkts);
+   return 0;
+}
+#endif
 
 void
 cn10k_cpt_set_enqdeq_fns(struct rte_cryptodev *dev, struct cnxk_cpt_vf *vf)
-- 
2.25.1



[PATCH v2 07/12] crypto/cnxk: remove init of CPT result field in packet

2024-06-23 Thread Aakash Sasidharan
From: Anoob Joseph 

The packet would be posted to CPT only when there is a valid result.
Skip setting of the same.

Signed-off-by: Anoob Joseph 
---
 drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 7 ---
 1 file changed, 7 deletions(-)

diff --git a/drivers/crypto/cnxk/cn10k_cryptodev_ops.c 
b/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
index 446a3c3fd8..90ca9eec27 100644
--- a/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
+++ b/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
@@ -1410,10 +1410,6 @@ cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct 
rte_mbuf **pkts,
uint64_t dptr;
int i;
 
-   const union cpt_res_s res = {
-   .cn10k.compcode = CPT_COMP_NOT_DONE,
-   };
-
vf = cdev->data->dev_private;
 
lmt_base = vf->rx_inj_lmtline.lmt_base;
@@ -1491,9 +1487,6 @@ cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct 
rte_mbuf **pkts,
inst_67 = vsetq_lane_u64(u64_1, inst_67, 1);
vst1q_u64(&inst->w6.u64, inst_67);
 
-   rte_atomic_store_explicit((unsigned long __rte_atomic 
*)&hw_res->u64[0], res.u64[0],
- rte_memory_order_relaxed);
-
inst += 2;
}
 
-- 
2.25.1



[PATCH v2 08/12] crypto/cnxk: add dual submission in Rx inject

2024-06-23 Thread Aakash Sasidharan
From: Anoob Joseph 

Add dual submission to CPT in Rx inject path.

Signed-off-by: Anoob Joseph 
Signed-off-by: Vidya Sagar Velumuri 
---
 drivers/common/cnxk/roc_cpt.h | 43 +-
 drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 70 +--
 drivers/crypto/cnxk/cnxk_cryptodev_ops.c  |  9 +++
 3 files changed, 90 insertions(+), 32 deletions(-)

diff --git a/drivers/common/cnxk/roc_cpt.h b/drivers/common/cnxk/roc_cpt.h
index 3721fa08c0..8ef9062ae0 100644
--- a/drivers/common/cnxk/roc_cpt.h
+++ b/drivers/common/cnxk/roc_cpt.h
@@ -30,23 +30,36 @@
 /* Vector of sizes in the burst of 16 CPT inst except first in 63:19 of
  * APT_LMT_ARG_S
  */
-#define ROC_CN10K_CPT_LMT_ARG  
\
-   (ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 0) |\
-ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 1) |\
-ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 2) |\
-ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 3) |\
-ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 4) |\
-ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 5) |\
-ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 6) |\
-ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 7) |\
-ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 8) |\
-ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 9) |\
-ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 10) |   \
-ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 11) |   \
-ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 12) |   \
-ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 13) |   \
+#define ROC_CN10K_CPT_LMT_ARG  
\
+   (ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 0) | ROC_CN10K_CPT_INST_DW_M1 << 
(19 + 3 * 1) | \
+ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 2) | ROC_CN10K_CPT_INST_DW_M1 << 
(19 + 3 * 3) | \
+ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 4) | ROC_CN10K_CPT_INST_DW_M1 << 
(19 + 3 * 5) | \
+ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 6) | ROC_CN10K_CPT_INST_DW_M1 << 
(19 + 3 * 7) | \
+ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 8) | ROC_CN10K_CPT_INST_DW_M1 << 
(19 + 3 * 9) | \
+ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 10) | ROC_CN10K_CPT_INST_DW_M1 
<< (19 + 3 * 11) |   \
+ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 12) | ROC_CN10K_CPT_INST_DW_M1 
<< (19 + 3 * 13) |   \
 ROC_CN10K_CPT_INST_DW_M1 << (19 + 3 * 14))
 
+/* Vector of sizes in the burst of 2 * 16 CPT inst except first in 63:19 of
+ * APT_LMT_ARG_S
+ */
+#define ROC_CN10K_DUAL_CPT_LMT_ARG 
\
+   (ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 0) | 
   \
+ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 1) | 
   \
+ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 2) | 
   \
+ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 3) | 
   \
+ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 4) | 
   \
+ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 5) | 
   \
+ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 6) | 
   \
+ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 7) | 
   \
+ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 8) | 
   \
+ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 9) | 
   \
+ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 10) |
   \
+ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 11) |
   \
+ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 12) |
   \
+ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 13) |
   \
+ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 14))
+
 /* CPT helper macros */
 #define ROC_CPT_AH_HDR_LEN 12
 #define ROC_CPT_AES_GCM_IV_LEN 8
diff --git a/drivers/crypto/cnxk/cn10k_cryptodev_ops.c 
b/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
index 90ca9eec27..a3a13c032e 100644
--- a/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
+++ b/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
@@ -55,6 +55,54 @@ struct vec_request {
uint64_t w2;
 };
 
+static __rte_always_inline void __rte_hot
+cn10k_cpt_lmtst_dual_submit(uint64_t *io_addr, const uint16_t lmt_id, int *i)
+{
+   uint64_t lmt_arg;
+

[PATCH v2 09/12] crypto/cnxk: update sess pointer for next iteration

2024-06-23 Thread Aakash Sasidharan
From: Anoob Joseph 

Update sess pointer while working on next set of packets.

Signed-off-by: Anoob Joseph 
---
 drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 13 -
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/crypto/cnxk/cn10k_cryptodev_ops.c 
b/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
index a3a13c032e..0d5a9ab5ef 100644
--- a/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
+++ b/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
@@ -1460,6 +1460,8 @@ cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct 
rte_mbuf **pkts,
 
vf = cdev->data->dev_private;
 
+   const int nb_pkts_per_loop = 2 * CN10K_PKTS_PER_LOOP;
+
lmt_base = vf->rx_inj_lmtline.lmt_base;
io_addr = vf->rx_inj_lmtline.io_addr;
fc_addr = vf->rx_inj_lmtline.fc_addr;
@@ -1479,7 +1481,7 @@ cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct 
rte_mbuf **pkts,
if (unlikely(fc.s.qsize > fc_thresh))
goto exit;
 
-   for (; i < RTE_MIN(2 * CN10K_PKTS_PER_LOOP, nb_pkts); i++) {
+   for (; i < RTE_MIN(nb_pkts_per_loop, nb_pkts); i++) {
 
m = pkts[i];
sec_sess = (struct cn10k_sec_session *)sess[i];
@@ -1540,10 +1542,11 @@ cn10k_cryptodev_sec_inb_rx_inject(void *dev, struct 
rte_mbuf **pkts,
 
cn10k_cpt_lmtst_dual_submit(&io_addr, lmt_id, &i);
 
-   if (nb_pkts - i > 0 && i == 2 * CN10K_PKTS_PER_LOOP) {
-   nb_pkts -= i;
-   pkts += i;
-   count += i;
+   if (nb_pkts - i > 0 && i == nb_pkts_per_loop) {
+   nb_pkts -= nb_pkts_per_loop;
+   pkts += nb_pkts_per_loop;
+   count += nb_pkts_per_loop;
+   sess += nb_pkts_per_loop;
goto again;
}
 
-- 
2.25.1



[PATCH v2 10/12] crypto/cnxk: fix aes-gcm zero len input cases

2024-06-23 Thread Aakash Sasidharan
For aes-gcm (AEAD) zero length input, sg code path is taken unlike
the digest only cases as AAD is treated as a separate input component.
Fix the zero len case in SG path by avoiding the gather component
only when it is a non AEAD algorithm. Also add sg version check as
the fix only applies to specific model.

Fixes: 4d8166d64988 ("crypto/cnxk: enable digest for zero length input")

Signed-off-by: Aakash Sasidharan 
---
 drivers/crypto/cnxk/cnxk_se.h | 28 +---
 1 file changed, 17 insertions(+), 11 deletions(-)

diff --git a/drivers/crypto/cnxk/cnxk_se.h b/drivers/crypto/cnxk/cnxk_se.h
index 6374718a82..63dbef4411 100644
--- a/drivers/crypto/cnxk/cnxk_se.h
+++ b/drivers/crypto/cnxk/cnxk_se.h
@@ -2468,13 +2468,14 @@ fill_sess_gmac(struct rte_crypto_sym_xform *xform, 
struct cnxk_se_sess *sess)
 }
 
 static __rte_always_inline uint32_t
-prepare_iov_from_pkt(struct rte_mbuf *pkt, struct roc_se_iov_ptr *iovec, 
uint32_t start_offset)
+prepare_iov_from_pkt(struct rte_mbuf *pkt, struct roc_se_iov_ptr *iovec, 
uint32_t start_offset,
+const bool is_aead, const bool is_sg_ver2)
 {
uint16_t index = 0;
void *seg_data = NULL;
int32_t seg_size = 0;
 
-   if (!pkt || pkt->data_len == 0) {
+   if (!pkt || (is_sg_ver2 && (pkt->data_len == 0) && !is_aead)) {
iovec->buf_cnt = 0;
return 0;
}
@@ -2619,13 +2620,13 @@ fill_sm_params(struct rte_crypto_op *cop, struct 
cnxk_se_sess *sess,
fc_params.dst_iov = (void *)dst;
 
/* Store SG I/O in the api for reuse */
-   if (prepare_iov_from_pkt(m_src, fc_params.src_iov, 0)) {
+   if (prepare_iov_from_pkt(m_src, fc_params.src_iov, 0, false, 
is_sg_ver2)) {
plt_dp_err("Prepare src iov failed");
ret = -EINVAL;
goto err_exit;
}
 
-   if (prepare_iov_from_pkt(m_dst, fc_params.dst_iov, 0)) {
+   if (prepare_iov_from_pkt(m_dst, fc_params.dst_iov, 0, false, 
is_sg_ver2)) {
plt_dp_err("Prepare dst iov failed for m_dst %p", 
m_dst);
ret = -EINVAL;
goto err_exit;
@@ -2816,14 +2817,15 @@ fill_fc_params(struct rte_crypto_op *cop, struct 
cnxk_se_sess *sess,
fc_params.dst_iov = (void *)dst;
 
/* Store SG I/O in the api for reuse */
-   if (prepare_iov_from_pkt(m_src, fc_params.src_iov, 0)) {
+   if (prepare_iov_from_pkt(m_src, fc_params.src_iov, 0, is_aead, 
is_sg_ver2)) {
plt_dp_err("Prepare src iov failed");
ret = -EINVAL;
goto err_exit;
}
 
if (unlikely(m_dst != NULL)) {
-   if (prepare_iov_from_pkt(m_dst, fc_params.dst_iov, 0)) {
+   if (prepare_iov_from_pkt(m_dst, fc_params.dst_iov, 0, 
is_aead,
+is_sg_ver2)) {
plt_dp_err("Prepare dst iov failed for "
   "m_dst %p",
   m_dst);
@@ -2957,13 +2959,15 @@ fill_pdcp_params(struct rte_crypto_op *cop, struct 
cnxk_se_sess *sess,
fc_params.dst_iov = (void *)dst;
 
/* Store SG I/O in the api for reuse */
-   if (unlikely(prepare_iov_from_pkt(m_src, fc_params.src_iov, 
0))) {
+   if (unlikely(
+   prepare_iov_from_pkt(m_src, fc_params.src_iov, 0, 
false, is_sg_ver2))) {
plt_dp_err("Prepare src iov failed");
ret = -EINVAL;
goto err_exit;
}
 
-   if (unlikely(prepare_iov_from_pkt(m_dst, fc_params.dst_iov, 
0))) {
+   if (unlikely(
+   prepare_iov_from_pkt(m_dst, fc_params.dst_iov, 0, 
false, is_sg_ver2))) {
plt_dp_err("Prepare dst iov failed for m_dst %p", 
m_dst);
ret = -EINVAL;
goto err_exit;
@@ -3080,14 +3084,16 @@ fill_pdcp_chain_params(struct rte_crypto_op *cop, 
struct cnxk_se_sess *sess,
fc_params.dst_iov = (void *)dst;
 
/* Store SG I/O in the api for reuse */
-   if (unlikely(prepare_iov_from_pkt(m_src, fc_params.src_iov, 
0))) {
+   if (unlikely(
+   prepare_iov_from_pkt(m_src, fc_params.src_iov, 0, 
false, is_sg_ver2))) {
plt_dp_err("Could not prepare src iov");
ret = -EINVAL;
goto err_exit;
}
 
if (unlikely(m_dst != NULL)) {
-   if (unlikely(prepare_iov_from_pkt(m_dst, 
fc_params.dst_iov, 0))) {
+   if (unlikely(prepare_iov_from_pkt(m_dst, 

[PATCH v2 11/12] crypto/cnxk: make pack IV variable as const

2024-06-23 Thread Aakash Sasidharan
From: Anoob Joseph 

Make 'pack_iv' variable as const to avoid multiple checks.

Signed-off-by: Anoob Joseph 
---
 drivers/crypto/cnxk/cnxk_se.h | 27 +--
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/drivers/crypto/cnxk/cnxk_se.h b/drivers/crypto/cnxk/cnxk_se.h
index 63dbef4411..dbd36a8a54 100644
--- a/drivers/crypto/cnxk/cnxk_se.h
+++ b/drivers/crypto/cnxk/cnxk_se.h
@@ -105,7 +105,7 @@ cpt_pack_iv(uint8_t *iv_src, uint8_t *iv_dst)
 }
 
 static inline void
-pdcp_iv_copy(uint8_t *iv_d, const uint8_t *iv_s, const uint8_t pdcp_alg_type, 
uint8_t pack_iv)
+pdcp_iv_copy(uint8_t *iv_d, const uint8_t *iv_s, const uint8_t pdcp_alg_type, 
const bool pack_iv)
 {
const uint32_t *iv_s_temp;
uint32_t iv_temp[4];
@@ -261,7 +261,7 @@ cpt_mac_len_verify(struct rte_crypto_auth_xform *auth)
 
 static __rte_always_inline int
 sg_inst_prep(struct roc_se_fc_params *params, struct cpt_inst_s *inst, 
uint64_t offset_ctrl,
-const uint8_t *iv_s, int iv_len, uint8_t pack_iv, uint8_t 
pdcp_alg_type,
+const uint8_t *iv_s, int iv_len, const bool pack_iv, uint8_t 
pdcp_alg_type,
 int32_t inputlen, int32_t outputlen, uint32_t passthrough_len, 
uint32_t req_flags,
 int pdcp_flag, int decrypt)
 {
@@ -457,7 +457,7 @@ sg_inst_prep(struct roc_se_fc_params *params, struct 
cpt_inst_s *inst, uint64_t
 
 static __rte_always_inline int
 sg2_inst_prep(struct roc_se_fc_params *params, struct cpt_inst_s *inst, 
uint64_t offset_ctrl,
- const uint8_t *iv_s, int iv_len, uint8_t pack_iv, uint8_t 
pdcp_alg_type,
+ const uint8_t *iv_s, int iv_len, const bool pack_iv, uint8_t 
pdcp_alg_type,
  int32_t inputlen, int32_t outputlen, uint32_t passthrough_len, 
uint32_t req_flags,
  int pdcp_flag, int decrypt)
 {
@@ -882,7 +882,7 @@ static inline int
 pdcp_chain_sg1_prep(struct roc_se_fc_params *params, struct roc_se_ctx 
*cpt_ctx,
struct cpt_inst_s *inst, union cpt_inst_w4 w4, int32_t 
inputlen,
uint8_t hdr_len, uint64_t offset_ctrl, uint32_t req_flags,
-   const uint8_t *cipher_iv, const uint8_t *auth_iv, const int 
pack_iv,
+   const uint8_t *cipher_iv, const uint8_t *auth_iv, const 
bool pack_iv,
const uint8_t pdcp_ci_alg, const uint8_t pdcp_auth_alg)
 {
struct roc_sglist_comp *scatter_comp, *gather_comp;
@@ -991,7 +991,7 @@ static inline int
 pdcp_chain_sg2_prep(struct roc_se_fc_params *params, struct roc_se_ctx 
*cpt_ctx,
struct cpt_inst_s *inst, union cpt_inst_w4 w4, int32_t 
inputlen,
uint8_t hdr_len, uint64_t offset_ctrl, uint32_t req_flags,
-   const uint8_t *cipher_iv, const uint8_t *auth_iv, const int 
pack_iv,
+   const uint8_t *cipher_iv, const uint8_t *auth_iv, const 
bool pack_iv,
const uint8_t pdcp_ci_alg, const uint8_t pdcp_auth_alg)
 {
struct roc_sg2list_comp *gather_comp, *scatter_comp;
@@ -1528,7 +1528,6 @@ cpt_pdcp_chain_alg_prep(uint32_t req_flags, uint64_t 
d_offs, uint64_t d_lens,
struct roc_se_ctx *se_ctx;
uint64_t *offset_vaddr;
uint64_t offset_ctrl;
-   uint8_t pack_iv = 0;
int32_t inputlen;
void *dm_vaddr;
uint8_t *iv_d;
@@ -1606,10 +1605,10 @@ cpt_pdcp_chain_alg_prep(uint32_t req_flags, uint64_t 
d_offs, uint64_t d_lens,
cpt_inst_w4.s.dlen = inputlen + ROC_SE_OFF_CTRL_LEN;
 
iv_d = ((uint8_t *)offset_vaddr + ROC_SE_OFF_CTRL_LEN);
-   pdcp_iv_copy(iv_d, cipher_iv, pdcp_ci_alg, pack_iv);
+   pdcp_iv_copy(iv_d, cipher_iv, pdcp_ci_alg, false);
 
iv_d = ((uint8_t *)offset_vaddr + ROC_SE_OFF_CTRL_LEN + 
pdcp_iv_off);
-   pdcp_iv_copy(iv_d, auth_iv, pdcp_auth_alg, pack_iv);
+   pdcp_iv_copy(iv_d, auth_iv, pdcp_auth_alg, false);
 
inst->w4.u64 = cpt_inst_w4.u64;
return 0;
@@ -1618,11 +1617,11 @@ cpt_pdcp_chain_alg_prep(uint32_t req_flags, uint64_t 
d_offs, uint64_t d_lens,
if (is_sg_ver2)
return pdcp_chain_sg2_prep(params, se_ctx, inst, 
cpt_inst_w4, inputlen,
   hdr_len, offset_ctrl, 
req_flags, cipher_iv,
-  auth_iv, pack_iv, 
pdcp_ci_alg, pdcp_auth_alg);
+  auth_iv, false, pdcp_ci_alg, 
pdcp_auth_alg);
else
return pdcp_chain_sg1_prep(params, se_ctx, inst, 
cpt_inst_w4, inputlen,
   hdr_len, offset_ctrl, 
req_flags, cipher_iv,
-  auth_iv, pack_iv, 
pdcp_ci_alg, pdcp_auth_alg);
+  auth_iv, false, pdcp_ci_alg, 
pdcp_auth_alg);
}
 }
 
@@ -1647,9 

[PATCH v2 12/12] crypto/cnxk: enable dual submission to CPT

2024-06-23 Thread Aakash Sasidharan
From: Anoob Joseph 

Submit two instructions in one LMTLINE.

Signed-off-by: Anoob Joseph 
---
 drivers/common/cnxk/roc_cpt.c |  17 +-
 drivers/common/cnxk/roc_cpt.h |   8 +-
 drivers/crypto/cnxk/cn10k_cryptodev_ops.c | 182 +-
 drivers/crypto/cnxk/cn10k_cryptodev_ops.h |  60 ++-
 drivers/crypto/cnxk/cnxk_cryptodev_ops.c  |  47 ++
 drivers/crypto/cnxk/cnxk_cryptodev_ops.h  |   2 +
 drivers/event/cnxk/cnxk_eventdev_adptr.c  |   4 +-
 7 files changed, 124 insertions(+), 196 deletions(-)

diff --git a/drivers/common/cnxk/roc_cpt.c b/drivers/common/cnxk/roc_cpt.c
index 9f283ceb2e..aba2a49d19 100644
--- a/drivers/common/cnxk/roc_cpt.c
+++ b/drivers/common/cnxk/roc_cpt.c
@@ -1135,8 +1135,8 @@ roc_cpt_iq_enable(struct roc_cpt_lf *lf)
 }
 
 int
-roc_cpt_lmtline_init(struct roc_cpt *roc_cpt, struct roc_cpt_lmtline *lmtline,
-int lf_id)
+roc_cpt_lmtline_init(struct roc_cpt *roc_cpt, struct roc_cpt_lmtline *lmtline, 
int lf_id,
+bool is_dual)
 {
struct roc_cpt_lf *lf;
 
@@ -1145,12 +1145,19 @@ roc_cpt_lmtline_init(struct roc_cpt *roc_cpt, struct 
roc_cpt_lmtline *lmtline,
return -ENOTSUP;
 
lmtline->io_addr = lf->io_addr;
-   if (roc_model_is_cn10k())
-   lmtline->io_addr |= ROC_CN10K_CPT_INST_DW_M1 << 4;
+   lmtline->fc_thresh = lf->nb_desc - CPT_LF_FC_MIN_THRESHOLD;
+
+   if (roc_model_is_cn10k()) {
+   if (is_dual) {
+   lmtline->io_addr |= ROC_CN10K_TWO_CPT_INST_DW_M1 << 4;
+   lmtline->fc_thresh = lf->nb_desc -  2 * 
CPT_LF_FC_MIN_THRESHOLD;
+   } else {
+   lmtline->io_addr |= ROC_CN10K_CPT_INST_DW_M1 << 4;
+   }
+   }
 
lmtline->fc_addr = lf->fc_addr;
lmtline->lmt_base = lf->lmt_base;
-   lmtline->fc_thresh = lf->nb_desc - CPT_LF_FC_MIN_THRESHOLD;
 
return 0;
 }
diff --git a/drivers/common/cnxk/roc_cpt.h b/drivers/common/cnxk/roc_cpt.h
index 8ef9062ae0..e2e919f80f 100644
--- a/drivers/common/cnxk/roc_cpt.h
+++ b/drivers/common/cnxk/roc_cpt.h
@@ -200,12 +200,12 @@ int __roc_api roc_cpt_afs_print(struct roc_cpt *roc_cpt);
 int __roc_api roc_cpt_lfs_print(struct roc_cpt *roc_cpt);
 void __roc_api roc_cpt_iq_disable(struct roc_cpt_lf *lf);
 void __roc_api roc_cpt_iq_enable(struct roc_cpt_lf *lf);
-int __roc_api roc_cpt_lmtline_init(struct roc_cpt *roc_cpt,
-  struct roc_cpt_lmtline *lmtline, int lf_id);
+int __roc_api roc_cpt_lmtline_init(struct roc_cpt *roc_cpt, struct 
roc_cpt_lmtline *lmtline,
+  int lf_id, bool is_dual);
 
 void __roc_api roc_cpt_parse_hdr_dump(FILE *file, const struct cpt_parse_hdr_s 
*cpth);
-int __roc_api roc_cpt_ctx_write(struct roc_cpt_lf *lf, void *sa_dptr,
-   void *sa_cptr, uint16_t sa_len);
+int __roc_api roc_cpt_ctx_write(struct roc_cpt_lf *lf, void *sa_dptr, void 
*sa_cptr,
+   uint16_t sa_len);
 
 void __roc_api roc_cpt_int_misc_cb_register(roc_cpt_int_misc_cb_t cb, void 
*args);
 int __roc_api roc_cpt_int_misc_cb_unregister(roc_cpt_int_misc_cb_t cb, void 
*args);
diff --git a/drivers/crypto/cnxk/cn10k_cryptodev_ops.c 
b/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
index 0d5a9ab5ef..9d6ac06bd2 100644
--- a/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
+++ b/drivers/crypto/cnxk/cn10k_cryptodev_ops.c
@@ -12,11 +12,6 @@
 #include 
 
 #include "roc_cpt.h"
-#if defined(__aarch64__)
-#include "roc_io.h"
-#else
-#include "roc_io_generic.h"
-#endif
 #include "roc_idev.h"
 #include "roc_sso.h"
 #include "roc_sso_dp.h"
@@ -40,8 +35,8 @@
 
 /* Holds information required to send crypto operations in one burst */
 struct ops_burst {
-   struct rte_crypto_op *op[CN10K_PKTS_PER_LOOP];
-   uint64_t w2[CN10K_PKTS_PER_LOOP];
+   struct rte_crypto_op *op[CN10K_CPT_PKTS_PER_LOOP];
+   uint64_t w2[CN10K_CPT_PKTS_PER_LOOP];
struct cn10k_sso_hws *ws;
struct cnxk_cpt_qp *qp;
uint16_t nb_ops;
@@ -55,54 +50,6 @@ struct vec_request {
uint64_t w2;
 };
 
-static __rte_always_inline void __rte_hot
-cn10k_cpt_lmtst_dual_submit(uint64_t *io_addr, const uint16_t lmt_id, int *i)
-{
-   uint64_t lmt_arg;
-
-   /* Check if the total number of instructions is odd or even. */
-   const int flag_odd = *i & 0x1;
-
-   /* Reduce i by 1 when odd number of instructions.*/
-   *i -= flag_odd;
-
-   if (*i > 2 * CN10K_PKTS_PER_STEORL) {
-   lmt_arg = ROC_CN10K_DUAL_CPT_LMT_ARG | (CN10K_PKTS_PER_STEORL - 
1) << 12 |
- (uint64_t)lmt_id;
-   roc_lmt_submit_steorl(lmt_arg, *io_addr);
-   lmt_arg = ROC_CN10K_DUAL_CPT_LMT_ARG | (*i / 2 - 
CN10K_PKTS_PER_STEORL - 1) << 12 |
- (uint64_t)(lmt_id + CN10K_PKTS_PER_STEORL);
-   roc_lmt_submit_steorl(lmt_arg, *io_addr);
-   if (fla