@@ -625,30 +625,70 @@ static void cq_destroy(struct mlx5_vdpa_net *ndev, u16 idx)
625625 mlx5_db_free (ndev -> mvdev .mdev , & vcq -> db );
626626}
627627
628+ static int read_umem_params (struct mlx5_vdpa_net * ndev )
629+ {
630+ u32 in [MLX5_ST_SZ_DW (query_hca_cap_in )] = {};
631+ u16 opmod = (MLX5_CAP_VDPA_EMULATION << 1 ) | (HCA_CAP_OPMOD_GET_CUR & 0x01 );
632+ struct mlx5_core_dev * mdev = ndev -> mvdev .mdev ;
633+ int out_size ;
634+ void * caps ;
635+ void * out ;
636+ int err ;
637+
638+ out_size = MLX5_ST_SZ_BYTES (query_hca_cap_out );
639+ out = kzalloc (out_size , GFP_KERNEL );
640+ if (!out )
641+ return - ENOMEM ;
642+
643+ MLX5_SET (query_hca_cap_in , in , opcode , MLX5_CMD_OP_QUERY_HCA_CAP );
644+ MLX5_SET (query_hca_cap_in , in , op_mod , opmod );
645+ err = mlx5_cmd_exec_inout (mdev , query_hca_cap , in , out );
646+ if (err ) {
647+ mlx5_vdpa_warn (& ndev -> mvdev ,
648+ "Failed reading vdpa umem capabilities with err %d\n" , err );
649+ goto out ;
650+ }
651+
652+ caps = MLX5_ADDR_OF (query_hca_cap_out , out , capability );
653+
654+ ndev -> umem_1_buffer_param_a = MLX5_GET (virtio_emulation_cap , caps , umem_1_buffer_param_a );
655+ ndev -> umem_1_buffer_param_b = MLX5_GET (virtio_emulation_cap , caps , umem_1_buffer_param_b );
656+
657+ ndev -> umem_2_buffer_param_a = MLX5_GET (virtio_emulation_cap , caps , umem_2_buffer_param_a );
658+ ndev -> umem_2_buffer_param_b = MLX5_GET (virtio_emulation_cap , caps , umem_2_buffer_param_b );
659+
660+ ndev -> umem_3_buffer_param_a = MLX5_GET (virtio_emulation_cap , caps , umem_3_buffer_param_a );
661+ ndev -> umem_3_buffer_param_b = MLX5_GET (virtio_emulation_cap , caps , umem_3_buffer_param_b );
662+
663+ out :
664+ kfree (out );
665+ return 0 ;
666+ }
667+
628668static void set_umem_size (struct mlx5_vdpa_net * ndev , struct mlx5_vdpa_virtqueue * mvq , int num ,
629669 struct mlx5_vdpa_umem * * umemp )
630670{
631- struct mlx5_core_dev * mdev = ndev -> mvdev .mdev ;
632- int p_a ;
633- int p_b ;
671+ u32 p_a ;
672+ u32 p_b ;
634673
635674 switch (num ) {
636675 case 1 :
637- p_a = MLX5_CAP_DEV_VDPA_EMULATION ( mdev , umem_1_buffer_param_a ) ;
638- p_b = MLX5_CAP_DEV_VDPA_EMULATION ( mdev , umem_1_buffer_param_b ) ;
676+ p_a = ndev -> umem_1_buffer_param_a ;
677+ p_b = ndev -> umem_1_buffer_param_b ;
639678 * umemp = & mvq -> umem1 ;
640679 break ;
641680 case 2 :
642- p_a = MLX5_CAP_DEV_VDPA_EMULATION ( mdev , umem_2_buffer_param_a ) ;
643- p_b = MLX5_CAP_DEV_VDPA_EMULATION ( mdev , umem_2_buffer_param_b ) ;
681+ p_a = ndev -> umem_2_buffer_param_a ;
682+ p_b = ndev -> umem_2_buffer_param_b ;
644683 * umemp = & mvq -> umem2 ;
645684 break ;
646685 case 3 :
647- p_a = MLX5_CAP_DEV_VDPA_EMULATION ( mdev , umem_3_buffer_param_a ) ;
648- p_b = MLX5_CAP_DEV_VDPA_EMULATION ( mdev , umem_3_buffer_param_b ) ;
686+ p_a = ndev -> umem_3_buffer_param_a ;
687+ p_b = ndev -> umem_3_buffer_param_b ;
649688 * umemp = & mvq -> umem3 ;
650689 break ;
651690 }
691+
652692 (* umemp )-> size = p_a * mvq -> num_ent + p_b ;
653693}
654694
@@ -2679,6 +2719,11 @@ static int setup_driver(struct mlx5_vdpa_dev *mvdev)
26792719 goto out ;
26802720 }
26812721 mlx5_vdpa_add_debugfs (ndev );
2722+
2723+ err = read_umem_params (ndev );
2724+ if (err )
2725+ goto err_setup ;
2726+
26822727 err = setup_virtqueues (mvdev );
26832728 if (err ) {
26842729 mlx5_vdpa_warn (mvdev , "setup_virtqueues\n" );
@@ -2713,7 +2758,7 @@ static int setup_driver(struct mlx5_vdpa_dev *mvdev)
27132758err_rqt :
27142759 teardown_virtqueues (ndev );
27152760err_setup :
2716- mlx5_vdpa_remove_debugfs (ndev -> debugfs );
2761+ mlx5_vdpa_remove_debugfs (ndev );
27172762out :
27182763 return err ;
27192764}
@@ -2727,8 +2772,7 @@ static void teardown_driver(struct mlx5_vdpa_net *ndev)
27272772 if (!ndev -> setup )
27282773 return ;
27292774
2730- mlx5_vdpa_remove_debugfs (ndev -> debugfs );
2731- ndev -> debugfs = NULL ;
2775+ mlx5_vdpa_remove_debugfs (ndev );
27322776 teardown_steering (ndev );
27332777 destroy_tir (ndev );
27342778 destroy_rqt (ndev );
@@ -3489,8 +3533,6 @@ static void mlx5_vdpa_dev_del(struct vdpa_mgmt_dev *v_mdev, struct vdpa_device *
34893533 struct mlx5_vdpa_net * ndev = to_mlx5_vdpa_ndev (mvdev );
34903534 struct workqueue_struct * wq ;
34913535
3492- mlx5_vdpa_remove_debugfs (ndev -> debugfs );
3493- ndev -> debugfs = NULL ;
34943536 unregister_link_notifier (ndev );
34953537 _vdpa_unregister_device (dev );
34963538 wq = mvdev -> wq ;
0 commit comments