1  /*
2   * Copyright (c) 2015, Mellanox Technologies. All rights reserved.
3   *
4   * This software is available to you under a choice of one of two
5   * licenses.  You may choose to be licensed under the terms of the GNU
6   * General Public License (GPL) Version 2, available from the file
7   * COPYING in the main directory of this source tree, or the
8   * OpenIB.org BSD license below:
9   *
10   *     Redistribution and use in source and binary forms, with or
11   *     without modification, are permitted provided that the following
12   *     conditions are met:
13   *
14   *      - Redistributions of source code must retain the above
15   *        copyright notice, this list of conditions and the following
16   *        disclaimer.
17   *
18   *      - Redistributions in binary form must reproduce the above
19   *        copyright notice, this list of conditions and the following
20   *        disclaimer in the documentation and/or other materials
21   *        provided with the distribution.
22   *
23   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26   * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27   * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28   * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29   * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30   * SOFTWARE.
31   */
32  
33  #ifndef _MLX5_FS_CMD_
34  #define _MLX5_FS_CMD_
35  
36  #include "fs_core.h"
37  
38  struct mlx5_flow_cmds {
39  	int (*create_flow_table)(struct mlx5_flow_root_namespace *ns,
40  				 struct mlx5_flow_table *ft,
41  				 struct mlx5_flow_table_attr *ft_attr,
42  				 struct mlx5_flow_table *next_ft);
43  	int (*destroy_flow_table)(struct mlx5_flow_root_namespace *ns,
44  				  struct mlx5_flow_table *ft);
45  
46  	int (*modify_flow_table)(struct mlx5_flow_root_namespace *ns,
47  				 struct mlx5_flow_table *ft,
48  				 struct mlx5_flow_table *next_ft);
49  
50  	int (*create_flow_group)(struct mlx5_flow_root_namespace *ns,
51  				 struct mlx5_flow_table *ft,
52  				 u32 *in,
53  				 struct mlx5_flow_group *fg);
54  
55  	int (*destroy_flow_group)(struct mlx5_flow_root_namespace *ns,
56  				  struct mlx5_flow_table *ft,
57  				  struct mlx5_flow_group *fg);
58  
59  	int (*create_fte)(struct mlx5_flow_root_namespace *ns,
60  			  struct mlx5_flow_table *ft,
61  			  struct mlx5_flow_group *fg,
62  			  struct fs_fte *fte);
63  
64  	int (*update_fte)(struct mlx5_flow_root_namespace *ns,
65  			  struct mlx5_flow_table *ft,
66  			  struct mlx5_flow_group *fg,
67  			  int modify_mask,
68  			  struct fs_fte *fte);
69  
70  	int (*delete_fte)(struct mlx5_flow_root_namespace *ns,
71  			  struct mlx5_flow_table *ft,
72  			  struct fs_fte *fte);
73  
74  	int (*update_root_ft)(struct mlx5_flow_root_namespace *ns,
75  			      struct mlx5_flow_table *ft,
76  			      u32 underlay_qpn,
77  			      bool disconnect);
78  
79  	int (*packet_reformat_alloc)(struct mlx5_flow_root_namespace *ns,
80  				     struct mlx5_pkt_reformat_params *params,
81  				     enum mlx5_flow_namespace_type namespace,
82  				     struct mlx5_pkt_reformat *pkt_reformat);
83  
84  	void (*packet_reformat_dealloc)(struct mlx5_flow_root_namespace *ns,
85  					struct mlx5_pkt_reformat *pkt_reformat);
86  
87  	int (*modify_header_alloc)(struct mlx5_flow_root_namespace *ns,
88  				   u8 namespace, u8 num_actions,
89  				   void *modify_actions,
90  				   struct mlx5_modify_hdr *modify_hdr);
91  
92  	void (*modify_header_dealloc)(struct mlx5_flow_root_namespace *ns,
93  				      struct mlx5_modify_hdr *modify_hdr);
94  
95  	int (*set_peer)(struct mlx5_flow_root_namespace *ns,
96  			struct mlx5_flow_root_namespace *peer_ns,
97  			u16 peer_vhca_id);
98  
99  	int (*create_ns)(struct mlx5_flow_root_namespace *ns);
100  	int (*destroy_ns)(struct mlx5_flow_root_namespace *ns);
101  	int (*create_match_definer)(struct mlx5_flow_root_namespace *ns,
102  				    u16 format_id, u32 *match_mask);
103  	int (*destroy_match_definer)(struct mlx5_flow_root_namespace *ns,
104  				     int definer_id);
105  
106  	u32 (*get_capabilities)(struct mlx5_flow_root_namespace *ns,
107  				enum fs_flow_table_type ft_type);
108  };
109  
110  int mlx5_cmd_fc_alloc(struct mlx5_core_dev *dev, u32 *id);
111  int mlx5_cmd_fc_bulk_alloc(struct mlx5_core_dev *dev,
112  			   enum mlx5_fc_bulk_alloc_bitmask alloc_bitmask,
113  			   u32 *id);
114  int mlx5_cmd_fc_free(struct mlx5_core_dev *dev, u32 id);
115  int mlx5_cmd_fc_query(struct mlx5_core_dev *dev, u32 id,
116  		      u64 *packets, u64 *bytes);
117  
118  int mlx5_cmd_fc_get_bulk_query_out_len(int bulk_len);
119  int mlx5_cmd_fc_bulk_query(struct mlx5_core_dev *dev, u32 base_id, int bulk_len,
120  			   u32 *out);
121  
122  const struct mlx5_flow_cmds *mlx5_fs_cmd_get_default(enum fs_flow_table_type type);
123  const struct mlx5_flow_cmds *mlx5_fs_cmd_get_fw_cmds(void);
124  
125  int mlx5_fs_cmd_set_l2table_entry_silent(struct mlx5_core_dev *dev, u8 silent_mode);
126  int mlx5_fs_cmd_set_tx_flow_table_root(struct mlx5_core_dev *dev, u32 ft_id, bool disconnect);
127  
mlx5_fs_cmd_is_fw_term_table(struct mlx5_flow_table * ft)128  static inline bool mlx5_fs_cmd_is_fw_term_table(struct mlx5_flow_table *ft)
129  {
130  	if (ft->flags & MLX5_FLOW_TABLE_TERMINATION)
131  		return true;
132  
133  	return false;
134  }
135  #endif
136