common/cnxk: fix build with custom maximum port config
authorVamsi Attunuru <vattunuru@marvell.com>
Wed, 2 Mar 2022 13:46:54 +0000 (19:16 +0530)
committerJerin Jacob <jerinj@marvell.com>
Thu, 3 Mar 2022 05:59:25 +0000 (06:59 +0100)
Build fails with custom max eth ports configuration, like
-Dmax_ethports=1024.

Build error is:
../drivers/common/cnxk/roc_nix_inl_dev.c:794:2:
  note: in expansion of macro ‘PLT_STATIC_ASSERT’
 |  PLT_STATIC_ASSERT(sizeof(struct nix_inl_dev) <= ROC_NIX_INL_MEM_SZ);
 |  ^~~~~~~~~~~~~~~~~

Earlier soft expiry ring struct member was an array of pointers and it's
size is linked to number of RTE_MAX_ETHPORTS, and the whole struct size
is confined and protected by size assertion.
It resulted in build failure with -Dmax_ethports=1024 option and
assertion caught that failure.

Use dynamically allocated memory for storing soft expiry ring base
addresses which fixes the struct size against custom RTE_MAX_ETHPORTS
values and solves the static assertion failure.

Bugzilla ID: 940
Fixes: bea5d990a93b ("net/cnxk: support outbound soft expiry notification")
Cc: stable@dpdk.org
Reported-by: Wei Ling <weix.ling@intel.com>
Reported-by: Yu Jiang <yux.jiang@intel.com>
Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>
Signed-off-by: Srikanth Yalavarthi <syalavarthi@marvell.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
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_platform.h

index 11ed157..826c6e9 100644 (file)
@@ -330,12 +330,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;
 
@@ -468,16 +469,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;
                }
@@ -504,6 +505,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)
@@ -537,10 +539,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]));
                }
        }
 
index 1dc58f2..2c2a4d7 100644 (file)
@@ -137,7 +137,7 @@ struct roc_nix_inl_dev {
        bool set_soft_exp_poll;
        /* End of input parameters */
 
-#define ROC_NIX_INL_MEM_SZ (2304)
+#define ROC_NIX_INL_MEM_SZ (1280)
        uint8_t reserved[ROC_NIX_INL_MEM_SZ] __plt_cache_aligned;
 } __plt_cache_aligned;
 
index 1cfcdba..5a032aa 100644 (file)
@@ -653,7 +653,7 @@ inl_outb_soft_exp_poll(struct nix_inl_dev *inl_dev, uint32_t ring_idx)
        uint32_t port_id;
 
        port_id = ring_idx / ROC_NIX_SOFT_EXP_PER_PORT_MAX_RINGS;
-       ring_base = inl_dev->sa_soft_exp_ring[ring_idx];
+       ring_base = PLT_PTR_CAST(inl_dev->sa_soft_exp_ring[ring_idx]);
        if (!ring_base) {
                plt_err("Invalid soft exp ring base");
                return;
@@ -751,6 +751,14 @@ nix_inl_outb_poll_thread_setup(struct nix_inl_dev *inl_dev)
 
        inl_dev->soft_exp_ring_bmap_mem = mem;
        inl_dev->soft_exp_ring_bmap = bmap;
+       inl_dev->sa_soft_exp_ring = plt_zmalloc(
+               ROC_NIX_INL_MAX_SOFT_EXP_RNGS * sizeof(uint64_t), 0);
+       if (!inl_dev->sa_soft_exp_ring) {
+               plt_err("soft expiry ring pointer array alloc failed");
+               plt_free(mem);
+               rc = -ENOMEM;
+               goto exit;
+       }
 
        for (i = 0; i < ROC_NIX_INL_MAX_SOFT_EXP_RNGS; i++)
                plt_bitmap_clear(inl_dev->soft_exp_ring_bmap, i);
@@ -896,6 +904,7 @@ roc_nix_inl_dev_fini(struct roc_nix_inl_dev *roc_inl_dev)
                pthread_join(inl_dev->soft_exp_poll_thread, NULL);
                plt_bitmap_free(inl_dev->soft_exp_ring_bmap);
                plt_free(inl_dev->soft_exp_ring_bmap_mem);
+               plt_free(inl_dev->sa_soft_exp_ring);
        }
 
        /* Flush Inbound CTX cache entries */
index da6d6e9..0fa5e09 100644 (file)
@@ -58,7 +58,7 @@ struct nix_inl_dev {
        /* OUTB soft expiry poll thread */
        pthread_t soft_exp_poll_thread;
        uint32_t soft_exp_poll_freq;
-       void *sa_soft_exp_ring[ROC_NIX_INL_MAX_SOFT_EXP_RNGS];
+       uint64_t *sa_soft_exp_ring;
 
        /* Soft expiry ring bitmap */
        struct plt_bitmap *soft_exp_ring_bmap;
index fa28544..28004b1 100644 (file)
 #ifndef PLT_ETHER_ADDR_LEN
 #define PLT_ETHER_ADDR_LEN RTE_ETHER_ADDR_LEN
 #endif
+
+/* Cast to specific datatypes */
+#define PLT_PTR_CAST(val) ((void *)(val))
+#define PLT_U64_CAST(val) ((uint64_t)(val))
+#define PLT_U32_CAST(val) ((uint32_t)(val))
+#define PLT_U16_CAST(val) ((uint16_t)(val))
+
 /** Divide ceil */
 #define PLT_DIV_CEIL(x, y)                     \
        ({                                      \