1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) 2022 NVIDIA Corporation & Affiliates 3 */ 4 5 #ifndef MLX5DR_CMD_H_ 6 #define MLX5DR_CMD_H_ 7 8 enum mlx5dr_cmd_ext_dest_flags { 9 MLX5DR_CMD_EXT_DEST_REFORMAT = 1 << 0, 10 MLX5DR_CMD_EXT_DEST_ESW_OWNER_VHCA_ID = 1 << 1, 11 }; 12 13 struct mlx5dr_cmd_set_fte_dest { 14 uint8_t destination_type; 15 uint32_t destination_id; 16 enum mlx5dr_cmd_ext_dest_flags ext_flags; 17 struct mlx5dr_devx_obj *ext_reformat; 18 uint16_t esw_owner_vhca_id; 19 }; 20 21 struct mlx5dr_cmd_set_fte_attr { 22 uint32_t action_flags; 23 uint8_t ignore_flow_level; 24 uint8_t flow_source; 25 uint8_t extended_dest; 26 uint8_t encrypt_decrypt_type; 27 uint32_t encrypt_decrypt_obj_id; 28 uint32_t packet_reformat_id; 29 uint32_t dests_num; 30 struct mlx5dr_cmd_set_fte_dest *dests; 31 }; 32 33 struct mlx5dr_cmd_ft_create_attr { 34 uint8_t type; 35 uint8_t level; 36 bool rtc_valid; 37 uint8_t reformat_en; 38 }; 39 40 #define ACCESS_KEY_LEN 32 41 42 struct mlx5dr_cmd_ft_modify_attr { 43 uint8_t type; 44 uint32_t rtc_id_0; 45 uint32_t rtc_id_1; 46 uint32_t table_miss_id; 47 uint8_t table_miss_action; 48 uint64_t modify_fs; 49 }; 50 51 struct mlx5dr_cmd_ft_query_attr { 52 uint8_t type; 53 }; 54 55 struct mlx5dr_cmd_fg_attr { 56 uint32_t table_id; 57 uint32_t table_type; 58 }; 59 60 struct mlx5dr_cmd_forward_tbl { 61 struct mlx5dr_devx_obj *ft; 62 struct mlx5dr_devx_obj *fg; 63 struct mlx5dr_devx_obj *fte; 64 uint32_t refcount; 65 }; 66 67 struct mlx5dr_cmd_rtc_create_attr { 68 uint32_t pd; 69 uint32_t stc_base; 70 uint32_t ste_base; 71 uint32_t ste_offset; 72 uint32_t miss_ft_id; 73 bool fw_gen_wqe; 74 uint8_t update_index_mode; 75 uint8_t access_index_mode; 76 uint8_t num_hash_definer; 77 uint8_t log_depth; 78 uint8_t log_size; 79 uint8_t table_type; 80 uint8_t match_definer_0; 81 uint8_t match_definer_1; 82 uint8_t reparse_mode; 83 bool is_frst_jumbo; 84 bool is_scnd_range; 85 bool is_compare; 86 }; 87 88 struct mlx5dr_cmd_alias_obj_create_attr { 89 uint32_t obj_id; 90 uint16_t vhca_id; 91 uint16_t obj_type; 92 uint8_t access_key[ACCESS_KEY_LEN]; 93 }; 94 95 struct mlx5dr_cmd_stc_create_attr { 96 uint8_t log_obj_range; 97 uint8_t table_type; 98 }; 99 100 struct mlx5dr_cmd_stc_modify_attr { 101 uint32_t stc_offset; 102 uint8_t action_offset; 103 uint8_t reparse_mode; 104 enum mlx5_ifc_stc_action_type action_type; 105 union { 106 uint32_t id; /* TIRN, TAG, FT ID, STE ID */ 107 struct { 108 uint8_t decap; 109 uint16_t start_anchor; 110 uint16_t end_anchor; 111 } remove_header; 112 struct { 113 uint32_t arg_id; 114 uint32_t pattern_id; 115 } modify_header; 116 struct { 117 __be64 data; 118 } modify_action; 119 struct { 120 uint32_t arg_id; 121 uint32_t header_size; 122 uint8_t is_inline; 123 uint8_t encap; 124 uint16_t insert_anchor; 125 uint16_t insert_offset; 126 uint8_t push_esp; 127 } insert_header; 128 struct { 129 uint8_t aso_type; 130 uint32_t devx_obj_id; 131 uint8_t return_reg_id; 132 } aso; 133 struct { 134 uint16_t vport_num; 135 uint16_t esw_owner_vhca_id; 136 uint8_t eswitch_owner_vhca_id_valid; 137 } vport; 138 struct { 139 struct mlx5dr_pool_chunk ste; 140 struct mlx5dr_pool *ste_pool; 141 uint32_t ste_obj_id; /* Internal */ 142 uint32_t match_definer_id; 143 uint8_t log_hash_size; 144 } ste_table; 145 struct { 146 uint16_t start_anchor; 147 uint16_t num_of_words; 148 } remove_words; 149 150 uint32_t dest_table_id; 151 uint32_t dest_tir_num; 152 }; 153 }; 154 155 struct mlx5dr_cmd_ste_create_attr { 156 uint8_t log_obj_range; 157 uint8_t table_type; 158 }; 159 160 struct mlx5dr_cmd_definer_create_attr { 161 uint8_t *dw_selector; 162 uint8_t *byte_selector; 163 uint8_t *match_mask; 164 }; 165 166 struct mlx5dr_cmd_sq_create_attr { 167 uint32_t cqn; 168 uint32_t pdn; 169 uint32_t page_id; 170 uint32_t dbr_id; 171 uint32_t wq_id; 172 uint32_t log_wq_sz; 173 uint32_t ts_format; 174 }; 175 176 struct mlx5dr_cmd_allow_other_vhca_access_attr { 177 uint16_t obj_type; 178 uint32_t obj_id; 179 uint8_t access_key[ACCESS_KEY_LEN]; 180 }; 181 182 struct mlx5dr_cmd_packet_reformat_create_attr { 183 uint8_t type; 184 size_t data_sz; 185 void *data; 186 uint8_t reformat_param_0; 187 }; 188 189 struct mlx5dr_cmd_query_ft_caps { 190 uint8_t max_level; 191 uint8_t reparse; 192 uint8_t ignore_flow_level_rtc_valid; 193 }; 194 195 struct mlx5dr_cmd_query_vport_caps { 196 uint16_t vport_num; 197 uint16_t esw_owner_vhca_id; 198 }; 199 200 struct mlx5dr_cmd_generate_wqe_attr { 201 uint8_t *wqe_ctrl; 202 uint8_t *gta_ctrl; 203 uint8_t *gta_data_0; 204 uint8_t *gta_data_1; 205 uint32_t pdn; 206 }; 207 208 struct mlx5dr_cmd_query_caps { 209 uint32_t wire_regc_mask; 210 uint32_t flex_protocols; 211 uint8_t wqe_based_update; 212 uint8_t rtc_reparse_mode; 213 uint16_t ste_format; 214 uint8_t rtc_index_mode; 215 uint8_t ste_alloc_log_max; 216 uint8_t ste_alloc_log_gran; 217 uint8_t stc_alloc_log_max; 218 uint8_t stc_alloc_log_gran; 219 uint8_t rtc_log_depth_max; 220 uint8_t format_select_gtpu_dw_0; 221 uint8_t format_select_gtpu_dw_1; 222 uint8_t flow_table_hash_type; 223 uint8_t format_select_gtpu_dw_2; 224 uint8_t format_select_gtpu_ext_dw_0; 225 uint8_t access_index_mode; 226 uint32_t linear_match_definer; 227 bool full_dw_jumbo_support; 228 bool rtc_hash_split_table; 229 bool rtc_linear_lookup_table; 230 uint32_t supp_type_gen_wqe; 231 uint8_t rtc_max_hash_def_gen_wqe; 232 uint16_t supp_ste_format_gen_wqe; 233 struct mlx5dr_cmd_query_ft_caps nic_ft; 234 struct mlx5dr_cmd_query_ft_caps fdb_ft; 235 bool eswitch_manager; 236 uint8_t merged_eswitch; 237 uint32_t eswitch_manager_vport_number; 238 uint8_t log_header_modify_argument_granularity; 239 uint8_t log_header_modify_argument_max_alloc; 240 uint8_t sq_ts_format; 241 uint8_t fdb_tir_stc; 242 uint64_t definer_format_sup; 243 uint32_t trivial_match_definer; 244 uint32_t vhca_id; 245 bool cross_vhca_resources; 246 uint32_t shared_vhca_id; 247 char fw_ver[64]; 248 bool ipsec_offload; 249 uint8_t encap_entropy_hash_type; 250 bool roce; 251 uint16_t roce_max_src_udp_port; 252 uint16_t roce_min_src_udp_port; 253 }; 254 255 int mlx5dr_cmd_destroy_obj(struct mlx5dr_devx_obj *devx_obj); 256 257 struct mlx5dr_devx_obj * 258 mlx5dr_cmd_flow_table_create(struct ibv_context *ctx, 259 struct mlx5dr_cmd_ft_create_attr *ft_attr); 260 261 int 262 mlx5dr_cmd_flow_table_modify(struct mlx5dr_devx_obj *devx_obj, 263 struct mlx5dr_cmd_ft_modify_attr *ft_attr); 264 265 int 266 mlx5dr_cmd_flow_table_query(struct mlx5dr_devx_obj *devx_obj, 267 struct mlx5dr_cmd_ft_query_attr *ft_attr, 268 uint64_t *icm_addr_0, uint64_t *icm_addr_1); 269 270 struct mlx5dr_devx_obj * 271 mlx5dr_cmd_rtc_create(struct ibv_context *ctx, 272 struct mlx5dr_cmd_rtc_create_attr *rtc_attr); 273 274 struct mlx5dr_devx_obj * 275 mlx5dr_cmd_stc_create(struct ibv_context *ctx, 276 struct mlx5dr_cmd_stc_create_attr *stc_attr); 277 278 int 279 mlx5dr_cmd_stc_modify(struct mlx5dr_devx_obj *devx_obj, 280 struct mlx5dr_cmd_stc_modify_attr *stc_attr); 281 282 int 283 mlx5dr_cmd_generate_wqe(struct ibv_context *ctx, 284 struct mlx5dr_cmd_generate_wqe_attr *attr, 285 struct mlx5_cqe64 *ret_cqe); 286 287 struct mlx5dr_devx_obj * 288 mlx5dr_cmd_ste_create(struct ibv_context *ctx, 289 struct mlx5dr_cmd_ste_create_attr *ste_attr); 290 291 struct mlx5dr_devx_obj * 292 mlx5dr_cmd_definer_create(struct ibv_context *ctx, 293 struct mlx5dr_cmd_definer_create_attr *def_attr); 294 295 struct mlx5dr_devx_obj * 296 mlx5dr_cmd_sq_create(struct ibv_context *ctx, 297 struct mlx5dr_cmd_sq_create_attr *attr); 298 299 struct mlx5dr_devx_obj * 300 mlx5dr_cmd_arg_create(struct ibv_context *ctx, 301 uint16_t log_obj_range, 302 uint32_t pd); 303 304 struct mlx5dr_devx_obj * 305 mlx5dr_cmd_header_modify_pattern_create(struct ibv_context *ctx, 306 uint32_t pattern_length, 307 uint8_t *actions); 308 309 struct mlx5dr_devx_obj * 310 mlx5dr_cmd_set_fte(struct ibv_context *ctx, 311 uint32_t table_type, 312 uint32_t table_id, 313 uint32_t group_id, 314 struct mlx5dr_cmd_set_fte_attr *fte_attr); 315 316 struct mlx5dr_cmd_forward_tbl * 317 mlx5dr_cmd_forward_tbl_create(struct ibv_context *ctx, 318 struct mlx5dr_cmd_ft_create_attr *ft_attr, 319 struct mlx5dr_cmd_set_fte_attr *fte_attr); 320 321 void mlx5dr_cmd_forward_tbl_destroy(struct mlx5dr_cmd_forward_tbl *tbl); 322 323 struct mlx5dr_devx_obj * 324 mlx5dr_cmd_packet_reformat_create(struct ibv_context *ctx, 325 struct mlx5dr_cmd_packet_reformat_create_attr *attr); 326 327 struct mlx5dr_devx_obj * 328 mlx5dr_cmd_set_fte(struct ibv_context *ctx, 329 uint32_t table_type, 330 uint32_t table_id, 331 uint32_t group_id, 332 struct mlx5dr_cmd_set_fte_attr *fte_attr); 333 334 struct mlx5dr_cmd_forward_tbl * 335 mlx5dr_cmd_forward_tbl_create(struct ibv_context *ctx, 336 struct mlx5dr_cmd_ft_create_attr *ft_attr, 337 struct mlx5dr_cmd_set_fte_attr *fte_attr); 338 339 void mlx5dr_cmd_forward_tbl_destroy(struct mlx5dr_cmd_forward_tbl *tbl); 340 341 struct mlx5dr_devx_obj * 342 mlx5dr_cmd_alias_obj_create(struct ibv_context *ctx, 343 struct mlx5dr_cmd_alias_obj_create_attr *alias_attr); 344 345 int mlx5dr_cmd_sq_modify_rdy(struct mlx5dr_devx_obj *devx_obj); 346 347 int mlx5dr_cmd_query_ib_port(struct ibv_context *ctx, 348 struct mlx5dr_cmd_query_vport_caps *vport_caps, 349 uint32_t port_num); 350 int mlx5dr_cmd_query_caps(struct ibv_context *ctx, 351 struct mlx5dr_cmd_query_caps *caps); 352 353 void mlx5dr_cmd_set_attr_connect_miss_tbl(struct mlx5dr_context *ctx, 354 uint32_t fw_ft_type, 355 enum mlx5dr_table_type type, 356 struct mlx5dr_cmd_ft_modify_attr *ft_attr); 357 358 int mlx5dr_cmd_allow_other_vhca_access(struct ibv_context *ctx, 359 struct mlx5dr_cmd_allow_other_vhca_access_attr *attr); 360 #endif /* MLX5DR_CMD_H_ */ 361