@@ -778,12 +778,28 @@ static bool vq_is_tx(u16 idx)
778
778
return idx % 2 ;
779
779
}
780
780
781
- static u16 get_features_12_3 (u64 features )
781
+ enum {
782
+ MLX5_VIRTIO_NET_F_MRG_RXBUF = 2 ,
783
+ MLX5_VIRTIO_NET_F_HOST_ECN = 4 ,
784
+ MLX5_VIRTIO_NET_F_GUEST_ECN = 6 ,
785
+ MLX5_VIRTIO_NET_F_GUEST_TSO6 = 7 ,
786
+ MLX5_VIRTIO_NET_F_GUEST_TSO4 = 8 ,
787
+ MLX5_VIRTIO_NET_F_GUEST_CSUM = 9 ,
788
+ MLX5_VIRTIO_NET_F_CSUM = 10 ,
789
+ MLX5_VIRTIO_NET_F_HOST_TSO6 = 11 ,
790
+ MLX5_VIRTIO_NET_F_HOST_TSO4 = 12 ,
791
+ };
792
+
793
+ static u16 get_features (u64 features )
782
794
{
783
- return (!!(features & BIT_ULL (VIRTIO_NET_F_HOST_TSO4 )) << 9 ) |
784
- (!!(features & BIT_ULL (VIRTIO_NET_F_HOST_TSO6 )) << 8 ) |
785
- (!!(features & BIT_ULL (VIRTIO_NET_F_CSUM )) << 7 ) |
786
- (!!(features & BIT_ULL (VIRTIO_NET_F_GUEST_CSUM )) << 6 );
795
+ return (!!(features & BIT_ULL (VIRTIO_NET_F_MRG_RXBUF )) << MLX5_VIRTIO_NET_F_MRG_RXBUF ) |
796
+ (!!(features & BIT_ULL (VIRTIO_NET_F_HOST_ECN )) << MLX5_VIRTIO_NET_F_HOST_ECN ) |
797
+ (!!(features & BIT_ULL (VIRTIO_NET_F_GUEST_ECN )) << MLX5_VIRTIO_NET_F_GUEST_ECN ) |
798
+ (!!(features & BIT_ULL (VIRTIO_NET_F_GUEST_TSO6 )) << MLX5_VIRTIO_NET_F_GUEST_TSO6 ) |
799
+ (!!(features & BIT_ULL (VIRTIO_NET_F_GUEST_TSO4 )) << MLX5_VIRTIO_NET_F_GUEST_TSO4 ) |
800
+ (!!(features & BIT_ULL (VIRTIO_NET_F_CSUM )) << MLX5_VIRTIO_NET_F_CSUM ) |
801
+ (!!(features & BIT_ULL (VIRTIO_NET_F_HOST_TSO6 )) << MLX5_VIRTIO_NET_F_HOST_TSO6 ) |
802
+ (!!(features & BIT_ULL (VIRTIO_NET_F_HOST_TSO4 )) << MLX5_VIRTIO_NET_F_HOST_TSO4 );
787
803
}
788
804
789
805
static bool counters_supported (const struct mlx5_vdpa_dev * mvdev )
@@ -797,6 +813,7 @@ static int create_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtque
797
813
int inlen = MLX5_ST_SZ_BYTES (create_virtio_net_q_in );
798
814
u32 out [MLX5_ST_SZ_DW (create_virtio_net_q_out )] = {};
799
815
void * obj_context ;
816
+ u16 mlx_features ;
800
817
void * cmd_hdr ;
801
818
void * vq_ctx ;
802
819
void * in ;
@@ -812,6 +829,7 @@ static int create_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtque
812
829
goto err_alloc ;
813
830
}
814
831
832
+ mlx_features = get_features (ndev -> mvdev .actual_features );
815
833
cmd_hdr = MLX5_ADDR_OF (create_virtio_net_q_in , in , general_obj_in_cmd_hdr );
816
834
817
835
MLX5_SET (general_obj_in_cmd_hdr , cmd_hdr , opcode , MLX5_CMD_OP_CREATE_GENERAL_OBJECT );
@@ -822,7 +840,9 @@ static int create_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtque
822
840
MLX5_SET (virtio_net_q_object , obj_context , hw_available_index , mvq -> avail_idx );
823
841
MLX5_SET (virtio_net_q_object , obj_context , hw_used_index , mvq -> used_idx );
824
842
MLX5_SET (virtio_net_q_object , obj_context , queue_feature_bit_mask_12_3 ,
825
- get_features_12_3 (ndev -> mvdev .actual_features ));
843
+ mlx_features >> 3 );
844
+ MLX5_SET (virtio_net_q_object , obj_context , queue_feature_bit_mask_2_0 ,
845
+ mlx_features & 7 );
826
846
vq_ctx = MLX5_ADDR_OF (virtio_net_q_object , obj_context , virtio_q_context );
827
847
MLX5_SET (virtio_q , vq_ctx , virtio_q_type , get_queue_type (ndev ));
828
848
@@ -2171,23 +2191,27 @@ static u32 mlx5_vdpa_get_vq_group(struct vdpa_device *vdev, u16 idx)
2171
2191
return MLX5_VDPA_DATAVQ_GROUP ;
2172
2192
}
2173
2193
2174
- enum { MLX5_VIRTIO_NET_F_GUEST_CSUM = 1 << 9 ,
2175
- MLX5_VIRTIO_NET_F_CSUM = 1 << 10 ,
2176
- MLX5_VIRTIO_NET_F_HOST_TSO6 = 1 << 11 ,
2177
- MLX5_VIRTIO_NET_F_HOST_TSO4 = 1 << 12 ,
2178
- };
2179
-
2180
2194
static u64 mlx_to_vritio_features (u16 dev_features )
2181
2195
{
2182
2196
u64 result = 0 ;
2183
2197
2184
- if (dev_features & MLX5_VIRTIO_NET_F_GUEST_CSUM )
2198
+ if (dev_features & BIT_ULL (MLX5_VIRTIO_NET_F_MRG_RXBUF ))
2199
+ result |= BIT_ULL (VIRTIO_NET_F_MRG_RXBUF );
2200
+ if (dev_features & BIT_ULL (MLX5_VIRTIO_NET_F_HOST_ECN ))
2201
+ result |= BIT_ULL (VIRTIO_NET_F_HOST_ECN );
2202
+ if (dev_features & BIT_ULL (MLX5_VIRTIO_NET_F_GUEST_ECN ))
2203
+ result |= BIT_ULL (VIRTIO_NET_F_GUEST_ECN );
2204
+ if (dev_features & BIT_ULL (MLX5_VIRTIO_NET_F_GUEST_TSO6 ))
2205
+ result |= BIT_ULL (VIRTIO_NET_F_GUEST_TSO6 );
2206
+ if (dev_features & BIT_ULL (MLX5_VIRTIO_NET_F_GUEST_TSO4 ))
2207
+ result |= BIT_ULL (VIRTIO_NET_F_GUEST_TSO4 );
2208
+ if (dev_features & BIT_ULL (MLX5_VIRTIO_NET_F_GUEST_CSUM ))
2185
2209
result |= BIT_ULL (VIRTIO_NET_F_GUEST_CSUM );
2186
- if (dev_features & MLX5_VIRTIO_NET_F_CSUM )
2210
+ if (dev_features & BIT_ULL ( MLX5_VIRTIO_NET_F_CSUM ) )
2187
2211
result |= BIT_ULL (VIRTIO_NET_F_CSUM );
2188
- if (dev_features & MLX5_VIRTIO_NET_F_HOST_TSO6 )
2212
+ if (dev_features & BIT_ULL ( MLX5_VIRTIO_NET_F_HOST_TSO6 ) )
2189
2213
result |= BIT_ULL (VIRTIO_NET_F_HOST_TSO6 );
2190
- if (dev_features & MLX5_VIRTIO_NET_F_HOST_TSO4 )
2214
+ if (dev_features & BIT_ULL ( MLX5_VIRTIO_NET_F_HOST_TSO4 ) )
2191
2215
result |= BIT_ULL (VIRTIO_NET_F_HOST_TSO4 );
2192
2216
2193
2217
return result ;
0 commit comments