diff --git a/contrib/ofed/libmlx5/mlx5-abi.h b/contrib/ofed/libmlx5/mlx5-abi.h --- a/contrib/ofed/libmlx5/mlx5-abi.h +++ b/contrib/ofed/libmlx5/mlx5-abi.h @@ -273,6 +273,12 @@ __u32 reserved; }; +enum mlx5_mpw_caps { + MLX5_MPW_OBSOLETE = 1 << 0, /* Obsoleted, don't use */ + MLX5_ALLOW_MPW = 1 << 1, + MLX5_SUPPORT_EMPW = 1 << 2, +}; + struct mlx5_query_device_ex_resp { struct ibv_query_device_resp_ex ibv_resp; __u32 comp_mask; diff --git a/contrib/ofed/libmlx5/mlx5.h b/contrib/ofed/libmlx5/mlx5.h --- a/contrib/ofed/libmlx5/mlx5.h +++ b/contrib/ofed/libmlx5/mlx5.h @@ -180,7 +180,9 @@ }; enum mlx5_vendor_cap_flags { - MLX5_VENDOR_CAP_FLAGS_MPW = 1 << 0, + MLX5_VENDOR_CAP_FLAGS_MPW = 1 << 0, /* Obsoleted */ + MLX5_VENDOR_CAP_FLAGS_MPW_ALLOWED = 1 << 1, + MLX5_VENDOR_CAP_FLAGS_ENHANCED_MPW = 1 << 2, }; enum { diff --git a/contrib/ofed/libmlx5/mlx5.c b/contrib/ofed/libmlx5/mlx5.c --- a/contrib/ofed/libmlx5/mlx5.c +++ b/contrib/ofed/libmlx5/mlx5.c @@ -620,14 +620,17 @@ if (mctx->cqe_version == MLX5_CQE_VERSION_V1) attrs_out->flags |= MLX5DV_CONTEXT_FLAGS_CQE_V1; - if (mctx->vendor_cap_flags & MLX5_VENDOR_CAP_FLAGS_MPW) - attrs_out->flags |= MLX5DV_CONTEXT_FLAGS_MPW; + if (mctx->vendor_cap_flags & MLX5_VENDOR_CAP_FLAGS_MPW_ALLOWED) + attrs_out->flags |= MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED; if (attrs_out->comp_mask & MLX5DV_CONTEXT_MASK_CQE_COMPRESION) { attrs_out->cqe_comp_caps = mctx->cqe_comp_caps; comp_mask_out |= MLX5DV_CONTEXT_MASK_CQE_COMPRESION; } + if (mctx->vendor_cap_flags & MLX5_VENDOR_CAP_FLAGS_ENHANCED_MPW) + attrs_out->flags |= MLX5DV_CONTEXT_FLAGS_ENHANCED_MPW; + attrs_out->comp_mask = comp_mask_out; return 0; diff --git a/contrib/ofed/libmlx5/mlx5dv.h b/contrib/ofed/libmlx5/mlx5dv.h --- a/contrib/ofed/libmlx5/mlx5dv.h +++ b/contrib/ofed/libmlx5/mlx5dv.h @@ -80,7 +80,9 @@ * This flag indicates if CQE version 0 or 1 is needed. */ MLX5DV_CONTEXT_FLAGS_CQE_V1 = (1 << 0), - MLX5DV_CONTEXT_FLAGS_MPW = (1 << 1), + MLX5DV_CONTEXT_FLAGS_OBSOLETE = (1 << 1), /* Obsoleted, don't use */ + MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED = (1 << 2), + MLX5DV_CONTEXT_FLAGS_ENHANCED_MPW = (1 << 3), }; enum mlx5dv_cq_init_attr_mask { diff --git a/contrib/ofed/libmlx5/mlx5dv_query_device.3 b/contrib/ofed/libmlx5/mlx5dv_query_device.3 --- a/contrib/ofed/libmlx5/mlx5dv_query_device.3 +++ b/contrib/ofed/libmlx5/mlx5dv_query_device.3 @@ -35,7 +35,9 @@ * This flag indicates if CQE version 0 or 1 is needed. */ MLX5DV_CONTEXT_FLAGS_CQE_V1 = (1 << 0), - MLX5DV_CONTEXT_FLAGS_MPW = (1 << 1), /* Multi packet WQE is supported or not */ + MLX5DV_CONTEXT_FLAGS_OBSOLETE = (1 << 1), /* Obsoleted, don't use */ + MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED = (1 << 2), /* Multi packet WQE is allowed */ + MLX5DV_CONTEXT_FLAGS_ENHANCED_MPW = (1 << 3), /* Enhanced multi packet WQE is supported or not */ .in -8 }; .fi diff --git a/contrib/ofed/libmlx5/verbs.c b/contrib/ofed/libmlx5/verbs.c --- a/contrib/ofed/libmlx5/verbs.c +++ b/contrib/ofed/libmlx5/verbs.c @@ -1963,8 +1963,11 @@ attr->rss_caps.rx_hash_function = resp.rss_caps.rx_hash_function; attr->packet_pacing_caps = resp.packet_pacing_caps.caps; - if (resp.support_multi_pkt_send_wqe) - mctx->vendor_cap_flags |= MLX5_VENDOR_CAP_FLAGS_MPW; + if (resp.support_multi_pkt_send_wqe & MLX5_ALLOW_MPW) + mctx->vendor_cap_flags |= MLX5_VENDOR_CAP_FLAGS_MPW_ALLOWED; + + if (resp.support_multi_pkt_send_wqe & MLX5_SUPPORT_EMPW) + mctx->vendor_cap_flags |= MLX5_VENDOR_CAP_FLAGS_ENHANCED_MPW; mctx->cqe_comp_caps = resp.cqe_comp_caps;