@@ -625,30 +625,70 @@ static void cq_destroy(struct mlx5_vdpa_net *ndev, u16 idx)
625
625
mlx5_db_free (ndev -> mvdev .mdev , & vcq -> db );
626
626
}
627
627
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
+
628
668
static void set_umem_size (struct mlx5_vdpa_net * ndev , struct mlx5_vdpa_virtqueue * mvq , int num ,
629
669
struct mlx5_vdpa_umem * * umemp )
630
670
{
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 ;
634
673
635
674
switch (num ) {
636
675
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 ;
639
678
* umemp = & mvq -> umem1 ;
640
679
break ;
641
680
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 ;
644
683
* umemp = & mvq -> umem2 ;
645
684
break ;
646
685
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 ;
649
688
* umemp = & mvq -> umem3 ;
650
689
break ;
651
690
}
691
+
652
692
(* umemp )-> size = p_a * mvq -> num_ent + p_b ;
653
693
}
654
694
@@ -2679,6 +2719,11 @@ static int setup_driver(struct mlx5_vdpa_dev *mvdev)
2679
2719
goto out ;
2680
2720
}
2681
2721
mlx5_vdpa_add_debugfs (ndev );
2722
+
2723
+ err = read_umem_params (ndev );
2724
+ if (err )
2725
+ goto err_setup ;
2726
+
2682
2727
err = setup_virtqueues (mvdev );
2683
2728
if (err ) {
2684
2729
mlx5_vdpa_warn (mvdev , "setup_virtqueues\n" );
@@ -2713,7 +2758,7 @@ static int setup_driver(struct mlx5_vdpa_dev *mvdev)
2713
2758
err_rqt :
2714
2759
teardown_virtqueues (ndev );
2715
2760
err_setup :
2716
- mlx5_vdpa_remove_debugfs (ndev -> debugfs );
2761
+ mlx5_vdpa_remove_debugfs (ndev );
2717
2762
out :
2718
2763
return err ;
2719
2764
}
@@ -2727,8 +2772,7 @@ static void teardown_driver(struct mlx5_vdpa_net *ndev)
2727
2772
if (!ndev -> setup )
2728
2773
return ;
2729
2774
2730
- mlx5_vdpa_remove_debugfs (ndev -> debugfs );
2731
- ndev -> debugfs = NULL ;
2775
+ mlx5_vdpa_remove_debugfs (ndev );
2732
2776
teardown_steering (ndev );
2733
2777
destroy_tir (ndev );
2734
2778
destroy_rqt (ndev );
@@ -3489,8 +3533,6 @@ static void mlx5_vdpa_dev_del(struct vdpa_mgmt_dev *v_mdev, struct vdpa_device *
3489
3533
struct mlx5_vdpa_net * ndev = to_mlx5_vdpa_ndev (mvdev );
3490
3534
struct workqueue_struct * wq ;
3491
3535
3492
- mlx5_vdpa_remove_debugfs (ndev -> debugfs );
3493
- ndev -> debugfs = NULL ;
3494
3536
unregister_link_notifier (ndev );
3495
3537
_vdpa_unregister_device (dev );
3496
3538
wq = mvdev -> wq ;
0 commit comments