From patchwork Mon Jun 26 18:21:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 9810277 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id C556D60329 for ; Mon, 26 Jun 2017 18:22:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C0FE9280DE for ; Mon, 26 Jun 2017 18:22:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B4D75285EA; Mon, 26 Jun 2017 18:22:10 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0E4DE280DE for ; Mon, 26 Jun 2017 18:22:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751376AbdFZSVv (ORCPT ); Mon, 26 Jun 2017 14:21:51 -0400 Received: from mail.kernel.org ([198.145.29.99]:44018 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751782AbdFZSVr (ORCPT ); Mon, 26 Jun 2017 14:21:47 -0400 Received: from localhost (unknown [213.57.247.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 8C13222B5B; Mon, 26 Jun 2017 18:21:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8C13222B5B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=leon@kernel.org From: Leon Romanovsky To: Stephen Hemminger Cc: Leon Romanovsky , Doug Ledford , Ariel Almog , Dennis Dalessandro , Jason Gunthorpe , Linux RDMA , Linux Netdev Subject: [PATCH iproute2 3/5] rdma: Add device capability parsing Date: Mon, 26 Jun 2017 21:21:26 +0300 Message-Id: <20170626182128.24964-4-leon@kernel.org> X-Mailer: git-send-email 2.13.1 In-Reply-To: <20170626182128.24964-1-leon@kernel.org> References: <20170626182128.24964-1-leon@kernel.org> Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Leon Romanovsky 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 Signed-off-by: Leon Romanovsky --- rdma/dev.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----- rdma/rdma.h | 3 ++ rdma/utils.c | 3 +- 3 files changed, 93 insertions(+), 9 deletions(-) -- 2.13.1 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html 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, };