Commit cf7174e8 authored by Chiara Meiohas's avatar Chiara Meiohas Committed by Leon Romanovsky
Browse files

RDMA/mlx5: Create UCAP char devices for supported device capabilities



Create UCAP character devices when probing an IB device with supported
firmware capabilities.

If the RDMA_CTRL general object type is supported, check for specific
UCTX capabilities:
Create /dev/infiniband/mlx5_perm_ctrl_local for RDMA_UCAP_MLX5_CTRL_LOCAL
Create /dev/infiniband/mlx5_perm_ctrl_other_vhca for RDMA_UCAP_MLX5_CTRL_OTHER_VHCA

Signed-off-by: default avatarChiara Meiohas <cmeiohas@nvidia.com>
Link: https://patch.msgid.link/30ed40e7a12a694cf4ee257459ed61b145b7837d.1741261611.git.leon@kernel.org


Reviewed-by: default avatarYishai Hadas <yishaih@nvidia.com>
Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
parent 61e51682
Loading
Loading
Loading
Loading
+47 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@
#include <rdma/uverbs_ioctl.h>
#include <rdma/mlx5_user_ioctl_verbs.h>
#include <rdma/mlx5_user_ioctl_cmds.h>
#include <rdma/ib_ucaps.h>
#include "macsec.h"
#include "data_direct.h"

@@ -4201,8 +4202,47 @@ static int mlx5_ib_init_var_table(struct mlx5_ib_dev *dev)
	return (var_table->bitmap) ? 0 : -ENOMEM;
}

static void mlx5_ib_cleanup_ucaps(struct mlx5_ib_dev *dev)
{
	if (MLX5_CAP_GEN(dev->mdev, uctx_cap) & MLX5_UCTX_CAP_RDMA_CTRL)
		ib_remove_ucap(RDMA_UCAP_MLX5_CTRL_LOCAL);

	if (MLX5_CAP_GEN(dev->mdev, uctx_cap) &
	    MLX5_UCTX_CAP_RDMA_CTRL_OTHER_VHCA)
		ib_remove_ucap(RDMA_UCAP_MLX5_CTRL_OTHER_VHCA);
}

static int mlx5_ib_init_ucaps(struct mlx5_ib_dev *dev)
{
	int ret;

	if (MLX5_CAP_GEN(dev->mdev, uctx_cap) & MLX5_UCTX_CAP_RDMA_CTRL) {
		ret = ib_create_ucap(RDMA_UCAP_MLX5_CTRL_LOCAL);
		if (ret)
			return ret;
	}

	if (MLX5_CAP_GEN(dev->mdev, uctx_cap) &
	    MLX5_UCTX_CAP_RDMA_CTRL_OTHER_VHCA) {
		ret = ib_create_ucap(RDMA_UCAP_MLX5_CTRL_OTHER_VHCA);
		if (ret)
			goto remove_local;
	}

	return 0;

remove_local:
	if (MLX5_CAP_GEN(dev->mdev, uctx_cap) & MLX5_UCTX_CAP_RDMA_CTRL)
		ib_remove_ucap(RDMA_UCAP_MLX5_CTRL_LOCAL);
	return ret;
}

static void mlx5_ib_stage_caps_cleanup(struct mlx5_ib_dev *dev)
{
	if (MLX5_CAP_GEN_2_64(dev->mdev, general_obj_types_127_64) &
	    MLX5_HCA_CAP_2_GENERAL_OBJECT_TYPES_RDMA_CTRL)
		mlx5_ib_cleanup_ucaps(dev);

	bitmap_free(dev->var_table.bitmap);
}

@@ -4253,6 +4293,13 @@ static int mlx5_ib_stage_caps_init(struct mlx5_ib_dev *dev)
			return err;
	}

	if (MLX5_CAP_GEN_2_64(dev->mdev, general_obj_types_127_64) &
	    MLX5_HCA_CAP_2_GENERAL_OBJECT_TYPES_RDMA_CTRL) {
		err = mlx5_ib_init_ucaps(dev);
		if (err)
			return err;
	}

	dev->ib_dev.use_cq_dim = true;

	return 0;