net/mlx5: Add support EXECUTE_ASO action for flow entry
authorJianbo Liu <jianbol@nvidia.com>
Wed, 8 Jun 2022 20:04:49 +0000 (13:04 -0700)
committerSaeed Mahameed <saeedm@nvidia.com>
Mon, 13 Jun 2022 21:59:06 +0000 (14:59 -0700)
Attach flow meter to FTE with object id and index.
Use metadata register C5 to store the packet color meter result.

Signed-off-by: Jianbo Liu <jianbol@nvidia.com>
Reviewed-by: Roi Dayan <roid@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
include/linux/mlx5/fs.h

index 2ccf7be..735dc80 100644 (file)
@@ -479,6 +479,30 @@ static int mlx5_set_extended_dest(struct mlx5_core_dev *dev,
 
        return 0;
 }
+
+static void
+mlx5_cmd_set_fte_flow_meter(struct fs_fte *fte, void *in_flow_context)
+{
+       void *exe_aso_ctrl;
+       void *execute_aso;
+
+       execute_aso = MLX5_ADDR_OF(flow_context, in_flow_context,
+                                  execute_aso[0]);
+       MLX5_SET(execute_aso, execute_aso, valid, 1);
+       MLX5_SET(execute_aso, execute_aso, aso_object_id,
+                fte->action.exe_aso.object_id);
+
+       exe_aso_ctrl = MLX5_ADDR_OF(execute_aso, execute_aso, exe_aso_ctrl);
+       MLX5_SET(exe_aso_ctrl_flow_meter, exe_aso_ctrl, return_reg_id,
+                fte->action.exe_aso.return_reg_id);
+       MLX5_SET(exe_aso_ctrl_flow_meter, exe_aso_ctrl, aso_type,
+                fte->action.exe_aso.type);
+       MLX5_SET(exe_aso_ctrl_flow_meter, exe_aso_ctrl, init_color,
+                fte->action.exe_aso.flow_meter.init_color);
+       MLX5_SET(exe_aso_ctrl_flow_meter, exe_aso_ctrl, meter_id,
+                fte->action.exe_aso.flow_meter.meter_idx);
+}
+
 static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
                            int opmod, int modify_mask,
                            struct mlx5_flow_table *ft,
@@ -663,6 +687,15 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
                         list_size);
        }
 
+       if (fte->action.action & MLX5_FLOW_CONTEXT_ACTION_EXECUTE_ASO) {
+               if (fte->action.exe_aso.type == MLX5_EXE_ASO_FLOW_METER) {
+                       mlx5_cmd_set_fte_flow_meter(fte, in_flow_context);
+               } else {
+                       err = -EOPNOTSUPP;
+                       goto err_out;
+               }
+       }
+
        err = mlx5_cmd_exec(dev, in, inlen, out, sizeof(out));
 err_out:
        kvfree(in);
index 8135713..ece3e35 100644 (file)
@@ -212,6 +212,19 @@ struct mlx5_flow_group *
 mlx5_create_flow_group(struct mlx5_flow_table *ft, u32 *in);
 void mlx5_destroy_flow_group(struct mlx5_flow_group *fg);
 
+struct mlx5_exe_aso {
+       u32 object_id;
+       u8 type;
+       u8 return_reg_id;
+       union {
+               u32 ctrl_data;
+               struct {
+                       u8 meter_idx;
+                       u8 init_color;
+               } flow_meter;
+       };
+};
+
 struct mlx5_fs_vlan {
         u16 ethtype;
         u16 vid;
@@ -237,6 +250,7 @@ struct mlx5_flow_act {
        struct mlx5_fs_vlan vlan[MLX5_FS_VLAN_DEPTH];
        struct ib_counters *counters;
        struct mlx5_flow_group *fg;
+       struct mlx5_exe_aso exe_aso;
 };
 
 #define MLX5_DECLARE_FLOW_ACT(name) \