]> git.droids-corp.org - dpdk.git/commitdiff
net/mvpp2: introduce fixup for FIFO overrun
authorLiron Himi <lironh@marvell.com>
Wed, 27 Jan 2021 16:09:38 +0000 (18:09 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 29 Jan 2021 17:16:11 +0000 (18:16 +0100)
Currently the HW is configured with only one pool which its
buffer size may be larger than the rx-fifo-size.
In that situation, frame size larger than the fifo-size
is gets dropped due to fifo overrun.
This is cause because the HW works in cut-through mode which
waits to have in the fifo at least the amount of bytes as define
in the smallest pool's buffer size.

This patch add a dummy pool which its buffer size
is very small (smaller than 64B frame). This tricks the HW and
any frame size is gets passed from the FIFO to the PP2.

Signed-off-by: Liron Himi <lironh@marvell.com>
drivers/net/mvpp2/mrvl_ethdev.c
drivers/net/mvpp2/mrvl_ethdev.h
drivers/net/mvpp2/mrvl_qos.c

index 48f161bffdd6521b9f5b31b0b4bee782afa4476b..fde6533f1f82caf192fdd2d88745781f7b306abc 100644 (file)
@@ -90,6 +90,8 @@ static int used_bpools[PP2_NUM_PKT_PROC] = {
 static struct pp2_bpool *mrvl_port_to_bpool_lookup[RTE_MAX_ETHPORTS];
 static int mrvl_port_bpool_size[PP2_NUM_PKT_PROC][PP2_BPOOL_NUM_POOLS][RTE_MAX_LCORE];
 static uint64_t cookie_addr_high = MRVL_COOKIE_ADDR_INVALID;
+static int dummy_pool_id[PP2_NUM_PKT_PROC];
+struct pp2_bpool *dummy_pool[PP2_NUM_PKT_PROC] = {0};
 
 struct mrvl_ifnames {
        const char *names[PP2_NUM_ETH_PPIO * PP2_NUM_PKT_PROC];
@@ -189,6 +191,52 @@ static struct {
        MRVL_XSTATS_TBL_ENTRY(tx_errors)
 };
 
+static inline int
+mrvl_reserve_bit(int *bitmap, int max)
+{
+       int n = sizeof(*bitmap) * 8 - __builtin_clz(*bitmap);
+
+       if (n >= max)
+               return -1;
+
+       *bitmap |= 1 << n;
+
+       return n;
+}
+
+static int
+mrvl_pp2_fixup_init(void)
+{
+       struct pp2_bpool_params bpool_params;
+       char                    name[15];
+       int                     err, i;
+
+       memset(dummy_pool, 0, sizeof(dummy_pool));
+       for (i = 0; i < pp2_get_num_inst(); i++) {
+               dummy_pool_id[i] = mrvl_reserve_bit(&used_bpools[i],
+                                            PP2_BPOOL_NUM_POOLS);
+               if (dummy_pool_id[i] < 0) {
+                       MRVL_LOG(ERR, "Can't find free pool\n");
+                       return -1;
+               }
+
+               memset(name, 0, sizeof(name));
+               snprintf(name, sizeof(name), "pool-%d:%d", i, dummy_pool_id[i]);
+               memset(&bpool_params, 0, sizeof(bpool_params));
+               bpool_params.match = name;
+               bpool_params.buff_len = MRVL_PKT_OFFS;
+               bpool_params.dummy_short_pool = 1;
+               err = pp2_bpool_init(&bpool_params, &dummy_pool[i]);
+               if (err != 0 || !dummy_pool[i]) {
+                       MRVL_LOG(ERR, "BPool init failed!\n");
+                       used_bpools[i] &= ~(1 << dummy_pool_id[i]);
+                       return -1;
+               }
+       }
+
+       return 0;
+}
+
 /**
  * Initialize packet processor.
  *
@@ -198,7 +246,8 @@ static struct {
 static int
 mrvl_init_pp2(void)
 {
-       struct pp2_init_params init_params;
+       struct pp2_init_params  init_params;
+       int                     err;
 
        memset(&init_params, 0, sizeof(init_params));
        init_params.hif_reserved_map = MRVL_MUSDK_HIFS_RESERVED;
@@ -207,7 +256,32 @@ mrvl_init_pp2(void)
        if (mrvl_cfg && mrvl_cfg->pp2_cfg.prs_udfs.num_udfs)
                memcpy(&init_params.prs_udfs, &mrvl_cfg->pp2_cfg.prs_udfs,
                       sizeof(struct pp2_parse_udfs));
-       return pp2_init(&init_params);
+       err = pp2_init(&init_params);
+       if (err != 0) {
+               MRVL_LOG(ERR, "PP2 init failed");
+               return -1;
+       }
+
+       err = mrvl_pp2_fixup_init();
+       if (err != 0) {
+               MRVL_LOG(ERR, "PP2 fixup init failed");
+               return -1;
+       }
+
+       return 0;
+}
+
+static void
+mrvl_pp2_fixup_deinit(void)
+{
+       int i;
+
+       for (i = 0; i < PP2_NUM_PKT_PROC; i++) {
+               if (!dummy_pool[i])
+                       continue;
+               pp2_bpool_deinit(dummy_pool[i]);
+               used_bpools[i] &= ~(1 << dummy_pool_id[i]);
+       }
 }
 
 /**
@@ -219,6 +293,7 @@ mrvl_init_pp2(void)
 static void
 mrvl_deinit_pp2(void)
 {
+       mrvl_pp2_fixup_deinit();
        pp2_deinit();
 }
 
@@ -275,19 +350,6 @@ mrvl_get_bpool_size(int pp2_id, int pool_id)
        return size;
 }
 
-static inline int
-mrvl_reserve_bit(int *bitmap, int max)
-{
-       int n = sizeof(*bitmap) * 8 - __builtin_clz(*bitmap);
-
-       if (n >= max)
-               return -1;
-
-       *bitmap |= 1 << n;
-
-       return n;
-}
-
 static int
 mrvl_init_hif(int core_id)
 {
index 27d34ecfe09bdbb60aa219afb729d96dacd4756f..b0cdddd15e40c6952c5b707326c96be810f9015c 100644 (file)
@@ -196,6 +196,8 @@ extern int mrvl_logtype;
        rte_log(RTE_LOG_ ## level, mrvl_logtype, "%s(): " fmt "\n", \
                __func__, ##args)
 
+extern struct pp2_bpool *dummy_pool[PP2_NUM_PKT_PROC];
+
 /**
  * Convert string to uint32_t with extra checks for result correctness.
  *
index 310fd73840b393a77a180b78795cc7237e49ff66..a3add540b82aa8ba01e96329bdc0166df705c7d8 100644 (file)
@@ -881,6 +881,7 @@ setup_tc(struct pp2_ppio_tc_params *param, uint8_t inqs,
 
        param->pkt_offset = MRVL_PKT_OFFS;
        param->pools[0][0] = bpool;
+       param->pools[0][1] = dummy_pool[bpool->pp2_id];
        param->default_color = color;
 
        inq_params = rte_zmalloc_socket("inq_params",