@@ -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+
63386367static 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 ),
0 commit comments