common/cnxk: support multi channel for SDP send queues
[dpdk.git] / drivers / common / cnxk / roc_nix_inl.c
index fb08d3d..cba1ae9 100644 (file)
@@ -158,6 +158,8 @@ roc_nix_inl_inb_spi_range(struct roc_nix *roc_nix, bool inb_inl_dev,
 
        inl_dev = idev->nix_inl_dev;
        if (inb_inl_dev) {
+               if (inl_dev == NULL)
+                       goto exit;
                min = inl_dev->ipsec_in_min_spi;
                max = inl_dev->ipsec_in_max_spi;
                mask = inl_dev->inb_spi_mask;
@@ -217,6 +219,14 @@ roc_nix_inl_inb_sa_get(struct roc_nix *roc_nix, bool inb_inl_dev, uint32_t spi)
        if (!sa_base)
                return 0;
 
+       /* Get SA size */
+       sz = roc_nix_inl_inb_sa_sz(roc_nix, inb_inl_dev);
+       if (!sz)
+               return 0;
+
+       if (roc_nix->custom_sa_action)
+               return (sa_base + (spi * sz));
+
        /* Check if SPI is in range */
        mask = roc_nix_inl_inb_spi_range(roc_nix, inb_inl_dev, &min_spi,
                                         &max_spi);
@@ -224,15 +234,33 @@ roc_nix_inl_inb_sa_get(struct roc_nix *roc_nix, bool inb_inl_dev, uint32_t spi)
                plt_warn("Inbound SA SPI %u not in range (%u..%u)", spi,
                         min_spi, max_spi);
 
-       /* Get SA size */
-       sz = roc_nix_inl_inb_sa_sz(roc_nix, inb_inl_dev);
-       if (!sz)
-               return 0;
-
        /* Basic logic of SPI->SA for now */
        return (sa_base + ((spi & mask) * sz));
 }
 
+int
+roc_nix_reassembly_configure(uint32_t max_wait_time, uint16_t max_frags)
+{
+       struct idev_cfg *idev = idev_get_cfg();
+       struct roc_cpt *roc_cpt;
+       struct roc_cpt_rxc_time_cfg cfg;
+
+       PLT_SET_USED(max_frags);
+       roc_cpt = idev->cpt;
+       if (!roc_cpt) {
+               plt_err("Cannot support inline inbound, cryptodev not probed");
+               return -ENOTSUP;
+       }
+
+       cfg.step = (max_wait_time * 1000 / ROC_NIX_INL_REAS_ACTIVE_LIMIT);
+       cfg.zombie_limit = ROC_NIX_INL_REAS_ZOMBIE_LIMIT;
+       cfg.zombie_thres = ROC_NIX_INL_REAS_ZOMBIE_THRESHOLD;
+       cfg.active_limit = ROC_NIX_INL_REAS_ACTIVE_LIMIT;
+       cfg.active_thres = ROC_NIX_INL_REAS_ACTIVE_THRESHOLD;
+
+       return roc_cpt_rxc_time_cfg(roc_cpt, &cfg);
+}
+
 int
 roc_nix_inl_inb_init(struct roc_nix *roc_nix)
 {
@@ -307,12 +335,13 @@ roc_nix_inl_outb_init(struct roc_nix *roc_nix)
        struct dev *dev = &nix->dev;
        struct msix_offset_rsp *rsp;
        struct nix_inl_dev *inl_dev;
+       size_t sa_sz, ring_sz;
        uint16_t sso_pffunc;
        uint8_t eng_grpmask;
        uint64_t blkaddr, i;
+       uint64_t *ring_base;
        uint16_t nb_lf;
        void *sa_base;
-       size_t sa_sz;
        int j, rc;
        void *sa;
 
@@ -445,16 +474,16 @@ skip_sa_alloc:
        /* Allocate memory to be used as a ring buffer to poll for
         * soft expiry event from ucode
         */
+       ring_sz = (ROC_IPSEC_ERR_RING_MAX_ENTRY + 1) * sizeof(uint64_t);
+       ring_base = inl_dev->sa_soft_exp_ring;
        for (i = 0; i < nix->outb_se_ring_cnt; i++) {
-               inl_dev->sa_soft_exp_ring[nix->outb_se_ring_base + i] =
-                       plt_zmalloc((ROC_IPSEC_ERR_RING_MAX_ENTRY + 1) *
-                                           sizeof(uint64_t),
-                                   0);
-               if (!inl_dev->sa_soft_exp_ring[i]) {
+               ring_base[nix->outb_se_ring_base + i] =
+                       PLT_U64_CAST(plt_zmalloc(ring_sz, 0));
+               if (!ring_base[nix->outb_se_ring_base + i]) {
                        plt_err("Couldn't allocate memory for soft exp ring");
                        while (i--)
-                               plt_free(inl_dev->sa_soft_exp_ring
-                                                [nix->outb_se_ring_base + i]);
+                               plt_free(PLT_PTR_CAST(
+                                       ring_base[nix->outb_se_ring_base + i]));
                        rc = -ENOMEM;
                        goto lf_fini;
                }
@@ -481,6 +510,7 @@ roc_nix_inl_outb_fini(struct roc_nix *roc_nix)
        struct idev_cfg *idev = idev_get_cfg();
        struct dev *dev = &nix->dev;
        struct nix_inl_dev *inl_dev;
+       uint64_t *ring_base;
        int i, rc, ret = 0;
 
        if (!nix->inl_outb_ena)
@@ -514,10 +544,11 @@ roc_nix_inl_outb_fini(struct roc_nix *roc_nix)
 
        if (idev && idev->nix_inl_dev) {
                inl_dev = idev->nix_inl_dev;
+               ring_base = inl_dev->sa_soft_exp_ring;
 
                for (i = 0; i < ROC_NIX_INL_MAX_SOFT_EXP_RNGS; i++) {
-                       if (inl_dev->sa_soft_exp_ring[i])
-                               plt_free(inl_dev->sa_soft_exp_ring[i]);
+                       if (ring_base[i])
+                               plt_free(PLT_PTR_CAST(ring_base[i]));
                }
        }