git: 0d63d42ad70d - main - libmlx5: Report if kernel allows using MPW in SQ

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Wed, 16 Sep 2026 14:13:10 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=0d63d42ad70dd5f6e5acd8eac466c8e9fe584204

commit 0d63d42ad70dd5f6e5acd8eac466c8e9fe584204
Author:     Vag Singh <vag.singh@oneconvergence.com>
AuthorDate: 2025-08-14 06:43:08 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-09-16 14:12:08 +0000

    libmlx5: Report if kernel allows using MPW in SQ
    
    PATCH 20/31] FreeBSD OFED support for DPDK MLX5 PMD
    
    a) Use flag MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED to indicate hardware
    supports multi packet WQE and it's enabled in SQ context.
    Flag MLX5DV_CONTEXT_FLAGS_MPW is deprecated, shall not be used
    in new applications.
    
    b) Report if enhanced multi packet send WQE is supported through mlx5
    direct verbs.
    
    Differential revision:  https://reviews.freebsd.org/D32194
    MFC after:      1 month
---
 contrib/ofed/libmlx5/mlx5-abi.h            | 6 ++++++
 contrib/ofed/libmlx5/mlx5.c                | 7 +++++--
 contrib/ofed/libmlx5/mlx5.h                | 4 +++-
 contrib/ofed/libmlx5/mlx5dv.h              | 4 +++-
 contrib/ofed/libmlx5/mlx5dv_query_device.3 | 4 +++-
 contrib/ofed/libmlx5/verbs.c               | 7 +++++--
 6 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/contrib/ofed/libmlx5/mlx5-abi.h b/contrib/ofed/libmlx5/mlx5-abi.h
index d05cb407e22a..bce9e559326b 100644
--- a/contrib/ofed/libmlx5/mlx5-abi.h
+++ b/contrib/ofed/libmlx5/mlx5-abi.h
@@ -273,6 +273,12 @@ struct mlx5_packet_pacing_caps {
 	__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.c b/contrib/ofed/libmlx5/mlx5.c
index 5737680db93b..807725580dac 100644
--- a/contrib/ofed/libmlx5/mlx5.c
+++ b/contrib/ofed/libmlx5/mlx5.c
@@ -650,14 +650,17 @@ int mlx5dv_query_device(struct ibv_context *ctx_in,
 	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/mlx5.h b/contrib/ofed/libmlx5/mlx5.h
index 45082243a56c..11fceff1f433 100644
--- a/contrib/ofed/libmlx5/mlx5.h
+++ b/contrib/ofed/libmlx5/mlx5.h
@@ -180,7 +180,9 @@ enum {
 };
 
 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/mlx5dv.h b/contrib/ofed/libmlx5/mlx5dv.h
index 9555d9e2851f..102efdf9065b 100644
--- a/contrib/ofed/libmlx5/mlx5dv.h
+++ b/contrib/ofed/libmlx5/mlx5dv.h
@@ -81,7 +81,9 @@ enum mlx5dv_context_flags {
 	 * 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
index b33a75b42a20..6e92c0766124 100644
--- a/contrib/ofed/libmlx5/mlx5dv_query_device.3
+++ b/contrib/ofed/libmlx5/mlx5dv_query_device.3
@@ -35,7 +35,9 @@ enum mlx5dv_context_flags {
  * 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
index db77b0d20cd1..ae09281931e7 100644
--- a/contrib/ofed/libmlx5/verbs.c
+++ b/contrib/ofed/libmlx5/verbs.c
@@ -1992,8 +1992,11 @@ int mlx5_query_device_ex(struct ibv_context *context,
 	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;