This source file includes following definitions.
- mlx5dr_icm_next_higher_chunk
- mlx5dr_htbl_put
- mlx5dr_htbl_get
- mlx5dr_ste_put
- mlx5dr_ste_get
- mlx5dr_matcher_supp_flex_parser_icmp_v4
- mlx5dr_matcher_supp_flex_parser_icmp_v6
- mlx5dr_icm_pool_chunk_size_to_entries
- mlx5dr_icm_pool_chunk_size_to_byte
- mlx5dr_get_vport_cap
   1 
   2 
   3 
   4 #ifndef _DR_TYPES_
   5 #define _DR_TYPES_
   6 
   7 #include <linux/mlx5/driver.h>
   8 #include <linux/refcount.h>
   9 #include "fs_core.h"
  10 #include "wq.h"
  11 #include "lib/mlx5.h"
  12 #include "mlx5_ifc_dr.h"
  13 #include "mlx5dr.h"
  14 
  15 #define DR_RULE_MAX_STES 17
  16 #define DR_ACTION_MAX_STES 5
  17 #define WIRE_PORT 0xFFFF
  18 #define DR_STE_SVLAN 0x1
  19 #define DR_STE_CVLAN 0x2
  20 
  21 #define mlx5dr_err(dmn, arg...) mlx5_core_err((dmn)->mdev, ##arg)
  22 #define mlx5dr_info(dmn, arg...) mlx5_core_info((dmn)->mdev, ##arg)
  23 #define mlx5dr_dbg(dmn, arg...) mlx5_core_dbg((dmn)->mdev, ##arg)
  24 
  25 enum mlx5dr_icm_chunk_size {
  26         DR_CHUNK_SIZE_1,
  27         DR_CHUNK_SIZE_MIN = DR_CHUNK_SIZE_1, 
  28         DR_CHUNK_SIZE_2,
  29         DR_CHUNK_SIZE_4,
  30         DR_CHUNK_SIZE_8,
  31         DR_CHUNK_SIZE_16,
  32         DR_CHUNK_SIZE_32,
  33         DR_CHUNK_SIZE_64,
  34         DR_CHUNK_SIZE_128,
  35         DR_CHUNK_SIZE_256,
  36         DR_CHUNK_SIZE_512,
  37         DR_CHUNK_SIZE_1K,
  38         DR_CHUNK_SIZE_2K,
  39         DR_CHUNK_SIZE_4K,
  40         DR_CHUNK_SIZE_8K,
  41         DR_CHUNK_SIZE_16K,
  42         DR_CHUNK_SIZE_32K,
  43         DR_CHUNK_SIZE_64K,
  44         DR_CHUNK_SIZE_128K,
  45         DR_CHUNK_SIZE_256K,
  46         DR_CHUNK_SIZE_512K,
  47         DR_CHUNK_SIZE_1024K,
  48         DR_CHUNK_SIZE_2048K,
  49         DR_CHUNK_SIZE_MAX,
  50 };
  51 
  52 enum mlx5dr_icm_type {
  53         DR_ICM_TYPE_STE,
  54         DR_ICM_TYPE_MODIFY_ACTION,
  55 };
  56 
  57 static inline enum mlx5dr_icm_chunk_size
  58 mlx5dr_icm_next_higher_chunk(enum mlx5dr_icm_chunk_size chunk)
  59 {
  60         chunk += 2;
  61         if (chunk < DR_CHUNK_SIZE_MAX)
  62                 return chunk;
  63 
  64         return DR_CHUNK_SIZE_MAX;
  65 }
  66 
  67 enum {
  68         DR_STE_SIZE = 64,
  69         DR_STE_SIZE_CTRL = 32,
  70         DR_STE_SIZE_TAG = 16,
  71         DR_STE_SIZE_MASK = 16,
  72 };
  73 
  74 enum {
  75         DR_STE_SIZE_REDUCED = DR_STE_SIZE - DR_STE_SIZE_MASK,
  76 };
  77 
  78 enum {
  79         DR_MODIFY_ACTION_SIZE = 8,
  80 };
  81 
  82 enum mlx5dr_matcher_criteria {
  83         DR_MATCHER_CRITERIA_EMPTY = 0,
  84         DR_MATCHER_CRITERIA_OUTER = 1 << 0,
  85         DR_MATCHER_CRITERIA_MISC = 1 << 1,
  86         DR_MATCHER_CRITERIA_INNER = 1 << 2,
  87         DR_MATCHER_CRITERIA_MISC2 = 1 << 3,
  88         DR_MATCHER_CRITERIA_MISC3 = 1 << 4,
  89         DR_MATCHER_CRITERIA_MAX = 1 << 5,
  90 };
  91 
  92 enum mlx5dr_action_type {
  93         DR_ACTION_TYP_TNL_L2_TO_L2,
  94         DR_ACTION_TYP_L2_TO_TNL_L2,
  95         DR_ACTION_TYP_TNL_L3_TO_L2,
  96         DR_ACTION_TYP_L2_TO_TNL_L3,
  97         DR_ACTION_TYP_DROP,
  98         DR_ACTION_TYP_QP,
  99         DR_ACTION_TYP_FT,
 100         DR_ACTION_TYP_CTR,
 101         DR_ACTION_TYP_TAG,
 102         DR_ACTION_TYP_MODIFY_HDR,
 103         DR_ACTION_TYP_VPORT,
 104         DR_ACTION_TYP_POP_VLAN,
 105         DR_ACTION_TYP_PUSH_VLAN,
 106         DR_ACTION_TYP_MAX,
 107 };
 108 
 109 struct mlx5dr_icm_pool;
 110 struct mlx5dr_icm_chunk;
 111 struct mlx5dr_icm_bucket;
 112 struct mlx5dr_ste_htbl;
 113 struct mlx5dr_match_param;
 114 struct mlx5dr_cmd_caps;
 115 struct mlx5dr_matcher_rx_tx;
 116 
 117 struct mlx5dr_ste {
 118         u8 *hw_ste;
 119         
 120         u32 refcount;
 121 
 122         
 123         struct list_head miss_list_node;
 124 
 125         
 126         struct list_head rule_list;
 127 
 128         
 129         struct mlx5dr_ste_htbl *htbl;
 130 
 131         struct mlx5dr_ste_htbl *next_htbl;
 132 
 133         
 134         u8 ste_chain_location;
 135 };
 136 
 137 struct mlx5dr_ste_htbl_ctrl {
 138         
 139 
 140 
 141         unsigned int num_of_valid_entries;
 142 
 143         
 144         unsigned int num_of_collisions;
 145         unsigned int increase_threshold;
 146         u8 may_grow:1;
 147 };
 148 
 149 struct mlx5dr_ste_htbl {
 150         u8 lu_type;
 151         u16 byte_mask;
 152         u32 refcount;
 153         struct mlx5dr_icm_chunk *chunk;
 154         struct mlx5dr_ste *ste_arr;
 155         u8 *hw_ste_arr;
 156 
 157         struct list_head *miss_list;
 158 
 159         enum mlx5dr_icm_chunk_size chunk_size;
 160         struct mlx5dr_ste *pointing_ste;
 161 
 162         struct mlx5dr_ste_htbl_ctrl ctrl;
 163 };
 164 
 165 struct mlx5dr_ste_send_info {
 166         struct mlx5dr_ste *ste;
 167         struct list_head send_list;
 168         u16 size;
 169         u16 offset;
 170         u8 data_cont[DR_STE_SIZE];
 171         u8 *data;
 172 };
 173 
 174 void mlx5dr_send_fill_and_append_ste_send_info(struct mlx5dr_ste *ste, u16 size,
 175                                                u16 offset, u8 *data,
 176                                                struct mlx5dr_ste_send_info *ste_info,
 177                                                struct list_head *send_list,
 178                                                bool copy_data);
 179 
 180 struct mlx5dr_ste_build {
 181         u8 inner:1;
 182         u8 rx:1;
 183         u8 vhca_id_valid:1;
 184         struct mlx5dr_domain *dmn;
 185         struct mlx5dr_cmd_caps *caps;
 186         u8 lu_type;
 187         u16 byte_mask;
 188         u8 bit_mask[DR_STE_SIZE_MASK];
 189         int (*ste_build_tag_func)(struct mlx5dr_match_param *spec,
 190                                   struct mlx5dr_ste_build *sb,
 191                                   u8 *hw_ste_p);
 192 };
 193 
 194 struct mlx5dr_ste_htbl *
 195 mlx5dr_ste_htbl_alloc(struct mlx5dr_icm_pool *pool,
 196                       enum mlx5dr_icm_chunk_size chunk_size,
 197                       u8 lu_type, u16 byte_mask);
 198 
 199 int mlx5dr_ste_htbl_free(struct mlx5dr_ste_htbl *htbl);
 200 
 201 static inline void mlx5dr_htbl_put(struct mlx5dr_ste_htbl *htbl)
 202 {
 203         htbl->refcount--;
 204         if (!htbl->refcount)
 205                 mlx5dr_ste_htbl_free(htbl);
 206 }
 207 
 208 static inline void mlx5dr_htbl_get(struct mlx5dr_ste_htbl *htbl)
 209 {
 210         htbl->refcount++;
 211 }
 212 
 213 
 214 u32 mlx5dr_ste_calc_hash_index(u8 *hw_ste_p, struct mlx5dr_ste_htbl *htbl);
 215 void mlx5dr_ste_init(u8 *hw_ste_p, u8 lu_type, u8 entry_type, u16 gvmi);
 216 void mlx5dr_ste_always_hit_htbl(struct mlx5dr_ste *ste,
 217                                 struct mlx5dr_ste_htbl *next_htbl);
 218 void mlx5dr_ste_set_miss_addr(u8 *hw_ste, u64 miss_addr);
 219 u64 mlx5dr_ste_get_miss_addr(u8 *hw_ste);
 220 void mlx5dr_ste_set_hit_gvmi(u8 *hw_ste_p, u16 gvmi);
 221 void mlx5dr_ste_set_hit_addr(u8 *hw_ste, u64 icm_addr, u32 ht_size);
 222 void mlx5dr_ste_always_miss_addr(struct mlx5dr_ste *ste, u64 miss_addr);
 223 void mlx5dr_ste_set_bit_mask(u8 *hw_ste_p, u8 *bit_mask);
 224 bool mlx5dr_ste_not_used_ste(struct mlx5dr_ste *ste);
 225 bool mlx5dr_ste_is_last_in_rule(struct mlx5dr_matcher_rx_tx *nic_matcher,
 226                                 u8 ste_location);
 227 void mlx5dr_ste_rx_set_flow_tag(u8 *hw_ste_p, u32 flow_tag);
 228 void mlx5dr_ste_set_counter_id(u8 *hw_ste_p, u32 ctr_id);
 229 void mlx5dr_ste_set_tx_encap(void *hw_ste_p, u32 reformat_id,
 230                              int size, bool encap_l3);
 231 void mlx5dr_ste_set_rx_decap(u8 *hw_ste_p);
 232 void mlx5dr_ste_set_rx_decap_l3(u8 *hw_ste_p, bool vlan);
 233 void mlx5dr_ste_set_rx_pop_vlan(u8 *hw_ste_p);
 234 void mlx5dr_ste_set_tx_push_vlan(u8 *hw_ste_p, u32 vlan_tpid_pcp_dei_vid,
 235                                  bool go_back);
 236 void mlx5dr_ste_set_entry_type(u8 *hw_ste_p, u8 entry_type);
 237 u8 mlx5dr_ste_get_entry_type(u8 *hw_ste_p);
 238 void mlx5dr_ste_set_rewrite_actions(u8 *hw_ste_p, u16 num_of_actions,
 239                                     u32 re_write_index);
 240 void mlx5dr_ste_set_go_back_bit(u8 *hw_ste_p);
 241 u64 mlx5dr_ste_get_icm_addr(struct mlx5dr_ste *ste);
 242 u64 mlx5dr_ste_get_mr_addr(struct mlx5dr_ste *ste);
 243 struct list_head *mlx5dr_ste_get_miss_list(struct mlx5dr_ste *ste);
 244 
 245 void mlx5dr_ste_free(struct mlx5dr_ste *ste,
 246                      struct mlx5dr_matcher *matcher,
 247                      struct mlx5dr_matcher_rx_tx *nic_matcher);
 248 static inline void mlx5dr_ste_put(struct mlx5dr_ste *ste,
 249                                   struct mlx5dr_matcher *matcher,
 250                                   struct mlx5dr_matcher_rx_tx *nic_matcher)
 251 {
 252         ste->refcount--;
 253         if (!ste->refcount)
 254                 mlx5dr_ste_free(ste, matcher, nic_matcher);
 255 }
 256 
 257 
 258 static inline void mlx5dr_ste_get(struct mlx5dr_ste *ste)
 259 {
 260         ste->refcount++;
 261 }
 262 
 263 void mlx5dr_ste_set_hit_addr_by_next_htbl(u8 *hw_ste,
 264                                           struct mlx5dr_ste_htbl *next_htbl);
 265 bool mlx5dr_ste_equal_tag(void *src, void *dst);
 266 int mlx5dr_ste_create_next_htbl(struct mlx5dr_matcher *matcher,
 267                                 struct mlx5dr_matcher_rx_tx *nic_matcher,
 268                                 struct mlx5dr_ste *ste,
 269                                 u8 *cur_hw_ste,
 270                                 enum mlx5dr_icm_chunk_size log_table_size);
 271 
 272 
 273 int mlx5dr_ste_build_pre_check(struct mlx5dr_domain *dmn,
 274                                u8 match_criteria,
 275                                struct mlx5dr_match_param *mask,
 276                                struct mlx5dr_match_param *value);
 277 int mlx5dr_ste_build_ste_arr(struct mlx5dr_matcher *matcher,
 278                              struct mlx5dr_matcher_rx_tx *nic_matcher,
 279                              struct mlx5dr_match_param *value,
 280                              u8 *ste_arr);
 281 int mlx5dr_ste_build_eth_l2_src_des(struct mlx5dr_ste_build *builder,
 282                                     struct mlx5dr_match_param *mask,
 283                                     bool inner, bool rx);
 284 void mlx5dr_ste_build_eth_l3_ipv4_5_tuple(struct mlx5dr_ste_build *sb,
 285                                           struct mlx5dr_match_param *mask,
 286                                           bool inner, bool rx);
 287 void mlx5dr_ste_build_eth_l3_ipv4_misc(struct mlx5dr_ste_build *sb,
 288                                        struct mlx5dr_match_param *mask,
 289                                        bool inner, bool rx);
 290 void mlx5dr_ste_build_eth_l3_ipv6_dst(struct mlx5dr_ste_build *sb,
 291                                       struct mlx5dr_match_param *mask,
 292                                       bool inner, bool rx);
 293 void mlx5dr_ste_build_eth_l3_ipv6_src(struct mlx5dr_ste_build *sb,
 294                                       struct mlx5dr_match_param *mask,
 295                                       bool inner, bool rx);
 296 void mlx5dr_ste_build_eth_l2_src(struct mlx5dr_ste_build *sb,
 297                                  struct mlx5dr_match_param *mask,
 298                                  bool inner, bool rx);
 299 void mlx5dr_ste_build_eth_l2_dst(struct mlx5dr_ste_build *sb,
 300                                  struct mlx5dr_match_param *mask,
 301                                  bool inner, bool rx);
 302 void mlx5dr_ste_build_eth_l2_tnl(struct mlx5dr_ste_build *sb,
 303                                  struct mlx5dr_match_param *mask,
 304                                  bool inner, bool rx);
 305 void mlx5dr_ste_build_ipv6_l3_l4(struct mlx5dr_ste_build *sb,
 306                                  struct mlx5dr_match_param *mask,
 307                                  bool inner, bool rx);
 308 void mlx5dr_ste_build_eth_l4_misc(struct mlx5dr_ste_build *sb,
 309                                   struct mlx5dr_match_param *mask,
 310                                   bool inner, bool rx);
 311 void mlx5dr_ste_build_gre(struct mlx5dr_ste_build *sb,
 312                           struct mlx5dr_match_param *mask,
 313                           bool inner, bool rx);
 314 void mlx5dr_ste_build_mpls(struct mlx5dr_ste_build *sb,
 315                            struct mlx5dr_match_param *mask,
 316                            bool inner, bool rx);
 317 void mlx5dr_ste_build_flex_parser_0(struct mlx5dr_ste_build *sb,
 318                                     struct mlx5dr_match_param *mask,
 319                                     bool inner, bool rx);
 320 int mlx5dr_ste_build_flex_parser_1(struct mlx5dr_ste_build *sb,
 321                                    struct mlx5dr_match_param *mask,
 322                                    struct mlx5dr_cmd_caps *caps,
 323                                    bool inner, bool rx);
 324 void mlx5dr_ste_build_flex_parser_tnl(struct mlx5dr_ste_build *sb,
 325                                       struct mlx5dr_match_param *mask,
 326                                       bool inner, bool rx);
 327 void mlx5dr_ste_build_general_purpose(struct mlx5dr_ste_build *sb,
 328                                       struct mlx5dr_match_param *mask,
 329                                       bool inner, bool rx);
 330 void mlx5dr_ste_build_register_0(struct mlx5dr_ste_build *sb,
 331                                  struct mlx5dr_match_param *mask,
 332                                  bool inner, bool rx);
 333 void mlx5dr_ste_build_register_1(struct mlx5dr_ste_build *sb,
 334                                  struct mlx5dr_match_param *mask,
 335                                  bool inner, bool rx);
 336 int mlx5dr_ste_build_src_gvmi_qpn(struct mlx5dr_ste_build *sb,
 337                                   struct mlx5dr_match_param *mask,
 338                                   struct mlx5dr_domain *dmn,
 339                                   bool inner, bool rx);
 340 void mlx5dr_ste_build_empty_always_hit(struct mlx5dr_ste_build *sb, bool rx);
 341 
 342 
 343 int mlx5dr_actions_build_ste_arr(struct mlx5dr_matcher *matcher,
 344                                  struct mlx5dr_matcher_rx_tx *nic_matcher,
 345                                  struct mlx5dr_action *actions[],
 346                                  u32 num_actions,
 347                                  u8 *ste_arr,
 348                                  u32 *new_hw_ste_arr_sz);
 349 
 350 struct mlx5dr_match_spec {
 351         u32 smac_47_16;         
 352         
 353 
 354 
 355         u32 ethertype:16;
 356         u32 smac_15_0:16;       
 357         u32 dmac_47_16;         
 358         
 359 
 360 
 361         u32 first_vid:12;
 362         
 363 
 364 
 365         u32 first_cfi:1;
 366         
 367 
 368 
 369         u32 first_prio:3;
 370         u32 dmac_15_0:16;       
 371         
 372 
 373 
 374         u32 tcp_flags:9;
 375         u32 ip_version:4;       
 376         u32 frag:1;             
 377         
 378 
 379 
 380         u32 svlan_tag:1;
 381         
 382 
 383 
 384         u32 cvlan_tag:1;
 385         
 386 
 387 
 388         u32 ip_ecn:2;
 389         
 390 
 391 
 392         u32 ip_dscp:6;
 393         u32 ip_protocol:8;      
 394         
 395 
 396 
 397         u32 tcp_dport:16;
 398         
 399         u32 tcp_sport:16;
 400         u32 ttl_hoplimit:8;
 401         u32 reserved:24;
 402         
 403         u32 udp_dport:16;
 404         
 405         u32 udp_sport:16;
 406         
 407 
 408 
 409 
 410         u32 src_ip_127_96;
 411         
 412 
 413 
 414 
 415         u32 src_ip_95_64;
 416         
 417 
 418 
 419 
 420         u32 src_ip_63_32;
 421         
 422 
 423 
 424 
 425         u32 src_ip_31_0;
 426         
 427 
 428 
 429 
 430         u32 dst_ip_127_96;
 431         
 432 
 433 
 434 
 435         u32 dst_ip_95_64;
 436         
 437 
 438 
 439 
 440         u32 dst_ip_63_32;
 441         
 442 
 443 
 444 
 445         u32 dst_ip_31_0;
 446 };
 447 
 448 struct mlx5dr_match_misc {
 449         u32 source_sqn:24;              
 450         u32 source_vhca_port:4;
 451         
 452         u32 gre_s_present:1;
 453         
 454         u32 gre_k_present:1;
 455         u32 reserved_auto1:1;
 456         
 457         u32 gre_c_present:1;
 458         
 459         u32 source_port:16;
 460         u32 source_eswitch_owner_vhca_id:16;
 461         
 462 
 463 
 464         u32 inner_second_vid:12;
 465         
 466 
 467 
 468         u32 inner_second_cfi:1;
 469         
 470 
 471 
 472         u32 inner_second_prio:3;
 473         
 474 
 475 
 476         u32 outer_second_vid:12;
 477         
 478 
 479 
 480         u32 outer_second_cfi:1;
 481         
 482 
 483 
 484         u32 outer_second_prio:3;
 485         u32 gre_protocol:16;            
 486         u32 reserved_auto3:12;
 487         
 488 
 489 
 490         u32 inner_second_svlan_tag:1;
 491         
 492 
 493 
 494         u32 outer_second_svlan_tag:1;
 495         
 496 
 497 
 498         u32 inner_second_cvlan_tag:1;
 499         
 500 
 501 
 502         u32 outer_second_cvlan_tag:1;
 503         u32 gre_key_l:8;                
 504         u32 gre_key_h:24;               
 505         u32 reserved_auto4:8;
 506         u32 vxlan_vni:24;               
 507         u32 geneve_oam:1;               
 508         u32 reserved_auto5:7;
 509         u32 geneve_vni:24;              
 510         u32 outer_ipv6_flow_label:20;   
 511         u32 reserved_auto6:12;
 512         u32 inner_ipv6_flow_label:20;   
 513         u32 reserved_auto7:12;
 514         u32 geneve_protocol_type:16;    
 515         u32 geneve_opt_len:6;           
 516         u32 reserved_auto8:10;
 517         u32 bth_dst_qp:24;              
 518         u32 reserved_auto9:8;
 519         u8 reserved_auto10[20];
 520 };
 521 
 522 struct mlx5dr_match_misc2 {
 523         u32 outer_first_mpls_ttl:8;             
 524         u32 outer_first_mpls_s_bos:1;           
 525         u32 outer_first_mpls_exp:3;             
 526         u32 outer_first_mpls_label:20;          
 527         u32 inner_first_mpls_ttl:8;             
 528         u32 inner_first_mpls_s_bos:1;           
 529         u32 inner_first_mpls_exp:3;             
 530         u32 inner_first_mpls_label:20;          
 531         u32 outer_first_mpls_over_gre_ttl:8;    
 532         u32 outer_first_mpls_over_gre_s_bos:1;  
 533         u32 outer_first_mpls_over_gre_exp:3;    
 534         u32 outer_first_mpls_over_gre_label:20; 
 535         u32 outer_first_mpls_over_udp_ttl:8;    
 536         u32 outer_first_mpls_over_udp_s_bos:1;  
 537         u32 outer_first_mpls_over_udp_exp:3;    
 538         u32 outer_first_mpls_over_udp_label:20; 
 539         u32 metadata_reg_c_7;                   
 540         u32 metadata_reg_c_6;                   
 541         u32 metadata_reg_c_5;                   
 542         u32 metadata_reg_c_4;                   
 543         u32 metadata_reg_c_3;                   
 544         u32 metadata_reg_c_2;                   
 545         u32 metadata_reg_c_1;                   
 546         u32 metadata_reg_c_0;                   
 547         u32 metadata_reg_a;                     
 548         u32 metadata_reg_b;                     
 549         u8 reserved_auto2[8];
 550 };
 551 
 552 struct mlx5dr_match_misc3 {
 553         u32 inner_tcp_seq_num;
 554         u32 outer_tcp_seq_num;
 555         u32 inner_tcp_ack_num;
 556         u32 outer_tcp_ack_num;
 557         u32 outer_vxlan_gpe_vni:24;
 558         u32 reserved_auto1:8;
 559         u32 reserved_auto2:16;
 560         u32 outer_vxlan_gpe_flags:8;
 561         u32 outer_vxlan_gpe_next_protocol:8;
 562         u32 icmpv4_header_data;
 563         u32 icmpv6_header_data;
 564         u32 icmpv6_code:8;
 565         u32 icmpv6_type:8;
 566         u32 icmpv4_code:8;
 567         u32 icmpv4_type:8;
 568         u8 reserved_auto3[0x1c];
 569 };
 570 
 571 struct mlx5dr_match_param {
 572         struct mlx5dr_match_spec outer;
 573         struct mlx5dr_match_misc misc;
 574         struct mlx5dr_match_spec inner;
 575         struct mlx5dr_match_misc2 misc2;
 576         struct mlx5dr_match_misc3 misc3;
 577 };
 578 
 579 #define DR_MASK_IS_FLEX_PARSER_ICMPV4_SET(_misc3) ((_misc3)->icmpv4_type || \
 580                                                    (_misc3)->icmpv4_code || \
 581                                                    (_misc3)->icmpv4_header_data)
 582 
 583 struct mlx5dr_esw_caps {
 584         u64 drop_icm_address_rx;
 585         u64 drop_icm_address_tx;
 586         u64 uplink_icm_address_rx;
 587         u64 uplink_icm_address_tx;
 588         bool sw_owner;
 589 };
 590 
 591 struct mlx5dr_cmd_vport_cap {
 592         u16 vport_gvmi;
 593         u16 vhca_gvmi;
 594         u64 icm_address_rx;
 595         u64 icm_address_tx;
 596         u32 num;
 597 };
 598 
 599 struct mlx5dr_cmd_caps {
 600         u16 gvmi;
 601         u64 nic_rx_drop_address;
 602         u64 nic_tx_drop_address;
 603         u64 nic_tx_allow_address;
 604         u64 esw_rx_drop_address;
 605         u64 esw_tx_drop_address;
 606         u32 log_icm_size;
 607         u64 hdr_modify_icm_addr;
 608         u32 flex_protocols;
 609         u8 flex_parser_id_icmp_dw0;
 610         u8 flex_parser_id_icmp_dw1;
 611         u8 flex_parser_id_icmpv6_dw0;
 612         u8 flex_parser_id_icmpv6_dw1;
 613         u8 max_ft_level;
 614         u16 roce_min_src_udp;
 615         u8 num_esw_ports;
 616         bool eswitch_manager;
 617         bool rx_sw_owner;
 618         bool tx_sw_owner;
 619         bool fdb_sw_owner;
 620         u32 num_vports;
 621         struct mlx5dr_esw_caps esw_caps;
 622         struct mlx5dr_cmd_vport_cap *vports_caps;
 623         bool prio_tag_required;
 624 };
 625 
 626 struct mlx5dr_domain_rx_tx {
 627         u64 drop_icm_addr;
 628         u64 default_icm_addr;
 629         enum mlx5dr_ste_entry_type ste_type;
 630 };
 631 
 632 struct mlx5dr_domain_info {
 633         bool supp_sw_steering;
 634         u32 max_inline_size;
 635         u32 max_send_wr;
 636         u32 max_log_sw_icm_sz;
 637         u32 max_log_action_icm_sz;
 638         struct mlx5dr_domain_rx_tx rx;
 639         struct mlx5dr_domain_rx_tx tx;
 640         struct mlx5dr_cmd_caps caps;
 641 };
 642 
 643 struct mlx5dr_domain_cache {
 644         struct mlx5dr_fw_recalc_cs_ft **recalc_cs_ft;
 645 };
 646 
 647 struct mlx5dr_domain {
 648         struct mlx5dr_domain *peer_dmn;
 649         struct mlx5_core_dev *mdev;
 650         u32 pdn;
 651         struct mlx5_uars_page *uar;
 652         enum mlx5dr_domain_type type;
 653         refcount_t refcount;
 654         struct mutex mutex; 
 655         struct mlx5dr_icm_pool *ste_icm_pool;
 656         struct mlx5dr_icm_pool *action_icm_pool;
 657         struct mlx5dr_send_ring *send_ring;
 658         struct mlx5dr_domain_info info;
 659         struct mlx5dr_domain_cache cache;
 660 };
 661 
 662 struct mlx5dr_table_rx_tx {
 663         struct mlx5dr_ste_htbl *s_anchor;
 664         struct mlx5dr_domain_rx_tx *nic_dmn;
 665         u64 default_icm_addr;
 666 };
 667 
 668 struct mlx5dr_table {
 669         struct mlx5dr_domain *dmn;
 670         struct mlx5dr_table_rx_tx rx;
 671         struct mlx5dr_table_rx_tx tx;
 672         u32 level;
 673         u32 table_type;
 674         u32 table_id;
 675         struct list_head matcher_list;
 676         struct mlx5dr_action *miss_action;
 677         refcount_t refcount;
 678 };
 679 
 680 struct mlx5dr_matcher_rx_tx {
 681         struct mlx5dr_ste_htbl *s_htbl;
 682         struct mlx5dr_ste_htbl *e_anchor;
 683         struct mlx5dr_ste_build *ste_builder;
 684         struct mlx5dr_ste_build ste_builder4[DR_RULE_MAX_STES];
 685         struct mlx5dr_ste_build ste_builder6[DR_RULE_MAX_STES];
 686         u8 num_of_builders;
 687         u8 num_of_builders4;
 688         u8 num_of_builders6;
 689         u64 default_icm_addr;
 690         struct mlx5dr_table_rx_tx *nic_tbl;
 691 };
 692 
 693 struct mlx5dr_matcher {
 694         struct mlx5dr_table *tbl;
 695         struct mlx5dr_matcher_rx_tx rx;
 696         struct mlx5dr_matcher_rx_tx tx;
 697         struct list_head matcher_list;
 698         u16 prio;
 699         struct mlx5dr_match_param mask;
 700         u8 match_criteria;
 701         refcount_t refcount;
 702         struct mlx5dv_flow_matcher *dv_matcher;
 703 };
 704 
 705 struct mlx5dr_rule_member {
 706         struct mlx5dr_ste *ste;
 707         
 708         struct list_head list;
 709         
 710         struct list_head use_ste_list;
 711 };
 712 
 713 struct mlx5dr_action {
 714         enum mlx5dr_action_type action_type;
 715         refcount_t refcount;
 716         union {
 717                 struct {
 718                         struct mlx5dr_domain *dmn;
 719                         struct mlx5dr_icm_chunk *chunk;
 720                         u8 *data;
 721                         u32 data_size;
 722                         u16 num_of_actions;
 723                         u32 index;
 724                         u8 allow_rx:1;
 725                         u8 allow_tx:1;
 726                         u8 modify_ttl:1;
 727                 } rewrite;
 728                 struct {
 729                         struct mlx5dr_domain *dmn;
 730                         u32 reformat_id;
 731                         u32 reformat_size;
 732                 } reformat;
 733                 struct {
 734                         u8 is_fw_tbl:1;
 735                         union {
 736                                 struct mlx5dr_table *tbl;
 737                                 struct {
 738                                         struct mlx5_flow_table *ft;
 739                                         u64 rx_icm_addr;
 740                                         u64 tx_icm_addr;
 741                                         struct mlx5_core_dev *mdev;
 742                                 } fw_tbl;
 743                         };
 744                 } dest_tbl;
 745                 struct {
 746                         u32 ctr_id;
 747                         u32 offeset;
 748                 } ctr;
 749                 struct {
 750                         struct mlx5dr_domain *dmn;
 751                         struct mlx5dr_cmd_vport_cap *caps;
 752                 } vport;
 753                 struct {
 754                         u32 vlan_hdr; 
 755                 } push_vlan;
 756                 u32 flow_tag;
 757         };
 758 };
 759 
 760 enum mlx5dr_connect_type {
 761         CONNECT_HIT     = 1,
 762         CONNECT_MISS    = 2,
 763 };
 764 
 765 struct mlx5dr_htbl_connect_info {
 766         enum mlx5dr_connect_type type;
 767         union {
 768                 struct mlx5dr_ste_htbl *hit_next_htbl;
 769                 u64 miss_icm_addr;
 770         };
 771 };
 772 
 773 struct mlx5dr_rule_rx_tx {
 774         struct list_head rule_members_list;
 775         struct mlx5dr_matcher_rx_tx *nic_matcher;
 776 };
 777 
 778 struct mlx5dr_rule {
 779         struct mlx5dr_matcher *matcher;
 780         struct mlx5dr_rule_rx_tx rx;
 781         struct mlx5dr_rule_rx_tx tx;
 782         struct list_head rule_actions_list;
 783 };
 784 
 785 void mlx5dr_rule_update_rule_member(struct mlx5dr_ste *new_ste,
 786                                     struct mlx5dr_ste *ste);
 787 
 788 struct mlx5dr_icm_chunk {
 789         struct mlx5dr_icm_bucket *bucket;
 790         struct list_head chunk_list;
 791         u32 rkey;
 792         u32 num_of_entries;
 793         u32 byte_size;
 794         u64 icm_addr;
 795         u64 mr_addr;
 796 
 797         
 798         struct mlx5dr_ste *ste_arr;
 799         u8 *hw_ste_arr;
 800         struct list_head *miss_list;
 801 };
 802 
 803 static inline int
 804 mlx5dr_matcher_supp_flex_parser_icmp_v4(struct mlx5dr_cmd_caps *caps)
 805 {
 806         return caps->flex_protocols & MLX5_FLEX_PARSER_ICMP_V4_ENABLED;
 807 }
 808 
 809 static inline int
 810 mlx5dr_matcher_supp_flex_parser_icmp_v6(struct mlx5dr_cmd_caps *caps)
 811 {
 812         return caps->flex_protocols & MLX5_FLEX_PARSER_ICMP_V6_ENABLED;
 813 }
 814 
 815 int mlx5dr_matcher_select_builders(struct mlx5dr_matcher *matcher,
 816                                    struct mlx5dr_matcher_rx_tx *nic_matcher,
 817                                    bool ipv6);
 818 
 819 static inline u32
 820 mlx5dr_icm_pool_chunk_size_to_entries(enum mlx5dr_icm_chunk_size chunk_size)
 821 {
 822         return 1 << chunk_size;
 823 }
 824 
 825 static inline int
 826 mlx5dr_icm_pool_chunk_size_to_byte(enum mlx5dr_icm_chunk_size chunk_size,
 827                                    enum mlx5dr_icm_type icm_type)
 828 {
 829         int num_of_entries;
 830         int entry_size;
 831 
 832         if (icm_type == DR_ICM_TYPE_STE)
 833                 entry_size = DR_STE_SIZE;
 834         else
 835                 entry_size = DR_MODIFY_ACTION_SIZE;
 836 
 837         num_of_entries = mlx5dr_icm_pool_chunk_size_to_entries(chunk_size);
 838 
 839         return entry_size * num_of_entries;
 840 }
 841 
 842 static inline struct mlx5dr_cmd_vport_cap *
 843 mlx5dr_get_vport_cap(struct mlx5dr_cmd_caps *caps, u32 vport)
 844 {
 845         if (!caps->vports_caps ||
 846             (vport >= caps->num_vports && vport != WIRE_PORT))
 847                 return NULL;
 848 
 849         if (vport == WIRE_PORT)
 850                 vport = caps->num_vports;
 851 
 852         return &caps->vports_caps[vport];
 853 }
 854 
 855 struct mlx5dr_cmd_query_flow_table_details {
 856         u8 status;
 857         u8 level;
 858         u64 sw_owner_icm_root_1;
 859         u64 sw_owner_icm_root_0;
 860 };
 861 
 862 
 863 int mlx5dr_cmd_query_device(struct mlx5_core_dev *mdev,
 864                             struct mlx5dr_cmd_caps *caps);
 865 int mlx5dr_cmd_query_esw_vport_context(struct mlx5_core_dev *mdev,
 866                                        bool other_vport, u16 vport_number,
 867                                        u64 *icm_address_rx,
 868                                        u64 *icm_address_tx);
 869 int mlx5dr_cmd_query_gvmi(struct mlx5_core_dev *mdev,
 870                           bool other_vport, u16 vport_number, u16 *gvmi);
 871 int mlx5dr_cmd_query_esw_caps(struct mlx5_core_dev *mdev,
 872                               struct mlx5dr_esw_caps *caps);
 873 int mlx5dr_cmd_sync_steering(struct mlx5_core_dev *mdev);
 874 int mlx5dr_cmd_set_fte_modify_and_vport(struct mlx5_core_dev *mdev,
 875                                         u32 table_type,
 876                                         u32 table_id,
 877                                         u32 group_id,
 878                                         u32 modify_header_id,
 879                                         u32 vport_id);
 880 int mlx5dr_cmd_del_flow_table_entry(struct mlx5_core_dev *mdev,
 881                                     u32 table_type,
 882                                     u32 table_id);
 883 int mlx5dr_cmd_alloc_modify_header(struct mlx5_core_dev *mdev,
 884                                    u32 table_type,
 885                                    u8 num_of_actions,
 886                                    u64 *actions,
 887                                    u32 *modify_header_id);
 888 int mlx5dr_cmd_dealloc_modify_header(struct mlx5_core_dev *mdev,
 889                                      u32 modify_header_id);
 890 int mlx5dr_cmd_create_empty_flow_group(struct mlx5_core_dev *mdev,
 891                                        u32 table_type,
 892                                        u32 table_id,
 893                                        u32 *group_id);
 894 int mlx5dr_cmd_destroy_flow_group(struct mlx5_core_dev *mdev,
 895                                   u32 table_type,
 896                                   u32 table_id,
 897                                   u32 group_id);
 898 int mlx5dr_cmd_create_flow_table(struct mlx5_core_dev *mdev,
 899                                  u32 table_type,
 900                                  u64 icm_addr_rx,
 901                                  u64 icm_addr_tx,
 902                                  u8 level,
 903                                  bool sw_owner,
 904                                  bool term_tbl,
 905                                  u64 *fdb_rx_icm_addr,
 906                                  u32 *table_id);
 907 int mlx5dr_cmd_destroy_flow_table(struct mlx5_core_dev *mdev,
 908                                   u32 table_id,
 909                                   u32 table_type);
 910 int mlx5dr_cmd_query_flow_table(struct mlx5_core_dev *dev,
 911                                 enum fs_flow_table_type type,
 912                                 u32 table_id,
 913                                 struct mlx5dr_cmd_query_flow_table_details *output);
 914 int mlx5dr_cmd_create_reformat_ctx(struct mlx5_core_dev *mdev,
 915                                    enum mlx5_reformat_ctx_type rt,
 916                                    size_t reformat_size,
 917                                    void *reformat_data,
 918                                    u32 *reformat_id);
 919 void mlx5dr_cmd_destroy_reformat_ctx(struct mlx5_core_dev *mdev,
 920                                      u32 reformat_id);
 921 
 922 struct mlx5dr_cmd_gid_attr {
 923         u8 gid[16];
 924         u8 mac[6];
 925         u32 roce_ver;
 926 };
 927 
 928 struct mlx5dr_cmd_qp_create_attr {
 929         u32 page_id;
 930         u32 pdn;
 931         u32 cqn;
 932         u32 pm_state;
 933         u32 service_type;
 934         u32 buff_umem_id;
 935         u32 db_umem_id;
 936         u32 sq_wqe_cnt;
 937         u32 rq_wqe_cnt;
 938         u32 rq_wqe_shift;
 939 };
 940 
 941 int mlx5dr_cmd_query_gid(struct mlx5_core_dev *mdev, u8 vhca_port_num,
 942                          u16 index, struct mlx5dr_cmd_gid_attr *attr);
 943 
 944 struct mlx5dr_icm_pool *mlx5dr_icm_pool_create(struct mlx5dr_domain *dmn,
 945                                                enum mlx5dr_icm_type icm_type);
 946 void mlx5dr_icm_pool_destroy(struct mlx5dr_icm_pool *pool);
 947 
 948 struct mlx5dr_icm_chunk *
 949 mlx5dr_icm_alloc_chunk(struct mlx5dr_icm_pool *pool,
 950                        enum mlx5dr_icm_chunk_size chunk_size);
 951 void mlx5dr_icm_free_chunk(struct mlx5dr_icm_chunk *chunk);
 952 bool mlx5dr_ste_is_not_valid_entry(u8 *p_hw_ste);
 953 int mlx5dr_ste_htbl_init_and_postsend(struct mlx5dr_domain *dmn,
 954                                       struct mlx5dr_domain_rx_tx *nic_dmn,
 955                                       struct mlx5dr_ste_htbl *htbl,
 956                                       struct mlx5dr_htbl_connect_info *connect_info,
 957                                       bool update_hw_ste);
 958 void mlx5dr_ste_set_formatted_ste(u16 gvmi,
 959                                   struct mlx5dr_domain_rx_tx *nic_dmn,
 960                                   struct mlx5dr_ste_htbl *htbl,
 961                                   u8 *formatted_ste,
 962                                   struct mlx5dr_htbl_connect_info *connect_info);
 963 void mlx5dr_ste_copy_param(u8 match_criteria,
 964                            struct mlx5dr_match_param *set_param,
 965                            struct mlx5dr_match_parameters *mask);
 966 
 967 void mlx5dr_crc32_init_table(void);
 968 u32 mlx5dr_crc32_slice8_calc(const void *input_data, size_t length);
 969 
 970 struct mlx5dr_qp {
 971         struct mlx5_core_dev *mdev;
 972         struct mlx5_wq_qp wq;
 973         struct mlx5_uars_page *uar;
 974         struct mlx5_wq_ctrl wq_ctrl;
 975         struct mlx5_core_qp mqp;
 976         struct {
 977                 unsigned int pc;
 978                 unsigned int cc;
 979                 unsigned int size;
 980                 unsigned int *wqe_head;
 981                 unsigned int wqe_cnt;
 982         } sq;
 983         struct {
 984                 unsigned int pc;
 985                 unsigned int cc;
 986                 unsigned int size;
 987                 unsigned int wqe_cnt;
 988         } rq;
 989         int max_inline_data;
 990 };
 991 
 992 struct mlx5dr_cq {
 993         struct mlx5_core_dev *mdev;
 994         struct mlx5_cqwq wq;
 995         struct mlx5_wq_ctrl wq_ctrl;
 996         struct mlx5_core_cq mcq;
 997         struct mlx5dr_qp *qp;
 998 };
 999 
