Skip to content

Commit f164be8

Browse files
yishaihjgunthorpe
authored andcommitted
IB/mlx5: Extend caps stage to handle VAR capabilities
Extend caps stage to handle VAR capabilities. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Yishai Hadas <[email protected]> Signed-off-by: Leon Romanovsky <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent aef5570 commit f164be8

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

drivers/infiniband/hw/mlx5/main.c

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6335,6 +6335,35 @@ static const struct ib_device_ops mlx5_ib_dev_dm_ops = {
63356335
.reg_dm_mr = mlx5_ib_reg_dm_mr,
63366336
};
63376337

6338+
static int mlx5_ib_init_var_table(struct mlx5_ib_dev *dev)
6339+
{
6340+
struct mlx5_core_dev *mdev = dev->mdev;
6341+
struct mlx5_var_table *var_table = &dev->var_table;
6342+
u8 log_doorbell_bar_size;
6343+
u8 log_doorbell_stride;
6344+
u64 bar_size;
6345+
6346+
log_doorbell_bar_size = MLX5_CAP_DEV_VDPA_EMULATION(mdev,
6347+
log_doorbell_bar_size);
6348+
log_doorbell_stride = MLX5_CAP_DEV_VDPA_EMULATION(mdev,
6349+
log_doorbell_stride);
6350+
var_table->hw_start_addr = dev->mdev->bar_addr +
6351+
MLX5_CAP64_DEV_VDPA_EMULATION(mdev,
6352+
doorbell_bar_offset);
6353+
bar_size = (1ULL << log_doorbell_bar_size) * 4096;
6354+
var_table->stride_size = 1ULL << log_doorbell_stride;
6355+
var_table->num_var_hw_entries = bar_size / var_table->stride_size;
6356+
mutex_init(&var_table->bitmap_lock);
6357+
var_table->bitmap = bitmap_zalloc(var_table->num_var_hw_entries,
6358+
GFP_KERNEL);
6359+
return (var_table->bitmap) ? 0 : -ENOMEM;
6360+
}
6361+
6362+
static void mlx5_ib_stage_caps_cleanup(struct mlx5_ib_dev *dev)
6363+
{
6364+
bitmap_free(dev->var_table.bitmap);
6365+
}
6366+
63386367
static int mlx5_ib_stage_caps_init(struct mlx5_ib_dev *dev)
63396368
{
63406369
struct mlx5_core_dev *mdev = dev->mdev;
@@ -6422,6 +6451,13 @@ static int mlx5_ib_stage_caps_init(struct mlx5_ib_dev *dev)
64226451
MLX5_CAP_GEN(dev->mdev, disable_local_lb_mc)))
64236452
mutex_init(&dev->lb.mutex);
64246453

6454+
if (MLX5_CAP_GEN_64(dev->mdev, general_obj_types) &
6455+
MLX5_GENERAL_OBJ_TYPES_CAP_VIRTIO_NET_Q) {
6456+
err = mlx5_ib_init_var_table(dev);
6457+
if (err)
6458+
return err;
6459+
}
6460+
64256461
dev->ib_dev.use_cq_dim = true;
64266462

64276463
return 0;
@@ -6772,7 +6808,7 @@ static const struct mlx5_ib_profile pf_profile = {
67726808
mlx5_ib_stage_flow_db_cleanup),
67736809
STAGE_CREATE(MLX5_IB_STAGE_CAPS,
67746810
mlx5_ib_stage_caps_init,
6775-
NULL),
6811+
mlx5_ib_stage_caps_cleanup),
67766812
STAGE_CREATE(MLX5_IB_STAGE_NON_DEFAULT_CB,
67776813
mlx5_ib_stage_non_default_cb,
67786814
NULL),
@@ -6829,7 +6865,7 @@ const struct mlx5_ib_profile raw_eth_profile = {
68296865
mlx5_ib_stage_flow_db_cleanup),
68306866
STAGE_CREATE(MLX5_IB_STAGE_CAPS,
68316867
mlx5_ib_stage_caps_init,
6832-
NULL),
6868+
mlx5_ib_stage_caps_cleanup),
68336869
STAGE_CREATE(MLX5_IB_STAGE_NON_DEFAULT_CB,
68346870
mlx5_ib_stage_raw_eth_non_default_cb,
68356871
NULL),

drivers/infiniband/hw/mlx5/mlx5_ib.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -959,6 +959,15 @@ struct mlx5_devx_event_table {
959959
struct xarray event_xa;
960960
};
961961

962+
struct mlx5_var_table {
963+
/* serialize updating the bitmap */
964+
struct mutex bitmap_lock;
965+
unsigned long *bitmap;
966+
u64 hw_start_addr;
967+
u32 stride_size;
968+
u64 num_var_hw_entries;
969+
};
970+
962971
struct mlx5_ib_dev {
963972
struct ib_device ib_dev;
964973
struct mlx5_core_dev *mdev;
@@ -1013,6 +1022,7 @@ struct mlx5_ib_dev {
10131022
struct mlx5_srq_table srq_table;
10141023
struct mlx5_async_ctx async_ctx;
10151024
struct mlx5_devx_event_table devx_event_table;
1025+
struct mlx5_var_table var_table;
10161026

10171027
struct xarray sig_mrs;
10181028
};

0 commit comments

Comments
 (0)