Re: [PATCH net-next v3 1/3] hinic: add support to query sq info

2020-08-31 Thread Jakub Kicinski
On Sat, 29 Aug 2020 08:55:18 +0800 Luo bin wrote:
> add debugfs node for querying sq info, for example:
> cat /sys/kernel/debug/hinic/:15:00.0/SQs/0x0/sq_pi
> 
> Signed-off-by: Luo bin 

Acked-by: Jakub Kicinski 


[PATCH net-next v3 1/3] hinic: add support to query sq info

2020-08-28 Thread Luo bin
add debugfs node for querying sq info, for example:
cat /sys/kernel/debug/hinic/:15:00.0/SQs/0x0/sq_pi

Signed-off-by: Luo bin 
---
V0~V1:
- remove command interfaces to the read only files
- split addition of each object into a separate patch

 drivers/net/ethernet/huawei/hinic/Makefile|   3 +-
 .../net/ethernet/huawei/hinic/hinic_debugfs.c | 162 ++
 .../net/ethernet/huawei/hinic/hinic_debugfs.h |  27 +++
 drivers/net/ethernet/huawei/hinic/hinic_dev.h |  15 ++
 .../net/ethernet/huawei/hinic/hinic_hw_dev.c  |   1 +
 .../net/ethernet/huawei/hinic/hinic_hw_io.c   |   1 +
 .../net/ethernet/huawei/hinic/hinic_hw_io.h   |   1 +
 .../net/ethernet/huawei/hinic/hinic_hw_qp.h   |   3 +
 .../net/ethernet/huawei/hinic/hinic_main.c|  45 -
 9 files changed, 254 insertions(+), 4 deletions(-)
 create mode 100644 drivers/net/ethernet/huawei/hinic/hinic_debugfs.c
 create mode 100644 drivers/net/ethernet/huawei/hinic/hinic_debugfs.h

diff --git a/drivers/net/ethernet/huawei/hinic/Makefile 
b/drivers/net/ethernet/huawei/hinic/Makefile
index 67b59d0ba769..2f89119c9b69 100644
--- a/drivers/net/ethernet/huawei/hinic/Makefile
+++ b/drivers/net/ethernet/huawei/hinic/Makefile
@@ -4,4 +4,5 @@ obj-$(CONFIG_HINIC) += hinic.o
 hinic-y := hinic_main.o hinic_tx.o hinic_rx.o hinic_port.o hinic_hw_dev.o \
   hinic_hw_io.o hinic_hw_qp.o hinic_hw_cmdq.o hinic_hw_wq.o \
   hinic_hw_mgmt.o hinic_hw_api_cmd.o hinic_hw_eqs.o hinic_hw_if.o \
-  hinic_common.o hinic_ethtool.o hinic_devlink.o hinic_hw_mbox.o 
hinic_sriov.o
+  hinic_common.o hinic_ethtool.o hinic_devlink.o hinic_hw_mbox.o \
+  hinic_sriov.o hinic_debugfs.o
diff --git a/drivers/net/ethernet/huawei/hinic/hinic_debugfs.c 
b/drivers/net/ethernet/huawei/hinic/hinic_debugfs.c
new file mode 100644
index ..2a1050cb400e
--- /dev/null
+++ b/drivers/net/ethernet/huawei/hinic/hinic_debugfs.c
@@ -0,0 +1,162 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/* Huawei HiNIC PCI Express Linux driver
+ * Copyright(c) 2017 Huawei Technologies Co., Ltd
+ */
+
+#include 
+#include 
+
+#include "hinic_debugfs.h"
+
+static struct dentry *hinic_dbgfs_root;
+
+enum sq_dbg_info {
+   GLB_SQ_ID,
+   SQ_PI,
+   SQ_CI,
+   SQ_FI,
+   SQ_MSIX_ENTRY,
+};
+
+static char *sq_fields[] = {"glb_sq_id", "sq_pi", "sq_ci", "sq_fi", 
"sq_msix_entry"};
+
+static u64 hinic_dbg_get_sq_info(struct hinic_dev *nic_dev, struct hinic_sq 
*sq, int idx)
+{
+   struct hinic_wq *wq = sq->wq;
+
+   switch (idx) {
+   case GLB_SQ_ID:
+   return nic_dev->hwdev->func_to_io.global_qpn + sq->qid;
+   case SQ_PI:
+   return atomic_read(>prod_idx) & wq->mask;
+   case SQ_CI:
+   return atomic_read(>cons_idx) & wq->mask;
+   case SQ_FI:
+   return be16_to_cpu(*(__be16 *)(sq->hw_ci_addr)) & wq->mask;
+   case SQ_MSIX_ENTRY:
+   return sq->msix_entry;
+   }
+
+   return 0;
+}
+
+static ssize_t hinic_dbg_cmd_read(struct file *filp, char __user *buffer, 
size_t count,
+ loff_t *ppos)
+{
+   struct hinic_debug_priv *dbg;
+   char ret_buf[20];
+   int *desc;
+   u64 out;
+   int ret;
+
+   desc = filp->private_data;
+   dbg = container_of(desc, struct hinic_debug_priv, field_id[*desc]);
+
+   switch (dbg->type) {
+   case HINIC_DBG_SQ_INFO:
+   out = hinic_dbg_get_sq_info(dbg->dev, dbg->object, *desc);
+   break;
+
+   default:
+   netif_warn(dbg->dev, drv, dbg->dev->netdev, "Invalid hinic 
debug cmd: %d\n",
+  dbg->type);
+   return -EINVAL;
+   }
+
+   ret = snprintf(ret_buf, sizeof(ret_buf), "0x%llx\n", out);
+
+   return simple_read_from_buffer(buffer, count, ppos, ret_buf, ret);
+}
+
+static const struct file_operations hinic_dbg_cmd_fops = {
+   .owner = THIS_MODULE,
+   .open  = simple_open,
+   .read  = hinic_dbg_cmd_read,
+};
+
+static int create_dbg_files(struct hinic_dev *dev, enum hinic_dbg_type type, 
void *data,
+   struct dentry *root, struct hinic_debug_priv **dbg, 
char **field,
+   int nfile)
+{
+   struct hinic_debug_priv *tmp;
+   int i;
+
+   tmp = kzalloc(sizeof(*tmp), GFP_KERNEL);
+   if (!tmp)
+   return -ENOMEM;
+
+   tmp->dev = dev;
+   tmp->object = data;
+   tmp->type = type;
+   tmp->root = root;
+
+   for (i = 0; i < nfile; i++) {
+   tmp->field_id[i] = i;
+   debugfs_create_file(field[i], 0400, root, >field_id[i], 
_dbg_cmd_fops);
+   }
+
+   *dbg = tmp;
+
+   return 0;
+}
+
+static void rem_dbg_files(struct hinic_debug_priv *dbg)
+{
+   debugfs_remove_recursive(dbg->root);
+   kfree(dbg);
+}
+
+int hinic_sq_debug_add(struct hinic_dev *dev, u16 sq_id)
+{
+   struct hinic_sq *sq;
+   struct dentry *root;
+