xref: /dpdk/drivers/common/cnxk/roc_mcs_stats.c (revision c287245aacc9b855a1245ac7321849b0e5a2b317)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2023 Marvell.
3  */
4 
5 #include "roc_api.h"
6 #include "roc_priv.h"
7 
8 int
roc_mcs_flowid_stats_get(struct roc_mcs * mcs,struct roc_mcs_stats_req * mcs_req,struct roc_mcs_flowid_stats * stats)9 roc_mcs_flowid_stats_get(struct roc_mcs *mcs, struct roc_mcs_stats_req *mcs_req,
10 			 struct roc_mcs_flowid_stats *stats)
11 {
12 	struct mcs_flowid_stats *rsp;
13 	struct mcs_stats_req *req;
14 	int rc;
15 
16 	MCS_SUPPORT_CHECK;
17 
18 	req = mbox_alloc_msg_mcs_get_flowid_stats(mcs->mbox);
19 	if (req == NULL)
20 		return -ENOSPC;
21 
22 	req->id = mcs_req->id;
23 	req->mcs_id = mcs->idx;
24 	req->dir = mcs_req->dir;
25 
26 	rc = mbox_process_msg(mcs->mbox, (void *)&rsp);
27 	if (rc)
28 		return rc;
29 
30 	stats->tcam_hit_cnt = rsp->tcam_hit_cnt;
31 
32 	return rc;
33 }
34 
35 int
roc_mcs_secy_stats_get(struct roc_mcs * mcs,struct roc_mcs_stats_req * mcs_req,struct roc_mcs_secy_stats * stats)36 roc_mcs_secy_stats_get(struct roc_mcs *mcs, struct roc_mcs_stats_req *mcs_req,
37 		       struct roc_mcs_secy_stats *stats)
38 {
39 	struct mcs_secy_stats *rsp;
40 	struct mcs_stats_req *req;
41 	int rc;
42 
43 	MCS_SUPPORT_CHECK;
44 
45 	req = mbox_alloc_msg_mcs_get_secy_stats(mcs->mbox);
46 	if (req == NULL)
47 		return -ENOSPC;
48 
49 	req->id = mcs_req->id;
50 	req->mcs_id = mcs->idx;
51 	req->dir = mcs_req->dir;
52 
53 	rc = mbox_process_msg(mcs->mbox, (void *)&rsp);
54 	if (rc)
55 		return rc;
56 
57 	stats->ctl_pkt_bcast_cnt = rsp->ctl_pkt_bcast_cnt;
58 	stats->ctl_pkt_mcast_cnt = rsp->ctl_pkt_mcast_cnt;
59 	stats->ctl_pkt_ucast_cnt = rsp->ctl_pkt_ucast_cnt;
60 	stats->ctl_octet_cnt = rsp->ctl_octet_cnt;
61 	stats->unctl_pkt_bcast_cnt = rsp->unctl_pkt_bcast_cnt;
62 	stats->unctl_pkt_mcast_cnt = rsp->unctl_pkt_mcast_cnt;
63 	stats->unctl_pkt_ucast_cnt = rsp->unctl_pkt_ucast_cnt;
64 	stats->unctl_octet_cnt = rsp->unctl_octet_cnt;
65 
66 	if (mcs_req->dir == MCS_RX) {
67 		stats->octet_decrypted_cnt = rsp->octet_decrypted_cnt;
68 		stats->octet_validated_cnt = rsp->octet_validated_cnt;
69 		stats->pkt_port_disabled_cnt = rsp->pkt_port_disabled_cnt;
70 		stats->pkt_badtag_cnt = rsp->pkt_badtag_cnt;
71 		stats->pkt_nosa_cnt = rsp->pkt_nosa_cnt;
72 		stats->pkt_nosaerror_cnt = rsp->pkt_nosaerror_cnt;
73 		stats->pkt_tagged_ctl_cnt = rsp->pkt_tagged_ctl_cnt;
74 		stats->pkt_untaged_cnt = rsp->pkt_untaged_cnt;
75 		if (roc_model_is_cn10kb_a0())
76 			/* CN10K-B */
77 			stats->pkt_ctl_cnt = rsp->pkt_ctl_cnt;
78 		else
79 			/* CNF10K-B */
80 			stats->pkt_notag_cnt = rsp->pkt_notag_cnt;
81 	} else {
82 		stats->octet_encrypted_cnt = rsp->octet_encrypted_cnt;
83 		stats->octet_protected_cnt = rsp->octet_protected_cnt;
84 		stats->pkt_noactivesa_cnt = rsp->pkt_noactivesa_cnt;
85 		stats->pkt_toolong_cnt = rsp->pkt_toolong_cnt;
86 		stats->pkt_untagged_cnt = rsp->pkt_untagged_cnt;
87 	}
88 
89 	return rc;
90 }
91 
92 int
roc_mcs_sc_stats_get(struct roc_mcs * mcs,struct roc_mcs_stats_req * mcs_req,struct roc_mcs_sc_stats * stats)93 roc_mcs_sc_stats_get(struct roc_mcs *mcs, struct roc_mcs_stats_req *mcs_req,
94 		     struct roc_mcs_sc_stats *stats)
95 {
96 	struct mcs_stats_req *req;
97 	struct mcs_sc_stats *rsp;
98 	int rc;
99 
100 	MCS_SUPPORT_CHECK;
101 
102 	req = mbox_alloc_msg_mcs_get_sc_stats(mcs->mbox);
103 	if (req == NULL)
104 		return -ENOSPC;
105 
106 	req->id = mcs_req->id;
107 	req->mcs_id = mcs->idx;
108 	req->dir = mcs_req->dir;
109 
110 	rc = mbox_process_msg(mcs->mbox, (void *)&rsp);
111 	if (rc)
112 		return rc;
113 
114 	if (mcs_req->dir == MCS_RX) {
115 		stats->hit_cnt = rsp->hit_cnt;
116 		stats->pkt_invalid_cnt = rsp->pkt_invalid_cnt;
117 		stats->pkt_late_cnt = rsp->pkt_late_cnt;
118 		stats->pkt_notvalid_cnt = rsp->pkt_notvalid_cnt;
119 		stats->pkt_unchecked_cnt = rsp->pkt_unchecked_cnt;
120 		if (roc_model_is_cn10kb_a0()) {
121 			stats->octet_decrypt_cnt = rsp->octet_decrypt_cnt;
122 			stats->octet_validate_cnt = rsp->octet_validate_cnt;
123 			/*
124 			 * If validate frame is enabled in secy configuration,
125 			 * pkt unchecked count is same as pkt ok count.
126 			 */
127 			stats->pkt_ok_cnt = rsp->pkt_unchecked_cnt;
128 		} else {
129 			stats->pkt_delay_cnt = rsp->pkt_delay_cnt;
130 			stats->pkt_ok_cnt = rsp->pkt_ok_cnt;
131 		}
132 	} else {
133 		stats->pkt_encrypt_cnt = rsp->pkt_encrypt_cnt;
134 		stats->pkt_protected_cnt = rsp->pkt_protected_cnt;
135 		if (roc_model_is_cn10kb_a0()) {
136 			stats->octet_encrypt_cnt = rsp->octet_encrypt_cnt;
137 			stats->octet_protected_cnt = rsp->octet_protected_cnt;
138 		}
139 	}
140 
141 	return rc;
142 }
143 
144 int
roc_mcs_port_stats_get(struct roc_mcs * mcs,struct roc_mcs_stats_req * mcs_req,struct roc_mcs_port_stats * stats)145 roc_mcs_port_stats_get(struct roc_mcs *mcs, struct roc_mcs_stats_req *mcs_req,
146 		       struct roc_mcs_port_stats *stats)
147 {
148 	struct mcs_port_stats *rsp;
149 	struct mcs_stats_req *req;
150 	int rc;
151 
152 	MCS_SUPPORT_CHECK;
153 
154 	req = mbox_alloc_msg_mcs_get_port_stats(mcs->mbox);
155 	if (req == NULL)
156 		return -ENOSPC;
157 
158 	req->id = mcs_req->id;
159 	req->mcs_id = mcs->idx;
160 	req->dir = mcs_req->dir;
161 
162 	rc = mbox_process_msg(mcs->mbox, (void *)&rsp);
163 	if (rc)
164 		return rc;
165 
166 	stats->tcam_miss_cnt = rsp->tcam_miss_cnt;
167 	stats->parser_err_cnt = rsp->parser_err_cnt;
168 	if (roc_model_is_cnf10kb())
169 		stats->preempt_err_cnt = rsp->preempt_err_cnt;
170 
171 	stats->sectag_insert_err_cnt = rsp->sectag_insert_err_cnt;
172 
173 	return rc;
174 }
175 
176 int
roc_mcs_stats_clear(struct roc_mcs * mcs,struct roc_mcs_clear_stats * mcs_req)177 roc_mcs_stats_clear(struct roc_mcs *mcs, struct roc_mcs_clear_stats *mcs_req)
178 {
179 	struct mcs_clear_stats *req;
180 	struct msg_rsp *rsp;
181 
182 	MCS_SUPPORT_CHECK;
183 
184 	if (!roc_model_is_cn10kb_a0() && mcs_req->type == MCS_SA_STATS)
185 		return MCS_ERR_HW_NOTSUP;
186 
187 	req = mbox_alloc_msg_mcs_clear_stats(mcs->mbox);
188 	if (req == NULL)
189 		return -ENOSPC;
190 
191 	req->type = mcs_req->type;
192 	req->id = mcs_req->id;
193 	req->mcs_id = mcs->idx;
194 	req->dir = mcs_req->dir;
195 	req->all = mcs_req->all;
196 
197 	return mbox_process_msg(mcs->mbox, (void *)&rsp);
198 }
199