Commit e046b86e authored by Yevgeny Kliteynik's avatar Yevgeny Kliteynik Committed by Saeed Mahameed

net/mlx5: DR, Add functions to create/destroy MATCH_DEFINER general object

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: default avatarYevgeny Kliteynik <kliteyn@nvidia.com>
Reviewed-by: default avatarAlex Vesker <valex@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 38bf24c3
...@@ -564,6 +564,83 @@ void mlx5dr_cmd_destroy_reformat_ctx(struct mlx5_core_dev *mdev, ...@@ -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); 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, int mlx5dr_cmd_query_gid(struct mlx5_core_dev *mdev, u8 vhca_port_num,
u16 index, struct mlx5dr_cmd_gid_attr *attr) u16 index, struct mlx5dr_cmd_gid_attr *attr)
{ {
......
...@@ -81,6 +81,7 @@ mlx5dr_icm_next_higher_chunk(enum mlx5dr_icm_chunk_size chunk) ...@@ -81,6 +81,7 @@ mlx5dr_icm_next_higher_chunk(enum mlx5dr_icm_chunk_size chunk)
enum { enum {
DR_STE_SIZE = 64, DR_STE_SIZE = 64,
DR_STE_SIZE_CTRL = 32, DR_STE_SIZE_CTRL = 32,
DR_STE_SIZE_MATCH_TAG = 32,
DR_STE_SIZE_TAG = 16, DR_STE_SIZE_TAG = 16,
DR_STE_SIZE_MASK = 16, DR_STE_SIZE_MASK = 16,
DR_STE_SIZE_REDUCED = DR_STE_SIZE - DR_STE_SIZE_MASK, 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, ...@@ -1295,6 +1296,14 @@ int mlx5dr_cmd_create_reformat_ctx(struct mlx5_core_dev *mdev,
u32 *reformat_id); u32 *reformat_id);
void mlx5dr_cmd_destroy_reformat_ctx(struct mlx5_core_dev *mdev, void mlx5dr_cmd_destroy_reformat_ctx(struct mlx5_core_dev *mdev,
u32 reformat_id); 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 { struct mlx5dr_cmd_gid_attr {
u8 gid[16]; u8 gid[16];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment