]> git.itanic.dy.fi Git - linux-stable/commitdiff
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 b4739eafc180f9aa9921c86d13bcd52b2cb75c0a..07b6a6dcb92f06be3f5fcc48fe9760f2c022e9af 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 41a37b9ac98bd16a22470bfbea8cf975e94f8ae9..772ee747511f0c30163cedc03f9e7b760103e596 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];