X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fcommon%2Fcnxk%2Froc_nix_stats.c;h=c50c8fa6293cda546eb242e5c9fdf356c2d2b301;hb=3bf87839559186ec229937b109ccfceab7a98806;hp=e0a776a8d761ba1cb168dc53eabfe0b099d819f0;hpb=218d022e1f3f4b5b54ebe7c02c51fb1b495e4398;p=dpdk.git diff --git a/drivers/common/cnxk/roc_nix_stats.c b/drivers/common/cnxk/roc_nix_stats.c index e0a776a8d7..c50c8fa629 100644 --- a/drivers/common/cnxk/roc_nix_stats.c +++ b/drivers/common/cnxk/roc_nix_stats.c @@ -5,11 +5,23 @@ #include #include "roc_api.h" +#include "roc_nix_xstats.h" #include "roc_priv.h" #define NIX_RX_STATS(val) plt_read64(nix->base + NIX_LF_RX_STATX(val)) #define NIX_TX_STATS(val) plt_read64(nix->base + NIX_LF_TX_STATX(val)) +int +roc_nix_num_xstats_get(struct roc_nix *roc_nix) +{ + if (roc_nix_is_vf_or_sdp(roc_nix)) + return CNXK_NIX_NUM_XSTATS_REG; + else if (roc_model_is_cn9k()) + return CNXK_NIX_NUM_XSTATS_CGX; + + return CNXK_NIX_NUM_XSTATS_RPM; +} + int roc_nix_stats_get(struct roc_nix *roc_nix, struct roc_nix_stats *stats) { @@ -237,3 +249,163 @@ roc_nix_stats_queue_reset(struct roc_nix *roc_nix, uint16_t qid, bool is_rx) fail: return rc; } + +int +roc_nix_xstats_get(struct roc_nix *roc_nix, struct roc_nix_xstat *xstats, + unsigned int n) +{ + struct nix *nix = roc_nix_to_nix_priv(roc_nix); + struct mbox *mbox = (&nix->dev)->mbox; + struct cgx_stats_rsp *cgx_resp; + struct rpm_stats_rsp *rpm_resp; + uint64_t i, count = 0; + struct msg_req *req; + uint32_t xstat_cnt; + int rc; + + xstat_cnt = roc_nix_num_xstats_get(roc_nix); + if (n < xstat_cnt) + return xstat_cnt; + + if (xstats == NULL) + return -EINVAL; + + memset(xstats, 0, (xstat_cnt * sizeof(*xstats))); + for (i = 0; i < CNXK_NIX_NUM_TX_XSTATS; i++) { + xstats[count].value = NIX_TX_STATS(nix_tx_xstats[i].offset); + xstats[count].id = count; + count++; + } + + for (i = 0; i < CNXK_NIX_NUM_RX_XSTATS; i++) { + xstats[count].value = NIX_RX_STATS(nix_rx_xstats[i].offset); + xstats[count].id = count; + count++; + } + + for (i = 0; i < nix->nb_rx_queues; i++) + xstats[count].value += + qstat_read(nix, i, nix_q_xstats[0].offset); + + xstats[count].id = count; + count++; + + if (roc_nix_is_vf_or_sdp(roc_nix)) + return count; + + if (roc_model_is_cn9k()) { + req = mbox_alloc_msg_cgx_stats(mbox); + req->hdr.pcifunc = roc_nix_get_pf_func(roc_nix); + + rc = mbox_process_msg(mbox, (void *)&cgx_resp); + if (rc) + return rc; + + for (i = 0; i < roc_nix_num_rx_xstats(); i++) { + xstats[count].value = + cgx_resp->rx_stats[nix_rx_xstats_cgx[i].offset]; + xstats[count].id = count; + count++; + } + + for (i = 0; i < roc_nix_num_tx_xstats(); i++) { + xstats[count].value = + cgx_resp->tx_stats[nix_tx_xstats_cgx[i].offset]; + xstats[count].id = count; + count++; + } + } else { + req = mbox_alloc_msg_rpm_stats(mbox); + req->hdr.pcifunc = roc_nix_get_pf_func(roc_nix); + + rc = mbox_process_msg(mbox, (void *)&rpm_resp); + if (rc) + return rc; + + for (i = 0; i < roc_nix_num_rx_xstats(); i++) { + xstats[count].value = + rpm_resp->rx_stats[nix_rx_xstats_rpm[i].offset]; + xstats[count].id = count; + count++; + } + + for (i = 0; i < roc_nix_num_tx_xstats(); i++) { + xstats[count].value = + rpm_resp->tx_stats[nix_tx_xstats_rpm[i].offset]; + xstats[count].id = count; + count++; + } + } + + return count; +} + +int +roc_nix_xstats_names_get(struct roc_nix *roc_nix, + struct roc_nix_xstat_name *xstats_names, + unsigned int limit) +{ + uint64_t i, count = 0; + uint32_t xstat_cnt; + + xstat_cnt = roc_nix_num_xstats_get(roc_nix); + if (limit < xstat_cnt && xstats_names != NULL) + return -ENOMEM; + + if (xstats_names) { + for (i = 0; i < CNXK_NIX_NUM_TX_XSTATS; i++) { + snprintf(xstats_names[count].name, + sizeof(xstats_names[count].name), "%s", + nix_tx_xstats[i].name); + count++; + } + + for (i = 0; i < CNXK_NIX_NUM_RX_XSTATS; i++) { + snprintf(xstats_names[count].name, + sizeof(xstats_names[count].name), "%s", + nix_rx_xstats[i].name); + count++; + } + for (i = 0; i < CNXK_NIX_NUM_QUEUE_XSTATS; i++) { + snprintf(xstats_names[count].name, + sizeof(xstats_names[count].name), "%s", + nix_q_xstats[i].name); + count++; + } + + if (roc_nix_is_vf_or_sdp(roc_nix)) + return count; + + if (roc_model_is_cn9k()) { + for (i = 0; i < roc_nix_num_rx_xstats(); i++) { + snprintf(xstats_names[count].name, + sizeof(xstats_names[count].name), "%s", + nix_rx_xstats_cgx[i].name); + count++; + } + + for (i = 0; i < roc_nix_num_tx_xstats(); i++) { + snprintf(xstats_names[count].name, + sizeof(xstats_names[count].name), "%s", + nix_tx_xstats_cgx[i].name); + count++; + } + } else { + for (i = 0; i < roc_nix_num_rx_xstats(); i++) { + snprintf(xstats_names[count].name, + sizeof(xstats_names[count].name), "%s", + nix_rx_xstats_rpm[i].name); + count++; + } + + for (i = 0; i < roc_nix_num_tx_xstats(); i++) { + snprintf(xstats_names[count].name, + sizeof(xstats_names[count].name), "%s", + nix_tx_xstats_rpm[i].name); + count++; + } + } + } + + return xstat_cnt; +}