]> git.droids-corp.org - dpdk.git/commitdiff
net/cnxk: add devargs for min-max SPI
authorNithin Dabilpuram <ndabilpuram@marvell.com>
Tue, 22 Feb 2022 19:35:10 +0000 (01:05 +0530)
committerJerin Jacob <jerinj@marvell.com>
Wed, 23 Feb 2022 16:38:20 +0000 (17:38 +0100)
Add support for inline inbound SPI range via devargs
instead of just max SPI value and range being 0..max.

Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
13 files changed:
doc/guides/nics/cnxk.rst
drivers/common/cnxk/roc_nix.h
drivers/common/cnxk/roc_nix_inl.c
drivers/common/cnxk/roc_nix_inl.h
drivers/common/cnxk/roc_nix_inl_dev.c
drivers/common/cnxk/roc_nix_inl_priv.h
drivers/common/cnxk/roc_nix_priv.h
drivers/common/cnxk/version.map
drivers/net/cnxk/cn10k_ethdev_sec.c
drivers/net/cnxk/cn9k_ethdev_sec.c
drivers/net/cnxk/cnxk_ethdev_devargs.c
drivers/net/cnxk/cnxk_ethdev_sec.c
drivers/net/cnxk/cnxk_lookup.c

index c9467f5d2aeef934bdbd1d8b31d15977ab9e6407..be51ca214635c98e27fede2a6057c9f1da9195a4 100644 (file)
@@ -215,6 +215,18 @@ Runtime Config Options
 
       -a 0002:02:00.0,tag_as_xor=1
 
+- ``Min SPI for inbound inline IPsec`` (default ``0``)
+
+   Min SPI supported for inbound inline IPsec processing can be specified by
+   ``ipsec_in_min_spi`` ``devargs`` parameter.
+
+   For example::
+
+      -a 0002:02:00.0,ipsec_in_min_spi=6
+
+   With the above configuration, application can enable inline IPsec processing
+   for inbound SA with min SPI of 6.
+
 - ``Max SPI for inbound inline IPsec`` (default ``255``)
 
    Max SPI supported for inbound inline IPsec processing can be specified by
@@ -225,7 +237,7 @@ Runtime Config Options
       -a 0002:02:00.0,ipsec_in_max_spi=128
 
    With the above configuration, application can enable inline IPsec processing
-   for 128 inbound SAs (SPI 0-127).
+   with max SPI of 128.
 
 - ``Max SA's for outbound inline IPsec`` (default ``4096``)
 
@@ -414,6 +426,18 @@ VF ``177D:A0F1``.
 Runtime Config Options for inline device
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+- ``Min SPI for inbound inline IPsec`` (default ``0``)
+
+   Min SPI supported for inbound inline IPsec processing can be specified by
+   ``ipsec_in_min_spi`` ``devargs`` parameter.
+
+   For example::
+
+      -a 0002:1d:00.0,ipsec_in_min_spi=6
+
+   With the above configuration, application can enable inline IPsec processing
+   for inbound SA with min SPI of 6 for traffic aggregated on inline device.
+
 - ``Max SPI for inbound inline IPsec`` (default ``255``)
 
    Max SPI supported for inbound inline IPsec processing can be specified by
@@ -424,7 +448,7 @@ Runtime Config Options for inline device
       -a 0002:1d:00.0,ipsec_in_max_spi=128
 
    With the above configuration, application can enable inline IPsec processing
-   for 128 inbound SAs (SPI 0-127) for traffic aggregated on inline device.
+   for inbound SA with max SPI of 128 for traffic aggregated on inline device.
 
 
 Debugging Options
