diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx5/main.c')
-rw-r--r-- | drivers/infiniband/hw/mlx5/main.c | 67 |
1 files changed, 1 insertions, 66 deletions
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 41d6911e244e..f1ccd40beae9 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c | |||
@@ -245,7 +245,6 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, | |||
245 | props->device_cap_flags |= IB_DEVICE_BAD_QKEY_CNTR; | 245 | props->device_cap_flags |= IB_DEVICE_BAD_QKEY_CNTR; |
246 | if (MLX5_CAP_GEN(mdev, apm)) | 246 | if (MLX5_CAP_GEN(mdev, apm)) |
247 | props->device_cap_flags |= IB_DEVICE_AUTO_PATH_MIG; | 247 | props->device_cap_flags |= IB_DEVICE_AUTO_PATH_MIG; |
248 | props->device_cap_flags |= IB_DEVICE_LOCAL_DMA_LKEY; | ||
249 | if (MLX5_CAP_GEN(mdev, xrc)) | 248 | if (MLX5_CAP_GEN(mdev, xrc)) |
250 | props->device_cap_flags |= IB_DEVICE_XRC; | 249 | props->device_cap_flags |= IB_DEVICE_XRC; |
251 | props->device_cap_flags |= IB_DEVICE_MEM_MGT_EXTENSIONS; | 250 | props->device_cap_flags |= IB_DEVICE_MEM_MGT_EXTENSIONS; |
@@ -795,53 +794,6 @@ static int mlx5_ib_mmap(struct ib_ucontext *ibcontext, struct vm_area_struct *vm | |||
795 | return 0; | 794 | return 0; |
796 | } | 795 | } |
797 | 796 | ||
798 | static int alloc_pa_mkey(struct mlx5_ib_dev *dev, u32 *key, u32 pdn) | ||
799 | { | ||
800 | struct mlx5_create_mkey_mbox_in *in; | ||
801 | struct mlx5_mkey_seg *seg; | ||
802 | struct mlx5_core_mr mr; | ||
803 | int err; | ||
804 | |||
805 | in = kzalloc(sizeof(*in), GFP_KERNEL); | ||
806 | if (!in) | ||
807 | return -ENOMEM; | ||
808 | |||
809 | seg = &in->seg; | ||
810 | seg->flags = MLX5_PERM_LOCAL_READ | MLX5_ACCESS_MODE_PA; | ||
811 | seg->flags_pd = cpu_to_be32(pdn | MLX5_MKEY_LEN64); | ||
812 | seg->qpn_mkey7_0 = cpu_to_be32(0xffffff << 8); | ||
813 | seg->start_addr = 0; | ||
814 | |||
815 | err = mlx5_core_create_mkey(dev->mdev, &mr, in, sizeof(*in), | ||
816 | NULL, NULL, NULL); | ||
817 | if (err) { | ||
818 | mlx5_ib_warn(dev, "failed to create mkey, %d\n", err); | ||
819 | goto err_in; | ||
820 | } | ||
821 | |||
822 | kfree(in); | ||
823 | *key = mr.key; | ||
824 | |||
825 | return 0; | ||
826 | |||
827 | err_in: | ||
828 | kfree(in); | ||
829 | |||
830 | return err; | ||
831 | } | ||
832 | |||
833 | static void free_pa_mkey(struct mlx5_ib_dev *dev, u32 key) | ||
834 | { | ||
835 | struct mlx5_core_mr mr; | ||
836 | int err; | ||
837 | |||
838 | memset(&mr, 0, sizeof(mr)); | ||
839 | mr.key = key; | ||
840 | err = mlx5_core_destroy_mkey(dev->mdev, &mr); | ||
841 | if (err) | ||
842 | mlx5_ib_warn(dev, "failed to destroy mkey 0x%x\n", key); | ||
843 | } | ||
844 | |||
845 | static struct ib_pd *mlx5_ib_alloc_pd(struct ib_device *ibdev, | 797 | static struct ib_pd *mlx5_ib_alloc_pd(struct ib_device *ibdev, |
846 | struct ib_ucontext *context, | 798 | struct ib_ucontext *context, |
847 | struct ib_udata *udata) | 799 | struct ib_udata *udata) |
@@ -867,13 +819,6 @@ static struct ib_pd *mlx5_ib_alloc_pd(struct ib_device *ibdev, | |||
867 | kfree(pd); | 819 | kfree(pd); |
868 | return ERR_PTR(-EFAULT); | 820 | return ERR_PTR(-EFAULT); |
869 | } | 821 | } |
870 | } else { | ||
871 | err = alloc_pa_mkey(to_mdev(ibdev), &pd->pa_lkey, pd->pdn); | ||
872 | if (err) { | ||
873 | mlx5_core_dealloc_pd(to_mdev(ibdev)->mdev, pd->pdn); | ||
874 | kfree(pd); | ||
875 | return ERR_PTR(err); | ||
876 | } | ||
877 | } | 822 | } |
878 | 823 | ||
879 | return &pd->ibpd; | 824 | return &pd->ibpd; |
@@ -884,9 +829,6 @@ static int mlx5_ib_dealloc_pd(struct ib_pd *pd) | |||
884 | struct mlx5_ib_dev *mdev = to_mdev(pd->device); | 829 | struct mlx5_ib_dev *mdev = to_mdev(pd->device); |
885 | struct mlx5_ib_pd *mpd = to_mpd(pd); | 830 | struct mlx5_ib_pd *mpd = to_mpd(pd); |
886 | 831 | ||
887 | if (!pd->uobject) | ||
888 | free_pa_mkey(mdev, mpd->pa_lkey); | ||
889 | |||
890 | mlx5_core_dealloc_pd(mdev->mdev, mpd->pdn); | 832 | mlx5_core_dealloc_pd(mdev->mdev, mpd->pdn); |
891 | kfree(mpd); | 833 | kfree(mpd); |
892 | 834 | ||
@@ -1245,18 +1187,10 @@ static int create_dev_resources(struct mlx5_ib_resources *devr) | |||
1245 | struct ib_srq_init_attr attr; | 1187 | struct ib_srq_init_attr attr; |
1246 | struct mlx5_ib_dev *dev; | 1188 | struct mlx5_ib_dev *dev; |
1247 | struct ib_cq_init_attr cq_attr = {.cqe = 1}; | 1189 | struct ib_cq_init_attr cq_attr = {.cqe = 1}; |
1248 | u32 rsvd_lkey; | ||
1249 | int ret = 0; | 1190 | int ret = 0; |
1250 | 1191 | ||
1251 | dev = container_of(devr, struct mlx5_ib_dev, devr); | 1192 | dev = container_of(devr, struct mlx5_ib_dev, devr); |
1252 | 1193 | ||
1253 | ret = mlx5_core_query_special_context(dev->mdev, &rsvd_lkey); | ||
1254 | if (ret) { | ||
1255 | pr_err("Failed to query special context %d\n", ret); | ||
1256 | return ret; | ||
1257 | } | ||
1258 | dev->ib_dev.local_dma_lkey = rsvd_lkey; | ||
1259 | |||
1260 | devr->p0 = mlx5_ib_alloc_pd(&dev->ib_dev, NULL, NULL); | 1194 | devr->p0 = mlx5_ib_alloc_pd(&dev->ib_dev, NULL, NULL); |
1261 | if (IS_ERR(devr->p0)) { | 1195 | if (IS_ERR(devr->p0)) { |
1262 | ret = PTR_ERR(devr->p0); | 1196 | ret = PTR_ERR(devr->p0); |
@@ -1418,6 +1352,7 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) | |||
1418 | strlcpy(dev->ib_dev.name, "mlx5_%d", IB_DEVICE_NAME_MAX); | 1352 | strlcpy(dev->ib_dev.name, "mlx5_%d", IB_DEVICE_NAME_MAX); |
1419 | dev->ib_dev.owner = THIS_MODULE; | 1353 | dev->ib_dev.owner = THIS_MODULE; |
1420 | dev->ib_dev.node_type = RDMA_NODE_IB_CA; | 1354 | dev->ib_dev.node_type = RDMA_NODE_IB_CA; |
1355 | dev->ib_dev.local_dma_lkey = 0 /* not supported for now */; | ||
1421 | dev->num_ports = MLX5_CAP_GEN(mdev, num_ports); | 1356 | dev->num_ports = MLX5_CAP_GEN(mdev, num_ports); |
1422 | dev->ib_dev.phys_port_cnt = dev->num_ports; | 1357 | dev->ib_dev.phys_port_cnt = dev->num_ports; |
1423 | dev->ib_dev.num_comp_vectors = | 1358 | dev->ib_dev.num_comp_vectors = |