FILE
mlx5hws.h
File preview with syntax highlighting.
linux-6.19.14/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/mlx5hws.h
1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 2/* Copyright (c) 2024 NVIDIA Corporation & Affiliates */ 3 4#ifndef MLX5HWS_H_ 5#define MLX5HWS_H_ 6 7struct mlx5hws_context; 8struct mlx5hws_table; 9struct mlx5hws_matcher; 10struct mlx5hws_rule; 11 12enum mlx5hws_table_type { 13 MLX5HWS_TABLE_TYPE_FDB, 14 MLX5HWS_TABLE_TYPE_MAX, 15}; 16 17enum mlx5hws_matcher_resource_mode { 18 /* Allocate resources based on number of rules with minimal failure probability */ 19 MLX5HWS_MATCHER_RESOURCE_MODE_RULE, 20 /* Allocate fixed size hash table based on given column and rows */ 21 MLX5HWS_MATCHER_RESOURCE_MODE_HTABLE, 22}; 23 24enum mlx5hws_action_type { 25 MLX5HWS_ACTION_TYP_LAST, 26 MLX5HWS_ACTION_TYP_REFORMAT_TNL_L2_TO_L2, 27 MLX5HWS_ACTION_TYP_REFORMAT_L2_TO_TNL_L2, 28 MLX5HWS_ACTION_TYP_REFORMAT_TNL_L3_TO_L2, 29 MLX5HWS_ACTION_TYP_REFORMAT_L2_TO_TNL_L3, 30 MLX5HWS_ACTION_TYP_DROP, 31 MLX5HWS_ACTION_TYP_MISS, 32 MLX5HWS_ACTION_TYP_TBL, 33 MLX5HWS_ACTION_TYP_CTR, 34 MLX5HWS_ACTION_TYP_TAG, 35 MLX5HWS_ACTION_TYP_MODIFY_HDR, 36 MLX5HWS_ACTION_TYP_VPORT, 37 MLX5HWS_ACTION_TYP_POP_VLAN, 38 MLX5HWS_ACTION_TYP_PUSH_VLAN, 39 MLX5HWS_ACTION_TYP_ASO_METER, 40 MLX5HWS_ACTION_TYP_INSERT_HEADER, 41 MLX5HWS_ACTION_TYP_REMOVE_HEADER, 42 MLX5HWS_ACTION_TYP_RANGE, 43 MLX5HWS_ACTION_TYP_SAMPLER, 44 MLX5HWS_ACTION_TYP_DEST_ARRAY, 45 MLX5HWS_ACTION_TYP_MAX, 46}; 47 48enum mlx5hws_action_flags { 49 MLX5HWS_ACTION_FLAG_HWS_FDB = 1 << 0, 50 /* Shared action can be used over a few threads, since the 51 * data is written only once at the creation of the action. 52 */ 53 MLX5HWS_ACTION_FLAG_SHARED = 1 << 1, 54}; 55 56enum mlx5hws_action_aso_meter_color { 57 MLX5HWS_ACTION_ASO_METER_COLOR_RED = 0x0, 58 MLX5HWS_ACTION_ASO_METER_COLOR_YELLOW = 0x1, 59 MLX5HWS_ACTION_ASO_METER_COLOR_GREEN = 0x2, 60 MLX5HWS_ACTION_ASO_METER_COLOR_UNDEFINED = 0x3, 61}; 62 63enum mlx5hws_send_queue_actions { 64 /* Start executing all pending queued rules */ 65 MLX5HWS_SEND_QUEUE_ACTION_DRAIN_ASYNC = 1 << 0, 66 /* Start executing all pending queued rules wait till completion */ 67 MLX5HWS_SEND_QUEUE_ACTION_DRAIN_SYNC = 1 << 1, 68}; 69 70struct mlx5hws_context_attr { 71 u16 queues; 72 u16 queue_size; 73}; 74 75struct mlx5hws_table_attr { 76 enum mlx5hws_table_type type; 77 u32 level; 78 u16 uid; 79}; 80 81enum mlx5hws_matcher_flow_src { 82 MLX5HWS_MATCHER_FLOW_SRC_ANY = 0x0, 83 MLX5HWS_MATCHER_FLOW_SRC_WIRE = 0x1, 84 MLX5HWS_MATCHER_FLOW_SRC_VPORT = 0x2, 85}; 86 87enum mlx5hws_matcher_insert_mode { 88 MLX5HWS_MATCHER_INSERT_BY_HASH = 0x0, 89 MLX5HWS_MATCHER_INSERT_BY_INDEX = 0x1, 90}; 91 92enum mlx5hws_matcher_distribute_mode { 93 MLX5HWS_MATCHER_DISTRIBUTE_BY_HASH = 0x0, 94 MLX5HWS_MATCHER_DISTRIBUTE_BY_LINEAR = 0x1, 95}; 96 97enum mlx5hws_matcher_size_type { 98 MLX5HWS_MATCHER_SIZE_TYPE_RX, 99 MLX5HWS_MATCHER_SIZE_TYPE_TX, 100 MLX5HWS_MATCHER_SIZE_TYPE_MAX, 101}; 102 103union mlx5hws_matcher_size { 104 struct { 105 u8 sz_row_log; 106 u8 sz_col_log; 107 } table; 108 109 struct { 110 u8 num_log; 111 } rule; 112}; 113 114struct mlx5hws_matcher_attr { 115 /* Processing priority inside table */ 116 u32 priority; 117 /* Provide all rules with unique rule_idx in num_log range to reduce locking */ 118 bool optimize_using_rule_idx; 119 /* Resource mode and corresponding size */ 120 enum mlx5hws_matcher_resource_mode mode; 121 /* Optimize insertion in case packet origin is the same for all rules */ 122 enum mlx5hws_matcher_flow_src optimize_flow_src; 123 /* Define the insertion and distribution modes for this matcher */ 124 enum mlx5hws_matcher_insert_mode insert_mode; 125 enum mlx5hws_matcher_distribute_mode distribute_mode; 126 /* Define whether the created matcher supports resizing into a bigger matcher */ 127 bool resizable; 128 union mlx5hws_matcher_size size[MLX5HWS_MATCHER_SIZE_TYPE_MAX]; 129 /* Optional AT attach configuration - Max number of additional AT */ 130 u8 max_num_of_at_attach; 131 /* Optional end FT (miss FT ID) for match RTC (for isolated matcher) */ 132 u32 isolated_matcher_end_ft_id; 133}; 134 135struct mlx5hws_rule_attr { 136 void *user_data; 137 /* Valid if matcher optimize_using_rule_idx is set or 138 * if matcher is configured to insert rules by index. 139 */ 140 u32 rule_idx; 141 u32 flow_source; 142 u16 queue_id; 143 u32 burst:1; 144}; 145 146/* In actions that take offset, the offset is unique, pointing to a single 147 * resource and the user should not reuse the same index because data changing 148 * is not atomic. 149 */ 150struct mlx5hws_rule_action { 151 struct mlx5hws_action *action; 152 union { 153 struct { 154 u32 value; 155 } tag; 156 157 struct { 158 u32 offset; 159 } counter; 160 161 struct { 162 u32 offset; 163 u8 *data; 164 } modify_header; 165 166 struct { 167 u32 offset; 168 u8 hdr_idx; 169 u8 *data; 170 } reformat; 171 172 struct { 173 __be32 vlan_hdr; 174 } push_vlan; 175 176 struct { 177 u32 offset; 178 enum mlx5hws_action_aso_meter_color init_color; 179 } aso_meter; 180 }; 181}; 182 183struct mlx5hws_action_reformat_header { 184 size_t sz; 185 void *data; 186}; 187 188struct mlx5hws_action_insert_header { 189 struct mlx5hws_action_reformat_header hdr; 190 /* PRM start anchor to which header will be inserted */ 191 u8 anchor; 192 /* Header insertion offset in bytes, from the start 193 * anchor to the location where new header will be inserted. 194 */ 195 u8 offset; 196 /* Indicates this header insertion adds encapsulation header to the packet, 197 * requiring device to update offloaded fields (for example IPv4 total length). 198 */ 199 bool encap; 200}; 201 202struct mlx5hws_action_remove_header_attr { 203 /* PRM start anchor from which header will be removed */ 204 u8 anchor; 205 /* Header remove offset in bytes, from the start 206 * anchor to the location where remove header starts. 207 */ 208 u8 offset; 209 /* Indicates the removed header size in bytes */ 210 size_t size; 211}; 212 213struct mlx5hws_action_mh_pattern { 214 /* Byte size of modify actions provided by "data" */ 215 size_t sz; 216 /* PRM format modify actions pattern */ 217 __be64 *data; 218}; 219 220struct mlx5hws_action_dest_attr { 221 /* Required destination action to forward the packet */ 222 struct mlx5hws_action *dest; 223 /* Optional reformat action */ 224 struct mlx5hws_action *reformat; 225 bool is_wire_ft; 226}; 227 228/** 229 * mlx5hws_is_supported - Check whether HWS is supported 230 * 231 * @mdev: The device to check. 232 * 233 * Return: true if supported, false otherwise. 234 */ 235static inline bool mlx5hws_is_supported(struct mlx5_core_dev *mdev) 236{ 237 u8 ignore_flow_level_rtc_valid; 238 u8 wqe_based_flow_table_update; 239 240 wqe_based_flow_table_update = 241 MLX5_CAP_GEN(mdev, wqe_based_flow_table_update_cap); 242 ignore_flow_level_rtc_valid = 243 MLX5_CAP_FLOWTABLE(mdev, 244 flow_table_properties_nic_receive.ignore_flow_level_rtc_valid); 245 246 return wqe_based_flow_table_update && ignore_flow_level_rtc_valid; 247} 248 249/** 250 * mlx5hws_context_open - Open a context used for direct rule insertion 251 * using hardware steering. 252 * 253 * @mdev: The device to be used for HWS. 254 * @attr: Attributes used for context open. 255 * 256 * Return: pointer to mlx5hws_context on success NULL otherwise. 257 */ 258struct mlx5hws_context * 259mlx5hws_context_open(struct mlx5_core_dev *mdev, 260 struct mlx5hws_context_attr *attr); 261 262/** 263 * mlx5hws_context_close - Close a context used for direct hardware steering. 264 * 265 * @ctx: mlx5hws context to close. 266 * 267 * Return: zero on success non zero otherwise. 268 */ 269int mlx5hws_context_close(struct mlx5hws_context *ctx); 270 271/** 272 * mlx5hws_context_set_peer - Set a peer context. 273 * Each context can have multiple contexts as peers. 274 * 275 * @ctx: The context in which the peer_ctx will be peered to it. 276 * @peer_ctx: The peer context. 277 * @peer_vhca_id: The peer context vhca id. 278 */ 279void mlx5hws_context_set_peer(struct mlx5hws_context *ctx, 280 struct mlx5hws_context *peer_ctx, 281 u16 peer_vhca_id); 282 283/** 284 * mlx5hws_table_create - Create a new direct rule table. 285 * Each table can contain multiple matchers. 286 * 287 * @ctx: The context in which the new table will be opened. 288 * @attr: Attributes used for table creation. 289 * 290 * Return: pointer to mlx5hws_table on success NULL otherwise. 291 */ 292struct mlx5hws_table * 293mlx5hws_table_create(struct mlx5hws_context *ctx, 294 struct mlx5hws_table_attr *attr); 295 296/** 297 * mlx5hws_table_destroy - Destroy direct rule table. 298 * 299 * @tbl: Table to destroy. 300 * 301 * Return: zero on success non zero otherwise. 302 */ 303int mlx5hws_table_destroy(struct mlx5hws_table *tbl); 304 305/** 306 * mlx5hws_table_get_id() - Get ID of the flow table. 307 * 308 * @tbl:Table to get ID of. 309 * 310 * Return: ID of the table. 311 */ 312u32 mlx5hws_table_get_id(struct mlx5hws_table *tbl); 313 314/** 315 * mlx5hws_table_set_default_miss - Set default miss table for mlx5hws_table 316 * by using another mlx5hws_table. 317 * Traffic which all table matchers miss will be forwarded to miss table. 318 * 319 * @tbl: Source table 320 * @miss_tbl: Target (miss) table, or NULL to remove current miss table 321 * 322 * Return: zero on success non zero otherwise. 323 */ 324int mlx5hws_table_set_default_miss(struct mlx5hws_table *tbl, 325 struct mlx5hws_table *miss_tbl); 326 327/** 328 * mlx5hws_match_template_create - Create a new match template based on items mask. 329 * The match template will be used for matcher creation. 330 * 331 * @ctx: The context in which the new template will be created. 332 * @match_param: Describe the mask based on PRM match parameters. 333 * @match_param_sz: Size of match param buffer. 334 * @match_criteria_enable: Bitmap for each sub-set in match_criteria buffer. 335 * 336 * Return: Pointer to mlx5hws_match_template on success, NULL otherwise. 337 */ 338struct mlx5hws_match_template * 339mlx5hws_match_template_create(struct mlx5hws_context *ctx, 340 u32 *match_param, 341 u32 match_param_sz, 342 u8 match_criteria_enable); 343 344/** 345 * mlx5hws_match_template_destroy - Destroy a match template. 346 * 347 * @mt: Match template to destroy. 348 * 349 * Return: Zero on success, non-zero otherwise. 350 */ 351int mlx5hws_match_template_destroy(struct mlx5hws_match_template *mt); 352 353/** 354 * mlx5hws_action_template_create - Create a new action template based on an action_type array. 355 * 356 * @action_type: An array of actions based on the order of actions which will be provided 357 * with rule_actions to mlx5hws_rule_create. The last action is marked 358 * using MLX5HWS_ACTION_TYP_LAST. 359 * 360 * Return: Pointer to mlx5hws_action_template on success, NULL otherwise. 361 */ 362struct mlx5hws_action_template * 363mlx5hws_action_template_create(enum mlx5hws_action_type action_type[]); 364 365/** 366 * mlx5hws_action_template_destroy - Destroy action template. 367 * 368 * @at: Action template to destroy. 369 * 370 * Return: zero on success non zero otherwise. 371 */ 372int mlx5hws_action_template_destroy(struct mlx5hws_action_template *at); 373 374/** 375 * mlx5hws_matcher_create - Create a new direct rule matcher. 376 * 377 * Each matcher can contain multiple rules. Matchers on the table will be 378 * processed by priority. Matching fields and mask are described by the 379 * match template. In some cases, multiple match templates can be used on 380 * the same matcher. 381 * 382 * @table: The table in which the new matcher will be opened. 383 * @mt: Array of match templates to be used on matcher. 384 * @num_of_mt: Number of match templates in mt array. 385 * @at: Array of action templates to be used on matcher. 386 * @num_of_at: Number of action templates in at array. 387 * @attr: Attributes used for matcher creation. 388 * 389 * Return: Pointer to mlx5hws_matcher on success, NULL otherwise. 390 * 391 */ 392struct mlx5hws_matcher * 393mlx5hws_matcher_create(struct mlx5hws_table *table, 394 struct mlx5hws_match_template *mt[], 395 u8 num_of_mt, 396 struct mlx5hws_action_template *at[], 397 u8 num_of_at, 398 struct mlx5hws_matcher_attr *attr); 399 400/** 401 * mlx5hws_matcher_destroy - Destroy a direct rule matcher. 402 * 403 * @matcher: Matcher to destroy. 404 * 405 * Return: Zero on success, non-zero otherwise. 406 */ 407int mlx5hws_matcher_destroy(struct mlx5hws_matcher *matcher); 408 409/** 410 * mlx5hws_matcher_attach_at - Attach a new action template to a direct rule matcher. 411 * 412 * @matcher: Matcher to attach the action template to. 413 * @at: Action template to be attached to the matcher. 414 * 415 * Return: Zero on success, non-zero otherwise. 416 */ 417int mlx5hws_matcher_attach_at(struct mlx5hws_matcher *matcher, 418 struct mlx5hws_action_template *at); 419 420/** 421 * mlx5hws_matcher_resize_set_target - Link two matchers and enable moving rules. 422 * 423 * Both matchers must be in the same table type, must be created with the 424 * 'resizable' property, and should have the same characteristics (e.g., same 425 * match templates and action templates). It is the user's responsibility to 426 * ensure that the destination matcher is allocated with the appropriate size. 427 * 428 * Once the function is completed, the user is: 429 * - Allowed to move rules from the source into the destination matcher. 430 * - No longer allowed to insert rules into the source matcher. 431 * 432 * The user is always allowed to insert rules into the destination matcher and 433 * to delete rules from any matcher. 434 * 435 * @src_matcher: Source matcher for moving rules from. 436 * @dst_matcher: Destination matcher for moving rules to. 437 * 438 * Return: Zero on successful move, non-zero otherwise. 439 */ 440int mlx5hws_matcher_resize_set_target(struct mlx5hws_matcher *src_matcher, 441 struct mlx5hws_matcher *dst_matcher); 442 443/** 444 * mlx5hws_matcher_resize_rule_move - Enqueue moving rule operation. 445 * 446 * This function enqueues the operation of moving a rule from the source 447 * matcher to the destination matcher. 448 * 449 * @src_matcher: Matcher that the rule belongs to. 450 * @rule: The rule to move. 451 * @attr: Rule attributes. 452 * 453 * Return: Zero on success, non-zero otherwise. 454 */ 455int mlx5hws_matcher_resize_rule_move(struct mlx5hws_matcher *src_matcher, 456 struct mlx5hws_rule *rule, 457 struct mlx5hws_rule_attr *attr); 458 459/** 460 * mlx5hws_rule_create - Enqueue create rule operation. 461 * 462 * @matcher: The matcher in which the new rule will be created. 463 * @mt_idx: Match template index to create the match with. 464 * @match_param: The match parameter PRM buffer used for value matching. 465 * @at_idx: Action template index to apply the actions with. 466 * @rule_actions: Rule actions to be executed on match. 467 * @attr: Rule creation attributes. 468 * @rule_handle: A valid rule handle. The handle doesn't require any initialization. 469 * 470 * Return: Zero on successful enqueue, non-zero otherwise. 471 */ 472int mlx5hws_rule_create(struct mlx5hws_matcher *matcher, 473 u8 mt_idx, 474 u32 *match_param, 475 u8 at_idx, 476 struct mlx5hws_rule_action rule_actions[], 477 struct mlx5hws_rule_attr *attr, 478 struct mlx5hws_rule *rule_handle); 479 480/** 481 * mlx5hws_rule_destroy - Enqueue destroy rule operation. 482 * 483 * @rule: The rule destruction to enqueue. 484 * @attr: Rule destruction attributes. 485 * 486 * Return: Zero on successful enqueue, non-zero otherwise. 487 */ 488int mlx5hws_rule_destroy(struct mlx5hws_rule *rule, 489 struct mlx5hws_rule_attr *attr); 490 491/** 492 * mlx5hws_rule_action_update - Enqueue update actions on an existing rule. 493 * 494 * @rule: A valid rule handle to update. 495 * @at_idx: Action template index to update the actions with. 496 * @rule_actions: Rule actions to be executed on match. 497 * @attr: Rule update attributes. 498 * 499 * Return: Zero on successful enqueue, non-zero otherwise. 500 */ 501int mlx5hws_rule_action_update(struct mlx5hws_rule *rule, 502 u8 at_idx, 503 struct mlx5hws_rule_action rule_actions[], 504 struct mlx5hws_rule_attr *attr); 505 506/** 507 * mlx5hws_action_get_type - Get action type. 508 * 509 * @action: The action to get the type of. 510 * 511 * Return: action type. 512 */ 513enum mlx5hws_action_type 514mlx5hws_action_get_type(struct mlx5hws_action *action); 515 516/** 517 * mlx5hws_action_get_dev - Get mlx5 core device. 518 * 519 * @action: The action to get the device from. 520 * 521 * Return: mlx5 core device. 522 */ 523struct mlx5_core_dev *mlx5hws_action_get_dev(struct mlx5hws_action *action); 524 525/** 526 * mlx5hws_action_create_dest_drop - Create a direct rule drop action. 527 * 528 * @ctx: The context in which the new action will be created. 529 * @flags: Action creation flags (enum mlx5hws_action_flags). 530 * 531 * Return: Pointer to mlx5hws_action on success, NULL otherwise. 532 */ 533struct mlx5hws_action * 534mlx5hws_action_create_dest_drop(struct mlx5hws_context *ctx, 535 u32 flags); 536 537/** 538 * mlx5hws_action_create_default_miss - Create a direct rule default miss action. 539 * Defaults are RX: Drop, TX: Wire. 540 * 541 * @ctx: The context in which the new action will be created. 542 * @flags: Action creation flags (enum mlx5hws_action_flags). 543 * 544 * Return: Pointer to mlx5hws_action on success, NULL otherwise. 545 */ 546struct mlx5hws_action * 547mlx5hws_action_create_default_miss(struct mlx5hws_context *ctx, 548 u32 flags); 549 550/** 551 * mlx5hws_action_create_dest_table - Create direct rule goto table action. 552 * 553 * @ctx: The context in which the new action will be created. 554 * @tbl: Destination table. 555 * @flags: Action creation flags (enum mlx5hws_action_flags). 556 * 557 * Return: pointer to mlx5hws_action on success NULL otherwise. 558 */ 559struct mlx5hws_action * 560mlx5hws_action_create_dest_table(struct mlx5hws_context *ctx, 561 struct mlx5hws_table *tbl, 562 u32 flags); 563 564/** 565 * mlx5hws_action_create_dest_table_num - Create direct rule goto table number action. 566 * 567 * @ctx: The context in which the new action will be created. 568 * @tbl_num: Destination table number. 569 * @flags: Action creation flags (enum mlx5hws_action_flags). 570 * 571 * Return: pointer to mlx5hws_action on success NULL otherwise. 572 */ 573struct mlx5hws_action * 574mlx5hws_action_create_dest_table_num(struct mlx5hws_context *ctx, 575 u32 tbl_num, u32 flags); 576 577/** 578 * mlx5hws_action_create_dest_match_range - Create direct rule range match action. 579 * 580 * @ctx: The context in which the new action will be created. 581 * @field: Field to comapare the value. 582 * @hit_ft: Flow table to go to on hit. 583 * @miss_ft: Flow table to go to on miss. 584 * @min: Minimal value of the field to be considered as hit. 585 * @max: Maximal value of the field to be considered as hit. 586 * @flags: Action creation flags (enum mlx5hws_action_flags). 587 * 588 * Return: pointer to mlx5hws_action on success NULL otherwise. 589 */ 590struct mlx5hws_action * 591mlx5hws_action_create_dest_match_range(struct mlx5hws_context *ctx, 592 u32 field, 593 struct mlx5_flow_table *hit_ft, 594 struct mlx5_flow_table *miss_ft, 595 u32 min, u32 max, u32 flags); 596 597/** 598 * mlx5hws_action_create_flow_sampler - Create direct rule flow sampler action. 599 * 600 * @ctx: The context in which the new action will be created. 601 * @sampler_id: Flow sampler object ID. 602 * @flags: Action creation flags (enum mlx5hws_action_flags). 603 * 604 * Return: pointer to mlx5hws_action on success NULL otherwise. 605 */ 606struct mlx5hws_action * 607mlx5hws_action_create_flow_sampler(struct mlx5hws_context *ctx, 608 u32 sampler_id, u32 flags); 609 610/** 611 * mlx5hws_action_create_dest_vport - Create direct rule goto vport action. 612 * 613 * @ctx: The context in which the new action will be created. 614 * @vport_num: Destination vport number. 615 * @vhca_id_valid: Tells if the vhca_id parameter is valid. 616 * @vhca_id: VHCA ID of the destination vport. 617 * @flags: Action creation flags (enum mlx5hws_action_flags). 618 * 619 * Return: pointer to mlx5hws_action on success NULL otherwise. 620 */ 621struct mlx5hws_action * 622mlx5hws_action_create_dest_vport(struct mlx5hws_context *ctx, 623 u16 vport_num, 624 bool vhca_id_valid, 625 u16 vhca_id, 626 u32 flags); 627 628/** 629 * mlx5hws_action_create_tag - Create direct rule TAG action. 630 * 631 * @ctx: The context in which the new action will be created. 632 * @flags: Action creation flags (enum mlx5hws_action_flags). 633 * 634 * Return: pointer to mlx5hws_action on success NULL otherwise. 635 */ 636struct mlx5hws_action * 637mlx5hws_action_create_tag(struct mlx5hws_context *ctx, u32 flags); 638 639/** 640 * mlx5hws_action_create_counter - Create direct rule counter action. 641 * 642 * @ctx: The context in which the new action will be created. 643 * @obj_id: Direct rule counter object ID. 644 * @flags: Action creation flags (enum mlx5hws_action_flags). 645 * 646 * Return: pointer to mlx5hws_action on success NULL otherwise. 647 */ 648struct mlx5hws_action * 649mlx5hws_action_create_counter(struct mlx5hws_context *ctx, 650 u32 obj_id, 651 u32 flags); 652 653/** 654 * mlx5hws_action_create_reformat - Create direct rule reformat action. 655 * 656 * @ctx: The context in which the new action will be created. 657 * @reformat_type: Type of reformat prefixed with MLX5HWS_ACTION_TYP_REFORMAT. 658 * @num_of_hdrs: Number of provided headers in "hdrs" array. 659 * @hdrs: Headers array containing header information. 660 * @log_bulk_size: Number of unique values used with this reformat. 661 * @flags: Action creation flags (enum mlx5hws_action_flags). 662 * 663 * Return: pointer to mlx5hws_action on success NULL otherwise. 664 */ 665struct mlx5hws_action * 666mlx5hws_action_create_reformat(struct mlx5hws_context *ctx, 667 enum mlx5hws_action_type reformat_type, 668 u8 num_of_hdrs, 669 struct mlx5hws_action_reformat_header *hdrs, 670 u32 log_bulk_size, 671 u32 flags); 672 673/** 674 * mlx5hws_action_create_modify_header - Create direct rule modify header action. 675 * 676 * @ctx: The context in which the new action will be created. 677 * @num_of_patterns: Number of provided patterns in "patterns" array. 678 * @patterns: Patterns array containing pattern information. 679 * @log_bulk_size: Number of unique values used with this pattern. 680 * @flags: Action creation flags (enum mlx5hws_action_flags). 681 * 682 * Return: pointer to mlx5hws_action on success NULL otherwise. 683 */ 684struct mlx5hws_action * 685mlx5hws_action_create_modify_header(struct mlx5hws_context *ctx, 686 u8 num_of_patterns, 687 struct mlx5hws_action_mh_pattern *patterns, 688 u32 log_bulk_size, 689 u32 flags); 690 691/** 692 * mlx5hws_action_create_aso_meter - Create direct rule ASO flow meter action. 693 * 694 * @ctx: The context in which the new action will be created. 695 * @obj_id: ASO object ID. 696 * @return_reg_c: Copy the ASO object value into this reg_c, 697 * after a packet hits a rule with this ASO object. 698 * @flags: Action creation flags (enum mlx5hws_action_flags). 699 * 700 * Return: pointer to mlx5hws_action on success NULL otherwise. 701 */ 702struct mlx5hws_action * 703mlx5hws_action_create_aso_meter(struct mlx5hws_context *ctx, 704 u32 obj_id, 705 u8 return_reg_c, 706 u32 flags); 707 708/** 709 * mlx5hws_action_create_pop_vlan - Create direct rule pop vlan action. 710 * 711 * @ctx: The context in which the new action will be created. 712 * @flags: Action creation flags (enum mlx5hws_action_flags). 713 * 714 * Return: pointer to mlx5hws_action on success NULL otherwise. 715 */ 716struct mlx5hws_action * 717mlx5hws_action_create_pop_vlan(struct mlx5hws_context *ctx, u32 flags); 718 719/** 720 * mlx5hws_action_create_push_vlan - Create direct rule push vlan action. 721 * 722 * @ctx: The context in which the new action will be created. 723 * @flags: Action creation flags (enum mlx5hws_action_flags). 724 * 725 * Return: pointer to mlx5hws_action on success NULL otherwise. 726 */ 727struct mlx5hws_action * 728mlx5hws_action_create_push_vlan(struct mlx5hws_context *ctx, u32 flags); 729 730/** 731 * mlx5hws_action_create_dest_array - Create a dest array action, this action can 732 * duplicate packets and forward to multiple destinations in the destination list. 733 * 734 * @ctx: The context in which the new action will be created. 735 * @num_dest: The number of dests attributes. 736 * @dests: The destination array. Each contains a destination action and can 737 * have additional actions. 738 * @flags: Action creation flags (enum mlx5hws_action_flags). 739 * 740 * Return: pointer to mlx5hws_action on success NULL otherwise. 741 */ 742struct mlx5hws_action * 743mlx5hws_action_create_dest_array(struct mlx5hws_context *ctx, size_t num_dest, 744 struct mlx5hws_action_dest_attr *dests, 745 u32 flags); 746 747/** 748 * mlx5hws_action_create_insert_header - Create insert header action. 749 * 750 * @ctx: The context in which the new action will be created. 751 * @num_of_hdrs: Number of provided headers in "hdrs" array. 752 * @hdrs: Headers array containing header information. 753 * @log_bulk_size: Number of unique values used with this insert header. 754 * @flags: Action creation flags. (enum mlx5hws_action_flags) 755 * 756 * Return: pointer to mlx5hws_action on success NULL otherwise. 757 */ 758struct mlx5hws_action * 759mlx5hws_action_create_insert_header(struct mlx5hws_context *ctx, 760 u8 num_of_hdrs, 761 struct mlx5hws_action_insert_header *hdrs, 762 u32 log_bulk_size, 763 u32 flags); 764 765/** 766 * mlx5hws_action_create_remove_header - Create remove header action. 767 * 768 * @ctx: The context in which the new action will be created. 769 * @attr: attributes that specifie the remove header type, PRM start anchor and 770 * the PRM end anchor or the PRM start anchor and remove size in bytes. 771 * @flags: Action creation flags. (enum mlx5hws_action_flags) 772 * 773 * Return: pointer to mlx5hws_action on success NULL otherwise. 774 */ 775struct mlx5hws_action * 776mlx5hws_action_create_remove_header(struct mlx5hws_context *ctx, 777 struct mlx5hws_action_remove_header_attr *attr, 778 u32 flags); 779 780/** 781 * mlx5hws_action_create_last - Create direct rule LAST action. 782 * 783 * @ctx: The context in which the new action will be created. 784 * @flags: Action creation flags. (enum mlx5hws_action_flags) 785 * 786 * Return: pointer to mlx5hws_action on success NULL otherwise. 787 */ 788struct mlx5hws_action * 789mlx5hws_action_create_last(struct mlx5hws_context *ctx, u32 flags); 790 791/** 792 * mlx5hws_action_destroy - Destroy direct rule action. 793 * 794 * @action: The action to destroy. 795 * 796 * Return: zero on success non zero otherwise. 797 */ 798int mlx5hws_action_destroy(struct mlx5hws_action *action); 799 800enum mlx5hws_flow_op_status { 801 MLX5HWS_FLOW_OP_SUCCESS, 802 MLX5HWS_FLOW_OP_ERROR, 803}; 804 805struct mlx5hws_flow_op_result { 806 enum mlx5hws_flow_op_status status; 807 void *user_data; 808}; 809 810/** 811 * mlx5hws_send_queue_poll - Poll queue for rule creation and deletions completions. 812 * 813 * @ctx: The context to which the queue belong to. 814 * @queue_id: The id of the queue to poll. 815 * @res: Completion array. 816 * @res_nb: Maximum number of results to return. 817 * 818 * Return: negative number on failure, the number of completions otherwise. 819 */ 820int mlx5hws_send_queue_poll(struct mlx5hws_context *ctx, 821 u16 queue_id, 822 struct mlx5hws_flow_op_result res[], 823 u32 res_nb); 824 825/** 826 * mlx5hws_send_queue_action - Perform an action on the queue 827 * 828 * @ctx: The context to which the queue belong to. 829 * @queue_id: The id of the queue to perform the action on. 830 * @actions: Actions to perform on the queue (enum mlx5hws_send_queue_actions) 831 * 832 * Return: zero on success non zero otherwise. 833 */ 834int mlx5hws_send_queue_action(struct mlx5hws_context *ctx, 835 u16 queue_id, 836 u32 actions); 837 838/** 839 * mlx5hws_debug_dump - Dump HWS info 840 * 841 * @ctx: The context which to dump the info from. 842 * 843 * Return: zero on success non zero otherwise. 844 */ 845int mlx5hws_debug_dump(struct mlx5hws_context *ctx); 846 847struct mlx5hws_bwc_matcher; 848struct mlx5hws_bwc_rule; 849 850struct mlx5hws_match_parameters { 851 size_t match_sz; 852 u32 *match_buf; /* Device spec format */ 853}; 854 855/** 856 * mlx5hws_bwc_matcher_create - Create a new BWC direct rule matcher. 857 * 858 * This function does the following: 859 * - creates match template based on flow items 860 * - creates an empty action template 861 * - creates a usual mlx5hws_matcher with these mt and at, setting 862 * its size to minimal 863 * Notes: 864 * - table->ctx must have BWC support 865 * - complex rules are not supported 866 * 867 * @table: The table in which the new matcher will be opened 868 * @priority: Priority for this BWC matcher 869 * @match_criteria_enable: Bitmask that defines matching criteria 870 * @mask: Match parameters 871 * 872 * Return: pointer to mlx5hws_bwc_matcher on success or NULL otherwise. 873 */ 874struct mlx5hws_bwc_matcher * 875mlx5hws_bwc_matcher_create(struct mlx5hws_table *table, 876 u32 priority, 877 u8 match_criteria_enable, 878 struct mlx5hws_match_parameters *mask); 879 880/** 881 * mlx5hws_bwc_matcher_destroy - Destroy BWC direct rule matcher. 882 * 883 * @bwc_matcher: Matcher to destroy 884 * 885 * Return: zero on success, non zero otherwise 886 */ 887int mlx5hws_bwc_matcher_destroy(struct mlx5hws_bwc_matcher *bwc_matcher); 888 889/** 890 * mlx5hws_bwc_rule_create - Create a new BWC rule. 891 * 892 * Unlike the usual rule creation function, this one is blocking: when the 893 * function returns, the rule is written to its place (no need to poll). 894 * This function does the following: 895 * - finds matching action template based on the provided rule_actions, or 896 * creates new action template if matching action template doesn't exist 897 * - updates corresponding BWC matcher stats 898 * - if needed, the function performs rehash: 899 * - creates a new matcher based on mt, at, new_sz 900 * - moves all the existing matcher rules to the new matcher 901 * - removes the old matcher 902 * - inserts new rule 903 * - polls till completion is received 904 * Notes: 905 * - matcher->tbl->ctx must have BWC support 906 * - separate BWC ctx queues are used 907 * 908 * @bwc_matcher: The BWC matcher in which the new rule will be created. 909 * @params: Match perameters 910 * @flow_source: Flow source for this rule 911 * @rule_actions: Rule action to be executed on match 912 * 913 * Return: valid BWC rule handle on success, NULL otherwise 914 */ 915struct mlx5hws_bwc_rule * 916mlx5hws_bwc_rule_create(struct mlx5hws_bwc_matcher *bwc_matcher, 917 struct mlx5hws_match_parameters *params, 918 u32 flow_source, 919 struct mlx5hws_rule_action rule_actions[]); 920 921/** 922 * mlx5hws_bwc_rule_destroy - Destroy BWC direct rule. 923 * 924 * @bwc_rule: Rule to destroy. 925 * 926 * Return: zero on success, non zero otherwise. 927 */ 928int mlx5hws_bwc_rule_destroy(struct mlx5hws_bwc_rule *bwc_rule); 929 930/** 931 * mlx5hws_bwc_rule_action_update - Update actions on an existing BWC rule. 932 * 933 * @bwc_rule: Rule to update 934 * @rule_actions: Rule action to update with 935 * 936 * Return: zero on successful update, non zero otherwise. 937 */ 938int mlx5hws_bwc_rule_action_update(struct mlx5hws_bwc_rule *bwc_rule, 939 struct mlx5hws_rule_action rule_actions[]); 940 941#endif
~/
Read-only file preview.