index 9546315761c6fb41e49c69730d0c1f80abeb1155..10e837538e418d440d1436dc6e1a7195503027f2 100644 (file)
@@ -395,8 +395,9 @@ struct roc_nix {
        uint8_t lock_rx_ctx;
        uint32_t outb_nb_desc;
        uint16_t outb_nb_crypto_qs;
-       uint16_t ipsec_in_max_spi;
-       uint16_t ipsec_out_max_sa;
+       uint32_t ipsec_in_min_spi;
+       uint32_t ipsec_in_max_spi;
+       uint32_t ipsec_out_max_sa;
        bool ipsec_out_sso_pffunc;
        /* End of input parameters */
        /* LMT line base for "Per Core Tx LMT line" mode*/
index 11a169137b6d736f2d2f89ddb677ed7ce99e9910..7bf89a44c14d5681b88fb72b77b63cea6f590bd2 100644 (file)
@@ -19,12 +19,16 @@ PLT_STATIC_ASSERT(ROC_NIX_INL_OT_IPSEC_OUTB_SA_SZ ==
 static int
 nix_inl_inb_sa_tbl_setup(struct roc_nix *roc_nix)
 {
-       uint16_t ipsec_in_max_spi = roc_nix->ipsec_in_max_spi;
+       uint32_t ipsec_in_min_spi = roc_nix->ipsec_in_min_spi;
+       uint32_t ipsec_in_max_spi = roc_nix->ipsec_in_max_spi;
        struct nix *nix = roc_nix_to_nix_priv(roc_nix);
        struct roc_nix_ipsec_cfg cfg;
+       uint64_t max_sa, i;
        size_t inb_sa_sz;
-       int rc, i;
        void *sa;
+       int rc;
+
+       max_sa = plt_align32pow2(ipsec_in_max_spi - ipsec_in_min_spi + 1);
 
        /* CN9K SA size is different */
        if (roc_model_is_cn9k())
@@ -34,14 +38,15 @@ nix_inl_inb_sa_tbl_setup(struct roc_nix *roc_nix)
 
        /* Alloc contiguous memory for Inbound SA's */
        nix->inb_sa_sz = inb_sa_sz;
-       nix->inb_sa_base = plt_zmalloc(inb_sa_sz * ipsec_in_max_spi,
+       nix->inb_spi_mask = max_sa - 1;
+       nix->inb_sa_base = plt_zmalloc(inb_sa_sz * max_sa,
                                       ROC_NIX_INL_SA_BASE_ALIGN);
        if (!nix->inb_sa_base) {
                plt_err("Failed to allocate memory for Inbound SA");
                return -ENOMEM;
        }
        if (roc_model_is_cn10k()) {
-               for (i = 0; i < ipsec_in_max_spi; i++) {
+               for (i = 0; i < max_sa; i++) {
                        sa = ((uint8_t *)nix->inb_sa_base) + (i * inb_sa_sz);
                        roc_ot_ipsec_inb_sa_init(sa, true);
                }
@@ -50,7 +55,7 @@ nix_inl_inb_sa_tbl_setup(struct roc_nix *roc_nix)
        memset(&cfg, 0, sizeof(cfg));
        cfg.sa_size = inb_sa_sz;
        cfg.iova = (uintptr_t)nix->inb_sa_base;
-       cfg.max_sa = ipsec_in_max_spi + 1;
+       cfg.max_sa = max_sa;
        cfg.tt = SSO_TT_ORDERED;
 
        /* Setup device specific inb SA table */
@@ -135,11 +140,13 @@ roc_nix_inl_inb_sa_base_get(struct roc_nix *roc_nix, bool inb_inl_dev)
 }
 
 uint32_t
-roc_nix_inl_inb_sa_max_spi(struct roc_nix *roc_nix, bool inb_inl_dev)
+roc_nix_inl_inb_spi_range(struct roc_nix *roc_nix, bool inb_inl_dev,
+                         uint32_t *min_spi, uint32_t *max_spi)
 {
        struct idev_cfg *idev = idev_get_cfg();
+       uint32_t min = 0, max = 0, mask = 0;
        struct nix_inl_dev *inl_dev;
-       struct nix *nix;
+       struct nix *nix = NULL;
 
        if (idev == NULL)
                return 0;
@@ -147,20 +154,25 @@ roc_nix_inl_inb_sa_max_spi(struct roc_nix *roc_nix, bool inb_inl_dev)
        if (!inb_inl_dev && roc_nix == NULL)
                return -EINVAL;
 
-       if (roc_nix) {
+       inl_dev = idev->nix_inl_dev;
+       if (inb_inl_dev) {
+               min = inl_dev->ipsec_in_min_spi;
+               max = inl_dev->ipsec_in_max_spi;
+               mask = inl_dev->inb_spi_mask;
+       } else {
                nix = roc_nix_to_nix_priv(roc_nix);
                if (!nix->inl_inb_ena)
-                       return 0;
-       }
-
-       if (inb_inl_dev) {
-               inl_dev = idev->nix_inl_dev;
-               if (inl_dev)
-                       return inl_dev->ipsec_in_max_spi;
-               return 0;
-       }
-
-       return roc_nix->ipsec_in_max_spi;
+                       goto exit;
+               min = roc_nix->ipsec_in_min_spi;
+               max = roc_nix->ipsec_in_max_spi;
+               mask = nix->inb_spi_mask;
+       }
+exit:
+       if (min_spi)
+               *min_spi = min;
+       if (max_spi)
+               *max_spi = max;
+       return mask;
 }
 
 uint32_t
@@ -194,8 +206,8 @@ roc_nix_inl_inb_sa_sz(struct roc_nix *roc_nix, bool inl_dev_sa)
 uintptr_t
 roc_nix_inl_inb_sa_get(struct roc_nix *roc_nix, bool inb_inl_dev, uint32_t spi)
 {
+       uint32_t max_spi, min_spi, mask;
        uintptr_t sa_base;
-       uint32_t max_spi;
        uint64_t sz;
 
        sa_base = roc_nix_inl_inb_sa_base_get(roc_nix, inb_inl_dev);
@@ -204,11 +216,11 @@ roc_nix_inl_inb_sa_get(struct roc_nix *roc_nix, bool inb_inl_dev, uint32_t spi)
                return 0;
 
        /* Check if SPI is in range */
-       max_spi = roc_nix_inl_inb_sa_max_spi(roc_nix, inb_inl_dev);
-       if (spi > max_spi) {
-               plt_err("Inbound SA SPI %u exceeds max %u", spi, max_spi);
-               return 0;
-       }
+       mask = roc_nix_inl_inb_spi_range(roc_nix, inb_inl_dev, &min_spi,
+                                        &max_spi);
+       if (spi > max_spi || spi < min_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);
@@ -216,7 +228,7 @@ roc_nix_inl_inb_sa_get(struct roc_nix *roc_nix, bool inb_inl_dev, uint32_t spi)
                return 0;
 
        /* Basic logic of SPI->SA for now */
-       return (sa_base + (spi * sz));
+       return (sa_base + ((spi & mask) * sz));
 }
 
 int
@@ -295,11 +307,11 @@ roc_nix_inl_outb_init(struct roc_nix *roc_nix)
        struct nix_inl_dev *inl_dev;
        uint16_t sso_pffunc;
        uint8_t eng_grpmask;
-       uint64_t blkaddr;
+       uint64_t blkaddr, i;
        uint16_t nb_lf;
        void *sa_base;
        size_t sa_sz;
-       int i, j, rc;
+       int j, rc;
        void *sa;
 
        if (idev == NULL)
@@ -775,7 +787,7 @@ roc_nix_inl_inb_tag_update(struct roc_nix *roc_nix, uint32_t tag_const,
        memset(&cfg, 0, sizeof(cfg));
        cfg.sa_size = nix->inb_sa_sz;
        cfg.iova = (uintptr_t)nix->inb_sa_base;
-       cfg.max_sa = roc_nix->ipsec_in_max_spi + 1;
+       cfg.max_sa = nix->inb_spi_mask + 1;
        cfg.tt = tt;
        cfg.tag_const = tag_const;
 
index 728225baa9eb210d63c0d55d71e141c302482fb0..5eb1a81471757c536e4b84e459c9e9fcc0d90724 100644 (file)
@@ -105,7 +105,8 @@ typedef void (*roc_nix_inl_sso_work_cb_t)(uint64_t *gw, void *args);
 struct roc_nix_inl_dev {
        /* Input parameters */
        struct plt_pci_device *pci_dev;
-       uint16_t ipsec_in_max_spi;
+       uint32_t ipsec_in_min_spi;
+       uint32_t ipsec_in_max_spi;
        bool selftest;
        bool is_multi_channel;
        uint16_t channel;
@@ -136,8 +137,9 @@ int __roc_api roc_nix_inl_inb_fini(struct roc_nix *roc_nix);
 bool __roc_api roc_nix_inl_inb_is_enabled(struct roc_nix *roc_nix);
 uintptr_t __roc_api roc_nix_inl_inb_sa_base_get(struct roc_nix *roc_nix,
                                                bool inl_dev_sa);
-uint32_t __roc_api roc_nix_inl_inb_sa_max_spi(struct roc_nix *roc_nix,
-                                             bool inl_dev_sa);
+uint32_t __roc_api roc_nix_inl_inb_spi_range(struct roc_nix *roc_nix,
+                                            bool inl_dev_sa, uint32_t *min,
+                                            uint32_t *max);
 uint32_t __roc_api roc_nix_inl_inb_sa_sz(struct roc_nix *roc_nix,
                                         bool inl_dev_sa);
 uintptr_t __roc_api roc_nix_inl_inb_sa_get(struct roc_nix *roc_nix,
index 4c1d85ae6bd9a05d3ad4da9ed4608967b386992e..aeec4068318e12819dffa4b7da67b3086965f1e5 100644 (file)
@@ -120,6 +120,7 @@ nix_inl_nix_ipsec_cfg(struct nix_inl_dev *inl_dev, bool ena)
 {
        struct nix_inline_ipsec_lf_cfg *lf_cfg;
        struct mbox *mbox = (&inl_dev->dev)->mbox;
+       uint64_t max_sa;
        uint32_t sa_w;
 
        lf_cfg = mbox_alloc_msg_nix_inline_ipsec_lf_cfg(mbox);
@@ -127,8 +128,9 @@ nix_inl_nix_ipsec_cfg(struct nix_inl_dev *inl_dev, bool ena)
                return -ENOSPC;
 
        if (ena) {
-               sa_w = plt_align32pow2(inl_dev->ipsec_in_max_spi + 1);
-               sa_w = plt_log2_u32(sa_w);
+
+               max_sa = inl_dev->inb_spi_mask + 1;
+               sa_w = plt_log2_u32(max_sa);
 
                lf_cfg->enable = 1;
                lf_cfg->sa_base_addr = (uintptr_t)inl_dev->inb_sa_base;
@@ -138,7 +140,7 @@ nix_inl_nix_ipsec_cfg(struct nix_inl_dev *inl_dev, bool ena)
                        lf_cfg->ipsec_cfg0.lenm1_max = NIX_CN9K_MAX_HW_FRS - 1;
                else
                        lf_cfg->ipsec_cfg0.lenm1_max = NIX_RPM_MAX_HW_FRS - 1;
-               lf_cfg->ipsec_cfg1.sa_idx_max = inl_dev->ipsec_in_max_spi;
+               lf_cfg->ipsec_cfg1.sa_idx_max = max_sa - 1;
                lf_cfg->ipsec_cfg0.sa_pow2_size =
                        plt_log2_u32(inl_dev->inb_sa_sz);
 
@@ -319,16 +321,20 @@ nix_inl_sso_release(struct nix_inl_dev *inl_dev)
 static int
 nix_inl_nix_setup(struct nix_inl_dev *inl_dev)
 {
-       uint16_t ipsec_in_max_spi = inl_dev->ipsec_in_max_spi;
+       uint32_t ipsec_in_min_spi = inl_dev->ipsec_in_min_spi;
+       uint32_t ipsec_in_max_spi = inl_dev->ipsec_in_max_spi;
        struct dev *dev = &inl_dev->dev;
        struct mbox *mbox = dev->mbox;
        struct nix_lf_alloc_rsp *rsp;
        struct nix_lf_alloc_req *req;
        struct nix_hw_info *hw_info;
+       uint64_t max_sa, i;
        size_t inb_sa_sz;
-       int i, rc = -ENOSPC;
+       int rc = -ENOSPC;
        void *sa;
 
+       max_sa = plt_align32pow2(ipsec_in_max_spi - ipsec_in_min_spi + 1);
+
        /* Alloc NIX LF needed for single RQ */
        req = mbox_alloc_msg_nix_lf_alloc(mbox);
        if (req == NULL)
@@ -387,7 +393,8 @@ nix_inl_nix_setup(struct nix_inl_dev *inl_dev)
 
        /* Alloc contiguous memory for Inbound SA's */
        inl_dev->inb_sa_sz = inb_sa_sz;
-       inl_dev->inb_sa_base = plt_zmalloc(inb_sa_sz * ipsec_in_max_spi,
+       inl_dev->inb_spi_mask = max_sa - 1;
+       inl_dev->inb_sa_base = plt_zmalloc(inb_sa_sz * max_sa,
                                           ROC_NIX_INL_SA_BASE_ALIGN);
        if (!inl_dev->inb_sa_base) {
                plt_err("Failed to allocate memory for Inbound SA");
@@ -396,7 +403,7 @@ nix_inl_nix_setup(struct nix_inl_dev *inl_dev)
        }
 
        if (roc_model_is_cn10k()) {
-               for (i = 0; i < ipsec_in_max_spi; i++) {
+               for (i = 0; i < max_sa; i++) {
                        sa = ((uint8_t *)inl_dev->inb_sa_base) +
                             (i * inb_sa_sz);
                        roc_ot_ipsec_inb_sa_init(sa, true);
@@ -657,6 +664,7 @@ roc_nix_inl_dev_init(struct roc_nix_inl_dev *roc_inl_dev)
        memset(inl_dev, 0, sizeof(*inl_dev));
 
        inl_dev->pci_dev = pci_dev;
+       inl_dev->ipsec_in_min_spi = roc_inl_dev->ipsec_in_min_spi;
        inl_dev->ipsec_in_max_spi = roc_inl_dev->ipsec_in_max_spi;
        inl_dev->selftest = roc_inl_dev->selftest;
        inl_dev->is_multi_channel = roc_inl_dev->is_multi_channel;
index b6d860286b4b294aa7f6653cab2f6ff55cd5e49c..24dabbca0f5afead850e0b606ba9eb0fa42a81d6 100644 (file)
@@ -58,7 +58,9 @@ struct nix_inl_dev {
        uint16_t channel;
        uint16_t chan_mask;
        bool is_multi_channel;
-       uint16_t ipsec_in_max_spi;
+       uint32_t ipsec_in_min_spi;
+       uint32_t ipsec_in_max_spi;
+       uint32_t inb_spi_mask;
        bool attach_cptlf;
        bool wqe_skip;
 };
index c050180f0826eaa122cf028c4162af0333867f89..2bc228c3b8ba6de4a15985f56b1405f76e590042 100644 (file)
@@ -177,6 +177,7 @@ struct nix {
        bool inl_outb_ena;
        void *inb_sa_base;
        size_t inb_sa_sz;
+       uint32_t inb_spi_mask;
        void *outb_sa_base;
        size_t outb_sa_sz;
        uint16_t outb_err_sso_pffunc;
index 54cc1a040275dbccccfdd4a796d3ebcece2ec6d6..21f94e8972db82481557d0aec5fcdd62a799dfa3 100644 (file)
@@ -144,7 +144,7 @@ INTERNAL {
        roc_nix_inl_inb_init;
        roc_nix_inl_inb_sa_base_get;
        roc_nix_inl_inb_sa_get;
-       roc_nix_inl_inb_sa_max_spi;
+       roc_nix_inl_inb_spi_range;
        roc_nix_inl_inb_sa_sz;
        roc_nix_inl_inb_tag_update;
        roc_nix_inl_inb_fini;
index 044b20c63764f751b51e83484d3d9834a8a2e611..a2a53c1f109c7083da6197bceee1c0dee2efb701 100644 (file)
@@ -264,6 +264,7 @@ cn10k_eth_sec_session_create(void *device,
        struct cn10k_sec_sess_priv sess_priv;
        struct rte_crypto_sym_xform *crypto;
        struct cnxk_eth_sec_sess *eth_sec;
+       struct roc_nix *nix = &dev->nix;
        bool inbound, inl_dev;
        rte_spinlock_t *lock;
        char tbuf[128] = {0};
@@ -308,13 +309,16 @@ cn10k_eth_sec_session_create(void *device,
        if (inbound) {
                struct roc_ot_ipsec_inb_sa *inb_sa, *inb_sa_dptr;
                struct cn10k_inb_priv_data *inb_priv;
+               uint32_t spi_mask;
                uintptr_t sa;
 
                PLT_STATIC_ASSERT(sizeof(struct cn10k_inb_priv_data) <
                                  ROC_NIX_INL_OT_IPSEC_INB_SW_RSVD);
 
+               spi_mask = roc_nix_inl_inb_spi_range(nix, inl_dev, NULL, NULL);
+
                /* Get Inbound SA from NIX_RX_IPSEC_SA_BASE */
-               sa = roc_nix_inl_inb_sa_get(&dev->nix, inl_dev, ipsec->spi);
+               sa = roc_nix_inl_inb_sa_get(nix, inl_dev, ipsec->spi);
                if (!sa && dev->inb.inl_dev) {
                        snprintf(tbuf, sizeof(tbuf),
                                 "Failed to create ingress sa, inline dev "
@@ -358,16 +362,17 @@ cn10k_eth_sec_session_create(void *device,
                inb_priv->userdata = conf->userdata;
 
                /* Save SA index/SPI in cookie for now */
-               inb_sa_dptr->w1.s.cookie = rte_cpu_to_be_32(ipsec->spi);
+               inb_sa_dptr->w1.s.cookie =
+                       rte_cpu_to_be_32(ipsec->spi & spi_mask);
 
                /* Prepare session priv */
                sess_priv.inb_sa = 1;
-               sess_priv.sa_idx = ipsec->spi;
+               sess_priv.sa_idx = ipsec->spi & spi_mask;
 
                /* Pointer from eth_sec -> inb_sa */
                eth_sec->sa = inb_sa;
                eth_sec->sess = sess;
-               eth_sec->sa_idx = ipsec->spi;
+               eth_sec->sa_idx = ipsec->spi & spi_mask;
                eth_sec->spi = ipsec->spi;
                eth_sec->inl_dev = !!dev->inb.inl_dev;
                eth_sec->inb = true;
index 27930d1962f31b2faff6a0eac17108fffa524514..fa72424b4b154595cec88e2f2c2ab948f4f19c63 100644 (file)
@@ -146,6 +146,7 @@ cn9k_eth_sec_session_create(void *device,
        struct cn9k_sec_sess_priv sess_priv;
        struct rte_crypto_sym_xform *crypto;
        struct cnxk_eth_sec_sess *eth_sec;
+       struct roc_nix *nix = &dev->nix;
        rte_spinlock_t *lock;
        char tbuf[128] = {0};
        bool inbound;
@@ -185,15 +186,18 @@ cn9k_eth_sec_session_create(void *device,
        if (inbound) {
                struct cn9k_inb_priv_data *inb_priv;
                struct roc_onf_ipsec_inb_sa *inb_sa;
+               uint32_t spi_mask;
 
                PLT_STATIC_ASSERT(sizeof(struct cn9k_inb_priv_data) <
                                  ROC_NIX_INL_ONF_IPSEC_INB_SW_RSVD);
 
+               spi_mask = roc_nix_inl_inb_spi_range(nix, false, NULL, NULL);
+
                /* Get Inbound SA from NIX_RX_IPSEC_SA_BASE. Assume no inline
                 * device always for CN9K.
                 */
                inb_sa = (struct roc_onf_ipsec_inb_sa *)
-                        roc_nix_inl_inb_sa_get(&dev->nix, false, ipsec->spi);
+                        roc_nix_inl_inb_sa_get(nix, false, ipsec->spi);
                if (!inb_sa) {
                        snprintf(tbuf, sizeof(tbuf),
                                 "Failed to create ingress sa");
@@ -236,12 +240,12 @@ cn9k_eth_sec_session_create(void *device,
 
                /* Prepare session priv */
                sess_priv.inb_sa = 1;
-               sess_priv.sa_idx = ipsec->spi;
+               sess_priv.sa_idx = ipsec->spi & spi_mask;
 
                /* Pointer from eth_sec -> inb_sa */
                eth_sec->sa = inb_sa;
                eth_sec->sess = sess;
-               eth_sec->sa_idx = ipsec->spi;
+               eth_sec->sa_idx = ipsec->spi & spi_mask;
                eth_sec->spi = ipsec->spi;
                eth_sec->inb = true;
 
index 157b27d9cbf8d7e3405bf436645b380168873bf6..8a71644899378460a2c2905cbe305b4e16ca6c05 100644 (file)
@@ -49,14 +49,17 @@ parse_outb_nb_crypto_qs(const char *key, const char *value, void *extra_args)
 }
 
 static int
-parse_ipsec_in_max_spi(const char *key, const char *value, void *extra_args)
+parse_ipsec_in_spi_range(const char *key, const char *value, void *extra_args)
 {
        RTE_SET_USED(key);
        uint32_t val;
 
-       val = atoi(value);
+       errno = 0;
+       val = strtoul(value, NULL, 0);
+       if (errno)
+               val = 0;
 
-       *(uint16_t *)extra_args = val;
+       *(uint32_t *)extra_args = val;
 
        return 0;
 }
@@ -67,7 +70,10 @@ parse_ipsec_out_max_sa(const char *key, const char *value, void *extra_args)
        RTE_SET_USED(key);
        uint32_t val;
 
-       val = atoi(value);
+       errno = 0;
+       val = strtoul(value, NULL, 0);
+       if (errno)
+               val = 0;
 
        *(uint16_t *)extra_args = val;
 
@@ -231,6 +237,7 @@ parse_sdp_channel_mask(const char *key, const char *value, void *extra_args)
 #define CNXK_SWITCH_HEADER_TYPE "switch_header"
 #define CNXK_RSS_TAG_AS_XOR    "tag_as_xor"
 #define CNXK_LOCK_RX_CTX       "lock_rx_ctx"
+#define CNXK_IPSEC_IN_MIN_SPI  "ipsec_in_min_spi"
 #define CNXK_IPSEC_IN_MAX_SPI  "ipsec_in_max_spi"
 #define CNXK_IPSEC_OUT_MAX_SA  "ipsec_out_max_sa"
 #define CNXK_OUTB_NB_DESC      "outb_nb_desc"
@@ -245,13 +252,14 @@ cnxk_ethdev_parse_devargs(struct rte_devargs *devargs, struct cnxk_eth_dev *dev)
        uint16_t reta_sz = ROC_NIX_RSS_RETA_SZ_64;
        uint16_t sqb_count = CNXK_NIX_TX_MAX_SQB;
        struct flow_pre_l2_size_info pre_l2_info;
-       uint16_t ipsec_in_max_spi = BIT(8) - 1;
-       uint16_t ipsec_out_max_sa = BIT(12);
+       uint32_t ipsec_in_max_spi = BIT(8) - 1;
+       uint32_t ipsec_out_max_sa = BIT(12);
        uint16_t flow_prealloc_size = 1;
        uint16_t switch_header_type = 0;
        uint16_t flow_max_priority = 3;
        uint16_t force_inb_inl_dev = 0;
        uint16_t outb_nb_crypto_qs = 1;
+       uint32_t ipsec_in_min_spi = 0;
        uint16_t outb_nb_desc = 8200;
        struct sdp_channel sdp_chan;
        uint16_t rss_tag_as_xor = 0;
@@ -284,8 +292,10 @@ cnxk_ethdev_parse_devargs(struct rte_devargs *devargs, struct cnxk_eth_dev *dev)
        rte_kvargs_process(kvlist, CNXK_RSS_TAG_AS_XOR, &parse_flag,
                           &rss_tag_as_xor);
        rte_kvargs_process(kvlist, CNXK_LOCK_RX_CTX, &parse_flag, &lock_rx_ctx);
+       rte_kvargs_process(kvlist, CNXK_IPSEC_IN_MIN_SPI,
+                          &parse_ipsec_in_spi_range, &ipsec_in_min_spi);
        rte_kvargs_process(kvlist, CNXK_IPSEC_IN_MAX_SPI,
-                          &parse_ipsec_in_max_spi, &ipsec_in_max_spi);
+                          &parse_ipsec_in_spi_range, &ipsec_in_max_spi);
        rte_kvargs_process(kvlist, CNXK_IPSEC_OUT_MAX_SA,
                           &parse_ipsec_out_max_sa, &ipsec_out_max_sa);
        rte_kvargs_process(kvlist, CNXK_OUTB_NB_DESC, &parse_outb_nb_desc,
@@ -307,6 +317,7 @@ null_devargs:
        dev->outb.max_sa = ipsec_out_max_sa;
        dev->outb.nb_desc = outb_nb_desc;
        dev->outb.nb_crypto_qs = outb_nb_crypto_qs;
+       dev->nix.ipsec_in_min_spi = ipsec_in_min_spi;
        dev->nix.ipsec_in_max_spi = ipsec_in_max_spi;
        dev->nix.ipsec_out_max_sa = ipsec_out_max_sa;
        dev->nix.rss_tag_as_xor = !!rss_tag_as_xor;
index ea204ca882c382dd62283b2463f5d2b6c7ff25b6..3831889bf80d2d29e642d6089957e3331333f5c3 100644 (file)
@@ -5,6 +5,7 @@
 #include <cnxk_ethdev.h>
 
 #define CNXK_NIX_INL_SELFTEST        "selftest"
+#define CNXK_NIX_INL_IPSEC_IN_MIN_SPI "ipsec_in_min_spi"
 #define CNXK_NIX_INL_IPSEC_IN_MAX_SPI "ipsec_in_max_spi"
 #define CNXK_INL_CPT_CHANNEL         "inl_cpt_channel"
 
@@ -119,14 +120,17 @@ struct rte_security_ops cnxk_eth_sec_ops = {
 };
 
 static int
-parse_ipsec_in_max_spi(const char *key, const char *value, void *extra_args)
+parse_ipsec_in_spi_range(const char *key, const char *value, void *extra_args)
 {
        RTE_SET_USED(key);
        uint32_t val;
 
-       val = atoi(value);
+       errno = 0;
+       val = strtoul(value, NULL, 0);
+       if (errno)
+               val = 0;
 
-       *(uint16_t *)extra_args = val;
+       *(uint32_t *)extra_args = val;
 
        return 0;
 }
@@ -169,6 +173,7 @@ nix_inl_parse_devargs(struct rte_devargs *devargs,
                      struct roc_nix_inl_dev *inl_dev)
 {
        uint32_t ipsec_in_max_spi = BIT(8) - 1;
+       uint32_t ipsec_in_min_spi = 0;
        struct inl_cpt_channel cpt_channel;
        struct rte_kvargs *kvlist;
        uint8_t selftest = 0;
@@ -184,13 +189,16 @@ nix_inl_parse_devargs(struct rte_devargs *devargs,
 
        rte_kvargs_process(kvlist, CNXK_NIX_INL_SELFTEST, &parse_selftest,
                           &selftest);
+       rte_kvargs_process(kvlist, CNXK_NIX_INL_IPSEC_IN_MIN_SPI,
+                          &parse_ipsec_in_spi_range, &ipsec_in_min_spi);
        rte_kvargs_process(kvlist, CNXK_NIX_INL_IPSEC_IN_MAX_SPI,
-                          &parse_ipsec_in_max_spi, &ipsec_in_max_spi);
+                          &parse_ipsec_in_spi_range, &ipsec_in_max_spi);
        rte_kvargs_process(kvlist, CNXK_INL_CPT_CHANNEL, &parse_inl_cpt_channel,
                           &cpt_channel);
        rte_kvargs_free(kvlist);
 
 null_devargs:
+       inl_dev->ipsec_in_min_spi = ipsec_in_min_spi;
        inl_dev->ipsec_in_max_spi = ipsec_in_max_spi;
        inl_dev->selftest = selftest;
        inl_dev->channel = cpt_channel.channel;
index 4eb1ecf17dcb263854282aee5091e07aa858b5c4..f36fb8f27a7d99488bafbdf6361fee5dc47ab8f3 100644 (file)
@@ -337,7 +337,8 @@ cnxk_nix_lookup_mem_sa_base_set(struct cnxk_eth_dev *dev)
        if (!sa_base)
                return -ENOTSUP;
 
-       sa_w = plt_log2_u32(dev->nix.ipsec_in_max_spi + 1);
+       sa_w = plt_log2_u32(dev->nix.ipsec_in_max_spi + 1 -
+                           dev->nix.ipsec_in_min_spi);
 
        /* Set SA Base in lookup mem */
        sa_base_tbl = (uintptr_t)lookup_mem;