From: Vidya Sagar Velumuri <vvelum...@marvell.com>

Add lmtst routines for cn20k

Signed-off-by: Vidya Sagar Velumuri <vvelum...@marvell.com>
---
 drivers/common/cnxk/roc_cpt.h             |  7 +--
 drivers/crypto/cnxk/cn20k_cryptodev_ops.h | 53 +++++++++++++++++++++++
 2 files changed, 57 insertions(+), 3 deletions(-)

diff --git a/drivers/common/cnxk/roc_cpt.h b/drivers/common/cnxk/roc_cpt.h
index 37634793d4..02f49c06b7 100644
--- a/drivers/common/cnxk/roc_cpt.h
+++ b/drivers/common/cnxk/roc_cpt.h
@@ -64,9 +64,10 @@
         ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 13) |                        
                   \
         ROC_CN10K_TWO_CPT_INST_DW_M1 << (19 + 3 * 14))
 
-#define ROC_CN20K_CPT_LMT_ARG     ROC_CN10K_CPT_LMT_ARG
-#define ROC_CN20K_DUAL_CPT_LMT_ARG ROC_CN10K_DUAL_CPT_LMT_ARG
-#define ROC_CN20K_CPT_INST_DW_M1   ROC_CN10K_CPT_INST_DW_M1
+#define ROC_CN20K_CPT_LMT_ARG       ROC_CN10K_CPT_LMT_ARG
+#define ROC_CN20K_DUAL_CPT_LMT_ARG   ROC_CN10K_DUAL_CPT_LMT_ARG
+#define ROC_CN20K_CPT_INST_DW_M1     ROC_CN10K_CPT_INST_DW_M1
+#define ROC_CN20K_TWO_CPT_INST_DW_M1 ROC_CN10K_TWO_CPT_INST_DW_M1
 
 /* CPT helper macros */
 #define ROC_CPT_AH_HDR_LEN     12
diff --git a/drivers/crypto/cnxk/cn20k_cryptodev_ops.h 
b/drivers/crypto/cnxk/cn20k_cryptodev_ops.h
index d9594513d1..bdd6f71022 100644
--- a/drivers/crypto/cnxk/cn20k_cryptodev_ops.h
+++ b/drivers/crypto/cnxk/cn20k_cryptodev_ops.h
@@ -18,7 +18,60 @@
 
 #include "cnxk_cryptodev.h"
 
+#define CN20K_PKTS_PER_STEORL    32
+#define CN20K_LMTLINES_PER_STEORL 16
+
 extern struct rte_cryptodev_ops cn20k_cpt_ops;
 
 void cn20k_cpt_set_enqdeq_fns(struct rte_cryptodev *dev);
+
+static __rte_always_inline void __rte_hot
+cn20k_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 > CN20K_PKTS_PER_STEORL) {
+               lmt_arg = ROC_CN20K_DUAL_CPT_LMT_ARG | 
(CN20K_LMTLINES_PER_STEORL - 1) << 12 |
+                         (uint64_t)lmt_id;
+               roc_lmt_submit_steorl(lmt_arg, *io_addr);
+               lmt_arg = ROC_CN20K_DUAL_CPT_LMT_ARG |
+                         (*i / 2 - CN20K_LMTLINES_PER_STEORL - 1) << 12 |
+                         (uint64_t)(lmt_id + CN20K_LMTLINES_PER_STEORL);
+               roc_lmt_submit_steorl(lmt_arg, *io_addr);
+               if (flag_odd) {
+                       *io_addr = (*io_addr & ~(uint64_t)(0x7 << 4)) |
+                                  (ROC_CN20K_CPT_INST_DW_M1 << 4);
+                       lmt_arg = (uint64_t)(lmt_id + *i / 2);
+                       roc_lmt_submit_steorl(lmt_arg, *io_addr);
+                       *io_addr = (*io_addr & ~(uint64_t)(0x7 << 4)) |
+                                  (ROC_CN20K_TWO_CPT_INST_DW_M1 << 4);
+                       *i += 1;
+               }
+       } else {
+               if (*i != 0) {
+                       lmt_arg =
+                               ROC_CN20K_DUAL_CPT_LMT_ARG | (*i / 2 - 1) << 12 
| (uint64_t)lmt_id;
+                       roc_lmt_submit_steorl(lmt_arg, *io_addr);
+               }
+
+               if (flag_odd) {
+                       *io_addr = (*io_addr & ~(uint64_t)(0x7 << 4)) |
+                                  (ROC_CN20K_CPT_INST_DW_M1 << 4);
+                       lmt_arg = (uint64_t)(lmt_id + *i / 2);
+                       roc_lmt_submit_steorl(lmt_arg, *io_addr);
+                       *io_addr = (*io_addr & ~(uint64_t)(0x7 << 4)) |
+                                  (ROC_CN20K_TWO_CPT_INST_DW_M1 << 4);
+                       *i += 1;
+               }
+       }
+
+       rte_io_wmb();
+}
+
 #endif /* _CN20K_CRYPTODEV_OPS_H_ */
-- 
2.25.1

Reply via email to