mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-28 18:10:32 +00:00
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: Mark Zhang <markzhang@nvidia.com> Link: https://lore.kernel.org/r/7e37c06c9cb243be9ac79930cd17053903785b95.1718553901.git.leon@kernel.org Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
This commit is contained in:
parent
65528cfb21
commit
2a5db20fa5
@ -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,
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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 {
|
|||||||
#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,
|
|||||||
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 {
|
|||||||
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) \
|
||||||
|
Loading…
Reference in New Issue
Block a user