Commit 2a5db20f authored by Mark Zhang's avatar Mark Zhang Committed by Leon Romanovsky

RDMA/mlx5: Add support to multi-plane device and port

When multi-plane is supported, a logical port, which is aggregation of
multiple physical plane ports, is exposed for data transmission.
Compared with a normal mlx5 IB port, this logical port supports all
functionalities except Subnet Management.
Signed-off-by: default avatarMark Zhang <markzhang@nvidia.com>
Link: https://lore.kernel.org/r/7e37c06c9cb243be9ac79930cd17053903785b95.1718553901.git.leon@kernel.orgSigned-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
parent 65528cfb
...@@ -1357,7 +1357,13 @@ static int mlx5_query_hca_port(struct ib_device *ibdev, u32 port, ...@@ -1357,7 +1357,13 @@ static int mlx5_query_hca_port(struct ib_device *ibdev, u32 port,
props->sm_sl = rep->sm_sl; props->sm_sl = rep->sm_sl;
props->state = rep->vport_state; props->state = rep->vport_state;
props->phys_state = rep->port_physical_state; props->phys_state = rep->port_physical_state;
props->port_cap_flags = rep->cap_mask1; props->port_cap_flags = rep->cap_mask1;
if (dev->num_plane) {
props->port_cap_flags |= IB_PORT_SM_DISABLED;
props->port_cap_flags &= ~IB_PORT_SM;
}
props->gid_tbl_len = mlx5_get_gid_table_len(MLX5_CAP_GEN(mdev, gid_table_size)); props->gid_tbl_len = mlx5_get_gid_table_len(MLX5_CAP_GEN(mdev, gid_table_size));
props->max_msg_sz = 1 << MLX5_CAP_GEN(mdev, log_max_msg); props->max_msg_sz = 1 << MLX5_CAP_GEN(mdev, log_max_msg);
props->pkey_tbl_len = mlx5_to_sw_pkey_sz(MLX5_CAP_GEN(mdev, pkey_table_size)); props->pkey_tbl_len = mlx5_to_sw_pkey_sz(MLX5_CAP_GEN(mdev, pkey_table_size));
...@@ -2776,6 +2782,23 @@ static int mlx5_ib_event_slave_port(struct notifier_block *nb, ...@@ -2776,6 +2782,23 @@ static int mlx5_ib_event_slave_port(struct notifier_block *nb,
return NOTIFY_OK; return NOTIFY_OK;
} }
static int mlx5_ib_get_plane_num(struct mlx5_core_dev *mdev, u8 *num_plane)
{
struct mlx5_hca_vport_context vport_ctx;
int err;
*num_plane = 0;
if (!MLX5_CAP_GEN(mdev, ib_virt))
return 0;
err = mlx5_query_hca_vport_context(mdev, 0, 1, 0, &vport_ctx);
if (err)
return err;
*num_plane = vport_ctx.num_plane;
return 0;
}
static int set_has_smi_cap(struct mlx5_ib_dev *dev) static int set_has_smi_cap(struct mlx5_ib_dev *dev)
{ {
struct mlx5_hca_vport_context vport_ctx; struct mlx5_hca_vport_context vport_ctx;
...@@ -2786,10 +2809,14 @@ static int set_has_smi_cap(struct mlx5_ib_dev *dev) ...@@ -2786,10 +2809,14 @@ static int set_has_smi_cap(struct mlx5_ib_dev *dev)
return 0; return 0;
for (port = 1; port <= dev->num_ports; port++) { for (port = 1; port <= dev->num_ports; port++) {
if (!MLX5_CAP_GEN(dev->mdev, ib_virt)) { if (dev->num_plane) {
dev->port_caps[port - 1].has_smi = false;
continue;
} else if (!MLX5_CAP_GEN(dev->mdev, ib_virt)) {
dev->port_caps[port - 1].has_smi = true; dev->port_caps[port - 1].has_smi = true;
continue; continue;
} }
err = mlx5_query_hca_vport_context(dev->mdev, 0, port, 0, err = mlx5_query_hca_vport_context(dev->mdev, 0, port, 0,
&vport_ctx); &vport_ctx);
if (err) { if (err) {
...@@ -2995,6 +3022,11 @@ static u32 get_core_cap_flags(struct ib_device *ibdev, ...@@ -2995,6 +3022,11 @@ static u32 get_core_cap_flags(struct ib_device *ibdev,
if (rep->grh_required) if (rep->grh_required)
ret |= RDMA_CORE_CAP_IB_GRH_REQUIRED; ret |= RDMA_CORE_CAP_IB_GRH_REQUIRED;
if (dev->num_plane)
return ret | RDMA_CORE_CAP_PROT_IB | RDMA_CORE_CAP_IB_MAD |
RDMA_CORE_CAP_IB_CM | RDMA_CORE_CAP_IB_SA |
RDMA_CORE_CAP_AF_IB;
if (ll == IB_LINK_LAYER_INFINIBAND) if (ll == IB_LINK_LAYER_INFINIBAND)
return ret | RDMA_CORE_PORT_IBA_IB; return ret | RDMA_CORE_PORT_IBA_IB;
...@@ -4477,11 +4509,18 @@ static int mlx5r_probe(struct auxiliary_device *adev, ...@@ -4477,11 +4509,18 @@ static int mlx5r_probe(struct auxiliary_device *adev,
dev = ib_alloc_device(mlx5_ib_dev, ib_dev); dev = ib_alloc_device(mlx5_ib_dev, ib_dev);
if (!dev) if (!dev)
return -ENOMEM; return -ENOMEM;
if (ll == IB_LINK_LAYER_INFINIBAND) {
ret = mlx5_ib_get_plane_num(mdev, &dev->num_plane);
if (ret)
goto fail;
}
dev->port = kcalloc(num_ports, sizeof(*dev->port), dev->port = kcalloc(num_ports, sizeof(*dev->port),
GFP_KERNEL); GFP_KERNEL);
if (!dev->port) { if (!dev->port) {
ib_dealloc_device(&dev->ib_dev); ret = -ENOMEM;
return -ENOMEM; goto fail;
} }
dev->mdev = mdev; dev->mdev = mdev;
...@@ -4493,14 +4532,17 @@ static int mlx5r_probe(struct auxiliary_device *adev, ...@@ -4493,14 +4532,17 @@ static int mlx5r_probe(struct auxiliary_device *adev,
profile = &pf_profile; profile = &pf_profile;
ret = __mlx5_ib_add(dev, profile); ret = __mlx5_ib_add(dev, profile);
if (ret) { if (ret)
kfree(dev->port); goto fail_ib_add;
ib_dealloc_device(&dev->ib_dev);
return ret;
}
auxiliary_set_drvdata(adev, dev); auxiliary_set_drvdata(adev, dev);
return 0; return 0;
fail_ib_add:
kfree(dev->port);
fail:
ib_dealloc_device(&dev->ib_dev);
return ret;
} }
static void mlx5r_remove(struct auxiliary_device *adev) static void mlx5r_remove(struct auxiliary_device *adev)
......
...@@ -1189,6 +1189,8 @@ struct mlx5_ib_dev { ...@@ -1189,6 +1189,8 @@ struct mlx5_ib_dev {
#ifdef CONFIG_MLX5_MACSEC #ifdef CONFIG_MLX5_MACSEC
struct mlx5_macsec macsec; struct mlx5_macsec macsec;
#endif #endif
u8 num_plane;
}; };
static inline struct mlx5_ib_cq *to_mibcq(struct mlx5_core_cq *mcq) static inline struct mlx5_ib_cq *to_mibcq(struct mlx5_core_cq *mcq)
......
...@@ -737,6 +737,7 @@ int mlx5_query_hca_vport_context(struct mlx5_core_dev *dev, ...@@ -737,6 +737,7 @@ int mlx5_query_hca_vport_context(struct mlx5_core_dev *dev,
rep->grh_required = MLX5_GET_PR(hca_vport_context, ctx, grh_required); rep->grh_required = MLX5_GET_PR(hca_vport_context, ctx, grh_required);
rep->sys_image_guid = MLX5_GET64_PR(hca_vport_context, ctx, rep->sys_image_guid = MLX5_GET64_PR(hca_vport_context, ctx,
system_image_guid); system_image_guid);
rep->num_plane = MLX5_GET_PR(hca_vport_context, ctx, num_port_plane);
ex: ex:
kvfree(out); kvfree(out);
......
...@@ -917,6 +917,7 @@ struct mlx5_hca_vport_context { ...@@ -917,6 +917,7 @@ struct mlx5_hca_vport_context {
u16 qkey_violation_counter; u16 qkey_violation_counter;
u16 pkey_violation_counter; u16 pkey_violation_counter;
bool grh_required; bool grh_required;
u8 num_plane;
}; };
#define STRUCT_FIELD(header, field) \ #define STRUCT_FIELD(header, field) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment