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