[PATCH mlx5-next 7/8] net/mlx5: Add VHCA RX flow destination support for FW steering

From: Tariq Toukan

Date: Sun Mar 08 2026 - 01:57:54 EST


From: Shay Drory <shayd@xxxxxxxxxx>

Introduce MLX5_FLOW_DESTINATION_TYPE_VHCA_RX as a new flow steering
destination type.

Wire the new destination through flow steering command setup by mapping
it to MLX5_IFC_FLOW_DESTINATION_TYPE_VHCA_RX and passing the vhca id,
extend forward-destination validation to accept it, and teach the flow
steering tracepoint formatter to print rx_vhca_id.

Signed-off-by: Shay Drory <shayd@xxxxxxxxxx>
Reviewed-by: Mark Bloch <mbloch@xxxxxxxxxx>
Signed-off-by: Tariq Toukan <tariqt@xxxxxxxxxx>
---
.../net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.c | 3 +++
drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c | 4 ++++
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 7 +++++--
include/linux/mlx5/fs.h | 4 ++++
4 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.c b/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.c
index 6d73127b7217..2cf1d3825def 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/diag/fs_tracepoint.c
@@ -282,6 +282,9 @@ const char *parse_fs_dst(struct trace_seq *p,
case MLX5_FLOW_DESTINATION_TYPE_NONE:
trace_seq_printf(p, "none\n");
break;
+ case MLX5_FLOW_DESTINATION_TYPE_VHCA_RX:
+ trace_seq_printf(p, "rx_vhca_id=%u\n", dst->vhca.id);
+ break;
}

trace_seq_putc(p, 0);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
index 16b28028609d..1cd4cd898ec2 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
@@ -716,6 +716,10 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
id = dst->dest_attr.ft->id;
ifc_type = MLX5_IFC_FLOW_DESTINATION_TYPE_TABLE_TYPE;
break;
+ case MLX5_FLOW_DESTINATION_TYPE_VHCA_RX:
+ id = dst->dest_attr.vhca.id;
+ ifc_type = MLX5_IFC_FLOW_DESTINATION_TYPE_VHCA_RX;
+ break;
default:
id = dst->dest_attr.tir_num;
ifc_type = MLX5_IFC_FLOW_DESTINATION_TYPE_TIR;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
index 2c3544880a30..003d211306a7 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
@@ -503,7 +503,8 @@ static bool is_fwd_dest_type(enum mlx5_flow_destination_type type)
type == MLX5_FLOW_DESTINATION_TYPE_FLOW_SAMPLER ||
type == MLX5_FLOW_DESTINATION_TYPE_TIR ||
type == MLX5_FLOW_DESTINATION_TYPE_RANGE ||
- type == MLX5_FLOW_DESTINATION_TYPE_TABLE_TYPE;
+ type == MLX5_FLOW_DESTINATION_TYPE_TABLE_TYPE ||
+ type == MLX5_FLOW_DESTINATION_TYPE_VHCA_RX;
}

static bool check_valid_spec(const struct mlx5_flow_spec *spec)
@@ -1890,7 +1891,9 @@ static bool mlx5_flow_dests_cmp(struct mlx5_flow_destination *d1,
d1->range.hit_ft == d2->range.hit_ft &&
d1->range.miss_ft == d2->range.miss_ft &&
d1->range.min == d2->range.min &&
- d1->range.max == d2->range.max))
+ d1->range.max == d2->range.max) ||
+ (d1->type == MLX5_FLOW_DESTINATION_TYPE_VHCA_RX &&
+ d1->vhca.id == d2->vhca.id))
return true;
}

diff --git a/include/linux/mlx5/fs.h b/include/linux/mlx5/fs.h
index 9cadb1d5e6df..02064424e868 100644
--- a/include/linux/mlx5/fs.h
+++ b/include/linux/mlx5/fs.h
@@ -55,6 +55,7 @@ enum mlx5_flow_destination_type {
MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM,
MLX5_FLOW_DESTINATION_TYPE_RANGE,
MLX5_FLOW_DESTINATION_TYPE_TABLE_TYPE,
+ MLX5_FLOW_DESTINATION_TYPE_VHCA_RX,
};

enum {
@@ -189,6 +190,9 @@ struct mlx5_flow_destination {
u32 ft_num;
struct mlx5_flow_table *ft;
struct mlx5_fc *counter;
+ struct {
+ u16 id;
+ } vhca;
struct {
u16 num;
u16 vhca_id;
--
2.44.0