All of lore.kernel.org
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions
@ 2021-09-06  7:54 skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 02/27] common/cnxk: support RoC API to get level to index skori
                   ` (25 more replies)
  0 siblings, 26 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

To support ingress policer on CN10K, MBOX interfaces and HW
definitions are synced.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/common/cnxk/hw/nix.h   | 13 ++++++++++---
 drivers/common/cnxk/roc_mbox.h | 34 +++++++++++++++++++++++++++++++++-
 2 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/drivers/common/cnxk/hw/nix.h b/drivers/common/cnxk/hw/nix.h
index 6b86002ead..53cdfbb142 100644
--- a/drivers/common/cnxk/hw/nix.h
+++ b/drivers/common/cnxk/hw/nix.h
@@ -692,9 +692,16 @@
 #define NIX_RX_BAND_PROF_ACTIONRESULT_DROP (0x1ull) /* [CN10K, .) */
 #define NIX_RX_BAND_PROF_ACTIONRESULT_RED  (0x2ull) /* [CN10K, .) */
 
-#define NIX_RX_BAND_PROF_LAYER_LEAF   (0x0ull) /* [CN10K, .) */
-#define NIX_RX_BAND_PROF_LAYER_MIDDLE (0x1ull) /* [CN10K, .) */
-#define NIX_RX_BAND_PROF_LAYER_TOP    (0x2ull) /* [CN10K, .) */
+#define NIX_RX_BAND_PROF_LAYER_LEAF    (0x0ull) /* [CN10K, .) */
+#define NIX_RX_BAND_PROF_LAYER_INVALID (0x1ull) /* [CN10K, .) */
+#define NIX_RX_BAND_PROF_LAYER_MIDDLE  (0x2ull) /* [CN10K, .) */
+#define NIX_RX_BAND_PROF_LAYER_TOP     (0x3ull) /* [CN10K, .) */
+#define NIX_RX_BAND_PROF_LAYER_MAX     (0x4ull) /* [CN10K, .) */
+
+#define NIX_RX_BAND_PROF_PC_MODE_VLAN (0x0ull) /* [CN10K, .) */
+#define NIX_RX_BAND_PROF_PC_MODE_DSCP (0x1ull) /* [CN10K, .) */
+#define NIX_RX_BAND_PROF_PC_MODE_GEN  (0x2ull) /* [CN10K, .) */
+#define NIX_RX_BAND_PROF_PC_MODE_RSVD (0x3ull) /* [CN10K, .) */
 
 #define NIX_RX_COLORRESULT_GREEN  (0x0ull) /* [CN10K, .) */
 #define NIX_RX_COLORRESULT_YELLOW (0x1ull) /* [CN10K, .) */
diff --git a/drivers/common/cnxk/roc_mbox.h b/drivers/common/cnxk/roc_mbox.h
index b5da931b81..c8b97e9aee 100644
--- a/drivers/common/cnxk/roc_mbox.h
+++ b/drivers/common/cnxk/roc_mbox.h
@@ -234,7 +234,11 @@ struct mbox_msghdr {
 	  nix_inline_ipsec_lf_cfg, msg_rsp)                                    \
 	M(NIX_CN10K_AQ_ENQ, 0x801b, nix_cn10k_aq_enq, nix_cn10k_aq_enq_req,    \
 	  nix_cn10k_aq_enq_rsp)                                                \
-	M(NIX_GET_HW_INFO, 0x801c, nix_get_hw_info, msg_req, nix_hw_info)
+	M(NIX_GET_HW_INFO, 0x801c, nix_get_hw_info, msg_req, nix_hw_info)      \
+	M(NIX_BANDPROF_ALLOC, 0x801d, nix_bandprof_alloc,                      \
+	  nix_bandprof_alloc_req, nix_bandprof_alloc_rsp)                      \
+	M(NIX_BANDPROF_FREE, 0x801e, nix_bandprof_free, nix_bandprof_free_req, \
+	  msg_rsp)
 
 /* Messages initiated by AF (range 0xC00 - 0xDFF) */
 #define MBOX_UP_CGX_MESSAGES                                                   \
@@ -771,6 +775,10 @@ struct nix_cn10k_aq_enq_req {
 		__io struct nix_rsse_s rss;
 		/* Valid when op == WRITE/INIT and ctype == NIX_AQ_CTYPE_MCE */
 		__io struct nix_rx_mce_s mce;
+		/* Valid when op == WRITE/INIT and
+		 * ctype == NIX_AQ_CTYPE_BAND_PROF
+		 */
+		__io struct nix_band_prof_s prof;
 	};
 	/* Mask data when op == WRITE (1=write, 0=don't write) */
 	union {
@@ -784,6 +792,8 @@ struct nix_cn10k_aq_enq_req {
 		__io struct nix_rsse_s rss_mask;
 		/* Valid when op == WRITE and ctype == NIX_AQ_CTYPE_MCE */
 		__io struct nix_rx_mce_s mce_mask;
+		/* Valid when op == WRITE and ctype == NIX_AQ_CTYPE_BAND_PROF */
+		__io struct nix_band_prof_s prof_mask;
 	};
 };
 
@@ -795,6 +805,7 @@ struct nix_cn10k_aq_enq_rsp {
 		struct nix_cq_ctx_s cq;
 		struct nix_rsse_s rss;
 		struct nix_rx_mce_s mce;
+		struct nix_band_prof_s prof;
 	};
 };
 
@@ -1129,6 +1140,27 @@ struct nix_hw_info {
 	uint16_t __io rsvd[15];
 };
 
+struct nix_bandprof_alloc_req {
+	struct mbox_msghdr hdr;
+	/* Count of profiles needed per layer */
+	uint16_t __io prof_count[NIX_RX_BAND_PROF_LAYER_MAX];
+};
+
+struct nix_bandprof_alloc_rsp {
+	struct mbox_msghdr hdr;
+	uint16_t __io prof_count[NIX_RX_BAND_PROF_LAYER_MAX];
+
+#define BANDPROF_PER_PFFUNC 64
+	uint16_t __io prof_idx[NIX_RX_BAND_PROF_LAYER_MAX][BANDPROF_PER_PFFUNC];
+};
+
+struct nix_bandprof_free_req {
+	struct mbox_msghdr hdr;
+	uint8_t __io free_all;
+	uint16_t __io prof_count[NIX_RX_BAND_PROF_LAYER_MAX];
+	uint16_t __io prof_idx[NIX_RX_BAND_PROF_LAYER_MAX][BANDPROF_PER_PFFUNC];
+};
+
 /* SSO mailbox error codes
  * Range 501 - 600.
  */
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 02/27] common/cnxk: support RoC API to get level to index
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 03/27] common/cnxk: support RoC API to get profile count skori
                   ` (24 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Ray Kinsella
  Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

CN10K platform supports policer up to 3 level of hierarchy.
Implement RoC API to get corresponding index for given level.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/common/cnxk/meson.build    |  1 +
 drivers/common/cnxk/roc_nix.h      | 11 +++++++++++
 drivers/common/cnxk/roc_nix_bpf.c  | 22 ++++++++++++++++++++++
 drivers/common/cnxk/roc_nix_priv.h |  1 +
 drivers/common/cnxk/version.map    |  1 +
 5 files changed, 36 insertions(+)
 create mode 100644 drivers/common/cnxk/roc_nix_bpf.c

diff --git a/drivers/common/cnxk/meson.build b/drivers/common/cnxk/meson.build
index 6a7849f31c..e5794c53a5 100644
--- a/drivers/common/cnxk/meson.build
+++ b/drivers/common/cnxk/meson.build
@@ -24,6 +24,7 @@ sources = files(
         'roc_mbox.c',
         'roc_model.c',
         'roc_nix.c',
+        'roc_nix_bpf.c',
         'roc_nix_debug.c',
         'roc_nix_fc.c',
         'roc_nix_irq.c',
diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index 822c1900e2..bbe8416769 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -6,6 +6,8 @@
 #define _ROC_NIX_H_
 
 /* Constants */
+#define ROC_NIX_BPF_LEVEL_IDX_INVALID 0xFF
+
 enum roc_nix_rss_reta_sz {
 	ROC_NIX_RSS_RETA_SZ_64 = 64,
 	ROC_NIX_RSS_RETA_SZ_128 = 128,
@@ -29,6 +31,12 @@ enum roc_nix_vlan_type {
 	ROC_NIX_VLAN_TYPE_OUTER = 0x02,
 };
 
+enum roc_nix_bpf_level_flag {
+	ROC_NIX_BPF_LEVEL_F_LEAF = BIT(0),
+	ROC_NIX_BPF_LEVEL_F_MID = BIT(1),
+	ROC_NIX_BPF_LEVEL_F_TOP = BIT(2),
+};
+
 struct roc_nix_vlan_config {
 	uint32_t type;
 	union {
@@ -464,6 +472,9 @@ int __roc_api roc_nix_tm_rsrc_count(struct roc_nix *roc_nix,
 int __roc_api roc_nix_tm_node_name_get(struct roc_nix *roc_nix,
 				       uint32_t node_id, char *buf,
 				       size_t buflen);
+/* Ingress Policer API */
+uint8_t __roc_api
+roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag lvl_flag);
 
 /* MAC */
 int __roc_api roc_nix_mac_rxtx_start_stop(struct roc_nix *roc_nix, bool start);
diff --git a/drivers/common/cnxk/roc_nix_bpf.c b/drivers/common/cnxk/roc_nix_bpf.c
new file mode 100644
index 0000000000..b588cc16e4
--- /dev/null
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include "roc_api.h"
+#include "roc_priv.h"
+
+uint8_t
+roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag level_f)
+{
+	uint8_t idx;
+
+	if (level_f & ROC_NIX_BPF_LEVEL_F_LEAF)
+		idx = 0;
+	else if (level_f & ROC_NIX_BPF_LEVEL_F_MID)
+		idx = 1;
+	else if (level_f & ROC_NIX_BPF_LEVEL_F_TOP)
+		idx = 2;
+	else
+		idx = ROC_NIX_BPF_LEVEL_IDX_INVALID;
+	return idx;
+}
diff --git a/drivers/common/cnxk/roc_nix_priv.h b/drivers/common/cnxk/roc_nix_priv.h
index 9dc0c88a6f..94040fc744 100644
--- a/drivers/common/cnxk/roc_nix_priv.h
+++ b/drivers/common/cnxk/roc_nix_priv.h
@@ -170,6 +170,7 @@ enum nix_err_status {
 	NIX_ERR_INVALID_RANGE,
 	NIX_ERR_INTERNAL,
 	NIX_ERR_OP_NOTSUP,
+	NIX_ERR_HW_NOTSUP,
 	NIX_ERR_QUEUE_INVALID_RANGE,
 	NIX_ERR_AQ_READ_FAILED,
 	NIX_ERR_AQ_WRITE_FAILED,
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index 2cbcc4b93a..73b210f91e 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -74,6 +74,7 @@ INTERNAL {
 	roc_model;
 	roc_se_auth_key_set;
 	roc_se_ciph_key_set;
+	roc_nix_bpf_level_to_idx;
 	roc_nix_cq_dump;
 	roc_nix_cq_fini;
 	roc_nix_cq_init;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 03/27] common/cnxk: support RoC API to get profile count
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 02/27] common/cnxk: support RoC API to get level to index skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 04/27] common/cnxk: support RoC API to alloc bandwidth profiles skori
                   ` (23 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Ray Kinsella
  Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement interface to get available profile count for given
nixlf.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/common/cnxk/roc_nix.h     |  5 ++++
 drivers/common/cnxk/roc_nix_bpf.c | 46 +++++++++++++++++++++++++++++++
 drivers/common/cnxk/version.map   |  1 +
 3 files changed, 52 insertions(+)

diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index bbe8416769..e96328005e 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -7,6 +7,7 @@
 
 /* Constants */
 #define ROC_NIX_BPF_LEVEL_IDX_INVALID 0xFF
+#define ROC_NIX_BPF_LEVEL_MAX	      3
 
 enum roc_nix_rss_reta_sz {
 	ROC_NIX_RSS_RETA_SZ_64 = 64,
@@ -473,6 +474,10 @@ int __roc_api roc_nix_tm_node_name_get(struct roc_nix *roc_nix,
 				       uint32_t node_id, char *buf,
 				       size_t buflen);
 /* Ingress Policer API */
+int __roc_api
+roc_nix_bpf_count_get(struct roc_nix *roc_nix, uint8_t lvl_mask,
+		      uint16_t count[ROC_NIX_BPF_LEVEL_MAX] /* Out */);
+
 uint8_t __roc_api
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag lvl_flag);
 
diff --git a/drivers/common/cnxk/roc_nix_bpf.c b/drivers/common/cnxk/roc_nix_bpf.c
index b588cc16e4..af9dffa90c 100644
--- a/drivers/common/cnxk/roc_nix_bpf.c
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -5,6 +5,14 @@
 #include "roc_api.h"
 #include "roc_priv.h"
 
+#define NIX_MAX_BPF_COUNT_LEAF_LAYER 64
+#define NIX_MAX_BPF_COUNT_MID_LAYER  8
+#define NIX_MAX_BPF_COUNT_TOP_LAYER  1
+
+#define NIX_BPF_LEVEL_F_MASK                                                   \
+	(ROC_NIX_BPF_LEVEL_F_LEAF | ROC_NIX_BPF_LEVEL_F_MID |                  \
+	 ROC_NIX_BPF_LEVEL_F_TOP)
+
 uint8_t
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag level_f)
 {
@@ -20,3 +28,41 @@ roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag level_f)
 		idx = ROC_NIX_BPF_LEVEL_IDX_INVALID;
 	return idx;
 }
+
+int
+roc_nix_bpf_count_get(struct roc_nix *roc_nix, uint8_t lvl_mask,
+		      uint16_t count[ROC_NIX_BPF_LEVEL_MAX])
+{
+	uint8_t mask = lvl_mask & NIX_BPF_LEVEL_F_MASK;
+	uint8_t leaf_idx, mid_idx, top_idx;
+
+	PLT_SET_USED(roc_nix);
+
+	if (roc_model_is_cn9k())
+		return NIX_ERR_HW_NOTSUP;
+
+	if (!mask)
+		return NIX_ERR_PARAM;
+
+	/* Currently No MBOX interface is available to get number
+	 * of bandwidth profiles. So numbers per level are hard coded,
+	 * considering 3 RPM blocks and each block has 4 LMAC's.
+	 * So total 12 physical interfaces are in system. Each interface
+	 * supports following bandwidth profiles.
+	 */
+
+	leaf_idx = roc_nix_bpf_level_to_idx(mask & ROC_NIX_BPF_LEVEL_F_LEAF);
+	mid_idx = roc_nix_bpf_level_to_idx(mask & ROC_NIX_BPF_LEVEL_F_MID);
+	top_idx = roc_nix_bpf_level_to_idx(mask & ROC_NIX_BPF_LEVEL_F_TOP);
+
+	if (leaf_idx != ROC_NIX_BPF_LEVEL_IDX_INVALID)
+		count[leaf_idx] = NIX_MAX_BPF_COUNT_LEAF_LAYER;
+
+	if (mid_idx != ROC_NIX_BPF_LEVEL_IDX_INVALID)
+		count[mid_idx] = NIX_MAX_BPF_COUNT_MID_LAYER;
+
+	if (top_idx != ROC_NIX_BPF_LEVEL_IDX_INVALID)
+		count[top_idx] = NIX_MAX_BPF_COUNT_TOP_LAYER;
+
+	return 0;
+}
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index 73b210f91e..7cae7dfc74 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -74,6 +74,7 @@ INTERNAL {
 	roc_model;
 	roc_se_auth_key_set;
 	roc_se_ciph_key_set;
+	roc_nix_bpf_count_get;
 	roc_nix_bpf_level_to_idx;
 	roc_nix_cq_dump;
 	roc_nix_cq_fini;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 04/27] common/cnxk: support RoC API to alloc bandwidth profiles
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 02/27] common/cnxk: support RoC API to get level to index skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 03/27] common/cnxk: support RoC API to get profile count skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 05/27] common/cnxk: support RoC API to free " skori
                   ` (22 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Ray Kinsella
  Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement RoC API to allocate HW resources i.e. bandwidth
profiles for policer processing on CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/common/cnxk/roc_nix.h     |  11 ++++
 drivers/common/cnxk/roc_nix_bpf.c | 104 ++++++++++++++++++++++++++++++
 drivers/common/cnxk/version.map   |   1 +
 3 files changed, 116 insertions(+)

diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index e96328005e..2ce3ebbb5f 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -6,6 +6,7 @@
 #define _ROC_NIX_H_
 
 /* Constants */
+#define ROC_NIX_BPF_PER_PFFUNC	      64
 #define ROC_NIX_BPF_LEVEL_IDX_INVALID 0xFF
 #define ROC_NIX_BPF_LEVEL_MAX	      3
 
@@ -38,6 +39,12 @@ enum roc_nix_bpf_level_flag {
 	ROC_NIX_BPF_LEVEL_F_TOP = BIT(2),
 };
 
+struct roc_nix_bpf_objs {
+	uint16_t level;
+	uint16_t count;
+	uint16_t ids[ROC_NIX_BPF_PER_PFFUNC];
+};
+
 struct roc_nix_vlan_config {
 	uint32_t type;
 	union {
@@ -478,6 +485,10 @@ int __roc_api
 roc_nix_bpf_count_get(struct roc_nix *roc_nix, uint8_t lvl_mask,
 		      uint16_t count[ROC_NIX_BPF_LEVEL_MAX] /* Out */);
 
+int __roc_api roc_nix_bpf_alloc(struct roc_nix *roc_nix, uint8_t lvl_mask,
+				uint16_t per_lvl_cnt[ROC_NIX_BPF_LEVEL_MAX],
+				struct roc_nix_bpf_objs *profs /* Out */);
+
 uint8_t __roc_api
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag lvl_flag);
 
diff --git a/drivers/common/cnxk/roc_nix_bpf.c b/drivers/common/cnxk/roc_nix_bpf.c
index af9dffa90c..06394bda07 100644
--- a/drivers/common/cnxk/roc_nix_bpf.c
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -13,6 +13,19 @@
 	(ROC_NIX_BPF_LEVEL_F_LEAF | ROC_NIX_BPF_LEVEL_F_MID |                  \
 	 ROC_NIX_BPF_LEVEL_F_TOP)
 
+static uint8_t sw_to_hw_lvl_map[] = {NIX_RX_BAND_PROF_LAYER_LEAF,
+				     NIX_RX_BAND_PROF_LAYER_MIDDLE,
+				     NIX_RX_BAND_PROF_LAYER_TOP};
+
+static inline struct mbox *
+get_mbox(struct roc_nix *roc_nix)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct dev *dev = &nix->dev;
+
+	return dev->mbox;
+}
+
 uint8_t
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag level_f)
 {
@@ -66,3 +79,94 @@ roc_nix_bpf_count_get(struct roc_nix *roc_nix, uint8_t lvl_mask,
 
 	return 0;
 }
+
+int
+roc_nix_bpf_alloc(struct roc_nix *roc_nix, uint8_t lvl_mask,
+		  uint16_t per_lvl_cnt[ROC_NIX_BPF_LEVEL_MAX],
+		  struct roc_nix_bpf_objs *profs)
+{
+	uint8_t mask = lvl_mask & NIX_BPF_LEVEL_F_MASK;
+	struct mbox *mbox = get_mbox(roc_nix);
+	struct nix_bandprof_alloc_req *req;
+	struct nix_bandprof_alloc_rsp *rsp;
+	uint8_t leaf_idx, mid_idx, top_idx;
+	int rc = -ENOSPC, i;
+
+	if (roc_model_is_cn9k())
+		return NIX_ERR_HW_NOTSUP;
+
+	if (!mask)
+		return NIX_ERR_PARAM;
+
+	leaf_idx = roc_nix_bpf_level_to_idx(mask & ROC_NIX_BPF_LEVEL_F_LEAF);
+	mid_idx = roc_nix_bpf_level_to_idx(mask & ROC_NIX_BPF_LEVEL_F_MID);
+	top_idx = roc_nix_bpf_level_to_idx(mask & ROC_NIX_BPF_LEVEL_F_TOP);
+
+	if ((leaf_idx != ROC_NIX_BPF_LEVEL_IDX_INVALID) &&
+	    (per_lvl_cnt[leaf_idx] > NIX_MAX_BPF_COUNT_LEAF_LAYER))
+		return NIX_ERR_INVALID_RANGE;
+
+	if ((mid_idx != ROC_NIX_BPF_LEVEL_IDX_INVALID) &&
+	    (per_lvl_cnt[mid_idx] > NIX_MAX_BPF_COUNT_MID_LAYER))
+		return NIX_ERR_INVALID_RANGE;
+
+	if ((top_idx != ROC_NIX_BPF_LEVEL_IDX_INVALID) &&
+	    (per_lvl_cnt[top_idx] > NIX_MAX_BPF_COUNT_TOP_LAYER))
+		return NIX_ERR_INVALID_RANGE;
+
+	req = mbox_alloc_msg_nix_bandprof_alloc(mbox);
+	if (req == NULL)
+		goto exit;
+
+	if (leaf_idx != ROC_NIX_BPF_LEVEL_IDX_INVALID) {
+		req->prof_count[sw_to_hw_lvl_map[leaf_idx]] =
+			per_lvl_cnt[leaf_idx];
+	}
+
+	if (mid_idx != ROC_NIX_BPF_LEVEL_IDX_INVALID) {
+		req->prof_count[sw_to_hw_lvl_map[mid_idx]] =
+			per_lvl_cnt[mid_idx];
+	}
+
+	if (top_idx != ROC_NIX_BPF_LEVEL_IDX_INVALID) {
+		req->prof_count[sw_to_hw_lvl_map[top_idx]] =
+			per_lvl_cnt[top_idx];
+	}
+
+	rc = mbox_process_msg(mbox, (void *)&rsp);
+	if (rc)
+		goto exit;
+
+	if (leaf_idx != ROC_NIX_BPF_LEVEL_IDX_INVALID) {
+		profs[leaf_idx].level = leaf_idx;
+		profs[leaf_idx].count =
+			rsp->prof_count[sw_to_hw_lvl_map[leaf_idx]];
+		for (i = 0; i < profs[leaf_idx].count; i++) {
+			profs[leaf_idx].ids[i] =
+				rsp->prof_idx[sw_to_hw_lvl_map[leaf_idx]][i];
+		}
+	}
+
+	if (mid_idx != ROC_NIX_BPF_LEVEL_IDX_INVALID) {
+		profs[mid_idx].level = mid_idx;
+		profs[mid_idx].count =
+			rsp->prof_count[sw_to_hw_lvl_map[mid_idx]];
+		for (i = 0; i < profs[mid_idx].count; i++) {
+			profs[mid_idx].ids[i] =
+				rsp->prof_idx[sw_to_hw_lvl_map[mid_idx]][i];
+		}
+	}
+
+	if (top_idx != ROC_NIX_BPF_LEVEL_IDX_INVALID) {
+		profs[top_idx].level = top_idx;
+		profs[top_idx].count =
+			rsp->prof_count[sw_to_hw_lvl_map[top_idx]];
+		for (i = 0; i < profs[top_idx].count; i++) {
+			profs[top_idx].ids[i] =
+				rsp->prof_idx[sw_to_hw_lvl_map[top_idx]][i];
+		}
+	}
+
+exit:
+	return rc;
+}
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index 7cae7dfc74..b7e1d4e8c8 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -74,6 +74,7 @@ INTERNAL {
 	roc_model;
 	roc_se_auth_key_set;
 	roc_se_ciph_key_set;
+	roc_nix_bpf_alloc;
 	roc_nix_bpf_count_get;
 	roc_nix_bpf_level_to_idx;
 	roc_nix_cq_dump;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 05/27] common/cnxk: support RoC API to free bandwidth profiles
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (2 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 04/27] common/cnxk: support RoC API to alloc bandwidth profiles skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 06/27] common/cnxk: support RoC API to configure bandwidth profile skori
                   ` (21 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Ray Kinsella
  Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement RoC interface to free HW bandwidth profiles on
CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/common/cnxk/roc_nix.h     |  6 +++++
 drivers/common/cnxk/roc_nix_bpf.c | 40 +++++++++++++++++++++++++++++++
 drivers/common/cnxk/version.map   |  2 ++
 3 files changed, 48 insertions(+)

diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index 2ce3ebbb5f..081b1b7cc9 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -489,6 +489,12 @@ int __roc_api roc_nix_bpf_alloc(struct roc_nix *roc_nix, uint8_t lvl_mask,
 				uint16_t per_lvl_cnt[ROC_NIX_BPF_LEVEL_MAX],
 				struct roc_nix_bpf_objs *profs /* Out */);
 
+int __roc_api roc_nix_bpf_free(struct roc_nix *roc_nix,
+			       struct roc_nix_bpf_objs *profs,
+			       uint8_t num_prof);
+
+int __roc_api roc_nix_bpf_free_all(struct roc_nix *roc_nix);
+
 uint8_t __roc_api
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag lvl_flag);
 
diff --git a/drivers/common/cnxk/roc_nix_bpf.c b/drivers/common/cnxk/roc_nix_bpf.c
index 06394bda07..41d31bc6cd 100644
--- a/drivers/common/cnxk/roc_nix_bpf.c
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -170,3 +170,43 @@ roc_nix_bpf_alloc(struct roc_nix *roc_nix, uint8_t lvl_mask,
 exit:
 	return rc;
 }
+
+int
+roc_nix_bpf_free(struct roc_nix *roc_nix, struct roc_nix_bpf_objs *profs,
+		 uint8_t num_prof)
+{
+	struct mbox *mbox = get_mbox(roc_nix);
+	struct nix_bandprof_free_req *req;
+	uint8_t level;
+	int i, j;
+
+	if (num_prof >= NIX_RX_BAND_PROF_LAYER_MAX)
+		return NIX_ERR_INVALID_RANGE;
+
+	req = mbox_alloc_msg_nix_bandprof_free(mbox);
+	if (req == NULL)
+		return -ENOSPC;
+
+	for (i = 0; i < num_prof; i++) {
+		level = sw_to_hw_lvl_map[profs[i].level];
+		req->prof_count[level] = profs[i].count;
+		for (j = 0; j < profs[i].count; j++)
+			req->prof_idx[level][j] = profs[i].ids[j];
+	}
+
+	return mbox_process(mbox);
+}
+
+int
+roc_nix_bpf_free_all(struct roc_nix *roc_nix)
+{
+	struct mbox *mbox = get_mbox(roc_nix);
+	struct nix_bandprof_free_req *req;
+
+	req = mbox_alloc_msg_nix_bandprof_free(mbox);
+	if (req == NULL)
+		return -ENOSPC;
+
+	req->free_all = true;
+	return mbox_process(mbox);
+}
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index b7e1d4e8c8..025daf320f 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -76,6 +76,8 @@ INTERNAL {
 	roc_se_ciph_key_set;
 	roc_nix_bpf_alloc;
 	roc_nix_bpf_count_get;
+	roc_nix_bpf_free;
+	roc_nix_bpf_free_all;
 	roc_nix_bpf_level_to_idx;
 	roc_nix_cq_dump;
 	roc_nix_cq_fini;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 06/27] common/cnxk: support RoC API to configure bandwidth profile
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (3 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 05/27] common/cnxk: support RoC API to free " skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 07/27] common/cnxk: support RoC API to toggle profile state skori
                   ` (20 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Ray Kinsella
  Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement RoC API to configure HW bandwidth profile for
CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/common/cnxk/roc_nix.h     | 108 +++++++++++++++
 drivers/common/cnxk/roc_nix_bpf.c | 223 ++++++++++++++++++++++++++++++
 drivers/common/cnxk/version.map   |   1 +
 3 files changed, 332 insertions(+)

diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index 081b1b7cc9..6b3b3a50e5 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -10,6 +10,54 @@
 #define ROC_NIX_BPF_LEVEL_IDX_INVALID 0xFF
 #define ROC_NIX_BPF_LEVEL_MAX	      3
 
+/** NIX rate limits */
+#define MAX_RATE_DIV_EXP  12
+#define MAX_RATE_EXPONENT 0xf
+#define MAX_RATE_MANTISSA 0xff
+
+#define NIX_METER_RATE_CONST 2000000ULL
+
+/* NIX rate calculation in Bits/Sec
+ *	PIR_ADD = ((256 + NIX_*_PIR[RATE_MANTISSA])
+ *		<< NIX_*_PIR[RATE_EXPONENT]) / 256
+ *	PIR = (2E6 * PIR_ADD / (1 << NIX_*_PIR[RATE_DIVIDER_EXPONENT]))
+ *
+ *	CIR_ADD = ((256 + NIX_*_CIR[RATE_MANTISSA])
+ *		<< NIX_*_CIR[RATE_EXPONENT]) / 256
+ *	CIR = (2E6 * CIR_ADD / (CCLK_TICKS << NIX_*_CIR[RATE_DIVIDER_EXPONENT]))
+ */
+#define METER_RATE(exponent, mantissa, div_exp)                                \
+	((NIX_METER_RATE_CONST * ((256 + (mantissa)) << (exponent))) /         \
+	 (((1ull << (div_exp)) * 256)))
+
+/* Meter rate limits in Bits/Sec */
+#define ROC_NIX_BPF_RATE_MIN METER_RATE(0, 0, MAX_RATE_DIV_EXP)
+#define ROC_NIX_BPF_RATE_MAX METER_RATE(MAX_RATE_EXPONENT, MAX_RATE_MANTISSA, 0)
+
+#define NIX_LENGTH_ADJUST_MIN ((int)-NIX_MIN_HW_FRS + 1)
+#define NIX_LENGTH_ADJUST_MAX 255
+
+/** NIX burst limits */
+#define MAX_BURST_EXPONENT 0xf
+#define MAX_BURST_MANTISSA 0xff
+
+/* NIX burst calculation
+ *	PIR_BURST = ((256 + NIX_*_PIR[BURST_MANTISSA])
+ *		<< (NIX_*_PIR[BURST_EXPONENT] + 1))
+ *			/ 256
+ *
+ *	CIR_BURST = ((256 + NIX_*_CIR[BURST_MANTISSA])
+ *		<< (NIX_*_CIR[BURST_EXPONENT] + 1))
+ *			/ 256
+ */
+#define METER_BURST(exponent, mantissa)                                        \
+	(((256 + (mantissa)) << ((exponent) + 1)) / 256)
+
+/** Meter burst limits */
+#define ROC_NIX_BPF_BURST_MIN METER_BURST(0, 0)
+#define ROC_NIX_BPF_BURST_MAX                                                  \
+	METER_BURST(MAX_BURST_EXPONENT, MAX_BURST_MANTISSA)
+
 enum roc_nix_rss_reta_sz {
 	ROC_NIX_RSS_RETA_SZ_64 = 64,
 	ROC_NIX_RSS_RETA_SZ_128 = 128,
@@ -39,6 +87,62 @@ enum roc_nix_bpf_level_flag {
 	ROC_NIX_BPF_LEVEL_F_TOP = BIT(2),
 };
 
+enum roc_nix_bpf_color {
+	ROC_NIX_BPF_COLOR_GREEN,
+	ROC_NIX_BPF_COLOR_YELLOW,
+	ROC_NIX_BPF_COLOR_RED,
+	ROC_NIX_BPF_COLOR_MAX
+};
+
+enum roc_nix_bpf_algo {
+	ROC_NIX_BPF_ALGO_NONE,
+	ROC_NIX_BPF_ALGO_2698,
+	ROC_NIX_BPF_ALGO_4115,
+	ROC_NIX_BPF_ALGO_2697
+};
+
+enum roc_nix_bpf_lmode { ROC_NIX_BPF_LMODE_BYTE, ROC_NIX_BPF_LMODE_PACKET };
+
+enum roc_nix_bpf_action {
+	ROC_NIX_BPF_ACTION_PASS,
+	ROC_NIX_BPF_ACTION_DROP,
+	ROC_NIX_BPF_ACTION_RED
+};
+
+struct roc_nix_bpf_cfg {
+	enum roc_nix_bpf_algo alg;
+	enum roc_nix_bpf_lmode lmode;
+	union {
+		/* Valid when *alg* is set to ROC_NIX_BPF_ALGO_2697. */
+		struct {
+			uint64_t cir;
+			uint64_t cbs;
+			uint64_t ebs;
+		} algo2697;
+
+		/* Valid when *alg* is set to ROC_NIX_BPF_ALGO_2698. */
+		struct {
+			uint64_t cir;
+			uint64_t pir;
+			uint64_t cbs;
+			uint64_t pbs;
+		} algo2698;
+
+		/* Valid when *alg* is set to ROC_NIX_BPF_ALGO_4115. */
+		struct {
+			uint64_t cir;
+			uint64_t eir;
+			uint64_t cbs;
+			uint64_t ebs;
+		} algo4115;
+	};
+
+	enum roc_nix_bpf_action action[ROC_NIX_BPF_COLOR_MAX];
+
+	/* Reserved for future config*/
+	uint32_t rsvd[3];
+};
+
 struct roc_nix_bpf_objs {
 	uint16_t level;
 	uint16_t count;
@@ -495,6 +599,10 @@ int __roc_api roc_nix_bpf_free(struct roc_nix *roc_nix,
 
 int __roc_api roc_nix_bpf_free_all(struct roc_nix *roc_nix);
 
+int __roc_api roc_nix_bpf_config(struct roc_nix *roc_nix, uint16_t id,
+				 enum roc_nix_bpf_level_flag lvl_flag,
+				 struct roc_nix_bpf_cfg *cfg);
+
 uint8_t __roc_api
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag lvl_flag);
 
diff --git a/drivers/common/cnxk/roc_nix_bpf.c b/drivers/common/cnxk/roc_nix_bpf.c
index 41d31bc6cd..39b44ef1cd 100644
--- a/drivers/common/cnxk/roc_nix_bpf.c
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -26,6 +26,103 @@ get_mbox(struct roc_nix *roc_nix)
 	return dev->mbox;
 }
 
+static inline uint64_t
+meter_rate_to_nix(uint64_t value, uint64_t *exponent_p, uint64_t *mantissa_p,
+		  uint64_t *div_exp_p)
+{
+	uint64_t div_exp, exponent, mantissa;
+
+	/* Boundary checks */
+	if (value < ROC_NIX_BPF_RATE_MIN || value > ROC_NIX_BPF_RATE_MAX)
+		return 0;
+
+	if (value <= METER_RATE(0, 0, 0)) {
+		/* Calculate rate div_exp and mantissa using
+		 * the following formula:
+		 *
+		 * value = (2E6 * (256 + mantissa)
+		 *              / ((1 << div_exp) * 256))
+		 */
+		div_exp = 0;
+		exponent = 0;
+		mantissa = MAX_RATE_MANTISSA;
+
+		while (value < (NIX_METER_RATE_CONST / (1 << div_exp)))
+			div_exp += 1;
+
+		while (value < ((NIX_METER_RATE_CONST * (256 + mantissa)) /
+				((1 << div_exp) * 256)))
+			mantissa -= 1;
+	} else {
+		/* Calculate rate exponent and mantissa using
+		 * the following formula:
+		 *
+		 * value = (2E6 * ((256 + mantissa) << exponent)) / 256
+		 *
+		 */
+		div_exp = 0;
+		exponent = MAX_RATE_EXPONENT;
+		mantissa = MAX_RATE_MANTISSA;
+
+		while (value < (NIX_METER_RATE_CONST * (1 << exponent)))
+			exponent -= 1;
+
+		while (value < ((NIX_METER_RATE_CONST *
+				 ((256 + mantissa) << exponent)) /
+				256))
+			mantissa -= 1;
+	}
+
+	if (div_exp > MAX_RATE_DIV_EXP || exponent > MAX_RATE_EXPONENT ||
+	    mantissa > MAX_RATE_MANTISSA)
+		return 0;
+
+	if (div_exp_p)
+		*div_exp_p = div_exp;
+	if (exponent_p)
+		*exponent_p = exponent;
+	if (mantissa_p)
+		*mantissa_p = mantissa;
+
+	/* Calculate real rate value */
+	return METER_RATE(exponent, mantissa, div_exp);
+}
+
+static inline uint64_t
+meter_burst_to_nix(uint64_t value, uint64_t *exponent_p, uint64_t *mantissa_p)
+{
+	uint64_t exponent, mantissa;
+
+	if (value < ROC_NIX_BPF_BURST_MIN || value > ROC_NIX_BPF_BURST_MAX)
+		return 0;
+
+	/* Calculate burst exponent and mantissa using
+	 * the following formula:
+	 *
+	 * value = (((256 + mantissa) << (exponent + 1)
+	 / 256)
+	 *
+	 */
+	exponent = MAX_BURST_EXPONENT;
+	mantissa = MAX_BURST_MANTISSA;
+
+	while (value < (1ull << (exponent + 1)))
+		exponent -= 1;
+
+	while (value < ((256 + mantissa) << (exponent + 1)) / 256)
+		mantissa -= 1;
+
+	if (exponent > MAX_BURST_EXPONENT || mantissa > MAX_BURST_MANTISSA)
+		return 0;
+
+	if (exponent_p)
+		*exponent_p = exponent;
+	if (mantissa_p)
+		*mantissa_p = mantissa;
+
+	return METER_BURST(exponent, mantissa);
+}
+
 uint8_t
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag level_f)
 {
@@ -210,3 +307,129 @@ roc_nix_bpf_free_all(struct roc_nix *roc_nix)
 	req->free_all = true;
 	return mbox_process(mbox);
 }
+
+int
+roc_nix_bpf_config(struct roc_nix *roc_nix, uint16_t id,
+		   enum roc_nix_bpf_level_flag lvl_flag,
+		   struct roc_nix_bpf_cfg *cfg)
+{
+	uint64_t exponent_p = 0, mantissa_p = 0, div_exp_p = 0;
+	struct mbox *mbox = get_mbox(roc_nix);
+	struct nix_cn10k_aq_enq_req *aq;
+	uint8_t level_idx;
+
+	if (roc_model_is_cn9k())
+		return NIX_ERR_HW_NOTSUP;
+
+	if (!cfg)
+		return NIX_ERR_PARAM;
+
+	level_idx = roc_nix_bpf_level_to_idx(lvl_flag);
+	if (level_idx == ROC_NIX_BPF_LEVEL_IDX_INVALID)
+		return NIX_ERR_PARAM;
+
+	aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
+	if (aq == NULL)
+		return -ENOSPC;
+	aq->qidx = (sw_to_hw_lvl_map[level_idx] << 14) | id;
+	aq->ctype = NIX_AQ_CTYPE_BAND_PROF;
+	aq->op = NIX_AQ_INSTOP_WRITE;
+
+	switch (cfg->alg) {
+	case ROC_NIX_BPF_ALGO_2697:
+		meter_rate_to_nix(cfg->algo2697.cir, &exponent_p, &mantissa_p,
+				  &div_exp_p);
+		aq->prof.cir_mantissa = mantissa_p;
+		aq->prof.cir_exponent = exponent_p;
+
+		meter_burst_to_nix(cfg->algo2697.cbs, &exponent_p, &mantissa_p);
+		aq->prof.cbs_mantissa = mantissa_p;
+		aq->prof.cbs_exponent = exponent_p;
+
+		meter_burst_to_nix(cfg->algo2697.ebs, &exponent_p, &mantissa_p);
+		aq->prof.pebs_mantissa = mantissa_p;
+		aq->prof.pebs_exponent = exponent_p;
+
+		aq->prof_mask.cir_mantissa = ~(aq->prof_mask.cir_mantissa);
+		aq->prof_mask.cbs_mantissa = ~(aq->prof_mask.cbs_mantissa);
+		aq->prof_mask.pebs_mantissa = ~(aq->prof_mask.pebs_mantissa);
+		aq->prof_mask.cir_exponent = ~(aq->prof_mask.cir_exponent);
+		aq->prof_mask.cbs_exponent = ~(aq->prof_mask.cbs_exponent);
+		aq->prof_mask.pebs_exponent = ~(aq->prof_mask.pebs_exponent);
+		break;
+
+	case ROC_NIX_BPF_ALGO_2698:
+		meter_rate_to_nix(cfg->algo2698.cir, &exponent_p, &mantissa_p,
+				  &div_exp_p);
+		aq->prof.cir_mantissa = mantissa_p;
+		aq->prof.cir_exponent = exponent_p;
+
+		meter_rate_to_nix(cfg->algo2698.pir, &exponent_p, &mantissa_p,
+				  &div_exp_p);
+		aq->prof.peir_mantissa = mantissa_p;
+		aq->prof.peir_exponent = exponent_p;
+
+		meter_burst_to_nix(cfg->algo2698.cbs, &exponent_p, &mantissa_p);
+		aq->prof.cbs_mantissa = mantissa_p;
+		aq->prof.cbs_exponent = exponent_p;
+
+		meter_burst_to_nix(cfg->algo2698.pbs, &exponent_p, &mantissa_p);
+		aq->prof.pebs_mantissa = mantissa_p;
+		aq->prof.pebs_exponent = exponent_p;
+
+		aq->prof_mask.cir_mantissa = ~(aq->prof_mask.cir_mantissa);
+		aq->prof_mask.peir_mantissa = ~(aq->prof_mask.peir_mantissa);
+		aq->prof_mask.cbs_mantissa = ~(aq->prof_mask.cbs_mantissa);
+		aq->prof_mask.pebs_mantissa = ~(aq->prof_mask.pebs_mantissa);
+		aq->prof_mask.cir_exponent = ~(aq->prof_mask.cir_exponent);
+		aq->prof_mask.peir_exponent = ~(aq->prof_mask.peir_exponent);
+		aq->prof_mask.cbs_exponent = ~(aq->prof_mask.cbs_exponent);
+		aq->prof_mask.pebs_exponent = ~(aq->prof_mask.pebs_exponent);
+		break;
+
+	case ROC_NIX_BPF_ALGO_4115:
+		meter_rate_to_nix(cfg->algo4115.cir, &exponent_p, &mantissa_p,
+				  &div_exp_p);
+		aq->prof.cir_mantissa = mantissa_p;
+		aq->prof.cir_exponent = exponent_p;
+
+		meter_rate_to_nix(cfg->algo4115.eir, &exponent_p, &mantissa_p,
+				  &div_exp_p);
+		aq->prof.peir_mantissa = mantissa_p;
+		aq->prof.peir_exponent = exponent_p;
+
+		meter_burst_to_nix(cfg->algo4115.cbs, &exponent_p, &mantissa_p);
+		aq->prof.cbs_mantissa = mantissa_p;
+		aq->prof.cbs_exponent = exponent_p;
+
+		meter_burst_to_nix(cfg->algo4115.ebs, &exponent_p, &mantissa_p);
+		aq->prof.pebs_mantissa = mantissa_p;
+		aq->prof.pebs_exponent = exponent_p;
+
+		aq->prof_mask.cir_mantissa = ~(aq->prof_mask.cir_mantissa);
+		aq->prof_mask.peir_mantissa = ~(aq->prof_mask.peir_mantissa);
+		aq->prof_mask.cbs_mantissa = ~(aq->prof_mask.cbs_mantissa);
+		aq->prof_mask.pebs_mantissa = ~(aq->prof_mask.pebs_mantissa);
+
+		aq->prof_mask.cir_exponent = ~(aq->prof_mask.cir_exponent);
+		aq->prof_mask.peir_exponent = ~(aq->prof_mask.peir_exponent);
+		aq->prof_mask.cbs_exponent = ~(aq->prof_mask.cbs_exponent);
+		aq->prof_mask.pebs_exponent = ~(aq->prof_mask.pebs_exponent);
+		break;
+
+	default:
+		return NIX_ERR_PARAM;
+	}
+
+	aq->prof.lmode = cfg->lmode;
+	aq->prof.gc_action = cfg->action[ROC_NIX_BPF_COLOR_GREEN];
+	aq->prof.yc_action = cfg->action[ROC_NIX_BPF_COLOR_YELLOW];
+	aq->prof.rc_action = cfg->action[ROC_NIX_BPF_COLOR_RED];
+
+	aq->prof_mask.lmode = ~(aq->prof_mask.lmode);
+	aq->prof_mask.gc_action = ~(aq->prof_mask.gc_action);
+	aq->prof_mask.yc_action = ~(aq->prof_mask.yc_action);
+	aq->prof_mask.rc_action = ~(aq->prof_mask.rc_action);
+
+	return mbox_process(mbox);
+}
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index 025daf320f..849cbeed22 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -75,6 +75,7 @@ INTERNAL {
 	roc_se_auth_key_set;
 	roc_se_ciph_key_set;
 	roc_nix_bpf_alloc;
+	roc_nix_bpf_config;
 	roc_nix_bpf_count_get;
 	roc_nix_bpf_free;
 	roc_nix_bpf_free_all;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 07/27] common/cnxk: support RoC API to toggle profile state
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (4 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 06/27] common/cnxk: support RoC API to configure bandwidth profile skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 08/27] common/cnxk: support RoC API to dump bandwidth profile skori
                   ` (19 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Ray Kinsella
  Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement RoC API to enable or disable HW bandwidth profiles
on CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/common/cnxk/roc_nix.h     |  4 ++++
 drivers/common/cnxk/roc_nix_bpf.c | 36 +++++++++++++++++++++++++++++++
 drivers/common/cnxk/version.map   |  1 +
 3 files changed, 41 insertions(+)

diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index 6b3b3a50e5..478426ecc9 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -262,6 +262,7 @@ struct roc_nix_stats_queue {
 struct roc_nix_rq {
 	/* Input parameters */
 	uint16_t qid;
+	uint16_t bpf_id;
 	uint64_t aura_handle;
 	bool ipsech_ena;
 	uint16_t first_skip;
@@ -603,6 +604,9 @@ int __roc_api roc_nix_bpf_config(struct roc_nix *roc_nix, uint16_t id,
 				 enum roc_nix_bpf_level_flag lvl_flag,
 				 struct roc_nix_bpf_cfg *cfg);
 
+int __roc_api roc_nix_bpf_ena_dis(struct roc_nix *roc_nix, uint16_t id,
+				  struct roc_nix_rq *rq, bool enable);
+
 uint8_t __roc_api
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag lvl_flag);
 
diff --git a/drivers/common/cnxk/roc_nix_bpf.c b/drivers/common/cnxk/roc_nix_bpf.c
index 39b44ef1cd..fed6c03e9c 100644
--- a/drivers/common/cnxk/roc_nix_bpf.c
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -433,3 +433,39 @@ roc_nix_bpf_config(struct roc_nix *roc_nix, uint16_t id,
 
 	return mbox_process(mbox);
 }
+
+int
+roc_nix_bpf_ena_dis(struct roc_nix *roc_nix, uint16_t id, struct roc_nix_rq *rq,
+		    bool enable)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	struct mbox *mbox = get_mbox(roc_nix);
+	struct nix_cn10k_aq_enq_req *aq;
+	int rc;
+
+	if (roc_model_is_cn9k())
+		return NIX_ERR_HW_NOTSUP;
+
+	if (rq->qid >= nix->nb_rx_queues)
+		return NIX_ERR_QUEUE_INVALID_RANGE;
+
+	aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
+	if (aq == NULL)
+		return -ENOSPC;
+	aq->qidx = rq->qid;
+	aq->ctype = NIX_AQ_CTYPE_RQ;
+	aq->op = NIX_AQ_INSTOP_WRITE;
+
+	aq->rq.policer_ena = enable;
+	if (enable)
+		aq->rq.band_prof_id = id;
+
+	rc = mbox_process(mbox);
+	if (rc)
+		goto exit;
+
+	rq->bpf_id = id;
+
+exit:
+	return rc;
+}
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index 849cbeed22..abde92ed09 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -77,6 +77,7 @@ INTERNAL {
 	roc_nix_bpf_alloc;
 	roc_nix_bpf_config;
 	roc_nix_bpf_count_get;
+	roc_nix_bpf_ena_dis;
 	roc_nix_bpf_free;
 	roc_nix_bpf_free_all;
 	roc_nix_bpf_level_to_idx;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 08/27] common/cnxk: support RoC API to dump bandwidth profile
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (5 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 07/27] common/cnxk: support RoC API to toggle profile state skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 09/27] common/cnxk: support RoC API to setup precolor table skori
                   ` (18 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Ray Kinsella
  Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement RoC API to dump bandwidth profile on CN10K
platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/common/cnxk/roc_nix.h      |  3 ++
 drivers/common/cnxk/roc_nix_bpf.c  | 86 ++++++++++++++++++++++++++++++
 drivers/common/cnxk/roc_platform.h |  1 +
 drivers/common/cnxk/version.map    |  1 +
 4 files changed, 91 insertions(+)

diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index 478426ecc9..19c376e9c4 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -607,6 +607,9 @@ int __roc_api roc_nix_bpf_config(struct roc_nix *roc_nix, uint16_t id,
 int __roc_api roc_nix_bpf_ena_dis(struct roc_nix *roc_nix, uint16_t id,
 				  struct roc_nix_rq *rq, bool enable);
 
+int __roc_api roc_nix_bpf_dump(struct roc_nix *roc_nix, uint16_t id,
+			       enum roc_nix_bpf_level_flag lvl_flag);
+
 uint8_t __roc_api
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag lvl_flag);
 
diff --git a/drivers/common/cnxk/roc_nix_bpf.c b/drivers/common/cnxk/roc_nix_bpf.c
index fed6c03e9c..2b2be20491 100644
--- a/drivers/common/cnxk/roc_nix_bpf.c
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -123,6 +123,60 @@ meter_burst_to_nix(uint64_t value, uint64_t *exponent_p, uint64_t *mantissa_p)
 	return METER_BURST(exponent, mantissa);
 }
 
+static inline void
+nix_lf_bpf_dump(__io struct nix_band_prof_s *bpf)
+{
+	plt_dump("W0: cir_mantissa  \t\t\t%d\nW0: pebs_mantissa \t\t\t0x%03x",
+		 bpf->cir_mantissa, bpf->pebs_mantissa);
+	plt_dump("W0: peir_matissa \t\t\t\t%d\nW0: cbs_exponent \t\t\t%d",
+		 bpf->peir_mantissa, bpf->cbs_exponent);
+	plt_dump("W0: cir_exponent \t\t\t%d\nW0: pebs_exponent \t\t\t%d",
+		 bpf->cir_exponent, bpf->pebs_exponent);
+	plt_dump("W0: peir_exponent \t\t\t%d\n", bpf->peir_exponent);
+	plt_dump("W0: tnl_ena \t\t\t%d\n", bpf->tnl_ena);
+	plt_dump("W0: icolor \t\t\t%d\n", bpf->icolor);
+	plt_dump("W0: pc_mode \t\t\t%d\n", bpf->pc_mode);
+	plt_dump("W1: hl_en \t\t%d\nW1: band_prof_id \t\t%d", bpf->hl_en,
+		 bpf->band_prof_id);
+	plt_dump("W1: meter_algo \t\t%d\nW1: rc_action \t\t%d", bpf->meter_algo,
+		 bpf->rc_action);
+	plt_dump("W1: yc_action \t\t\t%d\nW1: gc_action \t\t\t%d",
+		 bpf->yc_action, bpf->gc_action);
+	plt_dump("W1: adjust_mantissa\t\t\t%d\nW1: adjust_exponent \t\t\t%d",
+		 bpf->adjust_mantissa, bpf->adjust_exponent);
+	plt_dump("W1: rdiv \t\t\t%d\n", bpf->rdiv);
+	plt_dump("W1: l_select \t\t%d\nW2: lmode \t\t%d", bpf->l_sellect,
+		 bpf->lmode);
+	plt_dump("W1: cbs_mantissa \t\t\t%d\n", bpf->cbs_mantissa);
+	plt_dump("W2: tsa \t\t\t0x%" PRIx64 "\n", (uint64_t)bpf->ts);
+	plt_dump("W3: c_accum \t\t%d\nW3: pe_accum \t\t%d", bpf->c_accum,
+		 bpf->pe_accum);
+	plt_dump("W4: green_pkt_pass \t\t\t0x%" PRIx64 "",
+		 (uint64_t)bpf->green_pkt_pass);
+	plt_dump("W5: yellow_pkt_pass \t\t\t0x%" PRIx64 "",
+		 (uint64_t)bpf->yellow_pkt_pass);
+	plt_dump("W6: red_pkt_pass \t\t\t0x%" PRIx64 "",
+		 (uint64_t)bpf->red_pkt_pass);
+	plt_dump("W7: green_octs_pass \t\t\t0x%" PRIx64 "",
+		 (uint64_t)bpf->green_octs_pass);
+	plt_dump("W8: yellow_octs_pass \t\t\t0x%" PRIx64 "",
+		 (uint64_t)bpf->yellow_octs_pass);
+	plt_dump("W9: red_octs_pass \t\t\t0x%" PRIx64 "",
+		 (uint64_t)bpf->red_octs_pass);
+	plt_dump("W10: green_pkt_drop \t\t\t0x%" PRIx64 "",
+		 (uint64_t)bpf->green_pkt_drop);
+	plt_dump("W11: yellow_pkt_drop \t\t\t0x%" PRIx64 "",
+		 (uint64_t)bpf->yellow_pkt_drop);
+	plt_dump("W12: red_pkt_drop \t\t\t0x%" PRIx64 "",
+		 (uint64_t)bpf->red_pkt_drop);
+	plt_dump("W13: green_octs_drop \t\t\t0x%" PRIx64 "",
+		 (uint64_t)bpf->green_octs_drop);
+	plt_dump("W14: yellow_octs_drop \t\t\t0x%" PRIx64 "",
+		 (uint64_t)bpf->yellow_octs_drop);
+	plt_dump("W15: red_octs_drop \t\t\t0x%" PRIx64 "",
+		 (uint64_t)bpf->red_octs_drop);
+}
+
 uint8_t
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag level_f)
 {
@@ -469,3 +523,35 @@ roc_nix_bpf_ena_dis(struct roc_nix *roc_nix, uint16_t id, struct roc_nix_rq *rq,
 exit:
 	return rc;
 }
+
+int
+roc_nix_bpf_dump(struct roc_nix *roc_nix, uint16_t id,
+		 enum roc_nix_bpf_level_flag lvl_flag)
+{
+	struct mbox *mbox = get_mbox(roc_nix);
+	struct nix_cn10k_aq_enq_rsp *rsp;
+	struct nix_cn10k_aq_enq_req *aq;
+	uint8_t level_idx;
+	int rc;
+
+	if (roc_model_is_cn9k())
+		return NIX_ERR_HW_NOTSUP;
+
+	level_idx = roc_nix_bpf_level_to_idx(lvl_flag);
+	if (level_idx == ROC_NIX_BPF_LEVEL_IDX_INVALID)
+		return NIX_ERR_PARAM;
+
+	aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
+	if (aq == NULL)
+		return -ENOSPC;
+	aq->qidx = (sw_to_hw_lvl_map[level_idx] << 14 | id);
+	aq->ctype = NIX_AQ_CTYPE_BAND_PROF;
+	aq->op = NIX_AQ_INSTOP_READ;
+	rc = mbox_process_msg(mbox, (void *)&rsp);
+	if (!rc) {
+		plt_dump("============= band prof id =%d ===============", id);
+		nix_lf_bpf_dump(&rsp->prof);
+	}
+
+	return rc;
+}
diff --git a/drivers/common/cnxk/roc_platform.h b/drivers/common/cnxk/roc_platform.h
index 285b24b82d..69b7c49d8b 100644
--- a/drivers/common/cnxk/roc_platform.h
+++ b/drivers/common/cnxk/roc_platform.h
@@ -155,6 +155,7 @@ extern int cnxk_logtype_tm;
 #define plt_info(fmt, args...) RTE_LOG(INFO, PMD, fmt "\n", ##args)
 #define plt_warn(fmt, args...) RTE_LOG(WARNING, PMD, fmt "\n", ##args)
 #define plt_print(fmt, args...) RTE_LOG(INFO, PMD, fmt "\n", ##args)
+#define plt_dump(fmt, ...)      fprintf(stderr, fmt "\n", ##__VA_ARGS__)
 
 /**
  * Log debug message if given subsystem logging is enabled.
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index abde92ed09..a201f6a755 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -77,6 +77,7 @@ INTERNAL {
 	roc_nix_bpf_alloc;
 	roc_nix_bpf_config;
 	roc_nix_bpf_count_get;
+	roc_nix_bpf_dump;
 	roc_nix_bpf_ena_dis;
 	roc_nix_bpf_free;
 	roc_nix_bpf_free_all;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 09/27] common/cnxk: support RoC API to setup precolor table
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (6 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 08/27] common/cnxk: support RoC API to dump bandwidth profile skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 10/27] common/cnxk: support RoC API to connect bandwidth profiles skori
                   ` (17 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Ray Kinsella
  Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

For initial coloring of input packet, CN10K platform maintains
precolor table for VLAN, DSCP and Generic. Implement RoC
interface to setup pre color table.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/common/cnxk/roc_nix.h     |  20 ++++
 drivers/common/cnxk/roc_nix_bpf.c | 188 ++++++++++++++++++++++++++++++
 drivers/common/cnxk/version.map   |   1 +
 3 files changed, 209 insertions(+)

diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index 19c376e9c4..36f6a35c50 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -87,6 +87,15 @@ enum roc_nix_bpf_level_flag {
 	ROC_NIX_BPF_LEVEL_F_TOP = BIT(2),
 };
 
+enum roc_nix_bpf_pc_mode {
+	ROC_NIX_BPF_PC_MODE_VLAN_INNER,
+	ROC_NIX_BPF_PC_MODE_VLAN_OUTER,
+	ROC_NIX_BPF_PC_MODE_DSCP_INNER,
+	ROC_NIX_BPF_PC_MODE_DSCP_OUTER,
+	ROC_NIX_BPF_PC_MODE_GEN_INNER,
+	ROC_NIX_BPF_PC_MODE_GEN_OUTER
+};
+
 enum roc_nix_bpf_color {
 	ROC_NIX_BPF_COLOR_GREEN,
 	ROC_NIX_BPF_COLOR_YELLOW,
@@ -149,6 +158,13 @@ struct roc_nix_bpf_objs {
 	uint16_t ids[ROC_NIX_BPF_PER_PFFUNC];
 };
 
+struct roc_nix_bpf_precolor {
+#define ROC_NIX_BPF_PRE_COLOR_MAX 64
+	uint8_t count;
+	enum roc_nix_bpf_pc_mode mode;
+	enum roc_nix_bpf_color color[ROC_NIX_BPF_PRE_COLOR_MAX];
+};
+
 struct roc_nix_vlan_config {
 	uint32_t type;
 	union {
@@ -610,6 +626,10 @@ int __roc_api roc_nix_bpf_ena_dis(struct roc_nix *roc_nix, uint16_t id,
 int __roc_api roc_nix_bpf_dump(struct roc_nix *roc_nix, uint16_t id,
 			       enum roc_nix_bpf_level_flag lvl_flag);
 
+int __roc_api roc_nix_bpf_pre_color_tbl_setup(
+	struct roc_nix *roc_nix, uint16_t id,
+	enum roc_nix_bpf_level_flag lvl_flag, struct roc_nix_bpf_precolor *tbl);
+
 uint8_t __roc_api
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag lvl_flag);
 
diff --git a/drivers/common/cnxk/roc_nix_bpf.c b/drivers/common/cnxk/roc_nix_bpf.c
index 2b2be20491..aae6f0ec77 100644
--- a/drivers/common/cnxk/roc_nix_bpf.c
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -9,6 +9,10 @@
 #define NIX_MAX_BPF_COUNT_MID_LAYER  8
 #define NIX_MAX_BPF_COUNT_TOP_LAYER  1
 
+#define NIX_BPF_PRECOLOR_GEN_TABLE_SIZE	 16
+#define NIX_BPF_PRECOLOR_VLAN_TABLE_SIZE 16
+#define NIX_BPF_PRECOLOR_DSCP_TABLE_SIZE 64
+
 #define NIX_BPF_LEVEL_F_MASK                                                   \
 	(ROC_NIX_BPF_LEVEL_F_LEAF | ROC_NIX_BPF_LEVEL_F_MID |                  \
 	 ROC_NIX_BPF_LEVEL_F_TOP)
@@ -177,6 +181,103 @@ nix_lf_bpf_dump(__io struct nix_band_prof_s *bpf)
 		 (uint64_t)bpf->red_octs_drop);
 }
 
+static inline void
+nix_precolor_conv_table_write(struct roc_nix *roc_nix, uint64_t val,
+			      uint32_t off)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+	int64_t *addr;
+
+	addr = PLT_PTR_ADD(nix->base, off);
+	plt_write64(val, addr);
+}
+
+static uint8_t
+nix_precolor_vlan_table_update(struct roc_nix *roc_nix,
+			       struct roc_nix_bpf_precolor *tbl)
+{
+	uint64_t val = 0, i;
+	uint8_t tn_ena;
+	uint32_t off;
+
+	for (i = 0; i < tbl->count; i++)
+		val |= (((uint64_t)tbl->color[i]) << (2 * i));
+
+	if (tbl->mode == ROC_NIX_BPF_PC_MODE_VLAN_INNER) {
+		off = NIX_LF_RX_VLAN1_COLOR_CONV;
+		tn_ena = true;
+	} else {
+		off = NIX_LF_RX_VLAN0_COLOR_CONV;
+		tn_ena = false;
+	}
+
+	nix_precolor_conv_table_write(roc_nix, val, off);
+	return tn_ena;
+}
+
+static uint8_t
+nix_precolor_inner_dscp_table_update(struct roc_nix *roc_nix,
+				     struct roc_nix_bpf_precolor *tbl)
+{
+	uint64_t val_lo = 0, val_hi = 0, i, j;
+
+	for (i = 0, j = 0; i < (tbl->count / 2); i++, j++)
+		val_lo |= (((uint64_t)tbl->color[i]) << (2 * j));
+
+	for (j = 0; i < tbl->count; i++, j++)
+		val_hi |= (((uint64_t)tbl->color[i]) << (2 * j));
+
+	nix_precolor_conv_table_write(roc_nix, val_lo,
+				      NIX_LF_RX_IIP_COLOR_CONV_LO);
+	nix_precolor_conv_table_write(roc_nix, val_hi,
+				      NIX_LF_RX_IIP_COLOR_CONV_HI);
+
+	return true;
+}
+
+static uint8_t
+nix_precolor_outer_dscp_table_update(struct roc_nix *roc_nix,
+				     struct roc_nix_bpf_precolor *tbl)
+{
+	uint64_t val_lo = 0, val_hi = 0, i, j;
+
+	for (i = 0, j = 0; i < (tbl->count / 2); i++, j++)
+		val_lo |= (((uint64_t)tbl->color[i]) << (2 * j));
+
+	for (j = 0; i < tbl->count; i++, j++)
+		val_hi |= (((uint64_t)tbl->color[i]) << (2 * j));
+
+	nix_precolor_conv_table_write(roc_nix, val_lo,
+				      NIX_LF_RX_OIP_COLOR_CONV_LO);
+	nix_precolor_conv_table_write(roc_nix, val_hi,
+				      NIX_LF_RX_OIP_COLOR_CONV_HI);
+
+	return false;
+}
+
+static uint8_t
+nix_precolor_gen_table_update(struct roc_nix *roc_nix,
+			      struct roc_nix_bpf_precolor *tbl)
+{
+	uint64_t val = 0, i;
+	uint8_t tn_ena;
+	uint32_t off;
+
+	for (i = 0; i < tbl->count; i++)
+		val |= (((uint64_t)tbl->color[i]) << (2 * i));
+
+	if (tbl->mode == ROC_NIX_BPF_PC_MODE_GEN_INNER) {
+		off = NIX_LF_RX_GEN_COLOR_CONVX(1);
+		tn_ena = true;
+	} else {
+		off = NIX_LF_RX_GEN_COLOR_CONVX(0);
+		tn_ena = false;
+	}
+
+	nix_precolor_conv_table_write(roc_nix, val, off);
+	return tn_ena;
+}
+
 uint8_t
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag level_f)
 {
@@ -555,3 +656,90 @@ roc_nix_bpf_dump(struct roc_nix *roc_nix, uint16_t id,
 
 	return rc;
 }
+
+int
+roc_nix_bpf_pre_color_tbl_setup(struct roc_nix *roc_nix, uint16_t id,
+				enum roc_nix_bpf_level_flag lvl_flag,
+				struct roc_nix_bpf_precolor *tbl)
+{
+	struct mbox *mbox = get_mbox(roc_nix);
+	struct nix_cn10k_aq_enq_req *aq;
+	uint8_t pc_mode, tn_ena;
+	uint8_t level_idx;
+	int rc;
+
+	if (!tbl || !tbl->count)
+		return NIX_ERR_PARAM;
+
+	if (roc_model_is_cn9k())
+		return NIX_ERR_HW_NOTSUP;
+
+	level_idx = roc_nix_bpf_level_to_idx(lvl_flag);
+	if (level_idx == ROC_NIX_BPF_LEVEL_IDX_INVALID)
+		return NIX_ERR_PARAM;
+
+	switch (tbl->mode) {
+	case ROC_NIX_BPF_PC_MODE_VLAN_INNER:
+	case ROC_NIX_BPF_PC_MODE_VLAN_OUTER:
+		if (tbl->count != NIX_BPF_PRECOLOR_VLAN_TABLE_SIZE) {
+			plt_err("Table size must be %d",
+				NIX_BPF_PRECOLOR_VLAN_TABLE_SIZE);
+			rc = NIX_ERR_PARAM;
+			goto exit;
+		}
+		tn_ena = nix_precolor_vlan_table_update(roc_nix, tbl);
+		pc_mode = NIX_RX_BAND_PROF_PC_MODE_VLAN;
+		break;
+	case ROC_NIX_BPF_PC_MODE_DSCP_INNER:
+		if (tbl->count != NIX_BPF_PRECOLOR_DSCP_TABLE_SIZE) {
+			plt_err("Table size must be %d",
+				NIX_BPF_PRECOLOR_DSCP_TABLE_SIZE);
+			rc = NIX_ERR_PARAM;
+			goto exit;
+		}
+		tn_ena = nix_precolor_inner_dscp_table_update(roc_nix, tbl);
+		pc_mode = NIX_RX_BAND_PROF_PC_MODE_DSCP;
+		break;
+	case ROC_NIX_BPF_PC_MODE_DSCP_OUTER:
+		if (tbl->count != NIX_BPF_PRECOLOR_DSCP_TABLE_SIZE) {
+			plt_err("Table size must be %d",
+				NIX_BPF_PRECOLOR_DSCP_TABLE_SIZE);
+			rc = NIX_ERR_PARAM;
+			goto exit;
+		}
+		tn_ena = nix_precolor_outer_dscp_table_update(roc_nix, tbl);
+		pc_mode = NIX_RX_BAND_PROF_PC_MODE_DSCP;
+		break;
+	case ROC_NIX_BPF_PC_MODE_GEN_INNER:
+	case ROC_NIX_BPF_PC_MODE_GEN_OUTER:
+		if (tbl->count != NIX_BPF_PRECOLOR_GEN_TABLE_SIZE) {
+			plt_err("Table size must be %d",
+				NIX_BPF_PRECOLOR_GEN_TABLE_SIZE);
+			rc = NIX_ERR_PARAM;
+			goto exit;
+		}
+		tn_ena = nix_precolor_gen_table_update(roc_nix, tbl);
+		pc_mode = NIX_RX_BAND_PROF_PC_MODE_GEN;
+		break;
+	default:
+		rc = NIX_ERR_PARAM;
+		goto exit;
+	}
+
+	/* Update corresponding bandwidth profile too */
+	aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
+	if (aq == NULL)
+		return -ENOSPC;
+	aq->qidx = (sw_to_hw_lvl_map[level_idx] << 14) | id;
+	aq->ctype = NIX_AQ_CTYPE_BAND_PROF;
+	aq->op = NIX_AQ_INSTOP_WRITE;
+	aq->prof.pc_mode = pc_mode;
+	aq->prof.tnl_ena = tn_ena;
+	aq->prof_mask.pc_mode = ~(aq->prof_mask.pc_mode);
+	aq->prof_mask.tnl_ena = ~(aq->prof_mask.tnl_ena);
+
+	return mbox_process(mbox);
+
+exit:
+	return rc;
+}
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index a201f6a755..984c239766 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -82,6 +82,7 @@ INTERNAL {
 	roc_nix_bpf_free;
 	roc_nix_bpf_free_all;
 	roc_nix_bpf_level_to_idx;
+	roc_nix_bpf_pre_color_tbl_setup;
 	roc_nix_cq_dump;
 	roc_nix_cq_fini;
 	roc_nix_cq_init;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 10/27] common/cnxk: support RoC API to connect bandwidth profiles
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (7 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 09/27] common/cnxk: support RoC API to setup precolor table skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 11/27] common/cnxk: support RoC API to get stats to index skori
                   ` (16 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Ray Kinsella
  Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

To maintain chain of bandwidth profiles, they needs to be
connected. Implement RoC API to connect two bandwidth profiles
at different levels.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/common/cnxk/roc_nix.h     |  6 ++++++
 drivers/common/cnxk/roc_nix_bpf.c | 36 +++++++++++++++++++++++++++++++
 drivers/common/cnxk/version.map   |  1 +
 3 files changed, 43 insertions(+)

diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index 36f6a35c50..08795cd76a 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -7,6 +7,7 @@
 
 /* Constants */
 #define ROC_NIX_BPF_PER_PFFUNC	      64
+#define ROC_NIX_BPF_ID_INVALID	      0xFFFF
 #define ROC_NIX_BPF_LEVEL_IDX_INVALID 0xFF
 #define ROC_NIX_BPF_LEVEL_MAX	      3
 
@@ -630,6 +631,11 @@ int __roc_api roc_nix_bpf_pre_color_tbl_setup(
 	struct roc_nix *roc_nix, uint16_t id,
 	enum roc_nix_bpf_level_flag lvl_flag, struct roc_nix_bpf_precolor *tbl);
 
+/* Use ROC_NIX_BPF_ID_INVALID as dst_id to disconnect */
+int __roc_api roc_nix_bpf_connect(struct roc_nix *roc_nix,
+				  enum roc_nix_bpf_level_flag lvl_flag,
+				  uint16_t src_id, uint16_t dst_id);
+
 uint8_t __roc_api
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag lvl_flag);
 
diff --git a/drivers/common/cnxk/roc_nix_bpf.c b/drivers/common/cnxk/roc_nix_bpf.c
index aae6f0ec77..e75440dc6f 100644
--- a/drivers/common/cnxk/roc_nix_bpf.c
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -743,3 +743,39 @@ roc_nix_bpf_pre_color_tbl_setup(struct roc_nix *roc_nix, uint16_t id,
 exit:
 	return rc;
 }
+
+int
+roc_nix_bpf_connect(struct roc_nix *roc_nix,
+		    enum roc_nix_bpf_level_flag lvl_flag, uint16_t src_id,
+		    uint16_t dst_id)
+{
+	struct mbox *mbox = get_mbox(roc_nix);
+	struct nix_cn10k_aq_enq_req *aq;
+	uint8_t level_idx;
+
+	if (roc_model_is_cn9k())
+		return NIX_ERR_HW_NOTSUP;
+
+	level_idx = roc_nix_bpf_level_to_idx(lvl_flag);
+	if (level_idx == ROC_NIX_BPF_LEVEL_IDX_INVALID)
+		return NIX_ERR_PARAM;
+
+	aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
+	if (aq == NULL)
+		return -ENOSPC;
+	aq->qidx = (sw_to_hw_lvl_map[level_idx] << 14) | src_id;
+	aq->ctype = NIX_AQ_CTYPE_BAND_PROF;
+	aq->op = NIX_AQ_INSTOP_WRITE;
+
+	if (dst_id == ROC_NIX_BPF_ID_INVALID) {
+		aq->prof.hl_en = false;
+		aq->prof_mask.hl_en = ~(aq->prof_mask.hl_en);
+	} else {
+		aq->prof.hl_en = true;
+		aq->prof.band_prof_id = dst_id;
+		aq->prof_mask.hl_en = ~(aq->prof_mask.hl_en);
+		aq->prof_mask.band_prof_id = ~(aq->prof_mask.band_prof_id);
+	}
+
+	return mbox_process(mbox);
+}
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index 984c239766..ef60615446 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -76,6 +76,7 @@ INTERNAL {
 	roc_se_ciph_key_set;
 	roc_nix_bpf_alloc;
 	roc_nix_bpf_config;
+	roc_nix_bpf_connect;
 	roc_nix_bpf_count_get;
 	roc_nix_bpf_dump;
 	roc_nix_bpf_ena_dis;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 11/27] common/cnxk: support RoC API to get stats to index
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (8 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 10/27] common/cnxk: support RoC API to connect bandwidth profiles skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 12/27] common/cnxk: support RoC API to read profile statistics skori
                   ` (15 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Ray Kinsella
  Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

CN10K platform supports different stats for HW bandwidth profiles.
Implement RoC API to get index for given stats type.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/common/cnxk/roc_nix.h     | 18 ++++++++++++++++
 drivers/common/cnxk/roc_nix_bpf.c | 34 +++++++++++++++++++++++++++++++
 drivers/common/cnxk/version.map   |  1 +
 3 files changed, 53 insertions(+)

diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index 08795cd76a..663d064e23 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -10,6 +10,7 @@
 #define ROC_NIX_BPF_ID_INVALID	      0xFFFF
 #define ROC_NIX_BPF_LEVEL_IDX_INVALID 0xFF
 #define ROC_NIX_BPF_LEVEL_MAX	      3
+#define ROC_NIX_BPF_STATS_MAX	      12
 
 /** NIX rate limits */
 #define MAX_RATE_DIV_EXP  12
@@ -119,6 +120,21 @@ enum roc_nix_bpf_action {
 	ROC_NIX_BPF_ACTION_RED
 };
 
+enum roc_nix_bpf_stats {
+	ROC_NIX_BPF_GREEN_PKT_F_PASS = BIT_ULL(0),
+	ROC_NIX_BPF_GREEN_OCTS_F_PASS = BIT_ULL(1),
+	ROC_NIX_BPF_GREEN_PKT_F_DROP = BIT_ULL(2),
+	ROC_NIX_BPF_GREEN_OCTS_F_DROP = BIT_ULL(3),
+	ROC_NIX_BPF_YELLOW_PKT_F_PASS = BIT_ULL(4),
+	ROC_NIX_BPF_YELLOW_OCTS_F_PASS = BIT_ULL(5),
+	ROC_NIX_BPF_YELLOW_PKT_F_DROP = BIT_ULL(6),
+	ROC_NIX_BPF_YELLOW_OCTS_F_DROP = BIT_ULL(7),
+	ROC_NIX_BPF_RED_PKT_F_PASS = BIT_ULL(8),
+	ROC_NIX_BPF_RED_OCTS_F_PASS = BIT_ULL(9),
+	ROC_NIX_BPF_RED_PKT_F_DROP = BIT_ULL(10),
+	ROC_NIX_BPF_RED_OCTS_F_DROP = BIT_ULL(11),
+};
+
 struct roc_nix_bpf_cfg {
 	enum roc_nix_bpf_algo alg;
 	enum roc_nix_bpf_lmode lmode;
@@ -639,6 +655,8 @@ int __roc_api roc_nix_bpf_connect(struct roc_nix *roc_nix,
 uint8_t __roc_api
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag lvl_flag);
 
+uint8_t __roc_api roc_nix_bpf_stats_to_idx(enum roc_nix_bpf_stats lvl_flag);
+
 /* MAC */
 int __roc_api roc_nix_mac_rxtx_start_stop(struct roc_nix *roc_nix, bool start);
 int __roc_api roc_nix_mac_link_event_start_stop(struct roc_nix *roc_nix,
diff --git a/drivers/common/cnxk/roc_nix_bpf.c b/drivers/common/cnxk/roc_nix_bpf.c
index e75440dc6f..639822be62 100644
--- a/drivers/common/cnxk/roc_nix_bpf.c
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -294,6 +294,40 @@ roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag level_f)
 	return idx;
 }
 
+uint8_t
+roc_nix_bpf_stats_to_idx(enum roc_nix_bpf_stats level_f)
+{
+	uint8_t idx;
+
+	if (level_f & ROC_NIX_BPF_GREEN_PKT_F_PASS)
+		idx = 0;
+	else if (level_f & ROC_NIX_BPF_GREEN_OCTS_F_PASS)
+		idx = 1;
+	else if (level_f & ROC_NIX_BPF_GREEN_PKT_F_DROP)
+		idx = 2;
+	else if (level_f & ROC_NIX_BPF_GREEN_OCTS_F_DROP)
+		idx = 3;
+	else if (level_f & ROC_NIX_BPF_YELLOW_PKT_F_PASS)
+		idx = 4;
+	else if (level_f & ROC_NIX_BPF_YELLOW_OCTS_F_PASS)
+		idx = 5;
+	else if (level_f & ROC_NIX_BPF_YELLOW_PKT_F_DROP)
+		idx = 6;
+	else if (level_f & ROC_NIX_BPF_YELLOW_OCTS_F_DROP)
+		idx = 7;
+	else if (level_f & ROC_NIX_BPF_RED_PKT_F_PASS)
+		idx = 8;
+	else if (level_f & ROC_NIX_BPF_RED_OCTS_F_PASS)
+		idx = 9;
+	else if (level_f & ROC_NIX_BPF_RED_PKT_F_DROP)
+		idx = 10;
+	else if (level_f & ROC_NIX_BPF_RED_OCTS_F_DROP)
+		idx = 11;
+	else
+		idx = ROC_NIX_BPF_STATS_MAX;
+	return idx;
+}
+
 int
 roc_nix_bpf_count_get(struct roc_nix *roc_nix, uint8_t lvl_mask,
 		      uint16_t count[ROC_NIX_BPF_LEVEL_MAX])
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index ef60615446..d3d99cf65e 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -84,6 +84,7 @@ INTERNAL {
 	roc_nix_bpf_free_all;
 	roc_nix_bpf_level_to_idx;
 	roc_nix_bpf_pre_color_tbl_setup;
+	roc_nix_bpf_stats_to_idx;
 	roc_nix_cq_dump;
 	roc_nix_cq_fini;
 	roc_nix_cq_init;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 12/27] common/cnxk: support RoC API to read profile statistics
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (9 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 11/27] common/cnxk: support RoC API to get stats to index skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 13/27] common/cnxk: support RoC API to reset profile stats skori
                   ` (14 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Ray Kinsella
  Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

CN10K platform provides statistics per bandwidth profile and
per nixlf. Implement RoC API to read stats for given bandwidth
profile.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/common/cnxk/roc_nix.h     |   9 ++
 drivers/common/cnxk/roc_nix_bpf.c | 197 ++++++++++++++++++++++++++++++
 drivers/common/cnxk/version.map   |   2 +
 3 files changed, 208 insertions(+)

diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index 663d064e23..94f9bc5442 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -652,6 +652,15 @@ int __roc_api roc_nix_bpf_connect(struct roc_nix *roc_nix,
 				  enum roc_nix_bpf_level_flag lvl_flag,
 				  uint16_t src_id, uint16_t dst_id);
 
+int __roc_api
+roc_nix_bpf_stats_read(struct roc_nix *roc_nix, uint16_t id, uint64_t mask,
+		       enum roc_nix_bpf_level_flag lvl_flag,
+		       uint64_t stats[ROC_NIX_BPF_STATS_MAX] /* Out */);
+
+int __roc_api
+roc_nix_bpf_lf_stats_read(struct roc_nix *roc_nix, uint64_t mask,
+			  uint64_t stats[ROC_NIX_BPF_STATS_MAX] /* Out */);
+
 uint8_t __roc_api
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag lvl_flag);
 
diff --git a/drivers/common/cnxk/roc_nix_bpf.c b/drivers/common/cnxk/roc_nix_bpf.c
index 639822be62..c4a7a14dbe 100644
--- a/drivers/common/cnxk/roc_nix_bpf.c
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -17,6 +17,9 @@
 	(ROC_NIX_BPF_LEVEL_F_LEAF | ROC_NIX_BPF_LEVEL_F_MID |                  \
 	 ROC_NIX_BPF_LEVEL_F_TOP)
 
+#define NIX_RD_STATS(val)  plt_read64(nix->base + NIX_LF_RX_STATX(val))
+#define NIX_RST_STATS(val) plt_write64(0, nix->base + NIX_LF_RX_STATX(val))
+
 static uint8_t sw_to_hw_lvl_map[] = {NIX_RX_BAND_PROF_LAYER_LEAF,
 				     NIX_RX_BAND_PROF_LAYER_MIDDLE,
 				     NIX_RX_BAND_PROF_LAYER_TOP};
@@ -813,3 +816,197 @@ roc_nix_bpf_connect(struct roc_nix *roc_nix,
 
 	return mbox_process(mbox);
 }
+
+int
+roc_nix_bpf_stats_read(struct roc_nix *roc_nix, uint16_t id, uint64_t mask,
+		       enum roc_nix_bpf_level_flag lvl_flag,
+		       uint64_t stats[ROC_NIX_BPF_STATS_MAX])
+{
+	uint8_t yellow_pkt_pass, yellow_octs_pass, yellow_pkt_drop;
+	uint8_t green_octs_drop, yellow_octs_drop, red_octs_drop;
+	uint8_t green_pkt_pass, green_octs_pass, green_pkt_drop;
+	uint8_t red_pkt_pass, red_octs_pass, red_pkt_drop;
+	struct mbox *mbox = get_mbox(roc_nix);
+	struct nix_cn10k_aq_enq_rsp *rsp;
+	struct nix_cn10k_aq_enq_req *aq;
+	uint8_t level_idx;
+	int rc;
+
+	if (roc_model_is_cn9k())
+		return NIX_ERR_HW_NOTSUP;
+
+	level_idx = roc_nix_bpf_level_to_idx(lvl_flag);
+	if (level_idx == ROC_NIX_BPF_LEVEL_IDX_INVALID)
+		return NIX_ERR_PARAM;
+
+	aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
+	if (aq == NULL)
+		return -ENOSPC;
+	aq->qidx = (sw_to_hw_lvl_map[level_idx] << 14 | id);
+	aq->ctype = NIX_AQ_CTYPE_BAND_PROF;
+	aq->op = NIX_AQ_INSTOP_READ;
+	rc = mbox_process_msg(mbox, (void *)&rsp);
+	if (rc)
+		return rc;
+
+	green_pkt_pass =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_GREEN_PKT_F_PASS);
+	green_octs_pass =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_GREEN_OCTS_F_PASS);
+	green_pkt_drop =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_GREEN_PKT_F_DROP);
+	green_octs_drop =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_GREEN_OCTS_F_DROP);
+	yellow_pkt_pass =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_YELLOW_PKT_F_PASS);
+	yellow_octs_pass =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_YELLOW_OCTS_F_PASS);
+	yellow_pkt_drop =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_YELLOW_PKT_F_DROP);
+	yellow_octs_drop =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_YELLOW_OCTS_F_DROP);
+	red_pkt_pass =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_RED_PKT_F_PASS);
+	red_octs_pass =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_RED_OCTS_F_PASS);
+	red_pkt_drop =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_RED_PKT_F_DROP);
+	red_octs_drop =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_RED_OCTS_F_DROP);
+
+	if (green_pkt_pass != ROC_NIX_BPF_STATS_MAX)
+		stats[green_pkt_pass] = rsp->prof.green_pkt_pass;
+
+	if (green_octs_pass != ROC_NIX_BPF_STATS_MAX)
+		stats[green_octs_pass] = rsp->prof.green_octs_pass;
+
+	if (green_pkt_drop != ROC_NIX_BPF_STATS_MAX)
+		stats[green_pkt_drop] = rsp->prof.green_pkt_drop;
+
+	if (green_octs_drop != ROC_NIX_BPF_STATS_MAX)
+		stats[green_octs_drop] = rsp->prof.green_octs_pass;
+
+	if (yellow_pkt_pass != ROC_NIX_BPF_STATS_MAX)
+		stats[yellow_pkt_pass] = rsp->prof.yellow_pkt_pass;
+
+	if (yellow_octs_pass != ROC_NIX_BPF_STATS_MAX)
+		stats[yellow_octs_pass] = rsp->prof.yellow_octs_pass;
+
+	if (yellow_pkt_drop != ROC_NIX_BPF_STATS_MAX)
+		stats[yellow_pkt_drop] = rsp->prof.yellow_pkt_drop;
+
+	if (yellow_octs_drop != ROC_NIX_BPF_STATS_MAX)
+		stats[yellow_octs_drop] = rsp->prof.yellow_octs_drop;
+
+	if (red_pkt_pass != ROC_NIX_BPF_STATS_MAX)
+		stats[red_pkt_pass] = rsp->prof.red_pkt_pass;
+
+	if (red_octs_pass != ROC_NIX_BPF_STATS_MAX)
+		stats[red_octs_pass] = rsp->prof.red_octs_pass;
+
+	if (red_pkt_drop != ROC_NIX_BPF_STATS_MAX)
+		stats[red_pkt_drop] = rsp->prof.red_pkt_drop;
+
+	if (red_octs_drop != ROC_NIX_BPF_STATS_MAX)
+		stats[red_octs_drop] = rsp->prof.red_octs_drop;
+
+	return 0;
+}
+
+int
+roc_nix_bpf_lf_stats_read(struct roc_nix *roc_nix, uint64_t mask,
+			  uint64_t stats[ROC_NIX_BPF_STATS_MAX])
+{
+	uint8_t yellow_pkt_pass, yellow_octs_pass, yellow_pkt_drop;
+	uint8_t green_octs_drop, yellow_octs_drop, red_octs_drop;
+	uint8_t green_pkt_pass, green_octs_pass, green_pkt_drop;
+	uint8_t red_pkt_pass, red_octs_pass, red_pkt_drop;
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+
+	green_pkt_pass =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_GREEN_PKT_F_PASS);
+	green_octs_pass =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_GREEN_OCTS_F_PASS);
+	green_pkt_drop =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_GREEN_PKT_F_DROP);
+	green_octs_drop =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_GREEN_OCTS_F_DROP);
+	yellow_pkt_pass =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_YELLOW_PKT_F_PASS);
+	yellow_octs_pass =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_YELLOW_OCTS_F_PASS);
+	yellow_pkt_drop =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_YELLOW_PKT_F_DROP);
+	yellow_octs_drop =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_YELLOW_OCTS_F_DROP);
+	red_pkt_pass =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_RED_PKT_F_PASS);
+	red_octs_pass =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_RED_OCTS_F_PASS);
+	red_pkt_drop =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_RED_PKT_F_DROP);
+	red_octs_drop =
+		roc_nix_bpf_stats_to_idx(mask & ROC_NIX_BPF_RED_OCTS_F_DROP);
+
+	if (green_pkt_pass != ROC_NIX_BPF_STATS_MAX) {
+		stats[green_pkt_pass] =
+			NIX_RD_STATS(NIX_STAT_LF_RX_RX_GC_OCTS_PASSED);
+	}
+
+	if (green_octs_pass != ROC_NIX_BPF_STATS_MAX) {
+		stats[green_octs_pass] =
+			NIX_RD_STATS(NIX_STAT_LF_RX_RX_YC_PKTS_PASSED);
+	}
+
+	if (green_pkt_drop != ROC_NIX_BPF_STATS_MAX) {
+		stats[green_pkt_drop] =
+			NIX_RD_STATS(NIX_STAT_LF_RX_RX_GC_OCTS_DROP);
+	}
+
+	if (green_octs_drop != ROC_NIX_BPF_STATS_MAX) {
+		stats[green_octs_drop] =
+			NIX_RD_STATS(NIX_STAT_LF_RX_RX_YC_PKTS_DROP);
+	}
+
+	if (yellow_pkt_pass != ROC_NIX_BPF_STATS_MAX) {
+		stats[yellow_pkt_pass] =
+			NIX_RD_STATS(NIX_STAT_LF_RX_RX_GC_PKTS_PASSED);
+	}
+
+	if (yellow_octs_pass != ROC_NIX_BPF_STATS_MAX) {
+		stats[yellow_octs_pass] =
+			NIX_RD_STATS(NIX_STAT_LF_RX_RX_RC_OCTS_PASSED);
+	}
+
+	if (yellow_pkt_drop != ROC_NIX_BPF_STATS_MAX) {
+		stats[yellow_pkt_drop] =
+			NIX_RD_STATS(NIX_STAT_LF_RX_RX_GC_PKTS_DROP);
+	}
+
+	if (yellow_octs_drop != ROC_NIX_BPF_STATS_MAX) {
+		stats[yellow_octs_drop] =
+			NIX_RD_STATS(NIX_STAT_LF_RX_RX_RC_OCTS_DROP);
+	}
+
+	if (red_pkt_pass != ROC_NIX_BPF_STATS_MAX) {
+		stats[red_pkt_pass] =
+			NIX_RD_STATS(NIX_STAT_LF_RX_RX_YC_OCTS_PASSED);
+	}
+
+	if (red_octs_pass != ROC_NIX_BPF_STATS_MAX) {
+		stats[red_octs_pass] =
+			NIX_RD_STATS(NIX_STAT_LF_RX_RX_RC_PKTS_PASSED);
+	}
+
+	if (red_pkt_drop != ROC_NIX_BPF_STATS_MAX) {
+		stats[red_pkt_drop] =
+			NIX_RD_STATS(NIX_STAT_LF_RX_RX_YC_OCTS_DROP);
+	}
+
+	if (red_octs_drop != ROC_NIX_BPF_STATS_MAX) {
+		stats[red_octs_drop] =
+			NIX_RD_STATS(NIX_STAT_LF_RX_RX_RC_PKTS_DROP);
+	}
+
+	return 0;
+}
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index d3d99cf65e..eb4ff5011b 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -83,7 +83,9 @@ INTERNAL {
 	roc_nix_bpf_free;
 	roc_nix_bpf_free_all;
 	roc_nix_bpf_level_to_idx;
+	roc_nix_bpf_lf_stats_read;
 	roc_nix_bpf_pre_color_tbl_setup;
+	roc_nix_bpf_stats_read;
 	roc_nix_bpf_stats_to_idx;
 	roc_nix_cq_dump;
 	roc_nix_cq_fini;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 13/27] common/cnxk: support RoC API to reset profile stats
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (10 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 12/27] common/cnxk: support RoC API to read profile statistics skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 14/27] common/cnxk: support meter in action list skori
                   ` (13 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	Ray Kinsella
  Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement RoC API to reset stats per bandwidth profile
or per nixlf.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/common/cnxk/roc_nix.h     |   7 ++
 drivers/common/cnxk/roc_nix_bpf.c | 113 ++++++++++++++++++++++++++++++
 drivers/common/cnxk/version.map   |   2 +
 3 files changed, 122 insertions(+)

diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index 94f9bc5442..03228bc5ea 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -657,10 +657,17 @@ roc_nix_bpf_stats_read(struct roc_nix *roc_nix, uint16_t id, uint64_t mask,
 		       enum roc_nix_bpf_level_flag lvl_flag,
 		       uint64_t stats[ROC_NIX_BPF_STATS_MAX] /* Out */);
 
+int __roc_api roc_nix_bpf_stats_reset(struct roc_nix *roc_nix, uint16_t id,
+				      uint64_t mask,
+				      enum roc_nix_bpf_level_flag lvl_flag);
+
 int __roc_api
 roc_nix_bpf_lf_stats_read(struct roc_nix *roc_nix, uint64_t mask,
 			  uint64_t stats[ROC_NIX_BPF_STATS_MAX] /* Out */);
 
+int __roc_api roc_nix_bpf_lf_stats_reset(struct roc_nix *roc_nix,
+					 uint64_t mask);
+
 uint8_t __roc_api
 roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag lvl_flag);
 
diff --git a/drivers/common/cnxk/roc_nix_bpf.c b/drivers/common/cnxk/roc_nix_bpf.c
index c4a7a14dbe..31fa42316b 100644
--- a/drivers/common/cnxk/roc_nix_bpf.c
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -913,6 +913,86 @@ roc_nix_bpf_stats_read(struct roc_nix *roc_nix, uint16_t id, uint64_t mask,
 	return 0;
 }
 
+int
+roc_nix_bpf_stats_reset(struct roc_nix *roc_nix, uint16_t id, uint64_t mask,
+			enum roc_nix_bpf_level_flag lvl_flag)
+{
+	struct mbox *mbox = get_mbox(roc_nix);
+	struct nix_cn10k_aq_enq_req *aq;
+	uint8_t level_idx;
+
+	if (roc_model_is_cn9k())
+		return NIX_ERR_HW_NOTSUP;
+
+	level_idx = roc_nix_bpf_level_to_idx(lvl_flag);
+	if (level_idx == ROC_NIX_BPF_LEVEL_IDX_INVALID)
+		return NIX_ERR_PARAM;
+
+	aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
+	if (aq == NULL)
+		return -ENOSPC;
+	aq->qidx = (sw_to_hw_lvl_map[level_idx] << 14 | id);
+	aq->ctype = NIX_AQ_CTYPE_BAND_PROF;
+	aq->op = NIX_AQ_INSTOP_WRITE;
+
+	if (mask & ROC_NIX_BPF_GREEN_PKT_F_PASS) {
+		aq->prof.green_pkt_pass = 0;
+		aq->prof_mask.green_pkt_pass = ~(aq->prof_mask.green_pkt_pass);
+	}
+	if (mask & ROC_NIX_BPF_GREEN_OCTS_F_PASS) {
+		aq->prof.green_octs_pass = 0;
+		aq->prof_mask.green_octs_pass =
+			~(aq->prof_mask.green_octs_pass);
+	}
+	if (mask & ROC_NIX_BPF_GREEN_PKT_F_DROP) {
+		aq->prof.green_pkt_drop = 0;
+		aq->prof_mask.green_pkt_drop = ~(aq->prof_mask.green_pkt_drop);
+	}
+	if (mask & ROC_NIX_BPF_GREEN_OCTS_F_DROP) {
+		aq->prof.green_octs_drop = 0;
+		aq->prof_mask.green_octs_drop =
+			~(aq->prof_mask.green_octs_drop);
+	}
+	if (mask & ROC_NIX_BPF_YELLOW_PKT_F_PASS) {
+		aq->prof.yellow_pkt_pass = 0;
+		aq->prof_mask.yellow_pkt_pass =
+			~(aq->prof_mask.yellow_pkt_pass);
+	}
+	if (mask & ROC_NIX_BPF_YELLOW_OCTS_F_PASS) {
+		aq->prof.yellow_octs_pass = 0;
+		aq->prof_mask.yellow_octs_pass =
+			~(aq->prof_mask.yellow_octs_pass);
+	}
+	if (mask & ROC_NIX_BPF_YELLOW_PKT_F_DROP) {
+		aq->prof.yellow_pkt_drop = 0;
+		aq->prof_mask.yellow_pkt_drop =
+			~(aq->prof_mask.yellow_pkt_drop);
+	}
+	if (mask & ROC_NIX_BPF_YELLOW_OCTS_F_DROP) {
+		aq->prof.yellow_octs_drop = 0;
+		aq->prof_mask.yellow_octs_drop =
+			~(aq->prof_mask.yellow_octs_drop);
+	}
+	if (mask & ROC_NIX_BPF_RED_PKT_F_PASS) {
+		aq->prof.red_pkt_pass = 0;
+		aq->prof_mask.red_pkt_pass = ~(aq->prof_mask.red_pkt_pass);
+	}
+	if (mask & ROC_NIX_BPF_RED_OCTS_F_PASS) {
+		aq->prof.red_octs_pass = 0;
+		aq->prof_mask.red_octs_pass = ~(aq->prof_mask.red_octs_pass);
+	}
+	if (mask & ROC_NIX_BPF_RED_PKT_F_DROP) {
+		aq->prof.red_pkt_drop = 0;
+		aq->prof_mask.red_pkt_drop = ~(aq->prof_mask.red_pkt_drop);
+	}
+	if (mask & ROC_NIX_BPF_RED_OCTS_F_DROP) {
+		aq->prof.red_octs_drop = 0;
+		aq->prof_mask.red_octs_drop = ~(aq->prof_mask.red_octs_drop);
+	}
+
+	return mbox_process(mbox);
+}
+
 int
 roc_nix_bpf_lf_stats_read(struct roc_nix *roc_nix, uint64_t mask,
 			  uint64_t stats[ROC_NIX_BPF_STATS_MAX])
@@ -1010,3 +1090,36 @@ roc_nix_bpf_lf_stats_read(struct roc_nix *roc_nix, uint64_t mask,
 
 	return 0;
 }
+
+int
+roc_nix_bpf_lf_stats_reset(struct roc_nix *roc_nix, uint64_t mask)
+{
+	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
+
+	if (mask & ROC_NIX_BPF_GREEN_PKT_F_PASS)
+		NIX_RST_STATS(ROC_NIX_BPF_GREEN_PKT_F_PASS);
+	if (mask & ROC_NIX_BPF_GREEN_OCTS_F_PASS)
+		NIX_RST_STATS(ROC_NIX_BPF_GREEN_OCTS_F_PASS);
+	if (mask & ROC_NIX_BPF_GREEN_PKT_F_DROP)
+		NIX_RST_STATS(ROC_NIX_BPF_GREEN_PKT_F_DROP);
+	if (mask & ROC_NIX_BPF_GREEN_OCTS_F_DROP)
+		NIX_RST_STATS(ROC_NIX_BPF_GREEN_OCTS_F_DROP);
+	if (mask & ROC_NIX_BPF_YELLOW_PKT_F_PASS)
+		NIX_RST_STATS(ROC_NIX_BPF_YELLOW_PKT_F_PASS);
+	if (mask & ROC_NIX_BPF_YELLOW_OCTS_F_PASS)
+		NIX_RST_STATS(ROC_NIX_BPF_YELLOW_OCTS_F_PASS);
+	if (mask & ROC_NIX_BPF_YELLOW_PKT_F_DROP)
+		NIX_RST_STATS(ROC_NIX_BPF_YELLOW_PKT_F_DROP);
+	if (mask & ROC_NIX_BPF_YELLOW_OCTS_F_DROP)
+		NIX_RST_STATS(ROC_NIX_BPF_YELLOW_OCTS_F_DROP);
+	if (mask & ROC_NIX_BPF_RED_PKT_F_PASS)
+		NIX_RST_STATS(ROC_NIX_BPF_RED_PKT_F_PASS);
+	if (mask & ROC_NIX_BPF_RED_OCTS_F_PASS)
+		NIX_RST_STATS(ROC_NIX_BPF_RED_OCTS_F_PASS);
+	if (mask & ROC_NIX_BPF_RED_PKT_F_DROP)
+		NIX_RST_STATS(ROC_NIX_BPF_RED_PKT_F_DROP);
+	if (mask & ROC_NIX_BPF_RED_OCTS_F_DROP)
+		NIX_RST_STATS(ROC_NIX_BPF_RED_OCTS_F_DROP);
+
+	return 0;
+}
diff --git a/drivers/common/cnxk/version.map b/drivers/common/cnxk/version.map
index eb4ff5011b..ab8f917b5c 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -84,8 +84,10 @@ INTERNAL {
 	roc_nix_bpf_free_all;
 	roc_nix_bpf_level_to_idx;
 	roc_nix_bpf_lf_stats_read;
+	roc_nix_bpf_lf_stats_reset;
 	roc_nix_bpf_pre_color_tbl_setup;
 	roc_nix_bpf_stats_read;
+	roc_nix_bpf_stats_reset;
 	roc_nix_bpf_stats_to_idx;
 	roc_nix_cq_dump;
 	roc_nix_cq_fini;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 14/27] common/cnxk: support meter in action list
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (11 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 13/27] common/cnxk: support RoC API to reset profile stats skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 15/27] net/cnxk: support meter ops get API skori
                   ` (12 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Meter action is added in supported action list.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/common/cnxk/roc_npc.h | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/common/cnxk/roc_npc.h b/drivers/common/cnxk/roc_npc.h
index bab25fd72e..0853889a32 100644
--- a/drivers/common/cnxk/roc_npc.h
+++ b/drivers/common/cnxk/roc_npc.h
@@ -58,7 +58,7 @@ struct roc_npc_flow_item_raw {
 	const uint8_t *pattern; /**< Byte string to look for. */
 };
 
-#define ROC_NPC_MAX_ACTION_COUNT 12
+#define ROC_NPC_MAX_ACTION_COUNT 17
 
 enum roc_npc_action_type {
 	ROC_NPC_ACTION_TYPE_END = (1 << 0),
@@ -77,6 +77,7 @@ enum roc_npc_action_type {
 	ROC_NPC_ACTION_TYPE_VLAN_INSERT = (1 << 13),
 	ROC_NPC_ACTION_TYPE_VLAN_ETHTYPE_INSERT = (1 << 14),
 	ROC_NPC_ACTION_TYPE_VLAN_PCP_INSERT = (1 << 15),
+	ROC_NPC_ACTION_TYPE_METER = (1 << 16),
 };
 
 struct roc_npc_action {
@@ -110,6 +111,10 @@ struct roc_npc_action_of_set_vlan_pcp {
 	uint8_t vlan_pcp; /**< VLAN priority. */
 };
 
+struct roc_npc_action_meter {
+	uint32_t mtr_id; /**< Meter id to be applied. > */
+};
+
 struct roc_npc_attr {
 	uint32_t priority;	/**< Rule priority level within group. */
 	uint32_t ingress : 1;	/**< Rule applies to ingress traffic. */
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 15/27] net/cnxk: support meter ops get API
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (12 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 14/27] common/cnxk: support meter in action list skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 16/27] net/cnxk: support ops to get meter capabilities skori
                   ` (11 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

To enable support for ingress meter, supported operations
are exposed for CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/net/cnxk/cn10k_ethdev.c     |  1 +
 drivers/net/cnxk/cn10k_ethdev.h     |  2 ++
 drivers/net/cnxk/cn10k_ethdev_mtr.c | 18 ++++++++++++++++++
 drivers/net/cnxk/meson.build        |  1 +
 4 files changed, 22 insertions(+)
 create mode 100644 drivers/net/cnxk/cn10k_ethdev_mtr.c

diff --git a/drivers/net/cnxk/cn10k_ethdev.c b/drivers/net/cnxk/cn10k_ethdev.c
index 7caec6cf14..8c1f6a4408 100644
--- a/drivers/net/cnxk/cn10k_ethdev.c
+++ b/drivers/net/cnxk/cn10k_ethdev.c
@@ -457,6 +457,7 @@ nix_eth_dev_ops_override(void)
 	cnxk_eth_dev_ops.dev_ptypes_set = cn10k_nix_ptypes_set;
 	cnxk_eth_dev_ops.timesync_enable = cn10k_nix_timesync_enable;
 	cnxk_eth_dev_ops.timesync_disable = cn10k_nix_timesync_disable;
+	cnxk_eth_dev_ops.mtr_ops_get = cn10k_nix_mtr_ops_get;
 }
 
 static void
