Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit e9d67e5

Browse files
elic307imstsirkin
authored andcommitted
vdpa/mlx5: Extend driver support for new features
Extend the possible list for features that can be supported by firmware. Note that different versions of firmware may or may not support these features. The driver is made aware of them by querying the firmware. While doing this, improve the code so we use enum names instead of hard coded numerical values. The new features supported by the driver are the following: VIRTIO_NET_F_MRG_RXBUF VIRTIO_NET_F_HOST_ECN VIRTIO_NET_F_GUEST_ECN VIRTIO_NET_F_GUEST_TSO6 VIRTIO_NET_F_GUEST_TSO4 Reviewed-by: Si-Wei Liu <[email protected]> Acked-by: Jason Wang <[email protected]> Signed-off-by: Eli Cohen <[email protected]> Message-Id: <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]> Acked-by: Eugenio Pérez Martin <[email protected]>
1 parent 791a1cb commit e9d67e5

File tree

1 file changed

+40
-16
lines changed

1 file changed

+40
-16
lines changed

drivers/vdpa/mlx5/net/mlx5_vnet.c

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -778,12 +778,28 @@ static bool vq_is_tx(u16 idx)
778778
return idx % 2;
779779
}
780780

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)
782794
{
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);
787803
}
788804

789805
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
797813
int inlen = MLX5_ST_SZ_BYTES(create_virtio_net_q_in);
798814
u32 out[MLX5_ST_SZ_DW(create_virtio_net_q_out)] = {};
799815
void *obj_context;
816+
u16 mlx_features;
800817
void *cmd_hdr;
801818
void *vq_ctx;
802819
void *in;
@@ -812,6 +829,7 @@ static int create_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtque
812829
goto err_alloc;
813830
}
814831

832+
mlx_features = get_features(ndev->mvdev.actual_features);
815833
cmd_hdr = MLX5_ADDR_OF(create_virtio_net_q_in, in, general_obj_in_cmd_hdr);
816834

817835
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
822840
MLX5_SET(virtio_net_q_object, obj_context, hw_available_index, mvq->avail_idx);
823841
MLX5_SET(virtio_net_q_object, obj_context, hw_used_index, mvq->used_idx);
824842
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);
826846
vq_ctx = MLX5_ADDR_OF(virtio_net_q_object, obj_context, virtio_q_context);
827847
MLX5_SET(virtio_q, vq_ctx, virtio_q_type, get_queue_type(ndev));
828848

@@ -2171,23 +2191,27 @@ static u32 mlx5_vdpa_get_vq_group(struct vdpa_device *vdev, u16 idx)
21712191
return MLX5_VDPA_DATAVQ_GROUP;
21722192
}
21732193

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-
21802194
static u64 mlx_to_vritio_features(u16 dev_features)
21812195
{
21822196
u64 result = 0;
21832197

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))
21852209
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))
21872211
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))
21892213
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))
21912215
result |= BIT_ULL(VIRTIO_NET_F_HOST_TSO4);
21922216

21932217
return result;

0 commit comments

Comments
 (0)