1 // SPDX-License-Identifier: GPL-2.0
2 /* Marvell RVU Admin Function driver
3  *
4  * Copyright (C) 2019 Marvell.
5  *
6  */
7 
8 #ifdef CONFIG_DEBUG_FS
9 
10 #include <linux/fs.h>
11 #include <linux/debugfs.h>
12 #include <linux/module.h>
13 #include <linux/pci.h>
14 
15 #include "rvu_struct.h"
16 #include "rvu_reg.h"
17 #include "rvu.h"
18 #include "cgx.h"
19 #include "lmac_common.h"
20 #include "npc.h"
21 #include "rvu_npc_hash.h"
22 #include "mcs.h"
23 
24 #define DEBUGFS_DIR_NAME "octeontx2"
25 
26 enum {
27 	CGX_STAT0,
28 	CGX_STAT1,
29 	CGX_STAT2,
30 	CGX_STAT3,
31 	CGX_STAT4,
32 	CGX_STAT5,
33 	CGX_STAT6,
34 	CGX_STAT7,
35 	CGX_STAT8,
36 	CGX_STAT9,
37 	CGX_STAT10,
38 	CGX_STAT11,
39 	CGX_STAT12,
40 	CGX_STAT13,
41 	CGX_STAT14,
42 	CGX_STAT15,
43 	CGX_STAT16,
44 	CGX_STAT17,
45 	CGX_STAT18,
46 };
47 
48 /* NIX TX stats */
49 enum nix_stat_lf_tx {
50 	TX_UCAST	= 0x0,
51 	TX_BCAST	= 0x1,
52 	TX_MCAST	= 0x2,
53 	TX_DROP		= 0x3,
54 	TX_OCTS		= 0x4,
55 	TX_STATS_ENUM_LAST,
56 };
57 
58 /* NIX RX stats */
59 enum nix_stat_lf_rx {
60 	RX_OCTS		= 0x0,
61 	RX_UCAST	= 0x1,
62 	RX_BCAST	= 0x2,
63 	RX_MCAST	= 0x3,
64 	RX_DROP		= 0x4,
65 	RX_DROP_OCTS	= 0x5,
66 	RX_FCS		= 0x6,
67 	RX_ERR		= 0x7,
68 	RX_DRP_BCAST	= 0x8,
69 	RX_DRP_MCAST	= 0x9,
70 	RX_DRP_L3BCAST	= 0xa,
71 	RX_DRP_L3MCAST	= 0xb,
72 	RX_STATS_ENUM_LAST,
73 };
74 
75 static char *cgx_rx_stats_fields[] = {
76 	[CGX_STAT0]	= "Received packets",
77 	[CGX_STAT1]	= "Octets of received packets",
78 	[CGX_STAT2]	= "Received PAUSE packets",
79 	[CGX_STAT3]	= "Received PAUSE and control packets",
80 	[CGX_STAT4]	= "Filtered DMAC0 (NIX-bound) packets",
81 	[CGX_STAT5]	= "Filtered DMAC0 (NIX-bound) octets",
82 	[CGX_STAT6]	= "Packets dropped due to RX FIFO full",
83 	[CGX_STAT7]	= "Octets dropped due to RX FIFO full",
84 	[CGX_STAT8]	= "Error packets",
85 	[CGX_STAT9]	= "Filtered DMAC1 (NCSI-bound) packets",
86 	[CGX_STAT10]	= "Filtered DMAC1 (NCSI-bound) octets",
87 	[CGX_STAT11]	= "NCSI-bound packets dropped",
88 	[CGX_STAT12]	= "NCSI-bound octets dropped",
89 };
90 
91 static char *cgx_tx_stats_fields[] = {
92 	[CGX_STAT0]	= "Packets dropped due to excessive collisions",
93 	[CGX_STAT1]	= "Packets dropped due to excessive deferral",
94 	[CGX_STAT2]	= "Multiple collisions before successful transmission",
95 	[CGX_STAT3]	= "Single collisions before successful transmission",
96 	[CGX_STAT4]	= "Total octets sent on the interface",
97 	[CGX_STAT5]	= "Total frames sent on the interface",
98 	[CGX_STAT6]	= "Packets sent with an octet count < 64",
99 	[CGX_STAT7]	= "Packets sent with an octet count == 64",
100 	[CGX_STAT8]	= "Packets sent with an octet count of 65-127",
101 	[CGX_STAT9]	= "Packets sent with an octet count of 128-255",
102 	[CGX_STAT10]	= "Packets sent with an octet count of 256-511",
103 	[CGX_STAT11]	= "Packets sent with an octet count of 512-1023",
104 	[CGX_STAT12]	= "Packets sent with an octet count of 1024-1518",
105 	[CGX_STAT13]	= "Packets sent with an octet count of > 1518",
106 	[CGX_STAT14]	= "Packets sent to a broadcast DMAC",
107 	[CGX_STAT15]	= "Packets sent to the multicast DMAC",
108 	[CGX_STAT16]	= "Transmit underflow and were truncated",
109 	[CGX_STAT17]	= "Control/PAUSE packets sent",
110 };
111 
112 static char *rpm_rx_stats_fields[] = {
113 	"Octets of received packets",
114 	"Octets of received packets with out error",
115 	"Received packets with alignment errors",
116 	"Control/PAUSE packets received",
117 	"Packets received with Frame too long Errors",
118 	"Packets received with a1nrange length Errors",
119 	"Received packets",
120 	"Packets received with FrameCheckSequenceErrors",
121 	"Packets received with VLAN header",
122 	"Error packets",
123 	"Packets received with unicast DMAC",
124 	"Packets received with multicast DMAC",
125 	"Packets received with broadcast DMAC",
126 	"Dropped packets",
127 	"Total frames received on interface",
128 	"Packets received with an octet count < 64",
129 	"Packets received with an octet count == 64",
130 	"Packets received with an octet count of 65-127",
131 	"Packets received with an octet count of 128-255",
132 	"Packets received with an octet count of 256-511",
133 	"Packets received with an octet count of 512-1023",
134 	"Packets received with an octet count of 1024-1518",
135 	"Packets received with an octet count of > 1518",
136 	"Oversized Packets",
137 	"Jabber Packets",
138 	"Fragmented Packets",
139 	"CBFC(class based flow control) pause frames received for class 0",
140 	"CBFC pause frames received for class 1",
141 	"CBFC pause frames received for class 2",
142 	"CBFC pause frames received for class 3",
143 	"CBFC pause frames received for class 4",
144 	"CBFC pause frames received for class 5",
145 	"CBFC pause frames received for class 6",
146 	"CBFC pause frames received for class 7",
147 	"CBFC pause frames received for class 8",
148 	"CBFC pause frames received for class 9",
149 	"CBFC pause frames received for class 10",
150 	"CBFC pause frames received for class 11",
151 	"CBFC pause frames received for class 12",
152 	"CBFC pause frames received for class 13",
153 	"CBFC pause frames received for class 14",
154 	"CBFC pause frames received for class 15",
155 	"MAC control packets received",
156 };
157 
158 static char *rpm_tx_stats_fields[] = {
159 	"Total octets sent on the interface",
160 	"Total octets transmitted OK",
161 	"Control/Pause frames sent",
162 	"Total frames transmitted OK",
163 	"Total frames sent with VLAN header",
164 	"Error Packets",
165 	"Packets sent to unicast DMAC",
166 	"Packets sent to the multicast DMAC",
167 	"Packets sent to a broadcast DMAC",
168 	"Packets sent with an octet count == 64",
169 	"Packets sent with an octet count of 65-127",
170 	"Packets sent with an octet count of 128-255",
171 	"Packets sent with an octet count of 256-511",
172 	"Packets sent with an octet count of 512-1023",
173 	"Packets sent with an octet count of 1024-1518",
174 	"Packets sent with an octet count of > 1518",
175 	"CBFC(class based flow control) pause frames transmitted for class 0",
176 	"CBFC pause frames transmitted for class 1",
177 	"CBFC pause frames transmitted for class 2",
178 	"CBFC pause frames transmitted for class 3",
179 	"CBFC pause frames transmitted for class 4",
180 	"CBFC pause frames transmitted for class 5",
181 	"CBFC pause frames transmitted for class 6",
182 	"CBFC pause frames transmitted for class 7",
183 	"CBFC pause frames transmitted for class 8",
184 	"CBFC pause frames transmitted for class 9",
185 	"CBFC pause frames transmitted for class 10",
186 	"CBFC pause frames transmitted for class 11",
187 	"CBFC pause frames transmitted for class 12",
188 	"CBFC pause frames transmitted for class 13",
189 	"CBFC pause frames transmitted for class 14",
190 	"CBFC pause frames transmitted for class 15",
191 	"MAC control packets sent",
192 	"Total frames sent on the interface"
193 };
194 
195 enum cpt_eng_type {
196 	CPT_AE_TYPE = 1,
197 	CPT_SE_TYPE = 2,
198 	CPT_IE_TYPE = 3,
199 };
200 
201 #define rvu_dbg_NULL NULL
202 #define rvu_dbg_open_NULL NULL
203 
204 #define RVU_DEBUG_SEQ_FOPS(name, read_op, write_op)	\
205 static int rvu_dbg_open_##name(struct inode *inode, struct file *file) \
206 { \
207 	return single_open(file, rvu_dbg_##read_op, inode->i_private); \
208 } \
209 static const struct file_operations rvu_dbg_##name##_fops = { \
210 	.owner		= THIS_MODULE, \
211 	.open		= rvu_dbg_open_##name, \
212 	.read		= seq_read, \
213 	.write		= rvu_dbg_##write_op, \
214 	.llseek		= seq_lseek, \
215 	.release	= single_release, \
216 }
217 
218 #define RVU_DEBUG_FOPS(name, read_op, write_op) \
219 static const struct file_operations rvu_dbg_##name##_fops = { \
220 	.owner = THIS_MODULE, \
221 	.open = simple_open, \
222 	.read = rvu_dbg_##read_op, \
223 	.write = rvu_dbg_##write_op \
224 }
225 
226 static void print_nix_qsize(struct seq_file *filp, struct rvu_pfvf *pfvf);
227 
rvu_dbg_mcs_port_stats_display(struct seq_file * filp,void * unused,int dir)228 static int rvu_dbg_mcs_port_stats_display(struct seq_file *filp, void *unused, int dir)
229 {
230 	struct mcs *mcs = filp->private;
231 	struct mcs_port_stats stats;
232 	int lmac;
233 
234 	seq_puts(filp, "\n port stats\n");
235 	mutex_lock(&mcs->stats_lock);
236 	for_each_set_bit(lmac, &mcs->hw->lmac_bmap, mcs->hw->lmac_cnt) {
237 		mcs_get_port_stats(mcs, &stats, lmac, dir);
238 		seq_printf(filp, "port%d: Tcam Miss: %lld\n", lmac, stats.tcam_miss_cnt);
239 		seq_printf(filp, "port%d: Parser errors: %lld\n", lmac, stats.parser_err_cnt);
240 
241 		if (dir == MCS_RX && mcs->hw->mcs_blks > 1)
242 			seq_printf(filp, "port%d: Preempt error: %lld\n", lmac,
243 				   stats.preempt_err_cnt);
244 		if (dir == MCS_TX)
245 			seq_printf(filp, "port%d: Sectag insert error: %lld\n", lmac,
246 				   stats.sectag_insert_err_cnt);
247 	}
248 	mutex_unlock(&mcs->stats_lock);
249 	return 0;
250 }
251 
rvu_dbg_mcs_rx_port_stats_display(struct seq_file * filp,void * unused)252 static int rvu_dbg_mcs_rx_port_stats_display(struct seq_file *filp, void *unused)
253 {
254 	return rvu_dbg_mcs_port_stats_display(filp, unused, MCS_RX);
255 }
256 
257 RVU_DEBUG_SEQ_FOPS(mcs_rx_port_stats, mcs_rx_port_stats_display, NULL);
258 
rvu_dbg_mcs_tx_port_stats_display(struct seq_file * filp,void * unused)259 static int rvu_dbg_mcs_tx_port_stats_display(struct seq_file *filp, void *unused)
260 {
261 	return rvu_dbg_mcs_port_stats_display(filp, unused, MCS_TX);
262 }
263 
264 RVU_DEBUG_SEQ_FOPS(mcs_tx_port_stats, mcs_tx_port_stats_display, NULL);
265 
rvu_dbg_mcs_sa_stats_display(struct seq_file * filp,void * unused,int dir)266 static int rvu_dbg_mcs_sa_stats_display(struct seq_file *filp, void *unused, int dir)
267 {
268 	struct mcs *mcs = filp->private;
269 	struct mcs_sa_stats stats;
270 	struct rsrc_bmap *map;
271 	int sa_id;
272 
273 	if (dir == MCS_TX) {
274 		map = &mcs->tx.sa;
275 		mutex_lock(&mcs->stats_lock);
276 		for_each_set_bit(sa_id, map->bmap, mcs->hw->sa_entries) {
277 			seq_puts(filp, "\n TX SA stats\n");
278 			mcs_get_sa_stats(mcs, &stats, sa_id, MCS_TX);
279 			seq_printf(filp, "sa%d: Pkts encrypted: %lld\n", sa_id,
280 				   stats.pkt_encrypt_cnt);
281 
282 			seq_printf(filp, "sa%d: Pkts protected: %lld\n", sa_id,
283 				   stats.pkt_protected_cnt);
284 		}
285 		mutex_unlock(&mcs->stats_lock);
286 		return 0;
287 	}
288 
289 	/* RX stats */
290 	map = &mcs->rx.sa;
291 	mutex_lock(&mcs->stats_lock);
292 	for_each_set_bit(sa_id, map->bmap, mcs->hw->sa_entries) {
293 		seq_puts(filp, "\n RX SA stats\n");
294 		mcs_get_sa_stats(mcs, &stats, sa_id, MCS_RX);
295 		seq_printf(filp, "sa%d: Invalid pkts: %lld\n", sa_id, stats.pkt_invalid_cnt);
296 		seq_printf(filp, "sa%d: Pkts no sa error: %lld\n", sa_id, stats.pkt_nosaerror_cnt);
297 		seq_printf(filp, "sa%d: Pkts not valid: %lld\n", sa_id, stats.pkt_notvalid_cnt);
298 		seq_printf(filp, "sa%d: Pkts ok: %lld\n", sa_id, stats.pkt_ok_cnt);
299 		seq_printf(filp, "sa%d: Pkts no sa: %lld\n", sa_id, stats.pkt_nosa_cnt);
300 	}
301 	mutex_unlock(&mcs->stats_lock);
302 	return 0;
303 }
304 
rvu_dbg_mcs_rx_sa_stats_display(struct seq_file * filp,void * unused)305 static int rvu_dbg_mcs_rx_sa_stats_display(struct seq_file *filp, void *unused)
306 {
307 	return rvu_dbg_mcs_sa_stats_display(filp, unused, MCS_RX);
308 }
309 
310 RVU_DEBUG_SEQ_FOPS(mcs_rx_sa_stats, mcs_rx_sa_stats_display, NULL);
311 
rvu_dbg_mcs_tx_sa_stats_display(struct seq_file * filp,void * unused)312 static int rvu_dbg_mcs_tx_sa_stats_display(struct seq_file *filp, void *unused)
313 {
314 	return rvu_dbg_mcs_sa_stats_display(filp, unused, MCS_TX);
315 }
316 
317 RVU_DEBUG_SEQ_FOPS(mcs_tx_sa_stats, mcs_tx_sa_stats_display, NULL);
318 
rvu_dbg_mcs_tx_sc_stats_display(struct seq_file * filp,void * unused)319 static int rvu_dbg_mcs_tx_sc_stats_display(struct seq_file *filp, void *unused)
320 {
321 	struct mcs *mcs = filp->private;
322 	struct mcs_sc_stats stats;
323 	struct rsrc_bmap *map;
324 	int sc_id;
325 
326 	map = &mcs->tx.sc;
327 	seq_puts(filp, "\n SC stats\n");
328 
329 	mutex_lock(&mcs->stats_lock);
330 	for_each_set_bit(sc_id, map->bmap, mcs->hw->sc_entries) {
331 		mcs_get_sc_stats(mcs, &stats, sc_id, MCS_TX);
332 		seq_printf(filp, "\n=======sc%d======\n\n", sc_id);
333 		seq_printf(filp, "sc%d: Pkts encrypted: %lld\n", sc_id, stats.pkt_encrypt_cnt);
334 		seq_printf(filp, "sc%d: Pkts protected: %lld\n", sc_id, stats.pkt_protected_cnt);
335 
336 		if (mcs->hw->mcs_blks == 1) {
337 			seq_printf(filp, "sc%d: Octets encrypted: %lld\n", sc_id,
338 				   stats.octet_encrypt_cnt);
339 			seq_printf(filp, "sc%d: Octets protected: %lld\n", sc_id,
340 				   stats.octet_protected_cnt);
341 		}
342 	}
343 	mutex_unlock(&mcs->stats_lock);
344 	return 0;
345 }
346 
347 RVU_DEBUG_SEQ_FOPS(mcs_tx_sc_stats, mcs_tx_sc_stats_display, NULL);
348 
rvu_dbg_mcs_rx_sc_stats_display(struct seq_file * filp,void * unused)349 static int rvu_dbg_mcs_rx_sc_stats_display(struct seq_file *filp, void *unused)
350 {
351 	struct mcs *mcs = filp->private;
352 	struct mcs_sc_stats stats;
353 	struct rsrc_bmap *map;
354 	int sc_id;
355 
356 	map = &mcs->rx.sc;
357 	seq_puts(filp, "\n SC stats\n");
358 
359 	mutex_lock(&mcs->stats_lock);
360 	for_each_set_bit(sc_id, map->bmap, mcs->hw->sc_entries) {
361 		mcs_get_sc_stats(mcs, &stats, sc_id, MCS_RX);
362 		seq_printf(filp, "\n=======sc%d======\n\n", sc_id);
363 		seq_printf(filp, "sc%d: Cam hits: %lld\n", sc_id, stats.hit_cnt);
364 		seq_printf(filp, "sc%d: Invalid pkts: %lld\n", sc_id, stats.pkt_invalid_cnt);
365 		seq_printf(filp, "sc%d: Late pkts: %lld\n", sc_id, stats.pkt_late_cnt);
366 		seq_printf(filp, "sc%d: Notvalid pkts: %lld\n", sc_id, stats.pkt_notvalid_cnt);
367 		seq_printf(filp, "sc%d: Unchecked pkts: %lld\n", sc_id, stats.pkt_unchecked_cnt);
368 
369 		if (mcs->hw->mcs_blks > 1) {
370 			seq_printf(filp, "sc%d: Delay pkts: %lld\n", sc_id, stats.pkt_delay_cnt);
371 			seq_printf(filp, "sc%d: Pkts ok: %lld\n", sc_id, stats.pkt_ok_cnt);
372 		}
373 		if (mcs->hw->mcs_blks == 1) {
374 			seq_printf(filp, "sc%d: Octets decrypted: %lld\n", sc_id,
375 				   stats.octet_decrypt_cnt);
376 			seq_printf(filp, "sc%d: Octets validated: %lld\n", sc_id,
377 				   stats.octet_validate_cnt);
378 		}
379 	}
380 	mutex_unlock(&mcs->stats_lock);
381 	return 0;
382 }
383 
384 RVU_DEBUG_SEQ_FOPS(mcs_rx_sc_stats, mcs_rx_sc_stats_display, NULL);
385 
rvu_dbg_mcs_flowid_stats_display(struct seq_file * filp,void * unused,int dir)386 static int rvu_dbg_mcs_flowid_stats_display(struct seq_file *filp, void *unused, int dir)
387 {
388 	struct mcs *mcs = filp->private;
389 	struct mcs_flowid_stats stats;
390 	struct rsrc_bmap *map;
391 	int flow_id;
392 
393 	seq_puts(filp, "\n Flowid stats\n");
394 
395 	if (dir == MCS_RX)
396 		map = &mcs->rx.flow_ids;
397 	else
398 		map = &mcs->tx.flow_ids;
399 
400 	mutex_lock(&mcs->stats_lock);
401 	for_each_set_bit(flow_id, map->bmap, mcs->hw->tcam_entries) {
402 		mcs_get_flowid_stats(mcs, &stats, flow_id, dir);
403 		seq_printf(filp, "Flowid%d: Hit:%lld\n", flow_id, stats.tcam_hit_cnt);
404 	}
405 	mutex_unlock(&mcs->stats_lock);
406 	return 0;
407 }
408 
rvu_dbg_mcs_tx_flowid_stats_display(struct seq_file * filp,void * unused)409 static int rvu_dbg_mcs_tx_flowid_stats_display(struct seq_file *filp, void *unused)
410 {
411 	return rvu_dbg_mcs_flowid_stats_display(filp, unused, MCS_TX);
412 }
413 
414 RVU_DEBUG_SEQ_FOPS(mcs_tx_flowid_stats, mcs_tx_flowid_stats_display, NULL);
415 
rvu_dbg_mcs_rx_flowid_stats_display(struct seq_file * filp,void * unused)416 static int rvu_dbg_mcs_rx_flowid_stats_display(struct seq_file *filp, void *unused)
417 {
418 	return rvu_dbg_mcs_flowid_stats_display(filp, unused, MCS_RX);
419 }
420 
421 RVU_DEBUG_SEQ_FOPS(mcs_rx_flowid_stats, mcs_rx_flowid_stats_display, NULL);
422 
rvu_dbg_mcs_tx_secy_stats_display(struct seq_file * filp,void * unused)423 static int rvu_dbg_mcs_tx_secy_stats_display(struct seq_file *filp, void *unused)
424 {
425 	struct mcs *mcs = filp->private;
426 	struct mcs_secy_stats stats;
427 	struct rsrc_bmap *map;
428 	int secy_id;
429 
430 	map = &mcs->tx.secy;
431 	seq_puts(filp, "\n MCS TX secy stats\n");
432 
433 	mutex_lock(&mcs->stats_lock);
434 	for_each_set_bit(secy_id, map->bmap, mcs->hw->secy_entries) {
435 		mcs_get_tx_secy_stats(mcs, &stats, secy_id);
436 		seq_printf(filp, "\n=======Secy%d======\n\n", secy_id);
437 		seq_printf(filp, "secy%d: Ctrl bcast pkts: %lld\n", secy_id,
438 			   stats.ctl_pkt_bcast_cnt);
439 		seq_printf(filp, "secy%d: Ctrl Mcast pkts: %lld\n", secy_id,
440 			   stats.ctl_pkt_mcast_cnt);
441 		seq_printf(filp, "secy%d: Ctrl ucast pkts: %lld\n", secy_id,
442 			   stats.ctl_pkt_ucast_cnt);
443 		seq_printf(filp, "secy%d: Ctrl octets: %lld\n", secy_id, stats.ctl_octet_cnt);
444 		seq_printf(filp, "secy%d: Unctrl bcast cnt: %lld\n", secy_id,
445 			   stats.unctl_pkt_bcast_cnt);
446 		seq_printf(filp, "secy%d: Unctrl mcast pkts: %lld\n", secy_id,
447 			   stats.unctl_pkt_mcast_cnt);
448 		seq_printf(filp, "secy%d: Unctrl ucast pkts: %lld\n", secy_id,
449 			   stats.unctl_pkt_ucast_cnt);
450 		seq_printf(filp, "secy%d: Unctrl octets: %lld\n", secy_id, stats.unctl_octet_cnt);
451 		seq_printf(filp, "secy%d: Octet encrypted: %lld\n", secy_id,
452 			   stats.octet_encrypted_cnt);
453 		seq_printf(filp, "secy%d: octet protected: %lld\n", secy_id,
454 			   stats.octet_protected_cnt);
455 		seq_printf(filp, "secy%d: Pkts on active sa: %lld\n", secy_id,
456 			   stats.pkt_noactivesa_cnt);
457 		seq_printf(filp, "secy%d: Pkts too long: %lld\n", secy_id, stats.pkt_toolong_cnt);
458 		seq_printf(filp, "secy%d: Pkts untagged: %lld\n", secy_id, stats.pkt_untagged_cnt);
459 	}
460 	mutex_unlock(&mcs->stats_lock);
461 	return 0;
462 }
463 
464 RVU_DEBUG_SEQ_FOPS(mcs_tx_secy_stats, mcs_tx_secy_stats_display, NULL);
465 
rvu_dbg_mcs_rx_secy_stats_display(struct seq_file * filp,void * unused)466 static int rvu_dbg_mcs_rx_secy_stats_display(struct seq_file *filp, void *unused)
467 {
468 	struct mcs *mcs = filp->private;
469 	struct mcs_secy_stats stats;
470 	struct rsrc_bmap *map;
471 	int secy_id;
472 
473 	map = &mcs->rx.secy;
474 	seq_puts(filp, "\n MCS secy stats\n");
475 
476 	mutex_lock(&mcs->stats_lock);
477 	for_each_set_bit(secy_id, map->bmap, mcs->hw->secy_entries) {
478 		mcs_get_rx_secy_stats(mcs, &stats, secy_id);
479 		seq_printf(filp, "\n=======Secy%d======\n\n", secy_id);
480 		seq_printf(filp, "secy%d: Ctrl bcast pkts: %lld\n", secy_id,
481 			   stats.ctl_pkt_bcast_cnt);
482 		seq_printf(filp, "secy%d: Ctrl Mcast pkts: %lld\n", secy_id,
483 			   stats.ctl_pkt_mcast_cnt);
484 		seq_printf(filp, "secy%d: Ctrl ucast pkts: %lld\n", secy_id,
485 			   stats.ctl_pkt_ucast_cnt);
486 		seq_printf(filp, "secy%d: Ctrl octets: %lld\n", secy_id, stats.ctl_octet_cnt);
487 		seq_printf(filp, "secy%d: Unctrl bcast cnt: %lld\n", secy_id,
488 			   stats.unctl_pkt_bcast_cnt);
489 		seq_printf(filp, "secy%d: Unctrl mcast pkts: %lld\n", secy_id,
490 			   stats.unctl_pkt_mcast_cnt);
491 		seq_printf(filp, "secy%d: Unctrl ucast pkts: %lld\n", secy_id,
492 			   stats.unctl_pkt_ucast_cnt);
493 		seq_printf(filp, "secy%d: Unctrl octets: %lld\n", secy_id, stats.unctl_octet_cnt);
494 		seq_printf(filp, "secy%d: Octet decrypted: %lld\n", secy_id,
495 			   stats.octet_decrypted_cnt);
496 		seq_printf(filp, "secy%d: octet validated: %lld\n", secy_id,
497 			   stats.octet_validated_cnt);
498 		seq_printf(filp, "secy%d: Pkts on disable port: %lld\n", secy_id,
499 			   stats.pkt_port_disabled_cnt);
500 		seq_printf(filp, "secy%d: Pkts with badtag: %lld\n", secy_id, stats.pkt_badtag_cnt);
501 		seq_printf(filp, "secy%d: Pkts with no SA(sectag.tci.c=0): %lld\n", secy_id,
502 			   stats.pkt_nosa_cnt);
503 		seq_printf(filp, "secy%d: Pkts with nosaerror: %lld\n", secy_id,
504 			   stats.pkt_nosaerror_cnt);
505 		seq_printf(filp, "secy%d: Tagged ctrl pkts: %lld\n", secy_id,
506 			   stats.pkt_tagged_ctl_cnt);
507 		seq_printf(filp, "secy%d: Untaged pkts: %lld\n", secy_id, stats.pkt_untaged_cnt);
508 		seq_printf(filp, "secy%d: Ctrl pkts: %lld\n", secy_id, stats.pkt_ctl_cnt);
509 		if (mcs->hw->mcs_blks > 1)
510 			seq_printf(filp, "secy%d: pkts notag: %lld\n", secy_id,
511 				   stats.pkt_notag_cnt);
512 	}
513 	mutex_unlock(&mcs->stats_lock);
514 	return 0;
515 }
516 
517 RVU_DEBUG_SEQ_FOPS(mcs_rx_secy_stats, mcs_rx_secy_stats_display, NULL);
518 
rvu_dbg_mcs_init(struct rvu * rvu)519 static void rvu_dbg_mcs_init(struct rvu *rvu)
520 {
521 	struct mcs *mcs;
522 	char dname[10];
523 	int i;
524 
525 	if (!rvu->mcs_blk_cnt)
526 		return;
527 
528 	rvu->rvu_dbg.mcs_root = debugfs_create_dir("mcs", rvu->rvu_dbg.root);
529 
530 	for (i = 0; i < rvu->mcs_blk_cnt; i++) {
531 		mcs = mcs_get_pdata(i);
532 
533 		sprintf(dname, "mcs%d", i);
534 		rvu->rvu_dbg.mcs = debugfs_create_dir(dname,
535 						      rvu->rvu_dbg.mcs_root);
536 
537 		rvu->rvu_dbg.mcs_rx = debugfs_create_dir("rx_stats", rvu->rvu_dbg.mcs);
538 
539 		debugfs_create_file("flowid", 0600, rvu->rvu_dbg.mcs_rx, mcs,
540 				    &rvu_dbg_mcs_rx_flowid_stats_fops);
541 
542 		debugfs_create_file("secy", 0600, rvu->rvu_dbg.mcs_rx, mcs,
543 				    &rvu_dbg_mcs_rx_secy_stats_fops);
544 
545 		debugfs_create_file("sc", 0600, rvu->rvu_dbg.mcs_rx, mcs,
546 				    &rvu_dbg_mcs_rx_sc_stats_fops);
547 
548 		debugfs_create_file("sa", 0600, rvu->rvu_dbg.mcs_rx, mcs,
549 				    &rvu_dbg_mcs_rx_sa_stats_fops);
550 
551 		debugfs_create_file("port", 0600, rvu->rvu_dbg.mcs_rx, mcs,
552 				    &rvu_dbg_mcs_rx_port_stats_fops);
553 
554 		rvu->rvu_dbg.mcs_tx = debugfs_create_dir("tx_stats", rvu->rvu_dbg.mcs);
555 
556 		debugfs_create_file("flowid", 0600, rvu->rvu_dbg.mcs_tx, mcs,
557 				    &rvu_dbg_mcs_tx_flowid_stats_fops);
558 
559 		debugfs_create_file("secy", 0600, rvu->rvu_dbg.mcs_tx, mcs,
560 				    &rvu_dbg_mcs_tx_secy_stats_fops);
561 
562 		debugfs_create_file("sc", 0600, rvu->rvu_dbg.mcs_tx, mcs,
563 				    &rvu_dbg_mcs_tx_sc_stats_fops);
564 
565 		debugfs_create_file("sa", 0600, rvu->rvu_dbg.mcs_tx, mcs,
566 				    &rvu_dbg_mcs_tx_sa_stats_fops);
567 
568 		debugfs_create_file("port", 0600, rvu->rvu_dbg.mcs_tx, mcs,
569 				    &rvu_dbg_mcs_tx_port_stats_fops);
570 	}
571 }
572 
573 #define LMT_MAPTBL_ENTRY_SIZE 16
574 /* Dump LMTST map table */
rvu_dbg_lmtst_map_table_display(struct file * filp,char __user * buffer,size_t count,loff_t * ppos)575 static ssize_t rvu_dbg_lmtst_map_table_display(struct file *filp,
576 					       char __user *buffer,
577 					       size_t count, loff_t *ppos)
578 {
579 	struct rvu *rvu = filp->private_data;
580 	u64 lmt_addr, val, tbl_base;
581 	int pf, vf, num_vfs, hw_vfs;
582 	void __iomem *lmt_map_base;
583 	int buf_size = 10240;
584 	size_t off = 0;
585 	int index = 0;
586 	char *buf;
587 	int ret;
588 
589 	/* don't allow partial reads */
590 	if (*ppos != 0)
591 		return 0;
592 
593 	buf = kzalloc(buf_size, GFP_KERNEL);
594 	if (!buf)
595 		return -ENOMEM;
596 
597 	tbl_base = rvu_read64(rvu, BLKADDR_APR, APR_AF_LMT_MAP_BASE);
598 
599 	lmt_map_base = ioremap_wc(tbl_base, 128 * 1024);
600 	if (!lmt_map_base) {
601 		dev_err(rvu->dev, "Failed to setup lmt map table mapping!!\n");
602 		kfree(buf);
603 		return false;
604 	}
605 
606 	off +=	scnprintf(&buf[off], buf_size - 1 - off,
607 			  "\n\t\t\t\t\tLmtst Map Table Entries");
608 	off +=	scnprintf(&buf[off], buf_size - 1 - off,
609 			  "\n\t\t\t\t\t=======================");
610 	off +=	scnprintf(&buf[off], buf_size - 1 - off, "\nPcifunc\t\t\t");
611 	off +=	scnprintf(&buf[off], buf_size - 1 - off, "Table Index\t\t");
612 	off +=	scnprintf(&buf[off], buf_size - 1 - off,
613 			  "Lmtline Base (word 0)\t\t");
614 	off +=	scnprintf(&buf[off], buf_size - 1 - off,
615 			  "Lmt Map Entry (word 1)");
616 	off += scnprintf(&buf[off], buf_size - 1 - off, "\n");
617 	for (pf = 0; pf < rvu->hw->total_pfs; pf++) {
618 		off += scnprintf(&buf[off], buf_size - 1 - off, "PF%d  \t\t\t",
619 				    pf);
620 
621 		index = pf * rvu->hw->total_vfs * LMT_MAPTBL_ENTRY_SIZE;
622 		off += scnprintf(&buf[off], buf_size - 1 - off, " 0x%llx\t\t",
623 				 (tbl_base + index));
624 		lmt_addr = readq(lmt_map_base + index);
625 		off += scnprintf(&buf[off], buf_size - 1 - off,
626 				 " 0x%016llx\t\t", lmt_addr);
627 		index += 8;
628 		val = readq(lmt_map_base + index);
629 		off += scnprintf(&buf[off], buf_size - 1 - off, " 0x%016llx\n",
630 				 val);
631 		/* Reading num of VFs per PF */
632 		rvu_get_pf_numvfs(rvu, pf, &num_vfs, &hw_vfs);
633 		for (vf = 0; vf < num_vfs; vf++) {
634 			index = (pf * rvu->hw->total_vfs * 16) +
635 				((vf + 1)  * LMT_MAPTBL_ENTRY_SIZE);
636 			off += scnprintf(&buf[off], buf_size - 1 - off,
637 					    "PF%d:VF%d  \t\t", pf, vf);
638 			off += scnprintf(&buf[off], buf_size - 1 - off,
639 					 " 0x%llx\t\t", (tbl_base + index));
640 			lmt_addr = readq(lmt_map_base + index);
641 			off += scnprintf(&buf[off], buf_size - 1 - off,
642 					 " 0x%016llx\t\t", lmt_addr);
643 			index += 8;
644 			val = readq(lmt_map_base + index);
645 			off += scnprintf(&buf[off], buf_size - 1 - off,
646 					 " 0x%016llx\n", val);
647 		}
648 	}
649 	off +=	scnprintf(&buf[off], buf_size - 1 - off, "\n");
650 
651 	ret = min(off, count);
652 	if (copy_to_user(buffer, buf, ret))
653 		ret = -EFAULT;
654 	kfree(buf);
655 
656 	iounmap(lmt_map_base);
657 	if (ret < 0)
658 		return ret;
659 
660 	*ppos = ret;
661 	return ret;
662 }
663 
664 RVU_DEBUG_FOPS(lmtst_map_table, lmtst_map_table_display, NULL);
665 
get_lf_str_list(struct rvu_block block,int pcifunc,char * lfs)666 static void get_lf_str_list(struct rvu_block block, int pcifunc,
667 			    char *lfs)
668 {
669 	int lf = 0, seq = 0, len = 0, prev_lf = block.lf.max;
670 
671 	for_each_set_bit(lf, block.lf.bmap, block.lf.max) {
672 		if (lf >= block.lf.max)
673 			break;
674 
675 		if (block.fn_map[lf] != pcifunc)
676 			continue;
677 
678 		if (lf == prev_lf + 1) {
679 			prev_lf = lf;
680 			seq = 1;
681 			continue;
682 		}
683 
684 		if (seq)
685 			len += sprintf(lfs + len, "-%d,%d", prev_lf, lf);
686 		else
687 			len += (len ? sprintf(lfs + len, ",%d", lf) :
688 				      sprintf(lfs + len, "%d", lf));
689 
690 		prev_lf = lf;
691 		seq = 0;
692 	}
693 
694 	if (seq)
695 		len += sprintf(lfs + len, "-%d", prev_lf);
696 
697 	lfs[len] = '\0';
698 }
699 
get_max_column_width(struct rvu * rvu)700 static int get_max_column_width(struct rvu *rvu)
701 {
702 	int index, pf, vf, lf_str_size = 12, buf_size = 256;
703 	struct rvu_block block;
704 	u16 pcifunc;
705 	char *buf;
706 
707 	buf = kzalloc(buf_size, GFP_KERNEL);
708 	if (!buf)
709 		return -ENOMEM;
710 
711 	for (pf = 0; pf < rvu->hw->total_pfs; pf++) {
712 		for (vf = 0; vf <= rvu->hw->total_vfs; vf++) {
713 			pcifunc = pf << 10 | vf;
714 			if (!pcifunc)
715 				continue;
716 
717 			for (index = 0; index < BLK_COUNT; index++) {
718 				block = rvu->hw->block[index];
719 				if (!strlen(block.name))
720 					continue;
721 
722 				get_lf_str_list(block, pcifunc, buf);
723 				if (lf_str_size <= strlen(buf))
724 					lf_str_size = strlen(buf) + 1;
725 			}
726 		}
727 	}
728 
729 	kfree(buf);
730 	return lf_str_size;
731 }
732 
733 /* Dumps current provisioning status of all RVU block LFs */
rvu_dbg_rsrc_attach_status(struct file * filp,char __user * buffer,size_t count,loff_t * ppos)734 static ssize_t rvu_dbg_rsrc_attach_status(struct file *filp,
735 					  char __user *buffer,
736 					  size_t count, loff_t *ppos)
737 {
738 	int index, off = 0, flag = 0, len = 0, i = 0;
739 	struct rvu *rvu = filp->private_data;
740 	int bytes_not_copied = 0;
741 	struct rvu_block block;
742 	int pf, vf, pcifunc;
743 	int buf_size = 2048;
744 	int lf_str_size;
745 	char *lfs;
746 	char *buf;
747 
748 	/* don't allow partial reads */
749 	if (*ppos != 0)
750 		return 0;
751 
752 	buf = kzalloc(buf_size, GFP_KERNEL);
753 	if (!buf)
754 		return -ENOMEM;
755 
756 	/* Get the maximum width of a column */
757 	lf_str_size = get_max_column_width(rvu);
758 
759 	lfs = kzalloc(lf_str_size, GFP_KERNEL);
760 	if (!lfs) {
761 		kfree(buf);
762 		return -ENOMEM;
763 	}
764 	off +=	scnprintf(&buf[off], buf_size - 1 - off, "%-*s", lf_str_size,
765 			  "pcifunc");
766 	for (index = 0; index < BLK_COUNT; index++)
767 		if (strlen(rvu->hw->block[index].name)) {
768 			off += scnprintf(&buf[off], buf_size - 1 - off,
769 					 "%-*s", lf_str_size,
770 					 rvu->hw->block[index].name);
771 		}
772 
773 	off += scnprintf(&buf[off], buf_size - 1 - off, "\n");
774 	bytes_not_copied = copy_to_user(buffer + (i * off), buf, off);
775 	if (bytes_not_copied)
776 		goto out;
777 
778 	i++;
779 	*ppos += off;
780 	for (pf = 0; pf < rvu->hw->total_pfs; pf++) {
781 		for (vf = 0; vf <= rvu->hw->total_vfs; vf++) {
782 			off = 0;
783 			flag = 0;
784 			pcifunc = pf << 10 | vf;
785 			if (!pcifunc)
786 				continue;
787 
788 			if (vf) {
789 				sprintf(lfs, "PF%d:VF%d", pf, vf - 1);
790 				off = scnprintf(&buf[off],
791 						buf_size - 1 - off,
792 						"%-*s", lf_str_size, lfs);
793 			} else {
794 				sprintf(lfs, "PF%d", pf);
795 				off = scnprintf(&buf[off],
796 						buf_size - 1 - off,
797 						"%-*s", lf_str_size, lfs);
798 			}
799 
800 			for (index = 0; index < BLK_COUNT; index++) {
801 				block = rvu->hw->block[index];
802 				if (!strlen(block.name))
803 					continue;
804 				len = 0;
805 				lfs[len] = '\0';
806 				get_lf_str_list(block, pcifunc, lfs);
807 				if (strlen(lfs))
808 					flag = 1;
809 
810 				off += scnprintf(&buf[off], buf_size - 1 - off,
811 						 "%-*s", lf_str_size, lfs);
812 			}
813 			if (flag) {
814 				off +=	scnprintf(&buf[off],
815 						  buf_size - 1 - off, "\n");
816 				bytes_not_copied = copy_to_user(buffer +
817 								(i * off),
818 								buf, off);
819 				if (bytes_not_copied)
820 					goto out;
821 
822 				i++;
823 				*ppos += off;
824 			}
825 		}
826 	}
827 
828 out:
829 	kfree(lfs);
830 	kfree(buf);
831 	if (bytes_not_copied)
832 		return -EFAULT;
833 
834 	return *ppos;
835 }
836 
837 RVU_DEBUG_FOPS(rsrc_status, rsrc_attach_status, NULL);
838 
rvu_dbg_rvu_pf_cgx_map_display(struct seq_file * filp,void * unused)839 static int rvu_dbg_rvu_pf_cgx_map_display(struct seq_file *filp, void *unused)
840 {
841 	struct rvu *rvu = filp->private;
842 	struct pci_dev *pdev = NULL;
843 	struct mac_ops *mac_ops;
844 	char cgx[10], lmac[10];
845 	struct rvu_pfvf *pfvf;
846 	int pf, domain, blkid;
847 	u8 cgx_id, lmac_id;
848 	u16 pcifunc;
849 
850 	domain = 2;
851 	mac_ops = get_mac_ops(rvu_first_cgx_pdata(rvu));
852 	/* There can be no CGX devices at all */
853 	if (!mac_ops)
854 		return 0;
855 	seq_printf(filp, "PCI dev\t\tRVU PF Func\tNIX block\t%s\tLMAC\n",
856 		   mac_ops->name);
857 	for (pf = 0; pf < rvu->hw->total_pfs; pf++) {
858 		if (!is_pf_cgxmapped(rvu, pf))
859 			continue;
860 
861 		pdev =  pci_get_domain_bus_and_slot(domain, pf + 1, 0);
862 		if (!pdev)
863 			continue;
864 
865 		cgx[0] = 0;
866 		lmac[0] = 0;
867 		pcifunc = pf << 10;
868 		pfvf = rvu_get_pfvf(rvu, pcifunc);
869 
870 		if (pfvf->nix_blkaddr == BLKADDR_NIX0)
871 			blkid = 0;
872 		else
873 			blkid = 1;
874 
875 		rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_id,
876 				    &lmac_id);
877 		sprintf(cgx, "%s%d", mac_ops->name, cgx_id);
878 		sprintf(lmac, "LMAC%d", lmac_id);
879 		seq_printf(filp, "%s\t0x%x\t\tNIX%d\t\t%s\t%s\n",
880 			   dev_name(&pdev->dev), pcifunc, blkid, cgx, lmac);
881 
882 		pci_dev_put(pdev);
883 	}
884 	return 0;
885 }
886 
887 RVU_DEBUG_SEQ_FOPS(rvu_pf_cgx_map, rvu_pf_cgx_map_display, NULL);
888 
rvu_dbg_is_valid_lf(struct rvu * rvu,int blkaddr,int lf,u16 * pcifunc)889 static bool rvu_dbg_is_valid_lf(struct rvu *rvu, int blkaddr, int lf,
890 				u16 *pcifunc)
891 {
892 	struct rvu_block *block;
893 	struct rvu_hwinfo *hw;
894 
895 	hw = rvu->hw;
896 	block = &hw->block[blkaddr];
897 
898 	if (lf < 0 || lf >= block->lf.max) {
899 		dev_warn(rvu->dev, "Invalid LF: valid range: 0-%d\n",
900 			 block->lf.max - 1);
901 		return false;
902 	}
903 
904 	*pcifunc = block->fn_map[lf];
905 	if (!*pcifunc) {
906 		dev_warn(rvu->dev,
907 			 "This LF is not attached to any RVU PFFUNC\n");
908 		return false;
909 	}
910 	return true;
911 }
912 
print_npa_qsize(struct seq_file * m,struct rvu_pfvf * pfvf)913 static void print_npa_qsize(struct seq_file *m, struct rvu_pfvf *pfvf)
914 {
915 	char *buf;
916 
917 	buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
918 	if (!buf)
919 		return;
920 
921 	if (!pfvf->aura_ctx) {
922 		seq_puts(m, "Aura context is not initialized\n");
923 	} else {
924 		bitmap_print_to_pagebuf(false, buf, pfvf->aura_bmap,
925 					pfvf->aura_ctx->qsize);
926 		seq_printf(m, "Aura count : %d\n", pfvf->aura_ctx->qsize);
927 		seq_printf(m, "Aura context ena/dis bitmap : %s\n", buf);
928 	}
929 
930 	if (!pfvf->pool_ctx) {
931 		seq_puts(m, "Pool context is not initialized\n");
932 	} else {
933 		bitmap_print_to_pagebuf(false, buf, pfvf->pool_bmap,
934 					pfvf->pool_ctx->qsize);
935 		seq_printf(m, "Pool count : %d\n", pfvf->pool_ctx->qsize);
936 		seq_printf(m, "Pool context ena/dis bitmap : %s\n", buf);
937 	}
938 	kfree(buf);
939 }
940 
941 /* The 'qsize' entry dumps current Aura/Pool context Qsize
942  * and each context's current enable/disable status in a bitmap.
943  */
rvu_dbg_qsize_display(struct seq_file * filp,void * unsused,int blktype)944 static int rvu_dbg_qsize_display(struct seq_file *filp, void *unsused,
945 				 int blktype)
946 {
947 	void (*print_qsize)(struct seq_file *filp,
948 			    struct rvu_pfvf *pfvf) = NULL;
949 	struct dentry *current_dir;
950 	struct rvu_pfvf *pfvf;
951 	struct rvu *rvu;
952 	int qsize_id;
953 	u16 pcifunc;
954 	int blkaddr;
955 
956 	rvu = filp->private;
957 	switch (blktype) {
958 	case BLKTYPE_NPA:
959 		qsize_id = rvu->rvu_dbg.npa_qsize_id;
960 		print_qsize = print_npa_qsize;
961 		break;
962 
963 	case BLKTYPE_NIX:
964 		qsize_id = rvu->rvu_dbg.nix_qsize_id;
965 		print_qsize = print_nix_qsize;
966 		break;
967 
968 	default:
969 		return -EINVAL;
970 	}
971 
972 	if (blktype == BLKTYPE_NPA) {
973 		blkaddr = BLKADDR_NPA;
974 	} else {
975 		current_dir = filp->file->f_path.dentry->d_parent;
976 		blkaddr = (!strcmp(current_dir->d_name.name, "nix1") ?
977 				   BLKADDR_NIX1 : BLKADDR_NIX0);
978 	}
979 
980 	if (!rvu_dbg_is_valid_lf(rvu, blkaddr, qsize_id, &pcifunc))
981 		return -EINVAL;
982 
983 	pfvf = rvu_get_pfvf(rvu, pcifunc);
984 	print_qsize(filp, pfvf);
985 
986 	return 0;
987 }
988 
rvu_dbg_qsize_write(struct file * filp,const char __user * buffer,size_t count,loff_t * ppos,int blktype)989 static ssize_t rvu_dbg_qsize_write(struct file *filp,
990 				   const char __user *buffer, size_t count,
991 				   loff_t *ppos, int blktype)
992 {
993 	char *blk_string = (blktype == BLKTYPE_NPA) ? "npa" : "nix";
994 	struct seq_file *seqfile = filp->private_data;
995 	char *cmd_buf, *cmd_buf_tmp, *subtoken;
996 	struct rvu *rvu = seqfile->private;
997 	struct dentry *current_dir;
998 	int blkaddr;
999 	u16 pcifunc;
1000 	int ret, lf;
1001 
1002 	cmd_buf = memdup_user_nul(buffer, count);
1003 	if (IS_ERR(cmd_buf))
1004 		return -ENOMEM;
1005 
1006 	cmd_buf_tmp = strchr(cmd_buf, '\n');
1007 	if (cmd_buf_tmp) {
1008 		*cmd_buf_tmp = '\0';
1009 		count = cmd_buf_tmp - cmd_buf + 1;
1010 	}
1011 
1012 	cmd_buf_tmp = cmd_buf;
1013 	subtoken = strsep(&cmd_buf, " ");
1014 	ret = subtoken ? kstrtoint(subtoken, 10, &lf) : -EINVAL;
1015 	if (cmd_buf)
1016 		ret = -EINVAL;
1017 
1018 	if (ret < 0 || !strncmp(subtoken, "help", 4)) {
1019 		dev_info(rvu->dev, "Use echo <%s-lf > qsize\n", blk_string);
1020 		goto qsize_write_done;
1021 	}
1022 
1023 	if (blktype == BLKTYPE_NPA) {
1024 		blkaddr = BLKADDR_NPA;
1025 	} else {
1026 		current_dir = filp->f_path.dentry->d_parent;
1027 		blkaddr = (!strcmp(current_dir->d_name.name, "nix1") ?
1028 				   BLKADDR_NIX1 : BLKADDR_NIX0);
1029 	}
1030 
1031 	if (!rvu_dbg_is_valid_lf(rvu, blkaddr, lf, &pcifunc)) {
1032 		ret = -EINVAL;
1033 		goto qsize_write_done;
1034 	}
1035 	if (blktype  == BLKTYPE_NPA)
1036 		rvu->rvu_dbg.npa_qsize_id = lf;
1037 	else
1038 		rvu->rvu_dbg.nix_qsize_id = lf;
1039 
1040 qsize_write_done:
1041 	kfree(cmd_buf_tmp);
1042 	return ret ? ret : count;
1043 }
1044 
rvu_dbg_npa_qsize_write(struct file * filp,const char __user * buffer,size_t count,loff_t * ppos)1045 static ssize_t rvu_dbg_npa_qsize_write(struct file *filp,
1046 				       const char __user *buffer,
1047 				       size_t count, loff_t *ppos)
1048 {
1049 	return rvu_dbg_qsize_write(filp, buffer, count, ppos,
1050 					    BLKTYPE_NPA);
1051 }
1052 
rvu_dbg_npa_qsize_display(struct seq_file * filp,void * unused)1053 static int rvu_dbg_npa_qsize_display(struct seq_file *filp, void *unused)
1054 {
1055 	return rvu_dbg_qsize_display(filp, unused, BLKTYPE_NPA);
1056 }
1057 
1058 RVU_DEBUG_SEQ_FOPS(npa_qsize, npa_qsize_display, npa_qsize_write);
1059 
1060 /* Dumps given NPA Aura's context */
print_npa_aura_ctx(struct seq_file * m,struct npa_aq_enq_rsp * rsp)1061 static void print_npa_aura_ctx(struct seq_file *m, struct npa_aq_enq_rsp *rsp)
1062 {
1063 	struct npa_aura_s *aura = &rsp->aura;
1064 	struct rvu *rvu = m->private;
1065 
1066 	seq_printf(m, "W0: Pool addr\t\t%llx\n", aura->pool_addr);
1067 
1068 	seq_printf(m, "W1: ena\t\t\t%d\nW1: pool caching\t%d\n",
1069 		   aura->ena, aura->pool_caching);
1070 	seq_printf(m, "W1: pool way mask\t%d\nW1: avg con\t\t%d\n",
1071 		   aura->pool_way_mask, aura->avg_con);
1072 	seq_printf(m, "W1: pool drop ena\t%d\nW1: aura drop ena\t%d\n",
1073 		   aura->pool_drop_ena, aura->aura_drop_ena);
1074 	seq_printf(m, "W1: bp_ena\t\t%d\nW1: aura drop\t\t%d\n",
1075 		   aura->bp_ena, aura->aura_drop);
1076 	seq_printf(m, "W1: aura shift\t\t%d\nW1: avg_level\t\t%d\n",
1077 		   aura->shift, aura->avg_level);
1078 
1079 	seq_printf(m, "W2: count\t\t%llu\nW2: nix0_bpid\t\t%d\nW2: nix1_bpid\t\t%d\n",
1080 		   (u64)aura->count, aura->nix0_bpid, aura->nix1_bpid);
1081 
1082 	seq_printf(m, "W3: limit\t\t%llu\nW3: bp\t\t\t%d\nW3: fc_ena\t\t%d\n",
1083 		   (u64)aura->limit, aura->bp, aura->fc_ena);
1084 
1085 	if (!is_rvu_otx2(rvu))
1086 		seq_printf(m, "W3: fc_be\t\t%d\n", aura->fc_be);
1087 	seq_printf(m, "W3: fc_up_crossing\t%d\nW3: fc_stype\t\t%d\n",
1088 		   aura->fc_up_crossing, aura->fc_stype);
1089 	seq_printf(m, "W3: fc_hyst_bits\t%d\n", aura->fc_hyst_bits);
1090 
1091 	seq_printf(m, "W4: fc_addr\t\t%llx\n", aura->fc_addr);
1092 
1093 	seq_printf(m, "W5: pool_drop\t\t%d\nW5: update_time\t\t%d\n",
1094 		   aura->pool_drop, aura->update_time);
1095 	seq_printf(m, "W5: err_int \t\t%d\nW5: err_int_ena\t\t%d\n",
1096 		   aura->err_int, aura->err_int_ena);
1097 	seq_printf(m, "W5: thresh_int\t\t%d\nW5: thresh_int_ena \t%d\n",
1098 		   aura->thresh_int, aura->thresh_int_ena);
1099 	seq_printf(m, "W5: thresh_up\t\t%d\nW5: thresh_qint_idx\t%d\n",
1100 		   aura->thresh_up, aura->thresh_qint_idx);
1101 	seq_printf(m, "W5: err_qint_idx \t%d\n", aura->err_qint_idx);
1102 
1103 	seq_printf(m, "W6: thresh\t\t%llu\n", (u64)aura->thresh);
1104 	if (!is_rvu_otx2(rvu))
1105 		seq_printf(m, "W6: fc_msh_dst\t\t%d\n", aura->fc_msh_dst);
1106 }
1107 
1108 /* Dumps given NPA Pool's context */
print_npa_pool_ctx(struct seq_file * m,struct npa_aq_enq_rsp * rsp)1109 static void print_npa_pool_ctx(struct seq_file *m, struct npa_aq_enq_rsp *rsp)
1110 {
1111 	struct npa_pool_s *pool = &rsp->pool;
1112 	struct rvu *rvu = m->private;
1113 
1114 	seq_printf(m, "W0: Stack base\t\t%llx\n", pool->stack_base);
1115 
1116 	seq_printf(m, "W1: ena \t\t%d\nW1: nat_align \t\t%d\n",
1117 		   pool->ena, pool->nat_align);
1118 	seq_printf(m, "W1: stack_caching\t%d\nW1: stack_way_mask\t%d\n",
1119 		   pool->stack_caching, pool->stack_way_mask);
1120 	seq_printf(m, "W1: buf_offset\t\t%d\nW1: buf_size\t\t%d\n",
1121 		   pool->buf_offset, pool->buf_size);
1122 
1123 	seq_printf(m, "W2: stack_max_pages \t%d\nW2: stack_pages\t\t%d\n",
1124 		   pool->stack_max_pages, pool->stack_pages);
1125 
1126 	seq_printf(m, "W3: op_pc \t\t%llu\n", (u64)pool->op_pc);
1127 
1128 	seq_printf(m, "W4: stack_offset\t%d\nW4: shift\t\t%d\nW4: avg_level\t\t%d\n",
1129 		   pool->stack_offset, pool->shift, pool->avg_level);
1130 	seq_printf(m, "W4: avg_con \t\t%d\nW4: fc_ena\t\t%d\nW4: fc_stype\t\t%d\n",
1131 		   pool->avg_con, pool->fc_ena, pool->fc_stype);
1132 	seq_printf(m, "W4: fc_hyst_bits\t%d\nW4: fc_up_crossing\t%d\n",
1133 		   pool->fc_hyst_bits, pool->fc_up_crossing);
1134 	if (!is_rvu_otx2(rvu))
1135 		seq_printf(m, "W4: fc_be\t\t%d\n", pool->fc_be);
1136 	seq_printf(m, "W4: update_time\t\t%d\n", pool->update_time);
1137 
1138 	seq_printf(m, "W5: fc_addr\t\t%llx\n", pool->fc_addr);
1139 
1140 	seq_printf(m, "W6: ptr_start\t\t%llx\n", pool->ptr_start);
1141 
1142 	seq_printf(m, "W7: ptr_end\t\t%llx\n", pool->ptr_end);
1143 
1144 	seq_printf(m, "W8: err_int\t\t%d\nW8: err_int_ena\t\t%d\n",
1145 		   pool->err_int, pool->err_int_ena);
1146 	seq_printf(m, "W8: thresh_int\t\t%d\n", pool->thresh_int);
1147 	seq_printf(m, "W8: thresh_int_ena\t%d\nW8: thresh_up\t\t%d\n",
1148 		   pool->thresh_int_ena, pool->thresh_up);
1149 	seq_printf(m, "W8: thresh_qint_idx\t%d\nW8: err_qint_idx\t%d\n",
1150 		   pool->thresh_qint_idx, pool->err_qint_idx);
1151 	if (!is_rvu_otx2(rvu))
1152 		seq_printf(m, "W8: fc_msh_dst\t\t%d\n", pool->fc_msh_dst);
1153 }
1154 
1155 /* Reads aura/pool's ctx from admin queue */
rvu_dbg_npa_ctx_display(struct seq_file * m,void * unused,int ctype)1156 static int rvu_dbg_npa_ctx_display(struct seq_file *m, void *unused, int ctype)
1157 {
1158 	void (*print_npa_ctx)(struct seq_file *m, struct npa_aq_enq_rsp *rsp);
1159 	struct npa_aq_enq_req aq_req;
1160 	struct npa_aq_enq_rsp rsp;
1161 	struct rvu_pfvf *pfvf;
1162 	int aura, rc, max_id;
1163 	int npalf, id, all;
1164 	struct rvu *rvu;
1165 	u16 pcifunc;
1166 
1167 	rvu = m->private;
1168 
1169 	switch (ctype) {
1170 	case NPA_AQ_CTYPE_AURA:
1171 		npalf = rvu->rvu_dbg.npa_aura_ctx.lf;
1172 		id = rvu->rvu_dbg.npa_aura_ctx.id;
1173 		all = rvu->rvu_dbg.npa_aura_ctx.all;
1174 		break;
1175 
1176 	case NPA_AQ_CTYPE_POOL:
1177 		npalf = rvu->rvu_dbg.npa_pool_ctx.lf;
1178 		id = rvu->rvu_dbg.npa_pool_ctx.id;
1179 		all = rvu->rvu_dbg.npa_pool_ctx.all;
1180 		break;
1181 	default:
1182 		return -EINVAL;
1183 	}
1184 
1185 	if (!rvu_dbg_is_valid_lf(rvu, BLKADDR_NPA, npalf, &pcifunc))
1186 		return -EINVAL;
1187 
1188 	pfvf = rvu_get_pfvf(rvu, pcifunc);
1189 	if (ctype == NPA_AQ_CTYPE_AURA && !pfvf->aura_ctx) {
1190 		seq_puts(m, "Aura context is not initialized\n");
1191 		return -EINVAL;
1192 	} else if (ctype == NPA_AQ_CTYPE_POOL && !pfvf->pool_ctx) {
1193 		seq_puts(m, "Pool context is not initialized\n");
1194 		return -EINVAL;
1195 	}
1196 
1197 	memset(&aq_req, 0, sizeof(struct npa_aq_enq_req));
1198 	aq_req.hdr.pcifunc = pcifunc;
1199 	aq_req.ctype = ctype;
1200 	aq_req.op = NPA_AQ_INSTOP_READ;
1201 	if (ctype == NPA_AQ_CTYPE_AURA) {
1202 		max_id = pfvf->aura_ctx->qsize;
1203 		print_npa_ctx = print_npa_aura_ctx;
1204 	} else {
1205 		max_id = pfvf->pool_ctx->qsize;
1206 		print_npa_ctx = print_npa_pool_ctx;
1207 	}
1208 
1209 	if (id < 0 || id >= max_id) {
1210 		seq_printf(m, "Invalid %s, valid range is 0-%d\n",
1211 			   (ctype == NPA_AQ_CTYPE_AURA) ? "aura" : "pool",
1212 			max_id - 1);
1213 		return -EINVAL;
1214 	}
1215 
1216 	if (all)
1217 		id = 0;
1218 	else
1219 		max_id = id + 1;
1220 
1221 	for (aura = id; aura < max_id; aura++) {
1222 		aq_req.aura_id = aura;
1223 
1224 		/* Skip if queue is uninitialized */
1225 		if (ctype == NPA_AQ_CTYPE_POOL && !test_bit(aura, pfvf->pool_bmap))
1226 			continue;
1227 
1228 		seq_printf(m, "======%s : %d=======\n",
1229 			   (ctype == NPA_AQ_CTYPE_AURA) ? "AURA" : "POOL",
1230 			aq_req.aura_id);
1231 		rc = rvu_npa_aq_enq_inst(rvu, &aq_req, &rsp);
1232 		if (rc) {
1233 			seq_puts(m, "Failed to read context\n");
1234 			return -EINVAL;
1235 		}
1236 		print_npa_ctx(m, &rsp);
1237 	}
1238 	return 0;
1239 }
1240 
write_npa_ctx(struct rvu * rvu,bool all,int npalf,int id,int ctype)1241 static int write_npa_ctx(struct rvu *rvu, bool all,
1242 			 int npalf, int id, int ctype)
1243 {
1244 	struct rvu_pfvf *pfvf;
1245 	int max_id = 0;
1246 	u16 pcifunc;
1247 
1248 	if (!rvu_dbg_is_valid_lf(rvu, BLKADDR_NPA, npalf, &pcifunc))
1249 		return -EINVAL;
1250 
1251 	pfvf = rvu_get_pfvf(rvu, pcifunc);
1252 
1253 	if (ctype == NPA_AQ_CTYPE_AURA) {
1254 		if (!pfvf->aura_ctx) {
1255 			dev_warn(rvu->dev, "Aura context is not initialized\n");
1256 			return -EINVAL;
1257 		}
1258 		max_id = pfvf->aura_ctx->qsize;
1259 	} else if (ctype == NPA_AQ_CTYPE_POOL) {
1260 		if (!pfvf->pool_ctx) {
1261 			dev_warn(rvu->dev, "Pool context is not initialized\n");
1262 			return -EINVAL;
1263 		}
1264 		max_id = pfvf->pool_ctx->qsize;
1265 	}
1266 
1267 	if (id < 0 || id >= max_id) {
1268 		dev_warn(rvu->dev, "Invalid %s, valid range is 0-%d\n",
1269 			 (ctype == NPA_AQ_CTYPE_AURA) ? "aura" : "pool",
1270 			max_id - 1);
1271 		return -EINVAL;
1272 	}
1273 
1274 	switch (ctype) {
1275 	case NPA_AQ_CTYPE_AURA:
1276 		rvu->rvu_dbg.npa_aura_ctx.lf = npalf;
1277 		rvu->rvu_dbg.npa_aura_ctx.id = id;
1278 		rvu->rvu_dbg.npa_aura_ctx.all = all;
1279 		break;
1280 
1281 	case NPA_AQ_CTYPE_POOL:
1282 		rvu->rvu_dbg.npa_pool_ctx.lf = npalf;
1283 		rvu->rvu_dbg.npa_pool_ctx.id = id;
1284 		rvu->rvu_dbg.npa_pool_ctx.all = all;
1285 		break;
1286 	default:
1287 		return -EINVAL;
1288 	}
1289 	return 0;
1290 }
1291 
parse_cmd_buffer_ctx(char * cmd_buf,size_t * count,const char __user * buffer,int * npalf,int * id,bool * all)1292 static int parse_cmd_buffer_ctx(char *cmd_buf, size_t *count,
1293 				const char __user *buffer, int *npalf,
1294 				int *id, bool *all)
1295 {
1296 	int bytes_not_copied;
1297 	char *cmd_buf_tmp;
1298 	char *subtoken;
1299 	int ret;
1300 
1301 	bytes_not_copied = copy_from_user(cmd_buf, buffer, *count);
1302 	if (bytes_not_copied)
1303 		return -EFAULT;
1304 
1305 	cmd_buf[*count] = '\0';
1306 	cmd_buf_tmp = strchr(cmd_buf, '\n');
1307 
1308 	if (cmd_buf_tmp) {
1309 		*cmd_buf_tmp = '\0';
1310 		*count = cmd_buf_tmp - cmd_buf + 1;
1311 	}
1312 
1313 	subtoken = strsep(&cmd_buf, " ");
1314 	ret = subtoken ? kstrtoint(subtoken, 10, npalf) : -EINVAL;
1315 	if (ret < 0)
1316 		return ret;
1317 	subtoken = strsep(&cmd_buf, " ");
1318 	if (subtoken && strcmp(subtoken, "all") == 0) {
1319 		*all = true;
1320 	} else {
1321 		ret = subtoken ? kstrtoint(subtoken, 10, id) : -EINVAL;
1322 		if (ret < 0)
1323 			return ret;
1324 	}
1325 	if (cmd_buf)
1326 		return -EINVAL;
1327 	return ret;
1328 }
1329 
rvu_dbg_npa_ctx_write(struct file * filp,const char __user * buffer,size_t count,loff_t * ppos,int ctype)1330 static ssize_t rvu_dbg_npa_ctx_write(struct file *filp,
1331 				     const char __user *buffer,
1332 				     size_t count, loff_t *ppos, int ctype)
1333 {
1334 	char *cmd_buf, *ctype_string = (ctype == NPA_AQ_CTYPE_AURA) ?
1335 					"aura" : "pool";
1336 	struct seq_file *seqfp = filp->private_data;
1337 	struct rvu *rvu = seqfp->private;
1338 	int npalf, id = 0, ret;
1339 	bool all = false;
1340 
1341 	if ((*ppos != 0) || !count)
1342 		return -EINVAL;
1343 
1344 	cmd_buf = kzalloc(count + 1, GFP_KERNEL);
1345 	if (!cmd_buf)
1346 		return count;
1347 	ret = parse_cmd_buffer_ctx(cmd_buf, &count, buffer,
1348 				   &npalf, &id, &all);
1349 	if (ret < 0) {
1350 		dev_info(rvu->dev,
1351 			 "Usage: echo <npalf> [%s number/all] > %s_ctx\n",
1352 			 ctype_string, ctype_string);
1353 		goto done;
1354 	} else {
1355 		ret = write_npa_ctx(rvu, all, npalf, id, ctype);
1356 	}
1357 done:
1358 	kfree(cmd_buf);
1359 	return ret ? ret : count;
1360 }
1361 
rvu_dbg_npa_aura_ctx_write(struct file * filp,const char __user * buffer,size_t count,loff_t * ppos)1362 static ssize_t rvu_dbg_npa_aura_ctx_write(struct file *filp,
1363 					  const char __user *buffer,
1364 					  size_t count, loff_t *ppos)
1365 {
1366 	return rvu_dbg_npa_ctx_write(filp, buffer, count, ppos,
1367 				     NPA_AQ_CTYPE_AURA);
1368 }
1369 
rvu_dbg_npa_aura_ctx_display(struct seq_file * filp,void * unused)1370 static int rvu_dbg_npa_aura_ctx_display(struct seq_file *filp, void *unused)
1371 {
1372 	return rvu_dbg_npa_ctx_display(filp, unused, NPA_AQ_CTYPE_AURA);
1373 }
1374 
1375 RVU_DEBUG_SEQ_FOPS(npa_aura_ctx, npa_aura_ctx_display, npa_aura_ctx_write);
1376 
rvu_dbg_npa_pool_ctx_write(struct file * filp,const char __user * buffer,size_t count,loff_t * ppos)1377 static ssize_t rvu_dbg_npa_pool_ctx_write(struct file *filp,
1378 					  const char __user *buffer,
1379 					  size_t count, loff_t *ppos)
1380 {
1381 	return rvu_dbg_npa_ctx_write(filp, buffer, count, ppos,
1382 				     NPA_AQ_CTYPE_POOL);
1383 }
1384 
rvu_dbg_npa_pool_ctx_display(struct seq_file * filp,void * unused)1385 static int rvu_dbg_npa_pool_ctx_display(struct seq_file *filp, void *unused)
1386 {
1387 	return rvu_dbg_npa_ctx_display(filp, unused, NPA_AQ_CTYPE_POOL);
1388 }
1389 
1390 RVU_DEBUG_SEQ_FOPS(npa_pool_ctx, npa_pool_ctx_display, npa_pool_ctx_write);
1391 
ndc_cache_stats(struct seq_file * s,int blk_addr,int ctype,int transaction)1392 static void ndc_cache_stats(struct seq_file *s, int blk_addr,
1393 			    int ctype, int transaction)
1394 {
1395 	u64 req, out_req, lat, cant_alloc;
1396 	struct nix_hw *nix_hw;
1397 	struct rvu *rvu;
1398 	int port;
1399 
1400 	if (blk_addr == BLKADDR_NDC_NPA0) {
1401 		rvu = s->private;
1402 	} else {
1403 		nix_hw = s->private;
1404 		rvu = nix_hw->rvu;
1405 	}
1406 
1407 	for (port = 0; port < NDC_MAX_PORT; port++) {
1408 		req = rvu_read64(rvu, blk_addr, NDC_AF_PORTX_RTX_RWX_REQ_PC
1409 						(port, ctype, transaction));
1410 		lat = rvu_read64(rvu, blk_addr, NDC_AF_PORTX_RTX_RWX_LAT_PC
1411 						(port, ctype, transaction));
1412 		out_req = rvu_read64(rvu, blk_addr,
1413 				     NDC_AF_PORTX_RTX_RWX_OSTDN_PC
1414 				     (port, ctype, transaction));
1415 		cant_alloc = rvu_read64(rvu, blk_addr,
1416 					NDC_AF_PORTX_RTX_CANT_ALLOC_PC
1417 					(port, transaction));
1418 		seq_printf(s, "\nPort:%d\n", port);
1419 		seq_printf(s, "\tTotal Requests:\t\t%lld\n", req);
1420 		seq_printf(s, "\tTotal Time Taken:\t%lld cycles\n", lat);
1421 		seq_printf(s, "\tAvg Latency:\t\t%lld cycles\n", lat / req);
1422 		seq_printf(s, "\tOutstanding Requests:\t%lld\n", out_req);
1423 		seq_printf(s, "\tCant Alloc Requests:\t%lld\n", cant_alloc);
1424 	}
1425 }
1426 
ndc_blk_cache_stats(struct seq_file * s,int idx,int blk_addr)1427 static int ndc_blk_cache_stats(struct seq_file *s, int idx, int blk_addr)
1428 {
1429 	seq_puts(s, "\n***** CACHE mode read stats *****\n");
1430 	ndc_cache_stats(s, blk_addr, CACHING, NDC_READ_TRANS);
1431 	seq_puts(s, "\n***** CACHE mode write stats *****\n");
1432 	ndc_cache_stats(s, blk_addr, CACHING, NDC_WRITE_TRANS);
1433 	seq_puts(s, "\n***** BY-PASS mode read stats *****\n");
1434 	ndc_cache_stats(s, blk_addr, BYPASS, NDC_READ_TRANS);
1435 	seq_puts(s, "\n***** BY-PASS mode write stats *****\n");
1436 	ndc_cache_stats(s, blk_addr, BYPASS, NDC_WRITE_TRANS);
1437 	return 0;
1438 }
1439 
rvu_dbg_npa_ndc_cache_display(struct seq_file * filp,void * unused)1440 static int rvu_dbg_npa_ndc_cache_display(struct seq_file *filp, void *unused)
1441 {
1442 	return ndc_blk_cache_stats(filp, NPA0_U, BLKADDR_NDC_NPA0);
1443 }
1444 
1445 RVU_DEBUG_SEQ_FOPS(npa_ndc_cache, npa_ndc_cache_display, NULL);
1446 
ndc_blk_hits_miss_stats(struct seq_file * s,int idx,int blk_addr)1447 static int ndc_blk_hits_miss_stats(struct seq_file *s, int idx, int blk_addr)
1448 {
1449 	struct nix_hw *nix_hw;
1450 	struct rvu *rvu;
1451 	int bank, max_bank;
1452 	u64 ndc_af_const;
1453 
1454 	if (blk_addr == BLKADDR_NDC_NPA0) {
1455 		rvu = s->private;
1456 	} else {
1457 		nix_hw = s->private;
1458 		rvu = nix_hw->rvu;
1459 	}
1460 
1461 	ndc_af_const = rvu_read64(rvu, blk_addr, NDC_AF_CONST);
1462 	max_bank = FIELD_GET(NDC_AF_BANK_MASK, ndc_af_const);
1463 	for (bank = 0; bank < max_bank; bank++) {
1464 		seq_printf(s, "BANK:%d\n", bank);
1465 		seq_printf(s, "\tHits:\t%lld\n",
1466 			   (u64)rvu_read64(rvu, blk_addr,
1467 			   NDC_AF_BANKX_HIT_PC(bank)));
1468 		seq_printf(s, "\tMiss:\t%lld\n",
1469 			   (u64)rvu_read64(rvu, blk_addr,
1470 			    NDC_AF_BANKX_MISS_PC(bank)));
1471 	}
1472 	return 0;
1473 }
1474 
rvu_dbg_nix_ndc_rx_cache_display(struct seq_file * filp,void * unused)1475 static int rvu_dbg_nix_ndc_rx_cache_display(struct seq_file *filp, void *unused)
1476 {
1477 	struct nix_hw *nix_hw = filp->private;
1478 	int blkaddr = 0;
1479 	int ndc_idx = 0;
1480 
1481 	blkaddr = (nix_hw->blkaddr == BLKADDR_NIX1 ?
1482 		   BLKADDR_NDC_NIX1_RX : BLKADDR_NDC_NIX0_RX);
1483 	ndc_idx = (nix_hw->blkaddr == BLKADDR_NIX1 ? NIX1_RX : NIX0_RX);
1484 
1485 	return ndc_blk_cache_stats(filp, ndc_idx, blkaddr);
1486 }
1487 
1488 RVU_DEBUG_SEQ_FOPS(nix_ndc_rx_cache, nix_ndc_rx_cache_display, NULL);
1489 
rvu_dbg_nix_ndc_tx_cache_display(struct seq_file * filp,void * unused)1490 static int rvu_dbg_nix_ndc_tx_cache_display(struct seq_file *filp, void *unused)
1491 {
1492 	struct nix_hw *nix_hw = filp->private;
1493 	int blkaddr = 0;
1494 	int ndc_idx = 0;
1495 
1496 	blkaddr = (nix_hw->blkaddr == BLKADDR_NIX1 ?
1497 		   BLKADDR_NDC_NIX1_TX : BLKADDR_NDC_NIX0_TX);
1498 	ndc_idx = (nix_hw->blkaddr == BLKADDR_NIX1 ? NIX1_TX : NIX0_TX);
1499 
1500 	return ndc_blk_cache_stats(filp, ndc_idx, blkaddr);
1501 }
1502 
1503 RVU_DEBUG_SEQ_FOPS(nix_ndc_tx_cache, nix_ndc_tx_cache_display, NULL);
1504 
rvu_dbg_npa_ndc_hits_miss_display(struct seq_file * filp,void * unused)1505 static int rvu_dbg_npa_ndc_hits_miss_display(struct seq_file *filp,
1506 					     void *unused)
1507 {
1508 	return ndc_blk_hits_miss_stats(filp, NPA0_U, BLKADDR_NDC_NPA0);
1509 }
1510 
1511 RVU_DEBUG_SEQ_FOPS(npa_ndc_hits_miss, npa_ndc_hits_miss_display, NULL);
1512 
rvu_dbg_nix_ndc_rx_hits_miss_display(struct seq_file * filp,void * unused)1513 static int rvu_dbg_nix_ndc_rx_hits_miss_display(struct seq_file *filp,
1514 						void *unused)
1515 {
1516 	struct nix_hw *nix_hw = filp->private;
1517 	int ndc_idx = NPA0_U;
1518 	int blkaddr = 0;
1519 
1520 	blkaddr = (nix_hw->blkaddr == BLKADDR_NIX1 ?
1521 		   BLKADDR_NDC_NIX1_RX : BLKADDR_NDC_NIX0_RX);
1522 
1523 	return ndc_blk_hits_miss_stats(filp, ndc_idx, blkaddr);
1524 }
1525 
1526 RVU_DEBUG_SEQ_FOPS(nix_ndc_rx_hits_miss, nix_ndc_rx_hits_miss_display, NULL);
1527 
rvu_dbg_nix_ndc_tx_hits_miss_display(struct seq_file * filp,void * unused)1528 static int rvu_dbg_nix_ndc_tx_hits_miss_display(struct seq_file *filp,
1529 						void *unused)
1530 {
1531 	struct nix_hw *nix_hw = filp->private;
1532 	int ndc_idx = NPA0_U;
1533 	int blkaddr = 0;
1534 
1535 	blkaddr = (nix_hw->blkaddr == BLKADDR_NIX1 ?
1536 		   BLKADDR_NDC_NIX1_TX : BLKADDR_NDC_NIX0_TX);
1537 
1538 	return ndc_blk_hits_miss_stats(filp, ndc_idx, blkaddr);
1539 }
1540 
1541 RVU_DEBUG_SEQ_FOPS(nix_ndc_tx_hits_miss, nix_ndc_tx_hits_miss_display, NULL);
1542 
print_nix_cn10k_sq_ctx(struct seq_file * m,struct nix_cn10k_sq_ctx_s * sq_ctx)1543 static void print_nix_cn10k_sq_ctx(struct seq_file *m,
1544 				   struct nix_cn10k_sq_ctx_s *sq_ctx)
1545 {
1546 	seq_printf(m, "W0: ena \t\t\t%d\nW0: qint_idx \t\t\t%d\n",
1547 		   sq_ctx->ena, sq_ctx->qint_idx);
1548 	seq_printf(m, "W0: substream \t\t\t0x%03x\nW0: sdp_mcast \t\t\t%d\n",
1549 		   sq_ctx->substream, sq_ctx->sdp_mcast);
1550 	seq_printf(m, "W0: cq \t\t\t\t%d\nW0: sqe_way_mask \t\t%d\n\n",
1551 		   sq_ctx->cq, sq_ctx->sqe_way_mask);
1552 
1553 	seq_printf(m, "W1: smq \t\t\t%d\nW1: cq_ena \t\t\t%d\nW1: xoff\t\t\t%d\n",
1554 		   sq_ctx->smq, sq_ctx->cq_ena, sq_ctx->xoff);
1555 	seq_printf(m, "W1: sso_ena \t\t\t%d\nW1: smq_rr_weight\t\t%d\n",
1556 		   sq_ctx->sso_ena, sq_ctx->smq_rr_weight);
1557 	seq_printf(m, "W1: default_chan\t\t%d\nW1: sqb_count\t\t\t%d\n\n",
1558 		   sq_ctx->default_chan, sq_ctx->sqb_count);
1559 
1560 	seq_printf(m, "W2: smq_rr_count_lb \t\t%d\n", sq_ctx->smq_rr_count_lb);
1561 	seq_printf(m, "W2: smq_rr_count_ub \t\t%d\n", sq_ctx->smq_rr_count_ub);
1562 	seq_printf(m, "W2: sqb_aura \t\t\t%d\nW2: sq_int \t\t\t%d\n",
1563 		   sq_ctx->sqb_aura, sq_ctx->sq_int);
1564 	seq_printf(m, "W2: sq_int_ena \t\t\t%d\nW2: sqe_stype \t\t\t%d\n",
1565 		   sq_ctx->sq_int_ena, sq_ctx->sqe_stype);
1566 
1567 	seq_printf(m, "W3: max_sqe_size\t\t%d\nW3: cq_limit\t\t\t%d\n",
1568 		   sq_ctx->max_sqe_size, sq_ctx->cq_limit);
1569 	seq_printf(m, "W3: lmt_dis \t\t\t%d\nW3: mnq_dis \t\t\t%d\n",
1570 		   sq_ctx->mnq_dis, sq_ctx->lmt_dis);
1571 	seq_printf(m, "W3: smq_next_sq\t\t\t%d\nW3: smq_lso_segnum\t\t%d\n",
1572 		   sq_ctx->smq_next_sq, sq_ctx->smq_lso_segnum);
1573 	seq_printf(m, "W3: tail_offset \t\t%d\nW3: smenq_offset\t\t%d\n",
1574 		   sq_ctx->tail_offset, sq_ctx->smenq_offset);
1575 	seq_printf(m, "W3: head_offset\t\t\t%d\nW3: smenq_next_sqb_vld\t\t%d\n\n",
1576 		   sq_ctx->head_offset, sq_ctx->smenq_next_sqb_vld);
1577 
1578 	seq_printf(m, "W3: smq_next_sq_vld\t\t%d\nW3: smq_pend\t\t\t%d\n",
1579 		   sq_ctx->smq_next_sq_vld, sq_ctx->smq_pend);
1580 	seq_printf(m, "W4: next_sqb \t\t\t%llx\n\n", sq_ctx->next_sqb);
1581 	seq_printf(m, "W5: tail_sqb \t\t\t%llx\n\n", sq_ctx->tail_sqb);
1582 	seq_printf(m, "W6: smenq_sqb \t\t\t%llx\n\n", sq_ctx->smenq_sqb);
1583 	seq_printf(m, "W7: smenq_next_sqb \t\t%llx\n\n",
1584 		   sq_ctx->smenq_next_sqb);
1585 
1586 	seq_printf(m, "W8: head_sqb\t\t\t%llx\n\n", sq_ctx->head_sqb);
1587 
1588 	seq_printf(m, "W9: vfi_lso_total\t\t%d\n", sq_ctx->vfi_lso_total);
1589 	seq_printf(m, "W9: vfi_lso_sizem1\t\t%d\nW9: vfi_lso_sb\t\t\t%d\n",
1590 		   sq_ctx->vfi_lso_sizem1, sq_ctx->vfi_lso_sb);
1591 	seq_printf(m, "W9: vfi_lso_mps\t\t\t%d\nW9: vfi_lso_vlan0_ins_ena\t%d\n",
1592 		   sq_ctx->vfi_lso_mps, sq_ctx->vfi_lso_vlan0_ins_ena);
1593 	seq_printf(m, "W9: vfi_lso_vlan1_ins_ena\t%d\nW9: vfi_lso_vld \t\t%d\n\n",
1594 		   sq_ctx->vfi_lso_vld, sq_ctx->vfi_lso_vlan1_ins_ena);
1595 
1596 	seq_printf(m, "W10: scm_lso_rem \t\t%llu\n\n",
1597 		   (u64)sq_ctx->scm_lso_rem);
1598 	seq_printf(m, "W11: octs \t\t\t%llu\n\n", (u64)sq_ctx->octs);
1599 	seq_printf(m, "W12: pkts \t\t\t%llu\n\n", (u64)sq_ctx->pkts);
1600 	seq_printf(m, "W14: dropped_octs \t\t%llu\n\n",
1601 		   (u64)sq_ctx->dropped_octs);
1602 	seq_printf(m, "W15: dropped_pkts \t\t%llu\n\n",
1603 		   (u64)sq_ctx->dropped_pkts);
1604 }
1605 
1606 /* Dumps given nix_sq's context */
print_nix_sq_ctx(struct seq_file * m,struct nix_aq_enq_rsp * rsp)1607 static void print_nix_sq_ctx(struct seq_file *m, struct nix_aq_enq_rsp *rsp)
1608 {
1609 	struct nix_sq_ctx_s *sq_ctx = &rsp->sq;
1610 	struct nix_hw *nix_hw = m->private;
1611 	struct rvu *rvu = nix_hw->rvu;
1612 
1613 	if (!is_rvu_otx2(rvu)) {
1614 		print_nix_cn10k_sq_ctx(m, (struct nix_cn10k_sq_ctx_s *)sq_ctx);
1615 		return;
1616 	}
1617 	seq_printf(m, "W0: sqe_way_mask \t\t%d\nW0: cq \t\t\t\t%d\n",
1618 		   sq_ctx->sqe_way_mask, sq_ctx->cq);
1619 	seq_printf(m, "W0: sdp_mcast \t\t\t%d\nW0: substream \t\t\t0x%03x\n",
1620 		   sq_ctx->sdp_mcast, sq_ctx->substream);
1621 	seq_printf(m, "W0: qint_idx \t\t\t%d\nW0: ena \t\t\t%d\n\n",
1622 		   sq_ctx->qint_idx, sq_ctx->ena);
1623 
1624 	seq_printf(m, "W1: sqb_count \t\t\t%d\nW1: default_chan \t\t%d\n",
1625 		   sq_ctx->sqb_count, sq_ctx->default_chan);
1626 	seq_printf(m, "W1: smq_rr_quantum \t\t%d\nW1: sso_ena \t\t\t%d\n",
1627 		   sq_ctx->smq_rr_quantum, sq_ctx->sso_ena);
1628 	seq_printf(m, "W1: xoff \t\t\t%d\nW1: cq_ena \t\t\t%d\nW1: smq\t\t\t\t%d\n\n",
1629 		   sq_ctx->xoff, sq_ctx->cq_ena, sq_ctx->smq);
1630 
1631 	seq_printf(m, "W2: sqe_stype \t\t\t%d\nW2: sq_int_ena \t\t\t%d\n",
1632 		   sq_ctx->sqe_stype, sq_ctx->sq_int_ena);
1633 	seq_printf(m, "W2: sq_int \t\t\t%d\nW2: sqb_aura \t\t\t%d\n",
1634 		   sq_ctx->sq_int, sq_ctx->sqb_aura);
1635 	seq_printf(m, "W2: smq_rr_count \t\t%d\n\n", sq_ctx->smq_rr_count);
1636 
1637 	seq_printf(m, "W3: smq_next_sq_vld\t\t%d\nW3: smq_pend\t\t\t%d\n",
1638 		   sq_ctx->smq_next_sq_vld, sq_ctx->smq_pend);
1639 	seq_printf(m, "W3: smenq_next_sqb_vld \t\t%d\nW3: head_offset\t\t\t%d\n",
1640 		   sq_ctx->smenq_next_sqb_vld, sq_ctx->head_offset);
1641 	seq_printf(m, "W3: smenq_offset\t\t%d\nW3: tail_offset\t\t\t%d\n",
1642 		   sq_ctx->smenq_offset, sq_ctx->tail_offset);
1643 	seq_printf(m, "W3: smq_lso_segnum \t\t%d\nW3: smq_next_sq\t\t\t%d\n",
1644 		   sq_ctx->smq_lso_segnum, sq_ctx->smq_next_sq);
1645 	seq_printf(m, "W3: mnq_dis \t\t\t%d\nW3: lmt_dis \t\t\t%d\n",
1646 		   sq_ctx->mnq_dis, sq_ctx->lmt_dis);
1647 	seq_printf(m, "W3: cq_limit\t\t\t%d\nW3: max_sqe_size\t\t%d\n\n",
1648 		   sq_ctx->cq_limit, sq_ctx->max_sqe_size);
1649 
1650 	seq_printf(m, "W4: next_sqb \t\t\t%llx\n\n", sq_ctx->next_sqb);
1651 	seq_printf(m, "W5: tail_sqb \t\t\t%llx\n\n", sq_ctx->tail_sqb);
1652 	seq_printf(m, "W6: smenq_sqb \t\t\t%llx\n\n", sq_ctx->smenq_sqb);
1653 	seq_printf(m, "W7: smenq_next_sqb \t\t%llx\n\n",
1654 		   sq_ctx->smenq_next_sqb);
1655 
1656 	seq_printf(m, "W8: head_sqb\t\t\t%llx\n\n", sq_ctx->head_sqb);
1657 
1658 	seq_printf(m, "W9: vfi_lso_vld\t\t\t%d\nW9: vfi_lso_vlan1_ins_ena\t%d\n",
1659 		   sq_ctx->vfi_lso_vld, sq_ctx->vfi_lso_vlan1_ins_ena);
1660 	seq_printf(m, "W9: vfi_lso_vlan0_ins_ena\t%d\nW9: vfi_lso_mps\t\t\t%d\n",
1661 		   sq_ctx->vfi_lso_vlan0_ins_ena, sq_ctx->vfi_lso_mps);
1662 	seq_printf(m, "W9: vfi_lso_sb\t\t\t%d\nW9: vfi_lso_sizem1\t\t%d\n",
1663 		   sq_ctx->vfi_lso_sb, sq_ctx->vfi_lso_sizem1);
1664 	seq_printf(m, "W9: vfi_lso_total\t\t%d\n\n", sq_ctx->vfi_lso_total);
1665 
1666 	seq_printf(m, "W10: scm_lso_rem \t\t%llu\n\n",
1667 		   (u64)sq_ctx->scm_lso_rem);
1668 	seq_printf(m, "W11: octs \t\t\t%llu\n\n", (u64)sq_ctx->octs);
1669 	seq_printf(m, "W12: pkts \t\t\t%llu\n\n", (u64)sq_ctx->pkts);
1670 	seq_printf(m, "W14: dropped_octs \t\t%llu\n\n",
1671 		   (u64)sq_ctx->dropped_octs);
1672 	seq_printf(m, "W15: dropped_pkts \t\t%llu\n\n",
1673 		   (u64)sq_ctx->dropped_pkts);
1674 }
1675 
print_nix_cn10k_rq_ctx(struct seq_file * m,struct nix_cn10k_rq_ctx_s * rq_ctx)1676 static void print_nix_cn10k_rq_ctx(struct seq_file *m,
1677 				   struct nix_cn10k_rq_ctx_s *rq_ctx)
1678 {
1679 	seq_printf(m, "W0: ena \t\t\t%d\nW0: sso_ena \t\t\t%d\n",
1680 		   rq_ctx->ena, rq_ctx->sso_ena);
1681 	seq_printf(m, "W0: ipsech_ena \t\t\t%d\nW0: ena_wqwd \t\t\t%d\n",
1682 		   rq_ctx->ipsech_ena, rq_ctx->ena_wqwd);
1683 	seq_printf(m, "W0: cq \t\t\t\t%d\nW0: lenerr_dis \t\t\t%d\n",
1684 		   rq_ctx->cq, rq_ctx->lenerr_dis);
1685 	seq_printf(m, "W0: csum_il4_dis \t\t%d\nW0: csum_ol4_dis \t\t%d\n",
1686 		   rq_ctx->csum_il4_dis, rq_ctx->csum_ol4_dis);
1687 	seq_printf(m, "W0: len_il4_dis \t\t%d\nW0: len_il3_dis \t\t%d\n",
1688 		   rq_ctx->len_il4_dis, rq_ctx->len_il3_dis);
1689 	seq_printf(m, "W0: len_ol4_dis \t\t%d\nW0: len_ol3_dis \t\t%d\n",
1690 		   rq_ctx->len_ol4_dis, rq_ctx->len_ol3_dis);
1691 	seq_printf(m, "W0: wqe_aura \t\t\t%d\n\n", rq_ctx->wqe_aura);
1692 
1693 	seq_printf(m, "W1: spb_aura \t\t\t%d\nW1: lpb_aura \t\t\t%d\n",
1694 		   rq_ctx->spb_aura, rq_ctx->lpb_aura);
1695 	seq_printf(m, "W1: spb_aura \t\t\t%d\n", rq_ctx->spb_aura);
1696 	seq_printf(m, "W1: sso_grp \t\t\t%d\nW1: sso_tt \t\t\t%d\n",
1697 		   rq_ctx->sso_grp, rq_ctx->sso_tt);
1698 	seq_printf(m, "W1: pb_caching \t\t\t%d\nW1: wqe_caching \t\t%d\n",
1699 		   rq_ctx->pb_caching, rq_ctx->wqe_caching);
1700 	seq_printf(m, "W1: xqe_drop_ena \t\t%d\nW1: spb_drop_ena \t\t%d\n",
1701 		   rq_ctx->xqe_drop_ena, rq_ctx->spb_drop_ena);
1702 	seq_printf(m, "W1: lpb_drop_ena \t\t%d\nW1: pb_stashing \t\t%d\n",
1703 		   rq_ctx->lpb_drop_ena, rq_ctx->pb_stashing);
1704 	seq_printf(m, "W1: ipsecd_drop_ena \t\t%d\nW1: chi_ena \t\t\t%d\n\n",
1705 		   rq_ctx->ipsecd_drop_ena, rq_ctx->chi_ena);
1706 
1707 	seq_printf(m, "W2: band_prof_id \t\t%d\n", rq_ctx->band_prof_id);
1708 	seq_printf(m, "W2: policer_ena \t\t%d\n", rq_ctx->policer_ena);
1709 	seq_printf(m, "W2: spb_sizem1 \t\t\t%d\n", rq_ctx->spb_sizem1);
1710 	seq_printf(m, "W2: wqe_skip \t\t\t%d\nW2: sqb_ena \t\t\t%d\n",
1711 		   rq_ctx->wqe_skip, rq_ctx->spb_ena);
1712 	seq_printf(m, "W2: lpb_size1 \t\t\t%d\nW2: first_skip \t\t\t%d\n",
1713 		   rq_ctx->lpb_sizem1, rq_ctx->first_skip);
1714 	seq_printf(m, "W2: later_skip\t\t\t%d\nW2: xqe_imm_size\t\t%d\n",
1715 		   rq_ctx->later_skip, rq_ctx->xqe_imm_size);
1716 	seq_printf(m, "W2: xqe_imm_copy \t\t%d\nW2: xqe_hdr_split \t\t%d\n\n",
1717 		   rq_ctx->xqe_imm_copy, rq_ctx->xqe_hdr_split);
1718 
1719 	seq_printf(m, "W3: xqe_drop \t\t\t%d\nW3: xqe_pass \t\t\t%d\n",
1720 		   rq_ctx->xqe_drop, rq_ctx->xqe_pass);
1721 	seq_printf(m, "W3: wqe_pool_drop \t\t%d\nW3: wqe_pool_pass \t\t%d\n",
1722 		   rq_ctx->wqe_pool_drop, rq_ctx->wqe_pool_pass);
1723 	seq_printf(m, "W3: spb_pool_drop \t\t%d\nW3: spb_pool_pass \t\t%d\n",
1724 		   rq_ctx->spb_pool_drop, rq_ctx->spb_pool_pass);
1725 	seq_printf(m, "W3: spb_aura_drop \t\t%d\nW3: spb_aura_pass \t\t%d\n\n",
1726 		   rq_ctx->spb_aura_pass, rq_ctx->spb_aura_drop);
1727 
1728 	seq_printf(m, "W4: lpb_aura_drop \t\t%d\nW3: lpb_aura_pass \t\t%d\n",
1729 		   rq_ctx->lpb_aura_pass, rq_ctx->lpb_aura_drop);
1730 	seq_printf(m, "W4: lpb_pool_drop \t\t%d\nW3: lpb_pool_pass \t\t%d\n",
1731 		   rq_ctx->lpb_pool_drop, rq_ctx->lpb_pool_pass);
1732 	seq_printf(m, "W4: rq_int \t\t\t%d\nW4: rq_int_ena\t\t\t%d\n",
1733 		   rq_ctx->rq_int, rq_ctx->rq_int_ena);
1734 	seq_printf(m, "W4: qint_idx \t\t\t%d\n\n", rq_ctx->qint_idx);
1735 
1736 	seq_printf(m, "W5: ltag \t\t\t%d\nW5: good_utag \t\t\t%d\n",
1737 		   rq_ctx->ltag, rq_ctx->good_utag);
1738 	seq_printf(m, "W5: bad_utag \t\t\t%d\nW5: flow_tagw \t\t\t%d\n",
1739 		   rq_ctx->bad_utag, rq_ctx->flow_tagw);
1740 	seq_printf(m, "W5: ipsec_vwqe \t\t\t%d\nW5: vwqe_ena \t\t\t%d\n",
1741 		   rq_ctx->ipsec_vwqe, rq_ctx->vwqe_ena);
1742 	seq_printf(m, "W5: vwqe_wait \t\t\t%d\nW5: max_vsize_exp\t\t%d\n",
1743 		   rq_ctx->vwqe_wait, rq_ctx->max_vsize_exp);
1744 	seq_printf(m, "W5: vwqe_skip \t\t\t%d\n\n", rq_ctx->vwqe_skip);
1745 
1746 	seq_printf(m, "W6: octs \t\t\t%llu\n\n", (u64)rq_ctx->octs);
1747 	seq_printf(m, "W7: pkts \t\t\t%llu\n\n", (u64)rq_ctx->pkts);
1748 	seq_printf(m, "W8: drop_octs \t\t\t%llu\n\n", (u64)rq_ctx->drop_octs);
1749 	seq_printf(m, "W9: drop_pkts \t\t\t%llu\n\n", (u64)rq_ctx->drop_pkts);
1750 	seq_printf(m, "W10: re_pkts \t\t\t%llu\n", (u64)rq_ctx->re_pkts);
1751 }
1752 
1753 /* Dumps given nix_rq's context */
print_nix_rq_ctx(struct seq_file * m,struct nix_aq_enq_rsp * rsp)1754 static void print_nix_rq_ctx(struct seq_file *m, struct nix_aq_enq_rsp *rsp)
1755 {
1756 	struct nix_rq_ctx_s *rq_ctx = &rsp->rq;
1757 	struct nix_hw *nix_hw = m->private;
1758 	struct rvu *rvu = nix_hw->rvu;
1759 
1760 	if (!is_rvu_otx2(rvu)) {
1761 		print_nix_cn10k_rq_ctx(m, (struct nix_cn10k_rq_ctx_s *)rq_ctx);
1762 		return;
1763 	}
1764 
1765 	seq_printf(m, "W0: wqe_aura \t\t\t%d\nW0: substream \t\t\t0x%03x\n",
1766 		   rq_ctx->wqe_aura, rq_ctx->substream);
1767 	seq_printf(m, "W0: cq \t\t\t\t%d\nW0: ena_wqwd \t\t\t%d\n",
1768 		   rq_ctx->cq, rq_ctx->ena_wqwd);
1769 	seq_printf(m, "W0: ipsech_ena \t\t\t%d\nW0: sso_ena \t\t\t%d\n",
1770 		   rq_ctx->ipsech_ena, rq_ctx->sso_ena);
1771 	seq_printf(m, "W0: ena \t\t\t%d\n\n", rq_ctx->ena);
1772 
1773 	seq_printf(m, "W1: lpb_drop_ena \t\t%d\nW1: spb_drop_ena \t\t%d\n",
1774 		   rq_ctx->lpb_drop_ena, rq_ctx->spb_drop_ena);
1775 	seq_printf(m, "W1: xqe_drop_ena \t\t%d\nW1: wqe_caching \t\t%d\n",
1776 		   rq_ctx->xqe_drop_ena, rq_ctx->wqe_caching);
1777 	seq_printf(m, "W1: pb_caching \t\t\t%d\nW1: sso_tt \t\t\t%d\n",
1778 		   rq_ctx->pb_caching, rq_ctx->sso_tt);
1779 	seq_printf(m, "W1: sso_grp \t\t\t%d\nW1: lpb_aura \t\t\t%d\n",
1780 		   rq_ctx->sso_grp, rq_ctx->lpb_aura);
1781 	seq_printf(m, "W1: spb_aura \t\t\t%d\n\n", rq_ctx->spb_aura);
1782 
1783 	seq_printf(m, "W2: xqe_hdr_split \t\t%d\nW2: xqe_imm_copy \t\t%d\n",
1784 		   rq_ctx->xqe_hdr_split, rq_ctx->xqe_imm_copy);
1785 	seq_printf(m, "W2: xqe_imm_size \t\t%d\nW2: later_skip \t\t\t%d\n",
1786 		   rq_ctx->xqe_imm_size, rq_ctx->later_skip);
1787 	seq_printf(m, "W2: first_skip \t\t\t%d\nW2: lpb_sizem1 \t\t\t%d\n",
1788 		   rq_ctx->first_skip, rq_ctx->lpb_sizem1);
1789 	seq_printf(m, "W2: spb_ena \t\t\t%d\nW2: wqe_skip \t\t\t%d\n",
1790 		   rq_ctx->spb_ena, rq_ctx->wqe_skip);
1791 	seq_printf(m, "W2: spb_sizem1 \t\t\t%d\n\n", rq_ctx->spb_sizem1);
1792 
1793 	seq_printf(m, "W3: spb_pool_pass \t\t%d\nW3: spb_pool_drop \t\t%d\n",
1794 		   rq_ctx->spb_pool_pass, rq_ctx->spb_pool_drop);
1795 	seq_printf(m, "W3: spb_aura_pass \t\t%d\nW3: spb_aura_drop \t\t%d\n",
1796 		   rq_ctx->spb_aura_pass, rq_ctx->spb_aura_drop);
1797 	seq_printf(m, "W3: wqe_pool_pass \t\t%d\nW3: wqe_pool_drop \t\t%d\n",
1798 		   rq_ctx->wqe_pool_pass, rq_ctx->wqe_pool_drop);
1799 	seq_printf(m, "W3: xqe_pass \t\t\t%d\nW3: xqe_drop \t\t\t%d\n\n",
1800 		   rq_ctx->xqe_pass, rq_ctx->xqe_drop);
1801 
1802 	seq_printf(m, "W4: qint_idx \t\t\t%d\nW4: rq_int_ena \t\t\t%d\n",
1803 		   rq_ctx->qint_idx, rq_ctx->rq_int_ena);
1804 	seq_printf(m, "W4: rq_int \t\t\t%d\nW4: lpb_pool_pass \t\t%d\n",
1805 		   rq_ctx->rq_int, rq_ctx->lpb_pool_pass);
1806 	seq_printf(m, "W4: lpb_pool_drop \t\t%d\nW4: lpb_aura_pass \t\t%d\n",
1807 		   rq_ctx->lpb_pool_drop, rq_ctx->lpb_aura_pass);
1808 	seq_printf(m, "W4: lpb_aura_drop \t\t%d\n\n", rq_ctx->lpb_aura_drop);
1809 
1810 	seq_printf(m, "W5: flow_tagw \t\t\t%d\nW5: bad_utag \t\t\t%d\n",
1811 		   rq_ctx->flow_tagw, rq_ctx->bad_utag);
1812 	seq_printf(m, "W5: good_utag \t\t\t%d\nW5: ltag \t\t\t%d\n\n",
1813 		   rq_ctx->good_utag, rq_ctx->ltag);
1814 
1815 	seq_printf(m, "W6: octs \t\t\t%llu\n\n", (u64)rq_ctx->octs);
1816 	seq_printf(m, "W7: pkts \t\t\t%llu\n\n", (u64)rq_ctx->pkts);
1817 	seq_printf(m, "W8: drop_octs \t\t\t%llu\n\n", (u64)rq_ctx->drop_octs);
1818 	seq_printf(m, "W9: drop_pkts \t\t\t%llu\n\n", (u64)rq_ctx->drop_pkts);
1819 	seq_printf(m, "W10: re_pkts \t\t\t%llu\n", (u64)rq_ctx->re_pkts);
1820 }
1821 
1822 /* Dumps given nix_cq's context */
print_nix_cq_ctx(struct seq_file * m,struct nix_aq_enq_rsp * rsp)1823 static void print_nix_cq_ctx(struct seq_file *m, struct nix_aq_enq_rsp *rsp)
1824 {
1825 	struct nix_cq_ctx_s *cq_ctx = &rsp->cq;
1826 	struct nix_hw *nix_hw = m->private;
1827 	struct rvu *rvu = nix_hw->rvu;
1828 
1829 	seq_printf(m, "W0: base \t\t\t%llx\n\n", cq_ctx->base);
1830 
1831 	seq_printf(m, "W1: wrptr \t\t\t%llx\n", (u64)cq_ctx->wrptr);
1832 	seq_printf(m, "W1: avg_con \t\t\t%d\nW1: cint_idx \t\t\t%d\n",
1833 		   cq_ctx->avg_con, cq_ctx->cint_idx);
1834 	seq_printf(m, "W1: cq_err \t\t\t%d\nW1: qint_idx \t\t\t%d\n",
1835 		   cq_ctx->cq_err, cq_ctx->qint_idx);
1836 	seq_printf(m, "W1: bpid \t\t\t%d\nW1: bp_ena \t\t\t%d\n\n",
1837 		   cq_ctx->bpid, cq_ctx->bp_ena);
1838 
1839 	if (!is_rvu_otx2(rvu)) {
1840 		seq_printf(m, "W1: lbpid_high \t\t\t0x%03x\n", cq_ctx->lbpid_high);
1841 		seq_printf(m, "W1: lbpid_med \t\t\t0x%03x\n", cq_ctx->lbpid_med);
1842 		seq_printf(m, "W1: lbpid_low \t\t\t0x%03x\n", cq_ctx->lbpid_low);
1843 		seq_printf(m, "(W1: lbpid) \t\t\t0x%03x\n",
1844 			   cq_ctx->lbpid_high << 6 | cq_ctx->lbpid_med << 3 |
1845 			   cq_ctx->lbpid_low);
1846 		seq_printf(m, "W1: lbp_ena \t\t\t\t%d\n\n", cq_ctx->lbp_ena);
1847 	}
1848 
1849 	seq_printf(m, "W2: update_time \t\t%d\nW2:avg_level \t\t\t%d\n",
1850 		   cq_ctx->update_time, cq_ctx->avg_level);
1851 	seq_printf(m, "W2: head \t\t\t%d\nW2:tail \t\t\t%d\n\n",
1852 		   cq_ctx->head, cq_ctx->tail);
1853 
1854 	seq_printf(m, "W3: cq_err_int_ena \t\t%d\nW3:cq_err_int \t\t\t%d\n",
1855 		   cq_ctx->cq_err_int_ena, cq_ctx->cq_err_int);
1856 	seq_printf(m, "W3: qsize \t\t\t%d\nW3:caching \t\t\t%d\n",
1857 		   cq_ctx->qsize, cq_ctx->caching);
1858 	seq_printf(m, "W3: substream \t\t\t0x%03x\nW3: ena \t\t\t%d\n",
1859 		   cq_ctx->substream, cq_ctx->ena);
1860 	if (!is_rvu_otx2(rvu)) {
1861 		seq_printf(m, "W3: lbp_frac \t\t\t%d\n", cq_ctx->lbp_frac);
1862 		seq_printf(m, "W3: cpt_drop_err_en \t\t\t%d\n",
1863 			   cq_ctx->cpt_drop_err_en);
1864 	}
1865 	seq_printf(m, "W3: drop_ena \t\t\t%d\nW3: drop \t\t\t%d\n",
1866 		   cq_ctx->drop_ena, cq_ctx->drop);
1867 	seq_printf(m, "W3: bp \t\t\t\t%d\n\n", cq_ctx->bp);
1868 }
1869 
rvu_dbg_nix_queue_ctx_display(struct seq_file * filp,void * unused,int ctype)1870 static int rvu_dbg_nix_queue_ctx_display(struct seq_file *filp,
1871 					 void *unused, int ctype)
1872 {
1873 	void (*print_nix_ctx)(struct seq_file *filp,
1874 			      struct nix_aq_enq_rsp *rsp) = NULL;
1875 	struct nix_hw *nix_hw = filp->private;
1876 	struct rvu *rvu = nix_hw->rvu;
1877 	struct nix_aq_enq_req aq_req;
1878 	struct nix_aq_enq_rsp rsp;
1879 	char *ctype_string = NULL;
1880 	int qidx, rc, max_id = 0;
1881 	struct rvu_pfvf *pfvf;
1882 	int nixlf, id, all;
1883 	u16 pcifunc;
1884 
1885 	switch (ctype) {
1886 	case NIX_AQ_CTYPE_CQ:
1887 		nixlf = rvu->rvu_dbg.nix_cq_ctx.lf;
1888 		id = rvu->rvu_dbg.nix_cq_ctx.id;
1889 		all = rvu->rvu_dbg.nix_cq_ctx.all;
1890 		break;
1891 
1892 	case NIX_AQ_CTYPE_SQ:
1893 		nixlf = rvu->rvu_dbg.nix_sq_ctx.lf;
1894 		id = rvu->rvu_dbg.nix_sq_ctx.id;
1895 		all = rvu->rvu_dbg.nix_sq_ctx.all;
1896 		break;
1897 
1898 	case NIX_AQ_CTYPE_RQ:
1899 		nixlf = rvu->rvu_dbg.nix_rq_ctx.lf;
1900 		id = rvu->rvu_dbg.nix_rq_ctx.id;
1901 		all = rvu->rvu_dbg.nix_rq_ctx.all;
1902 		break;
1903 
1904 	default:
1905 		return -EINVAL;
1906 	}
1907 
1908 	if (!rvu_dbg_is_valid_lf(rvu, nix_hw->blkaddr, nixlf, &pcifunc))
1909 		return -EINVAL;
1910 
1911 	pfvf = rvu_get_pfvf(rvu, pcifunc);
1912 	if (ctype == NIX_AQ_CTYPE_SQ && !pfvf->sq_ctx) {
1913 		seq_puts(filp, "SQ context is not initialized\n");
1914 		return -EINVAL;
1915 	} else if (ctype == NIX_AQ_CTYPE_RQ && !pfvf->rq_ctx) {
1916 		seq_puts(filp, "RQ context is not initialized\n");
1917 		return -EINVAL;
1918 	} else if (ctype == NIX_AQ_CTYPE_CQ && !pfvf->cq_ctx) {
1919 		seq_puts(filp, "CQ context is not initialized\n");
1920 		return -EINVAL;
1921 	}
1922 
1923 	if (ctype == NIX_AQ_CTYPE_SQ) {
1924 		max_id = pfvf->sq_ctx->qsize;
1925 		ctype_string = "sq";
1926 		print_nix_ctx = print_nix_sq_ctx;
1927 	} else if (ctype == NIX_AQ_CTYPE_RQ) {
1928 		max_id = pfvf->rq_ctx->qsize;
1929 		ctype_string = "rq";
1930 		print_nix_ctx = print_nix_rq_ctx;
1931 	} else if (ctype == NIX_AQ_CTYPE_CQ) {
1932 		max_id = pfvf->cq_ctx->qsize;
1933 		ctype_string = "cq";
1934 		print_nix_ctx = print_nix_cq_ctx;
1935 	}
1936 
1937 	memset(&aq_req, 0, sizeof(struct nix_aq_enq_req));
1938 	aq_req.hdr.pcifunc = pcifunc;
1939 	aq_req.ctype = ctype;
1940 	aq_req.op = NIX_AQ_INSTOP_READ;
1941 	if (all)
1942 		id = 0;
1943 	else
1944 		max_id = id + 1;
1945 	for (qidx = id; qidx < max_id; qidx++) {
1946 		aq_req.qidx = qidx;
1947 		seq_printf(filp, "=====%s_ctx for nixlf:%d and qidx:%d is=====\n",
1948 			   ctype_string, nixlf, aq_req.qidx);
1949 		rc = rvu_mbox_handler_nix_aq_enq(rvu, &aq_req, &rsp);
1950 		if (rc) {
1951 			seq_puts(filp, "Failed to read the context\n");
1952 			return -EINVAL;
1953 		}
1954 		print_nix_ctx(filp, &rsp);
1955 	}
1956 	return 0;
1957 }
1958 
write_nix_queue_ctx(struct rvu * rvu,bool all,int nixlf,int id,int ctype,char * ctype_string,struct seq_file * m)1959 static int write_nix_queue_ctx(struct rvu *rvu, bool all, int nixlf,
1960 			       int id, int ctype, char *ctype_string,
1961 			       struct seq_file *m)
1962 {
1963 	struct nix_hw *nix_hw = m->private;
1964 	struct rvu_pfvf *pfvf;
1965 	int max_id = 0;
1966 	u16 pcifunc;
1967 
1968 	if (!rvu_dbg_is_valid_lf(rvu, nix_hw->blkaddr, nixlf, &pcifunc))
1969 		return -EINVAL;
1970 
1971 	pfvf = rvu_get_pfvf(rvu, pcifunc);
1972 
1973 	if (ctype == NIX_AQ_CTYPE_SQ) {
1974 		if (!pfvf->sq_ctx) {
1975 			dev_warn(rvu->dev, "SQ context is not initialized\n");
1976 			return -EINVAL;
1977 		}
1978 		max_id = pfvf->sq_ctx->qsize;
1979 	} else if (ctype == NIX_AQ_CTYPE_RQ) {
1980 		if (!pfvf->rq_ctx) {
1981 			dev_warn(rvu->dev, "RQ context is not initialized\n");
1982 			return -EINVAL;
1983 		}
1984 		max_id = pfvf->rq_ctx->qsize;
1985 	} else if (ctype == NIX_AQ_CTYPE_CQ) {
1986 		if (!pfvf->cq_ctx) {
1987 			dev_warn(rvu->dev, "CQ context is not initialized\n");
1988 			return -EINVAL;
1989 		}
1990 		max_id = pfvf->cq_ctx->qsize;
1991 	}
1992 
1993 	if (id < 0 || id >= max_id) {
1994 		dev_warn(rvu->dev, "Invalid %s_ctx valid range 0-%d\n",
1995 			 ctype_string, max_id - 1);
1996 		return -EINVAL;
1997 	}
1998 	switch (ctype) {
1999 	case NIX_AQ_CTYPE_CQ:
2000 		rvu->rvu_dbg.nix_cq_ctx.lf = nixlf;
2001 		rvu->rvu_dbg.nix_cq_ctx.id = id;
2002 		rvu->rvu_dbg.nix_cq_ctx.all = all;
2003 		break;
2004 
2005 	case NIX_AQ_CTYPE_SQ:
2006 		rvu->rvu_dbg.nix_sq_ctx.lf = nixlf;
2007 		rvu->rvu_dbg.nix_sq_ctx.id = id;
2008 		rvu->rvu_dbg.nix_sq_ctx.all = all;
2009 		break;
2010 
2011 	case NIX_AQ_CTYPE_RQ:
2012 		rvu->rvu_dbg.nix_rq_ctx.lf = nixlf;
2013 		rvu->rvu_dbg.nix_rq_ctx.id = id;
2014 		rvu->rvu_dbg.nix_rq_ctx.all = all;
2015 		break;
2016 	default:
2017 		return -EINVAL;
2018 	}
2019 	return 0;
2020 }
2021 
rvu_dbg_nix_queue_ctx_write(struct file * filp,const char __user * buffer,size_t count,loff_t * ppos,int ctype)2022 static ssize_t rvu_dbg_nix_queue_ctx_write(struct file *filp,
2023 					   const char __user *buffer,
2024 					   size_t count, loff_t *ppos,
2025 					   int ctype)
2026 {
2027 	struct seq_file *m = filp->private_data;
2028 	struct nix_hw *nix_hw = m->private;
2029 	struct rvu *rvu = nix_hw->rvu;
2030 	char *cmd_buf, *ctype_string;
2031 	int nixlf, id = 0, ret;
2032 	bool all = false;
2033 
2034 	if ((*ppos != 0) || !count)
2035 		return -EINVAL;
2036 
2037 	switch (ctype) {
2038 	case NIX_AQ_CTYPE_SQ:
2039 		ctype_string = "sq";
2040 		break;
2041 	case NIX_AQ_CTYPE_RQ:
2042 		ctype_string = "rq";
2043 		break;
2044 	case NIX_AQ_CTYPE_CQ:
2045 		ctype_string = "cq";
2046 		break;
2047 	default:
2048 		return -EINVAL;
2049 	}
2050 
2051 	cmd_buf = kzalloc(count + 1, GFP_KERNEL);
2052 
2053 	if (!cmd_buf)
2054 		return count;
2055 
2056 	ret = parse_cmd_buffer_ctx(cmd_buf, &count, buffer,
2057 				   &nixlf, &id, &all);
2058 	if (ret < 0) {
2059 		dev_info(rvu->dev,
2060 			 "Usage: echo <nixlf> [%s number/all] > %s_ctx\n",
2061 			 ctype_string, ctype_string);
2062 		goto done;
2063 	} else {
2064 		ret = write_nix_queue_ctx(rvu, all, nixlf, id, ctype,
2065 					  ctype_string, m);
2066 	}
2067 done:
2068 	kfree(cmd_buf);
2069 	return ret ? ret : count;
2070 }
2071 
rvu_dbg_nix_sq_ctx_write(struct file * filp,const char __user * buffer,size_t count,loff_t * ppos)2072 static ssize_t rvu_dbg_nix_sq_ctx_write(struct file *filp,
2073 					const char __user *buffer,
2074 					size_t count, loff_t *ppos)
2075 {
2076 	return rvu_dbg_nix_queue_ctx_write(filp, buffer, count, ppos,
2077 					    NIX_AQ_CTYPE_SQ);
2078 }
2079 
rvu_dbg_nix_sq_ctx_display(struct seq_file * filp,void * unused)2080 static int rvu_dbg_nix_sq_ctx_display(struct seq_file *filp, void *unused)
2081 {
2082 	return rvu_dbg_nix_queue_ctx_display(filp, unused, NIX_AQ_CTYPE_SQ);
2083 }
2084 
2085 RVU_DEBUG_SEQ_FOPS(nix_sq_ctx, nix_sq_ctx_display, nix_sq_ctx_write);
2086 
rvu_dbg_nix_rq_ctx_write(struct file * filp,const char __user * buffer,size_t count,loff_t * ppos)2087 static ssize_t rvu_dbg_nix_rq_ctx_write(struct file *filp,
2088 					const char __user *buffer,
2089 					size_t count, loff_t *ppos)
2090 {
2091 	return rvu_dbg_nix_queue_ctx_write(filp, buffer, count, ppos,
2092 					    NIX_AQ_CTYPE_RQ);
2093 }
2094 
rvu_dbg_nix_rq_ctx_display(struct seq_file * filp,void * unused)2095 static int rvu_dbg_nix_rq_ctx_display(struct seq_file *filp, void  *unused)
2096 {
2097 	return rvu_dbg_nix_queue_ctx_display(filp, unused,  NIX_AQ_CTYPE_RQ);
2098 }
2099 
2100 RVU_DEBUG_SEQ_FOPS(nix_rq_ctx, nix_rq_ctx_display, nix_rq_ctx_write);
2101 
rvu_dbg_nix_cq_ctx_write(struct file * filp,const char __user * buffer,size_t count,loff_t * ppos)2102 static ssize_t rvu_dbg_nix_cq_ctx_write(struct file *filp,
2103 					const char __user *buffer,
2104 					size_t count, loff_t *ppos)
2105 {
2106 	return rvu_dbg_nix_queue_ctx_write(filp, buffer, count, ppos,
2107 					    NIX_AQ_CTYPE_CQ);
2108 }
2109 
rvu_dbg_nix_cq_ctx_display(struct seq_file * filp,void * unused)2110 static int rvu_dbg_nix_cq_ctx_display(struct seq_file *filp, void *unused)
2111 {
2112 	return rvu_dbg_nix_queue_ctx_display(filp, unused, NIX_AQ_CTYPE_CQ);
2113 }
2114 
2115 RVU_DEBUG_SEQ_FOPS(nix_cq_ctx, nix_cq_ctx_display, nix_cq_ctx_write);
2116 
print_nix_qctx_qsize(struct seq_file * filp,int qsize,unsigned long * bmap,char * qtype)2117 static void print_nix_qctx_qsize(struct seq_file *filp, int qsize,
2118 				 unsigned long *bmap, char *qtype)
2119 {
2120 	char *buf;
2121 
2122 	buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
2123 	if (!buf)
2124 		return;
2125 
2126 	bitmap_print_to_pagebuf(false, buf, bmap, qsize);
2127 	seq_printf(filp, "%s context count : %d\n", qtype, qsize);
2128 	seq_printf(filp, "%s context ena/dis bitmap : %s\n",
2129 		   qtype, buf);
2130 	kfree(buf);
2131 }
2132 
print_nix_qsize(struct seq_file * filp,struct rvu_pfvf * pfvf)2133 static void print_nix_qsize(struct seq_file *filp, struct rvu_pfvf *pfvf)
2134 {
2135 	if (!pfvf->cq_ctx)
2136 		seq_puts(filp, "cq context is not initialized\n");
2137 	else
2138 		print_nix_qctx_qsize(filp, pfvf->cq_ctx->qsize, pfvf->cq_bmap,
2139 				     "cq");
2140 
2141 	if (!pfvf->rq_ctx)
2142 		seq_puts(filp, "rq context is not initialized\n");
2143 	else
2144 		print_nix_qctx_qsize(filp, pfvf->rq_ctx->qsize, pfvf->rq_bmap,
2145 				     "rq");
2146 
2147 	if (!pfvf->sq_ctx)
2148 		seq_puts(filp, "sq context is not initialized\n");
2149 	else
2150 		print_nix_qctx_qsize(filp, pfvf->sq_ctx->qsize, pfvf->sq_bmap,
2151 				     "sq");
2152 }
2153 
rvu_dbg_nix_qsize_write(struct file * filp,const char __user * buffer,size_t count,loff_t * ppos)2154 static ssize_t rvu_dbg_nix_qsize_write(struct file *filp,
2155 				       const char __user *buffer,
2156 				       size_t count, loff_t *ppos)
2157 {
2158 	return rvu_dbg_qsize_write(filp, buffer, count, ppos,
2159 				   BLKTYPE_NIX);
2160 }
2161 
rvu_dbg_nix_qsize_display(struct seq_file * filp,void * unused)2162 static int rvu_dbg_nix_qsize_display(struct seq_file *filp, void *unused)
2163 {
2164 	return rvu_dbg_qsize_display(filp, unused, BLKTYPE_NIX);
2165 }
2166 
2167 RVU_DEBUG_SEQ_FOPS(nix_qsize, nix_qsize_display, nix_qsize_write);
2168 
print_band_prof_ctx(struct seq_file * m,struct nix_bandprof_s * prof)2169 static void print_band_prof_ctx(struct seq_file *m,
2170 				struct nix_bandprof_s *prof)
2171 {
2172 	char *str;
2173 
2174 	switch (prof->pc_mode) {
2175 	case NIX_RX_PC_MODE_VLAN:
2176 		str = "VLAN";
2177 		break;
2178 	case NIX_RX_PC_MODE_DSCP:
2179 		str = "DSCP";
2180 		break;
2181 	case NIX_RX_PC_MODE_GEN:
2182 		str = "Generic";
2183 		break;
2184 	case NIX_RX_PC_MODE_RSVD:
2185 		str = "Reserved";
2186 		break;
2187 	}
2188 	seq_printf(m, "W0: pc_mode\t\t%s\n", str);
2189 	str = (prof->icolor == 3) ? "Color blind" :
2190 		(prof->icolor == 0) ? "Green" :
2191 		(prof->icolor == 1) ? "Yellow" : "Red";
2192 	seq_printf(m, "W0: icolor\t\t%s\n", str);
2193 	seq_printf(m, "W0: tnl_ena\t\t%d\n", prof->tnl_ena);
2194 	seq_printf(m, "W0: peir_exponent\t%d\n", prof->peir_exponent);
2195 	seq_printf(m, "W0: pebs_exponent\t%d\n", prof->pebs_exponent);
2196 	seq_printf(m, "W0: cir_exponent\t%d\n", prof->cir_exponent);
2197 	seq_printf(m, "W0: cbs_exponent\t%d\n", prof->cbs_exponent);
2198 	seq_printf(m, "W0: peir_mantissa\t%d\n", prof->peir_mantissa);
2199 	seq_printf(m, "W0: pebs_mantissa\t%d\n", prof->pebs_mantissa);
2200 	seq_printf(m, "W0: cir_mantissa\t%d\n", prof->cir_mantissa);
2201 
2202 	seq_printf(m, "W1: cbs_mantissa\t%d\n", prof->cbs_mantissa);
2203 	str = (prof->lmode == 0) ? "byte" : "packet";
2204 	seq_printf(m, "W1: lmode\t\t%s\n", str);
2205 	seq_printf(m, "W1: l_select\t\t%d\n", prof->l_sellect);
2206 	seq_printf(m, "W1: rdiv\t\t%d\n", prof->rdiv);
2207 	seq_printf(m, "W1: adjust_exponent\t%d\n", prof->adjust_exponent);
2208 	seq_printf(m, "W1: adjust_mantissa\t%d\n", prof->adjust_mantissa);
2209 	str = (prof->gc_action == 0) ? "PASS" :
2210 		(prof->gc_action == 1) ? "DROP" : "RED";
2211 	seq_printf(m, "W1: gc_action\t\t%s\n", str);
2212 	str = (prof->yc_action == 0) ? "PASS" :
2213 		(prof->yc_action == 1) ? "DROP" : "RED";
2214 	seq_printf(m, "W1: yc_action\t\t%s\n", str);
2215 	str = (prof->rc_action == 0) ? "PASS" :
2216 		(prof->rc_action == 1) ? "DROP" : "RED";
2217 	seq_printf(m, "W1: rc_action\t\t%s\n", str);
2218 	seq_printf(m, "W1: meter_algo\t\t%d\n", prof->meter_algo);
2219 	seq_printf(m, "W1: band_prof_id\t%d\n", prof->band_prof_id);
2220 	seq_printf(m, "W1: hl_en\t\t%d\n", prof->hl_en);
2221 
2222 	seq_printf(m, "W2: ts\t\t\t%lld\n", (u64)prof->ts);
2223 	seq_printf(m, "W3: pe_accum\t\t%d\n", prof->pe_accum);
2224 	seq_printf(m, "W3: c_accum\t\t%d\n", prof->c_accum);
2225 	seq_printf(m, "W4: green_pkt_pass\t%lld\n",
2226 		   (u64)prof->green_pkt_pass);
2227 	seq_printf(m, "W5: yellow_pkt_pass\t%lld\n",
2228 		   (u64)prof->yellow_pkt_pass);
2229 	seq_printf(m, "W6: red_pkt_pass\t%lld\n", (u64)prof->red_pkt_pass);
2230 	seq_printf(m, "W7: green_octs_pass\t%lld\n",
2231 		   (u64)prof->green_octs_pass);
2232 	seq_printf(m, "W8: yellow_octs_pass\t%lld\n",
2233 		   (u64)prof->yellow_octs_pass);
2234 	seq_printf(m, "W9: red_octs_pass\t%lld\n", (u64)prof->red_octs_pass);
2235 	seq_printf(m, "W10: green_pkt_drop\t%lld\n",
2236 		   (u64)prof->green_pkt_drop);
2237 	seq_printf(m, "W11: yellow_pkt_drop\t%lld\n",
2238 		   (u64)prof->yellow_pkt_drop);
2239 	seq_printf(m, "W12: red_pkt_drop\t%lld\n", (u64)prof->red_pkt_drop);
2240 	seq_printf(m, "W13: green_octs_drop\t%lld\n",
2241 		   (u64)prof->green_octs_drop);
2242 	seq_printf(m, "W14: yellow_octs_drop\t%lld\n",
2243 		   (u64)prof->yellow_octs_drop);
2244 	seq_printf(m, "W15: red_octs_drop\t%lld\n", (u64)prof->red_octs_drop);
2245 	seq_puts(m, "==============================\n");
2246 }
2247 
rvu_dbg_nix_band_prof_ctx_display(struct seq_file * m,void * unused)2248 static int rvu_dbg_nix_band_prof_ctx_display(struct seq_file *m, void *unused)
2249 {
2250 	struct nix_hw *nix_hw = m->private;
2251 	struct nix_cn10k_aq_enq_req aq_req;
2252 	struct nix_cn10k_aq_enq_rsp aq_rsp;
2253 	struct rvu *rvu = nix_hw->rvu;
2254 	struct nix_ipolicer *ipolicer;
2255 	int layer, prof_idx, idx, rc;
2256 	u16 pcifunc;
2257 	char *str;
2258 
2259 	/* Ingress policers do not exist on all platforms */
2260 	if (!nix_hw->ipolicer)
2261 		return 0;
2262 
2263 	for (layer = 0; layer < BAND_PROF_NUM_LAYERS; layer++) {
2264 		if (layer == BAND_PROF_INVAL_LAYER)
2265 			continue;
2266 		str = (layer == BAND_PROF_LEAF_LAYER) ? "Leaf" :
2267 			(layer == BAND_PROF_MID_LAYER) ? "Mid" : "Top";
2268 
2269 		seq_printf(m, "\n%s bandwidth profiles\n", str);
2270 		seq_puts(m, "=======================\n");
2271 
2272 		ipolicer = &nix_hw->ipolicer[layer];
2273 
2274 		for (idx = 0; idx < ipolicer->band_prof.max; idx++) {
2275 			if (is_rsrc_free(&ipolicer->band_prof, idx))
2276 				continue;
2277 
2278 			prof_idx = (idx & 0x3FFF) | (layer << 14);
2279 			rc = nix_aq_context_read(rvu, nix_hw, &aq_req, &aq_rsp,
2280 						 0x00, NIX_AQ_CTYPE_BANDPROF,
2281 						 prof_idx);
2282 			if (rc) {
2283 				dev_err(rvu->dev,
2284 					"%s: Failed to fetch context of %s profile %d, err %d\n",
2285 					__func__, str, idx, rc);
2286 				return 0;
2287 			}
2288 			seq_printf(m, "\n%s bandwidth profile:: %d\n", str, idx);
2289 			pcifunc = ipolicer->pfvf_map[idx];
2290 			if (!(pcifunc & RVU_PFVF_FUNC_MASK))
2291 				seq_printf(m, "Allocated to :: PF %d\n",
2292 					   rvu_get_pf(pcifunc));
2293 			else
2294 				seq_printf(m, "Allocated to :: PF %d VF %d\n",
2295 					   rvu_get_pf(pcifunc),
2296 					   (pcifunc & RVU_PFVF_FUNC_MASK) - 1);
2297 			print_band_prof_ctx(m, &aq_rsp.prof);
2298 		}
2299 	}
2300 	return 0;
2301 }
2302 
2303 RVU_DEBUG_SEQ_FOPS(nix_band_prof_ctx, nix_band_prof_ctx_display, NULL);
2304 
rvu_dbg_nix_band_prof_rsrc_display(struct seq_file * m,void * unused)2305 static int rvu_dbg_nix_band_prof_rsrc_display(struct seq_file *m, void *unused)
2306 {
2307 	struct nix_hw *nix_hw = m->private;
2308 	struct nix_ipolicer *ipolicer;
2309 	int layer;
2310 	char *str;
2311 
2312 	/* Ingress policers do not exist on all platforms */
2313 	if (!nix_hw->ipolicer)
2314 		return 0;
2315 
2316 	seq_puts(m, "\nBandwidth profile resource free count\n");
2317 	seq_puts(m, "=====================================\n");
2318 	for (layer = 0; layer < BAND_PROF_NUM_LAYERS; layer++) {
2319 		if (layer == BAND_PROF_INVAL_LAYER)
2320 			continue;
2321 		str = (layer == BAND_PROF_LEAF_LAYER) ? "Leaf" :
2322 			(layer == BAND_PROF_MID_LAYER) ? "Mid " : "Top ";
2323 
2324 		ipolicer = &nix_hw->ipolicer[layer];
2325 		seq_printf(m, "%s :: Max: %4d  Free: %4d\n", str,
2326 			   ipolicer->band_prof.max,
2327 			   rvu_rsrc_free_count(&ipolicer->band_prof));
2328 	}
2329 	seq_puts(m, "=====================================\n");
2330 
2331 	return 0;
2332 }
2333 
2334 RVU_DEBUG_SEQ_FOPS(nix_band_prof_rsrc, nix_band_prof_rsrc_display, NULL);
2335 
rvu_dbg_nix_init(struct rvu * rvu,int blkaddr)2336 static void rvu_dbg_nix_init(struct rvu *rvu, int blkaddr)
2337 {
2338 	struct nix_hw *nix_hw;
2339 
2340 	if (!is_block_implemented(rvu->hw, blkaddr))
2341 		return;
2342 
2343 	if (blkaddr == BLKADDR_NIX0) {
2344 		rvu->rvu_dbg.nix = debugfs_create_dir("nix", rvu->rvu_dbg.root);
2345 		nix_hw = &rvu->hw->nix[0];
2346 	} else {
2347 		rvu->rvu_dbg.nix = debugfs_create_dir("nix1",
2348 						      rvu->rvu_dbg.root);
2349 		nix_hw = &rvu->hw->nix[1];
2350 	}
2351 
2352 	debugfs_create_file("sq_ctx", 0600, rvu->rvu_dbg.nix, nix_hw,
2353 			    &rvu_dbg_nix_sq_ctx_fops);
2354 	debugfs_create_file("rq_ctx", 0600, rvu->rvu_dbg.nix, nix_hw,
2355 			    &rvu_dbg_nix_rq_ctx_fops);
2356 	debugfs_create_file("cq_ctx", 0600, rvu->rvu_dbg.nix, nix_hw,
2357 			    &rvu_dbg_nix_cq_ctx_fops);
2358 	debugfs_create_file("ndc_tx_cache", 0600, rvu->rvu_dbg.nix, nix_hw,
2359 			    &rvu_dbg_nix_ndc_tx_cache_fops);
2360 	debugfs_create_file("ndc_rx_cache", 0600, rvu->rvu_dbg.nix, nix_hw,
2361 			    &rvu_dbg_nix_ndc_rx_cache_fops);
2362 	debugfs_create_file("ndc_tx_hits_miss", 0600, rvu->rvu_dbg.nix, nix_hw,
2363 			    &rvu_dbg_nix_ndc_tx_hits_miss_fops);
2364 	debugfs_create_file("ndc_rx_hits_miss", 0600, rvu->rvu_dbg.nix, nix_hw,
2365 			    &rvu_dbg_nix_ndc_rx_hits_miss_fops);
2366 	debugfs_create_file("qsize", 0600, rvu->rvu_dbg.nix, rvu,
2367 			    &rvu_dbg_nix_qsize_fops);
2368 	debugfs_create_file("ingress_policer_ctx", 0600, rvu->rvu_dbg.nix, nix_hw,
2369 			    &rvu_dbg_nix_band_prof_ctx_fops);
2370 	debugfs_create_file("ingress_policer_rsrc", 0600, rvu->rvu_dbg.nix, nix_hw,
2371 			    &rvu_dbg_nix_band_prof_rsrc_fops);
2372 }
2373 
rvu_dbg_npa_init(struct rvu * rvu)2374 static void rvu_dbg_npa_init(struct rvu *rvu)
2375 {
2376 	rvu->rvu_dbg.npa = debugfs_create_dir("npa", rvu->rvu_dbg.root);
2377 
2378 	debugfs_create_file("qsize", 0600, rvu->rvu_dbg.npa, rvu,
2379 			    &rvu_dbg_npa_qsize_fops);
2380 	debugfs_create_file("aura_ctx", 0600, rvu->rvu_dbg.npa, rvu,
2381 			    &rvu_dbg_npa_aura_ctx_fops);
2382 	debugfs_create_file("pool_ctx", 0600, rvu->rvu_dbg.npa, rvu,
2383 			    &rvu_dbg_npa_pool_ctx_fops);
2384 	debugfs_create_file("ndc_cache", 0600, rvu->rvu_dbg.npa, rvu,
2385 			    &rvu_dbg_npa_ndc_cache_fops);
2386 	debugfs_create_file("ndc_hits_miss", 0600, rvu->rvu_dbg.npa, rvu,
2387 			    &rvu_dbg_npa_ndc_hits_miss_fops);
2388 }
2389 
2390 #define PRINT_CGX_CUML_NIXRX_STATUS(idx, name)				\
2391 	({								\
2392 		u64 cnt;						\
2393 		err = rvu_cgx_nix_cuml_stats(rvu, cgxd, lmac_id, (idx),	\
2394 					     NIX_STATS_RX, &(cnt));	\
2395 		if (!err)						\
2396 			seq_printf(s, "%s: %llu\n", name, cnt);		\
2397 		cnt;							\
2398 	})
2399 
2400 #define PRINT_CGX_CUML_NIXTX_STATUS(idx, name)			\
2401 	({								\
2402 		u64 cnt;						\
2403 		err = rvu_cgx_nix_cuml_stats(rvu, cgxd, lmac_id, (idx),	\
2404 					  NIX_STATS_TX, &(cnt));	\
2405 		if (!err)						\
2406 			seq_printf(s, "%s: %llu\n", name, cnt);		\
2407 		cnt;							\
2408 	})
2409 
cgx_print_stats(struct seq_file * s,int lmac_id)2410 static int cgx_print_stats(struct seq_file *s, int lmac_id)
2411 {
2412 	struct cgx_link_user_info linfo;
2413 	struct mac_ops *mac_ops;
2414 	void *cgxd = s->private;
2415 	u64 ucast, mcast, bcast;
2416 	int stat = 0, err = 0;
2417 	u64 tx_stat, rx_stat;
2418 	struct rvu *rvu;
2419 
2420 	rvu = pci_get_drvdata(pci_get_device(PCI_VENDOR_ID_CAVIUM,
2421 					     PCI_DEVID_OCTEONTX2_RVU_AF, NULL));
2422 	if (!rvu)
2423 		return -ENODEV;
2424 
2425 	mac_ops = get_mac_ops(cgxd);
2426 	/* There can be no CGX devices at all */
2427 	if (!mac_ops)
2428 		return 0;
2429 
2430 	/* Link status */
2431 	seq_puts(s, "\n=======Link Status======\n\n");
2432 	err = cgx_get_link_info(cgxd, lmac_id, &linfo);
2433 	if (err)
2434 		seq_puts(s, "Failed to read link status\n");
2435 	seq_printf(s, "\nLink is %s %d Mbps\n\n",
2436 		   linfo.link_up ? "UP" : "DOWN", linfo.speed);
2437 
2438 	/* Rx stats */
2439 	seq_printf(s, "\n=======NIX RX_STATS(%s port level)======\n\n",
2440 		   mac_ops->name);
2441 	ucast = PRINT_CGX_CUML_NIXRX_STATUS(RX_UCAST, "rx_ucast_frames");
2442 	if (err)
2443 		return err;
2444 	mcast = PRINT_CGX_CUML_NIXRX_STATUS(RX_MCAST, "rx_mcast_frames");
2445 	if (err)
2446 		return err;
2447 	bcast = PRINT_CGX_CUML_NIXRX_STATUS(RX_BCAST, "rx_bcast_frames");
2448 	if (err)
2449 		return err;
2450 	seq_printf(s, "rx_frames: %llu\n", ucast + mcast + bcast);
2451 	PRINT_CGX_CUML_NIXRX_STATUS(RX_OCTS, "rx_bytes");
2452 	if (err)
2453 		return err;
2454 	PRINT_CGX_CUML_NIXRX_STATUS(RX_DROP, "rx_drops");
2455 	if (err)
2456 		return err;
2457 	PRINT_CGX_CUML_NIXRX_STATUS(RX_ERR, "rx_errors");
2458 	if (err)
2459 		return err;
2460 
2461 	/* Tx stats */
2462 	seq_printf(s, "\n=======NIX TX_STATS(%s port level)======\n\n",
2463 		   mac_ops->name);
2464 	ucast = PRINT_CGX_CUML_NIXTX_STATUS(TX_UCAST, "tx_ucast_frames");
2465 	if (err)
2466 		return err;
2467 	mcast = PRINT_CGX_CUML_NIXTX_STATUS(TX_MCAST, "tx_mcast_frames");
2468 	if (err)
2469 		return err;
2470 	bcast = PRINT_CGX_CUML_NIXTX_STATUS(TX_BCAST, "tx_bcast_frames");
2471 	if (err)
2472 		return err;
2473 	seq_printf(s, "tx_frames: %llu\n", ucast + mcast + bcast);
2474 	PRINT_CGX_CUML_NIXTX_STATUS(TX_OCTS, "tx_bytes");
2475 	if (err)
2476 		return err;
2477 	PRINT_CGX_CUML_NIXTX_STATUS(TX_DROP, "tx_drops");
2478 	if (err)
2479 		return err;
2480 
2481 	/* Rx stats */
2482 	seq_printf(s, "\n=======%s RX_STATS======\n\n", mac_ops->name);
2483 	while (stat < mac_ops->rx_stats_cnt) {
2484 		err = mac_ops->mac_get_rx_stats(cgxd, lmac_id, stat, &rx_stat);
2485 		if (err)
2486 			return err;
2487 		if (is_rvu_otx2(rvu))
2488 			seq_printf(s, "%s: %llu\n", cgx_rx_stats_fields[stat],
2489 				   rx_stat);
2490 		else
2491 			seq_printf(s, "%s: %llu\n", rpm_rx_stats_fields[stat],
2492 				   rx_stat);
2493 		stat++;
2494 	}
2495 
2496 	/* Tx stats */
2497 	stat = 0;
2498 	seq_printf(s, "\n=======%s TX_STATS======\n\n", mac_ops->name);
2499 	while (stat < mac_ops->tx_stats_cnt) {
2500 		err = mac_ops->mac_get_tx_stats(cgxd, lmac_id, stat, &tx_stat);
2501 		if (err)
2502 			return err;
2503 
2504 		if (is_rvu_otx2(rvu))
2505 			seq_printf(s, "%s: %llu\n", cgx_tx_stats_fields[stat],
2506 				   tx_stat);
2507 		else
2508 			seq_printf(s, "%s: %llu\n", rpm_tx_stats_fields[stat],
2509 				   tx_stat);
2510 		stat++;
2511 	}
2512 
2513 	return err;
2514 }
2515 
rvu_dbg_derive_lmacid(struct seq_file * filp,int * lmac_id)2516 static int rvu_dbg_derive_lmacid(struct seq_file *filp, int *lmac_id)
2517 {
2518 	struct dentry *current_dir;
2519 	char *buf;
2520 
2521 	current_dir = filp->file->f_path.dentry->d_parent;
2522 	buf = strrchr(current_dir->d_name.name, 'c');
2523 	if (!buf)
2524 		return -EINVAL;
2525 
2526 	return kstrtoint(buf + 1, 10, lmac_id);
2527 }
2528 
rvu_dbg_cgx_stat_display(struct seq_file * filp,void * unused)2529 static int rvu_dbg_cgx_stat_display(struct seq_file *filp, void *unused)
2530 {
2531 	int lmac_id, err;
2532 
2533 	err = rvu_dbg_derive_lmacid(filp, &lmac_id);
2534 	if (!err)
2535 		return cgx_print_stats(filp, lmac_id);
2536 
2537 	return err;
2538 }
2539 
2540 RVU_DEBUG_SEQ_FOPS(cgx_stat, cgx_stat_display, NULL);
2541 
cgx_print_dmac_flt(struct seq_file * s,int lmac_id)2542 static int cgx_print_dmac_flt(struct seq_file *s, int lmac_id)
2543 {
2544 	struct pci_dev *pdev = NULL;
2545 	void *cgxd = s->private;
2546 	char *bcast, *mcast;
2547 	u16 index, domain;
2548 	u8 dmac[ETH_ALEN];
2549 	struct rvu *rvu;
2550 	u64 cfg, mac;
2551 	int pf;
2552 
2553 	rvu = pci_get_drvdata(pci_get_device(PCI_VENDOR_ID_CAVIUM,
2554 					     PCI_DEVID_OCTEONTX2_RVU_AF, NULL));
2555 	if (!rvu)
2556 		return -ENODEV;
2557 
2558 	pf = cgxlmac_to_pf(rvu, cgx_get_cgxid(cgxd), lmac_id);
2559 	domain = 2;
2560 
2561 	pdev = pci_get_domain_bus_and_slot(domain, pf + 1, 0);
2562 	if (!pdev)
2563 		return 0;
2564 
2565 	cfg = cgx_read_dmac_ctrl(cgxd, lmac_id);
2566 	bcast = cfg & CGX_DMAC_BCAST_MODE ? "ACCEPT" : "REJECT";
2567 	mcast = cfg & CGX_DMAC_MCAST_MODE ? "ACCEPT" : "REJECT";
2568 
2569 	seq_puts(s,
2570 		 "PCI dev       RVUPF   BROADCAST  MULTICAST  FILTER-MODE\n");
2571 	seq_printf(s, "%s  PF%d  %9s  %9s",
2572 		   dev_name(&pdev->dev), pf, bcast, mcast);
2573 	if (cfg & CGX_DMAC_CAM_ACCEPT)
2574 		seq_printf(s, "%12s\n\n", "UNICAST");
2575 	else
2576 		seq_printf(s, "%16s\n\n", "PROMISCUOUS");
2577 
2578 	seq_puts(s, "\nDMAC-INDEX  ADDRESS\n");
2579 
2580 	for (index = 0 ; index < 32 ; index++) {
2581 		cfg = cgx_read_dmac_entry(cgxd, index);
2582 		/* Display enabled dmac entries associated with current lmac */
2583 		if (lmac_id == FIELD_GET(CGX_DMAC_CAM_ENTRY_LMACID, cfg) &&
2584 		    FIELD_GET(CGX_DMAC_CAM_ADDR_ENABLE, cfg)) {
2585 			mac = FIELD_GET(CGX_RX_DMAC_ADR_MASK, cfg);
2586 			u64_to_ether_addr(mac, dmac);
2587 			seq_printf(s, "%7d     %pM\n", index, dmac);
2588 		}
2589 	}
2590 
2591 	pci_dev_put(pdev);
2592 	return 0;
2593 }
2594 
rvu_dbg_cgx_dmac_flt_display(struct seq_file * filp,void * unused)2595 static int rvu_dbg_cgx_dmac_flt_display(struct seq_file *filp, void *unused)
2596 {
2597 	int err, lmac_id;
2598 
2599 	err = rvu_dbg_derive_lmacid(filp, &lmac_id);
2600 	if (!err)
2601 		return cgx_print_dmac_flt(filp, lmac_id);
2602 
2603 	return err;
2604 }
2605 
2606 RVU_DEBUG_SEQ_FOPS(cgx_dmac_flt, cgx_dmac_flt_display, NULL);
2607 
rvu_dbg_cgx_init(struct rvu * rvu)2608 static void rvu_dbg_cgx_init(struct rvu *rvu)
2609 {
2610 	struct mac_ops *mac_ops;
2611 	unsigned long lmac_bmap;
2612 	int i, lmac_id;
2613 	char dname[20];
2614 	void *cgx;
2615 
2616 	if (!cgx_get_cgxcnt_max())
2617 		return;
2618 
2619 	mac_ops = get_mac_ops(rvu_first_cgx_pdata(rvu));
2620 	if (!mac_ops)
2621 		return;
2622 
2623 	rvu->rvu_dbg.cgx_root = debugfs_create_dir(mac_ops->name,
2624 						   rvu->rvu_dbg.root);
2625 
2626 	for (i = 0; i < cgx_get_cgxcnt_max(); i++) {
2627 		cgx = rvu_cgx_pdata(i, rvu);
2628 		if (!cgx)
2629 			continue;
2630 		lmac_bmap = cgx_get_lmac_bmap(cgx);
2631 		/* cgx debugfs dir */
2632 		sprintf(dname, "%s%d", mac_ops->name, i);
2633 		rvu->rvu_dbg.cgx = debugfs_create_dir(dname,
2634 						      rvu->rvu_dbg.cgx_root);
2635 
2636 		for_each_set_bit(lmac_id, &lmac_bmap, rvu->hw->lmac_per_cgx) {
2637 			/* lmac debugfs dir */
2638 			sprintf(dname, "lmac%d", lmac_id);
2639 			rvu->rvu_dbg.lmac =
2640 				debugfs_create_dir(dname, rvu->rvu_dbg.cgx);
2641 
2642 			debugfs_create_file("stats", 0600, rvu->rvu_dbg.lmac,
2643 					    cgx, &rvu_dbg_cgx_stat_fops);
2644 			debugfs_create_file("mac_filter", 0600,
2645 					    rvu->rvu_dbg.lmac, cgx,
2646 					    &rvu_dbg_cgx_dmac_flt_fops);
2647 		}
2648 	}
2649 }
2650 
2651 /* NPC debugfs APIs */
rvu_print_npc_mcam_info(struct seq_file * s,u16 pcifunc,int blkaddr)2652 static void rvu_print_npc_mcam_info(struct seq_file *s,
2653 				    u16 pcifunc, int blkaddr)
2654 {
2655 	struct rvu *rvu = s->private;
2656 	int entry_acnt, entry_ecnt;
2657 	int cntr_acnt, cntr_ecnt;
2658 
2659 	rvu_npc_get_mcam_entry_alloc_info(rvu, pcifunc, blkaddr,
2660 					  &entry_acnt, &entry_ecnt);
2661 	rvu_npc_get_mcam_counter_alloc_info(rvu, pcifunc, blkaddr,
2662 					    &cntr_acnt, &cntr_ecnt);
2663 	if (!entry_acnt && !cntr_acnt)
2664 		return;
2665 
2666 	if (!(pcifunc & RVU_PFVF_FUNC_MASK))
2667 		seq_printf(s, "\n\t\t Device \t\t: PF%d\n",
2668 			   rvu_get_pf(pcifunc));
2669 	else
2670 		seq_printf(s, "\n\t\t Device \t\t: PF%d VF%d\n",
2671 			   rvu_get_pf(pcifunc),
2672 			   (pcifunc & RVU_PFVF_FUNC_MASK) - 1);
2673 
2674 	if (entry_acnt) {
2675 		seq_printf(s, "\t\t Entries allocated \t: %d\n", entry_acnt);
2676 		seq_printf(s, "\t\t Entries enabled \t: %d\n", entry_ecnt);
2677 	}
2678 	if (cntr_acnt) {
2679 		seq_printf(s, "\t\t Counters allocated \t: %d\n", cntr_acnt);
2680 		seq_printf(s, "\t\t Counters enabled \t: %d\n", cntr_ecnt);
2681 	}
2682 }
2683 
rvu_dbg_npc_mcam_info_display(struct seq_file * filp,void * unsued)2684 static int rvu_dbg_npc_mcam_info_display(struct seq_file *filp, void *unsued)
2685 {
2686 	struct rvu *rvu = filp->private;
2687 	int pf, vf, numvfs, blkaddr;
2688 	struct npc_mcam *mcam;
2689 	u16 pcifunc, counters;
2690 	u64 cfg;
2691 
2692 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
2693 	if (blkaddr < 0)
2694 		return -ENODEV;
2695 
2696 	mcam = &rvu->hw->mcam;
2697 	counters = rvu->hw->npc_counters;
2698 
2699 	seq_puts(filp, "\nNPC MCAM info:\n");
2700 	/* MCAM keywidth on receive and transmit sides */
2701 	cfg = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_KEX_CFG(NIX_INTF_RX));
2702 	cfg = (cfg >> 32) & 0x07;
2703 	seq_printf(filp, "\t\t RX keywidth \t: %s\n", (cfg == NPC_MCAM_KEY_X1) ?
2704 		   "112bits" : ((cfg == NPC_MCAM_KEY_X2) ?
2705 		   "224bits" : "448bits"));
2706 	cfg = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_KEX_CFG(NIX_INTF_TX));
2707 	cfg = (cfg >> 32) & 0x07;
2708 	seq_printf(filp, "\t\t TX keywidth \t: %s\n", (cfg == NPC_MCAM_KEY_X1) ?
2709 		   "112bits" : ((cfg == NPC_MCAM_KEY_X2) ?
2710 		   "224bits" : "448bits"));
2711 
2712 	mutex_lock(&mcam->lock);
2713 	/* MCAM entries */
2714 	seq_printf(filp, "\n\t\t MCAM entries \t: %d\n", mcam->total_entries);
2715 	seq_printf(filp, "\t\t Reserved \t: %d\n",
2716 		   mcam->total_entries - mcam->bmap_entries);
2717 	seq_printf(filp, "\t\t Available \t: %d\n", mcam->bmap_fcnt);
2718 
2719 	/* MCAM counters */
2720 	seq_printf(filp, "\n\t\t MCAM counters \t: %d\n", counters);
2721 	seq_printf(filp, "\t\t Reserved \t: %d\n",
2722 		   counters - mcam->counters.max);
2723 	seq_printf(filp, "\t\t Available \t: %d\n",
2724 		   rvu_rsrc_free_count(&mcam->counters));
2725 
2726 	if (mcam->bmap_entries == mcam->bmap_fcnt) {
2727 		mutex_unlock(&mcam->lock);
2728 		return 0;
2729 	}
2730 
2731 	seq_puts(filp, "\n\t\t Current allocation\n");
2732 	seq_puts(filp, "\t\t====================\n");
2733 	for (pf = 0; pf < rvu->hw->total_pfs; pf++) {
2734 		pcifunc = (pf << RVU_PFVF_PF_SHIFT);
2735 		rvu_print_npc_mcam_info(filp, pcifunc, blkaddr);
2736 
2737 		cfg = rvu_read64(rvu, BLKADDR_RVUM, RVU_PRIV_PFX_CFG(pf));
2738 		numvfs = (cfg >> 12) & 0xFF;
2739 		for (vf = 0; vf < numvfs; vf++) {
2740 			pcifunc = (pf << RVU_PFVF_PF_SHIFT) | (vf + 1);
2741 			rvu_print_npc_mcam_info(filp, pcifunc, blkaddr);
2742 		}
2743 	}
2744 
2745 	mutex_unlock(&mcam->lock);
2746 	return 0;
2747 }
2748 
2749 RVU_DEBUG_SEQ_FOPS(npc_mcam_info, npc_mcam_info_display, NULL);
2750 
rvu_dbg_npc_rx_miss_stats_display(struct seq_file * filp,void * unused)2751 static int rvu_dbg_npc_rx_miss_stats_display(struct seq_file *filp,
2752 					     void *unused)
2753 {
2754 	struct rvu *rvu = filp->private;
2755 	struct npc_mcam *mcam;
2756 	int blkaddr;
2757 
2758 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
2759 	if (blkaddr < 0)
2760 		return -ENODEV;
2761 
2762 	mcam = &rvu->hw->mcam;
2763 
2764 	seq_puts(filp, "\nNPC MCAM RX miss action stats\n");
2765 	seq_printf(filp, "\t\tStat %d: \t%lld\n", mcam->rx_miss_act_cntr,
2766 		   rvu_read64(rvu, blkaddr,
2767 			      NPC_AF_MATCH_STATX(mcam->rx_miss_act_cntr)));
2768 
2769 	return 0;
2770 }
2771 
2772 RVU_DEBUG_SEQ_FOPS(npc_rx_miss_act, npc_rx_miss_stats_display, NULL);
2773 
2774 #define RVU_DBG_PRINT_MPLS_TTL(pkt, mask)                                     \
2775 do {									      \
2776 	seq_printf(s, "%ld ", FIELD_GET(OTX2_FLOWER_MASK_MPLS_TTL, pkt));     \
2777 	seq_printf(s, "mask 0x%lx\n",                                         \
2778 		   FIELD_GET(OTX2_FLOWER_MASK_MPLS_TTL, mask));               \
2779 } while (0)                                                                   \
2780 
2781 #define RVU_DBG_PRINT_MPLS_LBTCBOS(_pkt, _mask)                               \
2782 do {									      \
2783 	typeof(_pkt) (pkt) = (_pkt);					      \
2784 	typeof(_mask) (mask) = (_mask);                                       \
2785 	seq_printf(s, "%ld %ld %ld\n",                                        \
2786 		   FIELD_GET(OTX2_FLOWER_MASK_MPLS_LB, pkt),                  \
2787 		   FIELD_GET(OTX2_FLOWER_MASK_MPLS_TC, pkt),                  \
2788 		   FIELD_GET(OTX2_FLOWER_MASK_MPLS_BOS, pkt));                \
2789 	seq_printf(s, "\tmask 0x%lx 0x%lx 0x%lx\n",                           \
2790 		   FIELD_GET(OTX2_FLOWER_MASK_MPLS_LB, mask),                 \
2791 		   FIELD_GET(OTX2_FLOWER_MASK_MPLS_TC, mask),                 \
2792 		   FIELD_GET(OTX2_FLOWER_MASK_MPLS_BOS, mask));               \
2793 } while (0)                                                                   \
2794 
rvu_dbg_npc_mcam_show_flows(struct seq_file * s,struct rvu_npc_mcam_rule * rule)2795 static void rvu_dbg_npc_mcam_show_flows(struct seq_file *s,
2796 					struct rvu_npc_mcam_rule *rule)
2797 {
2798 	u8 bit;
2799 
2800 	for_each_set_bit(bit, (unsigned long *)&rule->features, 64) {
2801 		seq_printf(s, "\t%s  ", npc_get_field_name(bit));
2802 		switch (bit) {
2803 		case NPC_LXMB:
2804 			if (rule->lxmb == 1)
2805 				seq_puts(s, "\tL2M nibble is set\n");
2806 			else
2807 				seq_puts(s, "\tL2B nibble is set\n");
2808 			break;
2809 		case NPC_DMAC:
2810 			seq_printf(s, "%pM ", rule->packet.dmac);
2811 			seq_printf(s, "mask %pM\n", rule->mask.dmac);
2812 			break;
2813 		case NPC_SMAC:
2814 			seq_printf(s, "%pM ", rule->packet.smac);
2815 			seq_printf(s, "mask %pM\n", rule->mask.smac);
2816 			break;
2817 		case NPC_ETYPE:
2818 			seq_printf(s, "0x%x ", ntohs(rule->packet.etype));
2819 			seq_printf(s, "mask 0x%x\n", ntohs(rule->mask.etype));
2820 			break;
2821 		case NPC_OUTER_VID:
2822 			seq_printf(s, "0x%x ", ntohs(rule->packet.vlan_tci));
2823 			seq_printf(s, "mask 0x%x\n",
2824 				   ntohs(rule->mask.vlan_tci));
2825 			break;
2826 		case NPC_INNER_VID:
2827 			seq_printf(s, "0x%x ", ntohs(rule->packet.vlan_itci));
2828 			seq_printf(s, "mask 0x%x\n",
2829 				   ntohs(rule->mask.vlan_itci));
2830 			break;
2831 		case NPC_TOS:
2832 			seq_printf(s, "%d ", rule->packet.tos);
2833 			seq_printf(s, "mask 0x%x\n", rule->mask.tos);
2834 			break;
2835 		case NPC_SIP_IPV4:
2836 			seq_printf(s, "%pI4 ", &rule->packet.ip4src);
2837 			seq_printf(s, "mask %pI4\n", &rule->mask.ip4src);
2838 			break;
2839 		case NPC_DIP_IPV4:
2840 			seq_printf(s, "%pI4 ", &rule->packet.ip4dst);
2841 			seq_printf(s, "mask %pI4\n", &rule->mask.ip4dst);
2842 			break;
2843 		case NPC_SIP_IPV6:
2844 			seq_printf(s, "%pI6 ", rule->packet.ip6src);
2845 			seq_printf(s, "mask %pI6\n", rule->mask.ip6src);
2846 			break;
2847 		case NPC_DIP_IPV6:
2848 			seq_printf(s, "%pI6 ", rule->packet.ip6dst);
2849 			seq_printf(s, "mask %pI6\n", rule->mask.ip6dst);
2850 			break;
2851 		case NPC_IPFRAG_IPV6:
2852 			seq_printf(s, "0x%x ", rule->packet.next_header);
2853 			seq_printf(s, "mask 0x%x\n", rule->mask.next_header);
2854 			break;
2855 		case NPC_IPFRAG_IPV4:
2856 			seq_printf(s, "0x%x ", rule->packet.ip_flag);
2857 			seq_printf(s, "mask 0x%x\n", rule->mask.ip_flag);
2858 			break;
2859 		case NPC_SPORT_TCP:
2860 		case NPC_SPORT_UDP:
2861 		case NPC_SPORT_SCTP:
2862 			seq_printf(s, "%d ", ntohs(rule->packet.sport));
2863 			seq_printf(s, "mask 0x%x\n", ntohs(rule->mask.sport));
2864 			break;
2865 		case NPC_DPORT_TCP:
2866 		case NPC_DPORT_UDP:
2867 		case NPC_DPORT_SCTP:
2868 			seq_printf(s, "%d ", ntohs(rule->packet.dport));
2869 			seq_printf(s, "mask 0x%x\n", ntohs(rule->mask.dport));
2870 			break;
2871 		case NPC_TCP_FLAGS:
2872 			seq_printf(s, "%d ", rule->packet.tcp_flags);
2873 			seq_printf(s, "mask 0x%x\n", rule->mask.tcp_flags);
2874 			break;
2875 		case NPC_IPSEC_SPI:
2876 			seq_printf(s, "0x%x ", ntohl(rule->packet.spi));
2877 			seq_printf(s, "mask 0x%x\n", ntohl(rule->mask.spi));
2878 			break;
2879 		case NPC_MPLS1_LBTCBOS:
2880 			RVU_DBG_PRINT_MPLS_LBTCBOS(rule->packet.mpls_lse[0],
2881 						   rule->mask.mpls_lse[0]);
2882 			break;
2883 		case NPC_MPLS1_TTL:
2884 			RVU_DBG_PRINT_MPLS_TTL(rule->packet.mpls_lse[0],
2885 					       rule->mask.mpls_lse[0]);
2886 			break;
2887 		case NPC_MPLS2_LBTCBOS:
2888 			RVU_DBG_PRINT_MPLS_LBTCBOS(rule->packet.mpls_lse[1],
2889 						   rule->mask.mpls_lse[1]);
2890 			break;
2891 		case NPC_MPLS2_TTL:
2892 			RVU_DBG_PRINT_MPLS_TTL(rule->packet.mpls_lse[1],
2893 					       rule->mask.mpls_lse[1]);
2894 			break;
2895 		case NPC_MPLS3_LBTCBOS:
2896 			RVU_DBG_PRINT_MPLS_LBTCBOS(rule->packet.mpls_lse[2],
2897 						   rule->mask.mpls_lse[2]);
2898 			break;
2899 		case NPC_MPLS3_TTL:
2900 			RVU_DBG_PRINT_MPLS_TTL(rule->packet.mpls_lse[2],
2901 					       rule->mask.mpls_lse[2]);
2902 			break;
2903 		case NPC_MPLS4_LBTCBOS:
2904 			RVU_DBG_PRINT_MPLS_LBTCBOS(rule->packet.mpls_lse[3],
2905 						   rule->mask.mpls_lse[3]);
2906 			break;
2907 		case NPC_MPLS4_TTL:
2908 			RVU_DBG_PRINT_MPLS_TTL(rule->packet.mpls_lse[3],
2909 					       rule->mask.mpls_lse[3]);
2910 			break;
2911 		case NPC_TYPE_ICMP:
2912 			seq_printf(s, "%d ", rule->packet.icmp_type);
2913 			seq_printf(s, "mask 0x%x\n", rule->mask.icmp_type);
2914 			break;
2915 		case NPC_CODE_ICMP:
2916 			seq_printf(s, "%d ", rule->packet.icmp_code);
2917 			seq_printf(s, "mask 0x%x\n", rule->mask.icmp_code);
2918 			break;
2919 		default:
2920 			seq_puts(s, "\n");
2921 			break;
2922 		}
2923 	}
2924 }
2925 
rvu_dbg_npc_mcam_show_action(struct seq_file * s,struct rvu_npc_mcam_rule * rule)2926 static void rvu_dbg_npc_mcam_show_action(struct seq_file *s,
2927 					 struct rvu_npc_mcam_rule *rule)
2928 {
2929 	if (is_npc_intf_tx(rule->intf)) {
2930 		switch (rule->tx_action.op) {
2931 		case NIX_TX_ACTIONOP_DROP:
2932 			seq_puts(s, "\taction: Drop\n");
2933 			break;
2934 		case NIX_TX_ACTIONOP_UCAST_DEFAULT:
2935 			seq_puts(s, "\taction: Unicast to default channel\n");
2936 			break;
2937 		case NIX_TX_ACTIONOP_UCAST_CHAN:
2938 			seq_printf(s, "\taction: Unicast to channel %d\n",
2939 				   rule->tx_action.index);
2940 			break;
2941 		case NIX_TX_ACTIONOP_MCAST:
2942 			seq_puts(s, "\taction: Multicast\n");
2943 			break;
2944 		case NIX_TX_ACTIONOP_DROP_VIOL:
2945 			seq_puts(s, "\taction: Lockdown Violation Drop\n");
2946 			break;
2947 		default:
2948 			break;
2949 		}
2950 	} else {
2951 		switch (rule->rx_action.op) {
2952 		case NIX_RX_ACTIONOP_DROP:
2953 			seq_puts(s, "\taction: Drop\n");
2954 			break;
2955 		case NIX_RX_ACTIONOP_UCAST:
2956 			seq_printf(s, "\taction: Direct to queue %d\n",
2957 				   rule->rx_action.index);
2958 			break;
2959 		case NIX_RX_ACTIONOP_RSS:
2960 			seq_puts(s, "\taction: RSS\n");
2961 			break;
2962 		case NIX_RX_ACTIONOP_UCAST_IPSEC:
2963 			seq_puts(s, "\taction: Unicast ipsec\n");
2964 			break;
2965 		case NIX_RX_ACTIONOP_MCAST:
2966 			seq_puts(s, "\taction: Multicast\n");
2967 			break;
2968 		default:
2969 			break;
2970 		}
2971 	}
2972 }
2973 
rvu_dbg_get_intf_name(int intf)2974 static const char *rvu_dbg_get_intf_name(int intf)
2975 {
2976 	switch (intf) {
2977 	case NIX_INTFX_RX(0):
2978 		return "NIX0_RX";
2979 	case NIX_INTFX_RX(1):
2980 		return "NIX1_RX";
2981 	case NIX_INTFX_TX(0):
2982 		return "NIX0_TX";
2983 	case NIX_INTFX_TX(1):
2984 		return "NIX1_TX";
2985 	default:
2986 		break;
2987 	}
2988 
2989 	return "unknown";
2990 }
2991 
rvu_dbg_npc_mcam_show_rules(struct seq_file * s,void * unused)2992 static int rvu_dbg_npc_mcam_show_rules(struct seq_file *s, void *unused)
2993 {
2994 	struct rvu_npc_mcam_rule *iter;
2995 	struct rvu *rvu = s->private;
2996 	struct npc_mcam *mcam;
2997 	int pf, vf = -1;
2998 	bool enabled;
2999 	int blkaddr;
3000 	u16 target;
3001 	u64 hits;
3002 
3003 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
3004 	if (blkaddr < 0)
3005 		return 0;
3006 
3007 	mcam = &rvu->hw->mcam;
3008 
3009 	mutex_lock(&mcam->lock);
3010 	list_for_each_entry(iter, &mcam->mcam_rules, list) {
3011 		pf = (iter->owner >> RVU_PFVF_PF_SHIFT) & RVU_PFVF_PF_MASK;
3012 		seq_printf(s, "\n\tInstalled by: PF%d ", pf);
3013 
3014 		if (iter->owner & RVU_PFVF_FUNC_MASK) {
3015 			vf = (iter->owner & RVU_PFVF_FUNC_MASK) - 1;
3016 			seq_printf(s, "VF%d", vf);
3017 		}
3018 		seq_puts(s, "\n");
3019 
3020 		seq_printf(s, "\tdirection: %s\n", is_npc_intf_rx(iter->intf) ?
3021 						    "RX" : "TX");
3022 		seq_printf(s, "\tinterface: %s\n",
3023 			   rvu_dbg_get_intf_name(iter->intf));
3024 		seq_printf(s, "\tmcam entry: %d\n", iter->entry);
3025 
3026 		rvu_dbg_npc_mcam_show_flows(s, iter);
3027 		if (is_npc_intf_rx(iter->intf)) {
3028 			target = iter->rx_action.pf_func;
3029 			pf = (target >> RVU_PFVF_PF_SHIFT) & RVU_PFVF_PF_MASK;
3030 			seq_printf(s, "\tForward to: PF%d ", pf);
3031 
3032 			if (target & RVU_PFVF_FUNC_MASK) {
3033 				vf = (target & RVU_PFVF_FUNC_MASK) - 1;
3034 				seq_printf(s, "VF%d", vf);
3035 			}
3036 			seq_puts(s, "\n");
3037 			seq_printf(s, "\tchannel: 0x%x\n", iter->chan);
3038 			seq_printf(s, "\tchannel_mask: 0x%x\n", iter->chan_mask);
3039 		}
3040 
3041 		rvu_dbg_npc_mcam_show_action(s, iter);
3042 
3043 		enabled = is_mcam_entry_enabled(rvu, mcam, blkaddr, iter->entry);
3044 		seq_printf(s, "\tenabled: %s\n", enabled ? "yes" : "no");
3045 
3046 		if (!iter->has_cntr)
3047 			continue;
3048 		seq_printf(s, "\tcounter: %d\n", iter->cntr);
3049 
3050 		hits = rvu_read64(rvu, blkaddr, NPC_AF_MATCH_STATX(iter->cntr));
3051 		seq_printf(s, "\thits: %lld\n", hits);
3052 	}
3053 	mutex_unlock(&mcam->lock);
3054 
3055 	return 0;
3056 }
3057 
3058 RVU_DEBUG_SEQ_FOPS(npc_mcam_rules, npc_mcam_show_rules, NULL);
3059 
rvu_dbg_npc_exact_show_entries(struct seq_file * s,void * unused)3060 static int rvu_dbg_npc_exact_show_entries(struct seq_file *s, void *unused)
3061 {
3062 	struct npc_exact_table_entry *mem_entry[NPC_EXACT_TBL_MAX_WAYS] = { 0 };
3063 	struct npc_exact_table_entry *cam_entry;
3064 	struct npc_exact_table *table;
3065 	struct rvu *rvu = s->private;
3066 	int i, j;
3067 
3068 	u8 bitmap = 0;
3069 
3070 	table = rvu->hw->table;
3071 
3072 	mutex_lock(&table->lock);
3073 
3074 	/* Check if there is at least one entry in mem table */
3075 	if (!table->mem_tbl_entry_cnt)
3076 		goto dump_cam_table;
3077 
3078 	/* Print table headers */
3079 	seq_puts(s, "\n\tExact Match MEM Table\n");
3080 	seq_puts(s, "Index\t");
3081 
3082 	for (i = 0; i < table->mem_table.ways; i++) {
3083 		mem_entry[i] = list_first_entry_or_null(&table->lhead_mem_tbl_entry[i],
3084 							struct npc_exact_table_entry, list);
3085 
3086 		seq_printf(s, "Way-%d\t\t\t\t\t", i);
3087 	}
3088 
3089 	seq_puts(s, "\n");
3090 	for (i = 0; i < table->mem_table.ways; i++)
3091 		seq_puts(s, "\tChan  MAC                     \t");
3092 
3093 	seq_puts(s, "\n\n");
3094 
3095 	/* Print mem table entries */
3096 	for (i = 0; i < table->mem_table.depth; i++) {
3097 		bitmap = 0;
3098 		for (j = 0; j < table->mem_table.ways; j++) {
3099 			if (!mem_entry[j])
3100 				continue;
3101 
3102 			if (mem_entry[j]->index != i)
3103 				continue;
3104 
3105 			bitmap |= BIT(j);
3106 		}
3107 
3108 		/* No valid entries */
3109 		if (!bitmap)
3110 			continue;
3111 
3112 		seq_printf(s, "%d\t", i);
3113 		for (j = 0; j < table->mem_table.ways; j++) {
3114 			if (!(bitmap & BIT(j))) {
3115 				seq_puts(s, "nil\t\t\t\t\t");
3116 				continue;
3117 			}
3118 
3119 			seq_printf(s, "0x%x %pM\t\t\t", mem_entry[j]->chan,
3120 				   mem_entry[j]->mac);
3121 			mem_entry[j] = list_next_entry(mem_entry[j], list);
3122 		}
3123 		seq_puts(s, "\n");
3124 	}
3125 
3126 dump_cam_table:
3127 
3128 	if (!table->cam_tbl_entry_cnt)
3129 		goto done;
3130 
3131 	seq_puts(s, "\n\tExact Match CAM Table\n");
3132 	seq_puts(s, "index\tchan\tMAC\n");
3133 
3134 	/* Traverse cam table entries */
3135 	list_for_each_entry(cam_entry, &table->lhead_cam_tbl_entry, list) {
3136 		seq_printf(s, "%d\t0x%x\t%pM\n", cam_entry->index, cam_entry->chan,
3137 			   cam_entry->mac);
3138 	}
3139 
3140 done:
3141 	mutex_unlock(&table->lock);
3142 	return 0;
3143 }
3144 
3145 RVU_DEBUG_SEQ_FOPS(npc_exact_entries, npc_exact_show_entries, NULL);
3146 
rvu_dbg_npc_exact_show_info(struct seq_file * s,void * unused)3147 static int rvu_dbg_npc_exact_show_info(struct seq_file *s, void *unused)
3148 {
3149 	struct npc_exact_table *table;
3150 	struct rvu *rvu = s->private;
3151 	int i;
3152 
3153 	table = rvu->hw->table;
3154 
3155 	seq_puts(s, "\n\tExact Table Info\n");
3156 	seq_printf(s, "Exact Match Feature : %s\n",
3157 		   rvu->hw->cap.npc_exact_match_enabled ? "enabled" : "disable");
3158 	if (!rvu->hw->cap.npc_exact_match_enabled)
3159 		return 0;
3160 
3161 	seq_puts(s, "\nMCAM Index\tMAC Filter Rules Count\n");
3162 	for (i = 0; i < table->num_drop_rules; i++)
3163 		seq_printf(s, "%d\t\t%d\n", i, table->cnt_cmd_rules[i]);
3164 
3165 	seq_puts(s, "\nMcam Index\tPromisc Mode Status\n");
3166 	for (i = 0; i < table->num_drop_rules; i++)
3167 		seq_printf(s, "%d\t\t%s\n", i, table->promisc_mode[i] ? "on" : "off");
3168 
3169 	seq_puts(s, "\n\tMEM Table Info\n");
3170 	seq_printf(s, "Ways : %d\n", table->mem_table.ways);
3171 	seq_printf(s, "Depth : %d\n", table->mem_table.depth);
3172 	seq_printf(s, "Mask : 0x%llx\n", table->mem_table.mask);
3173 	seq_printf(s, "Hash Mask : 0x%x\n", table->mem_table.hash_mask);
3174 	seq_printf(s, "Hash Offset : 0x%x\n", table->mem_table.hash_offset);
3175 
3176 	seq_puts(s, "\n\tCAM Table Info\n");
3177 	seq_printf(s, "Depth : %d\n", table->cam_table.depth);
3178 
3179 	return 0;
3180 }
3181 
3182 RVU_DEBUG_SEQ_FOPS(npc_exact_info, npc_exact_show_info, NULL);
3183 
rvu_dbg_npc_exact_drop_cnt(struct seq_file * s,void * unused)3184 static int rvu_dbg_npc_exact_drop_cnt(struct seq_file *s, void *unused)
3185 {
3186 	struct npc_exact_table *table;
3187 	struct rvu *rvu = s->private;
3188 	struct npc_key_field *field;
3189 	u16 chan, pcifunc;
3190 	int blkaddr, i;
3191 	u64 cfg, cam1;
3192 	char *str;
3193 
3194 	blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
3195 	table = rvu->hw->table;
3196 
3197 	field = &rvu->hw->mcam.rx_key_fields[NPC_CHAN];
3198 
3199 	seq_puts(s, "\n\t Exact Hit on drop status\n");
3200 	seq_puts(s, "\npcifunc\tmcam_idx\tHits\tchan\tstatus\n");
3201 
3202 	for (i = 0; i < table->num_drop_rules; i++) {
3203 		pcifunc = rvu_npc_exact_drop_rule_to_pcifunc(rvu, i);
3204 		cfg = rvu_read64(rvu, blkaddr, NPC_AF_MCAMEX_BANKX_CFG(i, 0));
3205 
3206 		/* channel will be always in keyword 0 */
3207 		cam1 = rvu_read64(rvu, blkaddr,
3208 				  NPC_AF_MCAMEX_BANKX_CAMX_W0(i, 0, 1));
3209 		chan = field->kw_mask[0] & cam1;
3210 
3211 		str = (cfg & 1) ? "enabled" : "disabled";
3212 
3213 		seq_printf(s, "0x%x\t%d\t\t%llu\t0x%x\t%s\n", pcifunc, i,
3214 			   rvu_read64(rvu, blkaddr,
3215 				      NPC_AF_MATCH_STATX(table->counter_idx[i])),
3216 			   chan, str);
3217 	}
3218 
3219 	return 0;
3220 }
3221 
3222 RVU_DEBUG_SEQ_FOPS(npc_exact_drop_cnt, npc_exact_drop_cnt, NULL);
3223 
rvu_dbg_npc_init(struct rvu * rvu)3224 static void rvu_dbg_npc_init(struct rvu *rvu)
3225 {
3226 	rvu->rvu_dbg.npc = debugfs_create_dir("npc", rvu->rvu_dbg.root);
3227 
3228 	debugfs_create_file("mcam_info", 0444, rvu->rvu_dbg.npc, rvu,
3229 			    &rvu_dbg_npc_mcam_info_fops);
3230 	debugfs_create_file("mcam_rules", 0444, rvu->rvu_dbg.npc, rvu,
3231 			    &rvu_dbg_npc_mcam_rules_fops);
3232 
3233 	debugfs_create_file("rx_miss_act_stats", 0444, rvu->rvu_dbg.npc, rvu,
3234 			    &rvu_dbg_npc_rx_miss_act_fops);
3235 
3236 	if (!rvu->hw->cap.npc_exact_match_enabled)
3237 		return;
3238 
3239 	debugfs_create_file("exact_entries", 0444, rvu->rvu_dbg.npc, rvu,
3240 			    &rvu_dbg_npc_exact_entries_fops);
3241 
3242 	debugfs_create_file("exact_info", 0444, rvu->rvu_dbg.npc, rvu,
3243 			    &rvu_dbg_npc_exact_info_fops);
3244 
3245 	debugfs_create_file("exact_drop_cnt", 0444, rvu->rvu_dbg.npc, rvu,
3246 			    &rvu_dbg_npc_exact_drop_cnt_fops);
3247 
3248 }
3249 
cpt_eng_sts_display(struct seq_file * filp,u8 eng_type)3250 static int cpt_eng_sts_display(struct seq_file *filp, u8 eng_type)
3251 {
3252 	struct cpt_ctx *ctx = filp->private;
3253 	u64 busy_sts = 0, free_sts = 0;
3254 	u32 e_min = 0, e_max = 0, e, i;
3255 	u16 max_ses, max_ies, max_aes;
3256 	struct rvu *rvu = ctx->rvu;
3257 	int blkaddr = ctx->blkaddr;
3258 	u64 reg;
3259 
3260 	reg = rvu_read64(rvu, blkaddr, CPT_AF_CONSTANTS1);
3261 	max_ses = reg & 0xffff;
3262 	max_ies = (reg >> 16) & 0xffff;
3263 	max_aes = (reg >> 32) & 0xffff;
3264 
3265 	switch (eng_type) {
3266 	case CPT_AE_TYPE:
3267 		e_min = max_ses + max_ies;
3268 		e_max = max_ses + max_ies + max_aes;
3269 		break;
3270 	case CPT_SE_TYPE:
3271 		e_min = 0;
3272 		e_max = max_ses;
3273 		break;
3274 	case CPT_IE_TYPE:
3275 		e_min = max_ses;
3276 		e_max = max_ses + max_ies;
3277 		break;
3278 	default:
3279 		return -EINVAL;
3280 	}
3281 
3282 	for (e = e_min, i = 0; e < e_max; e++, i++) {
3283 		reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_STS(e));
3284 		if (reg & 0x1)
3285 			busy_sts |= 1ULL << i;
3286 
3287 		if (reg & 0x2)
3288 			free_sts |= 1ULL << i;
3289 	}
3290 	seq_printf(filp, "FREE STS : 0x%016llx\n", free_sts);
3291 	seq_printf(filp, "BUSY STS : 0x%016llx\n", busy_sts);
3292 
3293 	return 0;
3294 }
3295 
rvu_dbg_cpt_ae_sts_display(struct seq_file * filp,void * unused)3296 static int rvu_dbg_cpt_ae_sts_display(struct seq_file *filp, void *unused)
3297 {
3298 	return cpt_eng_sts_display(filp, CPT_AE_TYPE);
3299 }
3300 
3301 RVU_DEBUG_SEQ_FOPS(cpt_ae_sts, cpt_ae_sts_display, NULL);
3302 
rvu_dbg_cpt_se_sts_display(struct seq_file * filp,void * unused)3303 static int rvu_dbg_cpt_se_sts_display(struct seq_file *filp, void *unused)
3304 {
3305 	return cpt_eng_sts_display(filp, CPT_SE_TYPE);
3306 }
3307 
3308 RVU_DEBUG_SEQ_FOPS(cpt_se_sts, cpt_se_sts_display, NULL);
3309 
rvu_dbg_cpt_ie_sts_display(struct seq_file * filp,void * unused)3310 static int rvu_dbg_cpt_ie_sts_display(struct seq_file *filp, void *unused)
3311 {
3312 	return cpt_eng_sts_display(filp, CPT_IE_TYPE);
3313 }
3314 
3315 RVU_DEBUG_SEQ_FOPS(cpt_ie_sts, cpt_ie_sts_display, NULL);
3316 
rvu_dbg_cpt_engines_info_display(struct seq_file * filp,void * unused)3317 static int rvu_dbg_cpt_engines_info_display(struct seq_file *filp, void *unused)
3318 {
3319 	struct cpt_ctx *ctx = filp->private;
3320 	u16 max_ses, max_ies, max_aes;
3321 	struct rvu *rvu = ctx->rvu;
3322 	int blkaddr = ctx->blkaddr;
3323 	u32 e_max, e;
3324 	u64 reg;
3325 
3326 	reg = rvu_read64(rvu, blkaddr, CPT_AF_CONSTANTS1);
3327 	max_ses = reg & 0xffff;
3328 	max_ies = (reg >> 16) & 0xffff;
3329 	max_aes = (reg >> 32) & 0xffff;
3330 
3331 	e_max = max_ses + max_ies + max_aes;
3332 
3333 	seq_puts(filp, "===========================================\n");
3334 	for (e = 0; e < e_max; e++) {
3335 		reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_CTL2(e));
3336 		seq_printf(filp, "CPT Engine[%u] Group Enable   0x%02llx\n", e,
3337 			   reg & 0xff);
3338 		reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_ACTIVE(e));
3339 		seq_printf(filp, "CPT Engine[%u] Active Info    0x%llx\n", e,
3340 			   reg);
3341 		reg = rvu_read64(rvu, blkaddr, CPT_AF_EXEX_CTL(e));
3342 		seq_printf(filp, "CPT Engine[%u] Control        0x%llx\n", e,
3343 			   reg);
3344 		seq_puts(filp, "===========================================\n");
3345 	}
3346 	return 0;
3347 }
3348 
3349 RVU_DEBUG_SEQ_FOPS(cpt_engines_info, cpt_engines_info_display, NULL);
3350 
rvu_dbg_cpt_lfs_info_display(struct seq_file * filp,void * unused)3351 static int rvu_dbg_cpt_lfs_info_display(struct seq_file *filp, void *unused)
3352 {
3353 	struct cpt_ctx *ctx = filp->private;
3354 	int blkaddr = ctx->blkaddr;
3355 	struct rvu *rvu = ctx->rvu;
3356 	struct rvu_block *block;
3357 	struct rvu_hwinfo *hw;
3358 	u64 reg;
3359 	u32 lf;
3360 
3361 	hw = rvu->hw;
3362 	block = &hw->block[blkaddr];
3363 	if (!block->lf.bmap)
3364 		return -ENODEV;
3365 
3366 	seq_puts(filp, "===========================================\n");
3367 	for (lf = 0; lf < block->lf.max; lf++) {
3368 		reg = rvu_read64(rvu, blkaddr, CPT_AF_LFX_CTL(lf));
3369 		seq_printf(filp, "CPT Lf[%u] CTL          0x%llx\n", lf, reg);
3370 		reg = rvu_read64(rvu, blkaddr, CPT_AF_LFX_CTL2(lf));
3371 		seq_printf(filp, "CPT Lf[%u] CTL2         0x%llx\n", lf, reg);
3372 		reg = rvu_read64(rvu, blkaddr, CPT_AF_LFX_PTR_CTL(lf));
3373 		seq_printf(filp, "CPT Lf[%u] PTR_CTL      0x%llx\n", lf, reg);
3374 		reg = rvu_read64(rvu, blkaddr, block->lfcfg_reg |
3375 				(lf << block->lfshift));
3376 		seq_printf(filp, "CPT Lf[%u] CFG          0x%llx\n", lf, reg);
3377 		seq_puts(filp, "===========================================\n");
3378 	}
3379 	return 0;
3380 }
3381 
3382 RVU_DEBUG_SEQ_FOPS(cpt_lfs_info, cpt_lfs_info_display, NULL);
3383 
rvu_dbg_cpt_err_info_display(struct seq_file * filp,void * unused)3384 static int rvu_dbg_cpt_err_info_display(struct seq_file *filp, void *unused)
3385 {
3386 	struct cpt_ctx *ctx = filp->private;
3387 	struct rvu *rvu = ctx->rvu;
3388 	int blkaddr = ctx->blkaddr;
3389 	u64 reg0, reg1;
3390 
3391 	reg0 = rvu_read64(rvu, blkaddr, CPT_AF_FLTX_INT(0));
3392 	reg1 = rvu_read64(rvu, blkaddr, CPT_AF_FLTX_INT(1));
3393 	seq_printf(filp, "CPT_AF_FLTX_INT:       0x%llx 0x%llx\n", reg0, reg1);
3394 	reg0 = rvu_read64(rvu, blkaddr, CPT_AF_PSNX_EXE(0));
3395 	reg1 = rvu_read64(rvu, blkaddr, CPT_AF_PSNX_EXE(1));
3396 	seq_printf(filp, "CPT_AF_PSNX_EXE:       0x%llx 0x%llx\n", reg0, reg1);
3397 	reg0 = rvu_read64(rvu, blkaddr, CPT_AF_PSNX_LF(0));
3398 	seq_printf(filp, "CPT_AF_PSNX_LF:        0x%llx\n", reg0);
3399 	reg0 = rvu_read64(rvu, blkaddr, CPT_AF_RVU_INT);
3400 	seq_printf(filp, "CPT_AF_RVU_INT:        0x%llx\n", reg0);
3401 	reg0 = rvu_read64(rvu, blkaddr, CPT_AF_RAS_INT);
3402 	seq_printf(filp, "CPT_AF_RAS_INT:        0x%llx\n", reg0);
3403 	reg0 = rvu_read64(rvu, blkaddr, CPT_AF_EXE_ERR_INFO);
3404 	seq_printf(filp, "CPT_AF_EXE_ERR_INFO:   0x%llx\n", reg0);
3405 
3406 	return 0;
3407 }
3408 
3409 RVU_DEBUG_SEQ_FOPS(cpt_err_info, cpt_err_info_display, NULL);
3410 
rvu_dbg_cpt_pc_display(struct seq_file * filp,void * unused)3411 static int rvu_dbg_cpt_pc_display(struct seq_file *filp, void *unused)
3412 {
3413 	struct cpt_ctx *ctx = filp->private;
3414 	struct rvu *rvu = ctx->rvu;
3415 	int blkaddr = ctx->blkaddr;
3416 	u64 reg;
3417 
3418 	reg = rvu_read64(rvu, blkaddr, CPT_AF_INST_REQ_PC);
3419 	seq_printf(filp, "CPT instruction requests   %llu\n", reg);
3420 	reg = rvu_read64(rvu, blkaddr, CPT_AF_INST_LATENCY_PC);
3421 	seq_printf(filp, "CPT instruction latency    %llu\n", reg);
3422 	reg = rvu_read64(rvu, blkaddr, CPT_AF_RD_REQ_PC);
3423 	seq_printf(filp, "CPT NCB read requests      %llu\n", reg);
3424 	reg = rvu_read64(rvu, blkaddr, CPT_AF_RD_LATENCY_PC);
3425 	seq_printf(filp, "CPT NCB read latency       %llu\n", reg);
3426 	reg = rvu_read64(rvu, blkaddr, CPT_AF_RD_UC_PC);
3427 	seq_printf(filp, "CPT read requests caused by UC fills   %llu\n", reg);
3428 	reg = rvu_read64(rvu, blkaddr, CPT_AF_ACTIVE_CYCLES_PC);
3429 	seq_printf(filp, "CPT active cycles pc       %llu\n", reg);
3430 	reg = rvu_read64(rvu, blkaddr, CPT_AF_CPTCLK_CNT);
3431 	seq_printf(filp, "CPT clock count pc         %llu\n", reg);
3432 
3433 	return 0;
3434 }
3435 
3436 RVU_DEBUG_SEQ_FOPS(cpt_pc, cpt_pc_display, NULL);
3437 
rvu_dbg_cpt_init(struct rvu * rvu,int blkaddr)3438 static void rvu_dbg_cpt_init(struct rvu *rvu, int blkaddr)
3439 {
3440 	struct cpt_ctx *ctx;
3441 
3442 	if (!is_block_implemented(rvu->hw, blkaddr))
3443 		return;
3444 
3445 	if (blkaddr == BLKADDR_CPT0) {
3446 		rvu->rvu_dbg.cpt = debugfs_create_dir("cpt", rvu->rvu_dbg.root);
3447 		ctx = &rvu->rvu_dbg.cpt_ctx[0];
3448 		ctx->blkaddr = BLKADDR_CPT0;
3449 		ctx->rvu = rvu;
3450 	} else {
3451 		rvu->rvu_dbg.cpt = debugfs_create_dir("cpt1",
3452 						      rvu->rvu_dbg.root);
3453 		ctx = &rvu->rvu_dbg.cpt_ctx[1];
3454 		ctx->blkaddr = BLKADDR_CPT1;
3455 		ctx->rvu = rvu;
3456 	}
3457 
3458 	debugfs_create_file("cpt_pc", 0600, rvu->rvu_dbg.cpt, ctx,
3459 			    &rvu_dbg_cpt_pc_fops);
3460 	debugfs_create_file("cpt_ae_sts", 0600, rvu->rvu_dbg.cpt, ctx,
3461 			    &rvu_dbg_cpt_ae_sts_fops);
3462 	debugfs_create_file("cpt_se_sts", 0600, rvu->rvu_dbg.cpt, ctx,
3463 			    &rvu_dbg_cpt_se_sts_fops);
3464 	debugfs_create_file("cpt_ie_sts", 0600, rvu->rvu_dbg.cpt, ctx,
3465 			    &rvu_dbg_cpt_ie_sts_fops);
3466 	debugfs_create_file("cpt_engines_info", 0600, rvu->rvu_dbg.cpt, ctx,
3467 			    &rvu_dbg_cpt_engines_info_fops);
3468 	debugfs_create_file("cpt_lfs_info", 0600, rvu->rvu_dbg.cpt, ctx,
3469 			    &rvu_dbg_cpt_lfs_info_fops);
3470 	debugfs_create_file("cpt_err_info", 0600, rvu->rvu_dbg.cpt, ctx,
3471 			    &rvu_dbg_cpt_err_info_fops);
3472 }
3473 
rvu_get_dbg_dir_name(struct rvu * rvu)3474 static const char *rvu_get_dbg_dir_name(struct rvu *rvu)
3475 {
3476 	if (!is_rvu_otx2(rvu))
3477 		return "cn10k";
3478 	else
3479 		return "octeontx2";
3480 }
3481 
rvu_dbg_init(struct rvu * rvu)3482 void rvu_dbg_init(struct rvu *rvu)
3483 {
3484 	rvu->rvu_dbg.root = debugfs_create_dir(rvu_get_dbg_dir_name(rvu), NULL);
3485 
3486 	debugfs_create_file("rsrc_alloc", 0444, rvu->rvu_dbg.root, rvu,
3487 			    &rvu_dbg_rsrc_status_fops);
3488 
3489 	if (!is_rvu_otx2(rvu))
3490 		debugfs_create_file("lmtst_map_table", 0444, rvu->rvu_dbg.root,
3491 				    rvu, &rvu_dbg_lmtst_map_table_fops);
3492 
3493 	if (!cgx_get_cgxcnt_max())
3494 		goto create;
3495 
3496 	if (is_rvu_otx2(rvu))
3497 		debugfs_create_file("rvu_pf_cgx_map", 0444, rvu->rvu_dbg.root,
3498 				    rvu, &rvu_dbg_rvu_pf_cgx_map_fops);
3499 	else
3500 		debugfs_create_file("rvu_pf_rpm_map", 0444, rvu->rvu_dbg.root,
3501 				    rvu, &rvu_dbg_rvu_pf_cgx_map_fops);
3502 
3503 create:
3504 	rvu_dbg_npa_init(rvu);
3505 	rvu_dbg_nix_init(rvu, BLKADDR_NIX0);
3506 
3507 	rvu_dbg_nix_init(rvu, BLKADDR_NIX1);
3508 	rvu_dbg_cgx_init(rvu);
3509 	rvu_dbg_npc_init(rvu);
3510 	rvu_dbg_cpt_init(rvu, BLKADDR_CPT0);
3511 	rvu_dbg_cpt_init(rvu, BLKADDR_CPT1);
3512 	rvu_dbg_mcs_init(rvu);
3513 }
3514 
rvu_dbg_exit(struct rvu * rvu)3515 void rvu_dbg_exit(struct rvu *rvu)
3516 {
3517 	debugfs_remove_recursive(rvu->rvu_dbg.root);
3518 }
3519 
3520 #endif /* CONFIG_DEBUG_FS */
3521