1000 struct mlx5dr_mr {
1001         struct mlx5_core_dev *mdev;
1002         struct mlx5_core_mkey mkey;
1003         dma_addr_t dma_addr;
1004         void *addr;
1005         size_t size;
1006 };
1007 
1008 #define MAX_SEND_CQE            64
1009 #define MIN_READ_SYNC           64
1010 
1011 struct mlx5dr_send_ring {
1012         struct mlx5dr_cq *cq;
1013         struct mlx5dr_qp *qp;
1014         struct mlx5dr_mr *mr;
1015         
1016         u32 pending_wqe;
1017         
1018         u16 signal_th;
1019         
1020         u32 max_post_send_size;
1021         
1022         u32 tx_head;
1023         void *buf;
1024         u32 buf_size;
1025         struct ib_wc wc[MAX_SEND_CQE];
1026         u8 sync_buff[MIN_READ_SYNC];
1027         struct mlx5dr_mr *sync_mr;
1028 };
1029 
1030 int mlx5dr_send_ring_alloc(struct mlx5dr_domain *dmn);
1031 void mlx5dr_send_ring_free(struct mlx5dr_domain *dmn,
1032                            struct mlx5dr_send_ring *send_ring);
1033 int mlx5dr_send_ring_force_drain(struct mlx5dr_domain *dmn);
1034 int mlx5dr_send_postsend_ste(struct mlx5dr_domain *dmn,
1035                              struct mlx5dr_ste *ste,
1036                              u8 *data,
1037                              u16 size,
1038                              u16 offset);
1039 int mlx5dr_send_postsend_htbl(struct mlx5dr_domain *dmn,
1040                               struct mlx5dr_ste_htbl *htbl,
1041                               u8 *formatted_ste, u8 *mask);
1042 int mlx5dr_send_postsend_formatted_htbl(struct mlx5dr_domain *dmn,
1043                                         struct mlx5dr_ste_htbl *htbl,
1044                                         u8 *ste_init_data,
1045                                         bool update_hw_ste);
1046 int mlx5dr_send_postsend_action(struct mlx5dr_domain *dmn,
1047                                 struct mlx5dr_action *action);
1048 
1049 struct mlx5dr_fw_recalc_cs_ft {
1050         u64 rx_icm_addr;
1051         u32 table_id;
1052         u32 group_id;
1053         u32 modify_hdr_id;
1054 };
1055 
1056 struct mlx5dr_fw_recalc_cs_ft *
1057 mlx5dr_fw_create_recalc_cs_ft(struct mlx5dr_domain *dmn, u32 vport_num);
1058 void mlx5dr_fw_destroy_recalc_cs_ft(struct mlx5dr_domain *dmn,
1059                                     struct mlx5dr_fw_recalc_cs_ft *recalc_cs_ft);
1060 int mlx5dr_domain_cache_get_recalc_cs_ft_addr(struct mlx5dr_domain *dmn,
1061                                               u32 vport_num,
1062                                               u64 *rx_icm_addr);
1063 #endif