|
47 | 47 | #include <rdma/uverbs_ioctl.h> |
48 | 48 | #include <rdma/mlx5_user_ioctl_verbs.h> |
49 | 49 | #include <rdma/mlx5_user_ioctl_cmds.h> |
| 50 | +#include <rdma/ib_ucaps.h> |
50 | 51 | #include "macsec.h" |
51 | 52 | #include "data_direct.h" |
52 | 53 |
|
@@ -4201,8 +4202,47 @@ static int mlx5_ib_init_var_table(struct mlx5_ib_dev *dev) |
4201 | 4202 | return (var_table->bitmap) ? 0 : -ENOMEM; |
4202 | 4203 | } |
4203 | 4204 |
|
| 4205 | +static void mlx5_ib_cleanup_ucaps(struct mlx5_ib_dev *dev) |
| 4206 | +{ |
| 4207 | + if (MLX5_CAP_GEN(dev->mdev, uctx_cap) & MLX5_UCTX_CAP_RDMA_CTRL) |
| 4208 | + ib_remove_ucap(RDMA_UCAP_MLX5_CTRL_LOCAL); |
| 4209 | + |
| 4210 | + if (MLX5_CAP_GEN(dev->mdev, uctx_cap) & |
| 4211 | + MLX5_UCTX_CAP_RDMA_CTRL_OTHER_VHCA) |
| 4212 | + ib_remove_ucap(RDMA_UCAP_MLX5_CTRL_OTHER_VHCA); |
| 4213 | +} |
| 4214 | + |
| 4215 | +static int mlx5_ib_init_ucaps(struct mlx5_ib_dev *dev) |
| 4216 | +{ |
| 4217 | + int ret; |
| 4218 | + |
| 4219 | + if (MLX5_CAP_GEN(dev->mdev, uctx_cap) & MLX5_UCTX_CAP_RDMA_CTRL) { |
| 4220 | + ret = ib_create_ucap(RDMA_UCAP_MLX5_CTRL_LOCAL); |
| 4221 | + if (ret) |
| 4222 | + return ret; |
| 4223 | + } |
| 4224 | + |
| 4225 | + if (MLX5_CAP_GEN(dev->mdev, uctx_cap) & |
| 4226 | + MLX5_UCTX_CAP_RDMA_CTRL_OTHER_VHCA) { |
| 4227 | + ret = ib_create_ucap(RDMA_UCAP_MLX5_CTRL_OTHER_VHCA); |
| 4228 | + if (ret) |
| 4229 | + goto remove_local; |
| 4230 | + } |
| 4231 | + |
| 4232 | + return 0; |
| 4233 | + |
| 4234 | +remove_local: |
| 4235 | + if (MLX5_CAP_GEN(dev->mdev, uctx_cap) & MLX5_UCTX_CAP_RDMA_CTRL) |
| 4236 | + ib_remove_ucap(RDMA_UCAP_MLX5_CTRL_LOCAL); |
| 4237 | + return ret; |
| 4238 | +} |
| 4239 | + |
4204 | 4240 | static void mlx5_ib_stage_caps_cleanup(struct mlx5_ib_dev *dev) |
4205 | 4241 | { |
| 4242 | + if (MLX5_CAP_GEN_2_64(dev->mdev, general_obj_types_127_64) & |
| 4243 | + MLX5_HCA_CAP_2_GENERAL_OBJECT_TYPES_RDMA_CTRL) |
| 4244 | + mlx5_ib_cleanup_ucaps(dev); |
| 4245 | + |
4206 | 4246 | bitmap_free(dev->var_table.bitmap); |
4207 | 4247 | } |
4208 | 4248 |
|
@@ -4253,6 +4293,13 @@ static int mlx5_ib_stage_caps_init(struct mlx5_ib_dev *dev) |
4253 | 4293 | return err; |
4254 | 4294 | } |
4255 | 4295 |
|
| 4296 | + if (MLX5_CAP_GEN_2_64(dev->mdev, general_obj_types_127_64) & |
| 4297 | + MLX5_HCA_CAP_2_GENERAL_OBJECT_TYPES_RDMA_CTRL) { |
| 4298 | + err = mlx5_ib_init_ucaps(dev); |
| 4299 | + if (err) |
| 4300 | + return err; |
| 4301 | + } |
| 4302 | + |
4256 | 4303 | dev->ib_dev.use_cq_dim = true; |
4257 | 4304 |
|
4258 | 4305 | return 0; |
|
0 commit comments