diff --git a/drivers/net/cnxk/cn10k_ethdev.h b/drivers/net/cnxk/cn10k_ethdev.h
index 8b6e0f2b3f..117aa2a62d 100644
--- a/drivers/net/cnxk/cn10k_ethdev.h
+++ b/drivers/net/cnxk/cn10k_ethdev.h
@@ -38,4 +38,6 @@ struct cn10k_eth_rxq {
 void cn10k_eth_set_rx_function(struct rte_eth_dev *eth_dev);
 void cn10k_eth_set_tx_function(struct rte_eth_dev *eth_dev);
 
+/* MTR */
+int cn10k_nix_mtr_ops_get(struct rte_eth_dev *dev, void *ops);
 #endif /* __CN10K_ETHDEV_H__ */
diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c
new file mode 100644
index 0000000000..9b46032858
--- /dev/null
+++ b/drivers/net/cnxk/cn10k_ethdev_mtr.c
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2021 Marvell.
+ */
+
+#include "cn10k_ethdev.h"
+#include <rte_mtr_driver.h>
+
+const struct rte_mtr_ops nix_mtr_ops = {
+};
+
+int
+cn10k_nix_mtr_ops_get(struct rte_eth_dev *dev, void *ops)
+{
+	RTE_SET_USED(dev);
+
+	*(const void **)ops = &nix_mtr_ops;
+	return 0;
+}
diff --git a/drivers/net/cnxk/meson.build b/drivers/net/cnxk/meson.build
index d4cdd1744a..91afc1de4c 100644
--- a/drivers/net/cnxk/meson.build
+++ b/drivers/net/cnxk/meson.build
@@ -35,6 +35,7 @@ sources += files(
 # CN10K
 sources += files(
         'cn10k_ethdev.c',
+        'cn10k_ethdev_mtr.c',
         'cn10k_rte_flow.c',
         'cn10k_rx.c',
         'cn10k_rx_mseg.c',
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 16/27] net/cnxk: support ops to get meter capabilities
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (13 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 15/27] net/cnxk: support meter ops get API skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 17/27] net/cnxk: support ops to create meter profile skori
                   ` (10 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement ethdev operation to get meter capabilities for
CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/net/cnxk/cn10k_ethdev_mtr.c | 48 +++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c
index 9b46032858..bf97bf4a71 100644
--- a/drivers/net/cnxk/cn10k_ethdev_mtr.c
+++ b/drivers/net/cnxk/cn10k_ethdev_mtr.c
@@ -5,7 +5,55 @@
 #include "cn10k_ethdev.h"
 #include <rte_mtr_driver.h>
 
+#define NIX_MTR_COUNT_MAX      73 /* 64(leaf) + 8(mid) + 1(top) */
+#define NIX_MTR_COUNT_PER_FLOW 3  /* 1(leaf) + 1(mid) + 1(top) */
+
+static struct rte_mtr_capabilities mtr_capa = {
+	.n_max = NIX_MTR_COUNT_MAX,
+	.n_shared_max = NIX_MTR_COUNT_PER_FLOW,
+	/* .identical = , */
+	.shared_identical = true,
+	/* .shared_n_flows_per_mtr_max = ,*/
+	.chaining_n_mtrs_per_flow_max = NIX_MTR_COUNT_PER_FLOW,
+	.chaining_use_prev_mtr_color_supported = true,
+	.chaining_use_prev_mtr_color_enforced = true,
+	.meter_srtcm_rfc2697_n_max = NIX_MTR_COUNT_MAX,
+	.meter_trtcm_rfc2698_n_max = NIX_MTR_COUNT_MAX,
+	.meter_trtcm_rfc4115_n_max = NIX_MTR_COUNT_MAX,
+	.meter_rate_max = ROC_NIX_BPF_RATE_MAX,
+	.meter_policy_n_max = NIX_MTR_COUNT_MAX,
+	.color_aware_srtcm_rfc2697_supported = true,
+	.color_aware_trtcm_rfc2698_supported = true,
+	.color_aware_trtcm_rfc4115_supported = true,
+	.srtcm_rfc2697_byte_mode_supported = true,
+	.srtcm_rfc2697_packet_mode_supported = true,
+	.trtcm_rfc2698_byte_mode_supported = true,
+	.trtcm_rfc2698_packet_mode_supported = true,
+	.trtcm_rfc4115_byte_mode_supported = true,
+	.trtcm_rfc4115_packet_mode_supported = true,
+	.stats_mask = RTE_MTR_STATS_N_PKTS_GREEN | RTE_MTR_STATS_N_PKTS_YELLOW |
+		      RTE_MTR_STATS_N_PKTS_RED | RTE_MTR_STATS_N_PKTS_DROPPED |
+		      RTE_MTR_STATS_N_BYTES_GREEN |
+		      RTE_MTR_STATS_N_BYTES_YELLOW | RTE_MTR_STATS_N_BYTES_RED |
+		      RTE_MTR_STATS_N_BYTES_DROPPED};
+
+static int
+cn10k_nix_mtr_capabilities_get(struct rte_eth_dev *dev,
+			       struct rte_mtr_capabilities *capa,
+			       struct rte_mtr_error *error)
+{
+	RTE_SET_USED(dev);
+
+	if (!capa)
+		return -rte_mtr_error_set(error, EINVAL,
+					  RTE_MTR_ERROR_TYPE_MTR_PARAMS, NULL,
+					  "NULL input parameter");
+	*capa = mtr_capa;
+	return 0;
+}
+
 const struct rte_mtr_ops nix_mtr_ops = {
+	.capabilities_get = cn10k_nix_mtr_capabilities_get,
 };
 
 int
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 17/27] net/cnxk: support ops to create meter profile
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (14 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 16/27] net/cnxk: support ops to get meter capabilities skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 18/27] net/cnxk: support ops to delete " skori
                   ` (9 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement API to add meter profile for CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/net/cnxk/cn10k_ethdev_mtr.c | 104 ++++++++++++++++++++++++++++
 drivers/net/cnxk/cnxk_ethdev.h      |  13 ++++
 2 files changed, 117 insertions(+)

diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c
index bf97bf4a71..404431fb8c 100644
--- a/drivers/net/cnxk/cn10k_ethdev_mtr.c
+++ b/drivers/net/cnxk/cn10k_ethdev_mtr.c
@@ -37,6 +37,71 @@ static struct rte_mtr_capabilities mtr_capa = {
 		      RTE_MTR_STATS_N_BYTES_YELLOW | RTE_MTR_STATS_N_BYTES_RED |
 		      RTE_MTR_STATS_N_BYTES_DROPPED};
 
+static struct cn10k_flow_meter_profile *
+nix_mtr_profile_find(struct cnxk_eth_dev *dev, uint32_t profile_id)
+{
+	struct cn10k_mtr_profiles *fmps = &dev->mtr_profiles;
+	struct cn10k_flow_meter_profile *fmp;
+
+	TAILQ_FOREACH(fmp, fmps, next)
+		if (profile_id == fmp->id)
+			return fmp;
+
+	return NULL;
+}
+
+static int
+nix_mtr_profile_validate(struct cnxk_eth_dev *dev, uint32_t profile_id,
+			 struct rte_mtr_meter_profile *profile,
+			 struct rte_mtr_error *error)
+{
+	int rc = 0;
+
+	PLT_SET_USED(dev);
+
+	if (profile == NULL)
+		return -rte_mtr_error_set(error, EINVAL,
+					  RTE_MTR_ERROR_TYPE_METER_PROFILE,
+					  NULL, "Meter profile is null.");
+
+	if (profile_id == UINT32_MAX)
+		return -rte_mtr_error_set(error, EINVAL,
+					  RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
+					  NULL, "Meter profile id not valid.");
+
+	switch (profile->alg) {
+	case RTE_MTR_SRTCM_RFC2697:
+		if (profile->srtcm_rfc2697.cir > mtr_capa.meter_rate_max)
+			rc = -rte_mtr_error_set(error, EINVAL,
+				RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
+				"CIR exceeds max meter rate");
+		break;
+
+	case RTE_MTR_TRTCM_RFC2698:
+		if (profile->trtcm_rfc2698.pir > mtr_capa.meter_rate_max)
+			rc = -rte_mtr_error_set(error, EINVAL,
+				RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
+				"PIR exceeds max meter rate");
+		break;
+
+	case RTE_MTR_TRTCM_RFC4115:
+		if ((profile->trtcm_rfc4115.cir + profile->trtcm_rfc4115.eir) >
+		    mtr_capa.meter_rate_max)
+			rc = -rte_mtr_error_set(error, EINVAL,
+				RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
+				"PIR + EIR exceeds max rate");
+		break;
+
+	default:
+		rc = -rte_mtr_error_set(error, EINVAL,
+					RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL,
+					"alg is invalid");
+		break;
+	}
+
+	return rc;
+}
+
 static int
 cn10k_nix_mtr_capabilities_get(struct rte_eth_dev *dev,
 			       struct rte_mtr_capabilities *capa,
@@ -52,8 +117,47 @@ cn10k_nix_mtr_capabilities_get(struct rte_eth_dev *dev,
 	return 0;
 }
 
+static int
+cn10k_nix_mtr_profile_add(struct rte_eth_dev *eth_dev, uint32_t profile_id,
+			  struct rte_mtr_meter_profile *profile,
+			  struct rte_mtr_error *error)
+{
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct cn10k_mtr_profiles *fmps = &dev->mtr_profiles;
+	struct cn10k_flow_meter_profile *fmp;
+	int ret;
+
+	/* Check input params. */
+	ret = nix_mtr_profile_validate(dev, profile_id, profile, error);
+	if (ret)
+		return ret;
+
+	fmp = nix_mtr_profile_find(dev, profile_id);
+	if (fmp) {
+		rte_mtr_error_set(error, EEXIST,
+				  RTE_MTR_ERROR_TYPE_METER_PROFILE_ID, NULL,
+				  "Profile already exist");
+		return 0;
+	}
+
+	fmp = plt_zmalloc(sizeof(struct cn10k_flow_meter_profile), ROC_ALIGN);
+	if (fmp == NULL)
+		return -rte_mtr_error_set(error, ENOMEM,
+					  RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+					  "Meter profile memory "
+					  "alloc failed.");
+
+	fmp->id = profile_id;
+	fmp->profile = *profile;
+
+	TAILQ_INSERT_TAIL(fmps, fmp, next);
+
+	return 0;
+}
+
 const struct rte_mtr_ops nix_mtr_ops = {
 	.capabilities_get = cn10k_nix_mtr_capabilities_get,
+	.meter_profile_add = cn10k_nix_mtr_profile_add,
 };
 
 int
diff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h
index 2528b3cdaa..5d7cf58a24 100644
--- a/drivers/net/cnxk/cnxk_ethdev.h
+++ b/drivers/net/cnxk/cnxk_ethdev.h
@@ -13,6 +13,7 @@
 #include <rte_mbuf.h>
 #include <rte_mbuf_pool_ops.h>
 #include <rte_mempool.h>
+#include <rte_mtr_driver.h>
 #include <rte_time.h>
 
 #include "roc_api.h"
@@ -144,6 +145,15 @@ struct cnxk_timesync_info {
 	uint64_t *tx_tstamp;
 } __plt_cache_aligned;
 
+struct cn10k_flow_meter_profile {
+	TAILQ_ENTRY(cn10k_flow_meter_profile) next;
+	struct rte_mtr_meter_profile profile; /**< Profile detail. */
+	uint32_t ref_cnt;		      /**< Use count. */
+	uint32_t id;			      /**< Profile id. */
+};
+
+TAILQ_HEAD(cn10k_mtr_profiles, cn10k_flow_meter_profile);
+
 struct cnxk_eth_dev {
 	/* ROC NIX */
 	struct roc_nix nix;
@@ -211,6 +221,9 @@ struct cnxk_eth_dev {
 	double clk_freq_mult;
 	uint64_t clk_delta;
 
+	/* Ingress policer */
+	struct cn10k_mtr_profiles mtr_profiles;
+
 	/* Rx burst for cleanup(Only Primary) */
 	eth_rx_burst_t rx_pkt_burst_no_offload;
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 18/27] net/cnxk: support ops to delete meter profile
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (15 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 17/27] net/cnxk: support ops to create meter profile skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 19/27] net/cnxk: support ops to validate meter policy skori
                   ` (8 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement API to delete meter profile for CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/net/cnxk/cn10k_ethdev_mtr.c | 30 +++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c
index 404431fb8c..480ce8fd73 100644
--- a/drivers/net/cnxk/cn10k_ethdev_mtr.c
+++ b/drivers/net/cnxk/cn10k_ethdev_mtr.c
@@ -155,9 +155,39 @@ cn10k_nix_mtr_profile_add(struct rte_eth_dev *eth_dev, uint32_t profile_id,
 	return 0;
 }
 
+static int
+cn10k_nix_mtr_profile_delete(struct rte_eth_dev *eth_dev, uint32_t profile_id,
+			     struct rte_mtr_error *error)
+{
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct cn10k_flow_meter_profile *fmp;
+
+	if (profile_id == UINT32_MAX)
+		return -rte_mtr_error_set(error, EINVAL,
+					  RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
+					  NULL, "Meter profile id not valid.");
+
+	fmp = nix_mtr_profile_find(dev, profile_id);
+	if (fmp == NULL)
+		return -rte_mtr_error_set(error, ENOENT,
+					  RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
+					  &profile_id,
+					  "Meter profile is invalid.");
+
+	if (fmp->ref_cnt)
+		return -rte_mtr_error_set(error, EBUSY,
+					  RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
+					  NULL, "Meter profile is in use.");
+
+	TAILQ_REMOVE(&dev->mtr_profiles, fmp, next);
+	plt_free(fmp);
+	return 0;
+}
+
 const struct rte_mtr_ops nix_mtr_ops = {
 	.capabilities_get = cn10k_nix_mtr_capabilities_get,
 	.meter_profile_add = cn10k_nix_mtr_profile_add,
+	.meter_profile_delete = cn10k_nix_mtr_profile_delete,
 };
 
 int
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 19/27] net/cnxk: support ops to validate meter policy
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (16 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 18/27] net/cnxk: support ops to delete " skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 20/27] net/cnxk: support ops to create " skori
                   ` (7 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement API to validate meter policy for CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/net/cnxk/cn10k_ethdev_mtr.c | 63 +++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)

diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c
index 480ce8fd73..8374f40681 100644
--- a/drivers/net/cnxk/cn10k_ethdev_mtr.c
+++ b/drivers/net/cnxk/cn10k_ethdev_mtr.c
@@ -184,10 +184,73 @@ cn10k_nix_mtr_profile_delete(struct rte_eth_dev *eth_dev, uint32_t profile_id,
 	return 0;
 }
 
+static int
+cn10k_nix_mtr_policy_validate(struct rte_eth_dev *dev,
+			      struct rte_mtr_meter_policy_params *policy,
+			      struct rte_mtr_error *error)
+{
+	enum rte_flow_action_type supported_action[] = {
+		RTE_FLOW_ACTION_TYPE_END, RTE_FLOW_ACTION_TYPE_QUEUE,
+		RTE_FLOW_ACTION_TYPE_DROP, RTE_FLOW_ACTION_TYPE_RSS,
+		RTE_FLOW_ACTION_TYPE_METER};
+	bool supported[RTE_COLORS] = {false, false, false};
+	uint32_t i;
+
+	RTE_SET_USED(dev);
+
+	if (!policy)
+		return 0; /* Nothing to be validated */
+
+	for (i = 0; i < RTE_DIM(supported_action); i++) {
+		if (policy->actions[RTE_COLOR_GREEN]->type ==
+		    supported_action[i]) {
+			supported[RTE_COLOR_GREEN] = true;
+			break;
+		}
+	}
+
+	if (!supported[RTE_COLOR_GREEN]) {
+		return -rte_mtr_error_set(error, ENOTSUP,
+					  RTE_MTR_ERROR_TYPE_METER_POLICY, NULL,
+					  "Green: action is not supported");
+	}
+
+	for (i = 0; i < RTE_DIM(supported_action); i++) {
+		if (policy->actions[RTE_COLOR_YELLOW]->type ==
+		    supported_action[i]) {
+			supported[RTE_COLOR_YELLOW] = true;
+			break;
+		}
+	}
+
+	if (!supported[RTE_COLOR_YELLOW]) {
+		return -rte_mtr_error_set(error, ENOTSUP,
+					  RTE_MTR_ERROR_TYPE_METER_POLICY, NULL,
+					  "Yellow: action is not supported");
+	}
+
+	for (i = 0; i < RTE_DIM(supported_action); i++) {
+		if (policy->actions[RTE_COLOR_RED]->type ==
+		    supported_action[i]) {
+			supported[RTE_COLOR_RED] = true;
+			break;
+		}
+	}
+
+	if (!supported[RTE_COLOR_RED]) {
+		return -rte_mtr_error_set(error, ENOTSUP,
+					  RTE_MTR_ERROR_TYPE_METER_POLICY, NULL,
+					  "Red: action is not supported");
+	}
+
+	return 0;
+}
+
 const struct rte_mtr_ops nix_mtr_ops = {
 	.capabilities_get = cn10k_nix_mtr_capabilities_get,
 	.meter_profile_add = cn10k_nix_mtr_profile_add,
 	.meter_profile_delete = cn10k_nix_mtr_profile_delete,
+	.meter_policy_validate = cn10k_nix_mtr_policy_validate,
 };
 
 int
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 20/27] net/cnxk: support ops to create meter policy
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (17 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 19/27] net/cnxk: support ops to validate meter policy skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 21/27] net/cnxk: support ops to delete " skori
                   ` (6 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement API to add meter policy for CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/net/cnxk/cn10k_ethdev_mtr.c | 47 +++++++++++++++++++++++++++++
 drivers/net/cnxk/cnxk_ethdev.h      | 12 ++++++++
 2 files changed, 59 insertions(+)

diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c
index 8374f40681..854d30dc20 100644
--- a/drivers/net/cnxk/cn10k_ethdev_mtr.c
+++ b/drivers/net/cnxk/cn10k_ethdev_mtr.c
@@ -50,6 +50,18 @@ nix_mtr_profile_find(struct cnxk_eth_dev *dev, uint32_t profile_id)
 	return NULL;
 }
 
+static struct cn10k_flow_meter_policy *
+nix_mtr_policy_find(struct cnxk_eth_dev *dev, uint32_t meter_policy_id)
+{
+	struct cn10k_mtr_policy *fmps = &dev->mtr_policy;
+	struct cn10k_flow_meter_policy *fmp;
+
+	TAILQ_FOREACH(fmp, fmps, next)
+		if (meter_policy_id == fmp->id)
+			return fmp;
+	return NULL;
+}
+
 static int
 nix_mtr_profile_validate(struct cnxk_eth_dev *dev, uint32_t profile_id,
 			 struct rte_mtr_meter_profile *profile,
@@ -246,11 +258,46 @@ cn10k_nix_mtr_policy_validate(struct rte_eth_dev *dev,
 	return 0;
 }
 
+static int
+cn10k_nix_mtr_policy_add(struct rte_eth_dev *eth_dev, uint32_t policy_id,
+			 struct rte_mtr_meter_policy_params *policy,
+			 struct rte_mtr_error *error)
+{
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct cn10k_mtr_policy *fmps = &dev->mtr_policy;
+	struct cn10k_flow_meter_policy *fmp;
+	int rc;
+
+	fmp = nix_mtr_policy_find(dev, policy_id);
+	if (fmp) {
+		plt_info("Policy already exist");
+		return 0;
+	}
+
+	fmp = plt_zmalloc(sizeof(struct cn10k_flow_meter_policy), ROC_ALIGN);
+	if (fmp == NULL) {
+		return -rte_mtr_error_set(error, ENOMEM,
+					  RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+					  "Memory allocation failure");
+	} else {
+		rc = cn10k_nix_mtr_policy_validate(eth_dev, policy, error);
+		if (rc)
+			return rc;
+	}
+
+	fmp->id = policy_id;
+	fmp->policy = *policy;
+	TAILQ_INSERT_TAIL(fmps, fmp, next);
+
+	return 0;
+}
+
 const struct rte_mtr_ops nix_mtr_ops = {
 	.capabilities_get = cn10k_nix_mtr_capabilities_get,
 	.meter_profile_add = cn10k_nix_mtr_profile_add,
 	.meter_profile_delete = cn10k_nix_mtr_profile_delete,
 	.meter_policy_validate = cn10k_nix_mtr_policy_validate,
+	.meter_policy_add = cn10k_nix_mtr_policy_add,
 };
 
 int
diff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h
index 5d7cf58a24..3811360b75 100644
--- a/drivers/net/cnxk/cnxk_ethdev.h
+++ b/drivers/net/cnxk/cnxk_ethdev.h
@@ -145,6 +145,16 @@ struct cnxk_timesync_info {
 	uint64_t *tx_tstamp;
 } __plt_cache_aligned;
 
+
+struct cn10k_flow_meter_policy {
+	TAILQ_ENTRY(cn10k_flow_meter_policy) next;
+	/**< Pointer to the next flow meter structure. */
+	uint32_t id;	 /**< Policy id */
+	uint32_t mtr_id; /** Meter id */
+	struct rte_mtr_meter_policy_params policy;
+	uint32_t ref_cnt;
+};
+
 struct cn10k_flow_meter_profile {
 	TAILQ_ENTRY(cn10k_flow_meter_profile) next;
 	struct rte_mtr_meter_profile profile; /**< Profile detail. */
@@ -153,6 +163,7 @@ struct cn10k_flow_meter_profile {
 };
 
 TAILQ_HEAD(cn10k_mtr_profiles, cn10k_flow_meter_profile);
+TAILQ_HEAD(cn10k_mtr_policy, cn10k_flow_meter_policy);
 
 struct cnxk_eth_dev {
 	/* ROC NIX */
@@ -223,6 +234,7 @@ struct cnxk_eth_dev {
 
 	/* Ingress policer */
 	struct cn10k_mtr_profiles mtr_profiles;
+	struct cn10k_mtr_policy mtr_policy;
 
 	/* Rx burst for cleanup(Only Primary) */
 	eth_rx_burst_t rx_pkt_burst_no_offload;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 21/27] net/cnxk: support ops to delete meter policy
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (18 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 20/27] net/cnxk: support ops to create " skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 22/27] net/cnxk: support ops to create meter skori
                   ` (5 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement API to delete meter policy for CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/net/cnxk/cn10k_ethdev_mtr.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c
index 854d30dc20..7273b88046 100644
--- a/drivers/net/cnxk/cn10k_ethdev_mtr.c
+++ b/drivers/net/cnxk/cn10k_ethdev_mtr.c
@@ -292,12 +292,38 @@ cn10k_nix_mtr_policy_add(struct rte_eth_dev *eth_dev, uint32_t policy_id,
 	return 0;
 }
 
+static int
+cn10k_nix_mtr_policy_delete(struct rte_eth_dev *eth_dev, uint32_t policy_id,
+			    struct rte_mtr_error *error)
+{
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct cn10k_flow_meter_policy *fmp;
+
+	fmp = nix_mtr_policy_find(dev, policy_id);
+	if (fmp == NULL) {
+		return -rte_mtr_error_set(error, ENOENT,
+					  RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
+					  NULL, "No policy found");
+	}
+
+	if (fmp->ref_cnt)
+		return -rte_mtr_error_set(error, EBUSY,
+					  RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
+					  NULL, "Meter policy is in use.");
+
+	TAILQ_REMOVE(&dev->mtr_policy, fmp, next);
+	plt_free(fmp);
+
+	return 0;
+}
+
 const struct rte_mtr_ops nix_mtr_ops = {
 	.capabilities_get = cn10k_nix_mtr_capabilities_get,
 	.meter_profile_add = cn10k_nix_mtr_profile_add,
 	.meter_profile_delete = cn10k_nix_mtr_profile_delete,
 	.meter_policy_validate = cn10k_nix_mtr_policy_validate,
 	.meter_policy_add = cn10k_nix_mtr_policy_add,
+	.meter_policy_delete = cn10k_nix_mtr_policy_delete,
 };
 
 int
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 22/27] net/cnxk: support ops to create meter
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (19 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 21/27] net/cnxk: support ops to delete " skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 23/27] net/cnxk: support ops to delete meter skori
                   ` (4 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement API to create meter instance for CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/net/cnxk/cn10k_ethdev_mtr.c | 75 +++++++++++++++++++++++++++++
 drivers/net/cnxk/cnxk_ethdev.h      | 20 ++++++++
 2 files changed, 95 insertions(+)

diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c
index 7273b88046..dbf74249c7 100644
--- a/drivers/net/cnxk/cn10k_ethdev_mtr.c
+++ b/drivers/net/cnxk/cn10k_ethdev_mtr.c
@@ -37,6 +37,18 @@ static struct rte_mtr_capabilities mtr_capa = {
 		      RTE_MTR_STATS_N_BYTES_YELLOW | RTE_MTR_STATS_N_BYTES_RED |
 		      RTE_MTR_STATS_N_BYTES_DROPPED};
 
+static struct cn10k_flow_meter *
+nix_mtr_find(struct cnxk_eth_dev *dev, uint32_t meter_id)
+{
+	struct cn10k_mtr *fms = &dev->mtr;
+	struct cn10k_flow_meter *fm;
+
+	TAILQ_FOREACH(fm, fms, next)
+		if (meter_id == fm->id)
+			return fm;
+	return NULL;
+}
+
 static struct cn10k_flow_meter_profile *
 nix_mtr_profile_find(struct cnxk_eth_dev *dev, uint32_t profile_id)
 {
@@ -317,6 +329,68 @@ cn10k_nix_mtr_policy_delete(struct rte_eth_dev *eth_dev, uint32_t policy_id,
 	return 0;
 }
 
+static int
+cn10k_nix_mtr_create(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
+		     struct rte_mtr_params *params, int shared,
+		     struct rte_mtr_error *error)
+{
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct cn10k_flow_meter_profile *profile;
+	struct cn10k_flow_meter_policy *policy;
+	struct cn10k_mtr *fm = &dev->mtr;
+	struct cn10k_flow_meter *mtr;
+
+	RTE_SET_USED(shared);
+
+	if (params == NULL)
+		return -rte_mtr_error_set(error, ENOENT,
+					  RTE_MTR_ERROR_TYPE_MTR_PARAMS, NULL,
+					  "Meter params are invalid.");
+
+	profile = nix_mtr_profile_find(dev, params->meter_profile_id);
+	if (profile == NULL)
+		return -rte_mtr_error_set(error, ENOENT,
+					  RTE_MTR_ERROR_TYPE_METER_PROFILE_ID,
+					  &params->meter_profile_id,
+					  "Meter profile is invalid.");
+
+	policy = nix_mtr_policy_find(dev, params->meter_policy_id);
+	if (policy == NULL)
+		return -rte_mtr_error_set(error, ENOENT,
+					  RTE_MTR_ERROR_TYPE_METER_POLICY_ID,
+					  &params->meter_policy_id,
+					  "Meter policy is invalid.");
+
+	mtr = nix_mtr_find(dev, mtr_id);
+	if (mtr == NULL) {
+		mtr = plt_zmalloc(sizeof(struct cn10k_flow_meter), ROC_ALIGN);
+		if (mtr == NULL) {
+			return -rte_mtr_error_set(error, ENOMEM,
+				RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+				"Meter memory alloc failed.");
+		} else {
+			mtr->id = mtr_id;
+			mtr->profile = profile;
+			mtr->policy = policy;
+			mtr->params = *params;
+			mtr->bpf_id = ROC_NIX_BPF_ID_INVALID;
+			mtr->prev_id = ROC_NIX_BPF_ID_INVALID;
+			mtr->next_id = ROC_NIX_BPF_ID_INVALID;
+			mtr->is_prev = false;
+			mtr->is_next = false;
+			mtr->level = ROC_NIX_BPF_LEVEL_IDX_INVALID;
+		}
+	} else {
+		plt_info("Meter already exist");
+		return 0;
+	}
+
+	profile->ref_cnt++;
+	policy->ref_cnt++;
+	TAILQ_INSERT_TAIL(fm, mtr, next);
+	return 0;
+}
+
 const struct rte_mtr_ops nix_mtr_ops = {
 	.capabilities_get = cn10k_nix_mtr_capabilities_get,
 	.meter_profile_add = cn10k_nix_mtr_profile_add,
@@ -324,6 +398,7 @@ const struct rte_mtr_ops nix_mtr_ops = {
 	.meter_policy_validate = cn10k_nix_mtr_policy_validate,
 	.meter_policy_add = cn10k_nix_mtr_policy_add,
 	.meter_policy_delete = cn10k_nix_mtr_policy_delete,
+	.create = cn10k_nix_mtr_create,
 };
 
 int
diff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h
index 3811360b75..c8ddcab8f1 100644
--- a/drivers/net/cnxk/cnxk_ethdev.h
+++ b/drivers/net/cnxk/cnxk_ethdev.h
@@ -145,6 +145,24 @@ struct cnxk_timesync_info {
 	uint64_t *tx_tstamp;
 } __plt_cache_aligned;
 
+struct cn10k_flow_meter {
+	TAILQ_ENTRY(cn10k_flow_meter) next;
+	/**< Pointer to the next flow meter structure. */
+	uint32_t id; /**< Usr mtr id. */
+	struct cn10k_flow_meter_profile *profile;
+	struct cn10k_flow_meter_policy *policy;
+	uint32_t bpf_id; /**< Hw mtr id. */
+	uint32_t rq_num;
+	uint32_t *rq_id;
+	uint16_t level;
+	uint32_t prev_id; /**< Prev mtr id for chaining */
+	uint32_t next_id; /**< Next mtr id for chaining */
+	bool is_prev;
+	bool is_next;
+	struct rte_mtr_params params;
+	struct roc_nix_bpf_objs profs;
+	uint32_t ref_cnt;
+};
 
 struct cn10k_flow_meter_policy {
 	TAILQ_ENTRY(cn10k_flow_meter_policy) next;
@@ -164,6 +182,7 @@ struct cn10k_flow_meter_profile {
 
 TAILQ_HEAD(cn10k_mtr_profiles, cn10k_flow_meter_profile);
 TAILQ_HEAD(cn10k_mtr_policy, cn10k_flow_meter_policy);
+TAILQ_HEAD(cn10k_mtr, cn10k_flow_meter);
 
 struct cnxk_eth_dev {
 	/* ROC NIX */
@@ -235,6 +254,7 @@ struct cnxk_eth_dev {
 	/* Ingress policer */
 	struct cn10k_mtr_profiles mtr_profiles;
 	struct cn10k_mtr_policy mtr_policy;
+	struct cn10k_mtr mtr;
 
 	/* Rx burst for cleanup(Only Primary) */
 	eth_rx_burst_t rx_pkt_burst_no_offload;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 23/27] net/cnxk: support ops to delete meter
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (20 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 22/27] net/cnxk: support ops to create meter skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 24/27] net/cnxk: support ops to enable/disable meter skori
                   ` (3 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement API to delete meter instance for CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/net/cnxk/cn10k_ethdev_mtr.c | 82 +++++++++++++++++++++++++++++
 1 file changed, 82 insertions(+)

diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c
index dbf74249c7..6b19e34361 100644
--- a/drivers/net/cnxk/cn10k_ethdev_mtr.c
+++ b/drivers/net/cnxk/cn10k_ethdev_mtr.c
@@ -8,6 +8,10 @@
 #define NIX_MTR_COUNT_MAX      73 /* 64(leaf) + 8(mid) + 1(top) */
 #define NIX_MTR_COUNT_PER_FLOW 3  /* 1(leaf) + 1(mid) + 1(top) */
 
+static const enum roc_nix_bpf_level_flag lvl_map[] = {ROC_NIX_BPF_LEVEL_F_LEAF,
+						      ROC_NIX_BPF_LEVEL_F_MID,
+						      ROC_NIX_BPF_LEVEL_F_TOP};
+
 static struct rte_mtr_capabilities mtr_capa = {
 	.n_max = NIX_MTR_COUNT_MAX,
 	.n_shared_max = NIX_MTR_COUNT_PER_FLOW,
@@ -391,6 +395,83 @@ cn10k_nix_mtr_create(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
 	return 0;
 }
 
+static int
+cn10k_nix_mtr_destroy(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
+		      struct rte_mtr_error *error)
+{
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct roc_nix_bpf_objs profs = {0};
+	struct cn10k_mtr *fm = &dev->mtr;
+	struct roc_nix *nix = &dev->nix;
+	struct cn10k_flow_meter *mtr;
+	int rc = 0;
+
+	mtr = nix_mtr_find(dev, mtr_id);
+	if (mtr == NULL) {
+		return -rte_mtr_error_set(error, ENOENT,
+					  RTE_MTR_ERROR_TYPE_MTR_ID, &mtr_id,
+					  "Meter id is invalid.");
+	} else {
+		if (!mtr->ref_cnt) {
+			switch (lvl_map[mtr->level]) {
+			case ROC_NIX_BPF_LEVEL_F_LEAF:
+				if (mtr->is_next) {
+					rc = roc_nix_bpf_connect(nix,
+						ROC_NIX_BPF_LEVEL_F_LEAF,
+						mtr_id,
+						ROC_NIX_BPF_ID_INVALID);
+				}
+				break;
+			case ROC_NIX_BPF_LEVEL_F_MID:
+				if (mtr->is_prev) {
+					rc = roc_nix_bpf_connect(nix,
+						ROC_NIX_BPF_LEVEL_F_LEAF,
+						mtr->prev_id,
+						ROC_NIX_BPF_ID_INVALID);
+				}
+				if (mtr->is_next) {
+					rc = roc_nix_bpf_connect(nix,
+						ROC_NIX_BPF_LEVEL_F_MID, mtr_id,
+						ROC_NIX_BPF_ID_INVALID);
+				}
+				break;
+			case ROC_NIX_BPF_LEVEL_F_TOP:
+				if (mtr->is_prev) {
+					rc = roc_nix_bpf_connect(nix,
+						ROC_NIX_BPF_LEVEL_F_MID,
+						mtr->prev_id,
+						ROC_NIX_BPF_ID_INVALID);
+				}
+				break;
+			default:
+				return -rte_mtr_error_set(error, EINVAL,
+						  RTE_MTR_ERROR_TYPE_MTR_ID,
+						  NULL, "Invalid meter level");
+			}
+
+			if (rc)
+				goto exit;
+
+			profs.level = mtr->level;
+			profs.count = 1;
+			profs.ids[0] = mtr->bpf_id;
+			rc = roc_nix_bpf_free(nix, &profs, 1);
+			if (rc)
+				goto exit;
+
+			TAILQ_REMOVE(fm, mtr, next);
+			plt_free(fm);
+		} else {
+			return -rte_mtr_error_set(error, EADDRINUSE,
+						  RTE_MTR_ERROR_TYPE_MTR_ID,
+						  &mtr_id, "Meter id in use.");
+		}
+	}
+
+exit:
+	return rc;
+}
+
 const struct rte_mtr_ops nix_mtr_ops = {
 	.capabilities_get = cn10k_nix_mtr_capabilities_get,
 	.meter_profile_add = cn10k_nix_mtr_profile_add,
@@ -399,6 +480,7 @@ const struct rte_mtr_ops nix_mtr_ops = {
 	.meter_policy_add = cn10k_nix_mtr_policy_add,
 	.meter_policy_delete = cn10k_nix_mtr_policy_delete,
 	.create = cn10k_nix_mtr_create,
+	.destroy = cn10k_nix_mtr_destroy,
 };
 
 int
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 24/27] net/cnxk: support ops to enable/disable meter
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (21 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 23/27] net/cnxk: support ops to delete meter skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 25/27] net/cnxk: support ops to update precolor DSCP table skori
                   ` (2 subsequent siblings)
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement API to enable or disable meter instance for
CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/net/cnxk/cn10k_ethdev_mtr.c | 60 +++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)

diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c
index 6b19e34361..d873608104 100644
--- a/drivers/net/cnxk/cn10k_ethdev_mtr.c
+++ b/drivers/net/cnxk/cn10k_ethdev_mtr.c
@@ -472,6 +472,64 @@ cn10k_nix_mtr_destroy(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
 	return rc;
 }
 
+static int
+cn10k_nix_mtr_enable(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
+		     struct rte_mtr_error *error)
+{
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct roc_nix *nix = &dev->nix;
+	struct cn10k_flow_meter *mtr;
+	struct roc_nix_rq *rq;
+	uint32_t i;
+	int rc = 0;
+
+	mtr = nix_mtr_find(dev, mtr_id);
+	if (mtr == NULL) {
+		return -rte_mtr_error_set(error, ENOENT,
+					  RTE_MTR_ERROR_TYPE_MTR_ID, NULL,
+					  "Meter id is invalid.");
+	}
+
+	if (mtr->level != 0)
+		return 0;
+
+	for (i = 0; i < mtr->rq_num; i++) {
+		rq = &dev->rqs[mtr->rq_id[i]];
+		rc |= roc_nix_bpf_ena_dis(nix, mtr->bpf_id, rq, true);
+	}
+
+	return rc;
+}
+
+static int
+cn10k_nix_mtr_disable(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
+		      struct rte_mtr_error *error)
+{
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct roc_nix *nix = &dev->nix;
+	struct cn10k_flow_meter *mtr;
+	struct roc_nix_rq *rq;
+	uint32_t i;
+	int rc = 0;
+
+	mtr = nix_mtr_find(dev, mtr_id);
+	if (mtr == NULL) {
+		return -rte_mtr_error_set(error, ENOENT,
+					  RTE_MTR_ERROR_TYPE_MTR_ID, NULL,
+					  "Meter id is invalid.");
+	}
+
+	if (mtr->level != 0)
+		return 0;
+
+	for (i = 0; i < mtr->rq_num; i++) {
+		rq = &dev->rqs[mtr->rq_id[i]];
+		rc |= roc_nix_bpf_ena_dis(nix, mtr->bpf_id, rq, false);
+	}
+
+	return rc;
+}
+
 const struct rte_mtr_ops nix_mtr_ops = {
 	.capabilities_get = cn10k_nix_mtr_capabilities_get,
 	.meter_profile_add = cn10k_nix_mtr_profile_add,
@@ -481,6 +539,8 @@ const struct rte_mtr_ops nix_mtr_ops = {
 	.meter_policy_delete = cn10k_nix_mtr_policy_delete,
 	.create = cn10k_nix_mtr_create,
 	.destroy = cn10k_nix_mtr_destroy,
+	.meter_enable = cn10k_nix_mtr_enable,
+	.meter_disable = cn10k_nix_mtr_disable,
 };
 
 int
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 25/27] net/cnxk: support ops to update precolor DSCP table
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (22 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 24/27] net/cnxk: support ops to enable/disable meter skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 26/27] net/cnxk: support ops to read/update meter stats skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 27/27] net/cnxk: support meter action to flow create skori
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement API to update DSCP table for pre-coloring for
incoming packet per nixlf for CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/net/cnxk/cn10k_ethdev_mtr.c | 43 +++++++++++++++++++++++++++++
 drivers/net/cnxk/cnxk_ethdev.h      |  1 +
 2 files changed, 44 insertions(+)

diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c
index d873608104..743f2e6975 100644
--- a/drivers/net/cnxk/cn10k_ethdev_mtr.c
+++ b/drivers/net/cnxk/cn10k_ethdev_mtr.c
@@ -530,6 +530,48 @@ cn10k_nix_mtr_disable(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
 	return rc;
 }
 
+static int
+cn10k_nix_mtr_dscp_table_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
+				enum rte_color *dscp_table,
+				struct rte_mtr_error *error)
+{
+	enum roc_nix_bpf_color nix_dscp_tbl[ROC_NIX_BPF_PRE_COLOR_MAX];
+	enum roc_nix_bpf_color color_map[] = {ROC_NIX_BPF_COLOR_GREEN,
+					      ROC_NIX_BPF_COLOR_YELLOW,
+					      ROC_NIX_BPF_COLOR_RED};
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	uint8_t lvl_flag = ROC_NIX_BPF_LEVEL_F_LEAF;
+	struct roc_nix_bpf_precolor table;
+	struct roc_nix *nix = &dev->nix;
+	int rc, i;
+
+	if (!dscp_table) {
+		for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++)
+			nix_dscp_tbl[i] = ROC_NIX_BPF_COLOR_GREEN;
+	} else {
+		for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++)
+			nix_dscp_tbl[i] = color_map[dscp_table[i]];
+	}
+
+	table.count = ROC_NIX_BPF_PRE_COLOR_MAX;
+	table.mode = ROC_NIX_BPF_PC_MODE_DSCP_OUTER;
+	for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++)
+		table.color[i] = nix_dscp_tbl[i];
+
+	rc = roc_nix_bpf_pre_color_tbl_setup(nix, mtr_id, lvl_flag, &table);
+	if (rc) {
+		rte_mtr_error_set(error, rc, RTE_MTR_ERROR_TYPE_UNSPECIFIED,
+				  NULL, NULL);
+		goto exit;
+	}
+
+	for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++)
+		dev->precolor_tbl[i] = nix_dscp_tbl[i];
+
+exit:
+	return rc;
+}
+
 const struct rte_mtr_ops nix_mtr_ops = {
 	.capabilities_get = cn10k_nix_mtr_capabilities_get,
 	.meter_profile_add = cn10k_nix_mtr_profile_add,
@@ -541,6 +583,7 @@ const struct rte_mtr_ops nix_mtr_ops = {
 	.destroy = cn10k_nix_mtr_destroy,
 	.meter_enable = cn10k_nix_mtr_enable,
 	.meter_disable = cn10k_nix_mtr_disable,
+	.meter_dscp_table_update = cn10k_nix_mtr_dscp_table_update,
 };
 
 int
diff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h
index c8ddcab8f1..55b1a56a8b 100644
--- a/drivers/net/cnxk/cnxk_ethdev.h
+++ b/drivers/net/cnxk/cnxk_ethdev.h
@@ -252,6 +252,7 @@ struct cnxk_eth_dev {
 	uint64_t clk_delta;
 
 	/* Ingress policer */
+	enum roc_nix_bpf_color precolor_tbl[ROC_NIX_BPF_PRE_COLOR_MAX];
 	struct cn10k_mtr_profiles mtr_profiles;
 	struct cn10k_mtr_policy mtr_policy;
 	struct cn10k_mtr mtr;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 26/27] net/cnxk: support ops to read/update meter stats
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (23 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 25/27] net/cnxk: support ops to update precolor DSCP table skori
@ 2021-09-06  7:54 ` skori
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 27/27] net/cnxk: support meter action to flow create skori
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Implement API to read and update stats corresponding to
given meter instance for CN10K platform.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 drivers/net/cnxk/cn10k_ethdev_mtr.c | 141 ++++++++++++++++++++++++++++
 1 file changed, 141 insertions(+)

diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c
index 743f2e6975..76e3adcfb1 100644
--- a/drivers/net/cnxk/cn10k_ethdev_mtr.c
+++ b/drivers/net/cnxk/cn10k_ethdev_mtr.c
@@ -8,6 +8,21 @@
 #define NIX_MTR_COUNT_MAX      73 /* 64(leaf) + 8(mid) + 1(top) */
 #define NIX_MTR_COUNT_PER_FLOW 3  /* 1(leaf) + 1(mid) + 1(top) */
 
+#define NIX_BPF_STATS_MASK_ALL                                                 \
+	{                                                                      \
+		ROC_NIX_BPF_GREEN_PKT_F_PASS | ROC_NIX_BPF_GREEN_OCTS_F_PASS | \
+			ROC_NIX_BPF_GREEN_PKT_F_DROP |                         \
+			ROC_NIX_BPF_GREEN_OCTS_F_DROP |                        \
+			ROC_NIX_BPF_YELLOW_PKT_F_PASS |                        \
+			ROC_NIX_BPF_YELLOW_OCTS_F_PASS |                       \
+			ROC_NIX_BPF_YELLOW_PKT_F_DROP |                        \
+			ROC_NIX_BPF_YELLOW_OCTS_F_DROP |                       \
+			ROC_NIX_BPF_RED_PKT_F_PASS |                           \
+			ROC_NIX_BPF_RED_OCTS_F_PASS |                          \
+			ROC_NIX_BPF_RED_PKT_F_DROP |                           \
+			ROC_NIX_BPF_RED_OCTS_F_DROP                            \
+	}
+
 static const enum roc_nix_bpf_level_flag lvl_map[] = {ROC_NIX_BPF_LEVEL_F_LEAF,
 						      ROC_NIX_BPF_LEVEL_F_MID,
 						      ROC_NIX_BPF_LEVEL_F_TOP};
@@ -572,6 +587,130 @@ cn10k_nix_mtr_dscp_table_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
 	return rc;
 }
 
