net/mlx5: DR, Add functions to create/destroy MATCH_DEFINER general object
authorYevgeny Kliteynik <kliteyn@nvidia.com>
Tue, 31 May 2022 13:25:17 +0000 (16:25 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 9 Dec 2022 00:10:53 +0000 (16:10 -0800)
SW steering is able to match only on the exact values of the packet fields,
as requested by the user: the user provides mask for the fields that are of
interest, and the exact values to be matched on when the traffic is handled.

Match Definer is a general FW object that defines which fields in the
packet will be referenced by the mask and tag of each STE. Match definer ID
is part of STE fields, and it defines how the HW needs to interpret the STE's
mask/tag values.
Till now SW steering used the definers that were managed by FW and implemented
the STE layout as described by the HW spec. Now that we're adding a new type
of STE, SW steering needs to define for the HW how it should interpret this
new STE's layout.
This is done with a programmable match definer.

The programmable definer allows to selects which fields will be included in
the definer, and their layout: it has up to 9 DW selectors 8 Byte selectors.
Each selector indicates a DW/Byte worth of fields out of the table that
is defined by HW spec by referencing the offset of the required DW/Byte.

This patch adds dr_cmd function to create and destroy MATCH_DEFINER
general object.

Signed-off-by: Yevgeny Kliteynik <kliteyn@nvidia.com>
Reviewed-by: Alex Vesker <valex@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_cmd.c
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h

index b4739ea..07b6a6d 100644 (file)
@@ -564,6 +564,83 @@ void mlx5dr_cmd_destroy_reformat_ctx(struct mlx5_core_dev *mdev,
        mlx5_cmd_exec_in(mdev, dealloc_packet_reformat_context, in);
 }
 
+static void dr_cmd_set_definer_format(void *ptr, u16 format_id,
+                                     u8 *dw_selectors,
+                                     u8 *byte_selectors)
+{
+       if (format_id != MLX5_IFC_DEFINER_FORMAT_ID_SELECT)
+               return;
+
+       MLX5_SET(match_definer, ptr, format_select_dw0, dw_selectors[0]);
+       MLX5_SET(match_definer, ptr, format_select_dw1, dw_selectors[1]);
+       MLX5_SET(match_definer, ptr, format_select_dw2, dw_selectors[2]);
+       MLX5_SET(match_definer, ptr, format_select_dw3, dw_selectors[3]);
+       MLX5_SET(match_definer, ptr, format_select_dw4, dw_selectors[4]);
+       MLX5_SET(match_definer, ptr, format_select_dw5, dw_selectors[5]);
+       MLX5_SET(match_definer, ptr, format_select_dw6, dw_selectors[6]);
+       MLX5_SET(match_definer, ptr, format_select_dw7, dw_selectors[7]);
+       MLX5_SET(match_definer, ptr, format_select_dw8, dw_selectors[8]);
+
+       MLX5_SET(match_definer, ptr, format_select_byte0, byte_selectors[0]);
+       MLX5_SET(match_definer, ptr, format_select_byte1, byte_selectors[1]);
+       MLX5_SET(match_definer, ptr, format_select_byte2, byte_selectors[2]);
+       MLX5_SET(match_definer, ptr, format_select_byte3, byte_selectors[3]);
+       MLX5_SET(match_definer, ptr, format_select_byte4, byte_selectors[4]);
+       MLX5_SET(match_definer, ptr, format_select_byte5, byte_selectors[5]);
+       MLX5_SET(match_definer, ptr, format_select_byte6, byte_selectors[6]);
+       MLX5_SET(match_definer, ptr, format_select_byte7, byte_selectors[7]);
+}
+
+int mlx5dr_cmd_create_definer(struct mlx5_core_dev *mdev,
+                             u16 format_id,
+                             u8 *dw_selectors,
+                             u8 *byte_selectors,
+                             u8 *match_mask,
+                             u32 *definer_id)
+{
+       u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)] = {};
+       u32 in[MLX5_ST_SZ_DW(create_match_definer_in)] = {};
+       void *ptr;
+       int err;
+
+       ptr = MLX5_ADDR_OF(create_match_definer_in, in,
+                          general_obj_in_cmd_hdr);
+       MLX5_SET(general_obj_in_cmd_hdr, ptr, opcode,
+                MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
+       MLX5_SET(general_obj_in_cmd_hdr, ptr, obj_type,
+                MLX5_OBJ_TYPE_MATCH_DEFINER);
+
+       ptr = MLX5_ADDR_OF(create_match_definer_in, in, obj_context);
+       MLX5_SET(match_definer, ptr, format_id, format_id);
+
+       dr_cmd_set_definer_format(ptr, format_id,
+                                 dw_selectors, byte_selectors);
+
+       ptr = MLX5_ADDR_OF(match_definer, ptr, match_mask);
+       memcpy(ptr, match_mask, MLX5_FLD_SZ_BYTES(match_definer, match_mask));
+
+       err = mlx5_cmd_exec(mdev, in, sizeof(in), out, sizeof(out));
+       if (err)
+               return err;
+
+       *definer_id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
+
+       return 0;
+}
+
+void
+mlx5dr_cmd_destroy_definer(struct mlx5_core_dev *mdev, u32 definer_id)
+{
+       u32 in[MLX5_ST_SZ_DW(general_obj_in_cmd_hdr)] = {};
+       u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)];
+
+       MLX5_SET(general_obj_in_cmd_hdr, in, opcode, MLX5_CMD_OP_DESTROY_GENERAL_OBJECT);
+       MLX5_SET(general_obj_in_cmd_hdr, in, obj_type, MLX5_OBJ_TYPE_MATCH_DEFINER);
+       MLX5_SET(general_obj_in_cmd_hdr, in, obj_id, definer_id);
+
+       mlx5_cmd_exec(mdev, in, sizeof(in), out, sizeof(out));
+}
+
 int mlx5dr_cmd_query_gid(struct mlx5_core_dev *mdev, u8 vhca_port_num,
                         u16 index, struct mlx5dr_cmd_gid_attr *attr)
 {
index 41a37b9..772ee74 100644 (file)
@@ -81,6 +81,7 @@ mlx5dr_icm_next_higher_chunk(enum mlx5dr_icm_chunk_size chunk)
 enum {
        DR_STE_SIZE = 64,
        DR_STE_SIZE_CTRL = 32,
+       DR_STE_SIZE_MATCH_TAG = 32,
        DR_STE_SIZE_TAG = 16,
        DR_STE_SIZE_MASK = 16,
        DR_STE_SIZE_REDUCED = DR_STE_SIZE - DR_STE_SIZE_MASK,
@@ -1295,6 +1296,14 @@ int mlx5dr_cmd_create_reformat_ctx(struct mlx5_core_dev *mdev,
                                   u32 *reformat_id);
 void mlx5dr_cmd_destroy_reformat_ctx(struct mlx5_core_dev *mdev,
                                     u32 reformat_id);
+int mlx5dr_cmd_create_definer(struct mlx5_core_dev *mdev,
+                             u16 format_id,
+                             u8 *dw_selectors,
+                             u8 *byte_selectors,
+                             u8 *match_mask,
+                             u32 *definer_id);
+void mlx5dr_cmd_destroy_definer(struct mlx5_core_dev *mdev,
+                               u32 definer_id);
 
 struct mlx5dr_cmd_gid_attr {
        u8 gid[16];