From bea4a81b34bd0fcb6a7e1b8086363cd8ecd6982b Mon Sep 17 00:00:00 2001 From: Sunil Kumar Kori Date: Tue, 12 Oct 2021 12:35:57 +0530 Subject: [PATCH] common/cnxk: support profile stats reset Implement RoC API to reset stats per bandwidth profile or per NIXLF. Signed-off-by: Sunil Kumar Kori Acked-by: Jerin Jacob --- 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 0416778c11..343bb2f8b7 100644 --- a/drivers/common/cnxk/roc_nix.h +++ b/drivers/common/cnxk/roc_nix.h @@ -656,10 +656,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 a5e3575404..df57958683 100644 --- a/drivers/common/cnxk/roc_nix_bpf.c +++ b/drivers/common/cnxk/roc_nix_bpf.c @@ -937,6 +937,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]) @@ -1034,3 +1114,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 94a25d58ef..f5de985224 100644 --- a/drivers/common/cnxk/version.map +++ b/drivers/common/cnxk/version.map @@ -92,8 +92,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.20.1