root/drivers/misc/mei/debugfs.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. mei_dbgfs_meclients_show
  2. mei_dbgfs_active_show
  3. mei_dbgfs_devstate_show
  4. mei_dbgfs_write_allow_fa
  5. mei_dbgfs_deregister
  6. mei_dbgfs_register

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Copyright (c) 2012-2016, Intel Corporation. All rights reserved
   4  * Intel Management Engine Interface (Intel MEI) Linux driver
   5  */
   6 
   7 #include <linux/slab.h>
   8 #include <linux/kernel.h>
   9 #include <linux/device.h>
  10 #include <linux/debugfs.h>
  11 #include <linux/seq_file.h>
  12 
  13 #include <linux/mei.h>
  14 
  15 #include "mei_dev.h"
  16 #include "client.h"
  17 #include "hw.h"
  18 
  19 static int mei_dbgfs_meclients_show(struct seq_file *m, void *unused)
  20 {
  21         struct mei_device *dev = m->private;
  22         struct mei_me_client *me_cl;
  23         int i = 0;
  24 
  25         if (!dev)
  26                 return -ENODEV;
  27 
  28         down_read(&dev->me_clients_rwsem);
  29 
  30         seq_puts(m, "  |id|fix|         UUID                       |con|msg len|sb|refc|\n");
  31 
  32         /*  if the driver is not enabled the list won't be consistent */
  33         if (dev->dev_state != MEI_DEV_ENABLED)
  34                 goto out;
  35 
  36         list_for_each_entry(me_cl, &dev->me_clients, list) {
  37                 if (!mei_me_cl_get(me_cl))
  38                         continue;
  39 
  40                 seq_printf(m, "%2d|%2d|%3d|%pUl|%3d|%7d|%2d|%4d|\n",
  41                            i++, me_cl->client_id,
  42                            me_cl->props.fixed_address,
  43                            &me_cl->props.protocol_name,
  44                            me_cl->props.max_number_of_connections,
  45                            me_cl->props.max_msg_length,
  46                            me_cl->props.single_recv_buf,
  47                            kref_read(&me_cl->refcnt));
  48                 mei_me_cl_put(me_cl);
  49         }
  50 
  51 out:
  52         up_read(&dev->me_clients_rwsem);
  53         return 0;
  54 }
  55 DEFINE_SHOW_ATTRIBUTE(mei_dbgfs_meclients);
  56 
  57 static int mei_dbgfs_active_show(struct seq_file *m, void *unused)
  58 {
  59         struct mei_device *dev = m->private;
  60         struct mei_cl *cl;
  61         int i = 0;
  62 
  63         if (!dev)
  64                 return -ENODEV;
  65 
  66         mutex_lock(&dev->device_lock);
  67 
  68         seq_puts(m, "   |me|host|state|rd|wr|wrq\n");
  69 
  70         /*  if the driver is not enabled the list won't be consistent */
  71         if (dev->dev_state != MEI_DEV_ENABLED)
  72                 goto out;
  73 
  74         list_for_each_entry(cl, &dev->file_list, link) {
  75 
  76                 seq_printf(m, "%3d|%2d|%4d|%5d|%2d|%2d|%3u\n",
  77                            i, mei_cl_me_id(cl), cl->host_client_id, cl->state,
  78                            !list_empty(&cl->rd_completed), cl->writing_state,
  79                            cl->tx_cb_queued);
  80                 i++;
  81         }
  82 out:
  83         mutex_unlock(&dev->device_lock);
  84         return 0;
  85 }
  86 DEFINE_SHOW_ATTRIBUTE(mei_dbgfs_active);
  87 
  88 static int mei_dbgfs_devstate_show(struct seq_file *m, void *unused)
  89 {
  90         struct mei_device *dev = m->private;
  91 
  92         seq_printf(m, "dev: %s\n", mei_dev_state_str(dev->dev_state));
  93         seq_printf(m, "hbm: %s\n", mei_hbm_state_str(dev->hbm_state));
  94 
  95         if (dev->hbm_state >= MEI_HBM_ENUM_CLIENTS &&
  96             dev->hbm_state <= MEI_HBM_STARTED) {
  97                 seq_puts(m, "hbm features:\n");
  98                 seq_printf(m, "\tPG: %01d\n", dev->hbm_f_pg_supported);
  99                 seq_printf(m, "\tDC: %01d\n", dev->hbm_f_dc_supported);
 100                 seq_printf(m, "\tIE: %01d\n", dev->hbm_f_ie_supported);
 101                 seq_printf(m, "\tDOT: %01d\n", dev->hbm_f_dot_supported);
 102                 seq_printf(m, "\tEV: %01d\n", dev->hbm_f_ev_supported);
 103                 seq_printf(m, "\tFA: %01d\n", dev->hbm_f_fa_supported);
 104                 seq_printf(m, "\tOS: %01d\n", dev->hbm_f_os_supported);
 105                 seq_printf(m, "\tDR: %01d\n", dev->hbm_f_dr_supported);
 106         }
 107 
 108         seq_printf(m, "pg:  %s, %s\n",
 109                    mei_pg_is_enabled(dev) ? "ENABLED" : "DISABLED",
 110                    mei_pg_state_str(mei_pg_state(dev)));
 111         return 0;
 112 }
 113 DEFINE_SHOW_ATTRIBUTE(mei_dbgfs_devstate);
 114 
 115 static ssize_t mei_dbgfs_write_allow_fa(struct file *file,
 116                                         const char __user *user_buf,
 117                                         size_t count, loff_t *ppos)
 118 {
 119         struct mei_device *dev;
 120         int ret;
 121 
 122         dev = container_of(file->private_data,
 123                            struct mei_device, allow_fixed_address);
 124 
 125         ret = debugfs_write_file_bool(file, user_buf, count, ppos);
 126         if (ret < 0)
 127                 return ret;
 128         dev->override_fixed_address = true;
 129         return ret;
 130 }
 131 
 132 static const struct file_operations mei_dbgfs_allow_fa_fops = {
 133         .open = simple_open,
 134         .read = debugfs_read_file_bool,
 135         .write = mei_dbgfs_write_allow_fa,
 136         .llseek = generic_file_llseek,
 137 };
 138 
 139 /**
 140  * mei_dbgfs_deregister - Remove the debugfs files and directories
 141  *
 142  * @dev: the mei device structure
 143  */
 144 void mei_dbgfs_deregister(struct mei_device *dev)
 145 {
 146         if (!dev->dbgfs_dir)
 147                 return;
 148         debugfs_remove_recursive(dev->dbgfs_dir);
 149         dev->dbgfs_dir = NULL;
 150 }
 151 
 152 /**
 153  * mei_dbgfs_register - Add the debugfs files
 154  *
 155  * @dev: the mei device structure
 156  * @name: the mei device name
 157  */
 158 void mei_dbgfs_register(struct mei_device *dev, const char *name)
 159 {
 160         struct dentry *dir;
 161 
 162         dir = debugfs_create_dir(name, NULL);
 163         dev->dbgfs_dir = dir;
 164 
 165         debugfs_create_file("meclients", S_IRUSR, dir, dev,
 166                             &mei_dbgfs_meclients_fops);
 167         debugfs_create_file("active", S_IRUSR, dir, dev,
 168                             &mei_dbgfs_active_fops);
 169         debugfs_create_file("devstate", S_IRUSR, dir, dev,
 170                             &mei_dbgfs_devstate_fops);
 171         debugfs_create_file("allow_fixed_address", S_IRUSR | S_IWUSR, dir,
 172                             &dev->allow_fixed_address,
 173                             &mei_dbgfs_allow_fa_fops);
 174 }

/* [<][>][^][v][top][bottom][index][help] */