git: 5189261cd0ec - main - libmlx5: Report SW parsing capabilities through mlx5 direct verbs
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 16 Sep 2026 14:13:20 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=5189261cd0ec0ddfc1fc684b4d8d27e7a6048115
commit 5189261cd0ec0ddfc1fc684b4d8d27e7a6048115
Author: Vag Singh <vag.singh@oneconvergence.com>
AuthorDate: 2025-08-14 06:51:22 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-09-16 14:12:09 +0000
libmlx5: Report SW parsing capabilities through mlx5 direct verbs
[PATCH 24/31] FreeBSD OFED support for DPDK MLX5 PMD
Software parsing (SWP) is a feature that can be used to instruct the
device to stop using its internal parser and to parse packets on the
transmit path according to offsets set for each packet.
Through this feature, the device allows the handling of checksum and LSO
by the hardware according to the location of IP and TCP/UDP headers.
Report various SW parsing capabilities and supported QP types through
mlx5 direct verbs interface.
Differential revision: https://reviews.freebsd.org/D32199
MFC after: 1 month
---
contrib/ofed/libmlx5/mlx5-abi.h | 1 +
contrib/ofed/libmlx5/mlx5.c | 5 +++++
contrib/ofed/libmlx5/mlx5.h | 1 +
contrib/ofed/libmlx5/mlx5dv.h | 15 ++++++++++++++-
contrib/ofed/libmlx5/verbs.c | 1 +
5 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/contrib/ofed/libmlx5/mlx5-abi.h b/contrib/ofed/libmlx5/mlx5-abi.h
index bce9e559326b..d1e8b9d88ae7 100644
--- a/contrib/ofed/libmlx5/mlx5-abi.h
+++ b/contrib/ofed/libmlx5/mlx5-abi.h
@@ -289,6 +289,7 @@ struct mlx5_query_device_ex_resp {
struct mlx5_packet_pacing_caps packet_pacing_caps;
__u32 support_multi_pkt_send_wqe;
__u32 reserved;
+ struct mlx5dv_sw_parsing_caps sw_parsing_caps;
};
#endif /* MLX5_ABI_H */
diff --git a/contrib/ofed/libmlx5/mlx5.c b/contrib/ofed/libmlx5/mlx5.c
index 807725580dac..56560c9d59c0 100644
--- a/contrib/ofed/libmlx5/mlx5.c
+++ b/contrib/ofed/libmlx5/mlx5.c
@@ -661,6 +661,11 @@ int mlx5dv_query_device(struct ibv_context *ctx_in,
if (mctx->vendor_cap_flags & MLX5_VENDOR_CAP_FLAGS_ENHANCED_MPW)
attrs_out->flags |= MLX5DV_CONTEXT_FLAGS_ENHANCED_MPW;
+ if (attrs_out->comp_mask & MLX5DV_CONTEXT_MASK_SWP) {
+ attrs_out->sw_parsing_caps = mctx->sw_parsing_caps;
+ comp_mask_out |= MLX5DV_CONTEXT_MASK_SWP;
+ }
+
attrs_out->comp_mask = comp_mask_out;
return 0;
diff --git a/contrib/ofed/libmlx5/mlx5.h b/contrib/ofed/libmlx5/mlx5.h
index e2e4a882ed54..d8d5b48fc618 100644
--- a/contrib/ofed/libmlx5/mlx5.h
+++ b/contrib/ofed/libmlx5/mlx5.h
@@ -272,6 +272,7 @@ struct mlx5_context {
uint64_t vendor_cap_flags; /* Use enum mlx5_vendor_cap_flags */
struct mlx5dv_cqe_comp_caps cqe_comp_caps;
struct mlx5dv_ctx_allocators extern_alloc;
+ struct mlx5dv_sw_parsing_caps sw_parsing_caps;
};
struct mlx5_bitmap {
diff --git a/contrib/ofed/libmlx5/mlx5dv.h b/contrib/ofed/libmlx5/mlx5dv.h
index 102efdf9065b..53cf5416c071 100644
--- a/contrib/ofed/libmlx5/mlx5dv.h
+++ b/contrib/ofed/libmlx5/mlx5dv.h
@@ -58,7 +58,8 @@ enum {
enum mlx5dv_context_comp_mask {
MLX5DV_CONTEXT_MASK_CQE_COMPRESION = 1 << 0,
- MLX5DV_CONTEXT_MASK_RESERVED = 1 << 1,
+ MLX5DV_CONTEXT_MASK_SWP = 1 << 1,
+ MLX5DV_CONTEXT_MASK_RESERVED = 1 << 2,
};
struct mlx5dv_cqe_comp_caps {
@@ -66,6 +67,11 @@ struct mlx5dv_cqe_comp_caps {
uint32_t supported_format; /* enum mlx5dv_cqe_comp_res_format */
};
+struct mlx5dv_sw_parsing_caps {
+ uint32_t sw_parsing_offloads; /* Use enum mlx5dv_sw_parsing_offloads */
+ uint32_t supported_qpts;
+};
+
/*
* Direct verbs device-specific attributes
*/
@@ -74,6 +80,7 @@ struct mlx5dv_context {
uint64_t flags;
uint64_t comp_mask;
struct mlx5dv_cqe_comp_caps cqe_comp_caps;
+ struct mlx5dv_sw_parsing_caps sw_parsing_caps;
};
enum mlx5dv_context_flags {
@@ -316,6 +323,12 @@ enum mlx5dv_cqe_comp_res_format {
MLX5DV_CQE_RES_FORMAT_RESERVED = 1 << 2,
};
+enum mlx5dv_sw_parsing_offloads {
+ MLX5DV_SW_PARSING = 1 << 0,
+ MLX5DV_SW_PARSING_CSUM = 1 << 1,
+ MLX5DV_SW_PARSING_LSO = 1 << 2,
+};
+
static MLX5DV_ALWAYS_INLINE
uint8_t mlx5dv_get_cqe_owner(struct mlx5_cqe64 *cqe)
{
diff --git a/contrib/ofed/libmlx5/verbs.c b/contrib/ofed/libmlx5/verbs.c
index 2fdf985b0092..f591b177b599 100644
--- a/contrib/ofed/libmlx5/verbs.c
+++ b/contrib/ofed/libmlx5/verbs.c
@@ -2121,6 +2121,7 @@ int mlx5_query_device_ex(struct ibv_context *context,
mctx->vendor_cap_flags |= MLX5_VENDOR_CAP_FLAGS_ENHANCED_MPW;
mctx->cqe_comp_caps = resp.cqe_comp_caps;
+ mctx->sw_parsing_caps = resp.sw_parsing_caps;
major = (raw_fw_ver >> 32) & 0xffff;
minor = (raw_fw_ver >> 16) & 0xffff;