summaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorHaggai Eran <haggaie@mellanox.com>2014-12-11 10:04:20 -0500
committerRoland Dreier <roland@purestorage.com>2014-12-15 21:19:02 -0500
commit8cdd312cfed706b067d7ea952603e28cc33c40cc (patch)
treec9372550bc0430d23f87862451a405038dbf0d93 /drivers/infiniband
parente420f0c0f3d1022789fcb59b2a0c4b979ce311ba (diff)
IB/mlx5: Implement the ODP capability query verb
The patch adds infrastructure to query ODP capabilities in the mlx5 driver. The code will read the capabilities from the device, and enable only those capabilities that both the driver and the device supports. At this point ODP is not supported, so no capability is copied from the device, but the patch exposes the global ODP device capability bit. Signed-off-by: Shachar Raindel <raindel@mellanox.com> Signed-off-by: Haggai Eran <haggaie@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/hw/mlx5/Makefile1
-rw-r--r--drivers/infiniband/hw/mlx5/main.c10
-rw-r--r--drivers/infiniband/hw/mlx5/mlx5_ib.h12
-rw-r--r--drivers/infiniband/hw/mlx5/odp.c60
4 files changed, 83 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/mlx5/Makefile b/drivers/infiniband/hw/mlx5/Makefile
index 4ea0135af484..27a70159e2ea 100644
--- a/drivers/infiniband/hw/mlx5/Makefile
+++ b/drivers/infiniband/hw/mlx5/Makefile
@@ -1,3 +1,4 @@
1obj-$(CONFIG_MLX5_INFINIBAND) += mlx5_ib.o 1obj-$(CONFIG_MLX5_INFINIBAND) += mlx5_ib.o
2 2
3mlx5_ib-y := main.o cq.o doorbell.o qp.o mem.o srq.o mr.o ah.o mad.o 3mlx5_ib-y := main.o cq.o doorbell.o qp.o mem.o srq.o mr.o ah.o mad.o
4mlx5_ib-$(CONFIG_INFINIBAND_ON_DEMAND_PAGING) += odp.o
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 1ba6c42e4df8..e6d775f2446d 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -244,6 +244,12 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
244 props->max_mcast_grp; 244 props->max_mcast_grp;
245 props->max_map_per_fmr = INT_MAX; /* no limit in ConnectIB */ 245 props->max_map_per_fmr = INT_MAX; /* no limit in ConnectIB */
246 246
247#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
248 if (dev->mdev->caps.gen.flags & MLX5_DEV_CAP_FLAG_ON_DMND_PG)
249 props->device_cap_flags |= IB_DEVICE_ON_DEMAND_PAGING;
250 props->odp_caps = dev->odp_caps;
251#endif
252
247out: 253out:
248 kfree(in_mad); 254 kfree(in_mad);
249 kfree(out_mad); 255 kfree(out_mad);
@@ -1321,6 +1327,8 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
1321 (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ) | 1327 (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ) |
1322 (1ull << IB_USER_VERBS_CMD_CREATE_XSRQ) | 1328 (1ull << IB_USER_VERBS_CMD_CREATE_XSRQ) |
1323 (1ull << IB_USER_VERBS_CMD_OPEN_QP); 1329 (1ull << IB_USER_VERBS_CMD_OPEN_QP);
1330 dev->ib_dev.uverbs_ex_cmd_mask =
1331 (1ull << IB_USER_VERBS_EX_CMD_QUERY_DEVICE);
1324 1332
1325 dev->ib_dev.query_device = mlx5_ib_query_device; 1333 dev->ib_dev.query_device = mlx5_ib_query_device;
1326 dev->ib_dev.query_port = mlx5_ib_query_port; 1334 dev->ib_dev.query_port = mlx5_ib_query_port;
@@ -1366,6 +1374,8 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
1366 dev->ib_dev.free_fast_reg_page_list = mlx5_ib_free_fast_reg_page_list; 1374 dev->ib_dev.free_fast_reg_page_list = mlx5_ib_free_fast_reg_page_list;
1367 dev->ib_dev.check_mr_status = mlx5_ib_check_mr_status; 1375 dev->ib_dev.check_mr_status = mlx5_ib_check_mr_status;
1368 1376
1377 mlx5_ib_internal_query_odp_caps(dev);
1378
1369 if (mdev->caps.gen.flags & MLX5_DEV_CAP_FLAG_XRC) { 1379 if (mdev->caps.gen.flags & MLX5_DEV_CAP_FLAG_XRC) {
1370 dev->ib_dev.alloc_xrcd = mlx5_ib_alloc_xrcd; 1380 dev->ib_dev.alloc_xrcd = mlx5_ib_alloc_xrcd;
1371 dev->ib_dev.dealloc_xrcd = mlx5_ib_dealloc_xrcd; 1381 dev->ib_dev.dealloc_xrcd = mlx5_ib_dealloc_xrcd;
diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h
index 14a0311eaa1c..cc50fce8cca7 100644
--- a/drivers/infiniband/hw/mlx5/mlx5_ib.h
+++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h
@@ -390,6 +390,9 @@ struct mlx5_ib_dev {
390 struct mlx5_mr_cache cache; 390 struct mlx5_mr_cache cache;
391 struct timer_list delay_timer; 391 struct timer_list delay_timer;
392 int fill_delay; 392 int fill_delay;
393#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
394 struct ib_odp_caps odp_caps;
395#endif
393}; 396};
394 397
395static inline struct mlx5_ib_cq *to_mibcq(struct mlx5_core_cq *mcq) 398static inline struct mlx5_ib_cq *to_mibcq(struct mlx5_core_cq *mcq)
@@ -559,6 +562,15 @@ void mlx5_umr_cq_handler(struct ib_cq *cq, void *cq_context);
559int mlx5_ib_check_mr_status(struct ib_mr *ibmr, u32 check_mask, 562int mlx5_ib_check_mr_status(struct ib_mr *ibmr, u32 check_mask,
560 struct ib_mr_status *mr_status); 563 struct ib_mr_status *mr_status);
561 564
565#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
566int mlx5_ib_internal_query_odp_caps(struct mlx5_ib_dev *dev);
567#else
568static inline int mlx5_ib_internal_query_odp_caps(struct mlx5_ib_dev *dev)
569{
570 return 0;
571}
572#endif /* CONFIG_INFINIBAND_ON_DEMAND_PAGING */
573
562static inline void init_query_mad(struct ib_smp *mad) 574static inline void init_query_mad(struct ib_smp *mad)
563{ 575{
564 mad->base_version = 1; 576 mad->base_version = 1;
diff --git a/drivers/infiniband/hw/mlx5/odp.c b/drivers/infiniband/hw/mlx5/odp.c
new file mode 100644
index 000000000000..66c39ee16aff
--- /dev/null
+++ b/drivers/infiniband/hw/mlx5/odp.c
@@ -0,0 +1,60 @@
1/*
2 * Copyright (c) 2014 Mellanox Technologies. All rights reserved.
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
9 *
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
12 * conditions are met:
13 *
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer.
17 *
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and/or other materials
21 * provided with the distribution.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 * SOFTWARE.
31 */
32
33#include "mlx5_ib.h"
34
35#define COPY_ODP_BIT_MLX_TO_IB(reg, ib_caps, field_name, bit_name) do { \
36 if (be32_to_cpu(reg.field_name) & MLX5_ODP_SUPPORT_##bit_name) \
37 ib_caps->field_name |= IB_ODP_SUPPORT_##bit_name; \
38} while (0)
39
40int mlx5_ib_internal_query_odp_caps(struct mlx5_ib_dev *dev)
41{
42 int err;
43 struct mlx5_odp_caps hw_caps;
44 struct ib_odp_caps *caps = &dev->odp_caps;
45
46 memset(caps, 0, sizeof(*caps));
47
48 if (!(dev->mdev->caps.gen.flags & MLX5_DEV_CAP_FLAG_ON_DMND_PG))
49 return 0;
50
51 err = mlx5_query_odp_caps(dev->mdev, &hw_caps);
52 if (err)
53 goto out;
54
55 /* At this point we would copy the capability bits that the driver
56 * supports from the hw_caps struct to the caps struct. However, no
57 * such capabilities are supported so far. */
58out:
59 return err;
60}