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 struct mlx5dr_cmd_ft_create_attr { 9 uint8_t type; 10 uint8_t level; 11 bool rtc_valid; 12 }; 13 14 struct mlx5dr_cmd_ft_modify_attr { 15 uint8_t type; 16 uint32_t rtc_id_0; 17 uint32_t rtc_id_1; 18 uint32_t table_miss_id; 19 uint8_t table_miss_action; 20 uint64_t modify_fs; 21 }; 22 23 struct mlx5dr_cmd_fg_attr { 24 uint32_t table_id; 25 uint32_t table_type; 26 }; 27 28 struct mlx5dr_cmd_forward_tbl { 29 struct mlx5dr_devx_obj *ft; 30 struct mlx5dr_devx_obj *fg; 31 struct mlx5dr_devx_obj *fte; 32 uint32_t refcount; 33 }; 34 35 struct mlx5dr_cmd_rtc_create_attr { 36 uint32_t pd; 37 uint32_t stc_base; 38 uint32_t ste_base; 39 uint32_t ste_offset; 40 uint32_t miss_ft_id; 41 uint8_t update_index_mode; 42 uint8_t log_depth; 43 uint8_t log_size; 44 uint8_t table_type; 45 uint8_t definer_id; 46 bool is_jumbo; 47 }; 48 49 struct mlx5dr_cmd_alias_obj_create_attr { 50 uint32_t obj_id; 51 uint16_t vhca_id; 52 uint16_t obj_type; 53 uint8_t access_key[32]; 54 }; 55 56 struct mlx5dr_cmd_stc_create_attr { 57 uint8_t log_obj_range; 58 uint8_t table_type; 59 }; 60 61 struct mlx5dr_cmd_stc_modify_attr { 62 uint32_t stc_offset; 63 uint8_t action_offset; 64 enum mlx5_ifc_stc_action_type action_type; 65 union { 66 uint32_t id; /* TIRN, TAG, FT ID, STE ID */ 67 struct { 68 uint8_t decap; 69 uint16_t start_anchor; 70 uint16_t end_anchor; 71 } remove_header; 72 struct { 73 uint32_t arg_id; 74 uint32_t pattern_id; 75 } modify_header; 76 struct { 77 __be64 data; 78 } modify_action; 79 struct { 80 uint32_t arg_id; 81 uint32_t header_size; 82 uint8_t is_inline; 83 uint8_t encap; 84 uint16_t insert_anchor; 85 uint16_t insert_offset; 86 } insert_header; 87 struct { 88 uint8_t aso_type; 89 uint32_t devx_obj_id; 90 uint8_t return_reg_id; 91 } aso; 92 struct { 93 uint16_t vport_num; 94 uint16_t esw_owner_vhca_id; 95 } vport; 96 struct { 97 struct mlx5dr_pool_chunk ste; 98 struct mlx5dr_pool *ste_pool; 99 uint32_t ste_obj_id; /* Internal */ 100 uint32_t match_definer_id; 101 uint8_t log_hash_size; 102 } ste_table; 103 struct { 104 uint16_t start_anchor; 105 uint16_t num_of_words; 106 } remove_words; 107 108 uint32_t dest_table_id; 109 uint32_t dest_tir_num; 110 }; 111 }; 112 113 struct mlx5dr_cmd_ste_create_attr { 114 uint8_t log_obj_range; 115 uint8_t table_type; 116 }; 117 118 struct mlx5dr_cmd_definer_create_attr { 119 uint8_t *dw_selector; 120 uint8_t *byte_selector; 121 uint8_t *match_mask; 122 }; 123 124 struct mlx5dr_cmd_sq_create_attr { 125 uint32_t cqn; 126 uint32_t pdn; 127 uint32_t page_id; 128 uint32_t dbr_id; 129 uint32_t wq_id; 130 uint32_t log_wq_sz; 131 uint32_t ts_format; 132 }; 133 134 struct mlx5dr_cmd_allow_other_vhca_access_attr { 135 uint16_t obj_type; 136 uint32_t obj_id; 137 uint8_t access_key[32]; 138 }; 139 140 struct mlx5dr_cmd_query_ft_caps { 141 uint8_t max_level; 142 uint8_t reparse; 143 }; 144 145 struct mlx5dr_cmd_query_vport_caps { 146 uint16_t vport_num; 147 uint16_t esw_owner_vhca_id; 148 uint32_t metadata_c; 149 uint32_t metadata_c_mask; 150 }; 151 152 struct mlx5dr_cmd_query_caps { 153 uint32_t wire_regc; 154 uint32_t wire_regc_mask; 155 uint32_t flex_protocols; 156 uint8_t wqe_based_update; 157 uint8_t rtc_reparse_mode; 158 uint16_t ste_format; 159 uint8_t rtc_index_mode; 160 uint8_t ste_alloc_log_max; 161 uint8_t ste_alloc_log_gran; 162 uint8_t stc_alloc_log_max; 163 uint8_t stc_alloc_log_gran; 164 uint8_t rtc_log_depth_max; 165 uint8_t format_select_gtpu_dw_0; 166 uint8_t format_select_gtpu_dw_1; 167 uint8_t format_select_gtpu_dw_2; 168 uint8_t format_select_gtpu_ext_dw_0; 169 bool full_dw_jumbo_support; 170 struct mlx5dr_cmd_query_ft_caps nic_ft; 171 struct mlx5dr_cmd_query_ft_caps fdb_ft; 172 bool eswitch_manager; 173 uint32_t eswitch_manager_vport_number; 174 uint8_t log_header_modify_argument_granularity; 175 uint8_t log_header_modify_argument_max_alloc; 176 uint8_t sq_ts_format; 177 uint64_t definer_format_sup; 178 uint32_t trivial_match_definer; 179 bool cross_vhca_resources; 180 char fw_ver[64]; 181 }; 182 183 int mlx5dr_cmd_destroy_obj(struct mlx5dr_devx_obj *devx_obj); 184 185 struct mlx5dr_devx_obj * 186 mlx5dr_cmd_flow_table_create(struct ibv_context *ctx, 187 struct mlx5dr_cmd_ft_create_attr *ft_attr); 188 189 int 190 mlx5dr_cmd_flow_table_modify(struct mlx5dr_devx_obj *devx_obj, 191 struct mlx5dr_cmd_ft_modify_attr *ft_attr); 192 193 struct mlx5dr_devx_obj * 194 mlx5dr_cmd_rtc_create(struct ibv_context *ctx, 195 struct mlx5dr_cmd_rtc_create_attr *rtc_attr); 196 197 struct mlx5dr_devx_obj * 198 mlx5dr_cmd_stc_create(struct ibv_context *ctx, 199 struct mlx5dr_cmd_stc_create_attr *stc_attr); 200 201 int 202 mlx5dr_cmd_stc_modify(struct mlx5dr_devx_obj *devx_obj, 203 struct mlx5dr_cmd_stc_modify_attr *stc_attr); 204 205 struct mlx5dr_devx_obj * 206 mlx5dr_cmd_ste_create(struct ibv_context *ctx, 207 struct mlx5dr_cmd_ste_create_attr *ste_attr); 208 209 struct mlx5dr_devx_obj * 210 mlx5dr_cmd_definer_create(struct ibv_context *ctx, 211 struct mlx5dr_cmd_definer_create_attr *def_attr); 212 213 struct mlx5dr_devx_obj * 214 mlx5dr_cmd_sq_create(struct ibv_context *ctx, 215 struct mlx5dr_cmd_sq_create_attr *attr); 216 217 struct mlx5dr_devx_obj * 218 mlx5dr_cmd_arg_create(struct ibv_context *ctx, 219 uint16_t log_obj_range, 220 uint32_t pd); 221 222 struct mlx5dr_devx_obj * 223 mlx5dr_cmd_header_modify_pattern_create(struct ibv_context *ctx, 224 uint32_t pattern_length, 225 uint8_t *actions); 226 227 struct mlx5dr_devx_obj * 228 mlx5dr_cmd_alias_obj_create(struct ibv_context *ctx, 229 struct mlx5dr_cmd_alias_obj_create_attr *alias_attr); 230 231 int mlx5dr_cmd_sq_modify_rdy(struct mlx5dr_devx_obj *devx_obj); 232 233 int mlx5dr_cmd_query_ib_port(struct ibv_context *ctx, 234 struct mlx5dr_cmd_query_vport_caps *vport_caps, 235 uint32_t port_num); 236 int mlx5dr_cmd_query_caps(struct ibv_context *ctx, 237 struct mlx5dr_cmd_query_caps *caps); 238 239 void mlx5dr_cmd_miss_ft_destroy(struct mlx5dr_cmd_forward_tbl *tbl); 240 241 struct mlx5dr_cmd_forward_tbl * 242 mlx5dr_cmd_miss_ft_create(struct ibv_context *ctx, 243 struct mlx5dr_cmd_ft_create_attr *ft_attr, 244 uint32_t vport); 245 246 void mlx5dr_cmd_set_attr_connect_miss_tbl(struct mlx5dr_context *ctx, 247 uint32_t fw_ft_type, 248 enum mlx5dr_table_type type, 249 struct mlx5dr_cmd_ft_modify_attr *ft_attr); 250 251 int mlx5dr_cmd_allow_other_vhca_access(struct ibv_context *ctx, 252 struct mlx5dr_cmd_allow_other_vhca_access_attr *attr); 253 #endif /* MLX5DR_CMD_H_ */ 254