[v2,13/27] common/cnxk: support RoC API to reset profile stats

Message ID 20210927082223.757436-13-skori@marvell.com (mailing list archive)
State Superseded, archived
Delegated to: Jerin Jacob
Headers
Series [v2,01/27] common/cnxk: update policer MBOX APIs and HW definitions |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Sunil Kumar Kori Sept. 27, 2021, 8:22 a.m. UTC
  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>
---
v2:
 - Rebase support on latest DPDK
 - Handled multilevel chaining for linear hierarchy
 - Review comments incorporated

 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(+)
  

Patch

diff --git a/drivers/common/cnxk/roc_nix.h b/drivers/common/cnxk/roc_nix.h
index 1ad8a0ca04..c1a561928e 100644
--- a/drivers/common/cnxk/roc_nix.h
+++ b/drivers/common/cnxk/roc_nix.h
@@ -661,10 +661,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 137d2260bb..220d78ed84 100644
--- a/drivers/common/cnxk/roc_nix_bpf.c
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -929,6 +929,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])
@@ -1026,3 +1106,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 52e7fa1e89..3b08fb0025 100644
--- a/drivers/common/cnxk/version.map
+++ b/drivers/common/cnxk/version.map
@@ -87,8 +87,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;