git: 0d63d42ad70d - main - libmlx5: Report if kernel allows using MPW in SQ
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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;