net/mlx5: DR, Apply new accelerated modify action and decapl3
authorYevgeny Kliteynik <kliteyn@nvidia.com>
Tue, 8 Nov 2022 09:56:11 +0000 (11:56 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 14 Apr 2023 22:06:22 +0000 (15:06 -0700)
If there is support for pattern/args, use the new accelerated modify
header action for modify header and decap L3 actions.
Otherwise fall back to the old modify-header implementation.

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_ste_v1.c
drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5_ifc_dr_ste_v1.h

index 3d04ac08be7769b01d9d60d3ab34a2ff5f84c968..d2d3124545645b9e05b589d89462bf934ec5c806 100644 (file)
@@ -495,21 +495,59 @@ static void dr_ste_v1_set_rx_decap(u8 *hw_ste_p, u8 *s_action)
        dr_ste_v1_set_reparse(hw_ste_p);
 }
 
-static void dr_ste_v1_set_rewrite_actions(u8 *hw_ste_p,
-                                         u8 *s_action,
-                                         u16 num_of_actions,
-                                         u32 re_write_index)
+static void dr_ste_v1_set_accelerated_rewrite_actions(u8 *hw_ste_p,
+                                                     u8 *d_action,
+                                                     u16 num_of_actions,
+                                                     u32 rewrite_pattern,
+                                                     u32 rewrite_args)
+{
+       MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
+                action_id, DR_STE_V1_ACTION_ID_ACCELERATED_LIST);
+       MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
+                modify_actions_pattern_pointer, rewrite_pattern);
+       MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
+                number_of_modify_actions, num_of_actions);
+       MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action,
+                modify_actions_argument_pointer, rewrite_args);
+
+       dr_ste_v1_set_reparse(hw_ste_p);
+}
+
+static void dr_ste_v1_set_basic_rewrite_actions(u8 *hw_ste_p,
+                                               u8 *s_action,
+                                               u16 num_of_actions,
+                                               u32 rewrite_index)
 {
        MLX5_SET(ste_single_action_modify_list_v1, s_action, action_id,
                 DR_STE_V1_ACTION_ID_MODIFY_LIST);
        MLX5_SET(ste_single_action_modify_list_v1, s_action, num_of_modify_actions,
                 num_of_actions);
        MLX5_SET(ste_single_action_modify_list_v1, s_action, modify_actions_ptr,
-                re_write_index);
+                rewrite_index);
 
        dr_ste_v1_set_reparse(hw_ste_p);
 }
 
+static void dr_ste_v1_set_rewrite_actions(u8 *hw_ste_p,
+                                         u8 *action,
+                                         u16 num_of_actions,
+                                         u32 rewrite_pattern,
+                                         u32 rewrite_args)
+{
+       if (rewrite_pattern != MLX5DR_INVALID_PATTERN_INDEX)
+               return dr_ste_v1_set_accelerated_rewrite_actions(hw_ste_p,
+                                                                action,
+                                                                num_of_actions,
+                                                                rewrite_pattern,
+                                                                rewrite_args);
+
+       /* fall back to the code that doesn't support accelerated modify header */
+       return dr_ste_v1_set_basic_rewrite_actions(hw_ste_p,
+                                                  action,
+                                                  num_of_actions,
+                                                  rewrite_args);
+}
+
 static void dr_ste_v1_set_aso_flow_meter(u8 *d_action,
                                         u32 object_id,
                                         u32 offset,
@@ -614,6 +652,7 @@ void dr_ste_v1_set_actions_tx(struct mlx5dr_domain *dmn,
                }
                dr_ste_v1_set_rewrite_actions(last_ste, action,
                                              attr->modify_actions,
+                                             attr->modify_pat_idx,
                                              attr->modify_index);
                action_sz -= DR_STE_ACTION_DOUBLE_SZ;
                action += DR_STE_ACTION_DOUBLE_SZ;
@@ -744,6 +783,7 @@ void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn,
        if (action_type_set[DR_ACTION_TYP_TNL_L3_TO_L2]) {
                dr_ste_v1_set_rewrite_actions(last_ste, action,
                                              attr->decap_actions,
+                                             attr->decap_pat_idx,
                                              attr->decap_index);
                action_sz -= DR_STE_ACTION_DOUBLE_SZ;
                action += DR_STE_ACTION_DOUBLE_SZ;
@@ -799,6 +839,7 @@ void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn,
                }
                dr_ste_v1_set_rewrite_actions(last_ste, action,
                                              attr->modify_actions,
+                                             attr->modify_pat_idx,
                                              attr->modify_index);
                action_sz -= DR_STE_ACTION_DOUBLE_SZ;
                action += DR_STE_ACTION_DOUBLE_SZ;
index 790a17d6207fd39f9531425c4ecce10a81e5ae31..ca3b0f1453a72ae7b0fd8996d3e384af490b16b6 100644 (file)
@@ -100,7 +100,7 @@ struct mlx5_ifc_ste_double_action_insert_with_ptr_v1_bits {
        u8         pointer[0x20];
 };
 
-struct mlx5_ifc_ste_double_action_modify_action_list_v1_bits {
+struct mlx5_ifc_ste_double_action_accelerated_modify_action_list_v1_bits {
        u8         action_id[0x8];
        u8         modify_actions_pattern_pointer[0x18];