From: Leon Romanovsky <leo...@mellanox.com>

Add parsing interface for the device capability flags

$ rdma dev show
1: mlx5_0: caps 0x1257e1c26
2: mlx5_1: caps 0x1257e1c26
3: mlx5_2: caps 0x1257e1c26
4: mlx5_3: caps 0x1257e1c26
5: mlx5_4: caps 0x1257e1c26

$ rdma dev show mlx5_4
5: mlx5_4: caps 0x1257e1c26

$ rdma dev show mlx5_4 caps
5: mlx5_4: caps 0x1257e1c26
Bit     Description
------------------------------------------
 01     DEVICE_BAD_PKEY_CNTR
 02     DEVICE_BAD_QKEY_CNTR
 05     DEVICE_CHANGE_PHY_PORT
 10     DEVICE_PORT_ACTIVE_EVENT
 11     DEVICE_SYS_IMAGE_GUID
 12     DEVICE_RC_RNR_NAK_GEN
 17     DEVICE_MEM_WINDOW
 18     DEVICE_UD_IP_CSUM
 19     DEVICE_UD_TSO
 20     DEVICE_XRC
 21     DEVICE_MEM_MGT_EXTENSIONS
 22     DEVICE_BLOCK_MULTICAST_LOOPBACK
 24     DEVICE_MEM_WINDOW_TYPE_2B
 26     DEVICE_RAW_IP_CSUM
 29     DEVICE_SIGNATURE_HANDOVER
 32     DEVICE_VIRTUAL_FUNCTION

$ rdma dev show mlx5_4 cap_flags
Unknown parameter 'caps_flags'.

Signed-off-by: Leon Romanovsky <leo...@mellanox.com>

Signed-off-by: Leon Romanovsky <leo...@mellanox.com>
---
 rdma/dev.c   | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 rdma/rdma.h  |  3 ++
 rdma/utils.c |  3 +-
 3 files changed, 93 insertions(+), 9 deletions(-)

