linux/drivers/misc/mic/scif/scif_debugfs.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Intel MIC Platform Software Stack (MPSS)
   4 *
   5 * Copyright(c) 2014 Intel Corporation.
   6 *
   7 * Intel SCIF driver.
   8 */
   9#include <linux/debugfs.h>
  10#include <linux/seq_file.h>
  11
  12#include "../common/mic_dev.h"
  13#include "scif_main.h"
  14
  15/* Debugfs parent dir */
  16static struct dentry *scif_dbg;
  17
  18static int scif_dev_show(struct seq_file *s, void *unused)
  19{
  20        int node;
  21
  22        seq_printf(s, "Total Nodes %d Self Node Id %d Maxid %d\n",
  23                   scif_info.total, scif_info.nodeid,
  24                   scif_info.maxid);
  25
  26        if (!scif_dev)
  27                return 0;
  28
  29        seq_printf(s, "%-16s\t%-16s\n", "node_id", "state");
  30
  31        for (node = 0; node <= scif_info.maxid; node++)
  32                seq_printf(s, "%-16d\t%-16s\n", scif_dev[node].node,
  33                           _scifdev_alive(&scif_dev[node]) ?
  34                           "Running" : "Offline");
  35        return 0;
  36}
  37
  38DEFINE_SHOW_ATTRIBUTE(scif_dev);
  39
  40static void scif_display_window(struct scif_window *window, struct seq_file *s)
  41{
  42        int j;
  43        struct scatterlist *sg;
  44        scif_pinned_pages_t pin = window->pinned_pages;
  45
  46        seq_printf(s, "window %p type %d temp %d offset 0x%llx ",
  47                   window, window->type, window->temp, window->offset);
  48        seq_printf(s, "nr_pages 0x%llx nr_contig_chunks 0x%x prot %d ",
  49                   window->nr_pages, window->nr_contig_chunks, window->prot);
  50        seq_printf(s, "ref_count %d magic 0x%llx peer_window 0x%llx ",
  51                   window->ref_count, window->magic, window->peer_window);
  52        seq_printf(s, "unreg_state 0x%x va_for_temp 0x%lx\n",
  53                   window->unreg_state, window->va_for_temp);
  54
  55        for (j = 0; j < window->nr_contig_chunks; j++)
  56                seq_printf(s, "page[%d] dma_addr 0x%llx num_pages 0x%llx\n", j,
  57                           window->dma_addr[j], window->num_pages[j]);
  58
  59        if (window->type == SCIF_WINDOW_SELF && pin)
  60                for (j = 0; j < window->nr_pages; j++)
  61                        seq_printf(s, "page[%d] = pinned_pages %p address %p\n",
  62                                   j, pin->pages[j],
  63                                   page_address(pin->pages[j]));
  64
  65        if (window->st)
  66                for_each_sg(window->st->sgl, sg, window->st->nents, j)
  67                        seq_printf(s, "sg[%d] dma addr 0x%llx length 0x%x\n",
  68                                   j, sg_dma_address(sg), sg_dma_len(sg));
  69}
  70
  71static void scif_display_all_windows(struct list_head *head, struct seq_file *s)
  72{
  73        struct list_head *item;
  74        struct scif_window *window;
  75
  76        list_for_each(item, head) {
  77                window = list_entry(item, struct scif_window, list);
  78                scif_display_window(window, s);
  79        }
  80}
  81
  82static int scif_rma_show(struct seq_file *s, void *unused)
  83{
  84        struct scif_endpt *ep;
  85        struct list_head *pos;
  86
  87        mutex_lock(&scif_info.connlock);
  88        list_for_each(pos, &scif_info.connected) {
  89                ep = list_entry(pos, struct scif_endpt, list);
  90                seq_printf(s, "ep %p self windows\n", ep);
  91                mutex_lock(&ep->rma_info.rma_lock);
  92                scif_display_all_windows(&ep->rma_info.reg_list, s);
  93                seq_printf(s, "ep %p remote windows\n", ep);
  94                scif_display_all_windows(&ep->rma_info.remote_reg_list, s);
  95                mutex_unlock(&ep->rma_info.rma_lock);
  96        }
  97        mutex_unlock(&scif_info.connlock);
  98        return 0;
  99}
 100
 101DEFINE_SHOW_ATTRIBUTE(scif_rma);
 102
 103void __init scif_init_debugfs(void)
 104{
 105        scif_dbg = debugfs_create_dir(KBUILD_MODNAME, NULL);
 106        if (!scif_dbg) {
 107                dev_err(scif_info.mdev.this_device,
 108                        "can't create debugfs dir scif\n");
 109                return;
 110        }
 111
 112        debugfs_create_file("scif_dev", 0444, scif_dbg, NULL, &scif_dev_fops);
 113        debugfs_create_file("scif_rma", 0444, scif_dbg, NULL, &scif_rma_fops);
 114        debugfs_create_u8("en_msg_log", 0666, scif_dbg, &scif_info.en_msg_log);
 115        debugfs_create_u8("p2p_enable", 0666, scif_dbg, &scif_info.p2p_enable);
 116}
 117
 118void scif_exit_debugfs(void)
 119{
 120        debugfs_remove_recursive(scif_dbg);
 121}
 122