1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47#include <linux/debugfs.h>
48#include <linux/seq_file.h>
49#include <linux/kernel.h>
50#include <linux/export.h>
51#include <linux/module.h>
52#include <linux/string.h>
53#include <linux/types.h>
54#include <linux/ratelimit.h>
55#include <linux/fault-inject.h>
56
57#include "hfi.h"
58#include "trace.h"
59#include "debugfs.h"
60#include "device.h"
61#include "qp.h"
62#include "sdma.h"
63
64static struct dentry *hfi1_dbg_root;
65
66
67static ssize_t hfi1_seq_read(
68 struct file *file,
69 char __user *buf,
70 size_t size,
71 loff_t *ppos)
72{
73 struct dentry *d = file->f_path.dentry;
74 int srcu_idx;
75 ssize_t r;
76
77 r = debugfs_use_file_start(d, &srcu_idx);
78 if (likely(!r))
79 r = seq_read(file, buf, size, ppos);
80 debugfs_use_file_finish(srcu_idx);
81 return r;
82}
83
84static loff_t hfi1_seq_lseek(
85 struct file *file,
86 loff_t offset,
87 int whence)
88{
89 struct dentry *d = file->f_path.dentry;
90 int srcu_idx;
91 loff_t r;
92
93 r = debugfs_use_file_start(d, &srcu_idx);
94 if (likely(!r))
95 r = seq_lseek(file, offset, whence);
96 debugfs_use_file_finish(srcu_idx);
97 return r;
98}
99
100#define private2dd(file) (file_inode(file)->i_private)
101#define private2ppd(file) (file_inode(file)->i_private)
102
103#define DEBUGFS_SEQ_FILE_OPS(name) \
104static const struct seq_operations _##name##_seq_ops = { \
105 .start = _##name##_seq_start, \
106 .next = _##name##_seq_next, \
107 .stop = _##name##_seq_stop, \
108 .show = _##name##_seq_show \
109}
110
111#define DEBUGFS_SEQ_FILE_OPEN(name) \
112static int _##name##_open(struct inode *inode, struct file *s) \
113{ \
114 struct seq_file *seq; \
115 int ret; \
116 ret = seq_open(s, &_##name##_seq_ops); \
117 if (ret) \
118 return ret; \
119 seq = s->private_data; \
120 seq->private = inode->i_private; \
121 return 0; \
122}
123
124#define DEBUGFS_FILE_OPS(name) \
125static const struct file_operations _##name##_file_ops = { \
126 .owner = THIS_MODULE, \
127 .open = _##name##_open, \
128 .read = hfi1_seq_read, \
129 .llseek = hfi1_seq_lseek, \
130 .release = seq_release \
131}
132
133#define DEBUGFS_FILE_CREATE(name, parent, data, ops, mode) \
134do { \
135 struct dentry *ent; \
136 ent = debugfs_create_file(name, mode, parent, \
137 data, ops); \
138 if (!ent) \
139 pr_warn("create of %s failed\n", name); \
140} while (0)
141
142#define DEBUGFS_SEQ_FILE_CREATE(name, parent, data) \
143 DEBUGFS_FILE_CREATE(#name, parent, data, &_##name##_file_ops, S_IRUGO)
144
145static void *_opcode_stats_seq_start(struct seq_file *s, loff_t *pos)
146{
147 struct hfi1_opcode_stats_perctx *opstats;
148
149 if (*pos >= ARRAY_SIZE(opstats->stats))
150 return NULL;
151 return pos;
152}
153
154static void *_opcode_stats_seq_next(struct seq_file *s, void *v, loff_t *pos)
155{
156 struct hfi1_opcode_stats_perctx *opstats;
157
158 ++*pos;
159 if (*pos >= ARRAY_SIZE(opstats->stats))
160 return NULL;
161 return pos;
162}
163
164static void _opcode_stats_seq_stop(struct seq_file *s, void *v)
165{
166}
167
168static int _opcode_stats_seq_show(struct seq_file *s, void *v)
169{
170 loff_t *spos = v;
171 loff_t i = *spos, j;
172 u64 n_packets = 0, n_bytes = 0;
173 struct hfi1_ibdev *ibd = (struct hfi1_ibdev *)s->private;
174 struct hfi1_devdata *dd = dd_from_dev(ibd);
175 struct hfi1_ctxtdata *rcd;
176
177 for (j = 0; j < dd->first_dyn_alloc_ctxt; j++) {
178 rcd = hfi1_rcd_get_by_index(dd, j);
179 if (rcd) {
180 n_packets += rcd->opstats->stats[i].n_packets;
181 n_bytes += rcd->opstats->stats[i].n_bytes;
182 }
183 hfi1_rcd_put(rcd);
184 }
185 if (!n_packets && !n_bytes)
186 return SEQ_SKIP;
187 seq_printf(s, "%02llx %llu/%llu\n", i,
188 (unsigned long long)n_packets,
189 (unsigned long long)n_bytes);
190
191 return 0;
192}
193
194DEBUGFS_SEQ_FILE_OPS(opcode_stats);
195DEBUGFS_SEQ_FILE_OPEN(opcode_stats)
196DEBUGFS_FILE_OPS(opcode_stats);
197
198static void *_ctx_stats_seq_start(struct seq_file *s, loff_t *pos)
199{
200 struct hfi1_ibdev *ibd = (struct hfi1_ibdev *)s->private;
201 struct hfi1_devdata *dd = dd_from_dev(ibd);
202
203 if (!*pos)
204 return SEQ_START_TOKEN;
205 if (*pos >= dd->first_dyn_alloc_ctxt)
206 return NULL;
207 return pos;
208}
209
210static void *_ctx_stats_seq_next(struct seq_file *s, void *v, loff_t *pos)
211{
212 struct hfi1_ibdev *ibd = (struct hfi1_ibdev *)s->private;
213 struct hfi1_devdata *dd = dd_from_dev(ibd);
214
215 if (v == SEQ_START_TOKEN)
216 return pos;
217
218 ++*pos;
219 if (*pos >= dd->first_dyn_alloc_ctxt)
220 return NULL;
221 return pos;
222}
223
224static void _ctx_stats_seq_stop(struct seq_file *s, void *v)
225{
226
227}
228
229static int _ctx_stats_seq_show(struct seq_file *s, void *v)
230{
231 loff_t *spos;
232 loff_t i, j;
233 u64 n_packets = 0;
234 struct hfi1_ibdev *ibd = (struct hfi1_ibdev *)s->private;
235 struct hfi1_devdata *dd = dd_from_dev(ibd);
236 struct hfi1_ctxtdata *rcd;
237
238 if (v == SEQ_START_TOKEN) {
239 seq_puts(s, "Ctx:npkts\n");
240 return 0;
241 }
242
243 spos = v;
244 i = *spos;
245
246 rcd = hfi1_rcd_get_by_index(dd, i);
247 if (!rcd)
248 return SEQ_SKIP;
249
250 for (j = 0; j < ARRAY_SIZE(rcd->opstats->stats); j++)
251 n_packets += rcd->opstats->stats[j].n_packets;
252
253 hfi1_rcd_put(rcd);
254
255 if (!n_packets)
256 return SEQ_SKIP;
257
258 seq_printf(s, " %llu:%llu\n", i, n_packets);
259 return 0;
260}
261
262DEBUGFS_SEQ_FILE_OPS(ctx_stats);
263DEBUGFS_SEQ_FILE_OPEN(ctx_stats)
264DEBUGFS_FILE_OPS(ctx_stats);
265
266static void *_qp_stats_seq_start(struct seq_file *s, loff_t *pos)
267 __acquires(RCU)
268{
269 struct rvt_qp_iter *iter;
270 loff_t n = *pos;
271
272 iter = rvt_qp_iter_init(s->private, 0, NULL);
273
274
275 rcu_read_lock();
276
277 if (!iter)
278 return NULL;
279
280 do {
281 if (rvt_qp_iter_next(iter)) {
282 kfree(iter);
283 return NULL;
284 }
285 } while (n--);
286
287 return iter;
288}
289
290static void *_qp_stats_seq_next(struct seq_file *s, void *iter_ptr,
291 loff_t *pos)
292 __must_hold(RCU)
293{
294 struct rvt_qp_iter *iter = iter_ptr;
295
296 (*pos)++;
297
298 if (rvt_qp_iter_next(iter)) {
299 kfree(iter);
300 return NULL;
301 }
302
303 return iter;
304}
305
306static void _qp_stats_seq_stop(struct seq_file *s, void *iter_ptr)
307 __releases(RCU)
308{
309 rcu_read_unlock();
310}
311
312static int _qp_stats_seq_show(struct seq_file *s, void *iter_ptr)
313{
314 struct rvt_qp_iter *iter = iter_ptr;
315
316 if (!iter)
317 return 0;
318
319 qp_iter_print(s, iter);
320
321 return 0;
322}
323
324DEBUGFS_SEQ_FILE_OPS(qp_stats);
325DEBUGFS_SEQ_FILE_OPEN(qp_stats)
326DEBUGFS_FILE_OPS(qp_stats);
327
328static void *_sdes_seq_start(struct seq_file *s, loff_t *pos)
329{
330 struct hfi1_ibdev *ibd;
331 struct hfi1_devdata *dd;
332
333 ibd = (struct hfi1_ibdev *)s->private;
334 dd = dd_from_dev(ibd);
335 if (!dd->per_sdma || *pos >= dd->num_sdma)
336 return NULL;
337 return pos;
338}
339
340static void *_sdes_seq_next(struct seq_file *s, void *v, loff_t *pos)
341{
342 struct hfi1_ibdev *ibd = (struct hfi1_ibdev *)s->private;
343 struct hfi1_devdata *dd = dd_from_dev(ibd);
344
345 ++*pos;
346 if (!dd->per_sdma || *pos >= dd->num_sdma)
347 return NULL;
348 return pos;
349}
350
351static void _sdes_seq_stop(struct seq_file *s, void *v)
352{
353}
354
355static int _sdes_seq_show(struct seq_file *s, void *v)
356{
357 struct hfi1_ibdev *ibd = (struct hfi1_ibdev *)s->private;
358 struct hfi1_devdata *dd = dd_from_dev(ibd);
359 loff_t *spos = v;
360 loff_t i = *spos;
361
362 sdma_seqfile_dump_sde(s, &dd->per_sdma[i]);
363 return 0;
364}
365
366DEBUGFS_SEQ_FILE_OPS(sdes);
367DEBUGFS_SEQ_FILE_OPEN(sdes)
368DEBUGFS_FILE_OPS(sdes);
369
370static void *_rcds_seq_start(struct seq_file *s, loff_t *pos)
371{
372 struct hfi1_ibdev *ibd;
373 struct hfi1_devdata *dd;
374
375 ibd = (struct hfi1_ibdev *)s->private;
376 dd = dd_from_dev(ibd);
377 if (!dd->rcd || *pos >= dd->n_krcv_queues)
378 return NULL;
379 return pos;
380}
381
382static void *_rcds_seq_next(struct seq_file *s, void *v, loff_t *pos)
383{
384 struct hfi1_ibdev *ibd = (struct hfi1_ibdev *)s->private;
385 struct hfi1_devdata *dd = dd_from_dev(ibd);
386
387 ++*pos;
388 if (!dd->rcd || *pos >= dd->n_krcv_queues)
389 return NULL;
390 return pos;
391}
392
393static void _rcds_seq_stop(struct seq_file *s, void *v)
394{
395}
396
397static int _rcds_seq_show(struct seq_file *s, void *v)
398{
399 struct hfi1_ibdev *ibd = (struct hfi1_ibdev *)s->private;
400 struct hfi1_devdata *dd = dd_from_dev(ibd);
401 struct hfi1_ctxtdata *rcd;
402 loff_t *spos = v;
403 loff_t i = *spos;
404
405 rcd = hfi1_rcd_get_by_index(dd, i);
406 if (rcd)
407 seqfile_dump_rcd(s, rcd);
408 hfi1_rcd_put(rcd);
409 return 0;
410}
411
412DEBUGFS_SEQ_FILE_OPS(rcds);
413DEBUGFS_SEQ_FILE_OPEN(rcds)
414DEBUGFS_FILE_OPS(rcds);
415
416
417static ssize_t dev_counters_read(struct file *file, char __user *buf,
418 size_t count, loff_t *ppos)
419{
420 u64 *counters;
421 size_t avail;
422 struct hfi1_devdata *dd;
423 ssize_t rval;
424
425 dd = private2dd(file);
426 avail = hfi1_read_cntrs(dd, NULL, &counters);
427 rval = simple_read_from_buffer(buf, count, ppos, counters, avail);
428 return rval;
429}
430
431
432static ssize_t dev_names_read(struct file *file, char __user *buf,
433 size_t count, loff_t *ppos)
434{
435 char *names;
436 size_t avail;
437 struct hfi1_devdata *dd;
438 ssize_t rval;
439
440 dd = private2dd(file);
441 avail = hfi1_read_cntrs(dd, &names, NULL);
442 rval = simple_read_from_buffer(buf, count, ppos, names, avail);
443 return rval;
444}
445
446struct counter_info {
447 char *name;
448 const struct file_operations ops;
449};
450
451
452
453
454
455
456
457static ssize_t portnames_read(struct file *file, char __user *buf,
458 size_t count, loff_t *ppos)
459{
460 char *names;
461 size_t avail;
462 struct hfi1_devdata *dd;
463 ssize_t rval;
464
465 dd = private2dd(file);
466 avail = hfi1_read_portcntrs(dd->pport, &names, NULL);
467 rval = simple_read_from_buffer(buf, count, ppos, names, avail);
468 return rval;
469}
470
471
472static ssize_t portcntrs_debugfs_read(struct file *file, char __user *buf,
473 size_t count, loff_t *ppos)
474{
475 u64 *counters;
476 size_t avail;
477 struct hfi1_pportdata *ppd;
478 ssize_t rval;
479
480 ppd = private2ppd(file);
481 avail = hfi1_read_portcntrs(ppd, NULL, &counters);
482 rval = simple_read_from_buffer(buf, count, ppos, counters, avail);
483 return rval;
484}
485
486static void check_dyn_flag(u64 scratch0, char *p, int size, int *used,
487 int this_hfi, int hfi, u32 flag, const char *what)
488{
489 u32 mask;
490
491 mask = flag << (hfi ? CR_DYN_SHIFT : 0);
492 if (scratch0 & mask) {
493 *used += scnprintf(p + *used, size - *used,
494 " 0x%08x - HFI%d %s in use, %s device\n",
495 mask, hfi, what,
496 this_hfi == hfi ? "this" : "other");
497 }
498}
499
500static ssize_t asic_flags_read(struct file *file, char __user *buf,
501 size_t count, loff_t *ppos)
502{
503 struct hfi1_pportdata *ppd;
504 struct hfi1_devdata *dd;
505 u64 scratch0;
506 char *tmp;
507 int ret = 0;
508 int size;
509 int used;
510 int i;
511
512 ppd = private2ppd(file);
513 dd = ppd->dd;
514 size = PAGE_SIZE;
515 used = 0;
516 tmp = kmalloc(size, GFP_KERNEL);
517 if (!tmp)
518 return -ENOMEM;
519
520 scratch0 = read_csr(dd, ASIC_CFG_SCRATCH);
521 used += scnprintf(tmp + used, size - used,
522 "Resource flags: 0x%016llx\n", scratch0);
523
524
525 if (scratch0 & CR_THERM_INIT) {
526 used += scnprintf(tmp + used, size - used,
527 " 0x%08x - thermal monitoring initialized\n",
528 (u32)CR_THERM_INIT);
529 }
530
531
532 for (i = 0; i < 2; i++) {
533 check_dyn_flag(scratch0, tmp, size, &used, dd->hfi1_id, i,
534 CR_SBUS, "SBus");
535 check_dyn_flag(scratch0, tmp, size, &used, dd->hfi1_id, i,
536 CR_EPROM, "EPROM");
537 check_dyn_flag(scratch0, tmp, size, &used, dd->hfi1_id, i,
538 CR_I2C1, "i2c chain 1");
539 check_dyn_flag(scratch0, tmp, size, &used, dd->hfi1_id, i,
540 CR_I2C2, "i2c chain 2");
541 }
542 used += scnprintf(tmp + used, size - used, "Write bits to clear\n");
543
544 ret = simple_read_from_buffer(buf, count, ppos, tmp, used);
545 kfree(tmp);
546 return ret;
547}
548
549static ssize_t asic_flags_write(struct file *file, const char __user *buf,
550 size_t count, loff_t *ppos)
551{
552 struct hfi1_pportdata *ppd;
553 struct hfi1_devdata *dd;
554 char *buff;
555 int ret;
556 unsigned long long value;
557 u64 scratch0;
558 u64 clear;
559
560 ppd = private2ppd(file);
561 dd = ppd->dd;
562
563
564 buff = memdup_user_nul(buf, count);
565 if (IS_ERR(buff))
566 return PTR_ERR(buff);
567
568 ret = kstrtoull(buff, 0, &value);
569 if (ret)
570 goto do_free;
571 clear = value;
572
573
574 mutex_lock(&dd->asic_data->asic_resource_mutex);
575 acquire_hw_mutex(dd);
576
577 scratch0 = read_csr(dd, ASIC_CFG_SCRATCH);
578 scratch0 &= ~clear;
579 write_csr(dd, ASIC_CFG_SCRATCH, scratch0);
580
581 (void)read_csr(dd, ASIC_CFG_SCRATCH);
582
583 release_hw_mutex(dd);
584 mutex_unlock(&dd->asic_data->asic_resource_mutex);
585
586
587 ret = count;
588
589 do_free:
590 kfree(buff);
591 return ret;
592}
593
594
595static ssize_t dc8051_memory_read(struct file *file, char __user *buf,
596 size_t count, loff_t *ppos)
597{
598 struct hfi1_pportdata *ppd = private2ppd(file);
599 ssize_t rval;
600 void *tmp;
601 loff_t start, end;
602
603
604 if (*ppos < 0)
605 return -EINVAL;
606
607 tmp = kzalloc(DC8051_DATA_MEM_SIZE, GFP_KERNEL);
608 if (!tmp)
609 return -ENOMEM;
610
611
612
613
614
615
616
617 start = *ppos & ~0x7;
618 if (start < DC8051_DATA_MEM_SIZE) {
619 end = (*ppos + count + 7) & ~0x7;
620 if (end > DC8051_DATA_MEM_SIZE)
621 end = DC8051_DATA_MEM_SIZE;
622 rval = read_8051_data(ppd->dd, start, end - start,
623 (u64 *)(tmp + start));
624 if (rval)
625 goto done;
626 }
627
628 rval = simple_read_from_buffer(buf, count, ppos, tmp,
629 DC8051_DATA_MEM_SIZE);
630done:
631 kfree(tmp);
632 return rval;
633}
634
635static ssize_t debugfs_lcb_read(struct file *file, char __user *buf,
636 size_t count, loff_t *ppos)
637{
638 struct hfi1_pportdata *ppd = private2ppd(file);
639 struct hfi1_devdata *dd = ppd->dd;
640 unsigned long total, csr_off;
641 u64 data;
642
643 if (*ppos < 0)
644 return -EINVAL;
645
646 if ((count % 8) != 0)
647 return -EINVAL;
648
649 if ((*ppos % 8) != 0)
650 return -EINVAL;
651
652 if (*ppos >= (LCB_END - LCB_START) || !count)
653 return 0;
654
655 if (*ppos + count > LCB_END - LCB_START)
656 count = (LCB_END - LCB_START) - *ppos;
657
658 csr_off = LCB_START + *ppos;
659 for (total = 0; total < count; total += 8, csr_off += 8) {
660 if (read_lcb_csr(dd, csr_off, (u64 *)&data))
661 break;
662 if (put_user(data, (unsigned long __user *)(buf + total)))
663 break;
664 }
665 *ppos += total;
666 return total;
667}
668
669static ssize_t debugfs_lcb_write(struct file *file, const char __user *buf,
670 size_t count, loff_t *ppos)
671{
672 struct hfi1_pportdata *ppd = private2ppd(file);
673 struct hfi1_devdata *dd = ppd->dd;
674 unsigned long total, csr_off, data;
675
676 if (*ppos < 0)
677 return -EINVAL;
678
679 if ((count % 8) != 0)
680 return -EINVAL;
681
682 if ((*ppos % 8) != 0)
683 return -EINVAL;
684
685 if (*ppos >= (LCB_END - LCB_START) || !count)
686 return 0;
687
688 if (*ppos + count > LCB_END - LCB_START)
689 count = (LCB_END - LCB_START) - *ppos;
690
691 csr_off = LCB_START + *ppos;
692 for (total = 0; total < count; total += 8, csr_off += 8) {
693 if (get_user(data, (unsigned long __user *)(buf + total)))
694 break;
695 if (write_lcb_csr(dd, csr_off, data))
696 break;
697 }
698 *ppos += total;
699 return total;
700}
701
702
703
704
705static ssize_t qsfp_debugfs_dump(struct file *file, char __user *buf,
706 size_t count, loff_t *ppos)
707{
708 struct hfi1_pportdata *ppd;
709 char *tmp;
710 int ret;
711
712 ppd = private2ppd(file);
713 tmp = kmalloc(PAGE_SIZE, GFP_KERNEL);
714 if (!tmp)
715 return -ENOMEM;
716
717 ret = qsfp_dump(ppd, tmp, PAGE_SIZE);
718 if (ret > 0)
719 ret = simple_read_from_buffer(buf, count, ppos, tmp, ret);
720 kfree(tmp);
721 return ret;
722}
723
724
725static ssize_t __i2c_debugfs_write(struct file *file, const char __user *buf,
726 size_t count, loff_t *ppos, u32 target)
727{
728 struct hfi1_pportdata *ppd;
729 char *buff;
730 int ret;
731 int i2c_addr;
732 int offset;
733 int total_written;
734
735 ppd = private2ppd(file);
736
737
738 i2c_addr = (*ppos >> 16) & 0xffff;
739 offset = *ppos & 0xffff;
740
741
742 if (i2c_addr == 0)
743 return -EINVAL;
744
745 buff = memdup_user(buf, count);
746 if (IS_ERR(buff))
747 return PTR_ERR(buff);
748
749 total_written = i2c_write(ppd, target, i2c_addr, offset, buff, count);
750 if (total_written < 0) {
751 ret = total_written;
752 goto _free;
753 }
754
755 *ppos += total_written;
756
757 ret = total_written;
758
759 _free:
760 kfree(buff);
761 return ret;
762}
763
764
765static ssize_t i2c1_debugfs_write(struct file *file, const char __user *buf,
766 size_t count, loff_t *ppos)
767{
768 return __i2c_debugfs_write(file, buf, count, ppos, 0);
769}
770
771
772static ssize_t i2c2_debugfs_write(struct file *file, const char __user *buf,
773 size_t count, loff_t *ppos)
774{
775 return __i2c_debugfs_write(file, buf, count, ppos, 1);
776}
777
778
779static ssize_t __i2c_debugfs_read(struct file *file, char __user *buf,
780 size_t count, loff_t *ppos, u32 target)
781{
782 struct hfi1_pportdata *ppd;
783 char *buff;
784 int ret;
785 int i2c_addr;
786 int offset;
787 int total_read;
788
789 ppd = private2ppd(file);
790
791
792 i2c_addr = (*ppos >> 16) & 0xffff;
793 offset = *ppos & 0xffff;
794
795
796 if (i2c_addr == 0)
797 return -EINVAL;
798
799 buff = kmalloc(count, GFP_KERNEL);
800 if (!buff)
801 return -ENOMEM;
802
803 total_read = i2c_read(ppd, target, i2c_addr, offset, buff, count);
804 if (total_read < 0) {
805 ret = total_read;
806 goto _free;
807 }
808
809 *ppos += total_read;
810
811 ret = copy_to_user(buf, buff, total_read);
812 if (ret > 0) {
813 ret = -EFAULT;
814 goto _free;
815 }
816
817 ret = total_read;
818
819 _free:
820 kfree(buff);
821 return ret;
822}
823
824
825static ssize_t i2c1_debugfs_read(struct file *file, char __user *buf,
826 size_t count, loff_t *ppos)
827{
828 return __i2c_debugfs_read(file, buf, count, ppos, 0);
829}
830
831
832static ssize_t i2c2_debugfs_read(struct file *file, char __user *buf,
833 size_t count, loff_t *ppos)
834{
835 return __i2c_debugfs_read(file, buf, count, ppos, 1);
836}
837
838
839static ssize_t __qsfp_debugfs_write(struct file *file, const char __user *buf,
840 size_t count, loff_t *ppos, u32 target)
841{
842 struct hfi1_pportdata *ppd;
843 char *buff;
844 int ret;
845 int total_written;
846
847 if (*ppos + count > QSFP_PAGESIZE * 4)
848 return -EINVAL;
849
850 ppd = private2ppd(file);
851
852 buff = memdup_user(buf, count);
853 if (IS_ERR(buff))
854 return PTR_ERR(buff);
855
856 total_written = qsfp_write(ppd, target, *ppos, buff, count);
857 if (total_written < 0) {
858 ret = total_written;
859 goto _free;
860 }
861
862 *ppos += total_written;
863
864 ret = total_written;
865
866 _free:
867 kfree(buff);
868 return ret;
869}
870
871
872static ssize_t qsfp1_debugfs_write(struct file *file, const char __user *buf,
873 size_t count, loff_t *ppos)
874{
875 return __qsfp_debugfs_write(file, buf, count, ppos, 0);
876}
877
878
879static ssize_t qsfp2_debugfs_write(struct file *file, const char __user *buf,
880 size_t count, loff_t *ppos)
881{
882 return __qsfp_debugfs_write(file, buf, count, ppos, 1);
883}
884
885
886static ssize_t __qsfp_debugfs_read(struct file *file, char __user *buf,
887 size_t count, loff_t *ppos, u32 target)
888{
889 struct hfi1_pportdata *ppd;
890 char *buff;
891 int ret;
892 int total_read;
893
894 if (*ppos + count > QSFP_PAGESIZE * 4) {
895 ret = -EINVAL;
896 goto _return;
897 }
898
899 ppd = private2ppd(file);
900
901 buff = kmalloc(count, GFP_KERNEL);
902 if (!buff) {
903 ret = -ENOMEM;
904 goto _return;
905 }
906
907 total_read = qsfp_read(ppd, target, *ppos, buff, count);
908 if (total_read < 0) {
909 ret = total_read;
910 goto _free;
911 }
912
913 *ppos += total_read;
914
915 ret = copy_to_user(buf, buff, total_read);
916 if (ret > 0) {
917 ret = -EFAULT;
918 goto _free;
919 }
920
921 ret = total_read;
922
923 _free:
924 kfree(buff);
925 _return:
926 return ret;
927}
928
929
930static ssize_t qsfp1_debugfs_read(struct file *file, char __user *buf,
931 size_t count, loff_t *ppos)
932{
933 return __qsfp_debugfs_read(file, buf, count, ppos, 0);
934}
935
936
937static ssize_t qsfp2_debugfs_read(struct file *file, char __user *buf,
938 size_t count, loff_t *ppos)
939{
940 return __qsfp_debugfs_read(file, buf, count, ppos, 1);
941}
942
943static int __i2c_debugfs_open(struct inode *in, struct file *fp, u32 target)
944{
945 struct hfi1_pportdata *ppd;
946 int ret;
947
948 if (!try_module_get(THIS_MODULE))
949 return -ENODEV;
950
951 ppd = private2ppd(fp);
952
953 ret = acquire_chip_resource(ppd->dd, i2c_target(target), 0);
954 if (ret)
955 module_put(THIS_MODULE);
956
957 return ret;
958}
959
960static int i2c1_debugfs_open(struct inode *in, struct file *fp)
961{
962 return __i2c_debugfs_open(in, fp, 0);
963}
964
965static int i2c2_debugfs_open(struct inode *in, struct file *fp)
966{
967 return __i2c_debugfs_open(in, fp, 1);
968}
969
970static int __i2c_debugfs_release(struct inode *in, struct file *fp, u32 target)
971{
972 struct hfi1_pportdata *ppd;
973
974 ppd = private2ppd(fp);
975
976 release_chip_resource(ppd->dd, i2c_target(target));
977 module_put(THIS_MODULE);
978
979 return 0;
980}
981
982static int i2c1_debugfs_release(struct inode *in, struct file *fp)
983{
984 return __i2c_debugfs_release(in, fp, 0);
985}
986
987static int i2c2_debugfs_release(struct inode *in, struct file *fp)
988{
989 return __i2c_debugfs_release(in, fp, 1);
990}
991
992static int __qsfp_debugfs_open(struct inode *in, struct file *fp, u32 target)
993{
994 struct hfi1_pportdata *ppd;
995 int ret;
996
997 if (!try_module_get(THIS_MODULE))
998 return -ENODEV;
999
1000 ppd = private2ppd(fp);
1001
1002 ret = acquire_chip_resource(ppd->dd, i2c_target(target), 0);
1003 if (ret)
1004 module_put(THIS_MODULE);
1005
1006 return ret;
1007}
1008
1009static int qsfp1_debugfs_open(struct inode *in, struct file *fp)
1010{
1011 return __qsfp_debugfs_open(in, fp, 0);
1012}
1013
1014static int qsfp2_debugfs_open(struct inode *in, struct file *fp)
1015{
1016 return __qsfp_debugfs_open(in, fp, 1);
1017}
1018
1019static int __qsfp_debugfs_release(struct inode *in, struct file *fp, u32 target)
1020{
1021 struct hfi1_pportdata *ppd;
1022
1023 ppd = private2ppd(fp);
1024
1025 release_chip_resource(ppd->dd, i2c_target(target));
1026 module_put(THIS_MODULE);
1027
1028 return 0;
1029}
1030
1031static int qsfp1_debugfs_release(struct inode *in, struct file *fp)
1032{
1033 return __qsfp_debugfs_release(in, fp, 0);
1034}
1035
1036static int qsfp2_debugfs_release(struct inode *in, struct file *fp)
1037{
1038 return __qsfp_debugfs_release(in, fp, 1);
1039}
1040
1041#define DEBUGFS_OPS(nm, readroutine, writeroutine) \
1042{ \
1043 .name = nm, \
1044 .ops = { \
1045 .read = readroutine, \
1046 .write = writeroutine, \
1047 .llseek = generic_file_llseek, \
1048 }, \
1049}
1050
1051#define DEBUGFS_XOPS(nm, readf, writef, openf, releasef) \
1052{ \
1053 .name = nm, \
1054 .ops = { \
1055 .read = readf, \
1056 .write = writef, \
1057 .llseek = generic_file_llseek, \
1058 .open = openf, \
1059 .release = releasef \
1060 }, \
1061}
1062
1063static const struct counter_info cntr_ops[] = {
1064 DEBUGFS_OPS("counter_names", dev_names_read, NULL),
1065 DEBUGFS_OPS("counters", dev_counters_read, NULL),
1066 DEBUGFS_OPS("portcounter_names", portnames_read, NULL),
1067};
1068
1069static const struct counter_info port_cntr_ops[] = {
1070 DEBUGFS_OPS("port%dcounters", portcntrs_debugfs_read, NULL),
1071 DEBUGFS_XOPS("i2c1", i2c1_debugfs_read, i2c1_debugfs_write,
1072 i2c1_debugfs_open, i2c1_debugfs_release),
1073 DEBUGFS_XOPS("i2c2", i2c2_debugfs_read, i2c2_debugfs_write,
1074 i2c2_debugfs_open, i2c2_debugfs_release),
1075 DEBUGFS_OPS("qsfp_dump%d", qsfp_debugfs_dump, NULL),
1076 DEBUGFS_XOPS("qsfp1", qsfp1_debugfs_read, qsfp1_debugfs_write,
1077 qsfp1_debugfs_open, qsfp1_debugfs_release),
1078 DEBUGFS_XOPS("qsfp2", qsfp2_debugfs_read, qsfp2_debugfs_write,
1079 qsfp2_debugfs_open, qsfp2_debugfs_release),
1080 DEBUGFS_OPS("asic_flags", asic_flags_read, asic_flags_write),
1081 DEBUGFS_OPS("dc8051_memory", dc8051_memory_read, NULL),
1082 DEBUGFS_OPS("lcb", debugfs_lcb_read, debugfs_lcb_write),
1083};
1084
1085static void *_sdma_cpu_list_seq_start(struct seq_file *s, loff_t *pos)
1086{
1087 if (*pos >= num_online_cpus())
1088 return NULL;
1089
1090 return pos;
1091}
1092
1093static void *_sdma_cpu_list_seq_next(struct seq_file *s, void *v, loff_t *pos)
1094{
1095 ++*pos;
1096 if (*pos >= num_online_cpus())
1097 return NULL;
1098
1099 return pos;
1100}
1101
1102static void _sdma_cpu_list_seq_stop(struct seq_file *s, void *v)
1103{
1104
1105}
1106
1107static int _sdma_cpu_list_seq_show(struct seq_file *s, void *v)
1108{
1109 struct hfi1_ibdev *ibd = (struct hfi1_ibdev *)s->private;
1110 struct hfi1_devdata *dd = dd_from_dev(ibd);
1111 loff_t *spos = v;
1112 loff_t i = *spos;
1113
1114 sdma_seqfile_dump_cpu_list(s, dd, (unsigned long)i);
1115 return 0;
1116}
1117
1118DEBUGFS_SEQ_FILE_OPS(sdma_cpu_list);
1119DEBUGFS_SEQ_FILE_OPEN(sdma_cpu_list)
1120DEBUGFS_FILE_OPS(sdma_cpu_list);
1121
1122#ifdef CONFIG_FAULT_INJECTION
1123static void *_fault_stats_seq_start(struct seq_file *s, loff_t *pos)
1124{
1125 struct hfi1_opcode_stats_perctx *opstats;
1126
1127 if (*pos >= ARRAY_SIZE(opstats->stats))
1128 return NULL;
1129 return pos;
1130}
1131
1132static void *_fault_stats_seq_next(struct seq_file *s, void *v, loff_t *pos)
1133{
1134 struct hfi1_opcode_stats_perctx *opstats;
1135
1136 ++*pos;
1137 if (*pos >= ARRAY_SIZE(opstats->stats))
1138 return NULL;
1139 return pos;
1140}
1141
1142static void _fault_stats_seq_stop(struct seq_file *s, void *v)
1143{
1144}
1145
1146static int _fault_stats_seq_show(struct seq_file *s, void *v)
1147{
1148 loff_t *spos = v;
1149 loff_t i = *spos, j;
1150 u64 n_packets = 0, n_bytes = 0;
1151 struct hfi1_ibdev *ibd = (struct hfi1_ibdev *)s->private;
1152 struct hfi1_devdata *dd = dd_from_dev(ibd);
1153 struct hfi1_ctxtdata *rcd;
1154
1155 for (j = 0; j < dd->first_dyn_alloc_ctxt; j++) {
1156 rcd = hfi1_rcd_get_by_index(dd, j);
1157 if (rcd) {
1158 n_packets += rcd->opstats->stats[i].n_packets;
1159 n_bytes += rcd->opstats->stats[i].n_bytes;
1160 }
1161 hfi1_rcd_put(rcd);
1162 }
1163 if (!n_packets && !n_bytes)
1164 return SEQ_SKIP;
1165 if (!ibd->fault_opcode->n_rxfaults[i] &&
1166 !ibd->fault_opcode->n_txfaults[i])
1167 return SEQ_SKIP;
1168 seq_printf(s, "%02llx %llu/%llu (faults rx:%llu faults: tx:%llu)\n", i,
1169 (unsigned long long)n_packets,
1170 (unsigned long long)n_bytes,
1171 (unsigned long long)ibd->fault_opcode->n_rxfaults[i],
1172 (unsigned long long)ibd->fault_opcode->n_txfaults[i]);
1173 return 0;
1174}
1175
1176DEBUGFS_SEQ_FILE_OPS(fault_stats);
1177DEBUGFS_SEQ_FILE_OPEN(fault_stats);
1178DEBUGFS_FILE_OPS(fault_stats);
1179
1180static void fault_exit_opcode_debugfs(struct hfi1_ibdev *ibd)
1181{
1182 debugfs_remove_recursive(ibd->fault_opcode->dir);
1183 kfree(ibd->fault_opcode);
1184 ibd->fault_opcode = NULL;
1185}
1186
1187static int fault_init_opcode_debugfs(struct hfi1_ibdev *ibd)
1188{
1189 struct dentry *parent = ibd->hfi1_ibdev_dbg;
1190
1191 ibd->fault_opcode = kzalloc(sizeof(*ibd->fault_opcode), GFP_KERNEL);
1192 if (!ibd->fault_opcode)
1193 return -ENOMEM;
1194
1195 ibd->fault_opcode->attr.interval = 1;
1196 ibd->fault_opcode->attr.require_end = ULONG_MAX;
1197 ibd->fault_opcode->attr.stacktrace_depth = 32;
1198 ibd->fault_opcode->attr.dname = NULL;
1199 ibd->fault_opcode->attr.verbose = 0;
1200 ibd->fault_opcode->fault_by_opcode = false;
1201 ibd->fault_opcode->opcode = 0;
1202 ibd->fault_opcode->mask = 0xff;
1203
1204 ibd->fault_opcode->dir =
1205 fault_create_debugfs_attr("fault_opcode",
1206 parent,
1207 &ibd->fault_opcode->attr);
1208 if (IS_ERR(ibd->fault_opcode->dir)) {
1209 kfree(ibd->fault_opcode);
1210 return -ENOENT;
1211 }
1212
1213 DEBUGFS_SEQ_FILE_CREATE(fault_stats, ibd->fault_opcode->dir, ibd);
1214 if (!debugfs_create_bool("fault_by_opcode", 0600,
1215 ibd->fault_opcode->dir,
1216 &ibd->fault_opcode->fault_by_opcode))
1217 goto fail;
1218 if (!debugfs_create_x8("opcode", 0600, ibd->fault_opcode->dir,
1219 &ibd->fault_opcode->opcode))
1220 goto fail;
1221 if (!debugfs_create_x8("mask", 0600, ibd->fault_opcode->dir,
1222 &ibd->fault_opcode->mask))
1223 goto fail;
1224
1225 return 0;
1226fail:
1227 fault_exit_opcode_debugfs(ibd);
1228 return -ENOMEM;
1229}
1230
1231static void fault_exit_packet_debugfs(struct hfi1_ibdev *ibd)
1232{
1233 debugfs_remove_recursive(ibd->fault_packet->dir);
1234 kfree(ibd->fault_packet);
1235 ibd->fault_packet = NULL;
1236}
1237
1238static int fault_init_packet_debugfs(struct hfi1_ibdev *ibd)
1239{
1240 struct dentry *parent = ibd->hfi1_ibdev_dbg;
1241
1242 ibd->fault_packet = kzalloc(sizeof(*ibd->fault_packet), GFP_KERNEL);
1243 if (!ibd->fault_packet)
1244 return -ENOMEM;
1245
1246 ibd->fault_packet->attr.interval = 1;
1247 ibd->fault_packet->attr.require_end = ULONG_MAX;
1248 ibd->fault_packet->attr.stacktrace_depth = 32;
1249 ibd->fault_packet->attr.dname = NULL;
1250 ibd->fault_packet->attr.verbose = 0;
1251 ibd->fault_packet->fault_by_packet = false;
1252
1253 ibd->fault_packet->dir =
1254 fault_create_debugfs_attr("fault_packet",
1255 parent,
1256 &ibd->fault_opcode->attr);
1257 if (IS_ERR(ibd->fault_packet->dir)) {
1258 kfree(ibd->fault_packet);
1259 return -ENOENT;
1260 }
1261
1262 if (!debugfs_create_bool("fault_by_packet", 0600,
1263 ibd->fault_packet->dir,
1264 &ibd->fault_packet->fault_by_packet))
1265 goto fail;
1266 if (!debugfs_create_u64("fault_stats", 0400,
1267 ibd->fault_packet->dir,
1268 &ibd->fault_packet->n_faults))
1269 goto fail;
1270
1271 return 0;
1272fail:
1273 fault_exit_packet_debugfs(ibd);
1274 return -ENOMEM;
1275}
1276
1277static void fault_exit_debugfs(struct hfi1_ibdev *ibd)
1278{
1279 fault_exit_opcode_debugfs(ibd);
1280 fault_exit_packet_debugfs(ibd);
1281}
1282
1283static int fault_init_debugfs(struct hfi1_ibdev *ibd)
1284{
1285 int ret = 0;
1286
1287 ret = fault_init_opcode_debugfs(ibd);
1288 if (ret)
1289 return ret;
1290
1291 ret = fault_init_packet_debugfs(ibd);
1292 if (ret)
1293 fault_exit_opcode_debugfs(ibd);
1294
1295 return ret;
1296}
1297
1298bool hfi1_dbg_fault_suppress_err(struct hfi1_ibdev *ibd)
1299{
1300 return ibd->fault_suppress_err;
1301}
1302
1303bool hfi1_dbg_fault_opcode(struct rvt_qp *qp, u32 opcode, bool rx)
1304{
1305 bool ret = false;
1306 struct hfi1_ibdev *ibd = to_idev(qp->ibqp.device);
1307
1308 if (!ibd->fault_opcode || !ibd->fault_opcode->fault_by_opcode)
1309 return false;
1310 if (ibd->fault_opcode->opcode != (opcode & ibd->fault_opcode->mask))
1311 return false;
1312 ret = should_fail(&ibd->fault_opcode->attr, 1);
1313 if (ret) {
1314 trace_hfi1_fault_opcode(qp, opcode);
1315 if (rx)
1316 ibd->fault_opcode->n_rxfaults[opcode]++;
1317 else
1318 ibd->fault_opcode->n_txfaults[opcode]++;
1319 }
1320 return ret;
1321}
1322
1323bool hfi1_dbg_fault_packet(struct hfi1_packet *packet)
1324{
1325 struct rvt_dev_info *rdi = &packet->rcd->ppd->dd->verbs_dev.rdi;
1326 struct hfi1_ibdev *ibd = dev_from_rdi(rdi);
1327 bool ret = false;
1328
1329 if (!ibd->fault_packet || !ibd->fault_packet->fault_by_packet)
1330 return false;
1331
1332 ret = should_fail(&ibd->fault_packet->attr, 1);
1333 if (ret) {
1334 ++ibd->fault_packet->n_faults;
1335 trace_hfi1_fault_packet(packet);
1336 }
1337 return ret;
1338}
1339#endif
1340
1341void hfi1_dbg_ibdev_init(struct hfi1_ibdev *ibd)
1342{
1343 char name[sizeof("port0counters") + 1];
1344 char link[10];
1345 struct hfi1_devdata *dd = dd_from_dev(ibd);
1346 struct hfi1_pportdata *ppd;
1347 int unit = dd->unit;
1348 int i, j;
1349
1350 if (!hfi1_dbg_root)
1351 return;
1352 snprintf(name, sizeof(name), "%s_%d", class_name(), unit);
1353 snprintf(link, sizeof(link), "%d", unit);
1354 ibd->hfi1_ibdev_dbg = debugfs_create_dir(name, hfi1_dbg_root);
1355 if (!ibd->hfi1_ibdev_dbg) {
1356 pr_warn("create of %s failed\n", name);
1357 return;
1358 }
1359 ibd->hfi1_ibdev_link =
1360 debugfs_create_symlink(link, hfi1_dbg_root, name);
1361 if (!ibd->hfi1_ibdev_link) {
1362 pr_warn("create of %s symlink failed\n", name);
1363 return;
1364 }
1365 DEBUGFS_SEQ_FILE_CREATE(opcode_stats, ibd->hfi1_ibdev_dbg, ibd);
1366 DEBUGFS_SEQ_FILE_CREATE(ctx_stats, ibd->hfi1_ibdev_dbg, ibd);
1367 DEBUGFS_SEQ_FILE_CREATE(qp_stats, ibd->hfi1_ibdev_dbg, ibd);
1368 DEBUGFS_SEQ_FILE_CREATE(sdes, ibd->hfi1_ibdev_dbg, ibd);
1369 DEBUGFS_SEQ_FILE_CREATE(rcds, ibd->hfi1_ibdev_dbg, ibd);
1370 DEBUGFS_SEQ_FILE_CREATE(sdma_cpu_list, ibd->hfi1_ibdev_dbg, ibd);
1371
1372 for (i = 0; i < ARRAY_SIZE(cntr_ops); i++)
1373 DEBUGFS_FILE_CREATE(cntr_ops[i].name,
1374 ibd->hfi1_ibdev_dbg,
1375 dd,
1376 &cntr_ops[i].ops, S_IRUGO);
1377
1378 for (ppd = dd->pport, j = 0; j < dd->num_pports; j++, ppd++)
1379 for (i = 0; i < ARRAY_SIZE(port_cntr_ops); i++) {
1380 snprintf(name,
1381 sizeof(name),
1382 port_cntr_ops[i].name,
1383 j + 1);
1384 DEBUGFS_FILE_CREATE(name,
1385 ibd->hfi1_ibdev_dbg,
1386 ppd,
1387 &port_cntr_ops[i].ops,
1388 !port_cntr_ops[i].ops.write ?
1389 S_IRUGO : S_IRUGO | S_IWUSR);
1390 }
1391
1392#ifdef CONFIG_FAULT_INJECTION
1393 debugfs_create_bool("fault_suppress_err", 0600,
1394 ibd->hfi1_ibdev_dbg,
1395 &ibd->fault_suppress_err);
1396 fault_init_debugfs(ibd);
1397#endif
1398}
1399
1400void hfi1_dbg_ibdev_exit(struct hfi1_ibdev *ibd)
1401{
1402 if (!hfi1_dbg_root)
1403 goto out;
1404#ifdef CONFIG_FAULT_INJECTION
1405 fault_exit_debugfs(ibd);
1406#endif
1407 debugfs_remove(ibd->hfi1_ibdev_link);
1408 debugfs_remove_recursive(ibd->hfi1_ibdev_dbg);
1409out:
1410 ibd->hfi1_ibdev_dbg = NULL;
1411}
1412
1413
1414
1415
1416
1417
1418
1419
1420static const char * const hfi1_statnames[] = {
1421
1422 "KernIntr",
1423 "ErrorIntr",
1424 "Tx_Errs",
1425 "Rcv_Errs",
1426 "H/W_Errs",
1427 "NoPIOBufs",
1428 "CtxtsOpen",
1429 "RcvLen_Errs",
1430 "EgrBufFull",
1431 "EgrHdrFull"
1432};
1433
1434static void *_driver_stats_names_seq_start(struct seq_file *s, loff_t *pos)
1435{
1436 if (*pos >= ARRAY_SIZE(hfi1_statnames))
1437 return NULL;
1438 return pos;
1439}
1440
1441static void *_driver_stats_names_seq_next(
1442 struct seq_file *s,
1443 void *v,
1444 loff_t *pos)
1445{
1446 ++*pos;
1447 if (*pos >= ARRAY_SIZE(hfi1_statnames))
1448 return NULL;
1449 return pos;
1450}
1451
1452static void _driver_stats_names_seq_stop(struct seq_file *s, void *v)
1453{
1454}
1455
1456static int _driver_stats_names_seq_show(struct seq_file *s, void *v)
1457{
1458 loff_t *spos = v;
1459
1460 seq_printf(s, "%s\n", hfi1_statnames[*spos]);
1461 return 0;
1462}
1463
1464DEBUGFS_SEQ_FILE_OPS(driver_stats_names);
1465DEBUGFS_SEQ_FILE_OPEN(driver_stats_names)
1466DEBUGFS_FILE_OPS(driver_stats_names);
1467
1468static void *_driver_stats_seq_start(struct seq_file *s, loff_t *pos)
1469{
1470 if (*pos >= ARRAY_SIZE(hfi1_statnames))
1471 return NULL;
1472 return pos;
1473}
1474
1475static void *_driver_stats_seq_next(struct seq_file *s, void *v, loff_t *pos)
1476{
1477 ++*pos;
1478 if (*pos >= ARRAY_SIZE(hfi1_statnames))
1479 return NULL;
1480 return pos;
1481}
1482
1483static void _driver_stats_seq_stop(struct seq_file *s, void *v)
1484{
1485}
1486
1487static u64 hfi1_sps_ints(void)
1488{
1489 unsigned long flags;
1490 struct hfi1_devdata *dd;
1491 u64 sps_ints = 0;
1492
1493 spin_lock_irqsave(&hfi1_devs_lock, flags);
1494 list_for_each_entry(dd, &hfi1_dev_list, list) {
1495 sps_ints += get_all_cpu_total(dd->int_counter);
1496 }
1497 spin_unlock_irqrestore(&hfi1_devs_lock, flags);
1498 return sps_ints;
1499}
1500
1501static int _driver_stats_seq_show(struct seq_file *s, void *v)
1502{
1503 loff_t *spos = v;
1504 char *buffer;
1505 u64 *stats = (u64 *)&hfi1_stats;
1506 size_t sz = seq_get_buf(s, &buffer);
1507
1508 if (sz < sizeof(u64))
1509 return SEQ_SKIP;
1510
1511 if (*spos == 0)
1512 *(u64 *)buffer = hfi1_sps_ints();
1513 else
1514 *(u64 *)buffer = stats[*spos];
1515 seq_commit(s, sizeof(u64));
1516 return 0;
1517}
1518
1519DEBUGFS_SEQ_FILE_OPS(driver_stats);
1520DEBUGFS_SEQ_FILE_OPEN(driver_stats)
1521DEBUGFS_FILE_OPS(driver_stats);
1522
1523void hfi1_dbg_init(void)
1524{
1525 hfi1_dbg_root = debugfs_create_dir(DRIVER_NAME, NULL);
1526 if (!hfi1_dbg_root)
1527 pr_warn("init of debugfs failed\n");
1528 DEBUGFS_SEQ_FILE_CREATE(driver_stats_names, hfi1_dbg_root, NULL);
1529 DEBUGFS_SEQ_FILE_CREATE(driver_stats, hfi1_dbg_root, NULL);
1530}
1531
1532void hfi1_dbg_exit(void)
1533{
1534 debugfs_remove_recursive(hfi1_dbg_root);
1535 hfi1_dbg_root = NULL;
1536}
1537