1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2021 Marvell.
8 #include "roc_nix_xstats.h"
11 #define NIX_RX_STATS(val) plt_read64(nix->base + NIX_LF_RX_STATX(val))
12 #define NIX_TX_STATS(val) plt_read64(nix->base + NIX_LF_TX_STATX(val))
15 roc_nix_num_xstats_get(struct roc_nix *roc_nix)
17 if (roc_nix_is_vf_or_sdp(roc_nix))
18 return CNXK_NIX_NUM_XSTATS_REG;
19 else if (roc_model_is_cn9k())
20 return CNXK_NIX_NUM_XSTATS_CGX;
22 return CNXK_NIX_NUM_XSTATS_RPM;
26 roc_nix_stats_get(struct roc_nix *roc_nix, struct roc_nix_stats *stats)
28 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
33 stats->rx_octs = NIX_RX_STATS(NIX_STAT_LF_RX_RX_OCTS);
34 stats->rx_ucast = NIX_RX_STATS(NIX_STAT_LF_RX_RX_UCAST);
35 stats->rx_bcast = NIX_RX_STATS(NIX_STAT_LF_RX_RX_BCAST);
36 stats->rx_mcast = NIX_RX_STATS(NIX_STAT_LF_RX_RX_MCAST);
37 stats->rx_drop = NIX_RX_STATS(NIX_STAT_LF_RX_RX_DROP);
38 stats->rx_drop_octs = NIX_RX_STATS(NIX_STAT_LF_RX_RX_DROP_OCTS);
39 stats->rx_fcs = NIX_RX_STATS(NIX_STAT_LF_RX_RX_FCS);
40 stats->rx_err = NIX_RX_STATS(NIX_STAT_LF_RX_RX_ERR);
41 stats->rx_drop_bcast = NIX_RX_STATS(NIX_STAT_LF_RX_RX_DRP_BCAST);
42 stats->rx_drop_mcast = NIX_RX_STATS(NIX_STAT_LF_RX_RX_DRP_MCAST);
43 stats->rx_drop_l3_bcast = NIX_RX_STATS(NIX_STAT_LF_RX_RX_DRP_L3BCAST);
44 stats->rx_drop_l3_mcast = NIX_RX_STATS(NIX_STAT_LF_RX_RX_DRP_L3MCAST);
46 stats->tx_ucast = NIX_TX_STATS(NIX_STAT_LF_TX_TX_UCAST);
47 stats->tx_bcast = NIX_TX_STATS(NIX_STAT_LF_TX_TX_BCAST);
48 stats->tx_mcast = NIX_TX_STATS(NIX_STAT_LF_TX_TX_MCAST);
49 stats->tx_drop = NIX_TX_STATS(NIX_STAT_LF_TX_TX_DROP);
50 stats->tx_octs = NIX_TX_STATS(NIX_STAT_LF_TX_TX_OCTS);
55 roc_nix_stats_reset(struct roc_nix *roc_nix)
57 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
58 struct mbox *mbox = (&nix->dev)->mbox;
60 if (mbox_alloc_msg_nix_stats_rst(mbox) == NULL)
63 return mbox_process(mbox);
67 queue_is_valid(struct nix *nix, uint16_t qid, bool is_rx)
72 nb_queues = nix->nb_rx_queues;
74 nb_queues = nix->nb_tx_queues;
77 return NIX_ERR_QUEUE_INVALID_RANGE;
83 qstat_read(struct nix *nix, uint16_t qid, uint32_t off)
88 addr = (int64_t *)(nix->base + off);
89 reg = (((uint64_t)qid) << 32);
90 val = roc_atomic64_add_nosync(reg, addr);
91 if (val & BIT_ULL(NIX_CQ_OP_STAT_OP_ERR))
97 nix_stat_rx_queue_get(struct nix *nix, uint16_t qid,
98 struct roc_nix_stats_queue *qstats)
100 qstats->rx_pkts = qstat_read(nix, qid, NIX_LF_RQ_OP_PKTS);
101 qstats->rx_octs = qstat_read(nix, qid, NIX_LF_RQ_OP_OCTS);
102 qstats->rx_drop_pkts = qstat_read(nix, qid, NIX_LF_RQ_OP_DROP_PKTS);
103 qstats->rx_drop_octs = qstat_read(nix, qid, NIX_LF_RQ_OP_DROP_OCTS);
104 qstats->rx_error_pkts = qstat_read(nix, qid, NIX_LF_RQ_OP_RE_PKTS);
108 nix_stat_tx_queue_get(struct nix *nix, uint16_t qid,
109 struct roc_nix_stats_queue *qstats)
111 qstats->tx_pkts = qstat_read(nix, qid, NIX_LF_SQ_OP_PKTS);
112 qstats->tx_octs = qstat_read(nix, qid, NIX_LF_SQ_OP_OCTS);
113 qstats->tx_drop_pkts = qstat_read(nix, qid, NIX_LF_SQ_OP_DROP_PKTS);
114 qstats->tx_drop_octs = qstat_read(nix, qid, NIX_LF_SQ_OP_DROP_OCTS);
118 nix_stat_rx_queue_reset(struct nix *nix, uint16_t qid)
120 struct mbox *mbox = (&nix->dev)->mbox;
123 if (roc_model_is_cn9k()) {
124 struct nix_aq_enq_req *aq;
126 aq = mbox_alloc_msg_nix_aq_enq(mbox);
128 aq->ctype = NIX_AQ_CTYPE_RQ;
129 aq->op = NIX_AQ_INSTOP_WRITE;
133 aq->rq.drop_octs = 0;
134 aq->rq.drop_pkts = 0;
137 aq->rq_mask.octs = ~(aq->rq_mask.octs);
138 aq->rq_mask.pkts = ~(aq->rq_mask.pkts);
139 aq->rq_mask.drop_octs = ~(aq->rq_mask.drop_octs);
140 aq->rq_mask.drop_pkts = ~(aq->rq_mask.drop_pkts);
141 aq->rq_mask.re_pkts = ~(aq->rq_mask.re_pkts);
143 struct nix_cn10k_aq_enq_req *aq;
145 aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
147 aq->ctype = NIX_AQ_CTYPE_RQ;
148 aq->op = NIX_AQ_INSTOP_WRITE;
152 aq->rq.drop_octs = 0;
153 aq->rq.drop_pkts = 0;
156 aq->rq_mask.octs = ~(aq->rq_mask.octs);
157 aq->rq_mask.pkts = ~(aq->rq_mask.pkts);
158 aq->rq_mask.drop_octs = ~(aq->rq_mask.drop_octs);
159 aq->rq_mask.drop_pkts = ~(aq->rq_mask.drop_pkts);
160 aq->rq_mask.re_pkts = ~(aq->rq_mask.re_pkts);
163 rc = mbox_process(mbox);
164 return rc ? NIX_ERR_AQ_WRITE_FAILED : 0;
168 nix_stat_tx_queue_reset(struct nix *nix, uint16_t qid)
170 struct mbox *mbox = (&nix->dev)->mbox;
173 if (roc_model_is_cn9k()) {
174 struct nix_aq_enq_req *aq;
176 aq = mbox_alloc_msg_nix_aq_enq(mbox);
178 aq->ctype = NIX_AQ_CTYPE_SQ;
179 aq->op = NIX_AQ_INSTOP_WRITE;
182 aq->sq.drop_octs = 0;
183 aq->sq.drop_pkts = 0;
185 aq->sq_mask.octs = ~(aq->sq_mask.octs);
186 aq->sq_mask.pkts = ~(aq->sq_mask.pkts);
187 aq->sq_mask.drop_octs = ~(aq->sq_mask.drop_octs);
188 aq->sq_mask.drop_pkts = ~(aq->sq_mask.drop_pkts);
190 struct nix_cn10k_aq_enq_req *aq;
192 aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
194 aq->ctype = NIX_AQ_CTYPE_SQ;
195 aq->op = NIX_AQ_INSTOP_WRITE;
198 aq->sq.drop_octs = 0;
199 aq->sq.drop_pkts = 0;
201 aq->sq_mask.octs = ~(aq->sq_mask.octs);
202 aq->sq_mask.pkts = ~(aq->sq_mask.pkts);
203 aq->sq_mask.drop_octs = ~(aq->sq_mask.drop_octs);
204 aq->sq_mask.drop_pkts = ~(aq->sq_mask.drop_pkts);
207 rc = mbox_process(mbox);
208 return rc ? NIX_ERR_AQ_WRITE_FAILED : 0;
212 roc_nix_stats_queue_get(struct roc_nix *roc_nix, uint16_t qid, bool is_rx,
213 struct roc_nix_stats_queue *qstats)
215 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
219 return NIX_ERR_PARAM;
221 rc = queue_is_valid(nix, qid, is_rx);
226 nix_stat_rx_queue_get(nix, qid, qstats);
228 nix_stat_tx_queue_get(nix, qid, qstats);
235 roc_nix_stats_queue_reset(struct roc_nix *roc_nix, uint16_t qid, bool is_rx)
237 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
240 rc = queue_is_valid(nix, qid, is_rx);
245 rc = nix_stat_rx_queue_reset(nix, qid);
247 rc = nix_stat_tx_queue_reset(nix, qid);
254 roc_nix_xstats_get(struct roc_nix *roc_nix, struct roc_nix_xstat *xstats,
257 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
258 struct mbox *mbox = (&nix->dev)->mbox;
259 struct cgx_stats_rsp *cgx_resp;
260 struct rpm_stats_rsp *rpm_resp;
261 uint64_t i, count = 0;
266 xstat_cnt = roc_nix_num_xstats_get(roc_nix);
273 memset(xstats, 0, (xstat_cnt * sizeof(*xstats)));
274 for (i = 0; i < CNXK_NIX_NUM_TX_XSTATS; i++) {
275 xstats[count].value = NIX_TX_STATS(nix_tx_xstats[i].offset);
276 xstats[count].id = count;
280 for (i = 0; i < CNXK_NIX_NUM_RX_XSTATS; i++) {
281 xstats[count].value = NIX_RX_STATS(nix_rx_xstats[i].offset);
282 xstats[count].id = count;
286 for (i = 0; i < nix->nb_rx_queues; i++)
287 xstats[count].value +=
288 qstat_read(nix, i, nix_q_xstats[0].offset);
290 xstats[count].id = count;
293 if (roc_nix_is_vf_or_sdp(roc_nix))
296 if (roc_model_is_cn9k()) {
297 req = mbox_alloc_msg_cgx_stats(mbox);
298 req->hdr.pcifunc = roc_nix_get_pf_func(roc_nix);
300 rc = mbox_process_msg(mbox, (void *)&cgx_resp);
304 for (i = 0; i < roc_nix_num_rx_xstats(); i++) {
305 xstats[count].value =
306 cgx_resp->rx_stats[nix_rx_xstats_cgx[i].offset];
307 xstats[count].id = count;
311 for (i = 0; i < roc_nix_num_tx_xstats(); i++) {
312 xstats[count].value =
313 cgx_resp->tx_stats[nix_tx_xstats_cgx[i].offset];
314 xstats[count].id = count;
318 req = mbox_alloc_msg_rpm_stats(mbox);
319 req->hdr.pcifunc = roc_nix_get_pf_func(roc_nix);
321 rc = mbox_process_msg(mbox, (void *)&rpm_resp);
325 for (i = 0; i < roc_nix_num_rx_xstats(); i++) {
326 xstats[count].value =
327 rpm_resp->rx_stats[nix_rx_xstats_rpm[i].offset];
328 xstats[count].id = count;
332 for (i = 0; i < roc_nix_num_tx_xstats(); i++) {
333 xstats[count].value =
334 rpm_resp->tx_stats[nix_tx_xstats_rpm[i].offset];
335 xstats[count].id = count;
344 roc_nix_xstats_names_get(struct roc_nix *roc_nix,
345 struct roc_nix_xstat_name *xstats_names,
348 uint64_t i, count = 0;
351 xstat_cnt = roc_nix_num_xstats_get(roc_nix);
352 if (limit < xstat_cnt && xstats_names != NULL)
356 for (i = 0; i < CNXK_NIX_NUM_TX_XSTATS; i++) {
357 snprintf(xstats_names[count].name,
358 sizeof(xstats_names[count].name), "%s",
359 nix_tx_xstats[i].name);
363 for (i = 0; i < CNXK_NIX_NUM_RX_XSTATS; i++) {
364 snprintf(xstats_names[count].name,
365 sizeof(xstats_names[count].name), "%s",
366 nix_rx_xstats[i].name);
369 for (i = 0; i < CNXK_NIX_NUM_QUEUE_XSTATS; i++) {
370 snprintf(xstats_names[count].name,
371 sizeof(xstats_names[count].name), "%s",
372 nix_q_xstats[i].name);
376 if (roc_nix_is_vf_or_sdp(roc_nix))
379 if (roc_model_is_cn9k()) {
380 for (i = 0; i < roc_nix_num_rx_xstats(); i++) {
381 snprintf(xstats_names[count].name,
382 sizeof(xstats_names[count].name), "%s",
383 nix_rx_xstats_cgx[i].name);
387 for (i = 0; i < roc_nix_num_tx_xstats(); i++) {
388 snprintf(xstats_names[count].name,
389 sizeof(xstats_names[count].name), "%s",
390 nix_tx_xstats_cgx[i].name);
394 for (i = 0; i < roc_nix_num_rx_xstats(); i++) {
395 snprintf(xstats_names[count].name,
396 sizeof(xstats_names[count].name), "%s",
397 nix_rx_xstats_rpm[i].name);
401 for (i = 0; i < roc_nix_num_tx_xstats(); i++) {
402 snprintf(xstats_names[count].name,
403 sizeof(xstats_names[count].name), "%s",
404 nix_tx_xstats_rpm[i].name);