diff --git a/rdma/dev.c b/rdma/dev.c
index 5a3ee126..31c235e8 100644
--- a/rdma/dev.c
+++ b/rdma/dev.c
@@ -14,6 +14,7 @@
 static int dev_help(struct rdma *rd)
 {
        pr_out("Usage: %s dev show [DEV]\n", rd->filename);
+       pr_out("       %s dev show DEV caps\n", rd->filename);

        /*
         * Example of set command:
@@ -22,28 +23,107 @@ static int dev_help(struct rdma *rd)
        return 0;
 }

-static void dev_one_show(const struct dev_map *dev_map)
+static const char *dev_caps[64] = {
+       "DEVICE_RESIZE_MAX_WR",
+       "DEVICE_BAD_PKEY_CNTR",
+       "DEVICE_BAD_QKEY_CNTR",
+       "DEVICE_RAW_MULTI",
+       "DEVICE_AUTO_PATH_MIG",
+       "DEVICE_CHANGE_PHY_PORT",
+       "DEVICE_UD_AV_PORT_ENFORCE",
+       "DEVICE_CURR_QP_STATE_MOD",
+       "DEVICE_SHUTDOWN_PORT",
+       "DEVICE_INIT_TYPE",
+       "DEVICE_PORT_ACTIVE_EVENT",
+       "DEVICE_SYS_IMAGE_GUID",
+       "DEVICE_RC_RNR_NAK_GEN",
+       "DEVICE_SRQ_RESIZE",
+       "DEVICE_N_NOTIFY_CQ",
+       "DEVICE_LOCAL_DMA_LKEY",
+       "DEVICE_RESERVED",
+       "DEVICE_MEM_WINDOW",
+       "DEVICE_UD_IP_CSUM",
+       "DEVICE_UD_TSO",
+       "DEVICE_XRC",
+       "DEVICE_MEM_MGT_EXTENSIONS",
+       "DEVICE_BLOCK_MULTICAST_LOOPBACK",
+       "DEVICE_MEM_WINDOW_TYPE_2A",
+       "DEVICE_MEM_WINDOW_TYPE_2B",
+       "DEVICE_RC_IP_CSUM",
+       "DEVICE_RAW_IP_CSUM",
+       "DEVICE_CROSS_CHANNEL",
+       "DEVICE_MANAGED_FLOW_STEERING",
+       "DEVICE_SIGNATURE_HANDOVER",
+       "DEVICE_ON_DEMAND_PAGING",
+       "DEVICE_SG_GAPS_REG",
+       "DEVICE_VIRTUAL_FUNCTION",
+       "DEVICE_RAW_SCATTER_FCS",
+       "DEVICE_RDMA_NETDEV_OPA_VNIC",
+};
+
+static int dev_print_caps(struct rdma *rd)
+{
+       struct dev_map *dev_map = rd->dev_map_curr;
+       uint64_t caps = dev_map->caps;
+       uint32_t idx;
+
+       pr_out("%u: %s: ", dev_map->idx, dev_map->dev_name);
+       pr_out("caps 0x%" PRIx64 "\n", dev_map->caps);
+       pr_out("Bit\tDescription\n");
+       pr_out("------------------------------------------\n");
+       for (idx = 0; idx < 64; idx++) {
+               if (caps & 0x1)
+                       pr_out(" %02u\t%s\n", idx, 
dev_caps[idx]?dev_caps[idx]:"UNKNONW");
+               caps >>= 0x1;
+       }
+       return 0;
+}
+
+static int dev_no_args(struct rdma *rd)
+{
+       struct dev_map *dev_map = rd->dev_map_curr;
+
+       pr_out("%u: %s: ", dev_map->idx, dev_map->dev_name);
+       pr_out("caps 0x%" PRIx64 "\n", dev_map->caps);
+       return 0;
+}
+
+static int dev_one_show(struct rdma *rd)
 {
-       pr_out("%u: %s:\n", dev_map->idx, dev_map->dev_name);
+       const struct rdma_cmd cmds[] = {
+               { NULL,         dev_no_args},
+               { "caps",       dev_print_caps},
+               { 0 }
+       };
+
+       return rdma_exec_cmd(rd, cmds, "parameter");
+
 }

 static int dev_show(struct rdma *rd)
 {
        struct dev_map *dev_map;
+       int ret = 0;

        if (rd_no_arg(rd)) {
-               list_for_each_entry(dev_map, &rd->dev_map_list, list)
-                       dev_one_show(dev_map);
+               list_for_each_entry(dev_map, &rd->dev_map_list, list) {
+                       rd->dev_map_curr = dev_map;
+                       ret = dev_one_show(rd);
+                       if (ret)
+                               return ret;
+               }
+
        }
        else {
-               dev_map = dev_map_lookup(rd, false);
-               if (!dev_map) {
+               rd->dev_map_curr = dev_map_lookup(rd, false);
+               if (!rd->dev_map_curr) {
                        pr_err("Wrong device name\n");
                        return -ENOENT;
                }
-               dev_one_show(dev_map);
+               rd_arg_inc(rd);
+               ret = dev_one_show(rd);
        }
-       return 0;
+       return ret;
 }

 int cmd_dev(struct rdma *rd)
diff --git a/rdma/rdma.h b/rdma/rdma.h
index f5e104ec..8cca0f28 100644
--- a/rdma/rdma.h
+++ b/rdma/rdma.h
@@ -34,6 +34,7 @@ struct dev_map {
        uint32_t num_ports;
        struct list_head port_map_list;
        uint32_t idx;
+       uint64_t caps;
 };

 struct rdma {
@@ -41,6 +42,7 @@ struct rdma {
        char **argv;
        char *filename;
        struct list_head dev_map_list;
+       struct dev_map *dev_map_curr;
        struct mnl_socket *nl;
        struct nlmsghdr *nlh;
        char *buff;
@@ -57,6 +59,7 @@ struct rdma_cmd {
 bool rd_no_arg(struct rdma *rd);
 bool rd_argv_match(struct rdma *rd, const char *pattern);
 void rd_arg_inc(struct rdma *rd);
+char *rd_argv(struct rdma *rd);

 /*
  * Commands interface
diff --git a/rdma/utils.c b/rdma/utils.c
index e5c3dd6c..e7f257e3 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -28,7 +28,7 @@ static int rd_argc(struct rdma *rd)
        return rd->argc;
 }

-static char *rd_argv(struct rdma *rd)
+char *rd_argv(struct rdma *rd)
 {
        if (!rd_argc(rd))
                return NULL;
@@ -128,6 +128,7 @@ static int port_map_alloc(struct dev_map *dev_map, uint32_t 
num_ports)
 }

 static const enum mnl_attr_data_type nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
+       [RDMA_NLDEV_ATTR_DEV_INDEX] = MNL_TYPE_U32,
        [RDMA_NLDEV_ATTR_DEV_NAME] = MNL_TYPE_NUL_STRING,
        [RDMA_NLDEV_ATTR_PORT_INDEX] = MNL_TYPE_U32,
 };
--
2.13.1

Reply via email to