+static int
+cn10k_nix_mtr_stats_update(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
+			   uint64_t stats_mask, struct rte_mtr_error *error)
+{
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct cn10k_flow_meter *mtr;
+
+	if (!stats_mask)
+		return -rte_mtr_error_set(error, EINVAL,
+					  RTE_MTR_ERROR_TYPE_MTR_PARAMS, NULL,
+					  "no bit is set to stats mask");
+
+	mtr = nix_mtr_find(dev, mtr_id);
+	if (mtr == NULL) {
+		return -rte_mtr_error_set(error, ENOENT,
+					  RTE_MTR_ERROR_TYPE_MTR_ID, NULL,
+					  "Meter object not found");
+	}
+
+	mtr->params.stats_mask = stats_mask;
+	return 0;
+}
+
+static int
+cn10k_nix_mtr_stats_read(struct rte_eth_dev *eth_dev, uint32_t mtr_id,
+			 struct rte_mtr_stats *stats, uint64_t *stats_mask,
+			 int clear, struct rte_mtr_error *error)
+{
+	uint8_t yellow_pkt_pass, yellow_octs_pass, yellow_pkt_drop;
+	uint8_t green_octs_drop, yellow_octs_drop, red_octs_drop;
+	uint8_t green_pkt_pass, green_octs_pass, green_pkt_drop;
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	uint8_t red_pkt_pass, red_octs_pass, red_pkt_drop;
+	uint64_t bpf_stats[ROC_NIX_BPF_STATS_MAX] = {0};
+	uint8_t lvl_flag = ROC_NIX_BPF_LEVEL_F_LEAF;
+	/* Need to fix for runtime mask value */
+	uint64_t mask = NIX_BPF_STATS_MASK_ALL;
+	struct roc_nix *nix = &dev->nix;
+	struct cn10k_flow_meter *mtr;
+	int rc;
+
+	if (!stats)
+		return -rte_mtr_error_set(error, EINVAL,
+					  RTE_MTR_ERROR_TYPE_MTR_PARAMS, NULL,
+					  "stats pointer is NULL");
+
+	mtr = nix_mtr_find(dev, mtr_id);
+	if (mtr == NULL) {
+		return -rte_mtr_error_set(error, ENOENT,
+					  RTE_MTR_ERROR_TYPE_MTR_ID, NULL,
+					  "Meter object not found");
+	}
+
+	rc = roc_nix_bpf_stats_read(nix, mtr_id, mask, lvl_flag, bpf_stats);
+	if (rc) {
+		rte_mtr_error_set(error, rc, RTE_MTR_ERROR_TYPE_UNSPECIFIED,
+				  NULL, NULL);
+		goto exit;
+	}
+
+	green_pkt_pass = roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_GREEN_PKT_F_PASS);
+	green_octs_pass =
+		roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_GREEN_OCTS_F_PASS);
+	green_pkt_drop = roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_GREEN_PKT_F_DROP);
+	green_octs_drop =
+		roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_GREEN_OCTS_F_DROP);
+	yellow_pkt_pass =
+		roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_YELLOW_PKT_F_PASS);
+	yellow_octs_pass =
+		roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_YELLOW_OCTS_F_PASS);
+	yellow_pkt_drop =
+		roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_YELLOW_PKT_F_DROP);
+	yellow_octs_drop =
+		roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_YELLOW_OCTS_F_DROP);
+	red_pkt_pass = roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_RED_PKT_F_PASS);
+	red_octs_pass = roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_RED_OCTS_F_PASS);
+	red_pkt_drop = roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_RED_PKT_F_DROP);
+	red_octs_drop = roc_nix_bpf_stats_to_idx(ROC_NIX_BPF_RED_OCTS_F_DROP);
+
+	if (mtr->params.stats_mask & RTE_MTR_STATS_N_PKTS_GREEN)
+		stats->n_pkts[RTE_COLOR_GREEN] = bpf_stats[green_pkt_pass];
+
+	if (mtr->params.stats_mask & RTE_MTR_STATS_N_PKTS_YELLOW)
+		stats->n_pkts[RTE_COLOR_YELLOW] = bpf_stats[yellow_pkt_pass];
+
+	if (mtr->params.stats_mask & RTE_MTR_STATS_N_PKTS_RED)
+		stats->n_pkts[RTE_COLOR_RED] = bpf_stats[red_pkt_pass];
+
+	if (mtr->params.stats_mask & RTE_MTR_STATS_N_BYTES_GREEN)
+		stats->n_bytes[RTE_COLOR_GREEN] = bpf_stats[green_octs_pass];
+
+	if (mtr->params.stats_mask & RTE_MTR_STATS_N_BYTES_YELLOW)
+		stats->n_bytes[RTE_COLOR_YELLOW] = bpf_stats[yellow_octs_pass];
+
+	if (mtr->params.stats_mask & RTE_MTR_STATS_N_BYTES_RED)
+		stats->n_bytes[RTE_COLOR_RED] = bpf_stats[red_octs_pass];
+
+	if (mtr->params.stats_mask & RTE_MTR_STATS_N_PKTS_DROPPED)
+		stats->n_pkts_dropped = bpf_stats[green_pkt_drop] +
+					bpf_stats[yellow_pkt_drop] +
+					bpf_stats[red_pkt_drop];
+
+	if (mtr->params.stats_mask & RTE_MTR_STATS_N_BYTES_DROPPED)
+		stats->n_bytes_dropped = bpf_stats[green_octs_drop] +
+					 bpf_stats[yellow_octs_drop] +
+					 bpf_stats[red_octs_drop];
+
+	if (stats_mask)
+		*stats_mask = mtr->params.stats_mask;
+
+	if (clear) {
+		rc = roc_nix_bpf_stats_reset(nix, mtr_id, mask, lvl_flag);
+		if (rc) {
+			rte_mtr_error_set(error, rc,
+					  RTE_MTR_ERROR_TYPE_UNSPECIFIED, NULL,
+					  NULL);
+			goto exit;
+		}
+	}
+
+exit:
+	return rc;
+}
+
 const struct rte_mtr_ops nix_mtr_ops = {
 	.capabilities_get = cn10k_nix_mtr_capabilities_get,
 	.meter_profile_add = cn10k_nix_mtr_profile_add,
@@ -584,6 +723,8 @@ const struct rte_mtr_ops nix_mtr_ops = {
 	.meter_enable = cn10k_nix_mtr_enable,
 	.meter_disable = cn10k_nix_mtr_disable,
 	.meter_dscp_table_update = cn10k_nix_mtr_dscp_table_update,
+	.stats_update = cn10k_nix_mtr_stats_update,
+	.stats_read = cn10k_nix_mtr_stats_read,
 };
 
 int
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [dpdk-dev] [PATCH 27/27] net/cnxk: support meter action to flow create
  2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
                   ` (24 preceding siblings ...)
  2021-09-06  7:54 ` [dpdk-dev] [PATCH 26/27] net/cnxk: support ops to read/update meter stats skori
@ 2021-09-06  7:54 ` skori
  25 siblings, 0 replies; 27+ messages in thread
From: skori @ 2021-09-06  7:54 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao; +Cc: dev

From: Sunil Kumar Kori <skori@marvell.com>

Meters are configured per flow using rte_flow_create API.
Implement support for meter action applied on the flow.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 doc/guides/nics/features/cnxk.ini    |   1 +
 doc/guides/nics/features/cnxk_vf.ini |   1 +
 drivers/net/cnxk/cn10k_ethdev_mtr.c  | 270 +++++++++++++++++++++++++++
 drivers/net/cnxk/cnxk_ethdev.h       |  10 +
 drivers/net/cnxk/cnxk_rte_flow.c     | 251 +++++++++++++++++++++++++
 5 files changed, 533 insertions(+)

diff --git a/doc/guides/nics/features/cnxk.ini b/doc/guides/nics/features/cnxk.ini
index 5d456257bd..7bbce7dafc 100644
--- a/doc/guides/nics/features/cnxk.ini
+++ b/doc/guides/nics/features/cnxk.ini
@@ -78,6 +78,7 @@ count                = Y
 drop                 = Y
 flag                 = Y
 mark                 = Y
+meter                = Y
 of_pop_vlan          = Y
 of_push_vlan         = Y
 of_set_vlan_pcp      = Y
diff --git a/doc/guides/nics/features/cnxk_vf.ini b/doc/guides/nics/features/cnxk_vf.ini
index 7b4299f0be..89802a27f9 100644
--- a/doc/guides/nics/features/cnxk_vf.ini
+++ b/doc/guides/nics/features/cnxk_vf.ini
@@ -70,6 +70,7 @@ count                = Y
 drop                 = Y
 flag                 = Y
 mark                 = Y
+meter                = Y
 of_pop_vlan          = Y
 of_push_vlan         = Y
 of_set_vlan_pcp      = Y
diff --git a/drivers/net/cnxk/cn10k_ethdev_mtr.c b/drivers/net/cnxk/cn10k_ethdev_mtr.c
index 76e3adcfb1..f38d55cf99 100644
--- a/drivers/net/cnxk/cn10k_ethdev_mtr.c
+++ b/drivers/net/cnxk/cn10k_ethdev_mtr.c
@@ -735,3 +735,273 @@ cn10k_nix_mtr_ops_get(struct rte_eth_dev *dev, void *ops)
 	*(const void **)ops = &nix_mtr_ops;
 	return 0;
 }
+
+int
+nix_mtr_validate(struct rte_eth_dev *eth_dev, uint32_t id)
+{
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct cn10k_flow_meter_profile *profile;
+	struct cn10k_flow_meter_policy *policy;
+	struct cn10k_flow_meter *mtr;
+
+	mtr = nix_mtr_find(dev, id);
+	if (mtr == NULL)
+		return -EINVAL;
+
+	profile = nix_mtr_profile_find(dev, mtr->params.meter_profile_id);
+	if (profile == NULL)
+		return -EINVAL;
+
+	policy = nix_mtr_policy_find(dev, mtr->params.meter_policy_id);
+	if (policy == NULL)
+		return -EINVAL;
+
+	return 0;
+}
+
+int
+nix_mtr_policy_act_get(struct rte_eth_dev *eth_dev, uint32_t id,
+		       struct rte_flow_action actions[RTE_COLORS])
+{
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct cn10k_flow_meter_policy *policy;
+	struct cn10k_flow_meter *mtr;
+
+	mtr = nix_mtr_find(dev, id);
+	if (mtr == NULL)
+		return -EINVAL;
+
+	policy = nix_mtr_policy_find(dev, mtr->params.meter_policy_id);
+	if (policy == NULL)
+		return -EINVAL;
+
+	actions[RTE_COLOR_GREEN] = *policy->policy.actions[RTE_COLOR_GREEN];
+	actions[RTE_COLOR_YELLOW] = *policy->policy.actions[RTE_COLOR_YELLOW];
+	actions[RTE_COLOR_RED] = *policy->policy.actions[RTE_COLOR_RED];
+
+	return 0;
+}
+
+int
+nix_mtr_rq_update(struct rte_eth_dev *eth_dev, uint32_t id, uint32_t queue_num,
+		  const uint16_t *queue)
+{
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct cn10k_flow_meter *mtr;
+	uint32_t i;
+
+	mtr = nix_mtr_find(dev, id);
+	if (mtr == NULL)
+		return -EINVAL;
+
+	mtr->rq_id = plt_zmalloc(queue_num * sizeof(uint32_t), ROC_ALIGN);
+	if (mtr->rq_id == NULL)
+		return -ENOMEM;
+
+	mtr->rq_num = queue_num;
+	for (i = 0; i < queue_num; i++)
+		mtr->rq_id[i] = queue[i];
+
+	return 0;
+}
+
+int
+nix_mtr_chain_update(struct rte_eth_dev *eth_dev, uint32_t cur_id,
+		     uint32_t prev_id, uint32_t next_id)
+{
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct cn10k_flow_meter *mtr;
+
+	mtr = nix_mtr_find(dev, cur_id);
+	if (mtr == NULL)
+		return -EINVAL;
+
+	switch (lvl_map[mtr->level]) {
+	case ROC_NIX_BPF_LEVEL_F_LEAF:
+		mtr->prev_id = ROC_NIX_BPF_ID_INVALID;
+		mtr->next_id = next_id;
+		mtr->is_prev = false;
+		mtr->is_next = true;
+		break;
+	case ROC_NIX_BPF_LEVEL_F_MID:
+		mtr->prev_id = prev_id;
+		mtr->next_id = next_id;
+		mtr->is_prev = true;
+		mtr->is_next = true;
+		break;
+	case ROC_NIX_BPF_LEVEL_F_TOP:
+		mtr->prev_id = prev_id;
+		mtr->next_id = ROC_NIX_BPF_ID_INVALID;
+		mtr->is_prev = true;
+		mtr->is_next = false;
+		break;
+	default:
+		plt_err("Invalid meter level");
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+int
+nix_mtr_level_update(struct rte_eth_dev *eth_dev, uint32_t id, uint32_t level)
+{
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct cn10k_flow_meter *mtr;
+
+	mtr = nix_mtr_find(dev, id);
+	if (mtr == NULL)
+		return -EINVAL;
+
+	mtr->level = level;
+	return 0;
+}
+
+static void
+nix_mtr_config_map(struct cn10k_flow_meter *mtr, struct roc_nix_bpf_cfg *cfg)
+{
+	enum roc_nix_bpf_algo alg_map[] = {
+		ROC_NIX_BPF_ALGO_NONE, ROC_NIX_BPF_ALGO_2697,
+		ROC_NIX_BPF_ALGO_2698, ROC_NIX_BPF_ALGO_4115};
+	struct cn10k_flow_meter_profile *profile = mtr->profile;
+	struct cn10k_flow_meter_policy *policy = mtr->policy;
+
+	cfg->alg = alg_map[profile->profile.alg];
+	cfg->lmode = profile->profile.packet_mode;
+
+	switch (cfg->alg) {
+	case ROC_NIX_BPF_ALGO_2697:
+		cfg->algo2697.cir = profile->profile.srtcm_rfc2697.cir;
+		cfg->algo2697.cbs = profile->profile.srtcm_rfc2697.cbs;
+		cfg->algo2697.ebs = profile->profile.srtcm_rfc2697.ebs;
+		break;
+	case ROC_NIX_BPF_ALGO_2698:
+		cfg->algo2698.cir = profile->profile.trtcm_rfc2698.cir;
+		cfg->algo2698.pir = profile->profile.trtcm_rfc2698.pir;
+		cfg->algo2698.cbs = profile->profile.trtcm_rfc2698.cbs;
+		cfg->algo2698.pbs = profile->profile.trtcm_rfc2698.pbs;
+		break;
+	case ROC_NIX_BPF_ALGO_4115:
+		cfg->algo4115.cir = profile->profile.trtcm_rfc4115.cir;
+		cfg->algo4115.eir = profile->profile.trtcm_rfc4115.eir;
+		cfg->algo4115.cbs = profile->profile.trtcm_rfc4115.cbs;
+		cfg->algo4115.ebs = profile->profile.trtcm_rfc4115.ebs;
+		break;
+	default:
+		break;
+	}
+
+	cfg->action[ROC_NIX_BPF_COLOR_GREEN] = ROC_NIX_BPF_ACTION_PASS;
+	cfg->action[ROC_NIX_BPF_COLOR_YELLOW] = ROC_NIX_BPF_ACTION_PASS;
+	cfg->action[ROC_NIX_BPF_COLOR_RED] = ROC_NIX_BPF_ACTION_PASS;
+
+	if (policy->policy.actions[RTE_COLOR_GREEN]->type ==
+	    RTE_FLOW_ACTION_TYPE_DROP)
+		cfg->action[ROC_NIX_BPF_COLOR_GREEN] = ROC_NIX_BPF_ACTION_DROP;
+
+	if (policy->policy.actions[RTE_COLOR_YELLOW]->type ==
+	    RTE_FLOW_ACTION_TYPE_DROP)
+		cfg->action[ROC_NIX_BPF_COLOR_YELLOW] = ROC_NIX_BPF_ACTION_DROP;
+
+	if (policy->policy.actions[RTE_COLOR_RED]->type ==
+	    RTE_FLOW_ACTION_TYPE_DROP)
+		cfg->action[ROC_NIX_BPF_COLOR_RED] = ROC_NIX_BPF_ACTION_DROP;
+}
+
+static void
+nix_dscp_table_map(struct cn10k_flow_meter *mtr,
+		   struct roc_nix_bpf_precolor *tbl)
+{
+	enum roc_nix_bpf_color color_map[] = {ROC_NIX_BPF_COLOR_GREEN,
+					      ROC_NIX_BPF_COLOR_YELLOW,
+					      ROC_NIX_BPF_COLOR_RED};
+	int i;
+
+	tbl->count = ROC_NIX_BPF_PRE_COLOR_MAX;
+	tbl->mode = ROC_NIX_BPF_PC_MODE_DSCP_OUTER;
+
+	for (i = 0; i < ROC_NIX_BPF_PRE_COLOR_MAX; i++)
+		tbl->color[i] = color_map[mtr->params.dscp_table[i]];
+}
+
+int
+nix_mtr_configure(struct rte_eth_dev *eth_dev, uint32_t id)
+{
+	struct cn10k_flow_meter *mtr[ROC_NIX_BPF_LEVEL_MAX] = {0};
+	struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
+	struct roc_nix_bpf_objs profs[ROC_NIX_BPF_LEVEL_MAX];
+	uint8_t idx0 = ROC_NIX_BPF_LEVEL_IDX_INVALID;
+	uint8_t idx1 = ROC_NIX_BPF_LEVEL_IDX_INVALID;
+	uint8_t idx2 = ROC_NIX_BPF_LEVEL_IDX_INVALID;
+	uint16_t per_lvl_cnt[ROC_NIX_BPF_LEVEL_MAX];
+	struct roc_nix *nix = &dev->nix;
+	struct roc_nix_bpf_precolor tbl;
+	struct roc_nix_bpf_cfg cfg;
+	struct roc_nix_rq *rq;
+	uint8_t lvl_mask;
+	uint32_t i;
+	int rc;
+
+	mtr[0] = nix_mtr_find(dev, id);
+	if (mtr[0] == NULL)
+		return -EINVAL;
+
+	idx0 = roc_nix_bpf_level_to_idx(lvl_map[mtr[0]->level]);
+	lvl_mask = ROC_NIX_BPF_LEVEL_F_LEAF;
+	per_lvl_cnt[idx0] = 1;
+
+	if (mtr[0]->is_next) {
+		mtr[1] = nix_mtr_find(dev, mtr[0]->next_id);
+		if (mtr[1] == NULL)
+			return -EINVAL;
+
+		idx1 = roc_nix_bpf_level_to_idx(lvl_map[mtr[1]->level]);
+		lvl_mask |= ROC_NIX_BPF_LEVEL_F_MID;
+		per_lvl_cnt[idx1] = 1;
+	}
+
+	if (mtr[1] && mtr[1]->is_next) {
+		mtr[2] = nix_mtr_find(dev, mtr[1]->next_id);
+		if (mtr[2] == NULL)
+			return -EINVAL;
+
+		idx2 = roc_nix_bpf_level_to_idx(lvl_map[mtr[2]->level]);
+		lvl_mask |= ROC_NIX_BPF_LEVEL_F_TOP;
+		per_lvl_cnt[idx2] = 1;
+	}
+
+	rc = roc_nix_bpf_alloc(nix, lvl_mask, per_lvl_cnt, profs);
+	if (rc)
+		return rc;
+
+	mtr[0]->bpf_id = profs[idx0].ids[0];
+
+	if (mtr[0]->is_next)
+		mtr[1]->bpf_id = profs[idx1].ids[0];
+
+	if (mtr[1]->is_next)
+		mtr[2]->bpf_id = profs[idx2].ids[0];
+
+	for (i = 0; i < ROC_NIX_BPF_LEVEL_MAX; i++) {
+		memset(&cfg, 0, sizeof(struct roc_nix_bpf_cfg));
+		nix_mtr_config_map(mtr[i], &cfg);
+		rc = roc_nix_bpf_config(nix, mtr[i]->bpf_id,
+					lvl_map[mtr[i]->level], &cfg);
+
+		memset(&tbl, 0, sizeof(struct roc_nix_bpf_cfg));
+		nix_dscp_table_map(mtr[i], &tbl);
+		rc = roc_nix_bpf_pre_color_tbl_setup(nix, mtr[i]->bpf_id,
+						     lvl_map[mtr[i]->level],
+						     &tbl);
+
+		if (mtr[i]->params.meter_enable) {
+			for (i = 0; mtr[i]->rq_num; i++) {
+				rq = &dev->rqs[mtr[i]->rq_id[i]];
+				rc = roc_nix_bpf_ena_dis(nix, mtr[i]->bpf_id,
+							 rq, true);
+			}
+		}
+	}
+
+	return rc;
+}
diff --git a/drivers/net/cnxk/cnxk_ethdev.h b/drivers/net/cnxk/cnxk_ethdev.h
index 55b1a56a8b..764e6296c4 100644
--- a/drivers/net/cnxk/cnxk_ethdev.h
+++ b/drivers/net/cnxk/cnxk_ethdev.h
@@ -432,6 +432,16 @@ int cnxk_nix_dev_get_reg(struct rte_eth_dev *eth_dev,
 
 /* Other private functions */
 int nix_recalc_mtu(struct rte_eth_dev *eth_dev);
+int nix_mtr_validate(struct rte_eth_dev *dev, uint32_t id);
+int nix_mtr_policy_act_get(struct rte_eth_dev *eth_dev, uint32_t id,
+			   struct rte_flow_action actions[RTE_COLORS]);
+int nix_mtr_rq_update(struct rte_eth_dev *eth_dev, uint32_t id,
+		      uint32_t queue_num, const uint16_t *queue);
+int nix_mtr_chain_update(struct rte_eth_dev *eth_dev, uint32_t cur_id,
+			 uint32_t prev_id, uint32_t next_id);
+int nix_mtr_level_update(struct rte_eth_dev *eth_dev, uint32_t id,
+			 uint32_t level);
+int nix_mtr_configure(struct rte_eth_dev *eth_dev, uint32_t id);
 
 /* Inlines */
 static __rte_always_inline uint64_t
diff --git a/drivers/net/cnxk/cnxk_rte_flow.c b/drivers/net/cnxk/cnxk_rte_flow.c
index 32c1b5dee5..7e3db9458b 100644
--- a/drivers/net/cnxk/cnxk_rte_flow.c
+++ b/drivers/net/cnxk/cnxk_rte_flow.c
@@ -92,6 +92,243 @@ npc_rss_action_validate(struct rte_eth_dev *eth_dev,
 	return 0;
 }
 
+static int
+npc_mtr_green_color_action_validate(struct rte_eth_dev *eth_dev, uint32_t id,
+				    const struct rte_flow_action actions[],
+				    struct rte_flow_action *green_act,
+				    uint32_t *prev_id, uint32_t *next_id)
+{
+	const struct rte_flow_action_queue *q2_conf =
+		(const struct rte_flow_action_queue *)green_act->conf;
+	const struct rte_flow_action_rss *rss2_conf =
+		(const struct rte_flow_action_rss *)green_act->conf;
+	const struct rte_flow_action_meter *mtr_conf;
+	const struct rte_flow_action_queue *q1_conf;
+	const struct rte_flow_action_rss *rss1_conf;
+	int i;
+
+	if (green_act->type == RTE_FLOW_ACTION_TYPE_QUEUE)
+		nix_mtr_rq_update(eth_dev, id, 1, &q2_conf->index);
+
+	for (i = 0; actions[i].type != RTE_FLOW_ACTION_TYPE_END; i++) {
+		if (green_act->type == RTE_FLOW_ACTION_TYPE_QUEUE &&
+		    actions[i].type == RTE_FLOW_ACTION_TYPE_QUEUE) {
+			q1_conf =
+				(const struct rte_flow_action_queue *)actions[i]
+					.conf;
+
+			if (q1_conf->index != q2_conf->index)
+				return -EINVAL;
+		}
+	}
+
+	if (green_act->type == RTE_FLOW_ACTION_TYPE_RSS) {
+		nix_mtr_rq_update(eth_dev, id, rss2_conf->queue_num,
+				  rss2_conf->queue);
+	}
+
+	for (i = 0; actions[i].type != RTE_FLOW_ACTION_TYPE_END; i++) {
+		if (green_act->type == RTE_FLOW_ACTION_TYPE_RSS &&
+		    actions[i].type == RTE_FLOW_ACTION_TYPE_RSS) {
+			rss1_conf =
+				(const struct rte_flow_action_rss *)actions[i]
+					.conf;
+
+			if (memcmp(rss1_conf, rss2_conf,
+				   sizeof(struct rte_flow_action_rss)))
+				return -EINVAL;
+		}
+	}
+
+	if (green_act->type == RTE_FLOW_ACTION_TYPE_METER) {
+		mtr_conf =
+			(const struct rte_flow_action_meter *)green_act->conf;
+		*next_id = mtr_conf->mtr_id;
+		nix_mtr_level_update(eth_dev, id, 0);
+		nix_mtr_chain_update(eth_dev, id, *prev_id, *next_id);
+		*prev_id = id;
+	}
+
+	return 0;
+}
+
+static int
+npc_mtr_yellow_color_action_validate(struct rte_eth_dev *eth_dev, uint32_t id,
+				     const struct rte_flow_action actions[],
+				     struct rte_flow_action *yellow_act,
+				     uint32_t *prev_id, uint32_t *next_id)
+{
+	const struct rte_flow_action_queue *q2_conf =
+		(const struct rte_flow_action_queue *)yellow_act->conf;
+	const struct rte_flow_action_rss *rss2_conf =
+		(const struct rte_flow_action_rss *)yellow_act->conf;
+	const struct rte_flow_action_meter *mtr_conf;
+	const struct rte_flow_action_rss *rss1_conf;
+	const struct rte_flow_action_queue *q1_conf;
+	int i;
+
+	if (yellow_act->type == RTE_FLOW_ACTION_TYPE_QUEUE)
+		nix_mtr_rq_update(eth_dev, id, 1, &q2_conf->index);
+
+	for (i = 0; actions[i].type != RTE_FLOW_ACTION_TYPE_END; i++) {
+		if (yellow_act->type == RTE_FLOW_ACTION_TYPE_QUEUE &&
+		    actions[i].type == RTE_FLOW_ACTION_TYPE_QUEUE) {
+			q1_conf = (const struct rte_flow_action_queue *)
+					  yellow_act->conf;
+
+			if (q1_conf->index != q2_conf->index)
+				return -EINVAL;
+		}
+	}
+
+	if (yellow_act->type == RTE_FLOW_ACTION_TYPE_RSS) {
+		nix_mtr_rq_update(eth_dev, id, rss2_conf->queue_num,
+				  rss2_conf->queue);
+	}
+
+	for (i = 0; actions[i].type != RTE_FLOW_ACTION_TYPE_END; i++) {
+		if (yellow_act->type == RTE_FLOW_ACTION_TYPE_RSS &&
+		    actions[i].type == RTE_FLOW_ACTION_TYPE_RSS) {
+			rss1_conf =
+				(const struct rte_flow_action_rss *)actions[i]
+					.conf;
+
+			if (memcmp(rss1_conf, rss2_conf,
+				   sizeof(struct rte_flow_action_rss)))
+				return -EINVAL;
+		}
+	}
+
+	*next_id = 0xffff;
+	if (yellow_act->type == RTE_FLOW_ACTION_TYPE_METER) {
+		mtr_conf =
+			(const struct rte_flow_action_meter *)yellow_act->conf;
+		*next_id = mtr_conf->mtr_id;
+		nix_mtr_level_update(eth_dev, id, 0);
+		nix_mtr_chain_update(eth_dev, id, *prev_id, *next_id);
+		*prev_id = id;
+		return true;
+	}
+
+	return 0;
+}
+
+static int
+npc_mtr_red_color_action_validate(struct rte_eth_dev *eth_dev, uint32_t id,
+				  const struct rte_flow_action actions[],
+				  struct rte_flow_action *red_act,
+				  uint32_t *prev_id, uint32_t *next_id)
+{
+	const struct rte_flow_action_queue *q2_conf =
+		(const struct rte_flow_action_queue *)red_act->conf;
+	const struct rte_flow_action_rss *rss2_conf =
+		(const struct rte_flow_action_rss *)red_act->conf;
+	const struct rte_flow_action_meter *mtr_conf;
+	const struct rte_flow_action_rss *rss1_conf;
+	const struct rte_flow_action_queue *q1_conf;
+	int i;
+
+	if (red_act->type == RTE_FLOW_ACTION_TYPE_QUEUE)
+		nix_mtr_rq_update(eth_dev, id, 1, &q2_conf->index);
+
+	for (i = 0; actions[i].type != RTE_FLOW_ACTION_TYPE_END; i++) {
+		if (red_act->type == RTE_FLOW_ACTION_TYPE_QUEUE &&
+		    actions[i].type == RTE_FLOW_ACTION_TYPE_QUEUE) {
+			q1_conf = (const struct rte_flow_action_queue *)
+					  red_act->conf;
+
+			if (q1_conf->index != q2_conf->index)
+				return -EINVAL;
+		}
+	}
+
+	if (red_act->type == RTE_FLOW_ACTION_TYPE_RSS) {
+		nix_mtr_rq_update(eth_dev, id, rss2_conf->queue_num,
+				  rss2_conf->queue);
+	}
+
+	for (i = 0; actions[i].type != RTE_FLOW_ACTION_TYPE_END; i++) {
+		if (red_act->type == RTE_FLOW_ACTION_TYPE_RSS &&
+		    actions[i].type == RTE_FLOW_ACTION_TYPE_RSS) {
+			rss1_conf =
+				(const struct rte_flow_action_rss *)actions[i]
+					.conf;
+
+			if (memcmp(rss1_conf, rss2_conf,
+				   sizeof(struct rte_flow_action_rss)))
+				return -EINVAL;
+		}
+	}
+
+	*next_id = 0xffff;
+	if (red_act->type == RTE_FLOW_ACTION_TYPE_METER) {
+		mtr_conf = (const struct rte_flow_action_meter *)red_act->conf;
+		*next_id = mtr_conf->mtr_id;
+		nix_mtr_level_update(eth_dev, id, 0);
+		nix_mtr_chain_update(eth_dev, id, *prev_id, *next_id);
+		*prev_id = id;
+		return true;
+	}
+
+	return 0;
+}
+
+static int
+npc_mtr_configure(struct rte_eth_dev *eth_dev,
+		  const struct rte_flow_action actions[], int *is_mtr)
+{
+	uint32_t mtr_id, prev_mtr_id = 0xffff, next_mtr_id = 0xffff;
+	const struct rte_flow_action_meter *mtr_conf;
+	struct rte_flow_action mtr_acts[RTE_COLORS];
+	bool is_mtr_act = false;
+	int rc = -EINVAL, i;
+
+	for (i = 0; actions[i].type != RTE_FLOW_ACTION_TYPE_END; i++) {
+		if (actions[i].type == RTE_FLOW_ACTION_TYPE_METER) {
+			mtr_conf = (const struct rte_flow_action_meter
+					    *)(actions->conf);
+			mtr_id = mtr_conf->mtr_id;
+			is_mtr_act = true;
+			*is_mtr = 1;
+			break;
+		}
+	}
+
+	if (!is_mtr_act)
+		return rc;
+
+	prev_mtr_id = mtr_id;
+	next_mtr_id = mtr_id;
+	while (next_mtr_id != 0xffff) {
+		rc = nix_mtr_validate(eth_dev, next_mtr_id);
+		if (rc)
+			return rc;
+
+		rc = nix_mtr_policy_act_get(eth_dev, next_mtr_id, mtr_acts);
+		if (rc)
+			return rc;
+
+		rc = npc_mtr_green_color_action_validate(eth_dev, mtr_id,
+			actions, &mtr_acts[RTE_COLOR_GREEN], &prev_mtr_id,
+			&next_mtr_id);
+		if (rc)
+			return rc;
+
+		rc = npc_mtr_yellow_color_action_validate(eth_dev, mtr_id,
+			actions, &mtr_acts[RTE_COLOR_YELLOW], &prev_mtr_id,
+			&next_mtr_id);
+		if (rc)
+			return rc;
+
+		rc = npc_mtr_red_color_action_validate(eth_dev, mtr_id, actions,
+			&mtr_acts[RTE_COLOR_RED], &prev_mtr_id, &next_mtr_id);
+		if (rc)
+			return rc;
+	}
+
+	return nix_mtr_configure(eth_dev, mtr_id);
+}
+
 static void
 npc_rss_flowkey_get(struct cnxk_eth_dev *eth_dev,
 		    const struct roc_npc_action *rss_action,
@@ -195,6 +432,10 @@ cnxk_map_actions(struct rte_eth_dev *eth_dev, const struct rte_flow_attr *attr,
 				ROC_NPC_ACTION_TYPE_VLAN_PCP_INSERT;
 			in_actions[i].conf = actions->conf;
 			break;
+		case RTE_FLOW_ACTION_TYPE_METER:
+			in_actions[i].type = ROC_NPC_ACTION_TYPE_METER;
+			in_actions[i].conf = actions->conf;
+			break;
 		default:
 			plt_npc_dbg("Action is not supported = %d",
 				    actions->type);
@@ -281,6 +522,7 @@ cnxk_flow_create(struct rte_eth_dev *eth_dev, const struct rte_flow_attr *attr,
 	struct roc_npc_attr in_attr;
 	struct roc_npc_flow *flow;
 	int errcode = 0;
+	int is_mtr = 0;
 	int rc;
 
 	rc = cnxk_map_flow_data(eth_dev, attr, pattern, actions, &in_attr,
@@ -292,6 +534,15 @@ cnxk_flow_create(struct rte_eth_dev *eth_dev, const struct rte_flow_attr *attr,
 		return NULL;
 	}
 
+	if (roc_model_is_cn10k()) {
+		rc = npc_mtr_configure(eth_dev, actions, &is_mtr);
+		if (rc && is_mtr) {
+			rte_flow_error_set(error, 0, RTE_FLOW_ERROR_TYPE_ACTION,
+					   NULL, "Failed to configure mtr ");
+			return NULL;
+		}
+	}
+
 	flow = roc_npc_flow_create(npc, &in_attr, in_pattern, in_actions,
 				   &errcode);
 	if (errcode != 0) {
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2021-09-06  7:57 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-06  7:54 [dpdk-dev] [PATCH 01/27] common/cnxk: update policer MBOX APIs and HW definitions skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 02/27] common/cnxk: support RoC API to get level to index skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 03/27] common/cnxk: support RoC API to get profile count skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 04/27] common/cnxk: support RoC API to alloc bandwidth profiles skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 05/27] common/cnxk: support RoC API to free " skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 06/27] common/cnxk: support RoC API to configure bandwidth profile skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 07/27] common/cnxk: support RoC API to toggle profile state skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 08/27] common/cnxk: support RoC API to dump bandwidth profile skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 09/27] common/cnxk: support RoC API to setup precolor table skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 10/27] common/cnxk: support RoC API to connect bandwidth profiles skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 11/27] common/cnxk: support RoC API to get stats to index skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 12/27] common/cnxk: support RoC API to read profile statistics skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 13/27] common/cnxk: support RoC API to reset profile stats skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 14/27] common/cnxk: support meter in action list skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 15/27] net/cnxk: support meter ops get API skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 16/27] net/cnxk: support ops to get meter capabilities skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 17/27] net/cnxk: support ops to create meter profile skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 18/27] net/cnxk: support ops to delete " skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 19/27] net/cnxk: support ops to validate meter policy skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 20/27] net/cnxk: support ops to create " skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 21/27] net/cnxk: support ops to delete " skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 22/27] net/cnxk: support ops to create meter skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 23/27] net/cnxk: support ops to delete meter skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 24/27] net/cnxk: support ops to enable/disable meter skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 25/27] net/cnxk: support ops to update precolor DSCP table skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 26/27] net/cnxk: support ops to read/update meter stats skori
2021-09-06  7:54 ` [dpdk-dev] [PATCH 27/27] net/cnxk: support meter action to flow create skori

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.